forked from acouzens/open5gs
Distinguish the type of session creation
This commit is contained in:
parent
80cd9d725f
commit
433d5f6bf3
|
@ -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
|
||||||
#
|
#
|
||||||
|
|
|
@ -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
|
||||||
#
|
#
|
||||||
|
|
|
@ -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
|
||||||
#
|
#
|
||||||
|
|
|
@ -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
|
||||||
#
|
#
|
||||||
|
|
|
@ -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
|
||||||
#
|
#
|
||||||
|
|
|
@ -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
|
||||||
#
|
#
|
||||||
|
|
|
@ -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
|
||||||
#
|
#
|
||||||
|
|
|
@ -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
|
||||||
#
|
#
|
||||||
|
|
|
@ -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
|
||||||
#
|
#
|
||||||
|
|
|
@ -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
|
||||||
#
|
#
|
||||||
|
|
|
@ -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
|
||||||
#
|
#
|
||||||
|
|
|
@ -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
|
||||||
#
|
#
|
||||||
|
|
|
@ -169,6 +169,10 @@ int ogs_gtp_context_parse_config(const char *local, const char *remote)
|
||||||
>pc_iter, &option);
|
>pc_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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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(
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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(
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
union {
|
||||||
|
mme_sgw_t *sgw;
|
||||||
ogs_gtp_node_t *gnode;
|
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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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(
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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,8 +195,12 @@ void sgwc_s11_handle_create_session_request(
|
||||||
ogs_assert(sess);
|
ogs_assert(sess);
|
||||||
|
|
||||||
/* Set User Location Information */
|
/* Set User Location Information */
|
||||||
|
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);
|
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);
|
||||||
|
@ -216,6 +212,7 @@ void sgwc_s11_handle_create_session_request(
|
||||||
ogs_debug(" E_CGI[PLMN_ID:%06x,CELL_ID:0x%x]",
|
ogs_debug(" E_CGI[PLMN_ID:%06x,CELL_ID:0x%x]",
|
||||||
ogs_plmn_id_hexdump(&sgwc_ue->e_cgi.plmn_id),
|
ogs_plmn_id_hexdump(&sgwc_ue->e_cgi.plmn_id),
|
||||||
sgwc_ue->e_cgi.cell_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,8 +626,12 @@ 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;
|
||||||
|
|
||||||
|
if (rsp->user_location_information.presence == 1) {
|
||||||
decoded = ogs_gtp2_parse_uli(&uli, &rsp->user_location_information);
|
decoded = ogs_gtp2_parse_uli(&uli, &rsp->user_location_information);
|
||||||
ogs_assert(rsp->user_location_information.len == decoded);
|
ogs_assert(rsp->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);
|
||||||
|
@ -647,6 +643,7 @@ void sgwc_s11_handle_create_bearer_response(
|
||||||
ogs_debug(" E_CGI[PLMN_ID:%06x,CELL_ID:0x%x]",
|
ogs_debug(" E_CGI[PLMN_ID:%06x,CELL_ID:0x%x]",
|
||||||
ogs_plmn_id_hexdump(&sgwc_ue->e_cgi.plmn_id),
|
ogs_plmn_id_hexdump(&sgwc_ue->e_cgi.plmn_id),
|
||||||
sgwc_ue->e_cgi.cell_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(
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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)) {
|
||||||
|
|
|
@ -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) {
|
||||||
|
if (req->pdn_type.presence == 1) {
|
||||||
ogs_assert(OGS_PFCP_CAUSE_REQUEST_ACCEPTED ==
|
ogs_assert(OGS_PFCP_CAUSE_REQUEST_ACCEPTED ==
|
||||||
upf_sess_set_ue_ip(sess, req->pdn_type.u8, pdr));
|
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 */
|
||||||
|
|
|
@ -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;;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue