From adf176449680cb166e09e1a443563254d3994240 Mon Sep 17 00:00:00 2001 From: Pedro Alvarez Date: Mon, 16 Oct 2017 13:03:33 +0100 Subject: [PATCH] added plmn to MCCMNC in the srslte lib --- lib/include/srslte/common/bcd_helpers.h | 72 +++++++++++++++++++++++++ srsepc/src/mme/mme.cc | 3 ++ srsepc/src/mme/s1ap.cc | 21 ++------ 3 files changed, 78 insertions(+), 18 deletions(-) diff --git a/lib/include/srslte/common/bcd_helpers.h b/lib/include/srslte/common/bcd_helpers.h index b696954c2..10bed4347 100644 --- a/lib/include/srslte/common/bcd_helpers.h +++ b/lib/include/srslte/common/bcd_helpers.h @@ -120,6 +120,78 @@ inline std::string plmn_id_to_string(LIBLTE_RRC_PLMN_IDENTITY_STRUCT plmn_id) { return mcc_str + mnc_str; } +/****************************************************************************** + * Convert PLMN to BCD-coded MCC and MNC. + * Digits are represented by 4-bit nibbles. Unused nibbles are filled with 0xF. + * MNC 001 represented as 0xF001 + * MNC 01 represented as 0xFF01 + * PLMN encoded as per TS 36.413 sec 9.2.3.8 + *****************************************************************************/ +inline void s1ap_plmn_to_mccmnc(uint32_t plmn, uint16_t *mcc, uint16_t *mnc) +{ + uint8_t nibbles[6]; + nibbles[0] = (plmn & 0xF00000) >> 20; + nibbles[1] = (plmn & 0x0F0000) >> 16; + nibbles[2] = (plmn & 0x00F000) >> 12; + nibbles[3] = (plmn & 0x000F00) >> 8; + nibbles[4] = (plmn & 0x0000F0) >> 4; + nibbles[5] = (plmn & 0x00000F); + + *mcc = 0xF000; + *mnc = 0xF000; + *mcc |= nibbles[1] << 8; // MCC digit 1 + *mcc |= nibbles[0] << 4; // MCC digit 2 + *mcc |= nibbles[3]; // MCC digit 3 + + if(nibbles[2] == 0xF) { + // 2-digit MNC + *mnc |= 0x0F00; // MNC digit 1 + *mnc |= nibbles[5] << 4; // MNC digit 2 + *mnc |= nibbles[4]; // MNC digit 3 + } else { + // 3-digit MNC + *mnc |= nibbles[5] << 8; // MNC digit 1 + *mnc |= nibbles[4] << 4; // MNC digit 2 + *mnc |= nibbles[2] ; // MNC digit 3 + } +} + +/****************************************************************************** + * Convert BCD-coded MCC and MNC to PLMN. + * Digits are represented by 4-bit nibbles. Unused nibbles are filled with 0xF. + * MNC 001 represented as 0xF001 + * MNC 01 represented as 0xFF01 + * PLMN encoded as per TS 36.413 sec 9.2.3.8 + *****************************************************************************/ +inline void s1ap_mccmnc_to_plmn(uint16_t mcc, uint16_t mnc, uint32_t *plmn) +{ + uint8_t nibbles[6]; + nibbles[1] = (mcc & 0x0F00) >> 8; // MCC digit 1 + nibbles[0] = (mcc & 0x00F0) >> 4; // MCC digit 2 + nibbles[3] = (mcc & 0x000F); // MCC digit 3 + + if((mnc & 0xFF00) == 0xFF00) { + // 2-digit MNC + nibbles[2] = 0x0F; // MNC digit 1 + nibbles[5] = (mnc & 0x00F0) >> 4; // MNC digit 2 + nibbles[4] = (mnc & 0x000F); // MNC digit 3 + } else { + // 3-digit MNC + nibbles[5] = (mnc & 0x0F00) >> 8; // MNC digit 1 + nibbles[4] = (mnc & 0x00F0) >> 4; // MNC digit 2 + nibbles[2] = (mnc & 0x000F); // MNC digit 3 + } + + *plmn = 0x000000; + *plmn |= nibbles[0] << 20; + *plmn |= nibbles[1] << 16; + *plmn |= nibbles[2] << 12; + *plmn |= nibbles[3] << 8; + *plmn |= nibbles[4] << 4; + *plmn |= nibbles[5]; +} + + } // namespace srslte #endif // BCD_HELPERS diff --git a/srsepc/src/mme/mme.cc b/srsepc/src/mme/mme.cc index d6f8b4359..f1221d8a5 100644 --- a/srsepc/src/mme/mme.cc +++ b/srsepc/src/mme/mme.cc @@ -135,6 +135,9 @@ mme::main_loop() std::cout << "\tSize: " << pdu->N_bytes << std::endl; std::cout << "\tMsg: " << pdu->msg << std::endl; m_s1ap.handle_s1ap_rx_pdu(pdu); + sctp_send(s1mme, "OK", 2, &sri, 0); + + } } } diff --git a/srsepc/src/mme/s1ap.cc b/srsepc/src/mme/s1ap.cc index 872d32ea0..4ced90566 100644 --- a/srsepc/src/mme/s1ap.cc +++ b/srsepc/src/mme/s1ap.cc @@ -33,7 +33,7 @@ #include #include -#include "srslte/upper/s1ap_common.h" +//#include "srslte/upper/s1ap_common.h" #include "srslte/common/bcd_helpers.h" #include "mme/s1ap.h" @@ -245,24 +245,9 @@ s1ap::handle_s1setuprequest(LIBLTE_S1AP_MESSAGE_S1SETUPREQUEST_STRUCT *msg) //Default Paging DRX LIBLTE_S1AP_PAGINGDRX_ENUM drx = msg->DefaultPagingDRX.e; std::cout << "Default Paging DRX" << drx << std::endl; + + /* - if(msg->ext) { - s1ap_log->warning("Not handling S1AP message extension\n"); - } - if(enbid_to_rnti_map.end() == enbid_to_rnti_map.find(msg->eNB_UE_S1AP_ID.ENB_UE_S1AP_ID)) { - s1ap_log->warning("eNB_UE_S1AP_ID not found - discarding message\n"); - return false; - } - uint16_t rnti = enbid_to_rnti_map[msg->eNB_UE_S1AP_ID.ENB_UE_S1AP_ID]; - ue_ctxt_map[rnti].MME_UE_S1AP_ID = msg->MME_UE_S1AP_ID.MME_UE_S1AP_ID; - - if(msg->HandoverRestrictionList_present) { - s1ap_log->warning("Not handling HandoverRestrictionList\n"); - } - if(msg->SubscriberProfileIDforRFP_present) { - s1ap_log->warning("Not handling SubscriberProfileIDforRFP\n"); - } - srslte::byte_buffer_t *pdu = pool_allocate; memcpy(pdu->msg, msg->NAS_PDU.buffer, msg->NAS_PDU.n_octets); pdu->N_bytes = msg->NAS_PDU.n_octets;