Support for UPF HA - release/establish new PDU session

This commit is contained in:
Flander Bojan 2023-02-01 08:28:57 +00:00 committed by Sukchan Lee
parent bae3998c31
commit af07cc75ec
4 changed files with 57 additions and 7 deletions

View File

@ -377,9 +377,6 @@ int amf_namf_comm_handle_n1_n2_message_transfer(
return OGS_ERROR;
}
if (n1buf)
ogs_pkbuf_free(n1buf);
if (CM_IDLE(amf_ue)) {
if (n2buf)
ogs_pkbuf_free(n2buf);
@ -394,7 +391,7 @@ int amf_namf_comm_handle_n1_n2_message_transfer(
}
} else if (CM_CONNECTED(amf_ue)) {
r = nas_send_pdu_session_release_command(sess, NULL, n2buf);
r = nas_send_pdu_session_release_command(sess, n1buf, n2buf);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
} else {

View File

@ -371,6 +371,7 @@ typedef struct smf_sess_s {
#define SMF_NGAP_STATE_DELETE_TRIGGER_UE_REQUESTED 1
#define SMF_NGAP_STATE_DELETE_TRIGGER_PCF_INITIATED 2
#define SMF_NGAP_STATE_ERROR_INDICATION_RECEIVED_FROM_5G_AN 3
#define SMF_NGAP_STATE_DELETE_TRIGGER_SMF_INITIATED 4
struct {
int pdu_session_resource_release;
} ngap_state;

View File

@ -749,6 +749,8 @@ void smf_gsm_state_operational(ogs_fsm_t *s, smf_event_t *e)
uint8_t gtp1_cause, gtp2_cause;
bool release;
int state = 0;
ogs_assert(s);
ogs_assert(e);
@ -861,6 +863,7 @@ void smf_gsm_state_operational(ogs_fsm_t *s, smf_event_t *e)
SWITCH(sbi_message->h.service.name)
CASE(OGS_SBI_SERVICE_NAME_NPCF_SMPOLICYCONTROL)
stream = e->h.sbi.data;
state = e->h.sbi.state;
SWITCH(sbi_message->h.resource.component[0])
CASE(OGS_SBI_RESOURCE_NAME_SM_POLICIES)
@ -897,8 +900,31 @@ void smf_gsm_state_operational(ogs_fsm_t *s, smf_event_t *e)
break;
}
OGS_FSM_TRAN(&sess->sm,
&smf_gsm_state_wait_pfcp_deletion);
if (state == OGS_PFCP_DELETE_TRIGGER_SMF_INITIATED) {
OGS_FSM_TRAN(&sess->sm, smf_gsm_state_wait_5gc_n1_n2_release);
smf_n1_n2_message_transfer_param_t param;
memset(&param, 0, sizeof(param));
param.state = SMF_NETWORK_REQUESTED_PDU_SESSION_RELEASE;
sess->pti = OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED;
param.n1smbuf = gsm_build_pdu_session_release_command(
sess, OGS_5GSM_CAUSE_REACTIVATION_REQUESTED);
ogs_assert(param.n1smbuf);
param.n2smbuf =
ngap_build_pdu_session_resource_release_command_transfer(
sess, SMF_NGAP_STATE_DELETE_TRIGGER_SMF_INITIATED,
NGAP_Cause_PR_nas, NGAP_CauseNas_normal_release);
ogs_assert(param.n2smbuf);
param.skip_ind = false;
smf_namf_comm_send_n1_n2_message_transfer(sess, &param);
} else {
OGS_FSM_TRAN(&sess->sm,
&smf_gsm_state_wait_pfcp_deletion);
}
break;
DEFAULT
@ -1517,7 +1543,8 @@ void smf_gsm_state_wait_5gc_n1_n2_release(ogs_fsm_t *s, smf_event_t *e)
} else if (
ngap_state == SMF_NGAP_STATE_DELETE_TRIGGER_UE_REQUESTED ||
ngap_state == SMF_NGAP_STATE_DELETE_TRIGGER_PCF_INITIATED) {
ngap_state == SMF_NGAP_STATE_DELETE_TRIGGER_PCF_INITIATED ||
ngap_state == SMF_NGAP_STATE_DELETE_TRIGGER_SMF_INITIATED) {
ogs_assert(true == ogs_sbi_send_http_status_no_content(stream));

View File

@ -315,6 +315,31 @@ void smf_pfcp_state_associated(ogs_fsm_t *s, smf_event_t *e)
}
break;
case SMF_EVT_N4_NO_HEARTBEAT:
node = e->pfcp_node;
ogs_assert(node);
smf_ue_t *smf_ue = NULL, *next = NULL;;
ogs_list_for_each_safe(&smf_self()->smf_ue_list, next, smf_ue) {
smf_sess_t *sess = NULL, *next = NULL;;
ogs_assert(smf_ue);
ogs_list_for_each_safe(&smf_ue->sess_list, next, sess) {
ogs_assert(sess);
if (node == sess->pfcp_node) {
smf_npcf_smpolicycontrol_param_t param;
memset(&param, 0, sizeof(param));
ogs_assert(true ==
smf_sbi_discover_and_send(
OGS_SBI_SERVICE_TYPE_NPCF_SMPOLICYCONTROL, NULL,
smf_npcf_smpolicycontrol_build_delete,
sess, NULL, OGS_PFCP_DELETE_TRIGGER_SMF_INITIATED, &param));
}
}
}
ogs_warn("No Heartbeat from UPF [%s]:%d",
OGS_ADDR(addr, buf), OGS_PORT(addr));
OGS_FSM_TRAN(s, smf_pfcp_state_will_associate);