Compare commits

...

2 Commits

Author SHA1 Message Date
Sukchan Lee 3064861fe0 [PFCP/GTP] Incorrect TEI/SEID=0 (#3043)
If eg. PCRF or AAA diameter link is not yet ready (eg. PCRF crashed),
and a client sends a CreateSessionRequest announcing its ow F-TEID,
then open5gs-smfd answers with Create Session Response Cause="Remote peer not responding",
but it is not setting the received F-TEID in the header of the response,
instead it sends with TEID=0.

As a result, the peer cannot match the CreateSessionResponse,
and needs to rely on its own timeout timer to figure out
that specific request failed.

See 3GPP TS 29.274 5.5 Usage of the GTPv2-C Header:

```
Bit 4 represents a "T" flag, which indicates if TEID field is present in the GTP-C header or not. If the "T" flag is
set to 0, then the TEID field shall not be present in the GTP-C header. If the "T" flag is set to 1, then the TEID
field shall immediately follow the Length field, in octets 5 to 8. Apart from the Echo Request, Echo Response
and Version Not Supported Indication messages, in all EPC specific messages the value of the "T" flag shall be
set to "1".
```

This happens with Delete Session Requests and can happen with any PFCP message.

I've fixed TEID/SEID to send the value in the reponse message as is if it was received.
2024-04-05 21:40:45 +09:00
Pau Espin 990bfe96a8 [SMF] Gy: Check Multiple-Services-Credit-Control Result-Code in CCA-I
This is the continuation of commit
12158eebb8, which only checked the code in
CCA[Update], but not in CCA[Initial].

The handling in CCA[Initial] is a bit more complex since depending on
the outcome, we may end up with a Result-Code != SUCCESS in MSCC but the
session may still be created at the OCS because the message Result-Code
= SUCCESS. In that scenario, we want to abort setting up the PDN session
but we still need to make sure we terminate the Gy session that was just
created.
2024-04-05 21:35:36 +09:00
24 changed files with 440 additions and 259 deletions

View File

@ -233,7 +233,7 @@ MME-frDi = 127.0.0.2 :3868 for S6a
SGWC-gtpc = 127.0.0.3 :2123 for S11
SGWC-pfcp = 127.0.0.3 :8805 for Sxa
SMF-gtpc = 127.0.0.4 :2123 for S5c, N11
SMF-gtpc = 127.0.0.4 :2123 for S5c
SMF-gtpu = 127.0.0.4 :2152 for N4u (Sxu)
SMF-pfcp = 127.0.0.4 :8805 for N4 (Sxb)
SMF-frDi = 127.0.0.4 :3868 for Gx auth

View File

@ -60,9 +60,13 @@ static uint8_t esm_cause_from_gtp(uint8_t gtp_cause)
}
void mme_s11_handle_echo_request(
ogs_gtp_xact_t *xact, ogs_gtp2_echo_request_t *req)
ogs_gtp_xact_t *xact, ogs_gtp2_message_t *gtp2_message)
{
ogs_gtp2_echo_request_t *req = NULL;
ogs_assert(xact);
ogs_assert(gtp2_message);
req = &gtp2_message->echo_request;
ogs_assert(req);
ogs_debug("Receiving Echo Request");
@ -72,14 +76,14 @@ void mme_s11_handle_echo_request(
}
void mme_s11_handle_echo_response(
ogs_gtp_xact_t *xact, ogs_gtp2_echo_response_t *rsp)
ogs_gtp_xact_t *xact, ogs_gtp2_message_t *gtp2_message)
{
/* Not Implemented */
}
void mme_s11_handle_create_session_response(
ogs_gtp_xact_t *xact, mme_ue_t *mme_ue_from_teid,
ogs_gtp2_create_session_response_t *rsp)
ogs_gtp2_message_t *gtp2_message)
{
int i, r, rv;
uint8_t cause_value = OGS_GTP2_CAUSE_UNDEFINED_VALUE;
@ -100,6 +104,10 @@ void mme_s11_handle_create_session_response(
uint16_t decoded = 0;
int create_action = 0;
ogs_gtp2_create_session_response_t *rsp = NULL;
ogs_assert(gtp2_message);
rsp = &gtp2_message->create_session_response;
ogs_assert(rsp);
ogs_debug("Create Session Response");
@ -472,7 +480,7 @@ void mme_s11_handle_create_session_response(
void mme_s11_handle_modify_bearer_response(
ogs_gtp_xact_t *xact, mme_ue_t *mme_ue_from_teid,
ogs_gtp2_modify_bearer_response_t *rsp)
ogs_gtp2_message_t *gtp2_message)
{
int r, rv;
uint8_t cause_value = OGS_GTP2_CAUSE_UNDEFINED_VALUE;
@ -482,6 +490,10 @@ void mme_s11_handle_modify_bearer_response(
mme_ue_t *mme_ue = NULL;
sgw_ue_t *sgw_ue = NULL;
ogs_gtp2_modify_bearer_response_t *rsp = NULL;
ogs_assert(gtp2_message);
rsp = &gtp2_message->modify_bearer_response;
ogs_assert(rsp);
ogs_debug("Modify Bearer Response");
@ -586,7 +598,7 @@ void mme_s11_handle_modify_bearer_response(
void mme_s11_handle_delete_session_response(
ogs_gtp_xact_t *xact, mme_ue_t *mme_ue_from_teid,
ogs_gtp2_delete_session_response_t *rsp)
ogs_gtp2_message_t *gtp2_message)
{
int r, rv;
uint8_t cause_value = OGS_GTP2_CAUSE_UNDEFINED_VALUE;
@ -595,6 +607,10 @@ void mme_s11_handle_delete_session_response(
mme_sess_t *sess = NULL;
mme_ue_t *mme_ue = NULL;
ogs_gtp2_delete_session_response_t *rsp = NULL;
ogs_assert(gtp2_message);
rsp = &gtp2_message->delete_session_response;
ogs_assert(rsp);
ogs_debug("Delete Session Response");
@ -778,7 +794,7 @@ void mme_s11_handle_delete_session_response(
void mme_s11_handle_create_bearer_request(
ogs_gtp_xact_t *xact, mme_ue_t *mme_ue,
ogs_gtp2_create_bearer_request_t *req)
ogs_gtp2_message_t *gtp2_message)
{
int r;
uint8_t cause_value = OGS_GTP2_CAUSE_UNDEFINED_VALUE;
@ -790,7 +806,11 @@ void mme_s11_handle_create_bearer_request(
ogs_gtp2_f_teid_t *pgw_s5u_teid = NULL;
ogs_gtp2_bearer_qos_t bearer_qos;
ogs_gtp2_create_bearer_request_t *req = NULL;
ogs_assert(xact);
ogs_assert(gtp2_message);
req = &gtp2_message->create_bearer_request;
ogs_assert(req);
ogs_debug("Create Bearer Request");
@ -823,7 +843,8 @@ void mme_s11_handle_create_bearer_request(
}
if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
ogs_gtp2_send_error_message(xact, sgw_ue ? sgw_ue->sgw_s11_teid : 0,
ogs_gtp2_send_error_message(xact,
sgw_ue ? sgw_ue->sgw_s11_teid : gtp2_message->h.teid,
OGS_GTP2_CREATE_BEARER_RESPONSE_TYPE, cause_value);
return;
}
@ -859,7 +880,8 @@ void mme_s11_handle_create_bearer_request(
}
if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
ogs_gtp2_send_error_message(xact, sgw_ue ? sgw_ue->sgw_s11_teid : 0,
ogs_gtp2_send_error_message(xact,
sgw_ue ? sgw_ue->sgw_s11_teid : gtp2_message->h.teid,
OGS_GTP2_CREATE_BEARER_RESPONSE_TYPE, cause_value);
return;
}
@ -982,7 +1004,7 @@ void mme_s11_handle_create_bearer_request(
void mme_s11_handle_update_bearer_request(
ogs_gtp_xact_t *xact, mme_ue_t *mme_ue,
ogs_gtp2_update_bearer_request_t *req)
ogs_gtp2_message_t *gtp2_message)
{
int r;
uint8_t cause_value = OGS_GTP2_CAUSE_UNDEFINED_VALUE;
@ -991,7 +1013,11 @@ void mme_s11_handle_update_bearer_request(
sgw_ue_t *sgw_ue = NULL;
ogs_gtp2_bearer_qos_t bearer_qos;
ogs_gtp2_update_bearer_request_t *req = NULL;
ogs_assert(xact);
ogs_assert(gtp2_message);
req = &gtp2_message->update_bearer_request;
ogs_assert(req);
ogs_debug("Update Bearer Request");
@ -1028,7 +1054,8 @@ void mme_s11_handle_update_bearer_request(
}
if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
ogs_gtp2_send_error_message(xact, sgw_ue ? sgw_ue->sgw_s11_teid : 0,
ogs_gtp2_send_error_message(xact,
sgw_ue ? sgw_ue->sgw_s11_teid : gtp2_message->h.teid,
OGS_GTP2_UPDATE_BEARER_RESPONSE_TYPE, cause_value);
return;
}
@ -1129,7 +1156,7 @@ void mme_s11_handle_update_bearer_request(
void mme_s11_handle_delete_bearer_request(
ogs_gtp_xact_t *xact, mme_ue_t *mme_ue,
ogs_gtp2_delete_bearer_request_t *req)
ogs_gtp2_message_t *gtp2_message)
{
int r;
uint8_t cause_value = OGS_GTP2_CAUSE_UNDEFINED_VALUE;
@ -1138,7 +1165,11 @@ void mme_s11_handle_delete_bearer_request(
mme_sess_t *sess = NULL;
sgw_ue_t *sgw_ue = NULL;
ogs_gtp2_delete_bearer_request_t *req = NULL;
ogs_assert(xact);
ogs_assert(gtp2_message);
req = &gtp2_message->delete_bearer_request;
ogs_assert(req);
ogs_debug("Delete Bearer Request");
@ -1199,7 +1230,8 @@ void mme_s11_handle_delete_bearer_request(
}
if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
ogs_gtp2_send_error_message(xact, sgw_ue ? sgw_ue->sgw_s11_teid : 0,
ogs_gtp2_send_error_message(xact,
sgw_ue ? sgw_ue->sgw_s11_teid : gtp2_message->h.teid,
OGS_GTP2_DELETE_BEARER_RESPONSE_TYPE,
OGS_GTP2_CAUSE_CONTEXT_NOT_FOUND);
return;
@ -1250,7 +1282,7 @@ void mme_s11_handle_delete_bearer_request(
void mme_s11_handle_release_access_bearers_response(
ogs_gtp_xact_t *xact, mme_ue_t *mme_ue_from_teid,
ogs_gtp2_release_access_bearers_response_t *rsp)
ogs_gtp2_message_t *gtp2_message)
{
int r, rv;
uint8_t cause_value = OGS_GTP2_CAUSE_UNDEFINED_VALUE;
@ -1262,6 +1294,10 @@ void mme_s11_handle_release_access_bearers_response(
mme_sess_t *sess = NULL;
mme_bearer_t *bearer = NULL;
ogs_gtp2_release_access_bearers_response_t *rsp = NULL;
ogs_assert(gtp2_message);
rsp = &gtp2_message->release_access_bearers_response;
ogs_assert(rsp);
ogs_debug("Release Access Bearers Response");
@ -1415,7 +1451,7 @@ void mme_s11_handle_release_access_bearers_response(
void mme_s11_handle_downlink_data_notification(
ogs_gtp_xact_t *xact, mme_ue_t *mme_ue,
ogs_gtp2_downlink_data_notification_t *noti)
ogs_gtp2_message_t *gtp2_message)
{
uint8_t cause_value = OGS_GTP2_CAUSE_UNDEFINED_VALUE;
int r;
@ -1423,7 +1459,11 @@ void mme_s11_handle_downlink_data_notification(
mme_bearer_t *bearer = NULL;
sgw_ue_t *sgw_ue = NULL;
ogs_gtp2_downlink_data_notification_t *noti = NULL;
ogs_assert(xact);
ogs_assert(gtp2_message);
noti = &gtp2_message->downlink_data_notification;
ogs_assert(noti);
ogs_debug("Downlink Data Notification");
@ -1456,7 +1496,8 @@ void mme_s11_handle_downlink_data_notification(
}
if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
ogs_gtp2_send_error_message(xact, sgw_ue ? sgw_ue->sgw_s11_teid : 0,
ogs_gtp2_send_error_message(xact,
sgw_ue ? sgw_ue->sgw_s11_teid : gtp2_message->h.teid,
OGS_GTP2_DOWNLINK_DATA_NOTIFICATION_ACKNOWLEDGE_TYPE,
OGS_GTP2_CAUSE_CONTEXT_NOT_FOUND);
return;
@ -1558,7 +1599,7 @@ void mme_s11_handle_downlink_data_notification(
void mme_s11_handle_create_indirect_data_forwarding_tunnel_response(
ogs_gtp_xact_t *xact, mme_ue_t *mme_ue_from_teid,
ogs_gtp2_create_indirect_data_forwarding_tunnel_response_t *rsp)
ogs_gtp2_message_t *gtp2_message)
{
int i, r, rv;
uint8_t cause_value = OGS_GTP2_CAUSE_UNDEFINED_VALUE;
@ -1570,6 +1611,10 @@ void mme_s11_handle_create_indirect_data_forwarding_tunnel_response(
ogs_gtp2_f_teid_t *teid = NULL;
ogs_gtp2_create_indirect_data_forwarding_tunnel_response_t *rsp = NULL;
ogs_assert(gtp2_message);
rsp = &gtp2_message->create_indirect_data_forwarding_tunnel_response;
ogs_assert(rsp);
ogs_debug("Create Indirect Data Forwarding Tunnel Response");
@ -1694,7 +1739,7 @@ void mme_s11_handle_create_indirect_data_forwarding_tunnel_response(
void mme_s11_handle_delete_indirect_data_forwarding_tunnel_response(
ogs_gtp_xact_t *xact, mme_ue_t *mme_ue_from_teid,
ogs_gtp2_delete_indirect_data_forwarding_tunnel_response_t *rsp)
ogs_gtp2_message_t *gtp2_message)
{
int r, rv;
uint8_t cause_value = OGS_GTP2_CAUSE_UNDEFINED_VALUE;
@ -1703,6 +1748,10 @@ void mme_s11_handle_delete_indirect_data_forwarding_tunnel_response(
mme_ue_t *mme_ue = NULL;
sgw_ue_t *sgw_ue = NULL;
ogs_gtp2_delete_indirect_data_forwarding_tunnel_response_t *rsp = NULL;
ogs_assert(gtp2_message);
rsp = &gtp2_message->delete_indirect_data_forwarding_tunnel_response;
ogs_assert(rsp);
ogs_debug("Delete Indirect Data Forwarding Tunnel Response");
@ -1804,7 +1853,7 @@ void mme_s11_handle_delete_indirect_data_forwarding_tunnel_response(
void mme_s11_handle_bearer_resource_failure_indication(
ogs_gtp_xact_t *xact, mme_ue_t *mme_ue_from_teid,
ogs_gtp2_bearer_resource_failure_indication_t *ind)
ogs_gtp2_message_t *gtp2_message)
{
int r, rv;
uint8_t cause_value = OGS_GTP2_CAUSE_UNDEFINED_VALUE;
@ -1814,6 +1863,12 @@ void mme_s11_handle_bearer_resource_failure_indication(
mme_ue_t *mme_ue = NULL;
sgw_ue_t *sgw_ue = NULL;
ogs_gtp2_bearer_resource_failure_indication_t *ind = NULL;
ogs_assert(gtp2_message);
ind = &gtp2_message->bearer_resource_failure_indication;
ogs_assert(ind);
ogs_debug("Bearer Resource Failure Indication");
/********************

View File

@ -27,44 +27,44 @@ extern "C" {
#endif
void mme_s11_handle_echo_request(
ogs_gtp_xact_t *xact, ogs_gtp2_echo_request_t *req);
ogs_gtp_xact_t *xact, ogs_gtp2_message_t *gtp2_message);
void mme_s11_handle_echo_response(
ogs_gtp_xact_t *xact, ogs_gtp2_echo_response_t *rsp);
ogs_gtp_xact_t *xact, ogs_gtp2_message_t *gtp2_message);
void mme_s11_handle_create_session_response(
ogs_gtp_xact_t *xact, mme_ue_t *mme_ue,
ogs_gtp2_create_session_response_t *rsp);
ogs_gtp2_message_t *gtp2_message);
void mme_s11_handle_modify_bearer_response(
ogs_gtp_xact_t *xact, mme_ue_t *mme_ue,
ogs_gtp2_modify_bearer_response_t *rsp);
ogs_gtp2_message_t *gtp2_message);
void mme_s11_handle_delete_session_response(
ogs_gtp_xact_t *xact, mme_ue_t *mme_ue,
ogs_gtp2_delete_session_response_t *rsp);
ogs_gtp2_message_t *gtp2_message);
void mme_s11_handle_create_bearer_request(
ogs_gtp_xact_t *xact, mme_ue_t *mme_ue,
ogs_gtp2_create_bearer_request_t *req);
ogs_gtp2_message_t *gtp2_message);
void mme_s11_handle_update_bearer_request(
ogs_gtp_xact_t *xact, mme_ue_t *mme_ue,
ogs_gtp2_update_bearer_request_t *req);
ogs_gtp2_message_t *gtp2_message);
void mme_s11_handle_delete_bearer_request(
ogs_gtp_xact_t *xact, mme_ue_t *mme_ue,
ogs_gtp2_delete_bearer_request_t *req);
ogs_gtp2_message_t *gtp2_message);
void mme_s11_handle_release_access_bearers_response(
ogs_gtp_xact_t *xact, mme_ue_t *mme_ue,
ogs_gtp2_release_access_bearers_response_t *rsp);
ogs_gtp2_message_t *gtp2_message);
void mme_s11_handle_downlink_data_notification(
ogs_gtp_xact_t *xact, mme_ue_t *mme_ue,
ogs_gtp2_downlink_data_notification_t *noti);
ogs_gtp2_message_t *gtp2_message);
void mme_s11_handle_create_indirect_data_forwarding_tunnel_response(
ogs_gtp_xact_t *xact, mme_ue_t *mme_ue,
ogs_gtp2_create_indirect_data_forwarding_tunnel_response_t *rsp);
ogs_gtp2_message_t *gtp2_message);
void mme_s11_handle_delete_indirect_data_forwarding_tunnel_response(
ogs_gtp_xact_t *xact, mme_ue_t *mme_ue,
ogs_gtp2_delete_indirect_data_forwarding_tunnel_response_t *rsp);
ogs_gtp2_message_t *gtp2_message);
void mme_s11_handle_bearer_resource_failure_indication(
ogs_gtp_xact_t *xact, mme_ue_t *mme_ue,
ogs_gtp2_bearer_resource_failure_indication_t *ind);
ogs_gtp2_message_t *gtp2_message);
#ifdef __cplusplus
}

View File

@ -79,7 +79,7 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e)
ogs_gtp_node_t *gnode = NULL;
ogs_gtp_xact_t *xact = NULL;
ogs_gtp2_message_t gtp_message;
ogs_gtp2_message_t gtp2_message;
ogs_gtp1_message_t gtp1_message;
mme_vlr_t *vlr = NULL;
@ -650,7 +650,7 @@ cleanup:
pkbuf = e->pkbuf;
ogs_assert(pkbuf);
if (ogs_gtp2_parse_msg(&gtp_message, pkbuf) != OGS_OK) {
if (ogs_gtp2_parse_msg(&gtp2_message, pkbuf) != OGS_OK) {
ogs_error("ogs_gtp2_parse_msg() failed");
ogs_pkbuf_free(pkbuf);
break;
@ -659,7 +659,7 @@ cleanup:
gnode = e->gnode;
ogs_assert(gnode);
rv = ogs_gtp_xact_receive(gnode, &gtp_message.h, &xact);
rv = ogs_gtp_xact_receive(gnode, &gtp2_message.h, &xact);
if (rv != OGS_OK) {
ogs_pkbuf_free(pkbuf);
break;
@ -694,9 +694,9 @@ cleanup:
* However in this case, the cause code shall not be set to
* "Context not found".
*/
if (gtp_message.h.teid_presence && gtp_message.h.teid != 0) {
if (gtp2_message.h.teid_presence && gtp2_message.h.teid != 0) {
/* Cause is not "Context not found" */
mme_ue = mme_ue_find_by_s11_local_teid(gtp_message.h.teid);
mme_ue = mme_ue_find_by_s11_local_teid(gtp2_message.h.teid);
} else if (xact->local_teid) { /* rx no TEID or TEID=0 */
/* 3GPP TS 29.274 5.5.2: we receive TEID=0 under some
* conditions, such as cause "Session context not found". In those
@ -706,69 +706,60 @@ cleanup:
mme_ue = mme_ue_find_by_s11_local_teid(xact->local_teid);
}
switch (gtp_message.h.type) {
switch (gtp2_message.h.type) {
case OGS_GTP2_ECHO_REQUEST_TYPE:
mme_s11_handle_echo_request(xact, &gtp_message.echo_request);
mme_s11_handle_echo_request(xact, &gtp2_message);
break;
case OGS_GTP2_ECHO_RESPONSE_TYPE:
mme_s11_handle_echo_response(xact, &gtp_message.echo_response);
mme_s11_handle_echo_response(xact, &gtp2_message);
break;
case OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE:
if (!gtp_message.h.teid_presence) ogs_error("No TEID");
mme_s11_handle_create_session_response(
xact, mme_ue, &gtp_message.create_session_response);
if (!gtp2_message.h.teid_presence) ogs_error("No TEID");
mme_s11_handle_create_session_response(xact, mme_ue, &gtp2_message);
break;
case OGS_GTP2_MODIFY_BEARER_RESPONSE_TYPE:
if (!gtp_message.h.teid_presence) ogs_error("No TEID");
mme_s11_handle_modify_bearer_response(
xact, mme_ue, &gtp_message.modify_bearer_response);
if (!gtp2_message.h.teid_presence) ogs_error("No TEID");
mme_s11_handle_modify_bearer_response(xact, mme_ue, &gtp2_message);
break;
case OGS_GTP2_DELETE_SESSION_RESPONSE_TYPE:
if (!gtp_message.h.teid_presence) ogs_error("No TEID");
mme_s11_handle_delete_session_response(
xact, mme_ue, &gtp_message.delete_session_response);
if (!gtp2_message.h.teid_presence) ogs_error("No TEID");
mme_s11_handle_delete_session_response(xact, mme_ue, &gtp2_message);
break;
case OGS_GTP2_CREATE_BEARER_REQUEST_TYPE:
mme_s11_handle_create_bearer_request(
xact, mme_ue, &gtp_message.create_bearer_request);
mme_s11_handle_create_bearer_request(xact, mme_ue, &gtp2_message);
break;
case OGS_GTP2_UPDATE_BEARER_REQUEST_TYPE:
mme_s11_handle_update_bearer_request(
xact, mme_ue, &gtp_message.update_bearer_request);
mme_s11_handle_update_bearer_request(xact, mme_ue, &gtp2_message);
break;
case OGS_GTP2_DELETE_BEARER_REQUEST_TYPE:
mme_s11_handle_delete_bearer_request(
xact, mme_ue, &gtp_message.delete_bearer_request);
mme_s11_handle_delete_bearer_request(xact, mme_ue, &gtp2_message);
break;
case OGS_GTP2_RELEASE_ACCESS_BEARERS_RESPONSE_TYPE:
if (!gtp_message.h.teid_presence) ogs_error("No TEID");
if (!gtp2_message.h.teid_presence) ogs_error("No TEID");
mme_s11_handle_release_access_bearers_response(
xact, mme_ue, &gtp_message.release_access_bearers_response);
xact, mme_ue, &gtp2_message);
break;
case OGS_GTP2_DOWNLINK_DATA_NOTIFICATION_TYPE:
mme_s11_handle_downlink_data_notification(
xact, mme_ue, &gtp_message.downlink_data_notification);
xact, mme_ue, &gtp2_message);
break;
case OGS_GTP2_CREATE_INDIRECT_DATA_FORWARDING_TUNNEL_RESPONSE_TYPE:
if (!gtp_message.h.teid_presence) ogs_error("No TEID");
if (!gtp2_message.h.teid_presence) ogs_error("No TEID");
mme_s11_handle_create_indirect_data_forwarding_tunnel_response(
xact, mme_ue,
&gtp_message.create_indirect_data_forwarding_tunnel_response);
xact, mme_ue, &gtp2_message);
break;
case OGS_GTP2_DELETE_INDIRECT_DATA_FORWARDING_TUNNEL_RESPONSE_TYPE:
if (!gtp_message.h.teid_presence) ogs_error("No TEID");
if (!gtp2_message.h.teid_presence) ogs_error("No TEID");
mme_s11_handle_delete_indirect_data_forwarding_tunnel_response(
xact, mme_ue,
&gtp_message.delete_indirect_data_forwarding_tunnel_response);
xact, mme_ue, &gtp2_message);
break;
case OGS_GTP2_BEARER_RESOURCE_FAILURE_INDICATION_TYPE:
if (!gtp_message.h.teid_presence) ogs_error("No TEID");
if (!gtp2_message.h.teid_presence) ogs_error("No TEID");
mme_s11_handle_bearer_resource_failure_indication(
xact, mme_ue,
&gtp_message.bearer_resource_failure_indication);
xact, mme_ue, &gtp2_message);
break;
default:
ogs_warn("Not implemented(type:%d)", gtp_message.h.type);
ogs_warn("Not implemented(type:%d)", gtp2_message.h.type);
break;
}
ogs_pkbuf_free(pkbuf);

View File

@ -305,8 +305,7 @@ void sgwc_pfcp_state_associated(ogs_fsm_t *s, sgwc_event_t *e)
sess->sgwu_sxa_seid = be64toh(up_f_seid->seid);
} else {
sgwc_sxa_handle_session_establishment_response(
sess, xact, e->gtp_message,
&message->pfcp_session_establishment_response);
sess, xact, e->gtp_message, message);
}
break;
@ -314,23 +313,20 @@ void sgwc_pfcp_state_associated(ogs_fsm_t *s, sgwc_event_t *e)
if (!message->h.seid_presence) ogs_error("No SEID");
sgwc_sxa_handle_session_modification_response(
sess, xact, e->gtp_message,
&message->pfcp_session_modification_response);
sess, xact, e->gtp_message, message);
break;
case OGS_PFCP_SESSION_DELETION_RESPONSE_TYPE:
if (!message->h.seid_presence) ogs_error("No SEID");
sgwc_sxa_handle_session_deletion_response(
sess, xact, e->gtp_message,
&message->pfcp_session_deletion_response);
sess, xact, e->gtp_message, message);
break;
case OGS_PFCP_SESSION_REPORT_REQUEST_TYPE:
if (!message->h.seid_presence) ogs_error("No SEID");
sgwc_sxa_handle_session_report_request(
sess, xact, &message->pfcp_session_report_request);
sgwc_sxa_handle_session_report_request(sess, xact, message);
break;
default:

View File

@ -174,7 +174,7 @@ void sgwc_s11_handle_create_session_request(
if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
ogs_gtp_send_error_message(
s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : message->h.teid,
OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE, cause_value);
return;
}
@ -215,7 +215,7 @@ void sgwc_s11_handle_create_session_request(
if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
ogs_gtp_send_error_message(
s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : message->h.teid,
OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE, cause_value);
return;
}
@ -263,7 +263,7 @@ void sgwc_s11_handle_create_session_request(
ogs_assert(sess->pfcp_node);
if (!OGS_FSM_CHECK(&sess->pfcp_node->sm, sgwc_pfcp_state_associated)) {
ogs_gtp_send_error_message(
s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : message->h.teid,
OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE,
OGS_GTP2_CAUSE_REMOTE_PEER_NOT_RESPONDING);
return;
@ -424,7 +424,7 @@ void sgwc_s11_handle_modify_bearer_request(
if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
ogs_gtp_send_error_message(
s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : message->h.teid,
OGS_GTP2_MODIFY_BEARER_RESPONSE_TYPE, cause_value);
return;
}
@ -532,7 +532,7 @@ void sgwc_s11_handle_modify_bearer_request(
if (i == 0) {
ogs_error("No Bearer");
ogs_gtp_send_error_message(
s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : message->h.teid,
OGS_GTP2_MODIFY_BEARER_RESPONSE_TYPE, cause_value);
return;
}
@ -610,7 +610,7 @@ void sgwc_s11_handle_delete_session_request(
if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
ogs_gtp_send_error_message(
s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : message->h.teid,
OGS_GTP2_DELETE_SESSION_RESPONSE_TYPE, cause_value);
return;
}
@ -630,7 +630,7 @@ void sgwc_s11_handle_delete_session_request(
indication->scope_indication == 1) {
ogs_error("Invalid Indication");
ogs_gtp_send_error_message(
s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : message->h.teid,
OGS_GTP2_DELETE_SESSION_RESPONSE_TYPE,
OGS_GTP2_CAUSE_INVALID_MESSAGE_FORMAT);
return;
@ -1129,7 +1129,7 @@ void sgwc_s11_handle_release_access_bearers_request(
if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
ogs_gtp_send_error_message(
s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : message->h.teid,
OGS_GTP2_RELEASE_ACCESS_BEARERS_RESPONSE_TYPE, cause_value);
return;
}
@ -1236,7 +1236,7 @@ void sgwc_s11_handle_create_indirect_data_forwarding_tunnel_request(
if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
ogs_gtp_send_error_message(
s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : message->h.teid,
OGS_GTP2_CREATE_INDIRECT_DATA_FORWARDING_TUNNEL_RESPONSE_TYPE,
cause_value);
return;
@ -1254,7 +1254,7 @@ void sgwc_s11_handle_create_indirect_data_forwarding_tunnel_request(
if (req->bearer_contexts[i].eps_bearer_id.presence == 0) {
ogs_error("No EBI");
ogs_gtp_send_error_message(
s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : message->h.teid,
OGS_GTP2_CREATE_INDIRECT_DATA_FORWARDING_TUNNEL_RESPONSE_TYPE,
OGS_GTP2_CAUSE_MANDATORY_IE_MISSING);
return;
@ -1277,7 +1277,7 @@ void sgwc_s11_handle_create_indirect_data_forwarding_tunnel_request(
rv = ogs_gtp2_f_teid_to_ip(req_teid, &tunnel->remote_ip);
if (rv != OGS_OK) {
ogs_gtp_send_error_message(s11_xact,
sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
sgwc_ue ? sgwc_ue->mme_s11_teid : message->h.teid,
OGS_GTP2_CREATE_INDIRECT_DATA_FORWARDING_TUNNEL_RESPONSE_TYPE,
OGS_GTP2_CAUSE_MANDATORY_IE_MISSING);
return;
@ -1312,7 +1312,7 @@ void sgwc_s11_handle_create_indirect_data_forwarding_tunnel_request(
rv = ogs_gtp2_f_teid_to_ip(req_teid, &tunnel->remote_ip);
if (rv != OGS_OK) {
ogs_gtp_send_error_message(s11_xact,
sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
sgwc_ue ? sgwc_ue->mme_s11_teid : message->h.teid,
OGS_GTP2_CREATE_INDIRECT_DATA_FORWARDING_TUNNEL_RESPONSE_TYPE,
OGS_GTP2_CAUSE_MANDATORY_IE_MISSING);
return;
@ -1346,12 +1346,13 @@ void sgwc_s11_handle_create_indirect_data_forwarding_tunnel_request(
void sgwc_s11_handle_delete_indirect_data_forwarding_tunnel_request(
sgwc_ue_t *sgwc_ue, ogs_gtp_xact_t *s11_xact,
ogs_pkbuf_t *gtpbuf, ogs_gtp2_message_t *recv_message)
ogs_pkbuf_t *gtpbuf, ogs_gtp2_message_t *message)
{
sgwc_sess_t *sess = NULL;
uint8_t cause_value = 0;
ogs_assert(s11_xact);
ogs_assert(message);
ogs_debug("Delete Indirect Data Forwarding Tunnel Request");
@ -1367,7 +1368,8 @@ void sgwc_s11_handle_delete_indirect_data_forwarding_tunnel_request(
if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
ogs_gtp_send_error_message(
s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
s11_xact,
sgwc_ue ? sgwc_ue->mme_s11_teid : message->h.teid,
OGS_GTP2_DELETE_INDIRECT_DATA_FORWARDING_TUNNEL_RESPONSE_TYPE,
cause_value);
return;
@ -1442,7 +1444,7 @@ void sgwc_s11_handle_bearer_resource_command(
if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
ogs_gtp_send_error_message(
s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : message->h.teid,
OGS_GTP2_BEARER_RESOURCE_FAILURE_INDICATION_TYPE, cause_value);
return;
}
@ -1463,7 +1465,7 @@ void sgwc_s11_handle_bearer_resource_command(
if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
ogs_gtp_send_error_message(
s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : message->h.teid,
OGS_GTP2_BEARER_RESOURCE_FAILURE_INDICATION_TYPE, cause_value);
return;
}

View File

@ -573,7 +573,8 @@ void sgwc_s5c_handle_create_bearer_request(
}
if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
ogs_gtp_send_error_message(s5c_xact, sess ? sess->pgw_s5c_teid : 0,
ogs_gtp_send_error_message(s5c_xact,
sess ? sess->pgw_s5c_teid : message->h.teid,
OGS_GTP2_CREATE_BEARER_RESPONSE_TYPE, cause_value);
return;
}
@ -601,7 +602,8 @@ void sgwc_s5c_handle_create_bearer_request(
}
if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
ogs_gtp_send_error_message(s5c_xact, sess ? sess->pgw_s5c_teid : 0,
ogs_gtp_send_error_message(s5c_xact,
sess ? sess->pgw_s5c_teid : message->h.teid,
OGS_GTP2_CREATE_BEARER_RESPONSE_TYPE, cause_value);
return;
}
@ -631,7 +633,8 @@ void sgwc_s5c_handle_create_bearer_request(
rv = ogs_gtp2_f_teid_to_ip(pgw_s5u_teid, &ul_tunnel->remote_ip);
if (rv != OGS_OK) {
ogs_gtp_send_error_message(s5c_xact, sess ? sess->pgw_s5c_teid : 0,
ogs_gtp_send_error_message(s5c_xact,
sess ? sess->pgw_s5c_teid : message->h.teid,
OGS_GTP2_CREATE_BEARER_RESPONSE_TYPE,
OGS_GTP2_CAUSE_MANDATORY_IE_MISSING);
return;
@ -709,7 +712,8 @@ void sgwc_s5c_handle_update_bearer_request(
}
if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
ogs_gtp_send_error_message(s5c_xact, sess ? sess->pgw_s5c_teid : 0,
ogs_gtp_send_error_message(s5c_xact,
sess ? sess->pgw_s5c_teid : message->h.teid,
OGS_GTP2_UPDATE_BEARER_RESPONSE_TYPE, cause_value);
return;
}
@ -850,7 +854,8 @@ void sgwc_s5c_handle_delete_bearer_request(
}
if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
ogs_gtp_send_error_message(s5c_xact, sess ? sess->pgw_s5c_teid : 0,
ogs_gtp_send_error_message(s5c_xact,
sess ? sess->pgw_s5c_teid : message->h.teid,
OGS_GTP2_DELETE_BEARER_RESPONSE_TYPE, cause_value);
return;
}

View File

@ -127,7 +127,7 @@ static void bearer_timeout(ogs_gtp_xact_t *xact, void *data)
void sgwc_sxa_handle_session_establishment_response(
sgwc_sess_t *sess, ogs_pfcp_xact_t *pfcp_xact,
ogs_gtp2_message_t *recv_message,
ogs_pfcp_session_establishment_response_t *pfcp_rsp)
ogs_pfcp_message_t *pfcp_message)
{
int rv;
uint8_t cause_value = 0;
@ -155,11 +155,13 @@ void sgwc_sxa_handle_session_establishment_response(
ogs_gtp2_indication_t *indication = NULL;
ogs_pfcp_session_establishment_response_t *pfcp_rsp = NULL;
ogs_debug("Session Establishment Response");
ogs_assert(pfcp_xact);
ogs_assert(pfcp_rsp);
ogs_assert(recv_message);
ogs_assert(pfcp_message);
create_session_request = &recv_message->create_session_request;
ogs_assert(create_session_request);
@ -167,6 +169,9 @@ void sgwc_sxa_handle_session_establishment_response(
s11_xact = pfcp_xact->assoc_xact;
ogs_assert(s11_xact);
pfcp_rsp = &pfcp_message->pfcp_session_establishment_response;
ogs_assert(pfcp_rsp);
ogs_pfcp_xact_commit(pfcp_xact);
cause_value = OGS_GTP2_CAUSE_REQUEST_ACCEPTED;
@ -246,7 +251,8 @@ void sgwc_sxa_handle_session_establishment_response(
if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
if (sess) sgwc_ue = sess->sgwc_ue;
ogs_gtp_send_error_message(
s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
s11_xact,
sgwc_ue ? sgwc_ue->mme_s11_teid : recv_message->h.teid,
OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE, cause_value);
return;
}
@ -270,7 +276,8 @@ void sgwc_sxa_handle_session_establishment_response(
if (dl_tunnel->local_addr == NULL && dl_tunnel->local_addr6 == NULL) {
ogs_error("No UP F-TEID");
ogs_gtp_send_error_message(
s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
s11_xact,
sgwc_ue ? sgwc_ue->mme_s11_teid : recv_message->h.teid,
OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE,
OGS_GTP2_CAUSE_GRE_KEY_NOT_FOUND);
return;
@ -444,7 +451,7 @@ void sgwc_sxa_handle_session_establishment_response(
void sgwc_sxa_handle_session_modification_response(
sgwc_sess_t *sess, ogs_pfcp_xact_t *pfcp_xact,
ogs_gtp2_message_t *recv_message,
ogs_pfcp_session_modification_response_t *pfcp_rsp)
ogs_pfcp_message_t *pfcp_message)
{
int i, rv, len = 0;
uint8_t cause_value = 0;
@ -463,14 +470,19 @@ void sgwc_sxa_handle_session_modification_response(
ogs_gtp2_cause_t cause;
ogs_pfcp_session_modification_response_t *pfcp_rsp = NULL;
ogs_debug("Session Modification Response");
ogs_assert(pfcp_xact);
ogs_assert(pfcp_rsp);
ogs_assert(pfcp_message);
flags = pfcp_xact->modify_flags;
ogs_assert(flags);
pfcp_rsp = &pfcp_message->pfcp_session_modification_response;
ogs_assert(pfcp_rsp);
cause_value = OGS_GTP2_CAUSE_REQUEST_ACCEPTED;
if (flags & OGS_PFCP_MODIFY_SESSION) {
@ -597,12 +609,15 @@ void sgwc_sxa_handle_session_modification_response(
} else if (flags & OGS_PFCP_MODIFY_ACTIVATE) {
ogs_assert(recv_message);
if (flags & OGS_PFCP_MODIFY_UL_ONLY) {
s11_xact = pfcp_xact->assoc_xact;
ogs_assert(s11_xact);
ogs_gtp_send_error_message(
s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
s11_xact,
sgwc_ue ? sgwc_ue->mme_s11_teid : recv_message->h.teid,
OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE, cause_value);
} else if (flags & OGS_PFCP_MODIFY_DL_ONLY) {
@ -610,19 +625,26 @@ void sgwc_sxa_handle_session_modification_response(
ogs_assert(s11_xact);
ogs_gtp_send_error_message(
s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
s11_xact,
sgwc_ue ? sgwc_ue->mme_s11_teid : recv_message->h.teid,
OGS_GTP2_MODIFY_BEARER_RESPONSE_TYPE, cause_value);
} else {
ogs_fatal("Invalid modify_flags[0x%llx]", (long long)flags);
ogs_assert_if_reached();
}
} else if (flags & OGS_PFCP_MODIFY_DEACTIVATE) {
s11_xact = pfcp_xact->assoc_xact;
ogs_assert(s11_xact);
if (flags & OGS_PFCP_MODIFY_ERROR_INDICATION) {
} else {
ogs_assert(recv_message);
ogs_gtp_send_error_message(
s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
OGS_GTP2_RELEASE_ACCESS_BEARERS_RESPONSE_TYPE, cause_value);
s11_xact = pfcp_xact->assoc_xact;
ogs_assert(s11_xact);
ogs_gtp_send_error_message(
s11_xact,
sgwc_ue ? sgwc_ue->mme_s11_teid : recv_message->h.teid,
OGS_GTP2_RELEASE_ACCESS_BEARERS_RESPONSE_TYPE, cause_value);
}
}
ogs_pfcp_xact_commit(pfcp_xact);
@ -989,6 +1011,7 @@ void sgwc_sxa_handle_session_modification_response(
s11_xact = pfcp_xact->assoc_xact;
ogs_assert(s11_xact);
ogs_assert(recv_message);
ogs_list_copy(&bearer_to_modify_list,
&pfcp_xact->bearer_to_modify_list);
@ -1002,7 +1025,6 @@ void sgwc_sxa_handle_session_modification_response(
ogs_gtp2_f_teid_t sgw_s1u_teid[OGS_BEARER_PER_UE];
int sgw_s1u_len[OGS_BEARER_PER_UE];
ogs_assert(recv_message);
gtp_rsp = &recv_message->create_session_response;
ogs_assert(gtp_rsp);
@ -1071,7 +1093,6 @@ void sgwc_sxa_handle_session_modification_response(
ogs_gtp2_indication_t *indication = NULL;
ogs_assert(recv_message);
gtp_req = &recv_message->modify_bearer_request;
ogs_assert(gtp_req);
@ -1210,6 +1231,7 @@ void sgwc_sxa_handle_session_modification_response(
} else {
s11_xact = pfcp_xact->assoc_xact;
ogs_assert(s11_xact);
ogs_assert(recv_message);
ogs_pfcp_xact_commit(pfcp_xact);
@ -1260,7 +1282,7 @@ void sgwc_sxa_handle_session_modification_response(
void sgwc_sxa_handle_session_deletion_response(
sgwc_sess_t *sess, ogs_pfcp_xact_t *pfcp_xact,
ogs_gtp2_message_t *gtp_message,
ogs_pfcp_session_deletion_response_t *pfcp_rsp)
ogs_pfcp_message_t *pfcp_message)
{
int rv;
uint8_t cause_value = 0;
@ -1271,9 +1293,14 @@ void sgwc_sxa_handle_session_deletion_response(
ogs_gtp_xact_t *gtp_xact = NULL;
ogs_pkbuf_t *pkbuf = NULL;
ogs_pfcp_session_deletion_response_t *pfcp_rsp = NULL;
ogs_debug("Session Deletion Response");
ogs_assert(pfcp_xact);
ogs_assert(pfcp_message);
pfcp_rsp = &pfcp_message->pfcp_session_deletion_response;
ogs_assert(pfcp_rsp);
cause_value = OGS_GTP2_CAUSE_REQUEST_ACCEPTED;
@ -1315,7 +1342,7 @@ void sgwc_sxa_handle_session_deletion_response(
* 2. SMF sends Delete Session Response to SGW/MME.
*/
if (sess) sgwc_ue = sess->sgwc_ue;
teid = sgwc_ue ? sgwc_ue->mme_s11_teid : 0;
teid = sgwc_ue ? sgwc_ue->mme_s11_teid : gtp_message->h.teid;
break;
case OGS_GTP2_DELETE_BEARER_RESPONSE_TYPE:
/*
@ -1385,7 +1412,7 @@ cleanup:
void sgwc_sxa_handle_session_report_request(
sgwc_sess_t *sess, ogs_pfcp_xact_t *pfcp_xact,
ogs_pfcp_session_report_request_t *pfcp_req)
ogs_pfcp_message_t *pfcp_message)
{
sgwc_ue_t *sgwc_ue = NULL;
sgwc_bearer_t *bearer = NULL;
@ -1396,9 +1423,14 @@ void sgwc_sxa_handle_session_report_request(
uint8_t cause_value = 0;
uint16_t pdr_id = 0;
ogs_pfcp_session_report_request_t *pfcp_req = NULL;
ogs_debug("Session Report Request");
ogs_assert(pfcp_xact);
ogs_assert(pfcp_message);
pfcp_req = &pfcp_message->pfcp_session_report_request;
ogs_assert(pfcp_req);
cause_value = OGS_GTP2_CAUSE_REQUEST_ACCEPTED;
@ -1419,7 +1451,8 @@ void sgwc_sxa_handle_session_report_request(
}
if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
ogs_pfcp_send_error_message(pfcp_xact, 0,
ogs_pfcp_send_error_message(
pfcp_xact, sess ? sess->sgwu_sxa_seid : pfcp_message->h.seid,
OGS_PFCP_SESSION_REPORT_RESPONSE_TYPE,
cause_value, 0);
return;
@ -1431,7 +1464,8 @@ void sgwc_sxa_handle_session_report_request(
if (!sgwc_ue->gnode) {
ogs_error("No SGWC-UE GTP Node");
ogs_pfcp_send_error_message(pfcp_xact, sess ? sess->sgwu_sxa_seid : 0,
ogs_pfcp_send_error_message(
pfcp_xact, sess ? sess->sgwu_sxa_seid : pfcp_message->h.seid,
OGS_PFCP_SESSION_REPORT_RESPONSE_TYPE,
OGS_PFCP_CAUSE_SESSION_CONTEXT_NOT_FOUND, 0);
return;

View File

@ -29,18 +29,18 @@ extern "C" {
void sgwc_sxa_handle_session_establishment_response(
sgwc_sess_t *sess, ogs_pfcp_xact_t *pfcp_xact,
ogs_gtp2_message_t *recv_message,
ogs_pfcp_session_establishment_response_t *pfcp_rsp);
ogs_pfcp_message_t *pfcp_message);
void sgwc_sxa_handle_session_modification_response(
sgwc_sess_t *sess, ogs_pfcp_xact_t *pfcp_xact,
ogs_gtp2_message_t *recv_message,
ogs_pfcp_session_modification_response_t *pfcp_rsp);
ogs_pfcp_message_t *pfcp_message);
void sgwc_sxa_handle_session_deletion_response(
sgwc_sess_t *sess, ogs_pfcp_xact_t *pfcp_xact,
ogs_gtp2_message_t *gtp_message,
ogs_pfcp_session_deletion_response_t *pfcp_rsp);
ogs_pfcp_message_t *pfcp_message);
void sgwc_sxa_handle_session_report_request(
sgwc_sess_t *sess, ogs_pfcp_xact_t *pfcp_xact,
ogs_pfcp_session_report_request_t *pfcp_req);
ogs_pfcp_message_t *pfcp_message);
#ifdef __cplusplus
}

View File

@ -280,20 +280,16 @@ void sgwu_pfcp_state_associated(ogs_fsm_t *s, sgwu_event_t *e)
sess = sgwu_sess_add_by_message(message);
if (sess)
OGS_SETUP_PFCP_NODE(sess, node);
sgwu_sxa_handle_session_establishment_request(
sess, xact, &message->pfcp_session_establishment_request);
sgwu_sxa_handle_session_establishment_request(sess, xact, message);
break;
case OGS_PFCP_SESSION_MODIFICATION_REQUEST_TYPE:
sgwu_sxa_handle_session_modification_request(
sess, xact, &message->pfcp_session_modification_request);
sgwu_sxa_handle_session_modification_request(sess, xact, message);
break;
case OGS_PFCP_SESSION_DELETION_REQUEST_TYPE:
sgwu_sxa_handle_session_deletion_request(
sess, xact, &message->pfcp_session_deletion_request);
sgwu_sxa_handle_session_deletion_request(sess, xact, message);
break;
case OGS_PFCP_SESSION_REPORT_RESPONSE_TYPE:
sgwu_sxa_handle_session_report_response(
sess, xact, &message->pfcp_session_report_response);
sgwu_sxa_handle_session_report_response(sess, xact, message);
break;
default:
ogs_error("Not implemented PFCP message type[%d]",

View File

@ -22,8 +22,7 @@
#include "sxa-handler.h"
void sgwu_sxa_handle_session_establishment_request(
sgwu_sess_t *sess, ogs_pfcp_xact_t *xact,
ogs_pfcp_session_establishment_request_t *req)
sgwu_sess_t *sess, ogs_pfcp_xact_t *xact, ogs_pfcp_message_t *message)
{
ogs_pfcp_pdr_t *pdr = NULL;
ogs_pfcp_far_t *far = NULL;
@ -36,7 +35,11 @@ void sgwu_sxa_handle_session_establishment_request(
ogs_pfcp_sereq_flags_t sereq_flags;
bool restoration_indication = false;
ogs_pfcp_session_establishment_request_t *req = NULL;
ogs_assert(xact);
ogs_assert(message);
req = &message->pfcp_session_establishment_request;
ogs_assert(req);
ogs_debug("Session Establishment Request");
@ -45,7 +48,8 @@ void sgwu_sxa_handle_session_establishment_request(
if (!sess) {
ogs_error("No Context");
ogs_pfcp_send_error_message(xact, 0,
ogs_pfcp_send_error_message(
xact, sess ? sess->sgwc_sxa_f_seid.seid : message->h.seid,
OGS_PFCP_SESSION_ESTABLISHMENT_RESPONSE_TYPE,
OGS_PFCP_CAUSE_MANDATORY_IE_MISSING, 0);
return;
@ -142,14 +146,14 @@ void sgwu_sxa_handle_session_establishment_request(
cleanup:
ogs_pfcp_sess_clear(&sess->pfcp);
ogs_pfcp_send_error_message(xact, sess ? sess->sgwu_sxa_seid : 0,
ogs_pfcp_send_error_message(
xact, sess ? sess->sgwc_sxa_f_seid.seid : message->h.seid,
OGS_PFCP_SESSION_ESTABLISHMENT_RESPONSE_TYPE,
cause_value, offending_ie_value);
}
void sgwu_sxa_handle_session_modification_request(
sgwu_sess_t *sess, ogs_pfcp_xact_t *xact,
ogs_pfcp_session_modification_request_t *req)
sgwu_sess_t *sess, ogs_pfcp_xact_t *xact, ogs_pfcp_message_t *message)
{
ogs_pfcp_pdr_t *pdr = NULL;
ogs_pfcp_far_t *far = NULL;
@ -159,7 +163,11 @@ void sgwu_sxa_handle_session_modification_request(
uint8_t offending_ie_value = 0;
int i;
ogs_pfcp_session_modification_request_t *req = NULL;
ogs_assert(xact);
ogs_assert(message);
req = &message->pfcp_session_modification_request;
ogs_assert(req);
ogs_debug("Session Modification Request");
@ -168,7 +176,8 @@ void sgwu_sxa_handle_session_modification_request(
if (!sess) {
ogs_error("No Context");
ogs_pfcp_send_error_message(xact, 0,
ogs_pfcp_send_error_message(
xact, sess ? sess->sgwc_sxa_f_seid.seid : message->h.seid,
OGS_PFCP_SESSION_MODIFICATION_RESPONSE_TYPE,
OGS_PFCP_CAUSE_SESSION_CONTEXT_NOT_FOUND, 0);
return;
@ -309,23 +318,28 @@ void sgwu_sxa_handle_session_modification_request(
cleanup:
ogs_pfcp_sess_clear(&sess->pfcp);
ogs_pfcp_send_error_message(xact, sess ? sess->sgwu_sxa_seid : 0,
ogs_pfcp_send_error_message(
xact, sess ? sess->sgwc_sxa_f_seid.seid : message->h.seid,
OGS_PFCP_SESSION_MODIFICATION_RESPONSE_TYPE,
cause_value, offending_ie_value);
}
void sgwu_sxa_handle_session_deletion_request(
sgwu_sess_t *sess, ogs_pfcp_xact_t *xact,
ogs_pfcp_session_deletion_request_t *req)
sgwu_sess_t *sess, ogs_pfcp_xact_t *xact, ogs_pfcp_message_t *message)
{
ogs_pfcp_session_deletion_request_t *req = NULL;
ogs_assert(xact);
ogs_assert(message);
req = &message->pfcp_session_deletion_request;
ogs_assert(req);
ogs_debug("Session Deletion Request");
if (!sess) {
ogs_error("No Context");
ogs_pfcp_send_error_message(xact, 0,
ogs_pfcp_send_error_message(
xact, sess ? sess->sgwc_sxa_f_seid.seid : message->h.seid,
OGS_PFCP_SESSION_DELETION_RESPONSE_TYPE,
OGS_PFCP_CAUSE_SESSION_CONTEXT_NOT_FOUND, 0);
return;
@ -339,12 +353,15 @@ void sgwu_sxa_handle_session_deletion_request(
}
void sgwu_sxa_handle_session_report_response(
sgwu_sess_t *sess, ogs_pfcp_xact_t *xact,
ogs_pfcp_session_report_response_t *rsp)
sgwu_sess_t *sess, ogs_pfcp_xact_t *xact, ogs_pfcp_message_t *message)
{
uint8_t cause_value = 0;
ogs_pfcp_session_report_response_t *rsp = NULL;
ogs_assert(xact);
ogs_assert(message);
rsp = &message->pfcp_session_report_response;
ogs_assert(rsp);
ogs_pfcp_xact_commit(xact);

View File

@ -27,18 +27,14 @@ extern "C" {
#endif
void sgwu_sxa_handle_session_establishment_request(
sgwu_sess_t *sess, ogs_pfcp_xact_t *xact,
ogs_pfcp_session_establishment_request_t *req);
sgwu_sess_t *sess, ogs_pfcp_xact_t *xact, ogs_pfcp_message_t *message);
void sgwu_sxa_handle_session_modification_request(
sgwu_sess_t *sess, ogs_pfcp_xact_t *xact,
ogs_pfcp_session_modification_request_t *req);
sgwu_sess_t *sess, ogs_pfcp_xact_t *xact, ogs_pfcp_message_t *message);
void sgwu_sxa_handle_session_deletion_request(
sgwu_sess_t *sess, ogs_pfcp_xact_t *xact,
ogs_pfcp_session_deletion_request_t *req);
sgwu_sess_t *sess, ogs_pfcp_xact_t *xact, ogs_pfcp_message_t *message);
void sgwu_sxa_handle_session_report_response(
sgwu_sess_t *sess, ogs_pfcp_xact_t *xact,
ogs_pfcp_session_report_response_t *rsp);
sgwu_sess_t *sess, ogs_pfcp_xact_t *xact, ogs_pfcp_message_t *message);
#ifdef __cplusplus
}

View File

@ -218,8 +218,7 @@ void smf_gsm_state_initial(ogs_fsm_t *s, smf_event_t *e)
switch(gtp2_message->h.type) {
case OGS_GTP2_CREATE_SESSION_REQUEST_TYPE:
gtp2_cause = smf_s5c_handle_create_session_request(sess,
e->gtp_xact,
&e->gtp2_message->create_session_request);
e->gtp_xact, gtp2_message);
if (gtp2_cause != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
send_gtp_create_err_msg(sess, e->gtp_xact, gtp2_cause);
return;
@ -337,6 +336,7 @@ void smf_gsm_state_wait_epc_auth_initial(ogs_fsm_t *s, smf_event_t *e)
ogs_diam_gy_message_t *gy_message = NULL;
ogs_diam_gx_message_t *gx_message = NULL;
uint32_t diam_err;
bool need_gy_terminate = false;
ogs_assert(s);
ogs_assert(e);
@ -392,7 +392,7 @@ void smf_gsm_state_wait_epc_auth_initial(ogs_fsm_t *s, smf_event_t *e)
case OGS_DIAM_GY_CC_REQUEST_TYPE_INITIAL_REQUEST:
ogs_assert(e->gtp_xact);
diam_err = smf_gy_handle_cca_initial_request(sess,
gy_message, e->gtp_xact);
gy_message, e->gtp_xact, &need_gy_terminate);
sess->sm_data.gy_ccr_init_in_flight = false;
sess->sm_data.gy_cca_init_err = diam_err;
goto test_can_proceed;
@ -422,8 +422,16 @@ test_can_proceed:
smf_epc_pfcp_send_session_establishment_request(
sess, e->gtp_xact, 0));
} else {
/* FIXME: tear down Gx/Gy session
* if its sm_data.*init_err == ER_DIAMETER_SUCCESS */
/* Tear down Gx/Gy session if its sm_data.*init_err == ER_DIAMETER_SUCCESS */
if (sess->sm_data.gx_cca_init_err == ER_DIAMETER_SUCCESS) {
sess->sm_data.gx_ccr_term_in_flight = true;
smf_gx_send_ccr(sess, e->gtp_xact, OGS_DIAM_GX_CC_REQUEST_TYPE_TERMINATION_REQUEST);
}
if (smf_use_gy_iface() == 1 &&
(sess->sm_data.gy_cca_init_err == ER_DIAMETER_SUCCESS || need_gy_terminate)) {
sess->sm_data.gy_ccr_term_in_flight = true;
smf_gy_send_ccr(sess, e->gtp_xact, OGS_DIAM_GY_CC_REQUEST_TYPE_TERMINATION_REQUEST);
}
uint8_t gtp_cause = gtp_cause_from_diameter(
e->gtp_xact->gtp_version, diam_err, NULL);
send_gtp_create_err_msg(sess, e->gtp_xact, gtp_cause);
@ -612,8 +620,7 @@ void smf_gsm_state_wait_pfcp_establishment(ogs_fsm_t *s, smf_event_t *e)
ogs_assert(gtp_xact);
pfcp_cause = smf_epc_n4_handle_session_establishment_response(
sess, pfcp_xact,
&pfcp_message->pfcp_session_establishment_response);
sess, pfcp_xact, pfcp_message);
if (pfcp_cause != OGS_PFCP_CAUSE_REQUEST_ACCEPTED) {
/* FIXME: tear down Gy and Gx */
gtp_cause = gtp_cause_from_pfcp(
@ -662,8 +669,7 @@ void smf_gsm_state_wait_pfcp_establishment(ogs_fsm_t *s, smf_event_t *e)
smf_bearer_binding(sess);
} else {
pfcp_cause = smf_5gc_n4_handle_session_establishment_response(
sess, pfcp_xact,
&pfcp_message->pfcp_session_establishment_response);
sess, pfcp_xact, pfcp_message);
if (pfcp_cause != OGS_PFCP_CAUSE_REQUEST_ACCEPTED) {
OGS_FSM_TRAN(s, smf_gsm_state_5gc_n1_n2_reject);
return;
@ -775,8 +781,7 @@ void smf_gsm_state_operational(ogs_fsm_t *s, smf_event_t *e)
switch(gtp2_message->h.type) {
case OGS_GTP2_DELETE_SESSION_REQUEST_TYPE:
gtp2_cause = smf_s5c_handle_delete_session_request(
sess, e->gtp_xact,
&gtp2_message->delete_session_request);
sess, e->gtp_xact, gtp2_message);
if (gtp2_cause != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
ogs_gtp2_send_error_message(e->gtp_xact, sess->sgw_s5c_teid,
OGS_GTP2_DELETE_SESSION_RESPONSE_TYPE, gtp2_cause);
@ -786,7 +791,7 @@ void smf_gsm_state_operational(ogs_fsm_t *s, smf_event_t *e)
break;
case OGS_GTP2_DELETE_BEARER_RESPONSE_TYPE:
release = smf_s5c_handle_delete_bearer_response(
sess, e->gtp_xact, &e->gtp2_message->delete_bearer_response);
sess, e->gtp_xact, gtp2_message);
if (release) {
e->gtp_xact = NULL;
OGS_FSM_TRAN(s, smf_gsm_state_wait_pfcp_deletion);
@ -1301,8 +1306,7 @@ void smf_gsm_state_wait_pfcp_deletion(ogs_fsm_t *s, smf_event_t *e)
gtp_xact = pfcp_xact->assoc_xact;
pfcp_cause = smf_epc_n4_handle_session_deletion_response(
sess, pfcp_xact,
&pfcp_message->pfcp_session_deletion_response);
sess, pfcp_xact, pfcp_message);
if (pfcp_cause != OGS_PFCP_CAUSE_REQUEST_ACCEPTED) {
/* FIXME: tear down Gy and Gx */
ogs_assert(gtp_xact);
@ -1325,8 +1329,7 @@ void smf_gsm_state_wait_pfcp_deletion(ogs_fsm_t *s, smf_event_t *e)
ogs_pfcp_xact_commit(pfcp_xact);
status = smf_5gc_n4_handle_session_deletion_response(
sess, stream, trigger,
&pfcp_message->pfcp_session_deletion_response);
sess, stream, trigger, pfcp_message);
if (status != OGS_SBI_HTTP_STATUS_OK) {
ogs_error(
"[%d] smf_5gc_n4_handle_session_deletion_response() "

View File

@ -113,24 +113,41 @@ static void urr_update_time(smf_sess_t *sess, ogs_pfcp_urr_t *urr, ogs_diam_gy_m
}
}
/* Returns ER_DIAMETER_SUCCESS on success, Diameter error code on failue. */
/* Returns ER_DIAMETER_SUCCESS on success, Diameter error code on failue.
* Upon failure, CCR-Terminate is needed based on "need_termination" value (this
* may happen eg. if messaged RC is successful but MSCC RC is rejected). */
uint32_t smf_gy_handle_cca_initial_request(
smf_sess_t *sess, ogs_diam_gy_message_t *gy_message,
ogs_gtp_xact_t *gtp_xact)
ogs_gtp_xact_t *gtp_xact,
bool *need_termination)
{
smf_bearer_t *bearer;
ogs_assert(sess);
ogs_assert(gy_message);
ogs_assert(gtp_xact);
ogs_assert(need_termination);
ogs_debug("[Gy CCA Initial]");
ogs_debug(" SGW_S5C_TEID[0x%x] PGW_S5C_TEID[0x%x]",
sess->sgw_s5c_teid, sess->smf_n4_teid);
if (gy_message->result_code != ER_DIAMETER_SUCCESS)
*need_termination = false;
if (gy_message->result_code != ER_DIAMETER_SUCCESS) {
ogs_warn("Gy CCA Initial Diameter failure: res=%u",
gy_message->result_code);
return gy_message->err ? *gy_message->err :
ER_DIAMETER_AUTHENTICATION_REJECTED;
}
if (gy_message->cca.result_code != ER_DIAMETER_SUCCESS) {
ogs_warn("Gy CCA Initial Diameter Multiple-Services-Credit-Control Result-Code=%u",
gy_message->cca.result_code);
/* Message RC was successful but MSCC was rejected. The session needs to
* be tear down through CCR-T: */
*need_termination = true;
return gy_message->cca.err ? *gy_message->cca.err :
ER_DIAMETER_AUTHENTICATION_REJECTED;
}
bearer = smf_default_bearer_in_sess(sess);
ogs_assert(bearer);
@ -173,8 +190,8 @@ uint32_t smf_gy_handle_cca_update_request(
sess->sgw_s5c_teid, sess->smf_n4_teid);
if (gy_message->result_code != ER_DIAMETER_SUCCESS) {
ogs_warn("Gy CCA Update Diameter failure: res=%u err=%u",
gy_message->result_code, *gy_message->err);
ogs_warn("Gy CCA Update Diameter failure: Result-Code=%u",
gy_message->result_code);
return gy_message->err ? *gy_message->err :
ER_DIAMETER_AUTHENTICATION_REJECTED;
}

View File

@ -29,7 +29,8 @@ extern "C" {
uint32_t smf_gy_handle_cca_initial_request(
smf_sess_t *sess, ogs_diam_gy_message_t *gy_message,
ogs_gtp_xact_t *gtp_xact);
ogs_gtp_xact_t *gtp_xact,
bool *need_termination);
uint32_t smf_gy_handle_cca_update_request(
smf_sess_t *sess, ogs_diam_gy_message_t *gy_message,
ogs_pfcp_xact_t *pfcp_xact);

View File

@ -144,7 +144,7 @@ static int sbi_status_from_pfcp(uint8_t pfcp_cause)
* other cause value on failure */
uint8_t smf_5gc_n4_handle_session_establishment_response(
smf_sess_t *sess, ogs_pfcp_xact_t *xact,
ogs_pfcp_session_establishment_response_t *rsp)
ogs_pfcp_message_t *pfcp_message)
{
int i;
@ -156,8 +156,12 @@ uint8_t smf_5gc_n4_handle_session_establishment_response(
ogs_pfcp_pdr_t *pdr = NULL;
ogs_pfcp_far_t *far = NULL;
ogs_pfcp_session_establishment_response_t *rsp = NULL;
ogs_assert(sess);
ogs_assert(xact);
ogs_assert(pfcp_message);
rsp = &pfcp_message->pfcp_session_establishment_response;
ogs_assert(rsp);
ogs_debug("Session Establishment Response [5gc]");
@ -240,18 +244,22 @@ uint8_t smf_5gc_n4_handle_session_establishment_response(
void smf_5gc_n4_handle_session_modification_response(
smf_sess_t *sess, ogs_pfcp_xact_t *xact,
ogs_pfcp_session_modification_response_t *rsp)
ogs_pfcp_message_t *pfcp_message)
{
int status = 0;
uint64_t flags = 0;
ogs_sbi_stream_t *stream = NULL;
smf_bearer_t *qos_flow = NULL;
ogs_pfcp_session_modification_response_t *rsp = NULL;
OGS_LIST(pdr_to_create_list);
ogs_debug("Session Modification Response [5gc]");
ogs_assert(xact);
ogs_assert(pfcp_message);
rsp = &pfcp_message->pfcp_session_modification_response;
ogs_assert(rsp);
flags = xact->modify_flags;
@ -665,12 +673,16 @@ void smf_5gc_n4_handle_session_modification_response(
int smf_5gc_n4_handle_session_deletion_response(
smf_sess_t *sess, ogs_sbi_stream_t *stream, int trigger,
ogs_pfcp_session_deletion_response_t *rsp)
ogs_pfcp_message_t *pfcp_message)
{
int status = 0;
ogs_pfcp_session_deletion_response_t *rsp = NULL;
ogs_debug("Session Deletion Response [5gc]");
ogs_assert(pfcp_message);
rsp = &pfcp_message->pfcp_session_deletion_response;
ogs_assert(rsp);
ogs_assert(trigger);
@ -725,7 +737,7 @@ int smf_5gc_n4_handle_session_deletion_response(
* other cause value on failure */
uint8_t smf_epc_n4_handle_session_establishment_response(
smf_sess_t *sess, ogs_pfcp_xact_t *xact,
ogs_pfcp_session_establishment_response_t *rsp)
ogs_pfcp_message_t *pfcp_message)
{
uint8_t cause_value = OGS_PFCP_CAUSE_REQUEST_ACCEPTED;
@ -733,8 +745,12 @@ uint8_t smf_epc_n4_handle_session_establishment_response(
ogs_pfcp_f_seid_t *up_f_seid = NULL;
ogs_pfcp_session_establishment_response_t *rsp = NULL;
ogs_assert(sess);
ogs_assert(xact);
ogs_assert(pfcp_message);
rsp = &pfcp_message->pfcp_session_establishment_response;
ogs_assert(rsp);
ogs_debug("Session Establishment Response [epc]");
@ -828,7 +844,7 @@ uint8_t smf_epc_n4_handle_session_establishment_response(
void smf_epc_n4_handle_session_modification_response(
smf_sess_t *sess, ogs_pfcp_xact_t *xact,
ogs_gtp2_message_t *recv_message,
ogs_pfcp_session_modification_response_t *rsp)
ogs_pfcp_message_t *pfcp_message)
{
int i;
@ -844,9 +860,13 @@ void smf_epc_n4_handle_session_modification_response(
ogs_pfcp_pdr_t *pdr = NULL;
ogs_pfcp_far_t *far = NULL;
ogs_pfcp_session_modification_response_t *rsp = NULL;
OGS_LIST(pdr_to_create_list);
ogs_assert(xact);
ogs_assert(pfcp_message);
rsp = &pfcp_message->pfcp_session_modification_response;
ogs_assert(rsp);
ogs_debug("Session Modification Response [epc]");
@ -1093,13 +1113,17 @@ void smf_epc_n4_handle_session_modification_response(
uint8_t smf_epc_n4_handle_session_deletion_response(
smf_sess_t *sess, ogs_pfcp_xact_t *xact,
ogs_pfcp_session_deletion_response_t *rsp)
ogs_pfcp_message_t *pfcp_message)
{
smf_bearer_t *bearer = NULL;
unsigned int i;
ogs_pfcp_session_deletion_response_t *rsp = NULL;
ogs_assert(sess);
ogs_assert(xact);
ogs_assert(pfcp_message);
rsp = &pfcp_message->pfcp_session_deletion_response;
ogs_assert(rsp);
ogs_debug("Session Deletion Response [epc]");
@ -1149,7 +1173,7 @@ uint8_t smf_epc_n4_handle_session_deletion_response(
void smf_n4_handle_session_report_request(
smf_sess_t *sess, ogs_pfcp_xact_t *pfcp_xact,
ogs_pfcp_session_report_request_t *pfcp_req)
ogs_pfcp_message_t *pfcp_message)
{
smf_ue_t *smf_ue = NULL;
smf_bearer_t *qos_flow = NULL;
@ -1162,9 +1186,13 @@ void smf_n4_handle_session_report_request(
uint16_t pdr_id = 0;
unsigned int i;
ogs_pfcp_session_report_request_t *pfcp_req = NULL;
smf_metrics_inst_global_inc(SMF_METR_GLOB_CTR_SM_N4SESSIONREPORT);
ogs_assert(pfcp_xact);
ogs_assert(pfcp_message);
pfcp_req = &pfcp_message->pfcp_session_report_request;
ogs_assert(pfcp_req);
ogs_debug("Session Report Request");
@ -1182,7 +1210,8 @@ void smf_n4_handle_session_report_request(
}
if (cause_value != OGS_PFCP_CAUSE_REQUEST_ACCEPTED) {
ogs_pfcp_send_error_message(pfcp_xact, 0,
ogs_pfcp_send_error_message(pfcp_xact,
sess ? sess->upf_n4_seid : pfcp_message->h.seid,
OGS_PFCP_SESSION_REPORT_RESPONSE_TYPE,
cause_value, 0);
return;
@ -1222,7 +1251,8 @@ void smf_n4_handle_session_report_request(
if (paging_policy_indication_value) {
ogs_warn("Not implement - "
"Paging Policy Indication Value");
ogs_pfcp_send_error_message(pfcp_xact, 0,
ogs_pfcp_send_error_message(pfcp_xact,
sess ? sess->upf_n4_seid : pfcp_message->h.seid,
OGS_PFCP_SESSION_REPORT_RESPONSE_TYPE,
OGS_PFCP_CAUSE_SERVICE_NOT_SUPPORTED, 0);
return;
@ -1232,7 +1262,8 @@ void smf_n4_handle_session_report_request(
qos_flow = smf_qos_flow_find_by_qfi(sess, qfi);
if (!qos_flow) {
ogs_error("Cannot find the QoS Flow[%d]", qfi);
ogs_pfcp_send_error_message(pfcp_xact, 0,
ogs_pfcp_send_error_message(pfcp_xact,
sess ? sess->upf_n4_seid : pfcp_message->h.seid,
OGS_PFCP_SESSION_REPORT_RESPONSE_TYPE,
OGS_PFCP_CAUSE_SESSION_CONTEXT_NOT_FOUND, 0);
return;
@ -1257,7 +1288,8 @@ void smf_n4_handle_session_report_request(
if (!pdr) {
ogs_error("No Context");
ogs_pfcp_send_error_message(pfcp_xact, 0,
ogs_pfcp_send_error_message(pfcp_xact,
sess ? sess->upf_n4_seid : pfcp_message->h.seid,
OGS_PFCP_SESSION_REPORT_RESPONSE_TYPE,
OGS_PFCP_CAUSE_SESSION_CONTEXT_NOT_FOUND, 0);
return;

View File

@ -28,28 +28,28 @@ extern "C" {
uint8_t smf_5gc_n4_handle_session_establishment_response(
smf_sess_t *sess, ogs_pfcp_xact_t *xact,
ogs_pfcp_session_establishment_response_t *rsp);
ogs_pfcp_message_t *pfcp_message);
void smf_5gc_n4_handle_session_modification_response(
smf_sess_t *sess, ogs_pfcp_xact_t *xact,
ogs_pfcp_session_modification_response_t *rsp);
ogs_pfcp_message_t *pfcp_message);
int smf_5gc_n4_handle_session_deletion_response(
smf_sess_t *sess, ogs_sbi_stream_t *stream, int trigger,
ogs_pfcp_session_deletion_response_t *rsp);
ogs_pfcp_message_t *pfcp_message);
uint8_t smf_epc_n4_handle_session_establishment_response(
smf_sess_t *sess, ogs_pfcp_xact_t *xact,
ogs_pfcp_session_establishment_response_t *rsp);
ogs_pfcp_message_t *pfcp_message);
void smf_epc_n4_handle_session_modification_response(
smf_sess_t *sess, ogs_pfcp_xact_t *xact,
ogs_gtp2_message_t *recv_message,
ogs_pfcp_session_modification_response_t *rsp);
ogs_pfcp_message_t *pfcp_message);
uint8_t smf_epc_n4_handle_session_deletion_response(
smf_sess_t *sess, ogs_pfcp_xact_t *xact,
ogs_pfcp_session_deletion_response_t *rsp);
ogs_pfcp_message_t *pfcp_message);
void smf_n4_handle_session_report_request(
smf_sess_t *sess, ogs_pfcp_xact_t *pfcp_xact,
ogs_pfcp_session_report_request_t *pfcp_req);
ogs_pfcp_message_t *pfcp_message);
uint8_t gtp_cause_from_pfcp(uint8_t pfcp_cause, uint8_t gtp_version);

View File

@ -337,11 +337,10 @@ void smf_pfcp_state_associated(ogs_fsm_t *s, smf_event_t *e)
if (xact->epc)
smf_epc_n4_handle_session_modification_response(
sess, xact, e->gtp2_message,
&message->pfcp_session_modification_response);
sess, xact, e->gtp2_message, message);
else
smf_5gc_n4_handle_session_modification_response(
sess, xact, &message->pfcp_session_modification_response);
sess, xact, message);
break;
case OGS_PFCP_SESSION_DELETION_RESPONSE_TYPE:
@ -371,7 +370,7 @@ void smf_pfcp_state_associated(ogs_fsm_t *s, smf_event_t *e)
if (!message->h.seid_presence) ogs_error("No SEID");
smf_n4_handle_session_report_request(
sess, xact, &message->pfcp_session_report_request);
sess, xact, message);
break;
default:

View File

@ -70,7 +70,7 @@ void smf_s5c_handle_echo_response(
uint8_t smf_s5c_handle_create_session_request(
smf_sess_t *sess, ogs_gtp_xact_t *xact,
ogs_gtp2_create_session_request_t *req)
ogs_gtp2_message_t *gtp2_message)
{
char buf1[OGS_ADDRSTRLEN];
char buf2[OGS_ADDRSTRLEN];
@ -89,8 +89,11 @@ uint8_t smf_s5c_handle_create_session_request(
ogs_gtp2_ambr_t *ambr = NULL;
uint16_t decoded = 0;
ogs_gtp2_create_session_request_t *req = NULL;
ogs_assert(sess);
ogs_assert(xact);
req = &gtp2_message->create_session_request;
ogs_assert(req);
ogs_debug("Create Session Request");
@ -104,7 +107,18 @@ uint8_t smf_s5c_handle_create_session_request(
if (req->sender_f_teid_for_control_plane.presence == 0) {
ogs_error("No TEID");
cause_value = OGS_GTP2_CAUSE_MANDATORY_IE_MISSING;
} else {
/* Control Plane(DL) : SGW-S5C */
sgw_s5c_teid = req->sender_f_teid_for_control_plane.data;
ogs_assert(sgw_s5c_teid);
sess->sgw_s5c_teid = be32toh(sgw_s5c_teid->teid);
rv = ogs_gtp2_f_teid_to_ip(sgw_s5c_teid, &sess->sgw_s5c_ip);
ogs_assert(rv == OGS_OK);
ogs_debug(" SGW_S5C_TEID[0x%x] SMF_N4_TEID[0x%x]",
sess->sgw_s5c_teid, sess->smf_n4_teid);
}
if (req->bearer_contexts_to_be_created[0].presence == 0) {
ogs_error("No Bearer");
cause_value = OGS_GTP2_CAUSE_MANDATORY_IE_MISSING;
@ -278,16 +292,6 @@ uint8_t smf_s5c_handle_create_session_request(
sess->ipv4 ? OGS_INET_NTOP(&sess->ipv4->addr, buf1) : "",
sess->ipv6 ? OGS_INET6_NTOP(&sess->ipv6->addr, buf2) : "");
/* Control Plane(DL) : SGW-S5C */
sgw_s5c_teid = req->sender_f_teid_for_control_plane.data;
ogs_assert(sgw_s5c_teid);
sess->sgw_s5c_teid = be32toh(sgw_s5c_teid->teid);
rv = ogs_gtp2_f_teid_to_ip(sgw_s5c_teid, &sess->sgw_s5c_ip);
ogs_assert(rv == OGS_OK);
ogs_debug(" SGW_S5C_TEID[0x%x] SMF_N4_TEID[0x%x]",
sess->sgw_s5c_teid, sess->smf_n4_teid);
/* Remove all previous bearer */
smf_bearer_remove_all(sess);
@ -422,11 +426,14 @@ uint8_t smf_s5c_handle_create_session_request(
uint8_t smf_s5c_handle_delete_session_request(
smf_sess_t *sess, ogs_gtp_xact_t *xact,
ogs_gtp2_delete_session_request_t *req)
ogs_gtp2_message_t *gtp2_message)
{
ogs_gtp2_delete_session_request_t *req = NULL;
ogs_debug("Delete Session Request");
ogs_assert(xact);
req = &gtp2_message->delete_session_request;
ogs_assert(req);
if (!ogs_diam_app_connected(OGS_DIAM_GX_APPLICATION_ID)) {
@ -479,7 +486,7 @@ uint8_t smf_s5c_handle_delete_session_request(
void smf_s5c_handle_modify_bearer_request(
smf_sess_t *sess, ogs_gtp_xact_t *gtp_xact,
ogs_pkbuf_t *gtpbuf, ogs_gtp2_modify_bearer_request_t *req)
ogs_pkbuf_t *gtpbuf, ogs_gtp2_message_t *gtp2_message)
{
int rv, i;
uint8_t cause_value = 0;
@ -488,9 +495,13 @@ void smf_s5c_handle_modify_bearer_request(
smf_ue_t *smf_ue = NULL;
smf_bearer_t *bearer = NULL;
ogs_gtp2_modify_bearer_request_t *req = NULL;
ogs_debug("Modify Bearer Request");
ogs_assert(gtp_xact);
ogs_assert(gtp2_message);
req = &gtp2_message->modify_bearer_request;
ogs_assert(req);
/************************
@ -504,7 +515,8 @@ void smf_s5c_handle_modify_bearer_request(
}
if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
ogs_gtp2_send_error_message(gtp_xact, sess ? sess->sgw_s5c_teid : 0,
ogs_gtp2_send_error_message(gtp_xact,
sess ? sess->sgw_s5c_teid : gtp2_message->h.teid,
OGS_GTP2_MODIFY_BEARER_RESPONSE_TYPE, cause_value);
return;
}
@ -648,7 +660,7 @@ void smf_s5c_handle_modify_bearer_request(
void smf_s5c_handle_create_bearer_response(
smf_sess_t *sess, ogs_gtp_xact_t *xact,
ogs_gtp2_create_bearer_response_t *rsp)
ogs_gtp2_message_t *gtp2_message)
{
int rv;
uint8_t cause_value;
@ -657,7 +669,10 @@ void smf_s5c_handle_create_bearer_response(
smf_bearer_t *bearer = NULL;
ogs_pfcp_far_t *dl_far = NULL;
ogs_gtp2_create_bearer_response_t *rsp = NULL;
ogs_assert(sess);
rsp = &gtp2_message->create_bearer_response;
ogs_assert(rsp);
ogs_debug("Create Bearer Response");
@ -822,7 +837,7 @@ void smf_s5c_handle_create_bearer_response(
void smf_s5c_handle_update_bearer_response(
smf_sess_t *sess, ogs_gtp_xact_t *xact,
ogs_gtp2_update_bearer_response_t *rsp)
ogs_gtp2_message_t *gtp2_message)
{
int rv;
uint8_t cause_value;
@ -831,7 +846,10 @@ void smf_s5c_handle_update_bearer_response(
uint64_t pfcp_flags = 0;
smf_bearer_t *bearer = NULL;
ogs_gtp2_update_bearer_response_t *rsp = NULL;
ogs_assert(sess);
rsp = &gtp2_message->update_bearer_response;
ogs_assert(rsp);
ogs_debug("Update Bearer Response");
@ -929,13 +947,16 @@ void smf_s5c_handle_update_bearer_response(
/* return true if entire session must be released */
bool smf_s5c_handle_delete_bearer_response(
smf_sess_t *sess, ogs_gtp_xact_t *xact,
ogs_gtp2_delete_bearer_response_t *rsp)
ogs_gtp2_message_t *gtp2_message)
{
int rv;
uint8_t cause_value;
smf_bearer_t *bearer = NULL;
ogs_gtp2_delete_bearer_response_t *rsp = NULL;
ogs_assert(sess);
rsp = &gtp2_message->delete_bearer_response;
ogs_assert(rsp);
ogs_debug("Delete Bearer Response");
@ -1132,7 +1153,7 @@ static int reconfigure_packet_filter(smf_pf_t *pf, ogs_gtp2_tft_t *tft, int i)
void smf_s5c_handle_bearer_resource_command(
smf_sess_t *sess, ogs_gtp_xact_t *xact,
ogs_gtp2_bearer_resource_command_t *cmd)
ogs_gtp2_message_t *gtp2_message)
{
int rv;
uint8_t cause_value = 0;
@ -1151,7 +1172,11 @@ void smf_s5c_handle_bearer_resource_command(
int qos_update = 0;
int tft_delete = 0;
ogs_gtp2_bearer_resource_command_t *cmd = NULL;
ogs_assert(xact);
ogs_assert(gtp2_message);
cmd = &gtp2_message->bearer_resource_command;
ogs_assert(cmd);
ogs_debug("Bearer Resource Command");
@ -1186,7 +1211,8 @@ void smf_s5c_handle_bearer_resource_command(
}
if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
ogs_gtp2_send_error_message(xact, sess ? sess->sgw_s5c_teid : 0,
ogs_gtp2_send_error_message(xact,
sess ? sess->sgw_s5c_teid : gtp2_message->h.teid,
OGS_GTP2_BEARER_RESOURCE_FAILURE_INDICATION_TYPE, cause_value);
return;
}
@ -1211,7 +1237,8 @@ void smf_s5c_handle_bearer_resource_command(
}
if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
ogs_gtp2_send_error_message(xact, sess ? sess->sgw_s5c_teid : 0,
ogs_gtp2_send_error_message(xact,
sess ? sess->sgw_s5c_teid : gtp2_message->h.teid,
OGS_GTP2_BEARER_RESOURCE_FAILURE_INDICATION_TYPE, cause_value);
return;
}
@ -1241,7 +1268,7 @@ void smf_s5c_handle_bearer_resource_command(
if (pf) {
if (reconfigure_packet_filter(pf, &tft, i) < 0) {
ogs_gtp2_send_error_message(
xact, sess ? sess->sgw_s5c_teid : 0,
xact, sess ? sess->sgw_s5c_teid : gtp2_message->h.teid,
OGS_GTP2_BEARER_RESOURCE_FAILURE_INDICATION_TYPE,
OGS_GTP2_CAUSE_SEMANTIC_ERRORS_IN_PACKET_FILTER);
return;
@ -1310,7 +1337,7 @@ void smf_s5c_handle_bearer_resource_command(
if (reconfigure_packet_filter(pf, &tft, i) < 0) {
ogs_gtp2_send_error_message(
xact, sess ? sess->sgw_s5c_teid : 0,
xact, sess ? sess->sgw_s5c_teid : gtp2_message->h.teid,
OGS_GTP2_BEARER_RESOURCE_FAILURE_INDICATION_TYPE,
OGS_GTP2_CAUSE_SEMANTIC_ERRORS_IN_PACKET_FILTER);
return;
@ -1396,7 +1423,8 @@ void smf_s5c_handle_bearer_resource_command(
if (tft_update == 0 && tft_delete == 0 && qos_update == 0) {
/* No modification */
ogs_gtp2_send_error_message(xact, sess ? sess->sgw_s5c_teid : 0,
ogs_gtp2_send_error_message(xact,
sess ? sess->sgw_s5c_teid : gtp2_message->h.teid,
OGS_GTP2_BEARER_RESOURCE_FAILURE_INDICATION_TYPE,
OGS_GTP2_CAUSE_SERVICE_NOT_SUPPORTED);
return;

View File

@ -33,25 +33,25 @@ void smf_s5c_handle_echo_response(
uint8_t smf_s5c_handle_create_session_request(
smf_sess_t *sess, ogs_gtp_xact_t *xact,
ogs_gtp2_create_session_request_t *req);
ogs_gtp2_message_t *gtp2_message);
uint8_t smf_s5c_handle_delete_session_request(
smf_sess_t *sess, ogs_gtp_xact_t *xact,
ogs_gtp2_delete_session_request_t *req);
ogs_gtp2_message_t *gtp2_message);
void smf_s5c_handle_modify_bearer_request(
smf_sess_t *sess, ogs_gtp_xact_t *xact,
ogs_pkbuf_t *gtpbuf, ogs_gtp2_modify_bearer_request_t *req);
ogs_pkbuf_t *gtpbuf, ogs_gtp2_message_t *gtp2_message);
void smf_s5c_handle_create_bearer_response(
smf_sess_t *sess, ogs_gtp_xact_t *xact,
ogs_gtp2_create_bearer_response_t *rsp);
ogs_gtp2_message_t *gtp2_message);
void smf_s5c_handle_update_bearer_response(
smf_sess_t *sess, ogs_gtp_xact_t *xact,
ogs_gtp2_update_bearer_response_t *rsp);
ogs_gtp2_message_t *gtp2_message);
bool smf_s5c_handle_delete_bearer_response(
smf_sess_t *sess, ogs_gtp_xact_t *xact,
ogs_gtp2_delete_bearer_response_t *rsp);
ogs_gtp2_message_t *gtp2_message);
void smf_s5c_handle_bearer_resource_command(
smf_sess_t *sess, ogs_gtp_xact_t *xact,
ogs_gtp2_bearer_resource_command_t *cmd);
ogs_gtp2_message_t *gtp2_message);
#ifdef __cplusplus
}

View File

@ -144,7 +144,7 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e)
}
if (!sess) {
ogs_error("No Session");
ogs_gtp2_send_error_message(gtp_xact, 0,
ogs_gtp2_send_error_message(gtp_xact, gtp2_message.h.teid,
OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE,
OGS_GTP2_CAUSE_CONTEXT_NOT_FOUND);
break;
@ -158,7 +158,7 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e)
smf_metrics_inst_gtp_node_inc(smf_gnode->metrics, SMF_METR_GTP_NODE_CTR_S5C_RX_DELETESESSIONREQ);
if (!sess) {
ogs_error("No Session");
ogs_gtp2_send_error_message(gtp_xact, 0,
ogs_gtp2_send_error_message(gtp_xact, gtp2_message.h.teid,
OGS_GTP2_DELETE_SESSION_RESPONSE_TYPE,
OGS_GTP2_CAUSE_CONTEXT_NOT_FOUND);
break;
@ -169,17 +169,17 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e)
case OGS_GTP2_MODIFY_BEARER_REQUEST_TYPE:
if (!gtp2_message.h.teid_presence) ogs_error("No TEID");
smf_s5c_handle_modify_bearer_request(
sess, gtp_xact, recvbuf, &gtp2_message.modify_bearer_request);
sess, gtp_xact, recvbuf, &gtp2_message);
break;
case OGS_GTP2_CREATE_BEARER_RESPONSE_TYPE:
if (!gtp2_message.h.teid_presence) ogs_error("No TEID");
smf_s5c_handle_create_bearer_response(
sess, gtp_xact, &gtp2_message.create_bearer_response);
sess, gtp_xact, &gtp2_message);
break;
case OGS_GTP2_UPDATE_BEARER_RESPONSE_TYPE:
if (!gtp2_message.h.teid_presence) ogs_error("No TEID");
smf_s5c_handle_update_bearer_response(
sess, gtp_xact, &gtp2_message.update_bearer_response);
sess, gtp_xact, &gtp2_message);
break;
case OGS_GTP2_DELETE_BEARER_RESPONSE_TYPE:
if (!gtp2_message.h.teid_presence) ogs_error("No TEID");
@ -194,7 +194,7 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e)
case OGS_GTP2_BEARER_RESOURCE_COMMAND_TYPE:
if (!gtp2_message.h.teid_presence) ogs_error("No TEID");
smf_s5c_handle_bearer_resource_command(
sess, gtp_xact, &gtp2_message.bearer_resource_command);
sess, gtp_xact, &gtp2_message);
break;
default:
ogs_warn("Not implemented(type:%d)", gtp2_message.h.type);

View File

@ -44,8 +44,7 @@ static void upf_n4_handle_create_urr(upf_sess_t *sess, ogs_pfcp_tlv_create_urr_t
}
void upf_n4_handle_session_establishment_request(
upf_sess_t *sess, ogs_pfcp_xact_t *xact,
ogs_pfcp_session_establishment_request_t *req)
upf_sess_t *sess, ogs_pfcp_xact_t *xact, ogs_pfcp_message_t *message)
{
ogs_pfcp_pdr_t *pdr = NULL;
ogs_pfcp_far_t *far = NULL;
@ -58,9 +57,13 @@ void upf_n4_handle_session_establishment_request(
ogs_pfcp_sereq_flags_t sereq_flags;
bool restoration_indication = false;
ogs_pfcp_session_establishment_request_t *req = NULL;
upf_metrics_inst_global_inc(UPF_METR_GLOB_CTR_SM_N4SESSIONESTABREQ);
ogs_assert(xact);
ogs_assert(message);
req = &message->pfcp_session_establishment_request;
ogs_assert(req);
ogs_debug("Session Establishment Request");
@ -69,7 +72,8 @@ void upf_n4_handle_session_establishment_request(
if (!sess) {
ogs_error("No Context");
ogs_pfcp_send_error_message(xact, 0,
ogs_pfcp_send_error_message(
xact, sess ? sess->smf_n4_f_seid.seid : message->h.seid,
OGS_PFCP_SESSION_ESTABLISHMENT_RESPONSE_TYPE,
OGS_PFCP_CAUSE_MANDATORY_IE_MISSING, 0);
upf_metrics_inst_by_cause_add(OGS_PFCP_CAUSE_MANDATORY_IE_MISSING,
@ -214,14 +218,14 @@ cleanup:
upf_metrics_inst_by_cause_add(cause_value,
UPF_METR_CTR_SM_N4SESSIONESTABFAIL, 1);
ogs_pfcp_sess_clear(&sess->pfcp);
ogs_pfcp_send_error_message(xact, sess ? sess->smf_n4_f_seid.seid : 0,
ogs_pfcp_send_error_message(
xact, sess ? sess->smf_n4_f_seid.seid : message->h.seid,
OGS_PFCP_SESSION_ESTABLISHMENT_RESPONSE_TYPE,
cause_value, offending_ie_value);
}
void upf_n4_handle_session_modification_request(
upf_sess_t *sess, ogs_pfcp_xact_t *xact,
ogs_pfcp_session_modification_request_t *req)
upf_sess_t *sess, ogs_pfcp_xact_t *xact, ogs_pfcp_message_t *message)
{
ogs_pfcp_pdr_t *pdr = NULL;
ogs_pfcp_far_t *far = NULL;
@ -231,7 +235,11 @@ void upf_n4_handle_session_modification_request(
uint8_t offending_ie_value = 0;
int i;
ogs_pfcp_session_modification_request_t *req = NULL;
ogs_assert(xact);
ogs_assert(message);
req = &message->pfcp_session_modification_request;
ogs_assert(req);
ogs_debug("Session Modification Request");
@ -240,7 +248,8 @@ void upf_n4_handle_session_modification_request(
if (!sess) {
ogs_error("No Context");
ogs_pfcp_send_error_message(xact, 0,
ogs_pfcp_send_error_message(
xact, sess ? sess->smf_n4_f_seid.seid : message->h.seid,
OGS_PFCP_SESSION_MODIFICATION_RESPONSE_TYPE,
OGS_PFCP_CAUSE_SESSION_CONTEXT_NOT_FOUND, 0);
return;
@ -413,25 +422,30 @@ void upf_n4_handle_session_modification_request(
cleanup:
ogs_pfcp_sess_clear(&sess->pfcp);
ogs_pfcp_send_error_message(xact, sess ? sess->smf_n4_f_seid.seid : 0,
ogs_pfcp_send_error_message(
xact, sess ? sess->smf_n4_f_seid.seid : message->h.seid,
OGS_PFCP_SESSION_MODIFICATION_RESPONSE_TYPE,
cause_value, offending_ie_value);
}
void upf_n4_handle_session_deletion_request(
upf_sess_t *sess, ogs_pfcp_xact_t *xact,
ogs_pfcp_session_deletion_request_t *req)
upf_sess_t *sess, ogs_pfcp_xact_t *xact, ogs_pfcp_message_t *message)
{
ogs_pfcp_qer_t *qer = NULL;
ogs_pfcp_session_deletion_request_t *req = NULL;
ogs_assert(xact);
ogs_assert(message);
req = &message->pfcp_session_deletion_request;
ogs_assert(req);
ogs_debug("Session Deletion Request");
if (!sess) {
ogs_error("No Context");
ogs_pfcp_send_error_message(xact, 0,
ogs_pfcp_send_error_message(xact,
sess ? sess->smf_n4_f_seid.seid : message->h.seid,
OGS_PFCP_SESSION_DELETION_RESPONSE_TYPE,
OGS_PFCP_CAUSE_SESSION_CONTEXT_NOT_FOUND, 0);
return;
@ -446,12 +460,15 @@ void upf_n4_handle_session_deletion_request(
}
void upf_n4_handle_session_report_response(
upf_sess_t *sess, ogs_pfcp_xact_t *xact,
ogs_pfcp_session_report_response_t *rsp)
upf_sess_t *sess, ogs_pfcp_xact_t *xact, ogs_pfcp_message_t *message)
{
uint8_t cause_value = 0;
ogs_pfcp_session_report_response_t *rsp = NULL;
ogs_assert(xact);
ogs_assert(message);
rsp = &message->pfcp_session_report_response;
ogs_assert(rsp);
ogs_pfcp_xact_commit(xact);

View File

@ -27,18 +27,14 @@ extern "C" {
#endif
void upf_n4_handle_session_establishment_request(
upf_sess_t *sess, ogs_pfcp_xact_t *xact,
ogs_pfcp_session_establishment_request_t *req);
upf_sess_t *sess, ogs_pfcp_xact_t *xact, ogs_pfcp_message_t *message);
void upf_n4_handle_session_modification_request(
upf_sess_t *sess, ogs_pfcp_xact_t *xact,
ogs_pfcp_session_modification_request_t *req);
upf_sess_t *sess, ogs_pfcp_xact_t *xact, ogs_pfcp_message_t *message);
void upf_n4_handle_session_deletion_request(
upf_sess_t *sess, ogs_pfcp_xact_t *xact,
ogs_pfcp_session_deletion_request_t *req);
upf_sess_t *sess, ogs_pfcp_xact_t *xact, ogs_pfcp_message_t *message);
void upf_n4_handle_session_report_response(
upf_sess_t *sess, ogs_pfcp_xact_t *xact,
ogs_pfcp_session_report_response_t *rsp);
upf_sess_t *sess, ogs_pfcp_xact_t *xact, ogs_pfcp_message_t *message);
#ifdef __cplusplus
}

View File

@ -284,20 +284,16 @@ void upf_pfcp_state_associated(ogs_fsm_t *s, upf_event_t *e)
sess = upf_sess_add_by_message(message);
if (sess)
OGS_SETUP_PFCP_NODE(sess, node);
upf_n4_handle_session_establishment_request(
sess, xact, &message->pfcp_session_establishment_request);
upf_n4_handle_session_establishment_request(sess, xact, message);
break;
case OGS_PFCP_SESSION_MODIFICATION_REQUEST_TYPE:
upf_n4_handle_session_modification_request(
sess, xact, &message->pfcp_session_modification_request);
upf_n4_handle_session_modification_request(sess, xact, message);
break;
case OGS_PFCP_SESSION_DELETION_REQUEST_TYPE:
upf_n4_handle_session_deletion_request(
sess, xact, &message->pfcp_session_deletion_request);
upf_n4_handle_session_deletion_request(sess, xact, message);
break;
case OGS_PFCP_SESSION_REPORT_RESPONSE_TYPE:
upf_n4_handle_session_report_response(
sess, xact, &message->pfcp_session_report_response);
upf_n4_handle_session_report_response(sess, xact, message);
break;
default:
ogs_error("Not implemented PFCP message type[%d]",