Skip to content

Commit

Permalink
[mme][sgwc][smf] reorder sanity-checking (#73)
Browse files Browse the repository at this point in the history
  • Loading branch information
spencersevilla authored and Spencer Sevilla committed Feb 3, 2023
1 parent 8282900 commit 5094778
Show file tree
Hide file tree
Showing 4 changed files with 118 additions and 71 deletions.
69 changes: 42 additions & 27 deletions src/mme/mme-s11-handler.c
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,45 @@ void mme_s11_handle_create_session_response(
return;
}

/*********************
* Check Cause Value
*********************/
if (rsp->cause.presence == 0) {
ogs_error("No Cause");
cause_value = OGS_GTP2_CAUSE_MANDATORY_IE_MISSING;
}

if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
if (create_action == OGS_GTP_CREATE_IN_ATTACH_REQUEST) {
ogs_error("[%s] Attach reject", mme_ue->imsi_bcd);
ogs_assert(OGS_OK == nas_eps_send_attach_reject(mme_ue,
EMM_CAUSE_NETWORK_FAILURE, ESM_CAUSE_NETWORK_FAILURE));
}
mme_send_delete_session_or_mme_ue_context_release(mme_ue);
return;
}

cause = rsp->cause.data;
ogs_assert(cause);
cause_value = cause->value;
if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED &&
cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED_PARTIALLY &&
cause_value !=
OGS_GTP2_CAUSE_NEW_PDN_TYPE_DUE_TO_NETWORK_PREFERENCE &&
cause_value !=
OGS_GTP2_CAUSE_NEW_PDN_TYPE_DUE_TO_SINGLE_ADDRESS_BEARER_ONLY) {
ogs_error("GTP Failed [CAUSE:%d]", cause_value);
if (create_action == OGS_GTP_CREATE_IN_ATTACH_REQUEST) {
ogs_error("[%s] Attach reject", mme_ue->imsi_bcd);
ogs_assert(OGS_OK == nas_eps_send_attach_reject(mme_ue,
EMM_CAUSE_NETWORK_FAILURE, ESM_CAUSE_NETWORK_FAILURE));
}
mme_send_delete_session_or_mme_ue_context_release(mme_ue);
return;
}

cause_value = OGS_GTP2_CAUSE_REQUEST_ACCEPTED;

/*****************************************
* Check Mandatory/Conditional IE Missing
*****************************************/
Expand Down Expand Up @@ -191,11 +230,6 @@ void mme_s11_handle_create_session_response(
}
}

if (rsp->cause.presence == 0) {
ogs_error("No Cause");
cause_value = OGS_GTP2_CAUSE_MANDATORY_IE_MISSING;
}

if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
if (create_action == OGS_GTP_CREATE_IN_ATTACH_REQUEST) {
ogs_error("[%s] Attach reject", mme_ue->imsi_bcd);
Expand All @@ -206,9 +240,9 @@ void mme_s11_handle_create_session_response(
return;
}

/********************
* Check Cause Value
********************/
/*****************************
* Re-Examine Cause Value(s)
*****************************/
ogs_assert(cause_value == OGS_GTP2_CAUSE_REQUEST_ACCEPTED);

for (i = 0; i < OGS_BEARER_PER_UE; i++) {
Expand All @@ -231,25 +265,6 @@ void mme_s11_handle_create_session_response(
}
}

cause = rsp->cause.data;
ogs_assert(cause);
cause_value = cause->value;
if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED &&
cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED_PARTIALLY &&
cause_value !=
OGS_GTP2_CAUSE_NEW_PDN_TYPE_DUE_TO_NETWORK_PREFERENCE &&
cause_value !=
OGS_GTP2_CAUSE_NEW_PDN_TYPE_DUE_TO_SINGLE_ADDRESS_BEARER_ONLY) {
ogs_error("GTP Failed [CAUSE:%d]", cause_value);
if (create_action == OGS_GTP_CREATE_IN_ATTACH_REQUEST) {
ogs_error("[%s] Attach reject", mme_ue->imsi_bcd);
ogs_assert(OGS_OK == nas_eps_send_attach_reject(mme_ue,
EMM_CAUSE_NETWORK_FAILURE, ESM_CAUSE_NETWORK_FAILURE));
}
mme_send_delete_session_or_mme_ue_context_release(mme_ue);
return;
}

