Create Bearer Request (SGW->MME)

This commit is contained in:
Sukchan Lee 2017-09-04 20:06:54 +09:00
parent abbd8fa869
commit 1c8a59d3b4
18 changed files with 229 additions and 105 deletions

View File

@ -27,7 +27,7 @@ typedef enum {
static int gtp_xact_initialized = 0;
static tm_service_t *g_tm_service = NULL;
static c_uintptr_t g_response_event = 0;
static c_uintptr_t g_duplicated_event = 0;
static c_uintptr_t g_holding_event = 0;
static c_uint32_t g_xact_id = 0;
index_declare(gtp_xact_pool, gtp_xact_t, SIZE_OF_GTP_XACT_POOL);
@ -36,7 +36,7 @@ static gtp_xact_stage_t gtp_xact_get_stage(c_uint8_t type, c_uint32_t sqn);
static status_t gtp_xact_delete(gtp_xact_t *xact);
status_t gtp_xact_init(tm_service_t *tm_service,
c_uintptr_t response_event, c_uintptr_t duplicated_event)
c_uintptr_t response_event, c_uintptr_t holding_event)
{
d_assert(gtp_xact_initialized == 0, return CORE_ERROR,
"GTP Transaction already has been initialized");
@ -46,7 +46,7 @@ status_t gtp_xact_init(tm_service_t *tm_service,
g_xact_id = 0;
g_tm_service = tm_service;
g_response_event = response_event;
g_duplicated_event = duplicated_event;
g_holding_event = holding_event;
gtp_xact_initialized = 1;
@ -97,12 +97,12 @@ gtp_xact_t *gtp_xact_local_create(
xact->response_rcount = GTP_T3_RESPONSE_RETRY_COUNT;
}
if (g_duplicated_event)
if (g_holding_event)
{
xact->tm_duplicated = event_timer(g_tm_service,
g_duplicated_event, GTP_T3_DUPLICATED_DURATION, xact->index);
d_assert(xact->tm_duplicated, return NULL, "Timer allocation failed");
xact->duplicated_rcount = GTP_T3_DUPLICATED_RETRY_COUNT;
xact->tm_holding = event_timer(g_tm_service,
g_holding_event, GTP_T3_DUPLICATED_DURATION, xact->index);
d_assert(xact->tm_holding, return NULL, "Timer allocation failed");
xact->holding_rcount = GTP_T3_DUPLICATED_RETRY_COUNT;
}
list_append(xact->org == GTP_LOCAL_ORIGINATOR ?
@ -141,12 +141,12 @@ gtp_xact_t *gtp_xact_remote_create(gtp_node_t *gnode, c_uint32_t sqn)
xact->response_rcount = GTP_T3_RESPONSE_RETRY_COUNT;
}
if (g_duplicated_event)
if (g_holding_event)
{
xact->tm_duplicated = event_timer(g_tm_service,
g_duplicated_event, GTP_T3_DUPLICATED_DURATION, xact->index);
d_assert(xact->tm_duplicated, return NULL, "Timer allocation failed");
xact->duplicated_rcount = GTP_T3_DUPLICATED_RETRY_COUNT;
xact->tm_holding = event_timer(g_tm_service,
g_holding_event, GTP_T3_DUPLICATED_DURATION, xact->index);
d_assert(xact->tm_holding, return NULL, "Timer allocation failed");
xact->holding_rcount = GTP_T3_DUPLICATED_RETRY_COUNT;
}
list_append(xact->org == GTP_LOCAL_ORIGINATOR ?
@ -203,7 +203,7 @@ status_t gtp_xact_update_tx(gtp_xact_t *xact,
{
case GTP_XACT_INITIAL_STAGE:
d_assert(xact->step == 0, return CORE_ERROR,
"[%d] %s invalid step %d for type %d peer %s:%d\n",
"[%d] %s invalid step %d for type %d peer %s:%d",
xact->xid,
xact->org == GTP_LOCAL_ORIGINATOR ? "LOCAL " : "REMOTE",
xact->step, hdesc->type,
@ -215,7 +215,7 @@ status_t gtp_xact_update_tx(gtp_xact_t *xact,
case GTP_XACT_FINAL_STAGE:
d_assert(xact->step == 2, return CORE_ERROR,
"[%d] %s invalid step %d for type %d peer %s:%d\n",
"[%d] %s invalid step %d for type %d peer %s:%d",
xact->xid,
xact->org == GTP_LOCAL_ORIGINATOR ? "LOCAL " : "REMOTE",
xact->step, hdesc->type,
@ -236,7 +236,7 @@ status_t gtp_xact_update_tx(gtp_xact_t *xact,
case GTP_XACT_INTERMEDIATE_STAGE:
case GTP_XACT_FINAL_STAGE:
d_assert(xact->step == 1, return CORE_ERROR,
"[%d] %s invalid step %d for type %d peer %s:%d\n",
"[%d] %s invalid step %d for type %d peer %s:%d",
xact->xid,
xact->org == GTP_LOCAL_ORIGINATOR ? "LOCAL " : "REMOTE",
xact->step, hdesc->type,
@ -298,8 +298,9 @@ status_t gtp_xact_update_rx(gtp_xact_t *xact, c_uint8_t type)
{
pkbuf_t *pkbuf = NULL;
d_assert(xact->step == 3, return CORE_ERROR,
"[%d] %s invalid step %d for type %d peer %s:%d\n",
d_assert(xact->step == 2 || xact->step == 3,
return CORE_ERROR,
"[%d] %s invalid step %d for type %d peer %s:%d",
xact->xid,
xact->org == GTP_LOCAL_ORIGINATOR ? "LOCAL " : "REMOTE",
xact->step, type,
@ -308,43 +309,51 @@ status_t gtp_xact_update_rx(gtp_xact_t *xact, c_uint8_t type)
pkbuf = xact->seq[2].pkbuf;
if (pkbuf)
{
if (xact->tm_duplicated)
tm_start(xact->tm_duplicated);
if (xact->tm_holding)
tm_start(xact->tm_holding);
d_warn("[%d]%s Request Duplicated. Retransmit!",
xact->gnode->port,
d_warn("[%d] %s Request Duplicated. Retransmit!"
" for type %d peer %s:%d",
xact->xid,
xact->org == GTP_LOCAL_ORIGINATOR ?
"LOCAL " : "REMOTE");
"LOCAL " : "REMOTE",
xact->step, type,
INET_NTOP(&xact->gnode->addr, buf),
xact->gnode->port);
rv = gtp_send(xact->gnode, pkbuf);
d_assert(rv == CORE_OK, return CORE_ERROR,
"gtp_send error");
}
else
{
d_warn("[%d]%s Request Duplicated. Discard!",
xact->gnode->port,
d_warn("[%d] %s Request Duplicated. Discard!"
" for type %d peer %s:%d",
xact->xid,
xact->org == GTP_LOCAL_ORIGINATOR ?
"LOCAL " : "REMOTE");
"LOCAL " : "REMOTE",
xact->step, type,
INET_NTOP(&xact->gnode->addr, buf),
xact->gnode->port);
}
return CORE_EAGAIN;
}
d_assert(xact->step == 1, return CORE_ERROR,
"[%d] %s invalid step %d for type %d peer %s:%d\n",
"[%d] %s invalid step %d for type %d peer %s:%d",
xact->xid,
xact->org == GTP_LOCAL_ORIGINATOR ? "LOCAL " : "REMOTE",
xact->step, type,
INET_NTOP(&xact->gnode->addr, buf), xact->gnode->port);
if (xact->tm_duplicated)
tm_start(xact->tm_duplicated);
if (xact->tm_holding)
tm_start(xact->tm_holding);
break;
case GTP_XACT_FINAL_STAGE:
d_assert(xact->step == 1, return CORE_ERROR,
"[%d] %s invalid step %d for type %d peer %s:%d\n",
"[%d] %s invalid step %d for type %d peer %s:%d",
xact->xid,
xact->org == GTP_LOCAL_ORIGINATOR ? "LOCAL " : "REMOTE",
xact->step, type,
@ -365,8 +374,9 @@ status_t gtp_xact_update_rx(gtp_xact_t *xact, c_uint8_t type)
{
pkbuf_t *pkbuf = NULL;
d_assert(xact->step == 1, return CORE_ERROR,
"[%d] %s invalid step %d for type %d peer %s:%d\n",
d_assert(xact->step == 1 || xact->step == 2,
return CORE_ERROR,
"[%d] %s invalid step %d for type %d peer %s:%d",
xact->xid,
xact->org == GTP_LOCAL_ORIGINATOR ? "LOCAL " : "REMOTE",
xact->step, type,
@ -375,37 +385,45 @@ status_t gtp_xact_update_rx(gtp_xact_t *xact, c_uint8_t type)
pkbuf = xact->seq[1].pkbuf;
if (pkbuf)
{
if (xact->tm_duplicated)
tm_start(xact->tm_duplicated);
if (xact->tm_holding)
tm_start(xact->tm_holding);
d_warn("[%d]%s Request Duplicated. Retransmit!",
xact->gnode->port,
d_warn("[%d] %s Request Duplicated. Retransmit!"
" for step %d type %d peer %s:%d",
xact->xid,
xact->org == GTP_LOCAL_ORIGINATOR ?
"LOCAL " : "REMOTE");
"LOCAL " : "REMOTE",
xact->step, type,
INET_NTOP(&xact->gnode->addr, buf),
xact->gnode->port);
rv = gtp_send(xact->gnode, pkbuf);
d_assert(rv == CORE_OK, return CORE_ERROR,
"gtp_send error");
}
else
{
d_warn("[%d]%s Request Duplicated. Discard!",
xact->gnode->port,
d_warn("[%d] %s Request Duplicated. Discard!"
" for step %d type %d peer %s:%d",
xact->xid,
xact->org == GTP_LOCAL_ORIGINATOR ?
"LOCAL " : "REMOTE");
"LOCAL " : "REMOTE",
xact->step, type,
INET_NTOP(&xact->gnode->addr, buf),
xact->gnode->port);
}
return CORE_EAGAIN;
}
d_assert(xact->step == 0, return CORE_ERROR,
"[%d] %s invalid step %d for type %d peer %s:%d\n",
"[%d] %s invalid step %d for type %d peer %s:%d",
xact->xid,
xact->org == GTP_LOCAL_ORIGINATOR ? "LOCAL " : "REMOTE",
xact->step, type,
INET_NTOP(&xact->gnode->addr, buf), xact->gnode->port);
if (xact->tm_duplicated)
tm_start(xact->tm_duplicated);
if (xact->tm_holding)
tm_start(xact->tm_holding);
break;
@ -414,7 +432,7 @@ status_t gtp_xact_update_rx(gtp_xact_t *xact, c_uint8_t type)
case GTP_XACT_FINAL_STAGE:
d_assert(xact->step == 2, return CORE_ERROR,
"[%d] %s invalid step %d for type %d peer %s:%d\n",
"[%d] %s invalid step %d for type %d peer %s:%d",
xact->xid,
xact->org == GTP_LOCAL_ORIGINATOR ? "LOCAL " : "REMOTE",
xact->step, type,
@ -470,7 +488,7 @@ status_t gtp_xact_commit(gtp_xact_t *xact)
case GTP_XACT_INITIAL_STAGE:
{
d_assert(xact->step == 1, return CORE_ERROR,
"[%d] %s invalid step %d for type %d peer %s:%d\n",
"[%d] %s invalid step %d for type %d peer %s:%d",
xact->xid,
xact->org == GTP_LOCAL_ORIGINATOR ? "LOCAL " : "REMOTE",
xact->step, type,
@ -487,7 +505,7 @@ status_t gtp_xact_commit(gtp_xact_t *xact)
case GTP_XACT_FINAL_STAGE:
d_assert(xact->step == 2 || xact->step == 3, return CORE_ERROR,
"[%d] %s invalid step %d for type %d peer %s:%d\n",
"[%d] %s invalid step %d for type %d peer %s:%d",
xact->xid,
xact->org == GTP_LOCAL_ORIGINATOR ? "LOCAL " : "REMOTE",
xact->step, type,
@ -514,7 +532,7 @@ status_t gtp_xact_commit(gtp_xact_t *xact)
case GTP_XACT_INTERMEDIATE_STAGE:
d_assert(xact->step == 2, return CORE_ERROR,
"[%d] %s invalid step %d for type %d peer %s:%d\n",
"[%d] %s invalid step %d for type %d peer %s:%d",
xact->xid,
xact->org == GTP_LOCAL_ORIGINATOR ? "LOCAL " : "REMOTE",
xact->step, type,
@ -528,7 +546,7 @@ status_t gtp_xact_commit(gtp_xact_t *xact)
case GTP_XACT_FINAL_STAGE:
d_assert(xact->step == 2 || xact->step == 3,
return CORE_ERROR,
"[%d] %s invalid step %d for type %d peer %s:%d\n",
"[%d] %s invalid step %d for type %d peer %s:%d",
xact->xid,
xact->org == GTP_LOCAL_ORIGINATOR ? "LOCAL " : "REMOTE",
xact->step, type,
@ -570,10 +588,13 @@ status_t gtp_xact_timeout(index_t index, c_uintptr_t event)
if (event == g_response_event)
{
d_trace(3, "[%d] %s Response Timeout peer %s:%d\n",
d_trace(3, "[%d] %s Response Timeout "
"for step %d type %d peer %s:%d\n",
xact->xid,
xact->org == GTP_LOCAL_ORIGINATOR ? "LOCAL " : "REMOTE",
INET_NTOP(&xact->gnode->addr, buf), xact->gnode->port);
xact->step, xact->seq[xact->step-1].type,
INET_NTOP(&xact->gnode->addr, buf),
xact->gnode->port);
if (--xact->response_rcount > 0)
{
@ -590,26 +611,40 @@ status_t gtp_xact_timeout(index_t index, c_uintptr_t event)
}
else
{
d_warn("[%d]%s No Reponse. Give up",
xact->gnode->port,
xact->org == GTP_LOCAL_ORIGINATOR ? "LOCAL " : "REMOTE");
d_warn("[%d] %s No Reponse. Give up! "
"for step %d type %d peer %s:%d",
xact->xid,
xact->org == GTP_LOCAL_ORIGINATOR ? "LOCAL " : "REMOTE",
xact->step, xact->seq[xact->step-1].type,
INET_NTOP(&xact->gnode->addr, buf),
xact->gnode->port);
gtp_xact_delete(xact);
}
}
else if (event == g_duplicated_event)
else if (event == g_holding_event)
{
d_trace(3, "[%d] %s Duplicated Timeout peer %s:%d\n",
d_trace(3, "[%d] %s Holding Timeout "
"for step %d type %d peer %s:%d\n",
xact->xid,
xact->org == GTP_LOCAL_ORIGINATOR ? "LOCAL " : "REMOTE",
INET_NTOP(&xact->gnode->addr, buf), xact->gnode->port);
xact->step, xact->seq[xact->step-1].type,
INET_NTOP(&xact->gnode->addr, buf),
xact->gnode->port);
if (--xact->duplicated_rcount > 0)
if (--xact->holding_rcount > 0)
{
if (xact->tm_duplicated)
tm_start(xact->tm_duplicated);
if (xact->tm_holding)
tm_start(xact->tm_holding);
}
else
{
d_trace(3, "[%d] %s Delete Transaction "
"for step %d type %d peer %s:%d\n",
xact->xid,
xact->org == GTP_LOCAL_ORIGINATOR ? "LOCAL " : "REMOTE",
xact->step, xact->seq[xact->step-1].type,
INET_NTOP(&xact->gnode->addr, buf),
xact->gnode->port);
gtp_xact_delete(xact);
}
}
@ -806,8 +841,8 @@ static status_t gtp_xact_delete(gtp_xact_t *xact)
if (xact->tm_response)
tm_delete(xact->tm_response);
if (xact->tm_duplicated)
tm_delete(xact->tm_duplicated);
if (xact->tm_holding)
tm_delete(xact->tm_holding);
if (xact->assoc_xact)
gtp_xact_deassociate(xact, xact->assoc_xact);

View File

@ -40,8 +40,8 @@ typedef struct _gtp_xact_t {
tm_block_id tm_response; /**< Timer waiting for next message */
c_uint8_t response_rcount;
tm_block_id tm_duplicated; /**< Timer waiting for duplicated message */
c_uint8_t duplicated_rcount;
tm_block_id tm_holding; /**< Timer waiting for holding message */
c_uint8_t holding_rcount;
struct _gtp_xact_t *assoc_xact; /**< Associated transaction */
@ -57,7 +57,7 @@ typedef struct _gtp_xact_t {
} gtp_xact_t;
CORE_DECLARE(status_t) gtp_xact_init(tm_service_t *tm_service,
c_uintptr_t response_event, c_uintptr_t duplicated_event);
c_uintptr_t response_event, c_uintptr_t holding_event);
CORE_DECLARE(status_t) gtp_xact_final(void);
CORE_DECLARE(gtp_xact_t *) gtp_xact_local_create(

View File

@ -35,8 +35,8 @@ char* mme_event_get_name(event_t *e)
return "MME_EVT_S11_MESSAGE";
case MME_EVT_S11_T3_RESPONSE:
return "MME_EVT_S11_T3_RESPONSE";
case MME_EVT_S11_T3_DUPLICATED:
return "MME_EVT_S11_T3_DUPLICATED";
case MME_EVT_S11_T3_HOLDING:
return "MME_EVT_S11_T3_HOLDING";
case MME_EVT_S6A_MESSAGE:
return "MME_EVT_S6A_MESSAGE";

View File

@ -24,7 +24,7 @@ typedef enum {
MME_EVT_S11_MESSAGE,
MME_EVT_S11_T3_RESPONSE,
MME_EVT_S11_T3_DUPLICATED,
MME_EVT_S11_T3_HOLDING,
MME_EVT_S6A_MESSAGE,

View File

@ -70,7 +70,7 @@ static void *THREAD_FUNC sm_main(thread_id id, void *data)
"MME event queue creation failed");
tm_service_init(&mme_self()->tm_service);
gtp_xact_init(&mme_self()->tm_service,
MME_EVT_S11_T3_RESPONSE, MME_EVT_S11_T3_DUPLICATED);
MME_EVT_S11_T3_RESPONSE, MME_EVT_S11_T3_HOLDING);
fsm_create(&mme_sm, mme_state_initial, mme_state_final);
fsm_init(&mme_sm, 0);

View File

@ -415,7 +415,7 @@ void mme_state_operational(fsm_t *s, event_t *e)
break;
}
case MME_EVT_S11_T3_RESPONSE:
case MME_EVT_S11_T3_DUPLICATED:
case MME_EVT_S11_T3_HOLDING:
{
gtp_xact_timeout(event_get_param1(e), event_get(e));
break;

View File

@ -19,8 +19,8 @@ char* pgw_event_get_name(event_t *e)
return "PGW_EVT_S5C_MESSAGE";
case PGW_EVT_S5C_T3_RESPONSE:
return "PGW_EVT_S5C_T3_RESPONSE";
case PGW_EVT_S5C_T3_DUPLICATED:
return "PGW_EVT_S5C_T3_DUPLICATED";
case PGW_EVT_S5C_T3_HOLDING:
return "PGW_EVT_S5C_T3_HOLDING";
case PGW_EVT_GX_MESSAGE:
return "PGW_EVT_GX_SESSION_MSG";

View File

@ -13,7 +13,7 @@ typedef enum {
PGW_EVT_S5C_MESSAGE,
PGW_EVT_S5C_T3_RESPONSE,
PGW_EVT_S5C_T3_DUPLICATED,
PGW_EVT_S5C_T3_HOLDING,
PGW_EVT_GX_MESSAGE,

View File

@ -74,7 +74,7 @@ static void *THREAD_FUNC sm_main(thread_id id, void *data)
"PGW event queue creation failed");
tm_service_init(&pgw_self()->tm_service);
gtp_xact_init(&pgw_self()->tm_service,
PGW_EVT_S5C_T3_RESPONSE, PGW_EVT_S5C_T3_DUPLICATED);
PGW_EVT_S5C_T3_RESPONSE, PGW_EVT_S5C_T3_HOLDING);
fsm_create(&pgw_sm, pgw_state_initial, pgw_state_final);
fsm_init(&pgw_sm, 0);

View File

@ -114,7 +114,7 @@ void pgw_state_operational(fsm_t *s, event_t *e)
break;
}
case PGW_EVT_S5C_T3_RESPONSE:
case PGW_EVT_S5C_T3_DUPLICATED:
case PGW_EVT_S5C_T3_HOLDING:
{
gtp_xact_timeout(event_get_param1(e), event_get(e));
break;

View File

@ -22,8 +22,8 @@ char* sgw_event_get_name(event_t *e)
case SGW_EVT_T3_RESPONSE:
return "SGW_EVT_T3_RESPONSE";
case SGW_EVT_T3_DUPLICATED:
return "SGW_EVT_T3_DUPLICATED";
case SGW_EVT_T3_HOLDING:
return "SGW_EVT_T3_HOLDING";
default:
break;

View File

@ -15,7 +15,7 @@ typedef enum {
SGW_EVT_S5C_MESSAGE,
SGW_EVT_T3_RESPONSE,
SGW_EVT_T3_DUPLICATED,
SGW_EVT_T3_HOLDING,
SGW_EVT_LO_DLDATA_NOTI,

View File

@ -63,7 +63,7 @@ static void *THREAD_FUNC sm_main(thread_id id, void *data)
"SGW event queue creation failed");
tm_service_init(&sgw_self()->tm_service);
gtp_xact_init(&sgw_self()->tm_service,
SGW_EVT_T3_RESPONSE, SGW_EVT_T3_DUPLICATED);
SGW_EVT_T3_RESPONSE, SGW_EVT_T3_HOLDING);
fsm_create(&sgw_sm, sgw_state_initial, sgw_state_final);
fsm_init(&sgw_sm, 0);

View File

@ -10,7 +10,7 @@
#include "sgw_gtp_path.h"
#include "sgw_s11_handler.h"
void sgw_handle_create_session_request(gtp_xact_t *s11_xact,
void sgw_s11_handle_create_session_request(gtp_xact_t *s11_xact,
sgw_ue_t *sgw_ue, gtp_message_t *gtp_message)
{
status_t rv;
@ -137,7 +137,7 @@ void sgw_handle_create_session_request(gtp_xact_t *s11_xact,
"SGW[%d] --> PGW\n", sess->sgw_s5c_teid);
}
CORE_DECLARE(void) sgw_handle_modify_bearer_request(gtp_xact_t *s11_xact,
CORE_DECLARE(void) sgw_s11_handle_modify_bearer_request(gtp_xact_t *s11_xact,
sgw_ue_t *sgw_ue, gtp_modify_bearer_request_t *req)
{
status_t rv;
@ -204,7 +204,7 @@ CORE_DECLARE(void) sgw_handle_modify_bearer_request(gtp_xact_t *s11_xact,
"MME[%d] --> SGW[%d]\n", sgw_ue->mme_s11_teid, sgw_ue->sgw_s11_teid);
}
void sgw_handle_delete_session_request(gtp_xact_t *s11_xact,
void sgw_s11_handle_delete_session_request(gtp_xact_t *s11_xact,
sgw_ue_t *sgw_ue, gtp_message_t *gtp_message)
{
status_t rv;
@ -247,7 +247,7 @@ void sgw_handle_delete_session_request(gtp_xact_t *s11_xact,
"SGW[%d] --> PGW[%d]\n", sess->sgw_s5c_teid, sess->pgw_s5c_teid);
}
void sgw_handle_release_access_bearers_request(gtp_xact_t *s11_xact,
void sgw_s11_handle_release_access_bearers_request(gtp_xact_t *s11_xact,
sgw_ue_t *sgw_ue, gtp_release_access_bearers_request_t *req)
{
status_t rv;
@ -309,7 +309,7 @@ void sgw_handle_release_access_bearers_request(gtp_xact_t *s11_xact,
"MME[%d] --> SGW[%d]\n", sgw_ue->mme_s11_teid, sgw_ue->sgw_s11_teid);
}
void sgw_handle_lo_dldata_notification(sgw_bearer_t *bearer)
void sgw_s11_handle_lo_dldata_notification(sgw_bearer_t *bearer)
{
status_t rv;
gtp_downlink_data_notification_t *noti = NULL;
@ -356,7 +356,7 @@ void sgw_handle_lo_dldata_notification(sgw_bearer_t *bearer)
"SGW[%d] --> MME[%d]\n", sgw_ue->sgw_s11_teid, sgw_ue->mme_s11_teid);
}
void sgw_handle_downlink_data_notification_ack(sgw_ue_t *sgw_ue,
void sgw_s11_handle_downlink_data_notification_ack(sgw_ue_t *sgw_ue,
gtp_downlink_data_notification_acknowledge_t *ack)
{
d_trace(3, "[GTP] Downlink Data Notification Ack: "

View File

@ -9,23 +9,23 @@
extern "C" {
#endif /* __cplusplus */
CORE_DECLARE(void) sgw_handle_create_session_request(gtp_xact_t *s11_xact,
CORE_DECLARE(void) sgw_s11_handle_create_session_request(gtp_xact_t *s11_xact,
sgw_ue_t *sgw_ue, gtp_message_t *gtp_message);
CORE_DECLARE(void) sgw_handle_modify_bearer_request(gtp_xact_t *s11_xact,
CORE_DECLARE(void) sgw_s11_handle_modify_bearer_request(gtp_xact_t *s11_xact,
sgw_ue_t *sgw_ue, gtp_modify_bearer_request_t *req);
CORE_DECLARE(void) sgw_handle_delete_session_request(gtp_xact_t *s11_xact,
CORE_DECLARE(void) sgw_s11_handle_delete_session_request(gtp_xact_t *s11_xact,
sgw_ue_t *sgw_ue, gtp_message_t *gtp_message);
CORE_DECLARE(void) sgw_handle_release_access_bearers_request(
CORE_DECLARE(void) sgw_s11_handle_release_access_bearers_request(
gtp_xact_t *s11_xact, sgw_ue_t *sgw_ue,
gtp_release_access_bearers_request_t *req);
CORE_DECLARE(void) sgw_handle_lo_dldata_notification(sgw_bearer_t *bearer);
CORE_DECLARE(void) sgw_s11_handle_lo_dldata_notification(sgw_bearer_t *bearer);
CORE_DECLARE(void) sgw_handle_downlink_data_notification_ack(sgw_ue_t *sgw_ue,
gtp_downlink_data_notification_acknowledge_t *ack);
CORE_DECLARE(void) sgw_s11_handle_downlink_data_notification_ack(
sgw_ue_t *sgw_ue, gtp_downlink_data_notification_acknowledge_t *ack);
#ifdef __cplusplus
}
#endif /* __cplusplus */

View File

@ -10,7 +10,7 @@
#include "sgw_gtp_path.h"
#include "sgw_s5c_handler.h"
void sgw_handle_create_session_response(gtp_xact_t *s5c_xact,
void sgw_s5c_handle_create_session_response(gtp_xact_t *s5c_xact,
sgw_sess_t *sess, gtp_message_t *gtp_message)
{
status_t rv;
@ -114,7 +114,7 @@ void sgw_handle_create_session_response(gtp_xact_t *s5c_xact,
"SGW[%d] <-- PGW[%d]\n", sess->sgw_s5c_teid, sess->pgw_s5c_teid);
}
void sgw_handle_delete_session_response(gtp_xact_t *s5c_xact,
void sgw_s5c_handle_delete_session_response(gtp_xact_t *s5c_xact,
sgw_sess_t *sess, gtp_message_t *gtp_message)
{
status_t rv;
@ -178,3 +178,83 @@ void sgw_handle_delete_session_response(gtp_xact_t *s5c_xact,
rv = gtp_xact_commit(s11_xact);
d_assert(rv == CORE_OK, return, "xact_commit error");
}
void sgw_s5c_handle_create_bearer_request(gtp_xact_t *s5c_xact,
sgw_sess_t *sess, gtp_message_t *gtp_message)
{
status_t rv;
gtp_xact_t *s11_xact = NULL;
sgw_bearer_t *bearer = NULL;
gtp_create_bearer_request_t *req = NULL;
pkbuf_t *pkbuf = NULL;
sgw_ue_t *sgw_ue = NULL;
gtp_f_teid_t *pgw_s5u_teid = NULL;
gtp_f_teid_t sgw_s1u_teid;
d_assert(sess, return, "Null param");
sgw_ue = sess->sgw_ue;
d_assert(sgw_ue, return, "Null param");
d_assert(s5c_xact, return, "Null param");
d_assert(gtp_message, return, "Null param");
req = &gtp_message->create_bearer_request;
if (req->linked_eps_bearer_id.presence == 0)
{
d_error("No Linked EBI");
return;
}
if (req->bearer_contexts.presence == 0)
{
d_error("No Bearer");
return;
}
if (req->bearer_contexts.eps_bearer_id.presence == 0)
{
d_error("No EPS Bearer ID");
return;
}
if (req->bearer_contexts.s5_s8_u_sgw_f_teid.presence == 0)
{
d_error("No GTP TEID");
return;
}
bearer = sgw_bearer_add(sess);
d_assert(bearer, return, "No Bearer Context");
/* Receive Data Plane(UL) : PGW-S5U */
pgw_s5u_teid = req->bearer_contexts.s5_s8_u_sgw_f_teid.data;
bearer->pgw_s5u_teid = ntohl(pgw_s5u_teid->teid);
bearer->pgw_s5u_addr = pgw_s5u_teid->ipv4_addr;
req->bearer_contexts.s5_s8_u_sgw_f_teid.presence = 0;
/* Send Data Plane(UL) : SGW-S1U */
memset(&sgw_s1u_teid, 0, sizeof(gtp_f_teid_t));
sgw_s1u_teid.ipv4 = 1;
sgw_s1u_teid.interface_type = GTP_F_TEID_S1_U_SGW_GTP_U;
sgw_s1u_teid.ipv4_addr = bearer->sgw_s1u_addr;
sgw_s1u_teid.teid = htonl(bearer->sgw_s1u_teid);
req->bearer_contexts.s1_u_enodeb_f_teid.presence = 1;
req->bearer_contexts.s1_u_enodeb_f_teid.data = &sgw_s1u_teid;
req->bearer_contexts.s1_u_enodeb_f_teid.len = GTP_F_TEID_IPV4_LEN;
gtp_message->h.type = GTP_CREATE_BEARER_REQUEST_TYPE;
gtp_message->h.teid = sgw_ue->mme_s11_teid;
rv = gtp_build_msg(&pkbuf, gtp_message);
d_assert(rv == CORE_OK, return, "gtp build failed");
s11_xact = gtp_xact_local_create(sess->mme, &gtp_message->h, pkbuf);
d_assert(s11_xact, return, "Null param");
gtp_xact_associate(s5c_xact, s11_xact);
rv = gtp_xact_commit(s11_xact);
d_assert(rv == CORE_OK, return, "xact_commit error");
d_trace(3, "[GTP] Create Bearer Request : SGW[%d] <-- PGW[%d]\n",
bearer->sgw_s1u_teid, bearer->pgw_s5u_teid);
}

View File

@ -9,10 +9,11 @@
extern "C" {
#endif /* __cplusplus */
CORE_DECLARE(void) sgw_handle_create_session_response(gtp_xact_t *s5c_xact,
CORE_DECLARE(void) sgw_s5c_handle_create_session_response(gtp_xact_t *s5c_xact,
sgw_sess_t *sess, gtp_message_t *gtp_message);
CORE_DECLARE(void) sgw_handle_delete_session_response(gtp_xact_t *s5c_xact,
CORE_DECLARE(void) sgw_s5c_handle_delete_session_response(gtp_xact_t *s5c_xact,
sgw_sess_t *sess, gtp_message_t *gtp_message);
CORE_DECLARE(void) sgw_s5c_handle_create_bearer_request(gtp_xact_t *s5c_xact,
sgw_sess_t *sess, gtp_message_t *gtp_message);
#ifdef __cplusplus

View File

@ -78,21 +78,23 @@ void sgw_state_operational(fsm_t *s, event_t *e)
switch(message.h.type)
{
case GTP_CREATE_SESSION_REQUEST_TYPE:
sgw_handle_create_session_request(xact, sgw_ue, &message);
sgw_s11_handle_create_session_request(xact, sgw_ue,
&message);
break;
case GTP_MODIFY_BEARER_REQUEST_TYPE:
sgw_handle_modify_bearer_request(xact, sgw_ue,
sgw_s11_handle_modify_bearer_request(xact, sgw_ue,
&message.modify_bearer_request);
break;
case GTP_DELETE_SESSION_REQUEST_TYPE:
sgw_handle_delete_session_request(xact, sgw_ue, &message);
sgw_s11_handle_delete_session_request(xact, sgw_ue,
&message);
break;
case GTP_RELEASE_ACCESS_BEARERS_REQUEST_TYPE:
sgw_handle_release_access_bearers_request(xact, sgw_ue,
sgw_s11_handle_release_access_bearers_request(xact, sgw_ue,
&message.release_access_bearers_request);
break;
case GTP_DOWNLINK_DATA_NOTIFICATION_ACKNOWLEDGE_TYPE:
sgw_handle_downlink_data_notification_ack(sgw_ue,
sgw_s11_handle_downlink_data_notification_ack(sgw_ue,
&message.downlink_data_notification_acknowledge);
break;
default:
@ -124,10 +126,16 @@ void sgw_state_operational(fsm_t *s, event_t *e)
switch(message.h.type)
{
case GTP_CREATE_SESSION_RESPONSE_TYPE:
sgw_handle_create_session_response(xact, sess, &message);
sgw_s5c_handle_create_session_response(xact, sess,
&message);
break;
case GTP_DELETE_SESSION_RESPONSE_TYPE:
sgw_handle_delete_session_response(xact, sess, &message);
sgw_s5c_handle_delete_session_response(xact, sess,
&message);
break;
case GTP_CREATE_BEARER_REQUEST_TYPE:
sgw_s5c_handle_create_bearer_request(xact, sess,
&message);
break;
default:
d_warn("Not implmeneted(type:%d)", message.h.type);
@ -137,7 +145,7 @@ void sgw_state_operational(fsm_t *s, event_t *e)
break;
}
case SGW_EVT_T3_RESPONSE:
case SGW_EVT_T3_DUPLICATED:
case SGW_EVT_T3_HOLDING:
{
gtp_xact_timeout(event_get_param1(e), event_get(e));
break;
@ -153,7 +161,7 @@ void sgw_state_operational(fsm_t *s, event_t *e)
break;
}
sgw_handle_lo_dldata_notification(bearer);
sgw_s11_handle_lo_dldata_notification(bearer);
break;
}