int decode_drx_parameter(DrxParameter *drxparameter, uint8_t iei, uint8_t *buffer, uint32_t len) { int decoded = 0; if (iei > 0) { CHECK_IEI_DECODER(iei, *buffer); decoded++; } drxparameter->splitpgcyclecode = *(buffer + decoded); decoded++; drxparameter->cnspecificdrxcyclelengthcoefficientanddrxvaluefors1mode = (*(buffer + decoded) >> 4) & 0xf; drxparameter->splitonccch = (*(buffer + decoded) >> 3) & 0x1; drxparameter->nondrxtimer = *(buffer + decoded) & 0x7; decoded++; #if defined (NAS_DEBUG) dump_drx_parameter_xml(drxparameter, iei); #endif return decoded; }
int decode_short_mac ( ShortMac * shortmac, uint8_t iei, uint8_t * buffer, uint32_t len) { int decoded = 0; if (iei > 0) { CHECK_IEI_DECODER (iei, *buffer); decoded++; } //IES_DECODE_U16(*shortmac, *(buffer + decoded)); IES_DECODE_U16 (buffer, decoded, *shortmac); #if NAS_DEBUG dump_short_mac_xml (shortmac, iei); #endif return decoded; }
int decode_daylight_saving_time(DaylightSavingTime *daylightsavingtime, uint8_t iei, uint8_t *buffer, uint32_t len) { int decoded = 0; uint8_t ielen = 0; if (iei > 0) { CHECK_IEI_DECODER(iei, *buffer); decoded++; } ielen = *(buffer + decoded); decoded++; CHECK_LENGTH_DECODER(len - decoded, ielen); *daylightsavingtime = *buffer & 0x3; decoded++; #if defined (NAS_DEBUG) dump_daylight_saving_time_xml(daylightsavingtime, iei); #endif return decoded; }
int decode_apn_aggregate_maximum_bit_rate ( ApnAggregateMaximumBitRate * apnaggregatemaximumbitrate, uint8_t iei, uint8_t * buffer, uint32_t len) { int decoded = 0; uint8_t ielen = 0; if (iei > 0) { CHECK_IEI_DECODER (iei, *buffer); decoded++; } ielen = *(buffer + decoded); decoded++; CHECK_LENGTH_DECODER (len - decoded, ielen); apnaggregatemaximumbitrate->apnambrfordownlink = *(buffer + decoded); decoded++; apnaggregatemaximumbitrate->apnambrforuplink = *(buffer + decoded); decoded++; if (ielen >= 4) { apnaggregatemaximumbitrate->apnambrfordownlink_extended = *(buffer + decoded); decoded++; apnaggregatemaximumbitrate->apnambrforuplink_extended = *(buffer + decoded); decoded++; if (ielen >= 6) { apnaggregatemaximumbitrate->apnambrfordownlink_extended2 = *(buffer + decoded); decoded++; apnaggregatemaximumbitrate->apnambrforuplink_extended2 = *(buffer + decoded); decoded++; } } #if NAS_DEBUG dump_apn_aggregate_maximum_bit_rate_xml (apnaggregatemaximumbitrate, iei); #endif return decoded; }
int decode_eps_quality_of_service(EpsQualityOfService *epsqualityofservice, uint8_t iei, uint8_t *buffer, uint32_t len) { int decoded = 0; uint8_t ielen = 0; if (iei > 0) { CHECK_IEI_DECODER(iei, *buffer); decoded++; } ielen = *(buffer + decoded); decoded++; CHECK_LENGTH_DECODER(len - decoded, ielen); epsqualityofservice->qci = *(buffer + decoded); decoded++; if ( ielen > 2 + (iei > 0) ? 1 : 0 ) { /* bitRates is present */ epsqualityofservice->bitRatesPresent = 1; decoded += decode_eps_qos_bit_rates(&epsqualityofservice->bitRates, buffer + decoded); } else { /* bitRates is not present */ epsqualityofservice->bitRatesPresent = 0; } if ( ielen > 6 + (iei > 0) ? 1 : 0 ) { /* bitRatesExt is present */ epsqualityofservice->bitRatesExtPresent = 1; decoded += decode_eps_qos_bit_rates(&epsqualityofservice->bitRatesExt, buffer + decoded); } else { /* bitRatesExt is not present */ epsqualityofservice->bitRatesExtPresent = 0; } #if defined (NAS_DEBUG) dump_eps_quality_of_service_xml(epsqualityofservice, iei); #endif return decoded; }
int decode_authentication_parameter_rand(AuthenticationParameterRand *authenticationparameterrand, uint8_t iei, uint8_t *buffer, uint32_t len) { int decoded = 0; uint8_t ielen = 16; int decode_result; if (iei > 0) { CHECK_IEI_DECODER(iei, *buffer); decoded++; } if ((decode_result = decode_octet_string(&authenticationparameterrand->rand, ielen, buffer + decoded, len - decoded)) < 0) return decode_result; else decoded += decode_result; #if defined (NAS_DEBUG) dump_authentication_parameter_rand_xml(authenticationparameterrand, iei); #endif return decoded; }
int decode_time_zone ( TimeZone * timezone, uint8_t iei, uint8_t * buffer, uint32_t len) { int decoded = 0; if (iei > 0) { CHECK_IEI_DECODER (iei, *buffer); decoded++; } *timezone = *(buffer + decoded); decoded++; #if NAS_DEBUG dump_time_zone_xml (timezone, iei); #endif return decoded; }
int decode_p_tmsi_signature(PTmsiSignature *ptmsisignature, uint8_t iei, uint8_t *buffer, uint32_t len) { int decoded = 0; int decode_result; uint8_t ielen = 3; if (iei > 0) { CHECK_IEI_DECODER(iei, *buffer); decoded++; } if ((decode_result = decode_octet_string(&ptmsisignature->ptmsisignaturevalue, ielen, buffer + decoded, len - decoded)) < 0) return decode_result; else decoded += decode_result; #if defined (NAS_DEBUG) dump_p_tmsi_signature_xml(ptmsisignature, iei); #endif return decoded; }
int decode_radio_priority ( RadioPriority * radiopriority, uint8_t iei, uint8_t * buffer, uint32_t len) { int decoded = 0; CHECK_PDU_POINTER_AND_LENGTH_DECODER (buffer, RADIO_PRIORITY_MINIMUM_LENGTH, len); if (iei > 0) { CHECK_IEI_DECODER ((*buffer & 0xf0), iei); } *radiopriority = *buffer & 0x7; decoded++; #if NAS_DEBUG dump_radio_priority_xml (radiopriority, iei); #endif return decoded; }
int decode_linked_eps_bearer_identity ( LinkedEpsBearerIdentity * linkedepsbeareridentity, uint8_t iei, uint8_t * buffer, uint32_t len) { int decoded = 0; CHECK_PDU_POINTER_AND_LENGTH_DECODER (buffer, LINKED_EPS_BEARER_IDENTITY_MINIMUM_LENGTH, len); if (iei > 0) { CHECK_IEI_DECODER ((*buffer & 0xf0), iei); } *linkedepsbeareridentity = *buffer & 0xf; decoded++; #if NAS_DEBUG dump_linked_eps_bearer_identity_xml (linkedepsbeareridentity, iei); #endif return decoded; }
int decode_request_type ( RequestType * requesttype, uint8_t iei, uint8_t * buffer, uint32_t len) { int decoded = 0; CHECK_PDU_POINTER_AND_LENGTH_DECODER (buffer, REQUEST_TYPE_MINIMUM_LENGTH, len); if (iei > 0) { CHECK_IEI_DECODER ((*buffer & 0xf0), iei); } *requesttype = *buffer & 0x7; decoded++; #if NAS_DEBUG dump_request_type_xml (requesttype, iei); #endif return decoded; }
int decode_eps_update_result ( EpsUpdateResult * epsupdateresult, uint8_t iei, uint8_t * buffer, uint32_t len) { int decoded = 0; CHECK_PDU_POINTER_AND_LENGTH_DECODER (buffer, EPS_UPDATE_RESULT_MINIMUM_LENGTH, len); if (iei > 0) { CHECK_IEI_DECODER ((*buffer & 0xf0), iei); } *epsupdateresult = *buffer & 0x7; decoded++; #if NAS_DEBUG dump_eps_update_result_xml (epsupdateresult, iei); #endif return decoded; }
int decode_nas_security_algorithms ( NasSecurityAlgorithms * nassecurityalgorithms, uint8_t iei, uint8_t * buffer, uint32_t len) { int decoded = 0; if (iei > 0) { CHECK_IEI_DECODER (iei, *buffer); decoded++; } nassecurityalgorithms->typeofcipheringalgorithm = (*(buffer + decoded) >> 4) & 0x7; nassecurityalgorithms->typeofintegrityalgorithm = *(buffer + decoded) & 0x7; decoded++; #if NAS_DEBUG dump_nas_security_algorithms_xml (nassecurityalgorithms, iei); #endif return decoded; }
int decode_cli(Cli *cli, uint8_t iei, uint8_t *buffer, uint32_t len) { int decoded = 0; uint8_t ielen = 0; int decode_result; if (iei > 0) { CHECK_IEI_DECODER(iei, *buffer); decoded++; } ielen = *(buffer + decoded); decoded++; CHECK_LENGTH_DECODER(len - decoded, ielen); if ((decode_result = decode_octet_string(&cli->clivalue, ielen, buffer + decoded, len - decoded)) < 0) return decode_result; else decoded += decode_result; #if defined (NAS_DEBUG) dump_cli_xml(cli, iei); #endif return decoded; }
int decode_ms_network_capability(MsNetworkCapability *msnetworkcapability, uint8_t iei, uint8_t *buffer, uint32_t len) { int decoded = 0; uint8_t ielen = 0; int decode_result; if (iei > 0) { CHECK_IEI_DECODER(iei, *buffer); decoded++; } ielen = *(buffer + decoded); decoded++; CHECK_LENGTH_DECODER(len - decoded, ielen); if ((decode_result = decode_octet_string(&msnetworkcapability->msnetworkcapabilityvalue, ielen, buffer + decoded, len - decoded)) < 0) return decode_result; else decoded += decode_result; #if defined (NAS_DEBUG) dump_ms_network_capability_xml(msnetworkcapability, iei); #endif return decoded; }
int decode_voice_domain_preference_and_ue_usage_setting(VoiceDomainPreferenceAndUeUsageSetting *voicedomainpreferenceandueusagesetting, uint8_t iei, uint8_t *buffer, uint32_t len) { int decoded = 0; uint8_t ielen = 0; if (iei > 0) { CHECK_IEI_DECODER(iei, *buffer); decoded++; } memset(voicedomainpreferenceandueusagesetting, 0, sizeof(VoiceDomainPreferenceAndUeUsageSetting)); ielen = *(buffer + decoded); decoded++; CHECK_LENGTH_DECODER(len - decoded, ielen); voicedomainpreferenceandueusagesetting->ue_usage_setting = (*(buffer + decoded) >> 2) & 0x1; voicedomainpreferenceandueusagesetting->voice_domain_for_eutran = *(buffer + decoded) & 0x3; decoded++; #if defined (NAS_DEBUG) dump_voice_domain_preference_and_ue_usage_setting_xml(voicedomainpreferenceandueusagesetting, iei); #endif return decoded; }
int decode_location_area_identification(LocationAreaIdentification *locationareaidentification, uint8_t iei, uint8_t *buffer, uint32_t len) { int decoded = 0; if (iei > 0) { CHECK_IEI_DECODER(iei, *buffer); decoded++; } locationareaidentification->mccdigit2 = (*(buffer + decoded) >> 4) & 0xf; locationareaidentification->mccdigit1 = *(buffer + decoded) & 0xf; decoded++; locationareaidentification->mncdigit3 = (*(buffer + decoded) >> 4) & 0xf; locationareaidentification->mccdigit3 = *(buffer + decoded) & 0xf; decoded++; locationareaidentification->mncdigit2 = (*(buffer + decoded) >> 4) & 0xf; locationareaidentification->mncdigit1 = *(buffer + decoded) & 0xf; decoded++; //IES_DECODE_U16(locationareaidentification->lac, *(buffer + decoded)); IES_DECODE_U16(buffer, decoded, locationareaidentification->lac); #if defined (NAS_DEBUG) dump_location_area_identification_xml(locationareaidentification, iei); #endif return decoded; }