contine GTP

This commit is contained in:
Sukchan Lee 2017-08-31 12:06:11 +09:00
parent 774a6c6216
commit 4ce91553af
12 changed files with 243 additions and 206 deletions

View File

@ -26,7 +26,7 @@
/*******************************************************************************
* This file had been created by gtp_tlv.py script v0.1.0
* Please do not modify this file but regenerate it via script.
* Created on: 2017-08-31 10:18:49.801691 by acetcom
* Created on: 2017-08-31 12:05:13.855408 by acetcom
* from 29274-d80.docx
******************************************************************************/
@ -2406,12 +2406,34 @@ tlv_desc_t tlv_desc_modify_access_bearers_response =
}};
status_t gtp_parse_msg(gtp_message_t *gtp_message, c_uint8_t type, pkbuf_t *pkbuf)
status_t gtp_parse_msg(gtp_message_t *gtp_message, pkbuf_t *pkbuf)
{
status_t rv = CORE_ERROR;
gtp_header_t *h = NULL;
c_uint16_t size = 0;
d_assert(gtp_message, return CORE_ERROR, "Null param");
d_assert(pkbuf, return CORE_ERROR, "Null param");
d_assert(pkbuf->payload, return CORE_ERROR, "Null param");
h = pkbuf->payload;
d_assert(h, return CORE_ERROR, "Null param");
memset(gtp_message, 0, sizeof(gtp_message_t));
switch(type)
if (h->teid_presence)
size = GTPV2C_HEADER_LEN;
else
size = GTPV2C_HEADER_LEN-GTPV2C_TEID_LEN;
d_assert(pkbuf_header(pkbuf, -size) == CORE_OK,
return CORE_ERROR, "pkbuf_header error");
memcpy(&gtp_message->h, pkbuf->payload - size, size);
if (h->teid_presence)
gtp_message->h.teid = ntohl(gtp_message->h.teid);
switch(gtp_message->h.type)
{
case GTP_ECHO_REQUEST_TYPE:
rv = tlv_parse_msg(&gtp_message->echo_request,
@ -2530,18 +2552,19 @@ status_t gtp_parse_msg(gtp_message_t *gtp_message, c_uint8_t type, pkbuf_t *pkbu
&tlv_desc_modify_access_bearers_response, pkbuf, TLV_MODE_T1_L2_I1);
break;
default:
d_warn("Not implmeneted(type:%d)", type);
d_warn("Not implmeneted(type:%d)", gtp_message->h.type);
break;
}
return rv;
}
status_t gtp_build_msg(pkbuf_t **pkbuf, c_uint8_t type, gtp_message_t *gtp_message)
status_t gtp_build_msg(pkbuf_t **pkbuf, gtp_message_t *gtp_message)
{
status_t rv = CORE_ERROR;
switch(type)
d_assert(gtp_message, return rv, "Null param");
switch(gtp_message->h.type)
{
case GTP_ECHO_REQUEST_TYPE:
rv = tlv_build_msg(pkbuf, &tlv_desc_echo_request,
@ -2660,7 +2683,7 @@ status_t gtp_build_msg(pkbuf_t **pkbuf, c_uint8_t type, gtp_message_t *gtp_messa
&gtp_message->modify_access_bearers_response, TLV_MODE_T1_L2_I1);
break;
default:
d_warn("Not implmeneted(type:%d)", type);
d_warn("Not implmeneted(type:%d)", gtp_message->h.type);
break;
}

View File

@ -26,7 +26,7 @@
/*******************************************************************************
* This file had been created by gtp_tlv.py script v0.1.0
* Please do not modify this file but regenerate it via script.
* Created on: 2017-08-31 10:18:49.786605 by acetcom
* Created on: 2017-08-31 12:05:13.838521 by acetcom
* from 29274-d80.docx
******************************************************************************/
@ -1141,9 +1141,9 @@ typedef struct _gtp_message_t {
} gtp_message_t;
CORE_DECLARE(status_t) gtp_parse_msg(
gtp_message_t *gtp_message, c_uint8_t type, pkbuf_t *pkbuf);
gtp_message_t *gtp_message, pkbuf_t *pkbuf);
CORE_DECLARE(status_t) gtp_build_msg(
pkbuf_t **pkbuf, c_uint8_t type, gtp_message_t *gtp_message);
pkbuf_t **pkbuf, gtp_message_t *gtp_message);
#ifdef __cplusplus
}

View File

