Skip to content

Commit 7b987e7

Browse files
committed
Added code to handle delete session procedure and added routing logic to send s11 messages to either spgw task or sgw_s8 task based on federated mode of configuration
Signed-off-by: rashmi <[email protected]>
1 parent d595cd1 commit 7b987e7

File tree

10 files changed

+376
-35
lines changed

10 files changed

+376
-35
lines changed

lte/gateway/c/oai/include/s8_messages_def.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,5 @@ limitations under the License.
1515
// instead.
1616
MESSAGE_DEF(
1717
S8_CREATE_SESSION_RSP, s8_create_session_response_t, s8_create_session_rsp)
18+
MESSAGE_DEF(
19+
S8_DELETE_SESSION_RSP, s8_delete_session_response_t, s8_delete_session_rsp)

lte/gateway/c/oai/include/s8_messages_types.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ limitations under the License.
1717
#include "common_types.h"
1818

1919
#define S8_CREATE_SESSION_RSP(mSGpTR) (mSGpTR)->ittiMsg.s8_create_session_rsp
20+
#define S8_DELETE_SESSION_RSP(mSGpTR) (mSGpTR)->ittiMsg.s8_delete_session_rsp
2021

2122
typedef struct s8_bearer_context_s {
2223
ebi_t eps_bearer_id;
@@ -33,8 +34,12 @@ typedef struct s8_create_session_response_s {
3334
teid_t context_teid; // SGW_S11_teid, created per PDN
3435
ebi_t eps_bearer_id;
3536
s8_bearer_context_t bearer_context[BEARERS_PER_UE];
36-
uint8_t response_cause;
3737
uint8_t apn_restriction_value;
3838
fteid_t pgw_s8_cp_teid;
3939
uint32_t cause;
4040
} s8_create_session_response_t;
41+
42+
typedef struct s8_delete_session_response_s {
43+
teid_t context_teid; // SGW_S11_teid, created per PDN
44+
uint32_t cause;
45+
} s8_delete_session_response_t;

lte/gateway/c/oai/lib/s8_proxy/s8_client_api.cpp

Lines changed: 49 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,10 +102,54 @@ static void get_paa_from_proto_msg(
102102
}
103103
OAILOG_FUNC_OUT(LOG_SGW_S8);
104104
}
105+
105106
static void recv_s8_delete_session_response(
106107
imsi64_t imsi64, teid_t context_teid, const grpc::Status& status,
107108
magma::feg::DeleteSessionResponsePgw& response) {
108109
OAILOG_FUNC_IN(LOG_SGW_S8);
110+
111+
s8_delete_session_response_t* s8_delete_session_rsp = NULL;
112+
MessageDef* message_p = NULL;
113+
message_p = itti_alloc_new_message(TASK_GRPC_SERVICE, S8_DELETE_SESSION_RSP);
114+
if (!message_p) {
115+
OAILOG_ERROR_UE(
116+
LOG_SGW_S8, imsi64,
117+
"Failed to allocate memory for S8_DELETE_SESSION_RSP for "
118+
"context_teid" TEID_FMT "\n",
119+
context_teid);
120+
OAILOG_FUNC_OUT(LOG_SGW_S8);
121+
}
122+
s8_delete_session_rsp = &message_p->ittiMsg.s8_delete_session_rsp;
123+
message_p->ittiMsgHeader.imsi = imsi64;
124+
s8_delete_session_rsp->context_teid = context_teid;
125+
126+
if (status.ok()) {
127+
if (response.has_gtp_error()) {
128+
s8_delete_session_rsp->cause = response.mutable_gtp_error()->cause();
129+
} else {
130+
s8_delete_session_rsp->cause = REQUEST_ACCEPTED;
131+
}
132+
} else {
133+
OAILOG_ERROR_UE(
134+
LOG_SGW_S8, imsi64,
135+
"Received gRPC error for delete session response for "
136+
"context_teid " TEID_FMT "\n",
137+
context_teid);
138+
s8_delete_session_rsp->cause = REMOTE_PEER_NOT_RESPONDING;
139+
}
140+
OAILOG_INFO_UE(
141+
LOG_UTIL, imsi64,
142+
"Sending delete session response to sgw_s8 task for "
143+
"context_teid " TEID_FMT "\n",
144+
context_teid);
145+
if ((send_msg_to_task(&grpc_service_task_zmq_ctx, TASK_SGW_S8, message_p)) !=
146+
RETURNok) {
147+
OAILOG_ERROR_UE(
148+
LOG_SGW_S8, imsi64,
149+
"Failed to send delete session response to sgw_s8 task for"
150+
"context_teid " TEID_FMT "\n",
151+
context_teid);
152+
}
109153
OAILOG_FUNC_OUT(LOG_SGW_S8);
110154
}
111155

