Distinguish the type of session creation

This commit is contained in:
Sukchan Lee 2022-04-14 17:34:55 +09:00
parent 80cd9d725f
commit 433d5f6bf3
40 changed files with 184 additions and 196 deletions

View File

@ -138,9 +138,6 @@ nrf:
# #
# parameter: # parameter:
# #
# o Number of output streams per SCTP associations.
# sctp_streams: 30
#
# o Disable use of IPv4 addresses (only IPv6) # o Disable use of IPv4 addresses (only IPv6)
# no_ipv4: true # no_ipv4: true
# #

View File

@ -140,9 +140,6 @@ nrf:
# #
# parameter: # parameter:
# #
# o Number of output streams per SCTP associations.
# sctp_streams: 30
#
# o Disable use of IPv4 addresses (only IPv6) # o Disable use of IPv4 addresses (only IPv6)
# no_ipv4: true # no_ipv4: true
# #

View File

@ -31,9 +31,6 @@ hss:
# #
# parameter: # parameter:
# #
# o Number of output streams per SCTP associations.
# sctp_streams: 30
#
# o Disable use of IPv4 addresses (only IPv6) # o Disable use of IPv4 addresses (only IPv6)
# no_ipv4: true # no_ipv4: true
# #

View File

@ -87,9 +87,6 @@ nrf:
# #
# parameter: # parameter:
# #
# o Number of output streams per SCTP associations.
# sctp_streams: 30
#
# o Disable use of IPv4 addresses (only IPv6) # o Disable use of IPv4 addresses (only IPv6)
# no_ipv4: true # no_ipv4: true
# #

View File

@ -180,9 +180,6 @@ nrf:
# #
# parameter: # parameter:
# #
# o Number of output streams per SCTP associations.
# sctp_streams: 30
#
# o Disable use of IPv4 addresses (only IPv6) # o Disable use of IPv4 addresses (only IPv6)
# no_ipv4: true # no_ipv4: true
# #

View File

@ -140,9 +140,6 @@ nrf:
# #
# parameter: # parameter:
# #
# o Number of output streams per SCTP associations.
# sctp_streams: 30
#
# o Disable use of IPv4 addresses (only IPv6) # o Disable use of IPv4 addresses (only IPv6)
# no_ipv4: true # no_ipv4: true
# #

View File

@ -28,9 +28,6 @@ pcrf:
# #
# parameter: # parameter:
# #
# o Number of output streams per SCTP associations.
# sctp_streams: 30
#
# o Disable use of IPv4 addresses (only IPv6) # o Disable use of IPv4 addresses (only IPv6)
# no_ipv4: true # no_ipv4: true
# #

View File

@ -125,9 +125,6 @@ sgwu:
# #
# parameter: # parameter:
# #
# o Number of output streams per SCTP associations.
# sctp_streams: 30
#
# o Disable use of IPv4 addresses (only IPv6) # o Disable use of IPv4 addresses (only IPv6)
# no_ipv4: true # no_ipv4: true
# #

View File

@ -117,9 +117,6 @@ sgwc:
# #
# parameter: # parameter:
# #
# o Number of output streams per SCTP associations.
# sctp_streams: 30
#
# o Disable use of IPv4 addresses (only IPv6) # o Disable use of IPv4 addresses (only IPv6)
# no_ipv4: true # no_ipv4: true
# #

View File

@ -506,9 +506,6 @@ upf:
# #
# parameter: # parameter:
# #
# o Number of output streams per SCTP associations.
# sctp_streams: 30
#
# o Disable use of IPv4 addresses (only IPv6) # o Disable use of IPv4 addresses (only IPv6)
# no_ipv4: true # no_ipv4: true
# #

View File

@ -138,9 +138,6 @@ nrf:
# #
# parameter: # parameter:
# #
# o Number of output streams per SCTP associations.
# sctp_streams: 30
#
# o Disable use of IPv4 addresses (only IPv6) # o Disable use of IPv4 addresses (only IPv6)
# no_ipv4: true # no_ipv4: true
# #

View File

@ -140,9 +140,6 @@ nrf:
# #
# parameter: # parameter:
# #
# o Number of output streams per SCTP associations.
# sctp_streams: 30
#
# o Disable use of IPv4 addresses (only IPv6) # o Disable use of IPv4 addresses (only IPv6)
# no_ipv4: true # no_ipv4: true
# #

View File

@ -169,6 +169,10 @@ int ogs_gtp_context_parse_config(const char *local, const char *remote)
&gtpc_iter, &option); &gtpc_iter, &option);
if (rv != OGS_OK) return rv; if (rv != OGS_OK) return rv;
is_option = true; is_option = true;
} else if (!strcmp(gtpc_key, "tac")) {
/* Nothing */
} else if (!strcmp(gtpc_key, "e_cell_id")) {
/* Nothing */
} else } else
ogs_warn("unknown key `%s`", gtpc_key); ogs_warn("unknown key `%s`", gtpc_key);
} }

View File

@ -111,7 +111,10 @@ typedef struct ogs_gtp_xact_s {
#define OGS_GTP_DELETE_INDIRECT_HANDOVER_CANCEL 2 #define OGS_GTP_DELETE_INDIRECT_HANDOVER_CANCEL 2
int delete_indirect_action; 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; } ogs_gtp_xact_t;
int ogs_gtp_xact_init(void); int ogs_gtp_xact_init(void);