@ -57,44 +57,6 @@ status_t gtp_xact_final(void)
return CORE_OK;
}
static gtp_xact_t *gtp_xact_create(gtp_xact_ctx_t *context,
net_sock_t *sock, gtp_node_t *gnode, c_uint8_t org, c_uint32_t xid,
c_uint32_t duration, c_uint8_t retry_count)
{
char buf[INET_ADDRSTRLEN];
gtp_xact_t *xact = NULL;
d_assert(context, return NULL, "Null param");
d_assert(sock, return NULL, "Null param");
d_assert(gnode, return NULL, "Null param");
index_alloc(&gtp_xact_pool, &xact);
d_assert(xact, return NULL, "Transaction allocation failed");
xact->org = org;
xact->xid = xid;
xact->sock = sock;
xact->gnode = gnode;
xact->tm_wait = event_timer(context->tm_service, context->event,
duration, xact->index);
d_assert(xact->tm_wait,
index_free(&gtp_xact_pool, xact); return NULL,
"Timer allocation failed");
xact->retry_count = retry_count;
tm_start(xact->tm_wait);
list_append(xact->org == GTP_LOCAL_ORIGINATOR ?
&xact->gnode->local_list : &xact->gnode->remote_list, xact);
d_trace(3, "[%d] %s Create peer %s:%d\n",
xact->xid,
xact->org == GTP_LOCAL_ORIGINATOR ? "LOCAL " : "REMOTE",
INET_NTOP(&gnode->addr, buf), gnode->port);
return xact;
}
static status_t gtp_xact_delete(gtp_xact_t *xact)
{
char buf[INET_ADDRSTRLEN];
@ -120,44 +82,78 @@ static status_t gtp_xact_delete(gtp_xact_t *xact)
return CORE_OK;
}
static void gtp_xact_associate(gtp_xact_t *xact1, gtp_xact_t *xact2)
{
d_assert(xact1, return, "Null param");
d_assert(xact2, return, "Null param");
d_assert(xact1->assoc_xact == NULL, return, "Already assocaited");
d_assert(xact2->assoc_xact == NULL, return, "Already assocaited");
xact1->assoc_xact = xact2;
xact2->assoc_xact = xact1;
}
static void gtp_xact_deassociate(gtp_xact_t *xact1, gtp_xact_t *xact2)
{
d_assert(xact1, return, "Null param");
d_assert(xact2, return, "Null param");
d_assert(xact1->assoc_xact != NULL, return, "Already deassocaited");
d_assert(xact2->assoc_xact != NULL, return, "Already deassocaited");
xact1->assoc_xact = NULL;
xact2->assoc_xact = NULL;
}
gtp_xact_t *gtp_xact_local_create(
gtp_xact_ctx_t *context, net_sock_t *sock, gtp_node_t *gnode)
{
return gtp_xact_create(context, sock, gnode, GTP_LOCAL_ORIGINATOR,
NEXT_ID(context->g_xact_id, GTP_MIN_XACT_ID, GTP_MAX_XACT_ID),
GTP_XACT_LOCAL_DURATION, GTP_XACT_LOCAL_RETRY_COUNT);
char buf[INET_ADDRSTRLEN];
gtp_xact_t *xact = NULL;
d_assert(context, return NULL, "Null param");
d_assert(sock, return NULL, "Null param");
d_assert(gnode, return NULL, "Null param");
index_alloc(&gtp_xact_pool, &xact);
d_assert(xact, return NULL, "Transaction allocation failed");
xact->org = GTP_LOCAL_ORIGINATOR;
xact->xid = NEXT_ID(context->g_xact_id, GTP_MIN_XACT_ID, GTP_MAX_XACT_ID);
xact->sock = sock;
xact->gnode = gnode;
xact->tm_wait = event_timer(context->tm_service, context->event,
GTP_XACT_LOCAL_DURATION, xact->index);
d_assert(xact->tm_wait,
index_free(&gtp_xact_pool, xact); return NULL,
"Timer allocation failed");
xact->retry_count = GTP_XACT_LOCAL_RETRY_COUNT;
tm_start(xact->tm_wait);
list_append(xact->org == GTP_LOCAL_ORIGINATOR ?
&xact->gnode->local_list : &xact->gnode->remote_list, xact);
d_trace(3, "[%d] %s Create peer %s:%d\n",
xact->xid,
xact->org == GTP_LOCAL_ORIGINATOR ? "LOCAL " : "REMOTE",
INET_NTOP(&gnode->addr, buf), gnode->port);
return xact;
}
gtp_xact_t *gtp_xact_remote_create(gtp_xact_ctx_t *context,
net_sock_t *sock, gtp_node_t *gnode, c_uint32_t sqn)
{
return gtp_xact_create(context, sock, gnode,
GTP_REMOTE_ORIGINATOR, GTP_SQN_TO_XID(sqn),
GTP_XACT_REMOTE_DURATION, GTP_XACT_REMOTE_RETRY_COUNT);
char buf[INET_ADDRSTRLEN];
gtp_xact_t *xact = NULL;
d_assert(context, return NULL, "Null param");
d_assert(sock, return NULL, "Null param");
d_assert(gnode, return NULL, "Null param");
index_alloc(&gtp_xact_pool, &xact);
d_assert(xact, return NULL, "Transaction allocation failed");
xact->org = GTP_REMOTE_ORIGINATOR;
xact->xid = GTP_SQN_TO_XID(sqn);
xact->sock = sock;
xact->gnode = gnode;
xact->tm_wait = event_timer(context->tm_service, context->event,
GTP_XACT_REMOTE_DURATION, xact->index);
d_assert(xact->tm_wait,
index_free(&gtp_xact_pool, xact); return NULL,
"Timer allocation failed");
xact->retry_count = GTP_XACT_REMOTE_RETRY_COUNT;
tm_start(xact->tm_wait);
list_append(xact->org == GTP_LOCAL_ORIGINATOR ?
&xact->gnode->local_list : &xact->gnode->remote_list, xact);
d_trace(3, "[%d] %s Create peer %s:%d\n",
xact->xid,
xact->org == GTP_LOCAL_ORIGINATOR ? "LOCAL " : "REMOTE",
INET_NTOP(&gnode->addr, buf), gnode->port);
return xact;
}
void gtp_xact_delete_all(gtp_node_t *gnode)
@ -320,33 +316,29 @@ static gtp_xact_t *gtp_xact_find_by_sqn(
return xact;
}
status_t gtp_xact_receive(
gtp_xact_ctx_t *context, net_sock_t *sock, gtp_node_t *gnode,
gtp_xact_t **xact,
c_uint8_t *type, c_uint32_t *teid, gtp_message_t *gtp_message,
pkbuf_t *pkbuf)
status_t gtp_xact_receive(gtp_xact_ctx_t *context,
net_sock_t *sock, gtp_node_t *gnode, pkbuf_t *pkbuf,
gtp_xact_t **xact, gtp_message_t *message)
{
char buf[INET_ADDRSTRLEN];
status_t rv;
gtp_header_t *h = NULL;
gtp_xact_t *new = NULL;
gtp_header_t *h = NULL;
d_assert(context, return CORE_ERROR, "Null param");
d_assert(sock, return CORE_ERROR, "Null param");
d_assert(gnode, return CORE_ERROR, "Null param");
d_assert(pkbuf, return CORE_ERROR, "Null param");
d_assert(context, goto out1, "Null param");
d_assert(sock, goto out1, "Null param");
d_assert(gnode, goto out1, "Null param");
d_assert(type, goto out1, "Null param");
d_assert(pkbuf->payload, return CORE_ERROR, "Null param");
h = pkbuf->payload;
d_assert(h, goto out1, "Null param");
d_assert(h, return CORE_ERROR, "Null param");
new = gtp_xact_find_by_sqn(gnode, h->type, h->sqn);
if (!new)
{
new = gtp_xact_remote_create(context, sock, gnode, h->sqn);
}
d_assert(new, goto out1, "Null param");
d_assert(new, return CORE_ERROR, "Null param");
d_trace(3, "[%d] %s Receive peer %s:%d\n",
new->xid,
@ -371,7 +363,7 @@ status_t gtp_xact_receive(
new->gnode->port,
new->org == GTP_LOCAL_ORIGINATOR ? "LOCAL " : "REMOTE");
rv = gtp_send(new->sock, new->gnode, new->pkbuf);
d_assert(rv == CORE_OK, goto out2, "gtp_send error");
d_assert(rv == CORE_OK, return CORE_ERROR, "gtp_send error");
pkbuf_free(pkbuf);
return CORE_EAGAIN;
@ -387,32 +379,12 @@ status_t gtp_xact_receive(
}
}
if (h->teid_presence)
{
pkbuf_header(pkbuf, -GTPV2C_HEADER_LEN);
*teid = ntohl(h->teid);
}
else
{
pkbuf_header(pkbuf, -(GTPV2C_HEADER_LEN-GTPV2C_TEID_LEN));
*teid = 0;
}
*type = h->type;
rv = gtp_parse_msg(gtp_message, *type, pkbuf);
rv = gtp_parse_msg(message, pkbuf);
d_assert(rv == CORE_OK,
pkbuf_free(pkbuf); return CORE_ERROR, "parse error");
*xact = new;
return CORE_OK;
out2:
gtp_xact_delete(new);
out1:
pkbuf_free(pkbuf);
return CORE_ERROR;
}
gtp_xact_t *gtp_xact_find(index_t index)
@ -470,3 +442,28 @@ static gtp_xact_stage_t gtp_xact_get_stage(c_uint8_t type, c_uint32_t sqn)
return stage;
}
void gtp_xact_associate(gtp_xact_t *xact1, gtp_xact_t *xact2)
{
d_assert(xact1, return, "Null param");
d_assert(xact2, return, "Null param");
d_assert(xact1->assoc_xact == NULL, return, "Already assocaited");
d_assert(xact2->assoc_xact == NULL, return, "Already assocaited");
xact1->assoc_xact = xact2;
xact2->assoc_xact = xact1;
}
void gtp_xact_deassociate(gtp_xact_t *xact1, gtp_xact_t *xact2)
{
d_assert(xact1, return, "Null param");
d_assert(xact2, return, "Null param");
d_assert(xact1->assoc_xact != NULL, return, "Already deassocaited");
d_assert(xact2->assoc_xact != NULL, return, "Already deassocaited");
xact1->assoc_xact = NULL;
xact2->assoc_xact = NULL;
}

