diff --git a/srsue/hdr/upper/nas.h b/srsue/hdr/upper/nas.h index 70ccbea35..e83edfbf8 100644 --- a/srsue/hdr/upper/nas.h +++ b/srsue/hdr/upper/nas.h @@ -130,6 +130,7 @@ private: bool have_guti; bool have_ctxt; nas_sec_ctxt ctxt; + bool auth_request; uint32_t ip_addr; uint8_t eps_bearer_id; @@ -180,7 +181,7 @@ private: void gen_service_request(byte_buffer_t *msg); // Senders - void send_identity_response(); + void send_identity_response(uint32_t lcid, uint8 id_type); void send_service_request(); void send_esm_information_response(const uint8 proc_transaction_id); void send_authentication_response(const uint8_t* res, const size_t res_len, const uint8_t sec_hdr_type); diff --git a/srsue/src/upper/nas.cc b/srsue/src/upper/nas.cc index ee2228ec4..877b15b05 100644 --- a/srsue/src/upper/nas.cc +++ b/srsue/src/upper/nas.cc @@ -46,7 +46,7 @@ namespace srsue { ********************************************************************/ nas::nas() - : state(EMM_STATE_DEREGISTERED), have_guti(false), have_ctxt(false), ip_addr(0), eps_bearer_id(0) + : state(EMM_STATE_DEREGISTERED), have_guti(false), have_ctxt(false), auth_request(false), ip_addr(0), eps_bearer_id(0) { ctxt.rx_count = 0; ctxt.tx_count = 0; @@ -781,6 +781,7 @@ void nas::parse_authentication_request(uint32_t lcid, byte_buffer_t *pdu, const nas_log->info("Network authentication successful\n"); send_authentication_response(res, res_len, sec_hdr_type); nas_log->info_hex(ctxt.k_asme, 32, "Generated k_asme:\n"); + auth_request = true; } else if (auth_result == AUTH_SYNCH_FAILURE) { nas_log->error("Network authentication synchronization failure.\n"); send_authentication_failure(LIBLTE_MME_EMM_CAUSE_SYNCH_FAILURE, res); @@ -805,36 +806,19 @@ void nas::parse_identity_request(uint32_t lcid, byte_buffer_t *pdu) { ZERO_OBJECT(id_resp); liblte_mme_unpack_identity_request_msg((LIBLTE_BYTE_MSG_STRUCT *) pdu, &id_req); - nas_log->info("Received Identity Request. ID type: %d\n", id_req.id_type); - switch(id_req.id_type) { - case LIBLTE_MME_MOBILE_ID_TYPE_IMSI: - id_resp.mobile_id.type_of_id = LIBLTE_MME_MOBILE_ID_TYPE_IMSI; - usim->get_imsi_vec(id_resp.mobile_id.imsi, 15); - break; - case LIBLTE_MME_MOBILE_ID_TYPE_IMEI: - id_resp.mobile_id.type_of_id = LIBLTE_MME_MOBILE_ID_TYPE_IMEI; - usim->get_imei_vec(id_resp.mobile_id.imei, 15); - break; - default: - nas_log->error("Unhandled ID type: %d\n", id_req.id_type); - pool->deallocate(pdu); - return; - } + // Deallocate PDU after parsing + pool->deallocate(pdu); - pdu->reset(); - liblte_mme_pack_identity_response_msg(&id_resp, (LIBLTE_BYTE_MSG_STRUCT *) pdu); + ctxt.rx_count++; - if(pcap != NULL) { - pcap->write_nas(pdu->msg, pdu->N_bytes); - } + nas_log->info("Received Identity Request. ID type: %d\n", id_req.id_type); - rrc->write_sdu(lcid, pdu); + send_identity_response(lcid, id_req.id_type); } void nas::parse_security_mode_command(uint32_t lcid, byte_buffer_t *pdu) { - if (!pdu) { nas_log->error("Invalid PDU\n"); return; @@ -883,9 +867,12 @@ void nas::parse_security_mode_command(uint32_t lcid, byte_buffer_t *pdu) return; } - // Reset counters (as per 24.301 5.4.3.2) - ctxt.rx_count = 0; - ctxt.tx_count = 0; + // Reset counters (as per 24.301 5.4.3.2), only needed for initial security mode command + if (auth_request) { + ctxt.rx_count = 0; + ctxt.tx_count = 0; + auth_request = false; + } ctxt.cipher_algo = (CIPHERING_ALGORITHM_ID_ENUM) sec_mode_cmd.selected_nas_sec_algs.type_of_eea; ctxt.integ_algo = (INTEGRITY_ALGORITHM_ID_ENUM) sec_mode_cmd.selected_nas_sec_algs.type_of_eia; @@ -1329,7 +1316,40 @@ void nas::send_authentication_failure(const uint8_t cause, const uint8_t* auth_f } -void nas::send_identity_response() {} +void nas::send_identity_response(uint32_t lcid, uint8 id_type) +{ + LIBLTE_MME_ID_RESPONSE_MSG_STRUCT id_resp; + ZERO_OBJECT(id_resp); + + switch(id_type) { + case LIBLTE_MME_MOBILE_ID_TYPE_IMSI: + id_resp.mobile_id.type_of_id = LIBLTE_MME_MOBILE_ID_TYPE_IMSI; + usim->get_imsi_vec(id_resp.mobile_id.imsi, 15); + break; + case LIBLTE_MME_MOBILE_ID_TYPE_IMEI: + id_resp.mobile_id.type_of_id = LIBLTE_MME_MOBILE_ID_TYPE_IMEI; + usim->get_imei_vec(id_resp.mobile_id.imei, 15); + break; + default: + nas_log->error("Unhandled ID type: %d\n", id_type); + return; + } + + byte_buffer_t *pdu = pool_allocate_blocking; + if (!pdu) { + nas_log->error("Fatal Error: Couldn't allocate PDU in send_identity_response().\n"); + return; + } + + liblte_mme_pack_identity_response_msg(&id_resp, (LIBLTE_BYTE_MSG_STRUCT *) pdu); + + if(pcap != NULL) { + pcap->write_nas(pdu->msg, pdu->N_bytes); + } + + rrc->write_sdu(lcid, pdu); + ctxt.tx_count++; +} void nas::send_service_request() { byte_buffer_t *msg = pool_allocate_blocking;