Commit e8c4f0ce authored by Tien Thinh NGUYEN's avatar Tien Thinh NGUYEN

Send Service Reject when there's no appropriate NAS/NGAP context

parent d4e1f921
...@@ -48,6 +48,7 @@ ...@@ -48,6 +48,7 @@
#include "SecurityModeComplete.hpp" #include "SecurityModeComplete.hpp"
#include "ServiceAccept.hpp" #include "ServiceAccept.hpp"
#include "ServiceRequest.hpp" #include "ServiceRequest.hpp"
#include "ServiceReject.hpp"
#include "String2Value.hpp" #include "String2Value.hpp"
#include "UEAuthenticationCtx.h" #include "UEAuthenticationCtx.h"
#include "ULNASTransport.hpp" #include "ULNASTransport.hpp"
...@@ -811,19 +812,28 @@ void amf_n1::service_request_handle( ...@@ -811,19 +812,28 @@ void amf_n1::service_request_handle(
return; return;
} }
// If there's no appropriate context, send Service Reject
if (!nc or !uc or !nc->security_ctx) { if (!nc or !uc or !nc->security_ctx) {
Logger::amf_n1().debug( Logger::amf_n1().debug(
"Cannot find NAS/UE context, send Service Reject to UE"); "Cannot find NAS/UE context, send Service Reject to UE");
// TODO: service reject
uint8_t nas[4]; std::unique_ptr<ServiceReject> service_reject =
nas[0] = EPD_5GS_MM_MSG; std::make_unique<ServiceReject>();
nas[1] = PLAIN_5GS_MSG; service_reject->SetHeader(PLAIN_5GS_MSG);
nas[2] = SERVICE_REJECT; service_reject->Set5gmmCause(_5GMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED);
nas[3] = _5GMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED;
uint8_t buffer[BUFFER_SIZE_512] = {0};
int encoded_size = service_reject->Encode(buffer, BUFFER_SIZE_512);
comUt::print_buffer(
"amf_n1", "Service-Reject message buffer", buffer, encoded_size);
if (!encoded_size) {
Logger::amf_n1().error("Encode Service-Reject message error");
return;
}
std::shared_ptr<itti_dl_nas_transport> dnt = std::shared_ptr<itti_dl_nas_transport> dnt =
std::make_shared<itti_dl_nas_transport>(TASK_AMF_N1, TASK_AMF_N2); std::make_shared<itti_dl_nas_transport>(TASK_AMF_N1, TASK_AMF_N2);
dnt->nas = blk2bstr(nas, 4); dnt->nas = blk2bstr(buffer, encoded_size);
dnt->amf_ue_ngap_id = amf_ue_ngap_id; dnt->amf_ue_ngap_id = amf_ue_ngap_id;
dnt->ran_ue_ngap_id = ran_ue_ngap_id; dnt->ran_ue_ngap_id = ran_ue_ngap_id;
...@@ -836,6 +846,7 @@ void amf_n1::service_request_handle( ...@@ -836,6 +846,7 @@ void amf_n1::service_request_handle(
return; return;
} }
// Otherwise, continue to process Service Request message
set_amf_ue_ngap_id_2_nas_context(amf_ue_ngap_id, nc); set_amf_ue_ngap_id_2_nas_context(amf_ue_ngap_id, nc);
nas_secu_ctx* secu = nc->security_ctx; // TODO: remove naked ptr nas_secu_ctx* secu = nc->security_ctx; // TODO: remove naked ptr
if (!secu) { if (!secu) {
......
...@@ -130,7 +130,7 @@ constexpr uint8_t kIeiEpsBearerContextStatus = 0x60; ...@@ -130,7 +130,7 @@ constexpr uint8_t kIeiEpsBearerContextStatus = 0x60;
constexpr uint8_t kIeiUeRadioCapabilityId = 0x67; constexpr uint8_t kIeiUeRadioCapabilityId = 0x67;
constexpr uint8_t kIeiRejectedNssaiRr = 0x69; constexpr uint8_t kIeiRejectedNssaiRr = 0x69;
constexpr uint8_t kIeiGprsTimer3T3324 = 0x6A; constexpr uint8_t kIeiGprsTimer3T3324 = 0x6A;
constexpr uint8_t kIeiGprsTimer3T3348 = 0x6B; constexpr uint8_t kIeiGprsTimer3T3448 = 0x6B;
constexpr uint8_t kIeiGprsTimer3T3447 = 0x6C; constexpr uint8_t kIeiGprsTimer3T3447 = 0x6C;
constexpr uint8_t kIeiGprsTimer3T3512 = 0x5E; constexpr uint8_t kIeiGprsTimer3T3512 = 0x5E;
constexpr uint8_t kIeiGprsTimer3BackOffTimer = 0x37; constexpr uint8_t kIeiGprsTimer3BackOffTimer = 0x37;
......
...@@ -1155,9 +1155,9 @@ int RegistrationAccept::Decode(uint8_t* buf, int len) { ...@@ -1155,9 +1155,9 @@ int RegistrationAccept::Decode(uint8_t* buf, int len) {
Logger::nas_mm().debug("Next IEI (0x%x)", octet); Logger::nas_mm().debug("Next IEI (0x%x)", octet);
} break; } break;
case kIeiGprsTimer3T3348: { case kIeiGprsTimer3T3448: {
Logger::nas_mm().debug("Decoding IEI 0x%x", kIeiGprsTimer3T3348); Logger::nas_mm().debug("Decoding IEI 0x%x", kIeiGprsTimer3T3448);
GprsTimer3 ie_T3448_value_tmp(kIeiGprsTimer3T3348); GprsTimer3 ie_T3448_value_tmp(kIeiGprsTimer3T3448);
if ((decoded_result = ie_T3448_value_tmp.Decode( if ((decoded_result = ie_T3448_value_tmp.Decode(
buf + decoded_size, len - decoded_size, true)) == buf + decoded_size, len - decoded_size, true)) ==
KEncodeDecodeError) { KEncodeDecodeError) {
......
...@@ -242,9 +242,9 @@ int ServiceAccept::Decode(uint8_t* buf, int len) { ...@@ -242,9 +242,9 @@ int ServiceAccept::Decode(uint8_t* buf, int len) {
Logger::nas_mm().debug("Next IEI (0x%x)", octet); Logger::nas_mm().debug("Next IEI (0x%x)", octet);
} break; } break;
case kIeiGprsTimer3T3348: { case kIeiGprsTimer3T3448: {
Logger::nas_mm().debug("Decoding IEI 0x%x", kIeiGprsTimer3T3348); Logger::nas_mm().debug("Decoding IEI 0x%x", kIeiGprsTimer3T3448);
GprsTimer3 ie_T3448_value_tmp(kIeiGprsTimer3T3348); GprsTimer3 ie_T3448_value_tmp(kIeiGprsTimer3T3448);
if ((decoded_result = ie_T3448_value_tmp.Decode( if ((decoded_result = ie_T3448_value_tmp.Decode(
buf + decoded_size, len - decoded_size, true)) == buf + decoded_size, len - decoded_size, true)) ==
KEncodeDecodeError) KEncodeDecodeError)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment