From 433d5f6bf324c6319797de021d86b3bcd67d8be4 Mon Sep 17 00:00:00 2001 From: Sukchan Lee Date: Thu, 14 Apr 2022 17:34:55 +0900 Subject: [PATCH] Distinguish the type of session creation --- configs/open5gs/ausf.yaml.in | 3 -- configs/open5gs/bsf.yaml.in | 3 -- configs/open5gs/hss.yaml.in | 3 -- configs/open5gs/nrf.yaml.in | 3 -- configs/open5gs/nssf.yaml.in | 3 -- configs/open5gs/pcf.yaml.in | 3 -- configs/open5gs/pcrf.yaml.in | 3 -- configs/open5gs/sgwc.yaml.in | 3 -- configs/open5gs/sgwu.yaml.in | 3 -- configs/open5gs/smf.yaml.in | 3 -- configs/open5gs/udm.yaml.in | 3 -- configs/open5gs/udr.yaml.in | 3 -- lib/gtp/context.c | 4 ++ lib/gtp/xact.h | 5 ++- src/mme/esm-build.c | 12 ++--- src/mme/esm-build.h | 4 +- src/mme/esm-handler.c | 19 ++++---- src/mme/esm-handler.h | 2 +- src/mme/esm-sm.c | 8 ++-- src/mme/mme-context.c | 50 +++++++++++++-------- src/mme/mme-context.h | 15 ++++--- src/mme/mme-event.h | 2 +- src/mme/mme-gtp-path.c | 10 ++--- src/mme/mme-gtp-path.h | 2 +- src/mme/mme-s11-handler.c | 11 ++--- src/mme/mme-sm.c | 2 +- src/mme/nas-path.c | 21 +++++---- src/mme/nas-path.h | 5 ++- src/mme/s1ap-path.c | 7 +-- src/mme/s1ap-path.h | 2 +- src/sgwc/context.c | 19 ++------ src/sgwc/context.h | 9 ++-- src/sgwc/s11-handler.c | 85 +++++++++++++++++------------------- src/sgwc/s5c-handler.c | 8 ++-- src/sgwc/sxa-build.c | 4 -- src/smf/s5c-handler.c | 10 ++--- src/upf/n4-handler.c | 10 +++-- tests/app/app-init.c | 2 +- tests/handover/epc-s1-test.c | 10 ++--- tests/handover/epc-x2-test.c | 6 +-- 40 files changed, 184 insertions(+), 196 deletions(-) diff --git a/configs/open5gs/ausf.yaml.in b/configs/open5gs/ausf.yaml.in index 240fb7550..66e5c3689 100644 --- a/configs/open5gs/ausf.yaml.in +++ b/configs/open5gs/ausf.yaml.in @@ -138,9 +138,6 @@ nrf: # # parameter: # -# o Number of output streams per SCTP associations. -# sctp_streams: 30 -# # o Disable use of IPv4 addresses (only IPv6) # no_ipv4: true # diff --git a/configs/open5gs/bsf.yaml.in b/configs/open5gs/bsf.yaml.in index 33c4392b8..ca8260509 100644 --- a/configs/open5gs/bsf.yaml.in +++ b/configs/open5gs/bsf.yaml.in @@ -140,9 +140,6 @@ nrf: # # parameter: # -# o Number of output streams per SCTP associations. -# sctp_streams: 30 -# # o Disable use of IPv4 addresses (only IPv6) # no_ipv4: true # diff --git a/configs/open5gs/hss.yaml.in b/configs/open5gs/hss.yaml.in index 675556720..9c65227aa 100644 --- a/configs/open5gs/hss.yaml.in +++ b/configs/open5gs/hss.yaml.in @@ -31,9 +31,6 @@ hss: # # parameter: # -# o Number of output streams per SCTP associations. -# sctp_streams: 30 -# # o Disable use of IPv4 addresses (only IPv6) # no_ipv4: true # diff --git a/configs/open5gs/nrf.yaml.in b/configs/open5gs/nrf.yaml.in index cc7d62b53..dc3d5daf2 100644 --- a/configs/open5gs/nrf.yaml.in +++ b/configs/open5gs/nrf.yaml.in @@ -87,9 +87,6 @@ nrf: # # parameter: # -# o Number of output streams per SCTP associations. -# sctp_streams: 30 -# # o Disable use of IPv4 addresses (only IPv6) # no_ipv4: true # diff --git a/configs/open5gs/nssf.yaml.in b/configs/open5gs/nssf.yaml.in index 0ae44bb16..01c768d36 100644 --- a/configs/open5gs/nssf.yaml.in +++ b/configs/open5gs/nssf.yaml.in @@ -180,9 +180,6 @@ nrf: # # parameter: # -# o Number of output streams per SCTP associations. -# sctp_streams: 30 -# # o Disable use of IPv4 addresses (only IPv6) # no_ipv4: true # diff --git a/configs/open5gs/pcf.yaml.in b/configs/open5gs/pcf.yaml.in index 955578e91..006699ae0 100644 --- a/configs/open5gs/pcf.yaml.in +++ b/configs/open5gs/pcf.yaml.in @@ -140,9 +140,6 @@ nrf: # # parameter: # -# o Number of output streams per SCTP associations. -# sctp_streams: 30 -# # o Disable use of IPv4 addresses (only IPv6) # no_ipv4: true # diff --git a/configs/open5gs/pcrf.yaml.in b/configs/open5gs/pcrf.yaml.in index 9f3904d11..25da8a2ef 100644 --- a/configs/open5gs/pcrf.yaml.in +++ b/configs/open5gs/pcrf.yaml.in @@ -28,9 +28,6 @@ pcrf: # # parameter: # -# o Number of output streams per SCTP associations. -# sctp_streams: 30 -# # o Disable use of IPv4 addresses (only IPv6) # no_ipv4: true # diff --git a/configs/open5gs/sgwc.yaml.in b/configs/open5gs/sgwc.yaml.in index f38f7314c..9c7b00db6 100644 --- a/configs/open5gs/sgwc.yaml.in +++ b/configs/open5gs/sgwc.yaml.in @@ -125,9 +125,6 @@ sgwu: # # parameter: # -# o Number of output streams per SCTP associations. -# sctp_streams: 30 -# # o Disable use of IPv4 addresses (only IPv6) # no_ipv4: true # diff --git a/configs/open5gs/sgwu.yaml.in b/configs/open5gs/sgwu.yaml.in index 87194d737..d50000b00 100644 --- a/configs/open5gs/sgwu.yaml.in +++ b/configs/open5gs/sgwu.yaml.in @@ -117,9 +117,6 @@ sgwc: # # parameter: # -# o Number of output streams per SCTP associations. -# sctp_streams: 30 -# # o Disable use of IPv4 addresses (only IPv6) # no_ipv4: true # diff --git a/configs/open5gs/smf.yaml.in b/configs/open5gs/smf.yaml.in index 00c92f363..47f898a30 100644 --- a/configs/open5gs/smf.yaml.in +++ b/configs/open5gs/smf.yaml.in @@ -506,9 +506,6 @@ upf: # # parameter: # -# o Number of output streams per SCTP associations. -# sctp_streams: 30 -# # o Disable use of IPv4 addresses (only IPv6) # no_ipv4: true # diff --git a/configs/open5gs/udm.yaml.in b/configs/open5gs/udm.yaml.in index c4b8a6f6e..7fcae87d0 100644 --- a/configs/open5gs/udm.yaml.in +++ b/configs/open5gs/udm.yaml.in @@ -138,9 +138,6 @@ nrf: # # parameter: # -# o Number of output streams per SCTP associations. -# sctp_streams: 30 -# # o Disable use of IPv4 addresses (only IPv6) # no_ipv4: true # diff --git a/configs/open5gs/udr.yaml.in b/configs/open5gs/udr.yaml.in index d08c81a21..8b8d42d7a 100644 --- a/configs/open5gs/udr.yaml.in +++ b/configs/open5gs/udr.yaml.in @@ -140,9 +140,6 @@ nrf: # # parameter: # -# o Number of output streams per SCTP associations. -# sctp_streams: 30 -# # o Disable use of IPv4 addresses (only IPv6) # no_ipv4: true # diff --git a/lib/gtp/context.c b/lib/gtp/context.c index 10f3b7f69..f98f599af 100644 --- a/lib/gtp/context.c +++ b/lib/gtp/context.c @@ -169,6 +169,10 @@ int ogs_gtp_context_parse_config(const char *local, const char *remote) >pc_iter, &option); if (rv != OGS_OK) return rv; is_option = true; + } else if (!strcmp(gtpc_key, "tac")) { + /* Nothing */ + } else if (!strcmp(gtpc_key, "e_cell_id")) { + /* Nothing */ } else ogs_warn("unknown key `%s`", gtpc_key); } diff --git a/lib/gtp/xact.h b/lib/gtp/xact.h index 5973361a7..e9907aee9 100644 --- a/lib/gtp/xact.h +++ b/lib/gtp/xact.h @@ -111,7 +111,10 @@ typedef struct ogs_gtp_xact_s { #define OGS_GTP_DELETE_INDIRECT_HANDOVER_CANCEL 2 int delete_indirect_action; - bool esm_piggybacked; +#define OGS_GTP_CREATE_IN_ATTACH_REQUEST 1 +#define OGS_GTP_CREATE_IN_UPLINK_NAS_TRANSPORT 2 +#define OGS_GTP_CREATE_IN_PATH_SWITCH_REQUEST 3 + int create_action; } ogs_gtp_xact_t; int ogs_gtp_xact_init(void); diff --git a/src/mme/esm-build.c b/src/mme/esm-build.c index f03150fb6..d21c32599 100644 --- a/src/mme/esm-build.c +++ b/src/mme/esm-build.c @@ -25,7 +25,7 @@ #define OGS_LOG_DOMAIN __esm_log_domain ogs_pkbuf_t *esm_build_pdn_connectivity_reject( - mme_sess_t *sess, ogs_nas_esm_cause_t esm_cause, bool esm_piggybacked) + mme_sess_t *sess, ogs_nas_esm_cause_t esm_cause, int create_action) { mme_ue_t *mme_ue = NULL; ogs_nas_eps_message_t message; @@ -41,7 +41,7 @@ ogs_pkbuf_t *esm_build_pdn_connectivity_reject( mme_ue->imsi_bcd, sess->pti, esm_cause); memset(&message, 0, sizeof(message)); - if (esm_piggybacked == true) { + if (create_action == OGS_GTP_CREATE_IN_ATTACH_REQUEST) { /* Nothing */ } else { message.h.security_header_type = @@ -55,7 +55,7 @@ ogs_pkbuf_t *esm_build_pdn_connectivity_reject( pdn_connectivity_reject->esm_cause = esm_cause; - if (esm_piggybacked == true) + if (create_action == OGS_GTP_CREATE_IN_ATTACH_REQUEST) return ogs_nas_eps_plain_encode(&message); else return nas_eps_security_encode(mme_ue, &message); @@ -90,7 +90,7 @@ ogs_pkbuf_t *esm_build_information_request(mme_bearer_t *bearer) } ogs_pkbuf_t *esm_build_activate_default_bearer_context_request( - mme_sess_t *sess, bool esm_piggybacked) + mme_sess_t *sess, int create_action) { ogs_nas_eps_message_t message; ogs_nas_eps_activate_default_eps_bearer_context_request_t @@ -131,7 +131,7 @@ ogs_pkbuf_t *esm_build_activate_default_bearer_context_request( mme_ue->imsi_bcd, sess->pti, bearer->ebi); memset(&message, 0, sizeof(message)); - if (esm_piggybacked == true) { + if (create_action == OGS_GTP_CREATE_IN_ATTACH_REQUEST) { /* Nothing */ } else { message.h.security_header_type = @@ -245,7 +245,7 @@ ogs_pkbuf_t *esm_build_activate_default_bearer_context_request( } } - if (esm_piggybacked == true) + if (create_action == OGS_GTP_CREATE_IN_ATTACH_REQUEST) return ogs_nas_eps_plain_encode(&message); else return nas_eps_security_encode(mme_ue, &message); diff --git a/src/mme/esm-build.h b/src/mme/esm-build.h index 226058be2..9690b73e0 100644 --- a/src/mme/esm-build.h +++ b/src/mme/esm-build.h @@ -27,10 +27,10 @@ extern "C" { #endif ogs_pkbuf_t *esm_build_pdn_connectivity_reject( - mme_sess_t *sess, ogs_nas_esm_cause_t esm_cause, bool esm_piggybacked); + mme_sess_t *sess, ogs_nas_esm_cause_t esm_cause, int create_action); ogs_pkbuf_t *esm_build_information_request(mme_bearer_t *bearer); ogs_pkbuf_t *esm_build_activate_default_bearer_context_request( - mme_sess_t *sess, bool esm_piggybacked); + mme_sess_t *sess, int create_action); ogs_pkbuf_t *esm_build_activate_dedicated_bearer_context_request( mme_bearer_t *bearer); ogs_pkbuf_t *esm_build_modify_bearer_context_request( diff --git a/src/mme/esm-handler.c b/src/mme/esm-handler.c index 3b9ddf38f..d7dc642bd 100644 --- a/src/mme/esm-handler.c +++ b/src/mme/esm-handler.c @@ -29,7 +29,7 @@ #define OGS_LOG_DOMAIN __esm_log_domain int esm_handle_pdn_connectivity_request(mme_bearer_t *bearer, - ogs_nas_eps_pdn_connectivity_request_t *req, bool esm_piggybacked) + ogs_nas_eps_pdn_connectivity_request_t *req, int create_action) { mme_ue_t *mme_ue = NULL; mme_sess_t *sess = NULL; @@ -67,7 +67,7 @@ int esm_handle_pdn_connectivity_request(mme_bearer_t *bearer, /* Invalid APN */ ogs_assert(OGS_OK == nas_eps_send_pdn_connectivity_reject( - sess, ESM_CAUSE_MISSING_OR_UNKNOWN_APN, esm_piggybacked)); + sess, ESM_CAUSE_MISSING_OR_UNKNOWN_APN, create_action)); ogs_warn("Invalid APN[%s]", req->access_point_name.apn); return OGS_ERROR; } @@ -82,7 +82,7 @@ int esm_handle_pdn_connectivity_request(mme_bearer_t *bearer, sess->request_type.type, sess->session->session_type); ogs_assert(OGS_OK == nas_eps_send_pdn_connectivity_reject( - sess, ESM_CAUSE_UNKNOWN_PDN_TYPE, esm_piggybacked)); + sess, ESM_CAUSE_UNKNOWN_PDN_TYPE, create_action)); return OGS_ERROR; } } else { @@ -134,12 +134,12 @@ int esm_handle_pdn_connectivity_request(mme_bearer_t *bearer, } ogs_assert(OGS_OK == - mme_gtp_send_create_session_request(sess, esm_piggybacked)); + mme_gtp_send_create_session_request(sess, create_action)); } else { ogs_error("No APN"); ogs_assert(OGS_OK == nas_eps_send_pdn_connectivity_reject( - sess, ESM_CAUSE_MISSING_OR_UNKNOWN_APN, esm_piggybacked)); + sess, ESM_CAUSE_MISSING_OR_UNKNOWN_APN, create_action)); return OGS_ERROR; } @@ -185,7 +185,8 @@ int esm_handle_information_response(mme_sess_t *sess, sess->request_type.type, sess->session->session_type); ogs_assert(OGS_OK == nas_eps_send_pdn_connectivity_reject( - sess, ESM_CAUSE_UNKNOWN_PDN_TYPE, true)); + sess, ESM_CAUSE_UNKNOWN_PDN_TYPE, + OGS_GTP_CREATE_IN_ATTACH_REQUEST)); return OGS_ERROR; } } else { @@ -207,7 +208,8 @@ int esm_handle_information_response(mme_sess_t *sess, } } else { ogs_assert(OGS_OK == - mme_gtp_send_create_session_request(sess, true)); + mme_gtp_send_create_session_request( + sess, OGS_GTP_CREATE_IN_ATTACH_REQUEST)); } } else { if (rsp->access_point_name.length) @@ -217,7 +219,8 @@ int esm_handle_information_response(mme_sess_t *sess, ogs_assert(OGS_OK == nas_eps_send_pdn_connectivity_reject( - sess, ESM_CAUSE_MISSING_OR_UNKNOWN_APN, true)); + sess, ESM_CAUSE_MISSING_OR_UNKNOWN_APN, + OGS_GTP_CREATE_IN_ATTACH_REQUEST)); return OGS_ERROR; } diff --git a/src/mme/esm-handler.h b/src/mme/esm-handler.h index f872514ac..51caaa2b8 100644 --- a/src/mme/esm-handler.h +++ b/src/mme/esm-handler.h @@ -28,7 +28,7 @@ extern "C" { int esm_handle_pdn_connectivity_request(mme_bearer_t *bearer, ogs_nas_eps_pdn_connectivity_request_t *pdn_connectivity_request, - bool esm_piggybacked); + int create_action); int esm_handle_information_response(mme_sess_t *sess, ogs_nas_eps_esm_information_response_t *bearer_information_response); int esm_handle_bearer_resource_allocation_request( diff --git a/src/mme/esm-sm.c b/src/mme/esm-sm.c index 00376a0ec..abea64614 100644 --- a/src/mme/esm-sm.c +++ b/src/mme/esm-sm.c @@ -107,7 +107,7 @@ void esm_state_inactive(ogs_fsm_t *s, mme_event_t *e) mme_ue->imsi_bcd, sess->pti, bearer->ebi); rv = esm_handle_pdn_connectivity_request( bearer, &message->esm.pdn_connectivity_request, - e->esm_piggybacked); + e->create_action); if (rv != OGS_OK) { OGS_FSM_TRAN(s, esm_state_exception); break; @@ -230,7 +230,7 @@ void esm_state_inactive(ogs_fsm_t *s, mme_event_t *e) ogs_assert(OGS_OK == nas_eps_send_pdn_connectivity_reject(sess, ESM_CAUSE_ESM_INFORMATION_NOT_RECEIVED, - e->esm_piggybacked)); + e->create_action)); } else { rv = nas_eps_send_esm_information_request(bearer); if (rv == OGS_OK) { @@ -289,7 +289,7 @@ void esm_state_active(ogs_fsm_t *s, mme_event_t *e) mme_ue->imsi_bcd, sess->pti, bearer->ebi); rv = esm_handle_pdn_connectivity_request( bearer, &message->esm.pdn_connectivity_request, - e->esm_piggybacked); + e->create_action); if (rv != OGS_OK) { OGS_FSM_TRAN(s, esm_state_exception); break; @@ -397,7 +397,7 @@ void esm_state_pdn_will_disconnect(ogs_fsm_t *s, mme_event_t *e) mme_ue->imsi_bcd, sess->pti, bearer->ebi); rv = esm_handle_pdn_connectivity_request( bearer, &message->esm.pdn_connectivity_request, - e->esm_piggybacked); + e->create_action); if (rv != OGS_OK) { OGS_FSM_TRAN(s, esm_state_exception); break; diff --git a/src/mme/mme-context.c b/src/mme/mme-context.c index eacd1ac14..f4b1124a7 100644 --- a/src/mme/mme-context.c +++ b/src/mme/mme-context.c @@ -1552,8 +1552,10 @@ mme_sgw_t *mme_sgw_add(ogs_sockaddr_t *addr) ogs_assert(sgw); memset(sgw, 0, sizeof *sgw); - sgw->gnode = ogs_gtp_node_new(addr); - ogs_assert(sgw->gnode); + sgw->gnode.sa_list = addr; + + ogs_list_init(&sgw->gnode.local_list); + ogs_list_init(&sgw->gnode.remote_list); ogs_list_add(&self.sgw_list, sgw); @@ -1566,7 +1568,9 @@ void mme_sgw_remove(mme_sgw_t *sgw) ogs_list_remove(&self.sgw_list, sgw); - ogs_gtp_node_free(sgw->gnode); + ogs_gtp_xact_delete_all(&sgw->gnode); + ogs_freeaddrinfo(sgw->gnode.sa_list); + ogs_pool_free(&mme_sgw_pool, sgw); } @@ -1585,8 +1589,7 @@ mme_sgw_t *mme_sgw_find_by_addr(ogs_sockaddr_t *addr) ogs_assert(addr); ogs_list_for_each(&self.sgw_list, sgw) { - ogs_assert(sgw->gnode); - if (ogs_sockaddr_is_equal(&sgw->gnode->addr, addr) == true) + if (ogs_sockaddr_is_equal(&sgw->gnode.addr, addr) == true) break; } @@ -1603,8 +1606,7 @@ mme_pgw_t *mme_pgw_add(ogs_sockaddr_t *addr) ogs_assert(pgw); memset(pgw, 0, sizeof *pgw); - pgw->gnode = ogs_gtp_node_new(addr); - ogs_assert(pgw->gnode); + pgw->sa_list = addr; ogs_list_add(&self.pgw_list, pgw); @@ -1617,7 +1619,7 @@ void mme_pgw_remove(mme_pgw_t *pgw) ogs_list_remove(&self.pgw_list, pgw); - ogs_gtp_node_free(pgw->gnode); + ogs_freeaddrinfo(pgw->sa_list); ogs_pool_free(&mme_pgw_pool, pgw); } @@ -1636,8 +1638,8 @@ ogs_sockaddr_t *mme_pgw_addr_find_by_apn( ogs_assert(list); ogs_list_for_each(list, pgw) { - ogs_assert(pgw->gnode); - ogs_sockaddr_t *addr = pgw->gnode->sa_list; + ogs_assert(pgw->sa_list); + ogs_sockaddr_t *addr = pgw->sa_list; while (addr) { if (addr->ogs_sa_family == family && @@ -2109,6 +2111,20 @@ static mme_sgw_t *selected_sgw_node(mme_sgw_t *current, enb_ue_t *enb_ue) return next ? next : ogs_list_first(&mme_self()->sgw_list); } +mme_sgw_t *mme_changed_sgw_node(mme_sgw_t *current, enb_ue_t *enb_ue) +{ + mme_sgw_t *changed = NULL; + + ogs_assert(current); + ogs_assert(enb_ue); + + changed = selected_sgw_node(current, enb_ue); + if (changed && changed != current && + compare_ue_info(changed, enb_ue) == true) return changed; + + return NULL; +} + mme_ue_t *mme_ue_add(enb_ue_t *enb_ue) { mme_enb_t *enb = NULL; @@ -2140,10 +2156,10 @@ mme_ue_t *mme_ue_add(enb_ue_t *enb_ue) mme_self()->sgw = ogs_list_last(&mme_self()->sgw_list); /* setup GTP path with selected SGW */ - mme_self()->sgw = selected_sgw_node(mme_self()->sgw, enb_ue); - ogs_assert(mme_self()->sgw); - OGS_SETUP_GTP_NODE(mme_ue, mme_self()->sgw->gnode); - ogs_debug("UE using SGW on IP[%s]", OGS_ADDR(&mme_ue->gnode->addr, buf)); + mme_ue->sgw = mme_self()->sgw = selected_sgw_node(mme_self()->sgw, enb_ue); + ogs_assert(mme_ue->sgw); + ogs_assert(mme_ue->gnode); + ogs_debug("UE using SGW on IP[%s]", OGS_ADDR(mme_ue->gnode->sa_list, buf)); /* Clear VLR */ mme_ue->csmap = NULL; @@ -2890,7 +2906,7 @@ mme_bearer_t *mme_bearer_find_by_ue_ebi(mme_ue_t *mme_ue, uint8_t ebi) } mme_bearer_t *mme_bearer_find_or_add_by_message( - mme_ue_t *mme_ue, ogs_nas_eps_message_t *message, bool esm_piggybacked) + mme_ue_t *mme_ue, ogs_nas_eps_message_t *message, int create_action) { uint8_t pti = OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED; uint8_t ebi = OGS_NAS_EPS_BEARER_IDENTITY_UNASSIGNED; @@ -3001,12 +3017,12 @@ mme_bearer_t *mme_bearer_find_or_add_by_message( OGS_NAS_EPS_PDN_CONNECTIVITY_REQUEST_ACCESS_POINT_NAME_PRESENT) { sess = mme_sess_find_by_apn(mme_ue, pdn_connectivity_request->access_point_name.apn); - if (sess && esm_piggybacked == false) { + if (sess && create_action != OGS_GTP_CREATE_IN_ATTACH_REQUEST) { ogs_assert(OGS_OK == nas_eps_send_pdn_connectivity_reject( sess, ESM_CAUSE_MULTIPLE_PDN_CONNECTIONS_FOR_A_GIVEN_APN_NOT_ALLOWED, - esm_piggybacked)); + create_action)); ogs_warn("APN duplicated [%s]", pdn_connectivity_request->access_point_name.apn); return NULL; diff --git a/src/mme/mme-context.h b/src/mme/mme-context.h index 361139860..f94788d83 100644 --- a/src/mme/mme-context.h +++ b/src/mme/mme-context.h @@ -147,20 +147,18 @@ typedef struct mme_context_s { } mme_context_t; typedef struct mme_sgw_s { - ogs_lnode_t lnode; + ogs_gtp_node_t gnode; uint16_t tac[OGS_MAX_NUM_OF_TAI]; uint8_t num_of_tac; uint32_t e_cell_id[OGS_MAX_NUM_OF_CELL_ID]; uint8_t num_of_e_cell_id; - - ogs_gtp_node_t *gnode; } mme_sgw_t; typedef struct mme_pgw_s { ogs_lnode_t lnode; - ogs_gtp_node_t *gnode; + ogs_sockaddr_t *sa_list; const char *apn; } mme_pgw_t; @@ -517,7 +515,10 @@ struct mme_ue_s { */ int session_context_will_deleted; - ogs_gtp_node_t *gnode; + union { + mme_sgw_t *sgw; + ogs_gtp_node_t *gnode; + }; mme_csmap_t *csmap; }; @@ -796,7 +797,7 @@ void mme_bearer_remove_all(mme_sess_t *sess); mme_bearer_t *mme_bearer_find_by_sess_ebi(mme_sess_t *sess, uint8_t ebi); mme_bearer_t *mme_bearer_find_by_ue_ebi(mme_ue_t *mme_ue, uint8_t ebi); mme_bearer_t *mme_bearer_find_or_add_by_message( - mme_ue_t *mme_ue, ogs_nas_eps_message_t *message, bool esm_piggybacked); + mme_ue_t *mme_ue, ogs_nas_eps_message_t *message, int create_action); mme_bearer_t *mme_default_bearer_in_sess(mme_sess_t *sess); mme_bearer_t *mme_linked_bearer(mme_bearer_t *bearer); mme_bearer_t *mme_bearer_first(mme_sess_t *sess); @@ -820,6 +821,8 @@ void mme_ebi_pool_clear(mme_ue_t *mme_ue); uint8_t mme_selected_int_algorithm(mme_ue_t *mme_ue); uint8_t mme_selected_enc_algorithm(mme_ue_t *mme_ue); +mme_sgw_t *mme_changed_sgw_node(mme_sgw_t *current, enb_ue_t *enb_ue); + #ifdef __cplusplus } #endif diff --git a/src/mme/mme-event.h b/src/mme/mme-event.h index 36432c210..8654e01a8 100644 --- a/src/mme/mme-event.h +++ b/src/mme/mme-event.h @@ -83,7 +83,7 @@ typedef struct mme_event_s { ogs_gtp_node_t *gnode; uint8_t nas_type; - bool esm_piggybacked; + int create_action; ogs_nas_eps_message_t *nas_message; ogs_diam_s6a_message_t *s6a_message; diff --git a/src/mme/mme-gtp-path.c b/src/mme/mme-gtp-path.c index c4a9a5919..1552d222a 100644 --- a/src/mme/mme-gtp-path.c +++ b/src/mme/mme-gtp-path.c @@ -59,11 +59,11 @@ static void _gtpv2_c_recv_cb(short when, ogs_socket_t fd, void *data) ogs_pkbuf_free(pkbuf); return; } - ogs_assert(sgw->gnode); + ogs_assert(sgw); e = mme_event_new(MME_EVT_S11_MESSAGE); ogs_assert(e); - e->gnode = sgw->gnode; + e->gnode = (ogs_gtp_node_t *)sgw; e->pkbuf = pkbuf; rv = ogs_queue_push(ogs_app()->queue, e); @@ -186,7 +186,7 @@ int mme_gtp_open(void) ogs_list_for_each(&mme_self()->sgw_list, sgw) { rv = ogs_gtp_connect( ogs_gtp_self()->gtpc_sock, ogs_gtp_self()->gtpc_sock6, - sgw->gnode); + (ogs_gtp_node_t *)sgw); ogs_assert(rv == OGS_OK); } @@ -199,7 +199,7 @@ void mme_gtp_close(void) ogs_socknode_remove_all(&ogs_gtp_self()->gtpc_list6); } -int mme_gtp_send_create_session_request(mme_sess_t *sess, bool esm_piggybacked) +int mme_gtp_send_create_session_request(mme_sess_t *sess, int create_action) { int rv; ogs_gtp2_header_t h; @@ -219,7 +219,7 @@ int mme_gtp_send_create_session_request(mme_sess_t *sess, bool esm_piggybacked) xact = ogs_gtp_xact_local_create(mme_ue->gnode, &h, pkbuf, timeout, sess); ogs_expect_or_return_val(xact, OGS_ERROR); - xact->esm_piggybacked = esm_piggybacked; + xact->create_action = create_action; rv = ogs_gtp_xact_commit(xact); ogs_expect(rv == OGS_OK); diff --git a/src/mme/mme-gtp-path.h b/src/mme/mme-gtp-path.h index e4bd3a0dc..629c4e1eb 100644 --- a/src/mme/mme-gtp-path.h +++ b/src/mme/mme-gtp-path.h @@ -29,7 +29,7 @@ extern "C" { int mme_gtp_open(void); void mme_gtp_close(void); -int mme_gtp_send_create_session_request(mme_sess_t *sess, bool esm_piggybacked); +int mme_gtp_send_create_session_request(mme_sess_t *sess, int create_action); int mme_gtp_send_modify_bearer_request(mme_bearer_t *bearer, int uli_presence); int mme_gtp_send_delete_session_request(mme_sess_t *sess, int action); void mme_gtp_send_delete_all_sessions(mme_ue_t *mme_ue, int action); diff --git a/src/mme/mme-s11-handler.c b/src/mme/mme-s11-handler.c index 2b7f88e1d..c84022eaa 100644 --- a/src/mme/mme-s11-handler.c +++ b/src/mme/mme-s11-handler.c @@ -92,10 +92,10 @@ void mme_s11_handle_create_session_response( ogs_gtp2_bearer_qos_t bearer_qos; ogs_gtp2_ambr_t *ambr = NULL; uint16_t decoded = 0; - bool esm_piggybacked = false; + int create_action = 0; ogs_assert(xact); - esm_piggybacked = xact->esm_piggybacked; + create_action = xact->create_action; ogs_assert(rsp); ogs_debug("Create Session Response"); @@ -193,7 +193,7 @@ void mme_s11_handle_create_session_response( cause_value != OGS_GTP2_CAUSE_NEW_PDN_TYPE_DUE_TO_SINGLE_ADDRESS_BEARER_ONLY) { if (mme_ue_from_teid && mme_ue) { - if (esm_piggybacked == true) { + 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, @@ -256,7 +256,7 @@ void mme_s11_handle_create_session_response( rv = ogs_gtp2_f_teid_to_ip(sgw_s1u_teid, &bearer->sgw_s1u_ip); ogs_assert(rv == OGS_OK); - if (esm_piggybacked == true) { + if (create_action == OGS_GTP_CREATE_IN_ATTACH_REQUEST) { mme_csmap_t *csmap = mme_csmap_find_by_tai(&mme_ue->tai); mme_ue->csmap = csmap; @@ -275,7 +275,8 @@ void mme_s11_handle_create_session_response( } else { ogs_assert(OGS_PDU_SESSION_TYPE_IS_VALID(session->paa.session_type)); ogs_assert(OGS_OK == - nas_eps_send_activate_default_bearer_context_request(bearer)); + nas_eps_send_activate_default_bearer_context_request( + bearer, create_action)); } } diff --git a/src/mme/mme-sm.c b/src/mme/mme-sm.c index c7f33df3b..224211510 100644 --- a/src/mme/mme-sm.c +++ b/src/mme/mme-sm.c @@ -375,7 +375,7 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e) } bearer = mme_bearer_find_or_add_by_message( - mme_ue, &nas_message, e->esm_piggybacked); + mme_ue, &nas_message, e->create_action); if (!bearer) { ogs_pkbuf_free(pkbuf); break; diff --git a/src/mme/nas-path.c b/src/mme/nas-path.c index 1aead1f35..67b616b64 100644 --- a/src/mme/nas-path.c +++ b/src/mme/nas-path.c @@ -56,7 +56,7 @@ int nas_eps_send_emm_to_esm(mme_ue_t *mme_ue, ogs_pkbuf_put_data(esmbuf, esm_message_container->buffer, esm_message_container->length); - rv = s1ap_send_to_esm(mme_ue, esmbuf, 0, true); + rv = s1ap_send_to_esm(mme_ue, esmbuf, 0, OGS_GTP_CREATE_IN_ATTACH_REQUEST); ogs_expect(rv == OGS_OK); return rv; @@ -105,7 +105,8 @@ int nas_eps_send_attach_accept(mme_ue_t *mme_ue) ogs_debug("[%s] Attach accept", mme_ue->imsi_bcd); - esmbuf = esm_build_activate_default_bearer_context_request(sess, true); + esmbuf = esm_build_activate_default_bearer_context_request( + sess, OGS_GTP_CREATE_IN_ATTACH_REQUEST); ogs_expect_or_return_val(esmbuf, OGS_ERROR); emmbuf = emm_build_attach_accept(mme_ue, esmbuf); @@ -140,7 +141,8 @@ int nas_eps_send_attach_reject(mme_ue_t *mme_ue, sess = mme_sess_first(mme_ue); if (sess) { - esmbuf = esm_build_pdn_connectivity_reject(sess, esm_cause, true); + esmbuf = esm_build_pdn_connectivity_reject( + sess, esm_cause, OGS_GTP_CREATE_IN_ATTACH_REQUEST); ogs_expect_or_return_val(esmbuf, OGS_ERROR); } @@ -285,7 +287,7 @@ int nas_eps_send_detach_accept(mme_ue_t *mme_ue) } int nas_eps_send_pdn_connectivity_reject( - mme_sess_t *sess, ogs_nas_esm_cause_t esm_cause, bool esm_piggybacked) + mme_sess_t *sess, ogs_nas_esm_cause_t esm_cause, int create_action) { int rv; mme_ue_t *mme_ue; @@ -295,14 +297,15 @@ int nas_eps_send_pdn_connectivity_reject( mme_ue = sess->mme_ue; ogs_assert(mme_ue); - if (esm_piggybacked == true) { + if (create_action == OGS_GTP_CREATE_IN_ATTACH_REQUEST) { /* During the UE-attach process, we'll send Attach-Reject * with pyggybacking PDN-connectivity-Reject */ rv = nas_eps_send_attach_reject(mme_ue, EMM_CAUSE_EPS_SERVICES_AND_NON_EPS_SERVICES_NOT_ALLOWED, esm_cause); ogs_expect(rv == OGS_OK); } else { - esmbuf = esm_build_pdn_connectivity_reject(sess, esm_cause, false); + esmbuf = esm_build_pdn_connectivity_reject( + sess, esm_cause, create_action); ogs_expect_or_return_val(esmbuf, OGS_ERROR); rv = nas_eps_send_to_downlink_nas_transport(mme_ue, esmbuf); @@ -341,7 +344,8 @@ int nas_eps_send_esm_information_request(mme_bearer_t *bearer) return rv; } -int nas_eps_send_activate_default_bearer_context_request(mme_bearer_t *bearer) +int nas_eps_send_activate_default_bearer_context_request( + mme_bearer_t *bearer, int create_action) { int rv; ogs_pkbuf_t *s1apbuf = NULL; @@ -355,7 +359,8 @@ int nas_eps_send_activate_default_bearer_context_request(mme_bearer_t *bearer) mme_ue = bearer->mme_ue; ogs_assert(mme_ue); - esmbuf = esm_build_activate_default_bearer_context_request(sess, false); + esmbuf = esm_build_activate_default_bearer_context_request( + sess, create_action); ogs_expect_or_return_val(esmbuf, OGS_ERROR); s1apbuf = s1ap_build_e_rab_setup_request(bearer, esmbuf); diff --git a/src/mme/nas-path.h b/src/mme/nas-path.h index 294f37e14..374872aa9 100644 --- a/src/mme/nas-path.h +++ b/src/mme/nas-path.h @@ -46,9 +46,10 @@ int nas_eps_send_security_mode_command(mme_ue_t *mme_ue); int nas_eps_send_detach_accept(mme_ue_t *mme_ue); int nas_eps_send_pdn_connectivity_reject( - mme_sess_t *sess, ogs_nas_esm_cause_t esm_cause, bool esm_piggybacked); + mme_sess_t *sess, ogs_nas_esm_cause_t esm_cause, int create_action); int nas_eps_send_esm_information_request(mme_bearer_t *bearer); -int nas_eps_send_activate_default_bearer_context_request(mme_bearer_t *bearer); +int nas_eps_send_activate_default_bearer_context_request( + mme_bearer_t *bearer, int create_action); int nas_eps_send_activate_dedicated_bearer_context_request( mme_bearer_t *bearer); void nas_eps_send_activate_all_dedicated_bearers(mme_bearer_t *default_bearer); diff --git a/src/mme/s1ap-path.c b/src/mme/s1ap-path.c index 73d164910..d6e1fd1ac 100644 --- a/src/mme/s1ap-path.c +++ b/src/mme/s1ap-path.c @@ -117,7 +117,7 @@ int s1ap_delayed_send_to_enb_ue( int s1ap_send_to_esm( mme_ue_t *mme_ue, ogs_pkbuf_t *esmbuf, - uint8_t nas_type, bool esm_piggybacked) + uint8_t nas_type, int create_action) { int rv; mme_event_t *e = NULL; @@ -130,7 +130,7 @@ int s1ap_send_to_esm( e->mme_ue = mme_ue; e->pkbuf = esmbuf; e->nas_type = nas_type; - e->esm_piggybacked = esm_piggybacked; + e->create_action = create_action; rv = ogs_queue_push(ogs_app()->queue, e); if (rv != OGS_OK) { ogs_warn("ogs_queue_push() failed:%d", (int)rv); @@ -235,7 +235,8 @@ int s1ap_send_to_nas(enb_ue_t *enb_ue, return OGS_ERROR; } return s1ap_send_to_esm( - mme_ue, nasbuf, security_header_type.type, false); + mme_ue, nasbuf, security_header_type.type, + OGS_GTP_CREATE_IN_UPLINK_NAS_TRANSPORT); } else { ogs_error("Unknown/Unimplemented NAS Protocol discriminator 0x%02x", h->protocol_discriminator); diff --git a/src/mme/s1ap-path.h b/src/mme/s1ap-path.h index 17c902229..7ec2f5210 100644 --- a/src/mme/s1ap-path.h +++ b/src/mme/s1ap-path.h @@ -46,7 +46,7 @@ int s1ap_send_to_nas(enb_ue_t *enb_ue, S1AP_ProcedureCode_t procedureCode, S1AP_NAS_PDU_t *nasPdu); int s1ap_send_to_esm( mme_ue_t *mme_ue, ogs_pkbuf_t *esmbuf, - uint8_t nas_type, bool esm_piggybacked); + uint8_t nas_type, int create_action); int s1ap_send_s1_setup_response(mme_enb_t *enb); int s1ap_send_s1_setup_failure( diff --git a/src/sgwc/context.c b/src/sgwc/context.c index 267c20edb..2f77c45b0 100644 --- a/src/sgwc/context.c +++ b/src/sgwc/context.c @@ -317,10 +317,12 @@ static bool compare_ue_info(ogs_pfcp_node_t *node, sgwc_sess_t *sess) if (ogs_strcasecmp(node->dnn[i], sess->session.name) == 0) return true; for (i = 0; i < node->num_of_e_cell_id; i++) - if (node->e_cell_id[i] == sgwc_ue->e_cgi.cell_id) return true; + if (sgwc_ue->uli_presence == true && + node->e_cell_id[i] == sgwc_ue->e_cgi.cell_id) return true; for (i = 0; i < node->num_of_tac; i++) - if (node->tac[i] == sgwc_ue->e_tai.tac) return true; + if (sgwc_ue->uli_presence == true && + node->tac[i] == sgwc_ue->e_tai.tac) return true; return false; } @@ -681,19 +683,6 @@ sgwc_tunnel_t *sgwc_tunnel_add( ogs_assert(pdr->apn); } - pdr->outer_header_removal_len = 1; - if (sess->session.session_type == OGS_PDU_SESSION_TYPE_IPV4) { - pdr->outer_header_removal.description = - OGS_PFCP_OUTER_HEADER_REMOVAL_GTPU_UDP_IPV4; - } else if (sess->session.session_type == OGS_PDU_SESSION_TYPE_IPV6) { - pdr->outer_header_removal.description = - OGS_PFCP_OUTER_HEADER_REMOVAL_GTPU_UDP_IPV6; - } else if (sess->session.session_type == OGS_PDU_SESSION_TYPE_IPV4V6) { - pdr->outer_header_removal.description = - OGS_PFCP_OUTER_HEADER_REMOVAL_GTPU_UDP_IP; - } else - ogs_assert_if_reached(); - far = ogs_pfcp_far_add(&sess->pfcp); ogs_assert(far); diff --git a/src/sgwc/context.h b/src/sgwc/context.h index 2c6b0174a..d621268eb 100644 --- a/src/sgwc/context.h +++ b/src/sgwc/context.h @@ -59,6 +59,7 @@ typedef struct sgwc_ue_s { char imsi_bcd[OGS_MAX_IMSI_BCD_LEN+1]; /* User-Location-Info */ + bool uli_presence; ogs_eps_tai_t e_tai; ogs_e_cgi_t e_cgi; @@ -88,13 +89,13 @@ typedef struct sgwc_sess_s { * it is used to check if all sessions are deactivated. */ struct { - bool release_access_bearers; - bool create_indirect_tunnel; - bool delete_indirect_tunnel; + bool release_access_bearers; + bool create_indirect_tunnel; + bool delete_indirect_tunnel; } state; /* APN Configuration */ - ogs_session_t session; + ogs_session_t session; ogs_list_t bearer_list; diff --git a/src/sgwc/s11-handler.c b/src/sgwc/s11-handler.c index 050f294ec..1f8ce72b0 100644 --- a/src/sgwc/s11-handler.c +++ b/src/sgwc/s11-handler.c @@ -141,7 +141,7 @@ void sgwc_s11_handle_create_session_request( if (req->imsi.presence == 0) { ogs_error("No IMSI"); - cause_value = OGS_GTP2_CAUSE_MANDATORY_IE_MISSING; + cause_value = OGS_GTP2_CAUSE_CONDITIONAL_IE_MISSING; } if (req->bearer_contexts_to_be_created.presence == 0) { ogs_error("No Bearer"); @@ -165,15 +165,7 @@ void sgwc_s11_handle_create_session_request( } if (req->pgw_s5_s8_address_for_control_plane_or_pmip.presence == 0) { ogs_error("No PGW IP"); - cause_value = OGS_GTP2_CAUSE_MANDATORY_IE_MISSING; - } - if (req->user_location_information.presence == 0) { - ogs_error("No User Location Inforamtion"); - cause_value = OGS_GTP2_CAUSE_MANDATORY_IE_MISSING; - } - if (req->pdn_type.presence == 0) { - ogs_error("No PDN Type"); - cause_value = OGS_GTP2_CAUSE_MANDATORY_IE_MISSING; + cause_value = OGS_GTP2_CAUSE_CONDITIONAL_IE_MISSING; } if (!sgwc_ue) { @@ -203,19 +195,24 @@ void sgwc_s11_handle_create_session_request( ogs_assert(sess); /* Set User Location Information */ - decoded = ogs_gtp2_parse_uli(&uli, &req->user_location_information); - ogs_assert(req->user_location_information.len == decoded); - ogs_nas_to_plmn_id(&sgwc_ue->e_tai.plmn_id, &uli.tai.nas_plmn_id); - sgwc_ue->e_tai.tac = uli.tai.tac; - ogs_nas_to_plmn_id(&sgwc_ue->e_cgi.plmn_id, &uli.e_cgi.nas_plmn_id); - sgwc_ue->e_cgi.cell_id = uli.e_cgi.cell_id; + if (req->user_location_information.presence == 1) { + decoded = ogs_gtp2_parse_uli(&uli, &req->user_location_information); + ogs_assert(req->user_location_information.len == decoded); - ogs_debug(" TAI[PLMN_ID:%06x,TAC:%d]", - ogs_plmn_id_hexdump(&sgwc_ue->e_tai.plmn_id), - sgwc_ue->e_tai.tac); - ogs_debug(" E_CGI[PLMN_ID:%06x,CELL_ID:0x%x]", - ogs_plmn_id_hexdump(&sgwc_ue->e_cgi.plmn_id), - sgwc_ue->e_cgi.cell_id); + sgwc_ue->uli_presence = true; + + ogs_nas_to_plmn_id(&sgwc_ue->e_tai.plmn_id, &uli.tai.nas_plmn_id); + sgwc_ue->e_tai.tac = uli.tai.tac; + ogs_nas_to_plmn_id(&sgwc_ue->e_cgi.plmn_id, &uli.e_cgi.nas_plmn_id); + sgwc_ue->e_cgi.cell_id = uli.e_cgi.cell_id; + + ogs_debug(" TAI[PLMN_ID:%06x,TAC:%d]", + ogs_plmn_id_hexdump(&sgwc_ue->e_tai.plmn_id), + sgwc_ue->e_tai.tac); + ogs_debug(" E_CGI[PLMN_ID:%06x,CELL_ID:0x%x]", + ogs_plmn_id_hexdump(&sgwc_ue->e_cgi.plmn_id), + sgwc_ue->e_cgi.cell_id); + } /* Select SGW-U based on UE Location Information */ sgwc_sess_select_sgwu(sess); @@ -242,10 +239,6 @@ void sgwc_s11_handle_create_session_request( sess->session.qos.arp.pre_emption_vulnerability = bearer_qos.pre_emption_vulnerability; - /* Set PDN Type */ - sess->session.session_type = req->pdn_type.u8; - sess->session.paa.session_type = req->pdn_type.u8; - /* Remove all previous bearer */ sgwc_bearer_remove_all(sess); @@ -358,13 +351,16 @@ void sgwc_s11_handle_modify_bearer_request( } if (req->user_location_information.presence == 1) { - decoded = ogs_gtp2_parse_uli( - &uli, &req->user_location_information); + decoded = ogs_gtp2_parse_uli(&uli, &req->user_location_information); ogs_assert(req->user_location_information.len == decoded); + + sgwc_ue->uli_presence = true; + ogs_nas_to_plmn_id(&sgwc_ue->e_tai.plmn_id, &uli.tai.nas_plmn_id); sgwc_ue->e_tai.tac = uli.tai.tac; ogs_nas_to_plmn_id(&sgwc_ue->e_cgi.plmn_id, &uli.e_cgi.nas_plmn_id); sgwc_ue->e_cgi.cell_id = uli.e_cgi.cell_id; + ogs_debug(" TAI[PLMN_ID:%06x,TAC:%d]", ogs_plmn_id_hexdump(&sgwc_ue->e_tai.plmn_id), sgwc_ue->e_tai.tac); @@ -539,10 +535,6 @@ void sgwc_s11_handle_create_bearer_response( ogs_error("No SGW TEID"); cause_value = OGS_GTP2_CAUSE_MANDATORY_IE_MISSING; } - if (rsp->user_location_information.presence == 0) { - ogs_error("No User Location Inforamtion"); - cause_value = OGS_GTP2_CAUSE_MANDATORY_IE_MISSING; - } if (s11_xact->xid & OGS_GTP_CMD_XACT_ID) /* MME received Bearer Resource Modification Request */ @@ -634,19 +626,24 @@ void sgwc_s11_handle_create_bearer_response( &far->outer_header_creation, &far->outer_header_creation_len)); far->outer_header_creation.teid = dl_tunnel->remote_teid; - decoded = ogs_gtp2_parse_uli(&uli, &rsp->user_location_information); - ogs_assert(rsp->user_location_information.len == decoded); - ogs_nas_to_plmn_id(&sgwc_ue->e_tai.plmn_id, &uli.tai.nas_plmn_id); - sgwc_ue->e_tai.tac = uli.tai.tac; - ogs_nas_to_plmn_id(&sgwc_ue->e_cgi.plmn_id, &uli.e_cgi.nas_plmn_id); - sgwc_ue->e_cgi.cell_id = uli.e_cgi.cell_id; + if (rsp->user_location_information.presence == 1) { + decoded = ogs_gtp2_parse_uli(&uli, &rsp->user_location_information); + ogs_assert(rsp->user_location_information.len == decoded); - ogs_debug(" TAI[PLMN_ID:%06x,TAC:%d]", - ogs_plmn_id_hexdump(&sgwc_ue->e_tai.plmn_id), - sgwc_ue->e_tai.tac); - ogs_debug(" E_CGI[PLMN_ID:%06x,CELL_ID:0x%x]", - ogs_plmn_id_hexdump(&sgwc_ue->e_cgi.plmn_id), - sgwc_ue->e_cgi.cell_id); + sgwc_ue->uli_presence = true; + + ogs_nas_to_plmn_id(&sgwc_ue->e_tai.plmn_id, &uli.tai.nas_plmn_id); + sgwc_ue->e_tai.tac = uli.tai.tac; + ogs_nas_to_plmn_id(&sgwc_ue->e_cgi.plmn_id, &uli.e_cgi.nas_plmn_id); + sgwc_ue->e_cgi.cell_id = uli.e_cgi.cell_id; + + ogs_debug(" TAI[PLMN_ID:%06x,TAC:%d]", + ogs_plmn_id_hexdump(&sgwc_ue->e_tai.plmn_id), + sgwc_ue->e_tai.tac); + ogs_debug(" E_CGI[PLMN_ID:%06x,CELL_ID:0x%x]", + ogs_plmn_id_hexdump(&sgwc_ue->e_cgi.plmn_id), + sgwc_ue->e_cgi.cell_id); + } ogs_assert(OGS_OK == sgwc_pfcp_send_bearer_modification_request( diff --git a/src/sgwc/s5c-handler.c b/src/sgwc/s5c-handler.c index 9f6060832..570d746dc 100644 --- a/src/sgwc/s5c-handler.c +++ b/src/sgwc/s5c-handler.c @@ -147,11 +147,11 @@ void sgwc_s5c_handle_create_session_response( if (rsp->pgw_s5_s8__s2a_s2b_f_teid_for_pmip_based_interface_or_for_gtp_based_control_plane_interface.presence == 0) { ogs_error("No GTP TEID"); - cause_value = OGS_GTP2_CAUSE_MANDATORY_IE_MISSING; + cause_value = OGS_GTP2_CAUSE_CONDITIONAL_IE_MISSING; } if (rsp->bearer_contexts_created.s5_s8_u_sgw_f_teid.presence == 0) { ogs_error("No GTP TEID"); - cause_value = OGS_GTP2_CAUSE_MANDATORY_IE_MISSING; + cause_value = OGS_GTP2_CAUSE_CONDITIONAL_IE_MISSING; } if (rsp->cause.presence == 0) { @@ -177,12 +177,12 @@ void sgwc_s5c_handle_create_session_response( /* Nothing */ } else { ogs_error("Unknown PDN Type %u", paa.session_type); - cause_value = OGS_GTP2_CAUSE_MANDATORY_IE_MISSING; + cause_value = OGS_GTP2_CAUSE_CONDITIONAL_IE_MISSING; } } else { ogs_error("No PDN Address Allocation"); - cause_value = OGS_GTP2_CAUSE_MANDATORY_IE_MISSING; + cause_value = OGS_GTP2_CAUSE_CONDITIONAL_IE_MISSING; } if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) { diff --git a/src/sgwc/sxa-build.c b/src/sgwc/sxa-build.c index b425d2984..7f6107c74 100644 --- a/src/sgwc/sxa-build.c +++ b/src/sgwc/sxa-build.c @@ -97,10 +97,6 @@ ogs_pkbuf_t *sgwc_sxa_build_session_establishment_request( ogs_pfcp_build_create_bar(&req->create_bar, sess->pfcp.bar); } - /* PDN Type */ - req->pdn_type.presence = 1; - req->pdn_type.u8 = sess->session.paa.session_type; - pfcp_message.h.type = type; pkbuf = ogs_pfcp_build_msg(&pfcp_message); diff --git a/src/smf/s5c-handler.c b/src/smf/s5c-handler.c index cd2793777..a6fabf340 100644 --- a/src/smf/s5c-handler.c +++ b/src/smf/s5c-handler.c @@ -76,7 +76,7 @@ uint8_t smf_s5c_handle_create_session_request( if (req->imsi.presence == 0) { ogs_error("No IMSI"); - cause_value = OGS_GTP2_CAUSE_MANDATORY_IE_MISSING; + cause_value = OGS_GTP2_CAUSE_CONDITIONAL_IE_MISSING; } if (req->sender_f_teid_for_control_plane.presence == 0) { ogs_error("No TEID"); @@ -96,20 +96,20 @@ uint8_t smf_s5c_handle_create_session_request( } if (req->pdn_address_allocation.presence == 0) { ogs_error("No PAA"); - cause_value = OGS_GTP2_CAUSE_MANDATORY_IE_MISSING; + cause_value = OGS_GTP2_CAUSE_CONDITIONAL_IE_MISSING; } if (req->serving_network.presence == 0) { ogs_error("No Serving Network"); - cause_value = OGS_GTP2_CAUSE_MANDATORY_IE_MISSING; + cause_value = OGS_GTP2_CAUSE_CONDITIONAL_IE_MISSING; } if (req->serving_network.data == NULL) { ogs_error("No Data in Serving Network"); - cause_value = OGS_GTP2_CAUSE_MANDATORY_IE_MISSING; + cause_value = OGS_GTP2_CAUSE_CONDITIONAL_IE_MISSING; } if (req->serving_network.len != OGS_PLMN_ID_LEN) { ogs_error("Invalid Len[%d] in Serving Network", req->serving_network.len); - cause_value = OGS_GTP2_CAUSE_MANDATORY_IE_MISSING; + cause_value = OGS_GTP2_CAUSE_CONDITIONAL_IE_MISSING; } if (!ogs_diam_app_connected(OGS_DIAM_GX_APPLICATION_ID)) { diff --git a/src/upf/n4-handler.c b/src/upf/n4-handler.c index b14e2d1c5..67a6293f2 100644 --- a/src/upf/n4-handler.c +++ b/src/upf/n4-handler.c @@ -120,9 +120,13 @@ void upf_n4_handle_session_establishment_request( ogs_assert(pdr); /* Setup UE IP address */ - if (req->pdn_type.presence && pdr->ue_ip_addr_len) { - ogs_assert(OGS_PFCP_CAUSE_REQUEST_ACCEPTED == - upf_sess_set_ue_ip(sess, req->pdn_type.u8, pdr)); + if (pdr->ue_ip_addr_len) { + if (req->pdn_type.presence == 1) { + ogs_assert(OGS_PFCP_CAUSE_REQUEST_ACCEPTED == + upf_sess_set_ue_ip(sess, req->pdn_type.u8, pdr)); + } else { + ogs_error("No PDN Type"); + } } /* Setup UPF-N3-TEID & QFI Hash */ diff --git a/tests/app/app-init.c b/tests/app/app-init.c index 12cd78712..80bc07c47 100644 --- a/tests/app/app-init.c +++ b/tests/app/app-init.c @@ -95,7 +95,7 @@ int app_initialize(const char *const argv[]) * * Note that at least 4 seconds are needed if freeDiameter is running. */ - ogs_msleep(5000); + ogs_msleep(500); return OGS_OK;; } diff --git a/tests/handover/epc-s1-test.c b/tests/handover/epc-s1-test.c index 4dd3d8f47..b22e6ea93 100644 --- a/tests/handover/epc-s1-test.c +++ b/tests/handover/epc-s1-test.c @@ -60,7 +60,7 @@ static void test1_func(abts_case *tc, void *data) test_ue = test_ue_add_by_suci(&mobile_identity_suci, 13); ogs_assert(test_ue); - test_ue->e_cgi.cell_id = 0x4615380; + test_ue->e_cgi.cell_id = 0x1234560; test_ue->nas.ksi = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE; test_ue->nas.value = OGS_NAS_ATTACH_TYPE_COMBINED_EPS_IMSI_ATTACH; @@ -346,7 +346,7 @@ static void test1_func(abts_case *tc, void *data) tests1ap_recv(test_ue, recvbuf); /* Send Handover Notify */ - test_ue->e_cgi.cell_id = 0x43a00; + test_ue->e_cgi.cell_id = 0xabcdef0; sendbuf = test_s1ap_build_handover_notify(test_ue); ABTS_PTR_NOTNULL(tc, sendbuf); rv = testenb_s1ap_send(s1ap2, sendbuf); @@ -467,7 +467,7 @@ static void test1_func(abts_case *tc, void *data) tests1ap_recv(test_ue, recvbuf); /* Send Handover Notify */ - test_ue->e_cgi.cell_id = 0x1f20a0; + test_ue->e_cgi.cell_id = 0x1234560; sendbuf = test_s1ap_build_handover_notify(test_ue); ABTS_PTR_NOTNULL(tc, sendbuf); rv = testenb_s1ap_send(s1ap1, sendbuf); @@ -630,7 +630,7 @@ static void test2_func(abts_case *tc, void *data) test_ue = test_ue_add_by_suci(&mobile_identity_suci, 13); ogs_assert(test_ue); - test_ue->e_cgi.cell_id = 0x4615380; + test_ue->e_cgi.cell_id = 0x1234560; test_ue->nas.ksi = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE; test_ue->nas.value = OGS_NAS_ATTACH_TYPE_COMBINED_EPS_IMSI_ATTACH; @@ -957,7 +957,7 @@ static void test3_func(abts_case *tc, void *data) test_ue = test_ue_add_by_suci(&mobile_identity_suci, 13); ogs_assert(test_ue); - test_ue->e_cgi.cell_id = 0x4615380; + test_ue->e_cgi.cell_id = 0x1234560; test_ue->nas.ksi = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE; test_ue->nas.value = OGS_NAS_ATTACH_TYPE_COMBINED_EPS_IMSI_ATTACH; diff --git a/tests/handover/epc-x2-test.c b/tests/handover/epc-x2-test.c index f3f4e51dc..0a1d58976 100644 --- a/tests/handover/epc-x2-test.c +++ b/tests/handover/epc-x2-test.c @@ -57,7 +57,7 @@ static void test1_func(abts_case *tc, void *data) test_ue = test_ue_add_by_suci(&mobile_identity_suci, 13); ogs_assert(test_ue); - test_ue->e_cgi.cell_id = 0x4615380; + test_ue->e_cgi.cell_id = 0x1234560; test_ue->nas.ksi = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE; test_ue->nas.value = OGS_NAS_ATTACH_TYPE_COMBINED_EPS_IMSI_ATTACH; @@ -260,7 +260,7 @@ static void test1_func(abts_case *tc, void *data) ogs_pkbuf_free(recvbuf); /* Send Path Switch Request */ - test_ue->e_cgi.cell_id = 0x461530; + test_ue->e_cgi.cell_id = 0xabcdef0; test_ue->enb_ue_s1ap_id++; ogs_list_for_each(&sess->bearer_list, bearer) { bearer->enb_s1u_addr = test_self()->gnb2_addr; @@ -310,7 +310,7 @@ static void test1_func(abts_case *tc, void *data) ogs_pkbuf_free(recvbuf); /* Send Path Switch Request */ - test_ue->e_cgi.cell_id = 0x46150; + test_ue->e_cgi.cell_id = 0x1234560; test_ue->enb_ue_s1ap_id++; ogs_list_for_each(&sess->bearer_list, bearer) { bearer->enb_s1u_addr = test_self()->gnb1_addr;