/********************
* Check ALL Context
********************/
Expand Down
28 changes: 19 additions & 9 deletions src/sgwc/s11-handler.c
Original file line number Diff line number Diff line change
Expand Up @@ -179,6 +179,25 @@ void sgwc_s11_handle_create_session_request(
return;
}

// sender TEID must be VERY FIRST THING we check/set so that any
// sent error-messages have the correct TEID for handling at mme
if (req->sender_f_teid_for_control_plane.presence == 0) {
ogs_error("No Sender F-TEID");
cause_value = OGS_GTP2_CAUSE_MANDATORY_IE_MISSING;
}

if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
ogs_gtp_send_error_message(
s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE, cause_value);
return;
}

/* Receive Control Plane(DL) : MME-S11 */
mme_s11_teid = req->sender_f_teid_for_control_plane.data;
ogs_assert(mme_s11_teid);
sgwc_ue->mme_s11_teid = be32toh(mme_s11_teid->teid);

/*****************************************
* Check Mandatory/Conditional IE Missing
*****************************************/
Expand All @@ -204,10 +223,6 @@ void sgwc_s11_handle_create_session_request(
ogs_error("No APN");
cause_value = OGS_GTP2_CAUSE_MANDATORY_IE_MISSING;
}
if (req->sender_f_teid_for_control_plane.presence == 0) {
ogs_error("No Sender F-TEID");
cause_value = OGS_GTP2_CAUSE_MANDATORY_IE_MISSING;
}
if (req->pgw_s5_s8_address_for_control_plane_or_pmip.presence == 0) {
ogs_error("No PGW IP");
cause_value = OGS_GTP2_CAUSE_CONDITIONAL_IE_MISSING;
Expand Down Expand Up @@ -361,11 +376,6 @@ void sgwc_s11_handle_create_session_request(
}
}

/* Receive Control Plane(DL) : MME-S11 */
mme_s11_teid = req->sender_f_teid_for_control_plane.data;
ogs_assert(mme_s11_teid);
sgwc_ue->mme_s11_teid = be32toh(mme_s11_teid->teid);

/* Receive Control Plane(UL) : PGW-S5C */
pgw_s5c_teid = req->pgw_s5_s8_address_for_control_plane_or_pmip.data;
ogs_assert(pgw_s5c_teid);
Expand Down
66 changes: 42 additions & 24 deletions src/sgwc/s5c-handler.c
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,38 @@ void sgwc_s5c_handle_create_session_response(
return;
}

/*********************
* Check Cause Value
*********************/
if (rsp->cause.presence == 0) {
ogs_error("No Cause");
cause_value = OGS_GTP2_CAUSE_MANDATORY_IE_MISSING;
ogs_gtp_send_error_message(
s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE, cause_value);
ogs_assert(OGS_OK == sgwc_pfcp_send_session_deletion_request(sess, NULL, NULL));
return;
}

cause = rsp->cause.data;
ogs_assert(cause);
cause_value = cause->value;
if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED &&
cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED_PARTIALLY &&
cause_value !=
OGS_GTP2_CAUSE_NEW_PDN_TYPE_DUE_TO_NETWORK_PREFERENCE &&
cause_value !=
OGS_GTP2_CAUSE_NEW_PDN_TYPE_DUE_TO_SINGLE_ADDRESS_BEARER_ONLY) {
ogs_error("GTP Failed [CAUSE:%d]", cause_value);
ogs_gtp_send_error_message(
s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE, cause_value);
ogs_assert(OGS_OK == sgwc_pfcp_send_session_deletion_request(sess, NULL, NULL));
return;
}

cause_value = OGS_GTP2_CAUSE_REQUEST_ACCEPTED;

/*****************************************
* Check Mandatory/Conditional IE Missing
*****************************************/
Expand All @@ -140,21 +172,17 @@ void sgwc_s5c_handle_create_session_response(
cause_value = OGS_GTP2_CAUSE_CONDITIONAL_IE_MISSING;
}

if (rsp->cause.presence == 0) {
ogs_error("No Cause");
cause_value = OGS_GTP2_CAUSE_CONDITIONAL_IE_MISSING;
}