View File

@ -65,13 +65,13 @@ CORE_DECLARE(status_t) gtp_xact_associated_commit(gtp_xact_t *xact,
gtp_xact_t *assoc_xact, c_uint8_t type, c_uint32_t teid, pkbuf_t *pkbuf);
CORE_DECLARE(status_t) gtp_xact_timeout(index_t index);
CORE_DECLARE(status_t) gtp_xact_receive(
gtp_xact_ctx_t *context, net_sock_t *sock, gtp_node_t *gnode,
gtp_xact_t **xact,
c_uint8_t *type, c_uint32_t *teid, gtp_message_t *gtp_message,
pkbuf_t *pkbuf);
CORE_DECLARE(status_t) gtp_xact_receive(gtp_xact_ctx_t *context,
net_sock_t *sock, gtp_node_t *gnode, pkbuf_t *pkbuf,
gtp_xact_t **xact, gtp_message_t *gtp_message);
CORE_DECLARE(gtp_xact_t *) gtp_xact_find(index_t index);
CORE_DECLARE(void) gtp_xact_associate(gtp_xact_t *xact1, gtp_xact_t *xact2);
CORE_DECLARE(void) gtp_xact_deassociate(gtp_xact_t *xact1, gtp_xact_t *xact2);
#ifdef __cplusplus
}

