diff options
author | Harald Welte <laforge@gnumonks.org> | 2015-12-16 23:04:21 +0100 |
---|---|---|
committer | Harald Welte <laforge@gnumonks.org> | 2015-12-16 23:04:21 +0100 |
commit | d328c1a3aca9b59dd1ca15627899f2d39642f440 (patch) | |
tree | 64bca995c5ce725f23a51168baf473365e61eef5 /src | |
parent | c16117a22cff56ba794fae71f3e948cc5446342c (diff) |
WIP: add some early code for generating required RANAP messages
Diffstat (limited to 'src')
-rw-r--r-- | src/tests/test-ranap.c | 207 |
1 files changed, 207 insertions, 0 deletions
diff --git a/src/tests/test-ranap.c b/src/tests/test-ranap.c new file mode 100644 index 0000000..c8e0280 --- /dev/null +++ b/src/tests/test-ranap.c @@ -0,0 +1,207 @@ + + +/* This is just some non-compiling work in progress code to generate the + * minimum set of RANAP messages that the core network side needs to send + * towards the RNC */ + +int ranap_tx_dt(uint8_t sapi, const uint8_t *nas, unsigned int nas_len) +{ + RANAP_DirectTransferIEs_t ies; + RANAP_DirectTransfer_t dt; + struct msgb *msg; + int rc; + + memset(&ies, 0, sizeof(ies)); + + /* only SAPI optional field shall be present for CN->RNC */ + ies.presenceMask = DIRECTTRANSFERIES_RANAP_SAPI_PRESENT; + + if (sapi == 3) + ies.sapi = RANAP_SAPI_sapi_3; + else + ies.sapi = RANAP_SAPI_sapi_0; + + ies.nas_pdu.buf = nas; + ies.nas_pdu.size = nas_len; + + rc = ranap_encode_directtransferies(&dt, &ies); + + msg = ranap_generate_initiating_message(RANAP_ProcedureCode_id_DirectTransfer, + RANAP_Criticality_reject, + &asn_DEF_RANAP_DirectTransfer, + &dt); + /* FIXME: Hand that to RUA or SCCP */ +} + +static const enum RANAP_IntegrityProtectionAlgorithm ip_alg[2] = { + RANAP_IntegrityProtectionAlgorithm_standard_UMTS_integrity_algorithm_UIA1, + RANAP_IntegrityProtectionAlgorithm_standard_UMTS_integrity_algorithm_UIA2, +}; + +static const enum RANAP_EncryptionAlgorithm enc_alg[2] = { + RANAP_EncryptionAlgorithm_standard_UMTS_encryption_algorithm_UEA1, + RANAP_EncryptionAlgorithm_standard_UMTS_encryption_algorithm_UEA2, +}; + +int ranap_tx_sec_mod_cmd(void) +{ + RANAP_SecurityModeCommandIEs_t ies; + RANAP_SecurityModeCommand_t out; + struct msgb *msg; + int rc; + + memset(&ies, 0, sizeof(ies)); + + ies.presenceMask = SECURITYMODECOMMANDIES_RANAP_ENCRYPTIONINFORMATION_PRESENT; + + ASN_SEQUENCE_ADD(&ies.integrityProtectionInformation.permittedAlgorithms, &ip_alg[0]); + ASN_SEQUENCE_ADD(&ies.integrityProtectionInformation.permittedAlgorithms, &ip_alg[1]); + + ies.integrityProtectionInformation.key; /* FIXME */ + if (0) { + ASN_SEQUENCE_ADD(&ies.encryptionInformation.permittedAlgorithms, &enc_alg[0]); + ASN_SEQUENCE_ADD(&ies.encryptionInformation.permittedAlgorithms, &enc_alg[1]); + ies.encryptionInformation.key; /* FIXME */ + } + ies.keyStatus = RANAP_KeyStatus_new; /* FIXME */ + + rc = ranap_encode_securitymodecommandies(&out, &ies); + + asn_sequence_empty(&ies.integrityProtectionInformation.permittedAlgorithms); + asn_sequence_empty(&ies.encryptionInformation.permittedAlgorithms); + + msg = ranap_generate_initiating_message(RANAP_ProcedureCode_id_SecurityModeControl, + RANAP_Criticality_reject, + &asn_DEF_RANAP_SecurityModeCommand, + &out); +} + +int ranap_tx_common_id(const char *imsi) +{ + RANAP_CommonID_IEs_t ies; + RANAP_CommonID_t out; + struct msgb *msg; + int rc; + + memset(&ies, 0, sizeof(ies)); + + if (imsi) { + ies.permanentNAS_UE_ID.present = RANAP_PermanentNAS_UE_ID_PR_iMSI; + ies.permanentNAS_UE_ID.choice.iMSI; /* FIXME */ + } else + ies.permanentNAS_UE_ID.present = RANAP_PermanentNAS_UE_ID_PR_NOTHING; + + rc = ranap_encode_commonidies(&out, &ies); + + msg = ranap_generate_initiating_message(RANAP_ProcedureCode_id_CommonID, + RANAP_Criticality_ignore, + &asn_DEF_RANAP_CommonID, + &out); +} + +int ranap_tx_iu_rel_cmd(RANAP_Cause_t cause) +{ + RANAP_Iu_ReleaseCommandIEs_t ies; + RANAP_Iu_ReleaseCommand_t out; + struct msgb *msg; + int rc; + + memset(&ies, 0, sizeof(ies)); + + ies.cause = cause; + + rc = ranap_encode_iu_releasecommandies(&out, &ies); + + msg = ranap_generate_initiating_message(RANAP_ProcedureCode_id_Iu_Release, + RANAP_Criticality_reject, + &asn_DEF_RANAP_ReleaseCommand, + &out); +} + +int ranap_tx_paging_cmd(const char *imsi, uint32_t *tmsi, uint32_t cause) +{ + RANAP_PagingIEs_s ies; + RANAP_Paging_t out; + + memset(&ies, 0, sizeof(ies)); + + if (is_ps) + ies.cN_DomainIndicator = RANAP_CN_DomainIndicator_ps_domain; + else + ies.cN_DomainIndicator = RANAP_CN_DomainIndicator_cs_domain; + + ies.permanentNAS_UE_ID; /* FIXME */ + + if (tmsi) { + ies.presenceMask |= PAGINGIES_RANAP_TEMPORARYUE_ID_PRESENT; + if (is_ps) { + ies.temporaryUE_ID.present = RANAP_TemporaryUE_ID_PR_p_TMSI; + ies.temporaryUE_ID.choice.tMSI; + } else { + ies.temporaryUE_ID.present = RANAP_TemporaryUE_ID_PR_tMSI; + ies.temporaryUE_ID.choice.p_TMSI; + } + } + + if (cause) { + ies.presenceMask |= PAGINGIES_RANAP_PAGINGCAUSE_PRESENT; + ies.pagingCause = cause; + } + + rc = ranap_encode_iu_pagingies(&out, &ies); + + msg = ranap_generate_initiating_message(RANAP_ProcedureCode_id_Iu_Paging, + RANAP_Criticality_reject, + &asn_DEF_RANAP_Paging, + &out); +} + + + +static RANAP_RAB_Parameters_t rab_par_voice = { + .trafficClass = RANAP_TrafficClass_conversational, + .rAB_AsymmetryIndicator = ANAP_RAB_AsymmetryIndicator_symmetric_bidirectional + .maxBitrate = , + .deliveryOrder = RANAP_DeliveryOrder_delivery_order_not_requested + .maxSDU_Size = 1234, + .sDU_Parameters = , +}; + +static RANAP_UserPlaneInformation_t rab_upl_voice = { + .userPlaneMode = RANAP_UserPlaneMode_transparent_mode, + .uP_ModeVersions = FIXME, +}; + +int ranap_tx_rab_assign() +{ + RANAP_ProtocolIE_FieldPair_t *pair; + RANAP_RAB_AssignmentRequestIEs_t ies; + RANAP_RAB_AssignmentRequest_t out; + + + memset(&ies, 0, sizeof(ies)); + + ies.presenceMask = RAB_ASSIGNMENTREQUESTIES_RANAP_RAB_SETUPORMODIFYLIST_PRESENT; + /* RANAP_RAB_IE_ContainerPairList_t */ + + RANAP_RAB_SetupOrModifyItemFirst_t first; + + first.rAB_ID = FIXME; + first.nAS_SynchronisationIndicator = FIXME; + first.rAB_Parameters = &rab_par_voice; + first.userPlaneInformation = &rab_upl_voice; + first.transportLayerInformation = NULL; + + RANAP_RAB_SetupOrModifyItemSecond_t second; + + + pair = ranap_new_ie_pair(RANAP_ProtocolIE_ID_id_RAB_SetupOrModifyItem, + RANAP_Criticality_reject, + SetupOrModifyItemFirst, &first, + RANAP_Criticality_ignore, + SetupOrModifyItemSecond, &second); + + ASN_SEQUENCE_ADD(&ies.raB_SetupOrModifyList.list, pair); + + rc = ranap_encode_rab_assignmentrequesties(&out, &ies); +} |