forked from acouzens/open5gs
update it
This commit is contained in:
parent
67fd2efd76
commit
6710c13a44
|
@ -75,6 +75,10 @@ static ogs_inline void *ogs_list_prev(void *lnode)
|
||||||
for (node = ogs_list_first(list); (node); \
|
for (node = ogs_list_first(list); (node); \
|
||||||
node = ogs_list_next(node))
|
node = ogs_list_next(node))
|
||||||
|
|
||||||
|
#define ogs_list_reverse_for_each(list, node) \
|
||||||
|
for (node = ogs_list_last(list); (node); \
|
||||||
|
node = ogs_list_prev(node))
|
||||||
|
|
||||||
#define ogs_list_for_each_entry(list, node, member) \
|
#define ogs_list_for_each_entry(list, node, member) \
|
||||||
for (node = ogs_list_entry(ogs_list_first(list), typeof(*node), member); \
|
for (node = ogs_list_entry(ogs_list_first(list), typeof(*node), member); \
|
||||||
(&node->member); \
|
(&node->member); \
|
||||||
|
|
|
@ -107,12 +107,13 @@ typedef struct ogs_pfcp_xact_s {
|
||||||
|
|
||||||
uint64_t modify_flags;
|
uint64_t modify_flags;
|
||||||
|
|
||||||
#define OGS_PFCP_DELETE_TRIGGER_UE_REQUESTED 1
|
#define OGS_PFCP_DELETE_TRIGGER_LOCAL_INITIATED 1
|
||||||
#define OGS_PFCP_DELETE_TRIGGER_PCF_INITIATED 2
|
#define OGS_PFCP_DELETE_TRIGGER_UE_REQUESTED 2
|
||||||
#define OGS_PFCP_DELETE_TRIGGER_RAN_INITIATED 3
|
#define OGS_PFCP_DELETE_TRIGGER_PCF_INITIATED 3
|
||||||
#define OGS_PFCP_DELETE_TRIGGER_SMF_INITIATED 4
|
#define OGS_PFCP_DELETE_TRIGGER_RAN_INITIATED 4
|
||||||
#define OGS_PFCP_DELETE_TRIGGER_AMF_RELEASE_SM_CONTEXT 5
|
#define OGS_PFCP_DELETE_TRIGGER_SMF_INITIATED 5
|
||||||
#define OGS_PFCP_DELETE_TRIGGER_AMF_UPDATE_SM_CONTEXT 6
|
#define OGS_PFCP_DELETE_TRIGGER_AMF_RELEASE_SM_CONTEXT 6
|
||||||
|
#define OGS_PFCP_DELETE_TRIGGER_AMF_UPDATE_SM_CONTEXT 7
|
||||||
int delete_trigger;
|
int delete_trigger;
|
||||||
|
|
||||||
ogs_list_t pdr_to_create_list;
|
ogs_list_t pdr_to_create_list;
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "context.h"
|
#include "context.h"
|
||||||
|
#include "pfcp-path.h"
|
||||||
|
|
||||||
static smf_context_t self;
|
static smf_context_t self;
|
||||||
static ogs_diam_config_t g_diam_conf;
|
static ogs_diam_config_t g_diam_conf;
|
||||||
|
@ -1138,7 +1139,7 @@ smf_sess_t *smf_sess_add_by_gtp1_message(ogs_gtp1_message_t *message)
|
||||||
|
|
||||||
sess = smf_sess_find_by_apn(smf_ue, apn, req->rat_type.u8);
|
sess = smf_sess_find_by_apn(smf_ue, apn, req->rat_type.u8);
|
||||||
if (sess) {
|
if (sess) {
|
||||||
ogs_warn("OLD Session Release [IMSI:%s,APN:%s]",
|
ogs_warn("OLD Session Will Release [IMSI:%s,APN:%s]",
|
||||||
smf_ue->imsi_bcd, sess->session.name);
|
smf_ue->imsi_bcd, sess->session.name);
|
||||||
smf_sess_remove(sess);
|
smf_sess_remove(sess);
|
||||||
}
|
}
|
||||||
|
@ -1202,7 +1203,7 @@ smf_sess_t *smf_sess_add_by_gtp2_message(ogs_gtp2_message_t *message)
|
||||||
|
|
||||||
sess = smf_sess_find_by_apn(smf_ue, apn, req->rat_type.u8);
|
sess = smf_sess_find_by_apn(smf_ue, apn, req->rat_type.u8);
|
||||||
if (sess) {
|
if (sess) {
|
||||||
ogs_info("OLD Session Release [IMSI:%s,APN:%s]",
|
ogs_info("OLD Session Will Release [IMSI:%s,APN:%s]",
|
||||||
smf_ue->imsi_bcd, sess->session.name);
|
smf_ue->imsi_bcd, sess->session.name);
|
||||||
smf_sess_remove(sess);
|
smf_sess_remove(sess);
|
||||||
}
|
}
|
||||||
|
@ -1308,7 +1309,7 @@ smf_sess_t *smf_sess_add_by_sbi_message(ogs_sbi_message_t *message)
|
||||||
|
|
||||||
sess = smf_sess_find_by_psi(smf_ue, SmContextCreateData->pdu_session_id);
|
sess = smf_sess_find_by_psi(smf_ue, SmContextCreateData->pdu_session_id);
|
||||||
if (sess) {
|
if (sess) {
|
||||||
ogs_warn("OLD Session Release [SUPI:%s,PDU Session identity:%d]",
|
ogs_warn("OLD Session Will Release [SUPI:%s,PDU Session identity:%d]",
|
||||||
SmContextCreateData->supi, SmContextCreateData->pdu_session_id);
|
SmContextCreateData->supi, SmContextCreateData->pdu_session_id);
|
||||||
smf_sess_remove(sess);
|
smf_sess_remove(sess);
|
||||||
}
|
}
|
||||||
|
@ -1503,7 +1504,7 @@ smf_sess_t *smf_sess_find_by_error_indication_report(
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
ogs_list_for_each(&smf_ue->sess_list, sess) {
|
ogs_list_reverse_for_each(&smf_ue->sess_list, sess) {
|
||||||
if (teid == sess->gnb_n3_teid) {
|
if (teid == sess->gnb_n3_teid) {
|
||||||
if (len == OGS_IPV4_LEN && sess->gnb_n3_ip.ipv4 &&
|
if (len == OGS_IPV4_LEN && sess->gnb_n3_ip.ipv4 &&
|
||||||
memcmp(addr, &sess->gnb_n3_ip.addr, len) == 0) {
|
memcmp(addr, &sess->gnb_n3_ip.addr, len) == 0) {
|
||||||
|
@ -1656,7 +1657,7 @@ smf_sess_t *smf_sess_find_by_apn(smf_ue_t *smf_ue, char *apn, uint8_t rat_type)
|
||||||
ogs_assert(smf_ue);
|
ogs_assert(smf_ue);
|
||||||
ogs_assert(apn);
|
ogs_assert(apn);
|
||||||
|
|
||||||
ogs_list_for_each(&smf_ue->sess_list, sess) {
|
ogs_list_reverse_for_each(&smf_ue->sess_list, sess) {
|
||||||
if (ogs_strcasecmp(sess->session.name, apn) == 0 &&
|
if (ogs_strcasecmp(sess->session.name, apn) == 0 &&
|
||||||
sess->gtp_rat_type == rat_type)
|
sess->gtp_rat_type == rat_type)
|
||||||
return sess;
|
return sess;
|
||||||
|
@ -1672,7 +1673,7 @@ smf_sess_t *smf_sess_find_by_psi(smf_ue_t *smf_ue, uint8_t psi)
|
||||||
ogs_assert(smf_ue);
|
ogs_assert(smf_ue);
|
||||||
ogs_assert(psi != OGS_NAS_PDU_SESSION_IDENTITY_UNASSIGNED);
|
ogs_assert(psi != OGS_NAS_PDU_SESSION_IDENTITY_UNASSIGNED);
|
||||||
|
|
||||||
ogs_list_for_each(&smf_ue->sess_list, sess) {
|
ogs_list_reverse_for_each(&smf_ue->sess_list, sess) {
|
||||||
if (sess->psi == psi)
|
if (sess->psi == psi)
|
||||||
return sess;
|
return sess;
|
||||||
}
|
}
|
||||||
|
|
|
@ -160,7 +160,11 @@ static bool send_sbi_message_from_delete_trigger(
|
||||||
ogs_sbi_message_t sendmsg;
|
ogs_sbi_message_t sendmsg;
|
||||||
ogs_sbi_response_t *response = NULL;
|
ogs_sbi_response_t *response = NULL;
|
||||||
|
|
||||||
if (trigger == OGS_PFCP_DELETE_TRIGGER_UE_REQUESTED) {
|
if (trigger == OGS_PFCP_DELETE_TRIGGER_LOCAL_INITIATED) {
|
||||||
|
|
||||||
|
/* Nothing */
|
||||||
|
|
||||||
|
} else if (trigger == OGS_PFCP_DELETE_TRIGGER_UE_REQUESTED) {
|
||||||
ogs_pkbuf_t *n1smbuf = NULL, *n2smbuf = NULL;
|
ogs_pkbuf_t *n1smbuf = NULL, *n2smbuf = NULL;
|
||||||
|
|
||||||
n1smbuf = gsm_build_pdu_session_release_command(
|
n1smbuf = gsm_build_pdu_session_release_command(
|
||||||
|
@ -1215,14 +1219,23 @@ void smf_gsm_state_wait_pfcp_deletion(ogs_fsm_t *s, smf_event_t *e)
|
||||||
&pfcp_message->pfcp_session_deletion_response);
|
&pfcp_message->pfcp_session_deletion_response);
|
||||||
if (status != OGS_SBI_HTTP_STATUS_OK) {
|
if (status != OGS_SBI_HTTP_STATUS_OK) {
|
||||||
ogs_error(
|
ogs_error(
|
||||||
"smf_5gc_n4_handle_session_deletion_response() failed");
|
"[%d] smf_5gc_n4_handle_session_deletion_response() "
|
||||||
|
"failed", trigger);
|
||||||
|
|
||||||
|
OGS_FSM_TRAN(s, smf_gsm_state_session_will_release);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (send_sbi_message_from_delete_trigger(
|
if (send_sbi_message_from_delete_trigger(
|
||||||
sess, stream, trigger) == true) {
|
sess, stream, trigger) == true) {
|
||||||
|
|
||||||
if (trigger == OGS_PFCP_DELETE_TRIGGER_UE_REQUESTED ||
|
if (trigger == OGS_PFCP_DELETE_TRIGGER_LOCAL_INITIATED) {
|
||||||
|
|
||||||
|
ogs_warn("OLD Session Released");
|
||||||
|
OGS_FSM_TRAN(s, smf_gsm_state_session_will_release);
|
||||||
|
|
||||||
|
} else if (
|
||||||
|
trigger == OGS_PFCP_DELETE_TRIGGER_UE_REQUESTED ||
|
||||||
trigger == OGS_PFCP_DELETE_TRIGGER_PCF_INITIATED) {
|
trigger == OGS_PFCP_DELETE_TRIGGER_PCF_INITIATED) {
|
||||||
|
|
||||||
OGS_FSM_TRAN(s, smf_gsm_state_wait_5gc_n1_n2_release);
|
OGS_FSM_TRAN(s, smf_gsm_state_wait_5gc_n1_n2_release);
|
||||||
|
@ -1234,9 +1247,6 @@ void smf_gsm_state_wait_pfcp_deletion(ogs_fsm_t *s, smf_event_t *e)
|
||||||
|
|
||||||
OGS_FSM_TRAN(s, smf_gsm_state_session_will_release);
|
OGS_FSM_TRAN(s, smf_gsm_state_session_will_release);
|
||||||
|
|
||||||
} else if (trigger ==
|
|
||||||
OGS_PFCP_DELETE_TRIGGER_PCF_INITIATED) {
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
ogs_fatal("Unknown trigger [%d]", trigger);
|
ogs_fatal("Unknown trigger [%d]", trigger);
|
||||||
ogs_assert_if_reached();
|
ogs_assert_if_reached();
|
||||||
|
|
|
@ -641,9 +641,13 @@ int smf_5gc_n4_handle_session_deletion_response(
|
||||||
|
|
||||||
if (status != OGS_SBI_HTTP_STATUS_OK) {
|
if (status != OGS_SBI_HTTP_STATUS_OK) {
|
||||||
char *strerror = ogs_msprintf(
|
char *strerror = ogs_msprintf(
|
||||||
"PFCP Cause [%d] : Not Accepted", rsp->cause.u8);
|
"[%d] PFCP Cause [%d] : Not Accepted", trigger, rsp->cause.u8);
|
||||||
|
|
||||||
if (trigger == OGS_PFCP_DELETE_TRIGGER_UE_REQUESTED ||
|
if (trigger == OGS_PFCP_DELETE_TRIGGER_LOCAL_INITIATED) {
|
||||||
|
|
||||||
|
/* Nothing */
|
||||||
|
|
||||||
|
} else if (trigger == OGS_PFCP_DELETE_TRIGGER_UE_REQUESTED ||
|
||||||
trigger == OGS_PFCP_DELETE_TRIGGER_AMF_UPDATE_SM_CONTEXT) {
|
trigger == OGS_PFCP_DELETE_TRIGGER_AMF_UPDATE_SM_CONTEXT) {
|
||||||
ogs_assert(stream);
|
ogs_assert(stream);
|
||||||
smf_sbi_send_sm_context_update_error(
|
smf_sbi_send_sm_context_update_error(
|
||||||
|
|
|
@ -169,6 +169,7 @@ static void sess_5gc_timeout(ogs_pfcp_xact_t *xact, void *data)
|
||||||
smf_sess_t *sess = NULL;
|
smf_sess_t *sess = NULL;
|
||||||
ogs_sbi_stream_t *stream = NULL;
|
ogs_sbi_stream_t *stream = NULL;
|
||||||
uint8_t type;
|
uint8_t type;
|
||||||
|
int trigger;
|
||||||
char *strerror = NULL;
|
char *strerror = NULL;
|
||||||
|
|
||||||
ogs_assert(xact);
|
ogs_assert(xact);
|
||||||
|
@ -176,12 +177,12 @@ static void sess_5gc_timeout(ogs_pfcp_xact_t *xact, void *data)
|
||||||
|
|
||||||
sess = data;
|
sess = data;
|
||||||
ogs_assert(sess);
|
ogs_assert(sess);
|
||||||
stream = xact->assoc_stream;
|
|
||||||
ogs_assert(stream);
|
|
||||||
smf_ue = sess->smf_ue;
|
smf_ue = sess->smf_ue;
|
||||||
ogs_assert(smf_ue);
|
ogs_assert(smf_ue);
|
||||||
|
|
||||||
|
stream = xact->assoc_stream;
|
||||||
type = xact->seq[0].type;
|
type = xact->seq[0].type;
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case OGS_PFCP_SESSION_ESTABLISHMENT_REQUEST_TYPE:
|
case OGS_PFCP_SESSION_ESTABLISHMENT_REQUEST_TYPE:
|
||||||
ogs_error("No PFCP session establishment response");
|
ogs_error("No PFCP session establishment response");
|
||||||
|
@ -192,21 +193,43 @@ static void sess_5gc_timeout(ogs_pfcp_xact_t *xact, void *data)
|
||||||
ogs_assert(strerror);
|
ogs_assert(strerror);
|
||||||
|
|
||||||
ogs_error("%s", strerror);
|
ogs_error("%s", strerror);
|
||||||
|
ogs_assert(stream);
|
||||||
smf_sbi_send_sm_context_update_error(stream,
|
smf_sbi_send_sm_context_update_error(stream,
|
||||||
OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT,
|
OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT,
|
||||||
strerror, NULL, NULL, NULL);
|
strerror, NULL, NULL, NULL);
|
||||||
ogs_free(strerror);
|
ogs_free(strerror);
|
||||||
break;
|
break;
|
||||||
case OGS_PFCP_SESSION_DELETION_REQUEST_TYPE:
|
case OGS_PFCP_SESSION_DELETION_REQUEST_TYPE:
|
||||||
strerror = ogs_msprintf("[%s:%d] No PFCP session deletion response",
|
trigger = xact->delete_trigger;
|
||||||
smf_ue->supi, sess->psi);
|
ogs_assert(trigger);
|
||||||
|
|
||||||
|
strerror = ogs_msprintf("[%s:%d] No PFCP session deletion response[%d]",
|
||||||
|
smf_ue->supi, sess->psi, trigger);
|
||||||
ogs_assert(strerror);
|
ogs_assert(strerror);
|
||||||
|
|
||||||
ogs_error("%s", strerror);
|
ogs_error("%s", strerror);
|
||||||
ogs_assert(true ==
|
|
||||||
ogs_sbi_server_send_error(stream,
|
if (trigger == OGS_PFCP_DELETE_TRIGGER_LOCAL_INITIATED ||
|
||||||
OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT, NULL, strerror, NULL));
|
trigger == OGS_PFCP_DELETE_TRIGGER_PCF_INITIATED) {
|
||||||
|
|
||||||
|
/* Nothing */
|
||||||
|
|
||||||
|
} else if (trigger == OGS_PFCP_DELETE_TRIGGER_UE_REQUESTED ||
|
||||||
|
trigger == OGS_PFCP_DELETE_TRIGGER_AMF_UPDATE_SM_CONTEXT ||
|
||||||
|
trigger == OGS_PFCP_DELETE_TRIGGER_AMF_RELEASE_SM_CONTEXT) {
|
||||||
|
|
||||||
|
ogs_assert(stream);
|
||||||
|
ogs_assert(true ==
|
||||||
|
ogs_sbi_server_send_error(stream,
|
||||||
|
OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT, NULL, strerror, NULL));
|
||||||
|
} else {
|
||||||
|
ogs_fatal("Unknown trigger [%d]", trigger);
|
||||||
|
ogs_assert_if_reached();
|
||||||
|
}
|
||||||
|
|
||||||
ogs_free(strerror);
|
ogs_free(strerror);
|
||||||
|
|
||||||
|
smf_sess_remove(sess);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
ogs_error("Not implemented [type:%d]", type);
|
ogs_error("Not implemented [type:%d]", type);
|
||||||
|
|
|
@ -211,7 +211,7 @@ uint8_t smf_s5c_handle_create_session_request(
|
||||||
if (eutran_sess) {
|
if (eutran_sess) {
|
||||||
/* Need to check handover is possible */
|
/* Need to check handover is possible */
|
||||||
int eutran_session_count = 0;
|
int eutran_session_count = 0;
|
||||||
ogs_list_for_each(&smf_ue->sess_list, eutran_sess) {
|
ogs_list_reverse_for_each(&smf_ue->sess_list, eutran_sess) {
|
||||||
if (eutran_sess->gtp_rat_type != OGS_GTP2_RAT_TYPE_EUTRAN)
|
if (eutran_sess->gtp_rat_type != OGS_GTP2_RAT_TYPE_EUTRAN)
|
||||||
continue;
|
continue;
|
||||||
if (strcmp(eutran_sess->session.name, sess->session.name) == 0)
|
if (strcmp(eutran_sess->session.name, sess->session.name) == 0)
|
||||||
|
|
Loading…
Reference in New Issue