View File

@ -531,9 +531,9 @@ f.write(" };\n");
f.write("} gtp_message_t;\n\n")
f.write("""CORE_DECLARE(status_t) gtp_parse_msg(
gtp_message_t *gtp_message, c_uint8_t type, pkbuf_t *pkbuf);
gtp_message_t *gtp_message, pkbuf_t *pkbuf);
CORE_DECLARE(status_t) gtp_build_msg(
pkbuf_t **pkbuf, c_uint8_t type, gtp_message_t *gtp_message);
pkbuf_t **pkbuf, gtp_message_t *gtp_message);
#ifdef __cplusplus
}
@ -610,12 +610,34 @@ for (k, v) in sorted_msg_list:
f.write("}};\n\n")
f.write("\n")
f.write("""status_t gtp_parse_msg(gtp_message_t *gtp_message, c_uint8_t type, pkbuf_t *pkbuf)
f.write("""status_t gtp_parse_msg(gtp_message_t *gtp_message, pkbuf_t *pkbuf)
{
status_t rv = CORE_ERROR;
gtp_header_t *h = NULL;
c_uint16_t size = 0;
d_assert(gtp_message, return CORE_ERROR, "Null param");
d_assert(pkbuf, return CORE_ERROR, "Null param");
d_assert(pkbuf->payload, return CORE_ERROR, "Null param");
h = pkbuf->payload;
d_assert(h, return CORE_ERROR, "Null param");
memset(gtp_message, 0, sizeof(gtp_message_t));
switch(type)
if (h->teid_presence)
size = GTPV2C_HEADER_LEN;
else
size = GTPV2C_HEADER_LEN-GTPV2C_TEID_LEN;
d_assert(pkbuf_header(pkbuf, -size) == CORE_OK,
return CORE_ERROR, "pkbuf_header error");
memcpy(&gtp_message->h, pkbuf->payload - size, size);
if (h->teid_presence)
gtp_message->h.teid = ntohl(gtp_message->h.teid);
switch(gtp_message->h.type)
{
""")
for (k, v) in sorted_msg_list:
@ -625,7 +647,7 @@ for (k, v) in sorted_msg_list:
f.write(" &tlv_desc_%s, pkbuf, TLV_MODE_T1_L2_I1);\n" % v_lower(k))
f.write(" break;\n")
f.write(""" default:
d_warn("Not implmeneted(type:%d)", type);
d_warn("Not implmeneted(type:%d)", gtp_message->h.type);
break;
}
@ -634,11 +656,12 @@ f.write(""" default:
""")
f.write("""status_t gtp_build_msg(pkbuf_t **pkbuf, c_uint8_t type, gtp_message_t *gtp_message)
f.write("""status_t gtp_build_msg(pkbuf_t **pkbuf, gtp_message_t *gtp_message)
{
status_t rv = CORE_ERROR;
switch(type)
d_assert(gtp_message, return rv, "Null param");
switch(gtp_message->h.type)
{
""")
for (k, v) in sorted_msg_list:
@ -648,7 +671,7 @@ for (k, v) in sorted_msg_list:
f.write(" &gtp_message->%s, TLV_MODE_T1_L2_I1);\n" % v_lower(k))
f.write(" break;\n")
f.write(""" default:
d_warn("Not implmeneted(type:%d)", type);
d_warn("Not implmeneted(type:%d)", gtp_message->h.type);
break;
}

View File

@ -145,7 +145,8 @@ status_t mme_s11_build_create_session_request(pkbuf_t **pkbuf, mme_sess_t *sess)
req->charging_characteristics.data = (c_uint8_t *)"\x54\x00";
req->charging_characteristics.len = 2;
rv = gtp_build_msg(pkbuf, GTP_CREATE_SESSION_REQUEST_TYPE, &gtp_message);
gtp_message.h.type = GTP_CREATE_SESSION_REQUEST_TYPE;
rv = gtp_build_msg(pkbuf, &gtp_message);
d_assert(rv == CORE_OK, return CORE_ERROR, "gtp build failed");
return CORE_OK;
@ -183,7 +184,8 @@ status_t mme_s11_build_modify_bearer_request(
req->bearer_contexts_to_be_modified.s1_u_enodeb_f_teid.len =
GTP_F_TEID_IPV4_LEN;
rv = gtp_build_msg(pkbuf, GTP_MODIFY_BEARER_REQUEST_TYPE, &gtp_message);
gtp_message.h.type = GTP_MODIFY_BEARER_REQUEST_TYPE;
rv = gtp_build_msg(pkbuf, &gtp_message);
d_assert(rv == CORE_OK, return CORE_ERROR, "gtp build failed");
return CORE_OK;
@ -228,7 +230,8 @@ status_t mme_s11_build_delete_session_request(pkbuf_t **pkbuf, mme_sess_t *sess)
req->indication_flags.data = &indication;
req->indication_flags.len = sizeof(gtp_indication_t);
rv = gtp_build_msg(pkbuf, GTP_DELETE_SESSION_REQUEST_TYPE, &gtp_message);
gtp_message.h.type = GTP_DELETE_SESSION_REQUEST_TYPE;
rv = gtp_build_msg(pkbuf, &gtp_message);
d_assert(rv == CORE_OK, return CORE_ERROR, "gtp build failed");
return CORE_OK;
@ -246,8 +249,8 @@ status_t mme_s11_build_release_access_bearers_request(pkbuf_t **pkbuf)
req->originating_node.presence = 1;
req->originating_node.u8 = GTP_NODE_TYPE_MME;
rv = gtp_build_msg(pkbuf,
GTP_RELEASE_ACCESS_BEARERS_REQUEST_TYPE, &gtp_message);
gtp_message.h.type = GTP_RELEASE_ACCESS_BEARERS_REQUEST_TYPE;
rv = gtp_build_msg(pkbuf, &gtp_message);
d_assert(rv == CORE_OK, return CORE_ERROR, "gtp build failed");
return CORE_OK;
@ -277,8 +280,8 @@ status_t mme_s11_build_downlink_data_notification_ack(pkbuf_t **pkbuf,
ack->cause.data = &cause;
ack->cause.len = sizeof(cause);
rv = gtp_build_msg(pkbuf, GTP_DOWNLINK_DATA_NOTIFICATION_ACKNOWLEDGE_TYPE,
&gtp_message);
gtp_message.h.type = GTP_DOWNLINK_DATA_NOTIFICATION_ACKNOWLEDGE_TYPE;
rv = gtp_build_msg(pkbuf, &gtp_message);
d_assert(rv == CORE_OK, return CORE_ERROR, "gtp build failed");
return CORE_OK;

View File

@ -266,9 +266,7 @@ void mme_state_operational(fsm_t *s, event_t *e)
gtp_node_t *gnode = (gtp_node_t *)event_get_param2(e);
pkbuf_t *pkbuf = (pkbuf_t *)event_get_param3(e);
gtp_xact_t *xact = NULL;
c_uint8_t type;
c_uint32_t teid;
gtp_message_t gtp_message;
gtp_message_t message;
mme_sess_t *sess = NULL;
mme_ue_t *mme_ue = NULL;
enb_ue_t *enb_ue = NULL;
@ -278,25 +276,25 @@ void mme_state_operational(fsm_t *s, event_t *e)
d_assert(gnode, pkbuf_free(pkbuf); break, "Null param");
rv = gtp_xact_receive(
&mme_self()->gtp_xact_ctx, sock, gnode,
&xact, &type, &teid, &gtp_message, pkbuf);
&mme_self()->gtp_xact_ctx, sock, gnode, pkbuf,
&xact, &message);
if (rv != CORE_OK)
break;
sess = mme_sess_find_by_teid(teid);
sess = mme_sess_find_by_teid(message.h.teid);
d_assert(sess, pkbuf_free(pkbuf); break,
"No Session Context(TEID:%d)", teid);
"No Session Context(TEID:%d)", message.h.teid);
mme_ue = sess->mme_ue;
d_assert(mme_ue, pkbuf_free(pkbuf);break, "Null param");
enb_ue = mme_ue->enb_ue;
d_assert(enb_ue, break, "Null param");
switch(type)
switch(message.h.type)
{
case GTP_CREATE_SESSION_RESPONSE_TYPE:
{
mme_s11_handle_create_session_response(
sess, &gtp_message.create_session_response);
sess, &message.create_session_response);
if (MME_SESSION_IN_ATTACH_STATE(sess))
{
emm_handle_attach_accept(mme_ue);
@ -309,12 +307,12 @@ void mme_state_operational(fsm_t *s, event_t *e)
}
case GTP_MODIFY_BEARER_RESPONSE_TYPE:
mme_s11_handle_modify_bearer_response(
sess, &gtp_message.modify_bearer_response);
sess, &message.modify_bearer_response);
break;
case GTP_DELETE_SESSION_RESPONSE_TYPE:
{
mme_s11_handle_delete_session_response(
sess, &gtp_message.delete_session_response);
sess, &message.delete_session_response);
if (MME_UE_DETACH_INITIATED(mme_ue))
{
@ -357,7 +355,7 @@ void mme_state_operational(fsm_t *s, event_t *e)
case GTP_RELEASE_ACCESS_BEARERS_RESPONSE_TYPE:
{
mme_s11_handle_release_access_bearers_response(
sess, &gtp_message.release_access_bearers_response);
sess, &message.release_access_bearers_response);
s1ap_handle_release_access_bearers_response(enb_ue);
break;
@ -367,7 +365,7 @@ void mme_state_operational(fsm_t *s, event_t *e)
{
mme_s11_handle_downlink_data_notification(
xact,
sess, &gtp_message.downlink_data_notification);
sess, &message.downlink_data_notification);
s1ap_handle_paging(mme_ue);
/* Start T3413 */
@ -375,7 +373,7 @@ void mme_state_operational(fsm_t *s, event_t *e)
break;
}
default:
d_warn("Not implmeneted(type:%d)", type);
d_warn("Not implmeneted(type:%d)", message.h.type);
break;
}
pkbuf_free(pkbuf);

View File

@ -70,9 +70,6 @@ typedef struct _pgw_sess_t {
c_uint32_t sgw_s5c_teid;
c_uint32_t sgw_s5c_addr;
/* Last Received GTP Messasge */
gtp_message_t last_gtp_message;
/* IMSI */
c_uint8_t imsi[MAX_IMSI_LEN];
int imsi_len;

View File

@ -17,7 +17,6 @@ void pgw_gx_handle_cca_initial_request(
pgw_bearer_t *bearer = NULL;
gtp_message_t gtp_message;
c_uint8_t type = GTP_CREATE_SESSION_RESPONSE_TYPE;
gtp_create_session_response_t *rsp = NULL;
gtp_cause_t cause;
@ -97,10 +96,11 @@ void pgw_gx_handle_cca_initial_request(
rsp->bearer_contexts_created.s5_s8_u_sgw_f_teid.len =
GTP_F_TEID_IPV4_LEN;
rv = gtp_build_msg(&pkbuf, type, &gtp_message);
gtp_message.h.type = GTP_CREATE_SESSION_RESPONSE_TYPE;
rv = gtp_build_msg(&pkbuf, &gtp_message);
d_assert(rv == CORE_OK, return, "gtp build failed");
pgw_s5c_send_to_sgw(xact, type, sess->sgw_s5c_teid, pkbuf);
pgw_s5c_send_to_sgw(xact, gtp_message.h.type, sess->sgw_s5c_teid, pkbuf);
}
void pgw_gx_handle_cca_termination_request(
gtp_xact_t *xact, pgw_sess_t *sess,
@ -110,7 +110,6 @@ void pgw_gx_handle_cca_termination_request(
pkbuf_t *pkbuf;
gtp_message_t gtp_message;
c_uint8_t type = GTP_DELETE_SESSION_RESPONSE_TYPE;
gtp_delete_session_response_t *rsp = NULL;
c_uint32_t sgw_s5c_teid;
@ -157,11 +156,12 @@ void pgw_gx_handle_cca_termination_request(
/* Private Extension */
/* build */
rv = gtp_build_msg(&pkbuf, type, &gtp_message);
gtp_message.h.type = GTP_DELETE_SESSION_RESPONSE_TYPE;
rv = gtp_build_msg(&pkbuf, &gtp_message);
d_assert(rv == CORE_OK, return, "gtp build failed");
/* send */
pgw_s5c_send_to_sgw(xact, type, sgw_s5c_teid, pkbuf);
pgw_s5c_send_to_sgw(xact, gtp_message.h.type, sgw_s5c_teid, pkbuf);
}
static c_int16_t pgw_pco_build(c_uint8_t *pco_buf, tlv_pco_t *tlv_pco)

View File

@ -69,9 +69,7 @@ void pgw_state_operational(fsm_t *s, event_t *e)
pkbuf_t *copybuf = NULL;
c_uint16_t copybuf_len = 0;
gtp_xact_t *xact = NULL;
c_uint8_t type;
c_uint32_t teid;
gtp_message_t *gtp_message = NULL;
gtp_message_t *message = NULL;
pgw_sess_t *sess = NULL;
d_assert(recvbuf, break, "Null param");
@ -81,43 +79,39 @@ void pgw_state_operational(fsm_t *s, event_t *e)
copybuf_len = sizeof(gtp_message_t);
copybuf = pkbuf_alloc(0, copybuf_len);
d_assert(copybuf, break, "Null param");
gtp_message = copybuf->payload;
d_assert(gtp_message, break, "Null param");
message = copybuf->payload;
d_assert(message, break, "Null param");
rv = gtp_xact_receive(
&pgw_self()->gtp_xact_ctx, sock, gnode,
&xact, &type, &teid, gtp_message, recvbuf);
&pgw_self()->gtp_xact_ctx, sock, gnode, recvbuf,
&xact, message);
if (rv != CORE_OK)
break;
if (type == GTP_CREATE_SESSION_REQUEST_TYPE)
sess = pgw_sess_find_or_add_by_message(gtp_message);
if (message->h.type == GTP_CREATE_SESSION_REQUEST_TYPE)
sess = pgw_sess_find_or_add_by_message(message);
else
sess = pgw_sess_find_by_teid(teid);
sess = pgw_sess_find_by_teid(message->h.teid);
d_assert(sess, pkbuf_free(recvbuf); break, "No Session Context");
/* Store Last GTP Message for Session */
memcpy(&sess->last_gtp_message,
gtp_message, sizeof(gtp_message_t));
switch(type)
switch(message->h.type)
{
case GTP_CREATE_SESSION_REQUEST_TYPE:
pgw_s5c_handle_create_session_request(
xact, sess, &gtp_message->create_session_request);
xact, sess, &message->create_session_request);
pgw_gx_send_ccr(xact, sess, copybuf,
GX_CC_REQUEST_TYPE_INITIAL_REQUEST);
break;
case GTP_DELETE_SESSION_REQUEST_TYPE:
pgw_s5c_handle_delete_session_request(
xact, sess, &gtp_message->delete_session_request);
xact, sess, &message->delete_session_request);
pgw_gx_send_ccr(xact, sess, copybuf,
GX_CC_REQUEST_TYPE_TERMINATION_REQUEST);
break;
default:
pkbuf_free(copybuf);
d_warn("Not implmeneted(type:%d)", type);
d_warn("Not implmeneted(type:%d)", message->h.type);
break;
}
pkbuf_free(recvbuf);
@ -137,7 +131,7 @@ void pgw_state_operational(fsm_t *s, event_t *e)
pkbuf_t *gxbuf = (pkbuf_t *)event_get_param3(e);
gx_message_t *gx_message = NULL;
pkbuf_t *gtpbuf = (pkbuf_t *)event_get_param4(e);
gtp_message_t *gtp_message = NULL;
gtp_message_t *message = NULL;
d_assert(xact_index, return, "Null param");
xact = gtp_xact_find(xact_index);
@ -152,7 +146,7 @@ void pgw_state_operational(fsm_t *s, event_t *e)
d_assert(gx_message, return, "Null param");
d_assert(gtpbuf, return, "Null param");
gtp_message = gtpbuf->payload;
message = gtpbuf->payload;
switch(gx_message->cmd_code)
{
@ -170,14 +164,14 @@ void pgw_state_operational(fsm_t *s, event_t *e)
{
pgw_gx_handle_cca_initial_request(
xact, sess, cca_message,
&gtp_message->create_session_request);
&message->create_session_request);
break;
}
case GX_CC_REQUEST_TYPE_TERMINATION_REQUEST:
{
pgw_gx_handle_cca_termination_request(
xact, sess, cca_message,
&gtp_message->delete_session_request);
&message->delete_session_request);
break;
}
default:

View File

@ -72,7 +72,8 @@ void sgw_handle_create_session_request(gtp_xact_t *xact,
req->bearer_contexts_to_be_created.s5_s8_u_sgw_f_teid.len =
GTP_F_TEID_IPV4_LEN;
rv = gtp_build_msg(&pkbuf, GTP_CREATE_SESSION_REQUEST_TYPE, gtp_message);
gtp_message->h.type = GTP_CREATE_SESSION_REQUEST_TYPE;
rv = gtp_build_msg(&pkbuf, gtp_message);
d_assert(rv == CORE_OK, return, "gtp build failed");
d_assert(sgw_s5c_send_to_pgw(xact, GTP_CREATE_SESSION_REQUEST_TYPE, 0,
@ -161,7 +162,8 @@ void sgw_handle_create_session_response(gtp_xact_t *xact,
rsp->bearer_contexts_created.s1_u_enodeb_f_teid.data = &sgw_s1u_teid;
rsp->bearer_contexts_created.s1_u_enodeb_f_teid.len = GTP_F_TEID_IPV4_LEN;
rv = gtp_build_msg(&pkbuf, GTP_CREATE_SESSION_RESPONSE_TYPE, gtp_message);
gtp_message->h.type = GTP_CREATE_SESSION_RESPONSE_TYPE;
rv = gtp_build_msg(&pkbuf, gtp_message);
d_assert(rv == CORE_OK, return, "gtp build failed");
d_assert(sgw_s11_send_to_mme(xact, GTP_CREATE_SESSION_RESPONSE_TYPE,
@ -221,7 +223,8 @@ CORE_DECLARE(void) sgw_handle_modify_bearer_request(gtp_xact_t *xact,
rsp->cause.data = &cause;
rsp->cause.len = sizeof(cause);
rv = gtp_build_msg(&pkbuf, GTP_MODIFY_BEARER_RESPONSE_TYPE, &gtp_message);
gtp_message.h.type = GTP_MODIFY_BEARER_RESPONSE_TYPE;
rv = gtp_build_msg(&pkbuf, &gtp_message);
d_assert(rv == CORE_OK, return, "gtp build failed");
d_assert(sgw_s11_send_to_mme(xact, GTP_MODIFY_BEARER_RESPONSE_TYPE,
@ -242,7 +245,8 @@ void sgw_handle_delete_session_request(gtp_xact_t *xact,
d_assert(sess, return, "Null param");
d_assert(gtp_message, return, "Null param");
rv = gtp_build_msg(&pkbuf, GTP_DELETE_SESSION_REQUEST_TYPE, gtp_message);
gtp_message->h.type = GTP_DELETE_SESSION_REQUEST_TYPE;
rv = gtp_build_msg(&pkbuf, gtp_message);
d_assert(rv == CORE_OK, return, "gtp build failed");
d_assert(sgw_s5c_send_to_pgw(xact, GTP_DELETE_SESSION_REQUEST_TYPE,
@ -297,7 +301,8 @@ void sgw_handle_delete_session_response(gtp_xact_t *xact,
cause->value = GTP_CAUSE_INVALID_PEER;
}
rv = gtp_build_msg(&pkbuf, GTP_DELETE_SESSION_RESPONSE_TYPE, gtp_message);
gtp_message->h.type = GTP_DELETE_SESSION_RESPONSE_TYPE;
rv = gtp_build_msg(&pkbuf, gtp_message);
d_assert(rv == CORE_OK, return, "gtp build failed");
d_assert(sgw_s11_send_to_mme(xact, GTP_DELETE_SESSION_RESPONSE_TYPE,
@ -343,8 +348,8 @@ void sgw_handle_release_access_bearers_request(gtp_xact_t *xact,
rsp->cause.data = &cause;
rsp->cause.len = sizeof(cause);
rv = gtp_build_msg(&pkbuf,
GTP_RELEASE_ACCESS_BEARERS_RESPONSE_TYPE, &gtp_message);
gtp_message.h.type = GTP_RELEASE_ACCESS_BEARERS_RESPONSE_TYPE;
rv = gtp_build_msg(&pkbuf, &gtp_message);
d_assert(rv == CORE_OK, return, "gtp build failed");
d_assert(sgw_s11_send_to_mme(xact,
@ -385,9 +390,8 @@ void sgw_handle_lo_dldata_notification(sgw_bearer_t *bearer)
noti->allocation_retention_priority.data = &arp;
noti->allocation_retention_priority.len = sizeof(arp);
rv = gtp_build_msg(&pkbuf,
GTP_DOWNLINK_DATA_NOTIFICATION_TYPE, &gtp_message);
gtp_message.h.type = GTP_DOWNLINK_DATA_NOTIFICATION_TYPE;
rv = gtp_build_msg(&pkbuf, &gtp_message);
d_assert(rv == CORE_OK, return, "gtp build failed");
xact = gtp_xact_local_create(&sgw_self()->gtp_xact_ctx,

View File

@ -60,9 +60,7 @@ void sgw_state_operational(fsm_t *s, event_t *e)
gtp_node_t *gnode = (gtp_node_t *)event_get_param2(e);
pkbuf_t *pkbuf = (pkbuf_t *)event_get_param3(e);
gtp_xact_t *xact = NULL;
c_uint8_t type;
c_uint32_t teid;
gtp_message_t gtp_message;
gtp_message_t message;
sgw_sess_t *sess = NULL;
d_assert(pkbuf, break, "Null param");
@ -70,51 +68,51 @@ void sgw_state_operational(fsm_t *s, event_t *e)
d_assert(gnode, pkbuf_free(pkbuf); break, "Null param");
rv = gtp_xact_receive(
&sgw_self()->gtp_xact_ctx, sock, gnode,
&xact, &type, &teid, &gtp_message, pkbuf);
&sgw_self()->gtp_xact_ctx, sock, gnode, pkbuf,
&xact, &message);
if (rv != CORE_OK)
break;
if (type == GTP_CREATE_SESSION_REQUEST_TYPE)
sess = sgw_sess_find_or_add_by_message(&gtp_message);
if (message.h.type == GTP_CREATE_SESSION_REQUEST_TYPE)
sess = sgw_sess_find_or_add_by_message(&message);
else
sess = sgw_sess_find_by_teid(teid);
sess = sgw_sess_find_by_teid(message.h.teid);
d_assert(sess, pkbuf_free(pkbuf); break, "No Session Context");
switch(type)
switch(message.h.type)
{
case GTP_CREATE_SESSION_REQUEST_TYPE:
sgw_handle_create_session_request(
xact, sess, &gtp_message);
xact, sess, &message);
break;
case GTP_CREATE_SESSION_RESPONSE_TYPE:
sgw_handle_create_session_response(
xact, sess, &gtp_message);
xact, sess, &message);
break;
case GTP_MODIFY_BEARER_REQUEST_TYPE:
sgw_handle_modify_bearer_request(
xact, sess, &gtp_message.modify_bearer_request);
xact, sess, &message.modify_bearer_request);
break;
case GTP_DELETE_SESSION_REQUEST_TYPE:
sgw_handle_delete_session_request(
xact, sess, &gtp_message);
xact, sess, &message);
break;
case GTP_DELETE_SESSION_RESPONSE_TYPE:
sgw_handle_delete_session_response(
xact, sess, &gtp_message);
xact, sess, &message);
break;
case GTP_RELEASE_ACCESS_BEARERS_REQUEST_TYPE:
sgw_handle_release_access_bearers_request(
xact, sess,
&gtp_message.release_access_bearers_request);
&message.release_access_bearers_request);
break;
case GTP_DOWNLINK_DATA_NOTIFICATION_ACKNOWLEDGE_TYPE:
sgw_handle_downlink_data_notification_ack(
sess,
&gtp_message.downlink_data_notification_acknowledge);
&message.downlink_data_notification_acknowledge);
break;
default:
d_warn("Not implmeneted(type:%d)", type);
d_warn("Not implmeneted(type:%d)", message.h.type);
break;
}
pkbuf_free(pkbuf);