View File

@ -25,7 +25,7 @@
#define OGS_LOG_DOMAIN __esm_log_domain #define OGS_LOG_DOMAIN __esm_log_domain
ogs_pkbuf_t *esm_build_pdn_connectivity_reject( 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; mme_ue_t *mme_ue = NULL;
ogs_nas_eps_message_t message; 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); mme_ue->imsi_bcd, sess->pti, esm_cause);
memset(&message, 0, sizeof(message)); memset(&message, 0, sizeof(message));
if (esm_piggybacked == true) { if (create_action == OGS_GTP_CREATE_IN_ATTACH_REQUEST) {
/* Nothing */ /* Nothing */
} else { } else {
message.h.security_header_type = message.h.security_header_type =
@ -55,7 +55,7 @@ ogs_pkbuf_t *esm_build_pdn_connectivity_reject(
pdn_connectivity_reject->esm_cause = esm_cause; 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); return ogs_nas_eps_plain_encode(&message);
else else
return nas_eps_security_encode(mme_ue, &message); 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( 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_message_t message;
ogs_nas_eps_activate_default_eps_bearer_context_request_t 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); mme_ue->imsi_bcd, sess->pti, bearer->ebi);
memset(&message, 0, sizeof(message)); memset(&message, 0, sizeof(message));
if (esm_piggybacked == true) { if (create_action == OGS_GTP_CREATE_IN_ATTACH_REQUEST) {
/* Nothing */ /* Nothing */
} else { } else {
message.h.security_header_type = 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); return ogs_nas_eps_plain_encode(&message);
else else
return nas_eps_security_encode(mme_ue, &message); return nas_eps_security_encode(mme_ue, &message);

View File

@ -27,10 +27,10 @@ extern "C" {
#endif #endif
ogs_pkbuf_t *esm_build_pdn_connectivity_reject( 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_information_request(mme_bearer_t *bearer);
ogs_pkbuf_t *esm_build_activate_default_bearer_context_request( 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( ogs_pkbuf_t *esm_build_activate_dedicated_bearer_context_request(
mme_bearer_t *bearer); mme_bearer_t *bearer);
ogs_pkbuf_t *esm_build_modify_bearer_context_request( ogs_pkbuf_t *esm_build_modify_bearer_context_request(

View File

@ -29,7 +29,7 @@
#define OGS_LOG_DOMAIN __esm_log_domain #define OGS_LOG_DOMAIN __esm_log_domain
int esm_handle_pdn_connectivity_request(mme_bearer_t *bearer, 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_ue_t *mme_ue = NULL;
mme_sess_t *sess = NULL; mme_sess_t *sess = NULL;
@ -67,7 +67,7 @@ int esm_handle_pdn_connectivity_request(mme_bearer_t *bearer,
/* Invalid APN */ /* Invalid APN */
ogs_assert(OGS_OK == ogs_assert(OGS_OK ==
nas_eps_send_pdn_connectivity_reject( 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); ogs_warn("Invalid APN[%s]", req->access_point_name.apn);
return OGS_ERROR; 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); sess->request_type.type, sess->session->session_type);
ogs_assert(OGS_OK == ogs_assert(OGS_OK ==
nas_eps_send_pdn_connectivity_reject( 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; return OGS_ERROR;
} }
} else { } else {
@ -134,12 +134,12 @@ int esm_handle_pdn_connectivity_request(mme_bearer_t *bearer,
} }
ogs_assert(OGS_OK == ogs_assert(OGS_OK ==
mme_gtp_send_create_session_request(sess, esm_piggybacked)); mme_gtp_send_create_session_request(sess, create_action));
} else { } else {
ogs_error("No APN"); ogs_error("No APN");
ogs_assert(OGS_OK == ogs_assert(OGS_OK ==
nas_eps_send_pdn_connectivity_reject( 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; return OGS_ERROR;
} }
@ -185,7 +185,8 @@ int esm_handle_information_response(mme_sess_t *sess,
sess->request_type.type, sess->session->session_type); sess->request_type.type, sess->session->session_type);
ogs_assert(OGS_OK == ogs_assert(OGS_OK ==
nas_eps_send_pdn_connectivity_reject( 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; return OGS_ERROR;
} }
} else { } else {
@ -207,7 +208,8 @@ int esm_handle_information_response(mme_sess_t *sess,
} }
} else { } else {
ogs_assert(OGS_OK == 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 { } else {
if (rsp->access_point_name.length) if (rsp->access_point_name.length)
@ -217,7 +219,8 @@ int esm_handle_information_response(mme_sess_t *sess,
ogs_assert(OGS_OK == ogs_assert(OGS_OK ==
nas_eps_send_pdn_connectivity_reject( 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; return OGS_ERROR;
} }

View File

@ -28,7 +28,7 @@ extern "C" {
int esm_handle_pdn_connectivity_request(mme_bearer_t *bearer, int esm_handle_pdn_connectivity_request(mme_bearer_t *bearer,
ogs_nas_eps_pdn_connectivity_request_t *pdn_connectivity_request, 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, int esm_handle_information_response(mme_sess_t *sess,
ogs_nas_eps_esm_information_response_t *bearer_information_response); ogs_nas_eps_esm_information_response_t *bearer_information_response);
int esm_handle_bearer_resource_allocation_request( int esm_handle_bearer_resource_allocation_request(

View File

@ -107,7 +107,7 @@ void esm_state_inactive(ogs_fsm_t *s, mme_event_t *e)
mme_ue->imsi_bcd, sess->pti, bearer->ebi); mme_ue->imsi_bcd, sess->pti, bearer->ebi);
rv = esm_handle_pdn_connectivity_request( rv = esm_handle_pdn_connectivity_request(
bearer, &message->esm.pdn_connectivity_request, bearer, &message->esm.pdn_connectivity_request,
e->esm_piggybacked); e->create_action);
if (rv != OGS_OK) { if (rv != OGS_OK) {
OGS_FSM_TRAN(s, esm_state_exception); OGS_FSM_TRAN(s, esm_state_exception);
break; break;
@ -230,7 +230,7 @@ void esm_state_inactive(ogs_fsm_t *s, mme_event_t *e)
ogs_assert(OGS_OK == ogs_assert(OGS_OK ==
nas_eps_send_pdn_connectivity_reject(sess, nas_eps_send_pdn_connectivity_reject(sess,
ESM_CAUSE_ESM_INFORMATION_NOT_RECEIVED, ESM_CAUSE_ESM_INFORMATION_NOT_RECEIVED,
e->esm_piggybacked)); e->create_action));
} else { } else {
rv = nas_eps_send_esm_information_request(bearer); rv = nas_eps_send_esm_information_request(bearer);
if (rv == OGS_OK) { 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); mme_ue->imsi_bcd, sess->pti, bearer->ebi);
rv = esm_handle_pdn_connectivity_request( rv = esm_handle_pdn_connectivity_request(
bearer, &message->esm.pdn_connectivity_request, bearer, &message->esm.pdn_connectivity_request,
e->esm_piggybacked); e->create_action);
if (rv != OGS_OK) { if (rv != OGS_OK) {
OGS_FSM_TRAN(s, esm_state_exception); OGS_FSM_TRAN(s, esm_state_exception);
break; 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); mme_ue->imsi_bcd, sess->pti, bearer->ebi);
rv = esm_handle_pdn_connectivity_request( rv = esm_handle_pdn_connectivity_request(
bearer, &message->esm.pdn_connectivity_request, bearer, &message->esm.pdn_connectivity_request,
e->esm_piggybacked); e->create_action);
if (rv != OGS_OK) { if (rv != OGS_OK) {
OGS_FSM_TRAN(s, esm_state_exception); OGS_FSM_TRAN(s, esm_state_exception);
break; break;

View File

@ -1552,8 +1552,10 @@ mme_sgw_t *mme_sgw_add(ogs_sockaddr_t *addr)
ogs_assert(sgw); ogs_assert(sgw);
memset(sgw, 0, sizeof *sgw); memset(sgw, 0, sizeof *sgw);
sgw->gnode = ogs_gtp_node_new(addr); sgw->gnode.sa_list = addr;
ogs_assert(sgw->gnode);
ogs_list_init(&sgw->gnode.local_list);
ogs_list_init(&sgw->gnode.remote_list);
ogs_list_add(&self.sgw_list, sgw); 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_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); 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_assert(addr);
ogs_list_for_each(&self.sgw_list, sgw) { 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; break;
} }
@ -1603,8 +1606,7 @@ mme_pgw_t *mme_pgw_add(ogs_sockaddr_t *addr)
ogs_assert(pgw); ogs_assert(pgw);
memset(pgw, 0, sizeof *pgw); memset(pgw, 0, sizeof *pgw);
pgw->gnode = ogs_gtp_node_new(addr); pgw->sa_list = addr;
ogs_assert(pgw->gnode);
ogs_list_add(&self.pgw_list, pgw); 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_list_remove(&self.pgw_list, pgw);
ogs_gtp_node_free(pgw->gnode); ogs_freeaddrinfo(pgw->sa_list);
ogs_pool_free(&mme_pgw_pool, pgw); ogs_pool_free(&mme_pgw_pool, pgw);
} }
@ -1636,8 +1638,8 @@ ogs_sockaddr_t *mme_pgw_addr_find_by_apn(
ogs_assert(list); ogs_assert(list);
ogs_list_for_each(list, pgw) { ogs_list_for_each(list, pgw) {
ogs_assert(pgw->gnode); ogs_assert(pgw->sa_list);
ogs_sockaddr_t *addr = pgw->gnode->sa_list; ogs_sockaddr_t *addr = pgw->sa_list;
while (addr) { while (addr) {
if (addr->ogs_sa_family == family && 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); 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_ue_t *mme_ue_add(enb_ue_t *enb_ue)
{ {
mme_enb_t *enb = NULL; 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); mme_self()->sgw = ogs_list_last(&mme_self()->sgw_list);
/* setup GTP path with selected SGW */ /* setup GTP path with selected SGW */
mme_self()->sgw = selected_sgw_node(mme_self()->sgw, enb_ue); mme_ue->sgw = mme_self()->sgw = selected_sgw_node(mme_self()->sgw, enb_ue);
ogs_assert(mme_self()->sgw); ogs_assert(mme_ue->sgw);
OGS_SETUP_GTP_NODE(mme_ue, mme_self()->sgw->gnode); ogs_assert(mme_ue->gnode);
ogs_debug("UE using SGW on IP[%s]", OGS_ADDR(&mme_ue->gnode->addr, buf)); ogs_debug("UE using SGW on IP[%s]", OGS_ADDR(mme_ue->gnode->sa_list, buf));
/* Clear VLR */ /* Clear VLR */
mme_ue->csmap = NULL; 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_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 pti = OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED;
uint8_t ebi = OGS_NAS_EPS_BEARER_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) { OGS_NAS_EPS_PDN_CONNECTIVITY_REQUEST_ACCESS_POINT_NAME_PRESENT) {
sess = mme_sess_find_by_apn(mme_ue, sess = mme_sess_find_by_apn(mme_ue,
pdn_connectivity_request->access_point_name.apn); 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 == ogs_assert(OGS_OK ==
nas_eps_send_pdn_connectivity_reject( nas_eps_send_pdn_connectivity_reject(
sess, sess,
ESM_CAUSE_MULTIPLE_PDN_CONNECTIONS_FOR_A_GIVEN_APN_NOT_ALLOWED, ESM_CAUSE_MULTIPLE_PDN_CONNECTIONS_FOR_A_GIVEN_APN_NOT_ALLOWED,
esm_piggybacked)); create_action));
ogs_warn("APN duplicated [%s]", ogs_warn("APN duplicated [%s]",
pdn_connectivity_request->access_point_name.apn); pdn_connectivity_request->access_point_name.apn);
return NULL; return NULL;

View File

@ -147,20 +147,18 @@ typedef struct mme_context_s {
} mme_context_t; } mme_context_t;
typedef struct mme_sgw_s { typedef struct mme_sgw_s {
ogs_lnode_t lnode; ogs_gtp_node_t gnode;
uint16_t tac[OGS_MAX_NUM_OF_TAI]; uint16_t tac[OGS_MAX_NUM_OF_TAI];
uint8_t num_of_tac; uint8_t num_of_tac;
uint32_t e_cell_id[OGS_MAX_NUM_OF_CELL_ID]; uint32_t e_cell_id[OGS_MAX_NUM_OF_CELL_ID];
uint8_t num_of_e_cell_id; uint8_t num_of_e_cell_id;
ogs_gtp_node_t *gnode;
} mme_sgw_t; } mme_sgw_t;
typedef struct mme_pgw_s { typedef struct mme_pgw_s {
ogs_lnode_t lnode; ogs_lnode_t lnode;
ogs_gtp_node_t *gnode; ogs_sockaddr_t *sa_list;
const char *apn; const char *apn;
} mme_pgw_t; } mme_pgw_t;
@ -517,7 +515,10 @@ struct mme_ue_s {
*/ */
int session_context_will_deleted; int session_context_will_deleted;
ogs_gtp_node_t *gnode; union {
mme_sgw_t *sgw;
ogs_gtp_node_t *gnode;
};
mme_csmap_t *csmap; 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_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_by_ue_ebi(mme_ue_t *mme_ue, uint8_t ebi);
mme_bearer_t *mme_bearer_find_or_add_by_message( 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_default_bearer_in_sess(mme_sess_t *sess);
mme_bearer_t *mme_linked_bearer(mme_bearer_t *bearer); mme_bearer_t *mme_linked_bearer(mme_bearer_t *bearer);
mme_bearer_t *mme_bearer_first(mme_sess_t *sess); 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_int_algorithm(mme_ue_t *mme_ue);
uint8_t mme_selected_enc_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 #ifdef __cplusplus
} }
#endif #endif

View File

@ -83,7 +83,7 @@ typedef struct mme_event_s {
ogs_gtp_node_t *gnode; ogs_gtp_node_t *gnode;
uint8_t nas_type; uint8_t nas_type;
bool esm_piggybacked; int create_action;
ogs_nas_eps_message_t *nas_message; ogs_nas_eps_message_t *nas_message;
ogs_diam_s6a_message_t *s6a_message; ogs_diam_s6a_message_t *s6a_message;

View File

@ -59,11 +59,11 @@ static void _gtpv2_c_recv_cb(short when, ogs_socket_t fd, void *data)
ogs_pkbuf_free(pkbuf); ogs_pkbuf_free(pkbuf);
return; return;
} }
ogs_assert(sgw->gnode); ogs_assert(sgw);
e = mme_event_new(MME_EVT_S11_MESSAGE); e = mme_event_new(MME_EVT_S11_MESSAGE);
ogs_assert(e); ogs_assert(e);
e->gnode = sgw->gnode; e->gnode = (ogs_gtp_node_t *)sgw;
e->pkbuf = pkbuf; e->pkbuf = pkbuf;
rv = ogs_queue_push(ogs_app()->queue, e); 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) { ogs_list_for_each(&mme_self()->sgw_list, sgw) {
rv = ogs_gtp_connect( rv = ogs_gtp_connect(
ogs_gtp_self()->gtpc_sock, ogs_gtp_self()->gtpc_sock6, ogs_gtp_self()->gtpc_sock, ogs_gtp_self()->gtpc_sock6,
sgw->gnode); (ogs_gtp_node_t *)sgw);
ogs_assert(rv == OGS_OK); ogs_assert(rv == OGS_OK);
} }
@ -199,7 +199,7 @@ void mme_gtp_close(void)
ogs_socknode_remove_all(&ogs_gtp_self()->gtpc_list6); 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; int rv;
ogs_gtp2_header_t h; 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); xact = ogs_gtp_xact_local_create(mme_ue->gnode, &h, pkbuf, timeout, sess);
ogs_expect_or_return_val(xact, OGS_ERROR); ogs_expect_or_return_val(xact, OGS_ERROR);
xact->esm_piggybacked = esm_piggybacked; xact->create_action = create_action;
rv = ogs_gtp_xact_commit(xact); rv = ogs_gtp_xact_commit(xact);
ogs_expect(rv == OGS_OK); ogs_expect(rv == OGS_OK);

View File

@ -29,7 +29,7 @@ extern "C" {
int mme_gtp_open(void); int mme_gtp_open(void);
void mme_gtp_close(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_modify_bearer_request(mme_bearer_t *bearer, int uli_presence);
int mme_gtp_send_delete_session_request(mme_sess_t *sess, int action); 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); void mme_gtp_send_delete_all_sessions(mme_ue_t *mme_ue, int action);

View File

@ -92,10 +92,10 @@ void mme_s11_handle_create_session_response(
ogs_gtp2_bearer_qos_t bearer_qos; ogs_gtp2_bearer_qos_t bearer_qos;
ogs_gtp2_ambr_t *ambr = NULL; ogs_gtp2_ambr_t *ambr = NULL;
uint16_t decoded = 0; uint16_t decoded = 0;
bool esm_piggybacked = false; int create_action = 0;
ogs_assert(xact); ogs_assert(xact);
esm_piggybacked = xact->esm_piggybacked; create_action = xact->create_action;
ogs_assert(rsp); ogs_assert(rsp);
ogs_debug("Create Session Response"); ogs_debug("Create Session Response");
@ -193,7 +193,7 @@ void mme_s11_handle_create_session_response(
cause_value != cause_value !=
OGS_GTP2_CAUSE_NEW_PDN_TYPE_DUE_TO_SINGLE_ADDRESS_BEARER_ONLY) { OGS_GTP2_CAUSE_NEW_PDN_TYPE_DUE_TO_SINGLE_ADDRESS_BEARER_ONLY) {
if (mme_ue_from_teid && mme_ue) { 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_error("[%s] Attach reject", mme_ue->imsi_bcd);
ogs_assert(OGS_OK == ogs_assert(OGS_OK ==
nas_eps_send_attach_reject(mme_ue, 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); rv = ogs_gtp2_f_teid_to_ip(sgw_s1u_teid, &bearer->sgw_s1u_ip);
ogs_assert(rv == OGS_OK); 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_csmap_t *csmap = mme_csmap_find_by_tai(&mme_ue->tai);
mme_ue->csmap = csmap; mme_ue->csmap = csmap;
@ -275,7 +275,8 @@ void mme_s11_handle_create_session_response(
} else { } else {
ogs_assert(OGS_PDU_SESSION_TYPE_IS_VALID(session->paa.session_type)); ogs_assert(OGS_PDU_SESSION_TYPE_IS_VALID(session->paa.session_type));
ogs_assert(OGS_OK == ogs_assert(OGS_OK ==
nas_eps_send_activate_default_bearer_context_request(bearer)); nas_eps_send_activate_default_bearer_context_request(
bearer, create_action));
} }
} }

View File

@ -375,7 +375,7 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e)
} }
bearer = mme_bearer_find_or_add_by_message( bearer = mme_bearer_find_or_add_by_message(
mme_ue, &nas_message, e->esm_piggybacked); mme_ue, &nas_message, e->create_action);
if (!bearer) { if (!bearer) {
ogs_pkbuf_free(pkbuf); ogs_pkbuf_free(pkbuf);
break; break;

View File

@ -56,7 +56,7 @@ int nas_eps_send_emm_to_esm(mme_ue_t *mme_ue,
ogs_pkbuf_put_data(esmbuf, ogs_pkbuf_put_data(esmbuf,
esm_message_container->buffer, esm_message_container->length); 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); ogs_expect(rv == OGS_OK);
return rv; 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); 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); ogs_expect_or_return_val(esmbuf, OGS_ERROR);
emmbuf = emm_build_attach_accept(mme_ue, esmbuf); 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); sess = mme_sess_first(mme_ue);
if (sess) { 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); 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( 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; int rv;
mme_ue_t *mme_ue; mme_ue_t *mme_ue;
@ -295,14 +297,15 @@ int nas_eps_send_pdn_connectivity_reject(
mme_ue = sess->mme_ue; mme_ue = sess->mme_ue;
ogs_assert(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 /* During the UE-attach process, we'll send Attach-Reject
* with pyggybacking PDN-connectivity-Reject */ * with pyggybacking PDN-connectivity-Reject */
rv = nas_eps_send_attach_reject(mme_ue, rv = nas_eps_send_attach_reject(mme_ue,
EMM_CAUSE_EPS_SERVICES_AND_NON_EPS_SERVICES_NOT_ALLOWED, esm_cause); EMM_CAUSE_EPS_SERVICES_AND_NON_EPS_SERVICES_NOT_ALLOWED, esm_cause);
ogs_expect(rv == OGS_OK); ogs_expect(rv == OGS_OK);
} else { } 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); ogs_expect_or_return_val(esmbuf, OGS_ERROR);
rv = nas_eps_send_to_downlink_nas_transport(mme_ue, esmbuf); 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; 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; int rv;
ogs_pkbuf_t *s1apbuf = NULL; 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; mme_ue = bearer->mme_ue;
ogs_assert(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); ogs_expect_or_return_val(esmbuf, OGS_ERROR);
s1apbuf = s1ap_build_e_rab_setup_request(bearer, esmbuf); s1apbuf = s1ap_build_e_rab_setup_request(bearer, esmbuf);

View File

@ -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_detach_accept(mme_ue_t *mme_ue);
int nas_eps_send_pdn_connectivity_reject( 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_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( int nas_eps_send_activate_dedicated_bearer_context_request(
mme_bearer_t *bearer); mme_bearer_t *bearer);
void nas_eps_send_activate_all_dedicated_bearers(mme_bearer_t *default_bearer); void nas_eps_send_activate_all_dedicated_bearers(mme_bearer_t *default_bearer);

View File

@ -117,7 +117,7 @@ int s1ap_delayed_send_to_enb_ue(
int s1ap_send_to_esm( int s1ap_send_to_esm(
mme_ue_t *mme_ue, ogs_pkbuf_t *esmbuf, 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; int rv;
mme_event_t *e = NULL; mme_event_t *e = NULL;
@ -130,7 +130,7 @@ int s1ap_send_to_esm(
e->mme_ue = mme_ue; e->mme_ue = mme_ue;
e->pkbuf = esmbuf; e->pkbuf = esmbuf;
e->nas_type = nas_type; e->nas_type = nas_type;
e->esm_piggybacked = esm_piggybacked; e->create_action = create_action;
rv = ogs_queue_push(ogs_app()->queue, e); rv = ogs_queue_push(ogs_app()->queue, e);
if (rv != OGS_OK) { if (rv != OGS_OK) {
ogs_warn("ogs_queue_push() failed:%d", (int)rv); 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 OGS_ERROR;
} }
return s1ap_send_to_esm( 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 { } else {
ogs_error("Unknown/Unimplemented NAS Protocol discriminator 0x%02x", ogs_error("Unknown/Unimplemented NAS Protocol discriminator 0x%02x",
h->protocol_discriminator); h->protocol_discriminator);

View File

@ -46,7 +46,7 @@ int s1ap_send_to_nas(enb_ue_t *enb_ue,
S1AP_ProcedureCode_t procedureCode, S1AP_NAS_PDU_t *nasPdu); S1AP_ProcedureCode_t procedureCode, S1AP_NAS_PDU_t *nasPdu);
int s1ap_send_to_esm( int s1ap_send_to_esm(
mme_ue_t *mme_ue, ogs_pkbuf_t *esmbuf, 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_response(mme_enb_t *enb);
int s1ap_send_s1_setup_failure( int s1ap_send_s1_setup_failure(

View File

@ -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; if (ogs_strcasecmp(node->dnn[i], sess->session.name) == 0) return true;
for (i = 0; i < node->num_of_e_cell_id; i++) 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++) 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; return false;
} }
@ -681,19 +683,6 @@ sgwc_tunnel_t *sgwc_tunnel_add(
ogs_assert(pdr->apn); 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); far = ogs_pfcp_far_add(&sess->pfcp);
ogs_assert(far); ogs_assert(far);

View File

@ -59,6 +59,7 @@ typedef struct sgwc_ue_s {
char imsi_bcd[OGS_MAX_IMSI_BCD_LEN+1]; char imsi_bcd[OGS_MAX_IMSI_BCD_LEN+1];
/* User-Location-Info */ /* User-Location-Info */
bool uli_presence;
ogs_eps_tai_t e_tai; ogs_eps_tai_t e_tai;
ogs_e_cgi_t e_cgi; 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. * it is used to check if all sessions are deactivated.
*/ */
struct { struct {
bool release_access_bearers; bool release_access_bearers;
bool create_indirect_tunnel; bool create_indirect_tunnel;
bool delete_indirect_tunnel; bool delete_indirect_tunnel;
} state; } state;
/* APN Configuration */ /* APN Configuration */
ogs_session_t session; ogs_session_t session;
ogs_list_t bearer_list; ogs_list_t bearer_list;

View File

@ -141,7 +141,7 @@ void sgwc_s11_handle_create_session_request(
if (req->imsi.presence == 0) { if (req->imsi.presence == 0) {
ogs_error("No IMSI"); 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) { if (req->bearer_contexts_to_be_created.presence == 0) {
ogs_error("No Bearer"); 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) { if (req->pgw_s5_s8_address_for_control_plane_or_pmip.presence == 0) {
ogs_error("No PGW IP"); ogs_error("No PGW IP");
cause_value = OGS_GTP2_CAUSE_MANDATORY_IE_MISSING; cause_value = OGS_GTP2_CAUSE_CONDITIONAL_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;
} }
if (!sgwc_ue) { if (!sgwc_ue) {
@ -203,19 +195,24 @@ void sgwc_s11_handle_create_session_request(
ogs_assert(sess); ogs_assert(sess);
/* Set User Location Information */ /* Set User Location Information */
decoded = ogs_gtp2_parse_uli(&uli, &req->user_location_information); if (req->user_location_information.presence == 1) {
ogs_assert(req->user_location_information.len == decoded); decoded = ogs_gtp2_parse_uli(&uli, &req->user_location_information);
ogs_nas_to_plmn_id(&sgwc_ue->e_tai.plmn_id, &uli.tai.nas_plmn_id); ogs_assert(req->user_location_information.len == decoded);
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]", sgwc_ue->uli_presence = true;
ogs_plmn_id_hexdump(&sgwc_ue->e_tai.plmn_id),
sgwc_ue->e_tai.tac); ogs_nas_to_plmn_id(&sgwc_ue->e_tai.plmn_id, &uli.tai.nas_plmn_id);
ogs_debug(" E_CGI[PLMN_ID:%06x,CELL_ID:0x%x]", sgwc_ue->e_tai.tac = uli.tai.tac;
ogs_plmn_id_hexdump(&sgwc_ue->e_cgi.plmn_id), ogs_nas_to_plmn_id(&sgwc_ue->e_cgi.plmn_id, &uli.e_cgi.nas_plmn_id);
sgwc_ue->e_cgi.cell_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 */ /* Select SGW-U based on UE Location Information */
sgwc_sess_select_sgwu(sess); sgwc_sess_select_sgwu(sess);
@ -242,10 +239,6 @@ void sgwc_s11_handle_create_session_request(
sess->session.qos.arp.pre_emption_vulnerability = sess->session.qos.arp.pre_emption_vulnerability =
bearer_qos.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 */ /* Remove all previous bearer */
sgwc_bearer_remove_all(sess); sgwc_bearer_remove_all(sess);
@ -358,13 +351,16 @@ void sgwc_s11_handle_modify_bearer_request(
} }
if (req->user_location_information.presence == 1) { if (req->user_location_information.presence == 1) {
decoded = ogs_gtp2_parse_uli( decoded = ogs_gtp2_parse_uli(&uli, &req->user_location_information);
&uli, &req->user_location_information);
ogs_assert(req->user_location_information.len == decoded); 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); ogs_nas_to_plmn_id(&sgwc_ue->e_tai.plmn_id, &uli.tai.nas_plmn_id);
sgwc_ue->e_tai.tac = uli.tai.tac; 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); 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; sgwc_ue->e_cgi.cell_id = uli.e_cgi.cell_id;
ogs_debug(" TAI[PLMN_ID:%06x,TAC:%d]", ogs_debug(" TAI[PLMN_ID:%06x,TAC:%d]",
ogs_plmn_id_hexdump(&sgwc_ue->e_tai.plmn_id), ogs_plmn_id_hexdump(&sgwc_ue->e_tai.plmn_id),
sgwc_ue->e_tai.tac); sgwc_ue->e_tai.tac);
@ -539,10 +535,6 @@ void sgwc_s11_handle_create_bearer_response(
ogs_error("No SGW TEID"); ogs_error("No SGW TEID");
cause_value = OGS_GTP2_CAUSE_MANDATORY_IE_MISSING; 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) if (s11_xact->xid & OGS_GTP_CMD_XACT_ID)
/* MME received Bearer Resource Modification Request */ /* 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, &far->outer_header_creation_len));
far->outer_header_creation.teid = dl_tunnel->remote_teid; far->outer_header_creation.teid = dl_tunnel->remote_teid;
decoded = ogs_gtp2_parse_uli(&uli, &rsp->user_location_information); if (rsp->user_location_information.presence == 1) {
ogs_assert(rsp->user_location_information.len == decoded); decoded = ogs_gtp2_parse_uli(&uli, &rsp->user_location_information);
ogs_nas_to_plmn_id(&sgwc_ue->e_tai.plmn_id, &uli.tai.nas_plmn_id); ogs_assert(rsp->user_location_information.len == decoded);
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]", sgwc_ue->uli_presence = true;
ogs_plmn_id_hexdump(&sgwc_ue->e_tai.plmn_id),
sgwc_ue->e_tai.tac); ogs_nas_to_plmn_id(&sgwc_ue->e_tai.plmn_id, &uli.tai.nas_plmn_id);
ogs_debug(" E_CGI[PLMN_ID:%06x,CELL_ID:0x%x]", sgwc_ue->e_tai.tac = uli.tai.tac;
ogs_plmn_id_hexdump(&sgwc_ue->e_cgi.plmn_id), ogs_nas_to_plmn_id(&sgwc_ue->e_cgi.plmn_id, &uli.e_cgi.nas_plmn_id);
sgwc_ue->e_cgi.cell_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 == ogs_assert(OGS_OK ==
sgwc_pfcp_send_bearer_modification_request( sgwc_pfcp_send_bearer_modification_request(

View File

@ -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) { 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"); 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) { if (rsp->bearer_contexts_created.s5_s8_u_sgw_f_teid.presence == 0) {
ogs_error("No GTP TEID"); 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) { if (rsp->cause.presence == 0) {
@ -177,12 +177,12 @@ void sgwc_s5c_handle_create_session_response(
/* Nothing */ /* Nothing */
} else { } else {
ogs_error("Unknown PDN Type %u", paa.session_type); 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 { } else {
ogs_error("No PDN Address Allocation"); 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) { if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {

View File

@ -97,10 +97,6 @@ ogs_pkbuf_t *sgwc_sxa_build_session_establishment_request(
ogs_pfcp_build_create_bar(&req->create_bar, sess->pfcp.bar); 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; pfcp_message.h.type = type;
pkbuf = ogs_pfcp_build_msg(&pfcp_message); pkbuf = ogs_pfcp_build_msg(&pfcp_message);

View File

@ -76,7 +76,7 @@ uint8_t smf_s5c_handle_create_session_request(
if (req->imsi.presence == 0) { if (req->imsi.presence == 0) {
ogs_error("No IMSI"); 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) { if (req->sender_f_teid_for_control_plane.presence == 0) {
ogs_error("No TEID"); ogs_error("No TEID");
@ -96,20 +96,20 @@ uint8_t smf_s5c_handle_create_session_request(
} }
if (req->pdn_address_allocation.presence == 0) { if (req->pdn_address_allocation.presence == 0) {
ogs_error("No PAA"); 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) { if (req->serving_network.presence == 0) {
ogs_error("No Serving Network"); 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) { if (req->serving_network.data == NULL) {
ogs_error("No Data in Serving Network"); 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) { if (req->serving_network.len != OGS_PLMN_ID_LEN) {
ogs_error("Invalid Len[%d] in Serving Network", ogs_error("Invalid Len[%d] in Serving Network",
req->serving_network.len); 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)) { if (!ogs_diam_app_connected(OGS_DIAM_GX_APPLICATION_ID)) {

View File

@ -120,9 +120,13 @@ void upf_n4_handle_session_establishment_request(
ogs_assert(pdr); ogs_assert(pdr);
/* Setup UE IP address */ /* Setup UE IP address */
if (req->pdn_type.presence && pdr->ue_ip_addr_len) { if (pdr->ue_ip_addr_len) {
ogs_assert(OGS_PFCP_CAUSE_REQUEST_ACCEPTED == if (req->pdn_type.presence == 1) {
upf_sess_set_ue_ip(sess, req->pdn_type.u8, pdr)); 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 */ /* Setup UPF-N3-TEID & QFI Hash */

View File

@ -95,7 +95,7 @@ int app_initialize(const char *const argv[])
* *
* Note that at least 4 seconds are needed if freeDiameter is running. * Note that at least 4 seconds are needed if freeDiameter is running.
*/ */
ogs_msleep(5000); ogs_msleep(500);
return OGS_OK;; return OGS_OK;;
} }

View File

@ -60,7 +60,7 @@ static void test1_func(abts_case *tc, void *data)
test_ue = test_ue_add_by_suci(&mobile_identity_suci, 13); test_ue = test_ue_add_by_suci(&mobile_identity_suci, 13);
ogs_assert(test_ue); 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.ksi = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE;
test_ue->nas.value = OGS_NAS_ATTACH_TYPE_COMBINED_EPS_IMSI_ATTACH; 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); tests1ap_recv(test_ue, recvbuf);
/* Send Handover Notify */ /* 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); sendbuf = test_s1ap_build_handover_notify(test_ue);
ABTS_PTR_NOTNULL(tc, sendbuf); ABTS_PTR_NOTNULL(tc, sendbuf);
rv = testenb_s1ap_send(s1ap2, 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); tests1ap_recv(test_ue, recvbuf);
/* Send Handover Notify */ /* 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); sendbuf = test_s1ap_build_handover_notify(test_ue);
ABTS_PTR_NOTNULL(tc, sendbuf); ABTS_PTR_NOTNULL(tc, sendbuf);
rv = testenb_s1ap_send(s1ap1, 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); test_ue = test_ue_add_by_suci(&mobile_identity_suci, 13);
ogs_assert(test_ue); 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.ksi = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE;
test_ue->nas.value = OGS_NAS_ATTACH_TYPE_COMBINED_EPS_IMSI_ATTACH; 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); test_ue = test_ue_add_by_suci(&mobile_identity_suci, 13);
ogs_assert(test_ue); 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.ksi = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE;
test_ue->nas.value = OGS_NAS_ATTACH_TYPE_COMBINED_EPS_IMSI_ATTACH; test_ue->nas.value = OGS_NAS_ATTACH_TYPE_COMBINED_EPS_IMSI_ATTACH;

View File

@ -57,7 +57,7 @@ static void test1_func(abts_case *tc, void *data)
test_ue = test_ue_add_by_suci(&mobile_identity_suci, 13); test_ue = test_ue_add_by_suci(&mobile_identity_suci, 13);
ogs_assert(test_ue); 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.ksi = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE;
test_ue->nas.value = OGS_NAS_ATTACH_TYPE_COMBINED_EPS_IMSI_ATTACH; 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); ogs_pkbuf_free(recvbuf);
/* Send Path Switch Request */ /* Send Path Switch Request */
test_ue->e_cgi.cell_id = 0x461530; test_ue->e_cgi.cell_id = 0xabcdef0;
test_ue->enb_ue_s1ap_id++; test_ue->enb_ue_s1ap_id++;
ogs_list_for_each(&sess->bearer_list, bearer) { ogs_list_for_each(&sess->bearer_list, bearer) {
bearer->enb_s1u_addr = test_self()->gnb2_addr; 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); ogs_pkbuf_free(recvbuf);
/* Send Path Switch Request */ /* Send Path Switch Request */
test_ue->e_cgi.cell_id = 0x46150; test_ue->e_cgi.cell_id = 0x1234560;
test_ue->enb_ue_s1ap_id++; test_ue->enb_ue_s1ap_id++;
ogs_list_for_each(&sess->bearer_list, bearer) { ogs_list_for_each(&sess->bearer_list, bearer) {
bearer->enb_s1u_addr = test_self()->gnb1_addr; bearer->enb_s1u_addr = test_self()->gnb1_addr;