[SMF] Reject session on PFCP sess. est. timeout

This commit is contained in:
mitmitmitm 2023-07-10 14:13:28 +02:00 committed by Sukchan Lee
parent 9cef0f14e3
commit 6273ca5c43
5 changed files with 69 additions and 1 deletions

View File

@ -629,6 +629,9 @@ void smf_gsm_state_wait_pfcp_establishment(ogs_fsm_t *s, smf_event_t *e)
ogs_assert(sess); ogs_assert(sess);
switch (e->h.id) { switch (e->h.id) {
case OGS_FSM_ENTRY_SIG:
break;
case SMF_EVT_N4_MESSAGE: case SMF_EVT_N4_MESSAGE:
pfcp_xact = e->pfcp_xact; pfcp_xact = e->pfcp_xact;
ogs_assert(pfcp_xact); ogs_assert(pfcp_xact);
@ -717,6 +720,24 @@ void smf_gsm_state_wait_pfcp_establishment(ogs_fsm_t *s, smf_event_t *e)
ogs_error("cannot handle PFCP message type[%d]", ogs_error("cannot handle PFCP message type[%d]",
pfcp_message->h.type); pfcp_message->h.type);
} }
break;
case SMF_EVT_N4_TIMER:
switch (e->h.timer_id) {
case SMF_TIMER_PFCP_NO_ESTABLISHMENT_RESPONSE:
OGS_FSM_TRAN(s, smf_gsm_state_5gc_n1_n2_reject);
break;
default:
ogs_error("Unknown timer[%s:%d]",
ogs_timer_get_name(e->h.timer_id), e->h.timer_id);
}
break;
case OGS_FSM_EXIT_SIG:
break;
default:
ogs_error("Unknown event [%s]", smf_event_get_name(e));
} }
} }
@ -1191,6 +1212,17 @@ void smf_gsm_state_operational(ogs_fsm_t *s, smf_event_t *e)
} }
break; break;
case SMF_EVT_N4_TIMER:
switch (e->h.timer_id) {
case SMF_TIMER_PFCP_NO_ESTABLISHMENT_RESPONSE:
OGS_FSM_TRAN(s, smf_gsm_state_5gc_n1_n2_reject);
break;
default:
ogs_error("Unknown timer[%s:%d]",
ogs_timer_get_name(e->h.timer_id), e->h.timer_id);
}
break;
default: default:
ogs_error("Unknown event [%s]", smf_event_get_name(e)); ogs_error("Unknown event [%s]", smf_event_get_name(e));
} }

View File

@ -211,6 +211,8 @@ static void sess_5gc_timeout(ogs_pfcp_xact_t *xact, void *data)
uint8_t type; uint8_t type;
int trigger; int trigger;
char *strerror = NULL; char *strerror = NULL;
smf_event_t *e = NULL;
int rv;
ogs_assert(xact); ogs_assert(xact);
ogs_assert(data); ogs_assert(data);
@ -225,7 +227,19 @@ static void sess_5gc_timeout(ogs_pfcp_xact_t *xact, void *data)
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_warn("No PFCP session establishment response");
e = smf_event_new(SMF_EVT_N4_TIMER);
ogs_assert(e);
e->sess = sess;
e->h.timer_id = SMF_TIMER_PFCP_NO_ESTABLISHMENT_RESPONSE;
e->pfcp_node = sess->pfcp_node;
rv = ogs_queue_push(ogs_app()->queue, e);
if (rv != OGS_OK) {
ogs_error("ogs_queue_push() failed:%d", (int)rv);
ogs_event_free(e);
}
break; break;
case OGS_PFCP_SESSION_MODIFICATION_REQUEST_TYPE: case OGS_PFCP_SESSION_MODIFICATION_REQUEST_TYPE:
strerror = ogs_msprintf("[%s:%d] No PFCP session modification response", strerror = ogs_msprintf("[%s:%d] No PFCP session modification response",

View File

@ -73,6 +73,7 @@ void smf_pfcp_state_will_associate(ogs_fsm_t *s, smf_event_t *e)
ogs_pfcp_message_t *message = NULL; ogs_pfcp_message_t *message = NULL;
ogs_sockaddr_t *addr = NULL; ogs_sockaddr_t *addr = NULL;
smf_sess_t *sess;
ogs_assert(s); ogs_assert(s);
ogs_assert(e); ogs_assert(e);
@ -115,6 +116,15 @@ void smf_pfcp_state_will_associate(ogs_fsm_t *s, smf_event_t *e)
ogs_pfcp_cp_send_association_setup_request(node, node_timeout); ogs_pfcp_cp_send_association_setup_request(node, node_timeout);
break; break;
case SMF_TIMER_PFCP_NO_ESTABLISHMENT_RESPONSE:
sess = e->sess;
sess = smf_sess_cycle(sess);
if (!sess) {
ogs_warn("Session has already been removed");
break;
}
ogs_fsm_dispatch(&sess->sm, e);
break;
default: default:
ogs_error("Unknown timer[%s:%d]", ogs_error("Unknown timer[%s:%d]",
smf_timer_get_name(e->h.timer_id), e->h.timer_id); smf_timer_get_name(e->h.timer_id), e->h.timer_id);
@ -373,6 +383,15 @@ void smf_pfcp_state_associated(ogs_fsm_t *s, smf_event_t *e)
ogs_assert(OGS_OK == ogs_assert(OGS_OK ==
ogs_pfcp_send_heartbeat_request(node, node_timeout)); ogs_pfcp_send_heartbeat_request(node, node_timeout));
break; break;
case SMF_TIMER_PFCP_NO_ESTABLISHMENT_RESPONSE:
sess = e->sess;
sess = smf_sess_cycle(sess);
if (!sess) {
ogs_warn("Session has already been removed");
break;
}
ogs_fsm_dispatch(&sess->sm, e);
break;
default: default:
ogs_error("Unknown timer[%s:%d]", ogs_error("Unknown timer[%s:%d]",
smf_timer_get_name(e->h.timer_id), e->h.timer_id); smf_timer_get_name(e->h.timer_id), e->h.timer_id);

View File

@ -40,6 +40,8 @@ const char *smf_timer_get_name(int timer_id)
return "SMF_TIMER_PFCP_ASSOCIATION"; return "SMF_TIMER_PFCP_ASSOCIATION";
case SMF_TIMER_PFCP_NO_HEARTBEAT: case SMF_TIMER_PFCP_NO_HEARTBEAT:
return "SMF_TIMER_PFCP_NO_HEARTBEAT"; return "SMF_TIMER_PFCP_NO_HEARTBEAT";
case SMF_TIMER_PFCP_NO_ESTABLISHMENT_RESPONSE:
return "SMF_TIMER_PFCP_NO_ESTABLISHMENT_RESPONSE";
default: default:
break; break;
} }

View File

@ -32,6 +32,7 @@ typedef enum {
SMF_TIMER_PFCP_ASSOCIATION, SMF_TIMER_PFCP_ASSOCIATION,
SMF_TIMER_PFCP_NO_HEARTBEAT, SMF_TIMER_PFCP_NO_HEARTBEAT,
SMF_TIMER_PFCP_NO_ESTABLISHMENT_RESPONSE,
MAX_NUM_OF_SMF_TIMER, MAX_NUM_OF_SMF_TIMER,