[GTP] Several fixes and improvements around ogs_gtp_xact_find_by_xid (#1567)

* [GTP] Add missing msg types to ogs_gtp_xact_get_stage()

* [GTP] Avoid returning wrong xact by xif if none found

* [GTP] Avoid crash if ogs_gtp_xact_get_stage() fails

* [GTP] Rename s/ogs_gtp_xact_get_stage/ogs_gtp2_xact_get_stage/
This commit is contained in:
Pau Espin 2022-05-31 14:24:00 +02:00 committed by GitHub
parent b6f2146594
commit c2bda0b576
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 43 additions and 14 deletions

View File

@ -34,7 +34,7 @@ static uint32_t g_xact_id = 0;
static OGS_POOL(pool, ogs_gtp_xact_t);
static ogs_gtp_xact_t *ogs_gtp_xact_remote_create(ogs_gtp_node_t *gnode, uint8_t gtp_version, uint32_t sqn);
static ogs_gtp_xact_stage_t ogs_gtp_xact_get_stage(uint8_t type, uint32_t sqn);
static ogs_gtp_xact_stage_t ogs_gtp2_xact_get_stage(uint8_t type, uint32_t sqn);
static ogs_gtp_xact_stage_t ogs_gtp1_xact_get_stage(uint8_t type, uint32_t sqn);
static int ogs_gtp_xact_delete(ogs_gtp_xact_t *xact);
static int ogs_gtp_xact_update_rx(ogs_gtp_xact_t *xact, uint8_t type);
@ -352,7 +352,7 @@ int ogs_gtp_xact_update_tx(ogs_gtp_xact_t *xact,
OGS_ADDR(&xact->gnode->addr, buf),
OGS_PORT(&xact->gnode->addr));
stage = ogs_gtp_xact_get_stage(hdesc->type, xact->xid);
stage = ogs_gtp2_xact_get_stage(hdesc->type, xact->xid);
if (xact->org == OGS_GTP_LOCAL_ORIGINATOR) {
switch (stage) {
case GTP_XACT_INITIAL_STAGE:
@ -456,7 +456,7 @@ static int ogs_gtp_xact_update_rx(ogs_gtp_xact_t *xact, uint8_t type)
if (xact->gtp_version == 1)
stage = ogs_gtp1_xact_get_stage(type, xact->xid);
else
stage = ogs_gtp_xact_get_stage(type, xact->xid);
stage = ogs_gtp2_xact_get_stage(type, xact->xid);
if (xact->org == OGS_GTP_LOCAL_ORIGINATOR) {
switch (stage) {
@ -640,7 +640,7 @@ int ogs_gtp_xact_commit(ogs_gtp_xact_t *xact)
if (xact->gtp_version == 1)
stage = ogs_gtp1_xact_get_stage(type, xact->xid);
else
stage = ogs_gtp_xact_get_stage(type, xact->xid);
stage = ogs_gtp2_xact_get_stage(type, xact->xid);
if (xact->org == OGS_GTP_LOCAL_ORIGINATOR) {
switch (stage) {
@ -946,22 +946,36 @@ static ogs_gtp_xact_stage_t ogs_gtp1_xact_get_stage(uint8_t type, uint32_t xid)
return stage;
}
static ogs_gtp_xact_stage_t ogs_gtp_xact_get_stage(uint8_t type, uint32_t xid)
/* TS 29.274 Table 6.1-1 */
static ogs_gtp_xact_stage_t ogs_gtp2_xact_get_stage(uint8_t type, uint32_t xid)
{
ogs_gtp_xact_stage_t stage = GTP_XACT_UNKNOWN_STAGE;
switch (type) {
case OGS_GTP2_ECHO_REQUEST_TYPE:
case OGS_GTP2_CREATE_SESSION_REQUEST_TYPE:
case OGS_GTP2_MODIFY_BEARER_REQUEST_TYPE:
case OGS_GTP2_DELETE_SESSION_REQUEST_TYPE:
case OGS_GTP2_CHANGE_NOTIFICATION_REQUEST_TYPE:
case OGS_GTP2_REMOTE_UE_REPORT_NOTIFICATION_TYPE:
case OGS_GTP2_MODIFY_BEARER_COMMAND_TYPE:
case OGS_GTP2_DELETE_BEARER_COMMAND_TYPE:
case OGS_GTP2_BEARER_RESOURCE_COMMAND_TYPE:
case OGS_GTP2_RELEASE_ACCESS_BEARERS_REQUEST_TYPE:
case OGS_GTP2_TRACE_SESSION_ACTIVATION_TYPE:
case OGS_GTP2_TRACE_SESSION_DEACTIVATION_TYPE:
case OGS_GTP2_STOP_PAGING_INDICATION_TYPE:
case OGS_GTP2_DELETE_PDN_CONNECTION_SET_REQUEST_TYPE:
case OGS_GTP2_PGW_DOWNLINK_TRIGGERING_NOTIFICATION_TYPE:
case OGS_GTP2_CREATE_FORWARDING_TUNNEL_REQUEST_TYPE:
case OGS_GTP2_SUSPEND_NOTIFICATION_TYPE:
case OGS_GTP2_RESUME_NOTIFICATION_TYPE:
case OGS_GTP2_CREATE_INDIRECT_DATA_FORWARDING_TUNNEL_REQUEST_TYPE:
case OGS_GTP2_DELETE_INDIRECT_DATA_FORWARDING_TUNNEL_REQUEST_TYPE:
case OGS_GTP2_RELEASE_ACCESS_BEARERS_REQUEST_TYPE:
case OGS_GTP2_DOWNLINK_DATA_NOTIFICATION_TYPE:
case OGS_GTP2_ECHO_REQUEST_TYPE:
case OGS_GTP2_PGW_RESTART_NOTIFICATION_TYPE:
case OGS_GTP2_UPDATE_PDN_CONNECTION_SET_REQUEST_TYPE:
case OGS_GTP2_MODIFY_ACCESS_BEARERS_REQUEST_TYPE:
stage = GTP_XACT_INITIAL_STAGE;
break;
case OGS_GTP2_CREATE_BEARER_REQUEST_TYPE:
@ -972,20 +986,32 @@ static ogs_gtp_xact_stage_t ogs_gtp_xact_get_stage(uint8_t type, uint32_t xid)
else
stage = GTP_XACT_INITIAL_STAGE;
break;
case OGS_GTP2_ECHO_RESPONSE_TYPE:
case OGS_GTP2_VERSION_NOT_SUPPORTED_INDICATION_TYPE:
case OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE:
case OGS_GTP2_MODIFY_BEARER_RESPONSE_TYPE:
case OGS_GTP2_DELETE_SESSION_RESPONSE_TYPE:
case OGS_GTP2_CHANGE_NOTIFICATION_RESPONSE_TYPE:
case OGS_GTP2_REMOTE_UE_REPORT_ACKNOWLEDGE_TYPE:
case OGS_GTP2_MODIFY_BEARER_FAILURE_INDICATION_TYPE:
case OGS_GTP2_DELETE_BEARER_FAILURE_INDICATION_TYPE:
case OGS_GTP2_BEARER_RESOURCE_FAILURE_INDICATION_TYPE:
case OGS_GTP2_DOWNLINK_DATA_NOTIFICATION_FAILURE_INDICATION_TYPE:
case OGS_GTP2_CREATE_BEARER_RESPONSE_TYPE:
case OGS_GTP2_UPDATE_BEARER_RESPONSE_TYPE:
case OGS_GTP2_DELETE_BEARER_RESPONSE_TYPE:
case OGS_GTP2_RELEASE_ACCESS_BEARERS_RESPONSE_TYPE:
case OGS_GTP2_DELETE_PDN_CONNECTION_SET_RESPONSE_TYPE:
case OGS_GTP2_PGW_DOWNLINK_TRIGGERING_ACKNOWLEDGE_TYPE:
case OGS_GTP2_CREATE_FORWARDING_TUNNEL_RESPONSE_TYPE:
case OGS_GTP2_SUSPEND_ACKNOWLEDGE_TYPE:
case OGS_GTP2_RESUME_ACKNOWLEDGE_TYPE:
case OGS_GTP2_CREATE_INDIRECT_DATA_FORWARDING_TUNNEL_RESPONSE_TYPE:
case OGS_GTP2_DELETE_INDIRECT_DATA_FORWARDING_TUNNEL_RESPONSE_TYPE:
case OGS_GTP2_RELEASE_ACCESS_BEARERS_RESPONSE_TYPE:
case OGS_GTP2_DOWNLINK_DATA_NOTIFICATION_ACKNOWLEDGE_TYPE:
case OGS_GTP2_ECHO_RESPONSE_TYPE:
case OGS_GTP2_PGW_RESTART_NOTIFICATION_ACKNOWLEDGE_TYPE:
case OGS_GTP2_UPDATE_PDN_CONNECTION_SET_RESPONSE_TYPE:
case OGS_GTP2_MODIFY_ACCESS_BEARERS_RESPONSE_TYPE:
stage = GTP_XACT_FINAL_STAGE;
break;
@ -1011,7 +1037,7 @@ static ogs_gtp_xact_t *ogs_gtp_xact_find_by_xid(
if (gtp_version == 1)
stage = ogs_gtp1_xact_get_stage(type, xid);
else
stage = ogs_gtp_xact_get_stage(type, xid);
stage = ogs_gtp2_xact_get_stage(type, xid);
switch (stage) {
case GTP_XACT_INITIAL_STAGE:
@ -1042,8 +1068,8 @@ static ogs_gtp_xact_t *ogs_gtp_xact_find_by_xid(
}
break;
default:
ogs_assert_if_reached();
break;
ogs_warn("%s: Unexpected stage %u.", OGS_FUNC, stage);
return NULL;
}
ogs_assert(list);
@ -1055,11 +1081,14 @@ static ogs_gtp_xact_t *ogs_gtp_xact_find_by_xid(
xact->gtp_version,
OGS_ADDR(&gnode->addr, buf),
OGS_PORT(&gnode->addr));
break;
return xact;
}
}
return xact;
ogs_error("[%d] Failed Finding xact type %u from GTPv%u peer [%s]:%d",
xid, type, gtp_version,
OGS_ADDR(&gnode->addr, buf), OGS_PORT(&gnode->addr));
return NULL;
}
void ogs_gtp_xact_associate(ogs_gtp_xact_t *xact1, ogs_gtp_xact_t *xact2)