if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
ogs_gtp_send_error_message(
s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE, cause_value);
ogs_assert(OGS_OK == sgwc_pfcp_send_session_deletion_request(sess, NULL, NULL));
return;
}

/********************
* Check Cause Value
********************/
/*****************************
* Re-Examine Cause Value(s)
*****************************/
ogs_assert(cause_value == OGS_GTP2_CAUSE_REQUEST_ACCEPTED);

for (i = 0; i < OGS_BEARER_PER_UE; i++) {
Expand All @@ -174,22 +202,6 @@ void sgwc_s5c_handle_create_session_response(
}
}

cause = rsp->cause.data;
ogs_assert(cause);
cause_value = cause->value;
if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED &&
cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED_PARTIALLY &&
cause_value !=
OGS_GTP2_CAUSE_NEW_PDN_TYPE_DUE_TO_NETWORK_PREFERENCE &&
cause_value !=
OGS_GTP2_CAUSE_NEW_PDN_TYPE_DUE_TO_SINGLE_ADDRESS_BEARER_ONLY) {
ogs_error("GTP Failed [CAUSE:%d]", cause_value);
ogs_gtp_send_error_message(
s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE, cause_value);
return;
}

/********************
* Check ALL Context
********************/
Expand Down Expand Up @@ -348,6 +360,12 @@ void sgwc_s5c_handle_delete_session_response(
ogs_gtp_send_error_message(
s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
OGS_GTP2_DELETE_SESSION_RESPONSE_TYPE, cause_value);

// If we got here there was some error downstream of us,
// either smf, pcrf, or upf. Forwarding error but we can
// still try to remove our PFCP session!
ogs_assert(OGS_OK ==
sgwc_pfcp_send_session_deletion_request(sess, NULL, NULL));
return;
}

Expand Down
26 changes: 15 additions & 11 deletions src/smf/s5c-handler.c
Original file line number Diff line number Diff line change
Expand Up @@ -97,13 +97,24 @@ uint8_t smf_s5c_handle_create_session_request(

cause_value = OGS_GTP2_CAUSE_REQUEST_ACCEPTED;

if (req->imsi.presence == 0) {
ogs_error("No IMSI");
cause_value = OGS_GTP2_CAUSE_CONDITIONAL_IE_MISSING;
}
// sender TEID must be VERY FIRST THING we check/set so that any
// sent error-messages have the correct TEID for handling at sgwc
if (req->sender_f_teid_for_control_plane.presence == 0) {
ogs_error("No TEID");
cause_value = OGS_GTP2_CAUSE_MANDATORY_IE_MISSING;
return cause_value;
}

/* Control Plane(DL) : SGW-S5C */
sgw_s5c_teid = req->sender_f_teid_for_control_plane.data;
ogs_assert(sgw_s5c_teid);
sess->sgw_s5c_teid = be32toh(sgw_s5c_teid->teid);
rv = ogs_gtp2_f_teid_to_ip(sgw_s5c_teid, &sess->sgw_s5c_ip);
ogs_assert(rv == OGS_OK);

if (req->imsi.presence == 0) {
ogs_error("No IMSI");
cause_value = OGS_GTP2_CAUSE_CONDITIONAL_IE_MISSING;
}
if (req->bearer_contexts_to_be_created[0].presence == 0) {
ogs_error("No Bearer");
Expand Down Expand Up @@ -257,13 +268,6 @@ uint8_t smf_s5c_handle_create_session_request(
sess->ipv4 ? OGS_INET_NTOP(&sess->ipv4->addr, buf1) : "",
sess->ipv6 ? OGS_INET6_NTOP(&sess->ipv6->addr, buf2) : "");

/* Control Plane(DL) : SGW-S5C */
sgw_s5c_teid = req->sender_f_teid_for_control_plane.data;
ogs_assert(sgw_s5c_teid);
sess->sgw_s5c_teid = be32toh(sgw_s5c_teid->teid);
rv = ogs_gtp2_f_teid_to_ip(sgw_s5c_teid, &sess->sgw_s5c_ip);
ogs_assert(rv == OGS_OK);

ogs_debug(" SGW_S5C_TEID[0x%x] SMF_N4_TEID[0x%x]",
sess->sgw_s5c_teid, sess->smf_n4_teid);

Expand Down

0 comments on commit 5094778

Please sign in to comment.