int decode_service_request ( service_request_msg * service_request, uint8_t * buffer, uint32_t len) { uint32_t decoded = 0; int decoded_result = 0; LOG_FUNC_IN; // Check if we got a NULL pointer and if buffer length is >= minimum length expected for the message. CHECK_PDU_POINTER_AND_LENGTH_DECODER (buffer, SERVICE_REQUEST_MINIMUM_LENGTH, len); /* * Decoding mandatory fields */ if ((decoded_result = decode_ksi_and_sequence_number (&service_request->ksiandsequencenumber, 0, buffer + decoded, len - decoded)) < 0) LOG_FUNC_RETURN (decoded_result); else decoded += decoded_result; if ((decoded_result = decode_short_mac (&service_request->messageauthenticationcode, 0, buffer + decoded, len - decoded)) < 0) LOG_FUNC_RETURN (decoded_result); else decoded += decoded_result; LOG_FUNC_RETURN (decoded); }
int decode_activate_dedicated_eps_bearer_context_accept(activate_dedicated_eps_bearer_context_accept_msg *activate_dedicated_eps_bearer_context_accept, uint8_t *buffer, uint32_t len) { uint32_t decoded = 0; int decoded_result = 0; // Check if we got a NULL pointer and if buffer length is >= minimum length expected for the message. CHECK_PDU_POINTER_AND_LENGTH_DECODER(buffer, ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_ACCEPT_MINIMUM_LENGTH, len); /* Decoding mandatory fields */ /* Decoding optional fields */ while(len - decoded > 0) { uint8_t ieiDecoded = *(buffer + decoded); /* Type | value iei are below 0x80 so just return the first 4 bits */ if (ieiDecoded >= 0x80) ieiDecoded = ieiDecoded & 0xf0; switch(ieiDecoded) { case ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_ACCEPT_PROTOCOL_CONFIGURATION_OPTIONS_IEI: if ((decoded_result = decode_protocol_configuration_options(&activate_dedicated_eps_bearer_context_accept->protocolconfigurationoptions, ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_ACCEPT_PROTOCOL_CONFIGURATION_OPTIONS_IEI, buffer + decoded, len - decoded)) <= 0) return decoded_result; decoded += decoded_result; /* Set corresponding mask to 1 in presencemask */ activate_dedicated_eps_bearer_context_accept->presencemask |= ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_ACCEPT_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; break; default: errorCodeDecoder = TLV_DECODE_UNEXPECTED_IEI; return TLV_DECODE_UNEXPECTED_IEI; } } return decoded; }
int decode_authentication_request(authentication_request_msg *authentication_request, uint8_t *buffer, uint32_t len) { uint32_t decoded = 0; int decoded_result = 0; // Check if we got a NULL pointer and if buffer length is >= minimum length expected for the message. CHECK_PDU_POINTER_AND_LENGTH_DECODER(buffer, AUTHENTICATION_REQUEST_MINIMUM_LENGTH, len); /* Decoding mandatory fields */ if ((decoded_result = decode_u8_nas_key_set_identifier(&authentication_request->naskeysetidentifierasme, 0, *(buffer + decoded), len - decoded)) < 0) return decoded_result; decoded++; if ((decoded_result = decode_authentication_parameter_rand(&authentication_request->authenticationparameterrand, 0, buffer + decoded, len - decoded)) < 0) return decoded_result; else decoded += decoded_result; if ((decoded_result = decode_authentication_parameter_autn(&authentication_request->authenticationparameterautn, 0, buffer + decoded, len - decoded)) < 0) return decoded_result; else decoded += decoded_result; return decoded; }
int decode_esm_information_request(esm_information_request_msg *esm_information_request, uint8_t *buffer, uint32_t len) { uint32_t decoded = 0; // Check if we got a NULL pointer and if buffer length is >= minimum length expected for the message. CHECK_PDU_POINTER_AND_LENGTH_DECODER(buffer, ESM_INFORMATION_REQUEST_MINIMUM_LENGTH, len); /* Decoding mandatory fields */ return decoded; }
int decode_pdn_connectivity_reject ( pdn_connectivity_reject_msg * pdn_connectivity_reject, uint8_t * buffer, uint32_t len) { uint32_t decoded = 0; int decoded_result = 0; // Check if we got a NULL pointer and if buffer length is >= minimum length expected for the message. CHECK_PDU_POINTER_AND_LENGTH_DECODER (buffer, PDN_CONNECTIVITY_REJECT_MINIMUM_LENGTH, len); /* * Decoding mandatory fields */ if ((decoded_result = decode_esm_cause (&pdn_connectivity_reject->esmcause, 0, buffer + decoded, len - decoded)) < 0) return decoded_result; else decoded += decoded_result; /* * Decoding optional fields */ while (len - decoded > 0) { uint8_t ieiDecoded = *(buffer + decoded); /* * Type | value iei are below 0x80 so just return the first 4 bits */ if (ieiDecoded >= 0x80) ieiDecoded = ieiDecoded & 0xf0; switch (ieiDecoded) { case PDN_CONNECTIVITY_REJECT_PROTOCOL_CONFIGURATION_OPTIONS_IEI: if ((decoded_result = decode_protocol_configuration_options (&pdn_connectivity_reject->protocolconfigurationoptions, PDN_CONNECTIVITY_REJECT_PROTOCOL_CONFIGURATION_OPTIONS_IEI, buffer + decoded, len - decoded)) <= 0) return decoded_result; decoded += decoded_result; /* * Set corresponding mask to 1 in presencemask */ pdn_connectivity_reject->presencemask |= PDN_CONNECTIVITY_REJECT_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; break; default: errorCodeDecoder = TLV_DECODE_UNEXPECTED_IEI; return TLV_DECODE_UNEXPECTED_IEI; } } return decoded; }
int decode_imeisv_request(ImeisvRequest *imeisvrequest, uint8_t iei, uint8_t *buffer, uint32_t len) { int decoded = 0; CHECK_PDU_POINTER_AND_LENGTH_DECODER(buffer, IMEISV_REQUEST_MINIMUM_LENGTH, len); if (iei > 0) { CHECK_IEI_DECODER((*buffer & 0xf0), iei); } *imeisvrequest = *buffer & 0x7; decoded++; #if defined (NAS_DEBUG) dump_imeisv_request_xml(imeisvrequest, iei); #endif return decoded; }
int decode_csfb_response(CsfbResponse *csfbresponse, uint8_t iei, uint8_t *buffer, uint32_t len) { int decoded = 0; CHECK_PDU_POINTER_AND_LENGTH_DECODER(buffer, CSFB_RESPONSE_MINIMUM_LENGTH, len); if (iei > 0) { CHECK_IEI_DECODER((*buffer & 0xf0), iei); } *csfbresponse = *buffer & 0x7; decoded++; #if defined (NAS_DEBUG) dump_csfb_response_xml(csfbresponse, iei); #endif return decoded; }
int decode_tracking_area_update_complete ( tracking_area_update_complete_msg * tracking_area_update_complete, uint8_t * buffer, uint32_t len) { uint32_t decoded = 0; // Check if we got a NULL pointer and if buffer length is >= minimum length expected for the message. CHECK_PDU_POINTER_AND_LENGTH_DECODER (buffer, TRACKING_AREA_UPDATE_COMPLETE_MINIMUM_LENGTH, len); /* * Decoding mandatory fields */ return decoded; }
int decode_detach_accept ( detach_accept_msg * detach_accept, uint8_t * buffer, uint32_t len) { uint32_t decoded = 0; // Check if we got a NULL pointer and if buffer length is >= minimum length expected for the message. CHECK_PDU_POINTER_AND_LENGTH_DECODER (buffer, DETACH_ACCEPT_MINIMUM_LENGTH, len); /* * Decoding mandatory fields */ return decoded; }
int decode_esm_information_transfer_flag(EsmInformationTransferFlag *esminformationtransferflag, uint8_t iei, uint8_t *buffer, uint32_t len) { int decoded = 0; CHECK_PDU_POINTER_AND_LENGTH_DECODER(buffer, ESM_INFORMATION_TRANSFER_FLAG_MINIMUM_LENGTH, len); if (iei > 0) { CHECK_IEI_DECODER((*buffer & 0xf0), iei); } *esminformationtransferflag = *buffer & 0x1; decoded++; #if defined (NAS_DEBUG) dump_esm_information_transfer_flag_xml(esminformationtransferflag, iei); #endif return decoded; }
int decode_guti_type(GutiType *gutitype, uint8_t iei, uint8_t *buffer, uint32_t len) { int decoded = 0; CHECK_PDU_POINTER_AND_LENGTH_DECODER(buffer, GUTI_TYPE_MINIMUM_LENGTH, len); if (iei > 0) { CHECK_IEI_DECODER((*buffer & 0xf0), iei); } *gutitype = *buffer & 0x7; decoded++; #if defined (NAS_DEBUG) dump_guti_type_xml(gutitype, iei); #endif return decoded; }
int decode_eps_attach_type(EpsAttachType *epsattachtype, uint8_t iei, uint8_t *buffer, uint32_t len) { int decoded = 0; CHECK_PDU_POINTER_AND_LENGTH_DECODER(buffer, EPS_ATTACH_TYPE_MINIMUM_LENGTH, len); if (iei > 0) { CHECK_IEI_DECODER((*buffer & 0xf0), iei); } *epsattachtype = *buffer & 0x7; decoded++; #if defined (NAS_DEBUG) dump_eps_attach_type_xml(epsattachtype, iei); #endif return decoded; }
int decode_eps_attach_result(EpsAttachResult *epsattachresult, uint8_t iei, uint8_t *buffer, uint32_t len) { int decoded = 0; CHECK_PDU_POINTER_AND_LENGTH_DECODER(buffer, EPS_ATTACH_RESULT_MINIMUM_LENGTH, len); if (iei > 0) { CHECK_IEI_DECODER((*buffer & 0xf0), iei); } *epsattachresult = *buffer & 0x7; decoded++; #if defined (NAS_DEBUG) dump_eps_attach_result_xml(epsattachresult, iei); #endif return decoded; }
int decode_attach_complete(attach_complete_msg *attach_complete, uint8_t *buffer, uint32_t len) { uint32_t decoded = 0; int decoded_result = 0; // Check if we got a NULL pointer and if buffer length is >= minimum length expected for the message. CHECK_PDU_POINTER_AND_LENGTH_DECODER(buffer, ATTACH_COMPLETE_MINIMUM_LENGTH, len); /* Decoding mandatory fields */ if ((decoded_result = decode_esm_message_container(&attach_complete->esmmessagecontainer, 0, buffer + decoded, len - decoded)) < 0) return decoded_result; else decoded += decoded_result; return decoded; }
int decode_identity_type_2(IdentityType2 *identitytype2, uint8_t iei, uint8_t *buffer, uint32_t len) { int decoded = 0; CHECK_PDU_POINTER_AND_LENGTH_DECODER(buffer, IDENTITY_TYPE_2_MINIMUM_LENGTH, len); if (iei > 0) { CHECK_IEI_DECODER((*buffer & 0xf0), iei); } *identitytype2 = *buffer & 0x7; decoded++; #if defined (NAS_DEBUG) dump_identity_type_2_xml(identitytype2, iei); #endif return decoded; }
int decode_security_mode_reject(security_mode_reject_msg *security_mode_reject, uint8_t *buffer, uint32_t len) { uint32_t decoded = 0; int decoded_result = 0; // Check if we got a NULL pointer and if buffer length is >= minimum length expected for the message. CHECK_PDU_POINTER_AND_LENGTH_DECODER(buffer, SECURITY_MODE_REJECT_MINIMUM_LENGTH, len); /* Decoding mandatory fields */ if ((decoded_result = decode_emm_cause(&security_mode_reject->emmcause, 0, buffer + decoded, len - decoded)) < 0) return decoded_result; else decoded += decoded_result; return decoded; }
int decode_ue_radio_capability_information_update_needed(UeRadioCapabilityInformationUpdateNeeded *ueradiocapabilityinformationupdateneeded, uint8_t iei, uint8_t *buffer, uint32_t len) { int decoded = 0; CHECK_PDU_POINTER_AND_LENGTH_DECODER(buffer, UE_RADIO_CAPABILITY_INFORMATION_UPDATE_NEEDED_MINIMUM_LENGTH, len); if (iei > 0) { CHECK_IEI_DECODER((*buffer & 0xf0), iei); } *ueradiocapabilityinformationupdateneeded = *buffer & 0x1; decoded++; #if defined (NAS_DEBUG) dump_ue_radio_capability_information_update_needed_xml(ueradiocapabilityinformationupdateneeded, iei); #endif return decoded; }
int decode_identity_response(identity_response_msg *identity_response, uint8_t *buffer, uint32_t len) { uint32_t decoded = 0; int decoded_result = 0; // Check if we got a NULL pointer and if buffer length is >= minimum length expected for the message. CHECK_PDU_POINTER_AND_LENGTH_DECODER(buffer, IDENTITY_RESPONSE_MINIMUM_LENGTH, len); /* Decoding mandatory fields */ if ((decoded_result = decode_mobile_identity(&identity_response->mobileidentity, 0, buffer + decoded, len - decoded)) < 0) return decoded_result; else decoded += decoded_result; return decoded; }
int decode_additional_update_result(AdditionalUpdateResult *additionalupdateresult, uint8_t iei, uint8_t *buffer, uint32_t len) { int decoded = 0; CHECK_PDU_POINTER_AND_LENGTH_DECODER(buffer, ADDITIONAL_UPDATE_RESULT_MINIMUM_LENGTH, len); if (iei > 0) { CHECK_IEI_DECODER((*buffer & 0xf0), iei); } *additionalupdateresult = *buffer & 0x3; decoded++; #if defined (NAS_DEBUG) dump_additional_update_result_xml(additionalupdateresult, iei); #endif return decoded; }
int decode_authentication_response(authentication_response_msg *authentication_response, uint8_t *buffer, uint32_t len) { uint32_t decoded = 0; int decoded_result = 0; // Check if we got a NULL pointer and if buffer length is >= minimum length expected for the message. CHECK_PDU_POINTER_AND_LENGTH_DECODER(buffer, AUTHENTICATION_RESPONSE_MINIMUM_LENGTH, len); /* Decoding mandatory fields */ if ((decoded_result = decode_authentication_response_parameter(&authentication_response->authenticationresponseparameter, 0, buffer + decoded, len - decoded)) < 0) return decoded_result; else decoded += decoded_result; return decoded; }
int decode_esm_status(esm_status_msg *esm_status, uint8_t *buffer, uint32_t len) { uint32_t decoded = 0; int decoded_result = 0; // Check if we got a NULL pointer and if buffer length is >= minimum length expected for the message. CHECK_PDU_POINTER_AND_LENGTH_DECODER(buffer, ESM_STATUS_MINIMUM_LENGTH, len); /* Decoding mandatory fields */ if ((decoded_result = decode_esm_cause(&esm_status->esmcause, 0, buffer + decoded, len - decoded)) < 0) return decoded_result; else decoded += decoded_result; return decoded; }
int decode_uplink_nas_transport(uplink_nas_transport_msg *uplink_nas_transport, uint8_t *buffer, uint32_t len) { uint32_t decoded = 0; int decoded_result = 0; // Check if we got a NULL pointer and if buffer length is >= minimum length expected for the message. CHECK_PDU_POINTER_AND_LENGTH_DECODER(buffer, UPLINK_NAS_TRANSPORT_MINIMUM_LENGTH, len); /* Decoding mandatory fields */ if ((decoded_result = decode_nas_message_container(&uplink_nas_transport->nasmessagecontainer, 0, buffer + decoded, len - decoded)) < 0) return decoded_result; else decoded += decoded_result; return decoded; }
int decode_tmsi_status(TmsiStatus *tmsistatus, uint8_t iei, uint8_t *buffer, uint32_t len) { int decoded = 0; CHECK_PDU_POINTER_AND_LENGTH_DECODER(buffer, TMSI_STATUS_MINIMUM_LENGTH, len); if (iei > 0) { CHECK_IEI_DECODER((*buffer & 0xf0), iei); } *tmsistatus = *buffer & 0x1; decoded++; #if defined (NAS_DEBUG) dump_tmsi_status_xml(tmsistatus, iei); #endif return decoded; }
int decode_nas_key_set_identifier(NasKeySetIdentifier *naskeysetidentifier, uint8_t iei, uint8_t *buffer, uint32_t len) { int decoded = 0; CHECK_PDU_POINTER_AND_LENGTH_DECODER(buffer, NAS_KEY_SET_IDENTIFIER_MINIMUM_LENGTH, len); if (iei > 0) { CHECK_IEI_DECODER((*buffer & 0xf0), iei); } naskeysetidentifier->tsc = (*(buffer + decoded) >> 3) & 0x1; naskeysetidentifier->naskeysetidentifier = *(buffer + decoded) & 0x7; decoded++; #if defined (NAS_DEBUG) dump_nas_key_set_identifier_xml(naskeysetidentifier, iei); #endif return decoded; }
int decode_eps_update_type(EpsUpdateType *epsupdatetype, uint8_t iei, uint8_t *buffer, uint32_t len) { int decoded = 0; CHECK_PDU_POINTER_AND_LENGTH_DECODER(buffer, EPS_UPDATE_TYPE_MINIMUM_LENGTH, len); if (iei > 0) { CHECK_IEI_DECODER((*buffer & 0xf0), iei); } epsupdatetype->activeflag = (*(buffer + decoded) >> 3) & 0x1; epsupdatetype->epsupdatetypevalue = *(buffer + decoded) & 0x7; decoded++; #if defined (NAS_DEBUG) dump_eps_update_type_xml(epsupdatetype, iei); #endif return decoded; }
int decode_esm_information_response(esm_information_response_msg *esm_information_response, uint8_t *buffer, uint32_t len) { uint32_t decoded = 0; int decoded_result = 0; // Check if we got a NULL pointer and if buffer length is >= minimum length expected for the message. CHECK_PDU_POINTER_AND_LENGTH_DECODER(buffer, ESM_INFORMATION_RESPONSE_MINIMUM_LENGTH, len); /* Decoding mandatory fields */ /* Decoding optional fields */ while(len - decoded > 0) { uint8_t ieiDecoded = *(buffer + decoded); /* Type | value iei are below 0x80 so just return the first 4 bits */ if (ieiDecoded >= 0x80) ieiDecoded = ieiDecoded & 0xf0; switch(ieiDecoded) { case ESM_INFORMATION_RESPONSE_ACCESS_POINT_NAME_IEI: if ((decoded_result = decode_access_point_name(&esm_information_response->accesspointname, ESM_INFORMATION_RESPONSE_ACCESS_POINT_NAME_IEI, buffer + decoded, len - decoded)) <= 0) return decoded_result; decoded += decoded_result; /* Set corresponding mask to 1 in presencemask */ esm_information_response->presencemask |= ESM_INFORMATION_RESPONSE_ACCESS_POINT_NAME_PRESENT; break; case ESM_INFORMATION_RESPONSE_PROTOCOL_CONFIGURATION_OPTIONS_IEI: if ((decoded_result = decode_protocol_configuration_options(&esm_information_response->protocolconfigurationoptions, ESM_INFORMATION_RESPONSE_PROTOCOL_CONFIGURATION_OPTIONS_IEI, buffer + decoded, len - decoded)) <= 0) return decoded_result; decoded += decoded_result; /* Set corresponding mask to 1 in presencemask */ esm_information_response->presencemask |= ESM_INFORMATION_RESPONSE_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; break; default: errorCodeDecoder = TLV_DECODE_UNEXPECTED_IEI; return TLV_DECODE_UNEXPECTED_IEI; } } return decoded; }
int decode_authentication_failure(authentication_failure_msg *authentication_failure, uint8_t *buffer, uint32_t len) { uint32_t decoded = 0; int decoded_result = 0; // Check if we got a NULL pointer and if buffer length is >= minimum length expected for the message. CHECK_PDU_POINTER_AND_LENGTH_DECODER(buffer, AUTHENTICATION_FAILURE_MINIMUM_LENGTH, len); /* Decoding mandatory fields */ if ((decoded_result = decode_emm_cause(&authentication_failure->emmcause, 0, buffer + decoded, len - decoded)) < 0) return decoded_result; else decoded += decoded_result; /* Decoding optional fields */ while(len - decoded > 0) { uint8_t ieiDecoded = *(buffer + decoded); /* Type | value iei are below 0x80 so just return the first 4 bits */ if (ieiDecoded >= 0x80) ieiDecoded = ieiDecoded & 0xf0; switch(ieiDecoded) { case AUTHENTICATION_FAILURE_AUTHENTICATION_FAILURE_PARAMETER_IEI: if ((decoded_result = decode_authentication_failure_parameter(&authentication_failure->authenticationfailureparameter, AUTHENTICATION_FAILURE_AUTHENTICATION_FAILURE_PARAMETER_IEI, buffer + decoded, len - decoded)) <= 0) return decoded_result; decoded += decoded_result; /* Set corresponding mask to 1 in presencemask */ authentication_failure->presencemask |= AUTHENTICATION_FAILURE_AUTHENTICATION_FAILURE_PARAMETER_PRESENT; break; default: errorCodeDecoder = TLV_DECODE_UNEXPECTED_IEI; return TLV_DECODE_UNEXPECTED_IEI; } } 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_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_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; }