@@ -391,15 +435,18 @@ void send_s8_delete_session_request(
391435
imsi64_t imsi64, Imsi_t imsi, teid_t sgw_s11_teid, teid_t pgw_s5_teid,
392436
ebi_t bearer_id) {
393437
OAILOG_FUNC_IN(LOG_SGW_S8);
394-
std::cout << "Sending delete session request for IMSI: " << imsi64
395-
<< "and context_teid: " << sgw_s11_teid << std::endl;
438+
OAILOG_INFO_UE(
439+
LOG_SGW_S8, imsi64,
440+
"Sending delete session request for context_teid:" TEID_FMT "\n",
441+
sgw_s11_teid);
396442

397443
magma::feg::DeleteSessionRequestPgw dsr_req;
398444

399445
dsr_req.Clear();
400446
dsr_req.set_imsi((char*) imsi.digit, imsi.length);
401447
dsr_req.set_bearer_id(bearer_id);
402448
dsr_req.mutable_c_pgw_fteid()->set_teid(pgw_s5_teid);
449+
dsr_req.set_c_agw_teid(sgw_s11_teid);
403450
magma::S8Client::s8_delete_session_request(
404451
dsr_req,
405452
[imsi64, sgw_s11_teid](

lte/gateway/c/oai/tasks/mme_app/mme_app_bearer.c

Lines changed: 35 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,9 @@
8484
extern task_zmq_ctx_t mme_app_task_zmq_ctx;
8585
extern int pdn_connectivity_delete(emm_context_t* emm_context, pdn_cid_t pid);
8686

87+
static void send_s11_modify_bearer_request(
88+
ue_mm_context_t* ue_context_p, MessageDef* message_p);
89+
8790
int send_modify_bearer_req(mme_ue_s1ap_id_t ue_id, ebi_t ebi) {
8891
OAILOG_FUNC_IN(LOG_MME_APP);
8992

@@ -187,11 +190,7 @@ int send_modify_bearer_req(mme_ue_s1ap_id_t ue_id, ebi_t ebi) {
187190

188191
message_p->ittiMsgHeader.imsi = ue_context_p->emm_context._imsi64;
189192

190-
OAILOG_INFO_UE(
191-
LOG_MME_APP, ue_context_p->emm_context._imsi64,
192-
"Sending S11_MODIFY_BEARER_REQUEST to SGW for ue" MME_UE_S1AP_ID_FMT "\n",
193-
ue_id);
194-
send_msg_to_task(&mme_app_task_zmq_ctx, TASK_SPGW, message_p);
193+
send_s11_modify_bearer_request(ue_context_p, message_p);
195194
OAILOG_FUNC_RETURN(LOG_MME_APP, RETURNok);
196195
}
197196

@@ -1527,7 +1526,8 @@ static int mme_app_send_modify_bearer_request_for_active_pdns(
15271526
mme_app_build_modify_bearer_request_message(
15281527
ue_context_p, initial_ctxt_setup_rsp_p, s11_modify_bearer_request, &pid,
15291528
&bc_to_be_removed_idx);
1530-
send_msg_to_task(&mme_app_task_zmq_ctx, TASK_SPGW, message_p);
1529+
1530+
send_s11_modify_bearer_request(ue_context_p, message_p);
15311531
} // end of for loop
15321532

15331533
OAILOG_FUNC_RETURN(LOG_MME_APP, RETURNok);
@@ -3431,11 +3431,7 @@ void mme_app_handle_path_switch_request(
34313431

34323432
message_p->ittiMsgHeader.imsi = ue_context_p->emm_context._imsi64;
34333433

3434-
OAILOG_DEBUG_UE(
3435-
LOG_MME_APP, ue_context_p->emm_context._imsi64,
3436-
"MME_APP send S11_MODIFY_BEARER_REQUEST to teid %u \n",
3437-
s11_modify_bearer_request->teid);
3438-
send_msg_to_task(&mme_app_task_zmq_ctx, TASK_SPGW, message_p);
3434+
send_s11_modify_bearer_request(ue_context_p, message_p);
34393435
ue_context_p->path_switch_req = true;
34403436

34413437
OAILOG_FUNC_OUT(LOG_MME_APP);
@@ -3942,11 +3938,7 @@ void mme_app_handle_e_rab_modification_ind(
39423938

39433939
message_p->ittiMsgHeader.imsi = ue_context_p->emm_context._imsi64;
39443940

3945-
OAILOG_DEBUG_UE(
3946-
LOG_MME_APP, ue_context_p->emm_context._imsi64,
3947-
"MME_APP send S11_MODIFY_BEARER_REQUEST to teid %u \n",
3948-
s11_modify_bearer_request->teid);
3949-
send_msg_to_task(&mme_app_task_zmq_ctx, TASK_SPGW, message_p);
3941+
send_s11_modify_bearer_request(ue_context_p, message_p);
39503942
OAILOG_FUNC_OUT(LOG_MME_APP);
39513943
}
39523944
//------------------------------------------------------------------------------
@@ -4086,3 +4078,30 @@ void mme_app_handle_modify_bearer_rsp(
40864078
}
40874079
OAILOG_FUNC_OUT(LOG_MME_APP);
40884080
}
4081+
4082+
void send_s11_modify_bearer_request(
4083+
ue_mm_context_t* ue_context_p, MessageDef* message_p) {
4084+
OAILOG_FUNC_IN(LOG_MME_APP);
4085+
Imsi_t imsi = {0};
4086+
IMSI64_TO_STRING(
4087+
ue_context_p->emm_context._imsi64, (char*) (&imsi.digit),
4088+
ue_context_p->emm_context._imsi.length);
4089+
4090+
if (mme_app_match_fed_mode_map(
4091+
imsi.digit, ue_context_p->emm_context._imsi64) == S8_SUBSCRIBER) {
4092+
OAILOG_INFO_UE(
4093+
LOG_MME_APP, ue_context_p->emm_context._imsi64,
4094+
"Sending S11 modify bearer req message to SGW_s8 task for "
4095+
"ue_id " MME_UE_S1AP_ID_FMT "\n",
4096+
ue_context_p->mme_ue_s1ap_id);
4097+
send_msg_to_task(&mme_app_task_zmq_ctx, TASK_SGW_S8, message_p);
4098+
} else {
4099+
OAILOG_INFO_UE(
4100+
LOG_MME_APP, ue_context_p->emm_context._imsi64,
4101+
"Sending S11 modify bearer req message to SPGW task for "
4102+
"ue_id " MME_UE_S1AP_ID_FMT "\n",
4103+
ue_context_p->mme_ue_s1ap_id);
4104+
send_msg_to_task(&mme_app_task_zmq_ctx, TASK_SPGW, message_p);
4105+
}
4106+
OAILOG_FUNC_OUT(LOG_MME_APP);
4107+
}

lte/gateway/c/oai/tasks/mme_app/mme_app_detach.c

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
#include <stdbool.h>
3333

3434
#include "log.h"
35+
#include "conversions.h"
3536
#include "intertask_interface.h"
3637
#include "gcc_diag.h"
3738
#include "mme_config.h"
@@ -115,10 +116,26 @@ void mme_app_send_delete_session_request(
115116

116117
message_p->ittiMsgHeader.imsi = ue_context_p->emm_context._imsi64;
117118

118-
send_msg_to_task(&mme_app_task_zmq_ctx, TASK_SPGW, message_p);
119-
OAILOG_INFO(
120-
LOG_MME_APP, "Send Delete session Req for teid " TEID_FMT "\n",
121-
ue_context_p->mme_teid_s11);
119+
Imsi_t imsi = {0};
120+
IMSI64_TO_STRING(
121+
ue_context_p->emm_context._imsi64, (char*) (&imsi.digit),
122+
ue_context_p->emm_context._imsi.length);
123+
124+
if (mme_app_match_fed_mode_map(
125+
imsi.digit, ue_context_p->emm_context._imsi64) == S8_SUBSCRIBER) {
126+
OAILOG_INFO_UE(
127+
LOG_MME_APP, ue_context_p->emm_context._imsi64,
128+
"Send delete session Req for teid to sgw_s8 task " TEID_FMT "\n",
129+
ue_context_p->mme_teid_s11);
130+
send_msg_to_task(&mme_app_task_zmq_ctx, TASK_SGW_S8, message_p);
131+
} else {
132+
OAILOG_INFO_UE(
133+
LOG_MME_APP, ue_context_p->emm_context._imsi64,
134+
"Send delete session Req for teid to spgw task " TEID_FMT "\n",
135+
ue_context_p->mme_teid_s11);
136+
send_msg_to_task(&mme_app_task_zmq_ctx, TASK_SPGW, message_p);
137+
}
138+
122139
increment_counter("mme_spgw_delete_session_req", 1, NO_LABELS);
123140
OAILOG_FUNC_OUT(LOG_MME_APP);
124141
}

lte/gateway/c/oai/tasks/mme_app/mme_app_itti_messaging.c

Lines changed: 54 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -374,19 +374,22 @@ int mme_app_send_s11_create_session_req(
374374
ue_mm_context->e_utran_cgi.plmn.mnc_digit3;
375375
session_request_p->selection_mode = MS_O_N_P_APN_S_V;
376376

377-
OAILOG_INFO_UE(
378-
LOG_MME_APP, ue_mm_context->emm_context._imsi64,
379-
"Sending S11 CREATE SESSION REQ message to SPGW for "
380-
"ue_id " MME_UE_S1AP_ID_FMT "\n",
381-
ue_mm_context->mme_ue_s1ap_id);
382-
if ((send_msg_to_task(&mme_app_task_zmq_ctx, TASK_SPGW, message_p)) !=
383-
RETURNok) {
384-
OAILOG_ERROR_UE(
377+
if (mme_app_match_fed_mode_map(
378+
session_request_p->imsi.digit, ue_mm_context->emm_context._imsi64) ==
379+
S8_SUBSCRIBER) {
380+
OAILOG_INFO_UE(
385381
LOG_MME_APP, ue_mm_context->emm_context._imsi64,
386-
"Failed to send S11 CREATE SESSION REQ message to SPGW for "
382+
"Sending s11 create session req message to SGW_s8 task for "
387383
"ue_id " MME_UE_S1AP_ID_FMT "\n",
388384
ue_mm_context->mme_ue_s1ap_id);
389-
OAILOG_FUNC_RETURN(LOG_MME_APP, RETURNerror);
385+
send_msg_to_task(&mme_app_task_zmq_ctx, TASK_SGW_S8, message_p);
386+
} else {
387+
OAILOG_INFO_UE(
388+
LOG_MME_APP, ue_mm_context->emm_context._imsi64,
389+
"Sending s11 create session req message to SPGW task for "
390+
"ue_id " MME_UE_S1AP_ID_FMT "\n",
391+
ue_mm_context->mme_ue_s1ap_id);
392+
send_msg_to_task(&mme_app_task_zmq_ctx, TASK_SPGW, message_p);
390393
}
391394
OAILOG_FUNC_RETURN(LOG_MME_APP, RETURNok);
392395
}
@@ -642,3 +645,44 @@ void mme_app_itti_sgsap_ue_activity_ind(
642645
}
643646
OAILOG_FUNC_OUT(LOG_MME_APP);
644647
}
648+
649+
// Extract MCC and MNC from the imsi received and match with
650+
// configuration
651+
int mme_app_match_fed_mode_map(const uint8_t* imsi, imsi64_t imsi64) {
652+
uint8_t mcc_d1 = imsi[0] - '0';
653+
uint8_t mcc_d2 = imsi[1] - '0';
654+
uint8_t mcc_d3 = imsi[2] - '0';
655+
uint8_t mnc_d1 = imsi[3] - '0';
656+
uint8_t mnc_d2 = imsi[4] - '0';
657+
uint8_t mnc_d3 = imsi[5] - '0';
658+
if ((mcc_d1 < 0 || mcc_d1 > 9) || (mcc_d2 < 0 || mcc_d2 > 9) ||
659+
(mcc_d3 < 0 || mcc_d3 > 9) || (mnc_d1 < 0 || mnc_d1 > 9) ||
660+
(mnc_d2 < 0 || mnc_d2 > 9) || (mnc_d3 < 0 || mnc_d3 > 9)) {
661+
OAILOG_ERROR_UE(
662+
LOG_MME_APP, imsi64, "[ERROR] MCC/MNC is not a decimal digit \n");
663+
OAILOG_FUNC_RETURN(LOG_MME_APP, RETURNerror);
664+
}
665+
for (uint8_t itr = 0; itr < mme_config.mode_map_config.num; itr++) {
666+
if (((mcc_d1 == mme_config.mode_map_config.mode_map[itr].plmn.mcc_digit1) &&
667+
(mcc_d2 == mme_config.mode_map_config.mode_map[itr].plmn.mcc_digit2) &&
668+
(mcc_d3 == mme_config.mode_map_config.mode_map[itr].plmn.mcc_digit3) &&
669+
(mnc_d1 == mme_config.mode_map_config.mode_map[itr].plmn.mnc_digit1) &&
670+
(mnc_d2 ==
671+
mme_config.mode_map_config.mode_map[itr].plmn.mnc_digit2))) {
672+
if (mme_config.mode_map_config.mode_map[itr].plmn.mnc_digit3 != 0xf) {
673+
if (mnc_d3 !=
674+
mme_config.mode_map_config.mode_map[itr].plmn.mnc_digit3) {
675+
continue;
676+
}
677+
}
678+
OAILOG_FUNC_RETURN(
679+
LOG_MME_APP, mme_config.mode_map_config.mode_map[itr].mode);
680+
}
681+
}
682+
// If the plmn is not configured set the default mode as hss + spgw_task.
683+
OAILOG_INFO_UE(
684+
LOG_MME_APP, imsi64,
685+
"PLMN is not configured. Selecting default mode: SPGW_SUBSCRIBER \n");
686+
OAILOG_FUNC_RETURN(LOG_MME_APP, SPGW_SUBSCRIBER);
687+
}
688+

lte/gateway/c/oai/tasks/mme_app/mme_app_itti_messaging.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,4 +132,5 @@ void mme_app_itti_sgsap_tmsi_reallocation_comp(
132132
void mme_app_itti_sgsap_ue_activity_ind(
133133
const char* imsi, const unsigned int imsi_len);
134134

135+
int mme_app_match_fed_mode_map(const uint8_t* imsi, imsi64_t imsi64);
135136
#endif /* FILE_MME_APP_ITTI_MESSAGING_SEEN */

0 commit comments

Comments
 (0)