blob: 63f25c5d483208d6b1e20e7b26af3c79e3d66faf [file] [log] [blame]
/*
* Copyright (c) 2019, Infosys Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <string>
#include <sstream>
#include <cstring>
#include <iomanip>
#include "structs.h"
#include "log.h"
using namespace std;
uint8_t ASCII_TO_BCD(uint8_t left, uint8_t right)
{
uint8_t bcd_value;
if(left >= '0' && left <= '9') // 0-9 range
{
bcd_value = ( left - 0x30) << 4 ; // 48 for '0' ASCII offset
}
else
{
bcd_value = 0x0f << 4; // filler 1111
}
if(right >= '0' && right <= '9') // 0-9 range
{
bcd_value |= ( right - 0x30); // 48 for '0' ASCII offset
}
else
{
bcd_value |= 0x0f; // filler 1111
}
return bcd_value;
}
/*******************************************************
*TAI
********************************************************/
Tai::Tai()
{
memset( &tai_m, 0, sizeof( tai_m ));
}
Tai::Tai( const TAI& tai_i )
{
memset( &tai_m, 0, sizeof( tai_m ));
memcpy( &tai_m, &tai_i, sizeof( tai_i ));
}
Tai::~Tai()
{
}
void Tai::operator = ( const Tai& tai_i )
{
memcpy( &tai_m, &(tai_i.tai_m), sizeof( tai_i.tai_m ));
}
/*******************************************************
*CGI
********************************************************/
Cgi::Cgi()
{
memset( &cgi_m, 0, sizeof( cgi_m ));
}
Cgi::Cgi( const CGI& cgi_i )
{
memset( &cgi_m, 0, sizeof( cgi_m ));
memcpy( &cgi_m, &cgi_i, sizeof(cgi_i));
}
Cgi::~Cgi()
{
}
void Cgi::operator = ( const Cgi& cgi_i )
{
memcpy( &cgi_m, &(cgi_i.cgi_m), sizeof(cgi_i.cgi_m));
}
/*******************************************************
*STMSI
********************************************************/
Stmsi::Stmsi()
{
memset( &stmsi_m, 0, sizeof( stmsi_m ));
}
Stmsi::Stmsi( const STMSI& stmsi_i )
{
memset( &stmsi_m, 0, sizeof( stmsi_m ));
memcpy( &stmsi_m, &stmsi_i, sizeof( stmsi_i ));
}
Stmsi::~Stmsi()
{
}
void Stmsi::operator = ( const Stmsi& stmsi_i )
{
memcpy( &stmsi_m, &(stmsi_i.stmsi_m), sizeof( stmsi_i.stmsi_m ));
}
/*******************************************************
*ARP
********************************************************/
Arp::Arp()
{
memset( &arp_m, 0, sizeof( arp_m ));
}
Arp::Arp( const ARP& arp_i )
{
memset( &arp_m, 0, sizeof( arp_m ));
memcpy( &arp_m, &arp_i, sizeof( arp_i ));
}
Arp::~Arp()
{
}
void Arp::operator = ( const Arp& arp_i )
{
memcpy( &arp_m, &(arp_i.arp_m), sizeof( arp_i.arp_m ));
}
/*******************************************************
*Ms_net_capab
********************************************************/
Ms_net_capab::Ms_net_capab()
{
memset( &ms_net_capab_m, 0, sizeof( ms_net_capab_m ));
}
Ms_net_capab::Ms_net_capab( const MS_net_capab& net_cap_i )
{
memset( &ms_net_capab_m, 0, sizeof( ms_net_capab_m ));
memcpy( &ms_net_capab_m, &net_cap_i, sizeof( net_cap_i ));
}
Ms_net_capab::~Ms_net_capab()
{
}
void Ms_net_capab::operator = ( const Ms_net_capab& net_cap_i )
{
memcpy( &ms_net_capab_m, &(net_cap_i.ms_net_capab_m), sizeof( net_cap_i.ms_net_capab_m ));
}
/*******************************************************
*Ue_net_capab
********************************************************/
Ue_net_capab::Ue_net_capab()
{
memset( &ue_net_capab_m, 0, sizeof( ue_net_capab_m ));
}
Ue_net_capab::Ue_net_capab( const UE_net_capab& net_cap_i )
{
memset( &ue_net_capab_m, 0, sizeof( ue_net_capab_m ));
memcpy( &ue_net_capab_m, &net_cap_i, sizeof( net_cap_i ));
}
Ue_net_capab::~Ue_net_capab()
{
}
void Ue_net_capab::operator = ( const Ue_net_capab& net_cap_i )
{
memcpy( &ue_net_capab_m, &(net_cap_i.ue_net_capab_m), sizeof( net_cap_i.ue_net_capab_m ));
}
/*******************************************************
*Secinfo
********************************************************/
Secinfo::Secinfo()
{
memset( &secinfo_m, 0, sizeof( secinfo_m ));
}
Secinfo::Secinfo( const secinfo& sec_i )
{
memset( &secinfo_m, 0, sizeof( secinfo_m ));
memcpy( &secinfo_m, &sec_i, sizeof( sec_i ));
}
Secinfo::~Secinfo()
{
}
void Secinfo::operator = ( const Secinfo& sec_i )
{
memcpy( &secinfo_m, &(sec_i.secinfo_m), sizeof( sec_i.secinfo_m ));
}
/*******************************************************
*Ambr
********************************************************/
Ambr::Ambr()
{
memset( &ambr_m, 0, sizeof( ambr_m ));
}
Ambr::Ambr( const AMBR& ambr_i )
{
memset( &ambr_m, 0, sizeof( ambr_m ));
memcpy( &ambr_m, &ambr_i, sizeof( ambr_i ));
}
Ambr::~Ambr()
{
}
void Ambr::operator = ( const Ambr& ambr_i )
{
memcpy( &ambr_m, &(ambr_i.ambr_m), sizeof( ambr_i.ambr_m ));
}
/*******************************************************
*E_utran_sec_vector
********************************************************/
E_utran_sec_vector::E_utran_sec_vector():AiaSecInfo_mp( NULL )
{
AiaSecInfo_mp = (struct E_UTRAN_sec_vector*)calloc(sizeof(struct E_UTRAN_sec_vector), 1);
}
E_utran_sec_vector::E_utran_sec_vector( const E_UTRAN_sec_vector& secinfo_i )
{
AiaSecInfo_mp = (struct E_UTRAN_sec_vector*)calloc(sizeof(struct E_UTRAN_sec_vector), 1);
memcpy( AiaSecInfo_mp, &secinfo_i, sizeof( E_UTRAN_sec_vector ));
}
E_utran_sec_vector::~E_utran_sec_vector()
{
free(AiaSecInfo_mp);
}
void E_utran_sec_vector::operator = ( const E_utran_sec_vector& secinfo_i )
{
if( NULL != secinfo_i.AiaSecInfo_mp )
{
memcpy( AiaSecInfo_mp, secinfo_i.AiaSecInfo_mp, sizeof( E_UTRAN_sec_vector ));
}
}
std::ostream& operator << ( std::ostream& os, const E_utran_sec_vector& data_i )
{
os << "RAND ";
for ( uint32_t i = 0; i < data_i.AiaSecInfo_mp->rand.len; i++)
{
os << setfill('0') << setw(2) << std::hex <<
static_cast<uint32_t>(data_i.AiaSecInfo_mp->rand.val[i]);
}
os << std::endl;
os << "RES ";
for ( uint32_t i = 0; i < data_i.AiaSecInfo_mp->xres.len; i++)
{
os << setfill('0') << setw(2) << std::hex <<
static_cast<uint32_t>(data_i.AiaSecInfo_mp->xres.val[i]);
}
os << std::endl;
os << "AUTN ";
for ( uint32_t i = 0; i < data_i.AiaSecInfo_mp->autn.len; i++)
{
os << setfill('0') << setw(2) << std::hex <<
static_cast<uint32_t>(data_i.AiaSecInfo_mp->autn.val[i]);
}
os << std::endl;
os << "KASME ";
for ( uint32_t i = 0; i < data_i.AiaSecInfo_mp->kasme.len; i++)
{
os << setfill('0') << setw(2) << std::hex <<
static_cast<uint32_t>(data_i.AiaSecInfo_mp->kasme.val[i]);
}
os << std::endl;
return os;
}
/*******************************************************
*Fteid
********************************************************/
Fteid::Fteid()
{
memset( &fteid_m, 0, sizeof( fteid_m ));
}
Fteid::Fteid( const fteid& fteid_i )
{
memset( &fteid_m, 0, sizeof( fteid_m ));
memcpy( &fteid_m, &fteid_i, sizeof( fteid_i ));
}
Fteid::~Fteid()
{
}
void Fteid::operator = ( const Fteid& fteid_i )
{
memcpy( &fteid_m, &(fteid_i.fteid_m), sizeof( fteid_i.fteid_m ));
}
/*******************************************************
*Paa
********************************************************/
Paa::Paa()
{
memset( &paa_m, 0, sizeof( paa_m ));
}
Paa::Paa( const PAA& paa_i )
{
memset( &paa_m, 0, sizeof( paa_m ));
memcpy( &paa_m, &paa_i, sizeof( paa_i ));
}
Paa::~Paa()
{
}
void Paa::operator = ( const Paa& paa_i )
{
memcpy( &paa_m, &(paa_i.paa_m), sizeof( paa_i.paa_m ));
}
/*******************************************************
*Apn_name
********************************************************/
Apn_name::Apn_name()
{
memset( &apnname_m, 0, sizeof( apnname_m ));
}
Apn_name::Apn_name( const apn_name& apn_name_i )
{
memset( &apnname_m, 0, sizeof( apnname_m ));
memcpy( &apnname_m, &apn_name_i, sizeof( apn_name_i ));
}
Apn_name::~Apn_name()
{
}
void Apn_name::operator = ( const Apn_name& apn_name_i )
{
memcpy( &apnname_m, &(apn_name_i.apnname_m), sizeof( apn_name_i.apnname_m ));
}
/*******************************************************
*DigitRegister15
********************************************************/
DigitRegister15::DigitRegister15()
{
memset(&digitsArray,0,15);
}
void DigitRegister15::convertToBcdArray( uint8_t * arrayOut ) const
{
for( int i=0; i < 7; i++ )
{
arrayOut[i] = ASCII_TO_BCD(digitsArray[2*i+1],digitsArray[2*i]);
}
arrayOut[7] = ASCII_TO_BCD(0x0f,digitsArray[14]);
}
void DigitRegister15::convertFromBcdArray( const uint8_t* bcdArrayIn )
{
// For the imsi value upper nibble of first octect should only be considered
if(( bcdArrayIn[0] & 0x0f ) == 0x0f )
{
digitsArray[0] = (uint8_t)(((bcdArrayIn[0] >> 4) & 0x0f ) + 0x30);
for( int i = 1; i < 8; i++ )
{
digitsArray[2*i] = (uint8_t)(((bcdArrayIn[i] >> 4) & 0x0f) + 0x30);
digitsArray[2*i-1] = (uint8_t)((bcdArrayIn[i] & 0x0f) + 0x30);
}
}
else
{
for( int i = 0; i < 7; i++ )
{
digitsArray[2*i+1] = (uint8_t)(((bcdArrayIn[i] >> 4) & 0x0f) + 0x30);
digitsArray[2*i] = (uint8_t)((bcdArrayIn[i] & 0x0f) + 0x30);
}
digitsArray[7] = (uint8_t)(((bcdArrayIn[7] >> 4) & 0x0f) + 0x30);
}
return;
}
void DigitRegister15::setImsiDigits( uint8_t* digitsArrayIn )
{
memcpy( digitsArray, digitsArrayIn, 15);
}
void DigitRegister15::getImsiDigits( uint8_t* digitsArrayIn ) const
{
memcpy( digitsArrayIn, digitsArray, 15);
}
bool DigitRegister15::isValid() const
{
bool rc = false;
for (uint32_t i = 0; i < 15; i++)
{
if (digitsArray[i] != 0)
{
rc = true;
break;
}
}
return rc;
}
void DigitRegister15::operator = ( const DigitRegister15& data_i )
{
memcpy( digitsArray, data_i.digitsArray, sizeof( data_i.digitsArray ));
}
bool DigitRegister15::operator == ( const DigitRegister15& data_i )const
{
int data_cmp = memcmp(digitsArray, data_i.digitsArray, sizeof( data_i.digitsArray));
bool rc = false;
if(data_cmp == 0)
rc = true;
return rc;
}
bool DigitRegister15::operator < ( const DigitRegister15& data_i )const
{
bool rc = true;
if(*this == data_i)
rc = false;
else
{
for(int i=0; i<15; i++)
{
if(digitsArray[i] > data_i.digitsArray[i])
{
rc = false;
break;
}
}
}
return rc;
}
std::ostream& operator << ( std::ostream& os, const DigitRegister15& data_i )
{
for( auto x : data_i.digitsArray )
{
if( x != 0x0f )
os << x - 0x30;
}
os << "\0";
return os;
}