update it
This commit is contained in:
parent
a3df11fca2
commit
02fd23654e
|
@ -19,31 +19,6 @@
|
|||
(GTP_XACT_LOCAL_DURATION * GTP_XACT_LOCAL_RETRY_COUNT) /* 9 seconds */
|
||||
#define GTP_XACT_REMOTE_RETRY_COUNT 1
|
||||
|
||||
/* 5.1 General format */
|
||||
#define GTPV2C_HEADER_LEN 12
|
||||
#define GTPV2C_TEID_LEN 4
|
||||
|
||||
typedef struct _gtpv2c_header_t {
|
||||
ED4(c_uint8_t version:3;,
|
||||
c_uint8_t piggybacked:1;,
|
||||
c_uint8_t teid_presence:1;,
|
||||
c_uint8_t spare1:3;)
|
||||
c_uint8_t type;
|
||||
c_uint16_t length;
|
||||
union {
|
||||
struct {
|
||||
c_uint32_t teid;
|
||||
/* sqn : 31bit ~ 8bit, spare : 7bit ~ 0bit */
|
||||
#define GTP_XID_TO_SQN(__xid) ((__xid) << 8)
|
||||
#define GTP_SQN_TO_XID(__sqn) ((__sqn) >> 8)
|
||||
c_uint32_t sqn;
|
||||
};
|
||||
/* sqn : 31bit ~ 8bit, spare : 7bit ~ 0bit */
|
||||
c_uint32_t spare2;
|
||||
};
|
||||
} __attribute__ ((packed)) gtpv2c_header_t;
|
||||
|
||||
|
||||
static int gtp_xact_pool_initialized = 0;
|
||||
pool_declare(gtp_xact_pool, gtp_xact_t, SIZE_OF_GTP_XACT_POOL);
|
||||
|
||||
|
@ -119,40 +94,20 @@ gtp_xact_t *gtp_xact_create(gtp_xact_ctx_t *context,
|
|||
return xact;
|
||||
}
|
||||
|
||||
gtp_xact_t *gtp_xact_local_create(gtp_xact_ctx_t *context,
|
||||
net_sock_t *sock, gtp_node_t *gnode, gtp_message_t *gtp_message)
|
||||
gtp_xact_t *gtp_xact_local_create(
|
||||
gtp_xact_ctx_t *context, net_sock_t *sock, gtp_node_t *gnode)
|
||||
{
|
||||
status_t rv;
|
||||
gtp_xact_t *xact = NULL;
|
||||
gtpv2c_header_t *h = NULL;
|
||||
pkbuf_t *pkbuf = NULL;
|
||||
|
||||
d_assert(context, return NULL, "Null param");
|
||||
d_assert(sock, return NULL, "Null param");
|
||||
d_assert(gnode, return NULL, "Null param");
|
||||
d_assert(gtp_message, return NULL, "Null param");
|
||||
|
||||
xact = gtp_xact_create(context, sock, gnode, GTP_LOCAL_ORIGINATOR,
|
||||
GTP_XACT_NEXT_ID(context->g_xact_id),
|
||||
GTP_XACT_LOCAL_DURATION, GTP_XACT_LOCAL_RETRY_COUNT);
|
||||
d_assert(xact, return NULL, "xact_create failed");
|
||||
|
||||
rv = gtp_build_msg(&pkbuf, gtp_message);
|
||||
d_assert(rv == CORE_OK,
|
||||
gtp_xact_delete(xact); return NULL, "gtp build failed");
|
||||
|
||||
pkbuf_header(pkbuf, GTPV2C_HEADER_LEN);
|
||||
h = pkbuf->payload;
|
||||
d_assert(h, gtp_xact_delete(xact); return NULL, "Null param");
|
||||
|
||||
h->version = 2;
|
||||
h->teid_presence = 1;
|
||||
h->type = gtp_message->type;
|
||||
h->length = htons(pkbuf->len - 4);
|
||||
h->sqn = GTP_XID_TO_SQN(xact->xid);
|
||||
|
||||
xact->pkbuf = pkbuf;
|
||||
|
||||
return xact;
|
||||
}
|
||||
|
||||
|
@ -219,24 +174,45 @@ status_t gtp_xact_deassociate(gtp_xact_t *xact1, gtp_xact_t *xact2)
|
|||
return CORE_OK;
|
||||
}
|
||||
|
||||
status_t gtp_xact_commit(gtp_xact_t *xact, pkbuf_t *pkbuf)
|
||||
status_t gtp_xact_commit(gtp_xact_t *xact, gtp_message_t *gtp_message)
|
||||
{
|
||||
xact->pkbuf = pkbuf;
|
||||
|
||||
d_assert(xact, return CORE_ERROR, "Null param");
|
||||
d_assert(xact->sock, return CORE_ERROR, "Null param");
|
||||
d_assert(xact->gnode, return CORE_ERROR, "Null param");
|
||||
d_assert(xact->pkbuf, return CORE_ERROR, "Null param");
|
||||
status_t rv;
|
||||
pkbuf_t *pkbuf = NULL;
|
||||
gtpv2c_header_t *h = NULL;
|
||||
|
||||
d_assert(xact, goto out, "Null param");
|
||||
d_assert(xact->sock, goto out, "Null param");
|
||||
d_assert(xact->gnode, goto out, "Null param");
|
||||
d_assert(gtp_message, goto out, "Null param");
|
||||
|
||||
d_trace(1, "[%d]%s Commit : xid = 0x%x\n",
|
||||
xact->gnode->port,
|
||||
xact->org == GTP_LOCAL_ORIGINATOR ? "LOCAL " : "REMOTE",
|
||||
xact->xid);
|
||||
|
||||
rv = gtp_build_msg(&pkbuf, gtp_message);
|
||||
d_assert(rv == CORE_OK, goto out, "gtp build failed");
|
||||
|
||||
pkbuf_header(pkbuf, GTPV2C_HEADER_LEN);
|
||||
h = pkbuf->payload;
|
||||
d_assert(h, goto out, "Null param");
|
||||
|
||||
h->version = 2;
|
||||
h->teid_presence = 1;
|
||||
h->type = gtp_message->type;
|
||||
h->length = htons(pkbuf->len - 4);
|
||||
h->sqn = GTP_XID_TO_SQN(xact->xid);
|
||||
|
||||
xact->pkbuf = pkbuf;
|
||||
|
||||
d_assert(gtp_send(xact->sock, xact->gnode, xact->pkbuf) == CORE_OK,
|
||||
return CORE_ERROR, "gtp_send error");
|
||||
goto out, "gtp_send error");
|
||||
|
||||
return CORE_OK;
|
||||
|
||||
out:
|
||||
gtp_xact_delete(xact);
|
||||
return CORE_ERROR;
|
||||
}
|
||||
|
||||
status_t gtp_xact_timeout(gtp_xact_t *xact)
|
||||
|
|
|
@ -13,6 +13,30 @@
|
|||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
|
||||
/* 5.1 General format */
|
||||
#define GTPV2C_HEADER_LEN 12
|
||||
#define GTPV2C_TEID_LEN 4
|
||||
|
||||
typedef struct _gtpv2c_header_t {
|
||||
ED4(c_uint8_t version:3;,
|
||||
c_uint8_t piggybacked:1;,
|
||||
c_uint8_t teid_presence:1;,
|
||||
c_uint8_t spare1:3;)
|
||||
c_uint8_t type;
|
||||
c_uint16_t length;
|
||||
union {
|
||||
struct {
|
||||
c_uint32_t teid;
|
||||
/* sqn : 31bit ~ 8bit, spare : 7bit ~ 0bit */
|
||||
#define GTP_XID_TO_SQN(__xid) ((__xid) << 8)
|
||||
#define GTP_SQN_TO_XID(__sqn) ((__sqn) >> 8)
|
||||
c_uint32_t sqn;
|
||||
};
|
||||
/* sqn : 31bit ~ 8bit, spare : 7bit ~ 0bit */
|
||||
c_uint32_t spare2;
|
||||
};
|
||||
} __attribute__ ((packed)) gtpv2c_header_t;
|
||||
|
||||
/**
|
||||
* Transaction Configuration
|
||||
*/
|
||||
|
@ -54,8 +78,8 @@ CORE_DECLARE(status_t) gtp_xact_final(void);
|
|||
CORE_DECLARE(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);
|
||||
CORE_DECLARE(gtp_xact_t *)gtp_xact_local_create(gtp_xact_ctx_t *context,
|
||||
net_sock_t *sock, gtp_node_t *gnode, gtp_message_t *gtp_message);
|
||||
CORE_DECLARE(gtp_xact_t *)gtp_xact_local_create(
|
||||
gtp_xact_ctx_t *context, net_sock_t *sock, gtp_node_t *gnode);
|
||||
CORE_DECLARE(gtp_xact_t *) gtp_xact_remote_create(gtp_xact_ctx_t *context,
|
||||
net_sock_t *sock, gtp_node_t *gnode, c_uint32_t sqn);
|
||||
CORE_DECLARE(status_t) gtp_xact_delete(gtp_xact_t *xact);
|
||||
|
@ -66,7 +90,8 @@ CORE_DECLARE(status_t) gtp_xact_deassociate(
|
|||
gtp_xact_t *xact1, gtp_xact_t *xact2);
|
||||
|
||||
CORE_DECLARE(gtp_xact_t *) gtp_xact_find(gtp_node_t *gnode, pkbuf_t *pkbuf);
|
||||
CORE_DECLARE(status_t) gtp_xact_commit(gtp_xact_t *xact, pkbuf_t *pkbuf);
|
||||
CORE_DECLARE(status_t) gtp_xact_commit(
|
||||
gtp_xact_t *xact, gtp_message_t *gtp_message);
|
||||
CORE_DECLARE(status_t) gtp_xact_timeout(gtp_xact_t *xact);
|
||||
|
||||
CORE_DECLARE(gtp_xact_t *) gtp_xact_recv(
|
||||
|
|
|
@ -80,18 +80,21 @@ status_t mme_s11_close()
|
|||
return CORE_OK;
|
||||
}
|
||||
|
||||
status_t mme_s11_send_to_sgw(void *sgw, gtp_message_t *gtp_message)
|
||||
status_t mme_s11_send_to_sgw(
|
||||
void *sgw, gtp_xact_t *xact, gtp_message_t *gtp_message)
|
||||
{
|
||||
gtp_xact_t *xact;
|
||||
d_assert(sgw, return CORE_ERROR, "Null param");
|
||||
d_assert(gtp_message, return CORE_ERROR, "Null param");
|
||||
|
||||
xact = gtp_xact_local_create(&mme_self()->gtp_xact_ctx,
|
||||
mme_self()->s11_sock, sgw, gtp_message);
|
||||
d_assert(xact, return CORE_ERROR, "gtp_xact_local_create failed");
|
||||
if (!xact)
|
||||
{
|
||||
xact = gtp_xact_local_create(&mme_self()->gtp_xact_ctx,
|
||||
mme_self()->s11_sock, sgw);
|
||||
}
|
||||
d_assert(xact, return CORE_ERROR, "Null param");
|
||||
|
||||
d_assert(gtp_send(xact->sock, xact->gnode, xact->pkbuf) == CORE_OK,
|
||||
gtp_xact_delete(xact); return CORE_ERROR, "gtp_send error");
|
||||
d_assert(gtp_xact_commit(xact, gtp_message) == CORE_OK,
|
||||
return CORE_ERROR, "xact commit error");
|
||||
|
||||
#if 1 /* FIXME */
|
||||
gtp_xact_delete(xact);
|
||||
|
@ -106,5 +109,5 @@ void test_send()
|
|||
gtp_message_t gtp_message;
|
||||
|
||||
s11_build_create_session_req(>p_message, NULL);
|
||||
mme_s11_send_to_sgw(mme_ctx_sgw_first(), >p_message);
|
||||
mme_s11_send_to_sgw(mme_ctx_sgw_first(), NULL, >p_message);
|
||||
}
|
||||
|
|
|
@ -11,7 +11,7 @@ CORE_DECLARE(status_t) mme_s11_listen();
|
|||
CORE_DECLARE(status_t) mme_s11_close();
|
||||
|
||||
CORE_DECLARE(status_t) mme_s11_send_to_sgw(
|
||||
void *sgw, gtp_message_t *gtp_message);
|
||||
void *sgw, gtp_xact_t *xact, gtp_message_t *gtp_message);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
|
|
@ -116,18 +116,19 @@ status_t pgw_path_close()
|
|||
return CORE_OK;
|
||||
}
|
||||
|
||||
status_t pgw_s5c_send_to_sgw(gtp_message_t *gtp_message)
|
||||
status_t pgw_s5c_send_to_sgw(gtp_xact_t *xact, gtp_message_t *gtp_message)
|
||||
{
|
||||
gtp_xact_t *xact;
|
||||
|
||||
d_assert(gtp_message, return CORE_ERROR, "Null param");
|
||||
|
||||
xact = gtp_xact_local_create(&pgw_self()->gtp_xact_ctx, pgw_self()->s5c_sock,
|
||||
&pgw_self()->s5c_node, gtp_message);
|
||||
if (!xact)
|
||||
{
|
||||
xact = gtp_xact_local_create(&pgw_self()->gtp_xact_ctx, pgw_self()->s5c_sock,
|
||||
&pgw_self()->s5c_node);
|
||||
}
|
||||
d_assert(xact, return CORE_ERROR, "Null param");
|
||||
|
||||
d_assert(gtp_send(xact->sock, xact->gnode, xact->pkbuf) == CORE_OK,
|
||||
gtp_xact_delete(xact); return CORE_ERROR, "gtp_send error");
|
||||
d_assert(gtp_xact_commit(xact, gtp_message) == CORE_OK,
|
||||
return CORE_ERROR, "xact commit error");
|
||||
|
||||
return CORE_OK;
|
||||
}
|
||||
|
|
|
@ -10,7 +10,8 @@ extern "C" {
|
|||
CORE_DECLARE(status_t) pgw_path_open();
|
||||
CORE_DECLARE(status_t) pgw_path_close();
|
||||
|
||||
CORE_DECLARE(status_t) pgw_s5c_send_to_sgw(gtp_message_t *gtp_messgae);
|
||||
CORE_DECLARE(status_t) pgw_s5c_send_to_sgw(
|
||||
gtp_xact_t *xact, gtp_message_t *gtp_messgae);
|
||||
CORE_DECLARE(status_t) pgw_s5u_send_to_sgw(pkbuf_t *pkbuf);
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
|
|
@ -59,23 +59,55 @@ void pgw_state_operational(pgw_sm_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;
|
||||
gtpv2c_header_t *h = NULL;
|
||||
gtp_message_t gtp_message;
|
||||
|
||||
d_assert(sock, break, "Null param");
|
||||
d_assert(gnode, break, "Null param");
|
||||
d_assert(pkbuf, break, "Null param");
|
||||
|
||||
xact = gtp_xact_recv(&pgw_self()->gtp_xact_ctx, sock, gnode,
|
||||
>p_message, pkbuf);
|
||||
d_assert(xact, break, "Null param");
|
||||
h = pkbuf->payload;
|
||||
d_assert(h, break, "Null param");
|
||||
|
||||
switch(gtp_message.type)
|
||||
xact = gtp_xact_find(gnode, pkbuf);
|
||||
if (!xact)
|
||||
{
|
||||
case GTP_CREATE_SESSION_REQUEST_TYPE:
|
||||
xact = gtp_xact_remote_create(&pgw_self()->gtp_xact_ctx,
|
||||
sock, gnode, h->sqn);
|
||||
}
|
||||
|
||||
if (xact->org == GTP_LOCAL_ORIGINATOR)
|
||||
{
|
||||
/* TODO */
|
||||
}
|
||||
else
|
||||
{
|
||||
if (xact->pkbuf)
|
||||
{
|
||||
pgw_s5c_handle_create_session_request(
|
||||
xact, >p_message.create_session_request);
|
||||
break;
|
||||
d_assert(gtp_send(xact->sock, xact->gnode, xact->pkbuf)
|
||||
== CORE_OK, break, "gtp_send error");
|
||||
}
|
||||
else
|
||||
{
|
||||
if (h->teid_presence)
|
||||
pkbuf_header(pkbuf, -GTPV2C_HEADER_LEN);
|
||||
else
|
||||
pkbuf_header(pkbuf, -(GTPV2C_HEADER_LEN-GTPV2C_TEID_LEN));
|
||||
|
||||
memset(>p_message, 0, sizeof(gtp_message_t));
|
||||
gtp_message.type = h->type;
|
||||
d_assert(gtp_parse_msg(>p_message, pkbuf) == CORE_OK,
|
||||
break, "parse error");
|
||||
|
||||
switch(gtp_message.type)
|
||||
{
|
||||
case GTP_CREATE_SESSION_REQUEST_TYPE:
|
||||
{
|
||||
pgw_s5c_handle_create_session_request(
|
||||
xact, >p_message.create_session_request);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -9,5 +9,16 @@
|
|||
void pgw_s5c_handle_create_session_request(
|
||||
gtp_xact_t *xact, gtp_create_session_request_t *req)
|
||||
{
|
||||
d_info("pgw_s5c_handle_create_session_request");
|
||||
gtp_message_t gtp_message;
|
||||
gtp_create_session_response_t *rsp = >p_message.create_session_response;
|
||||
|
||||
memset(>p_message, 0, sizeof(gtp_message_t));
|
||||
|
||||
gtp_message.type = GTP_CREATE_SESSION_RESPONSE_TYPE;
|
||||
|
||||
rsp->cause.presence = 1;
|
||||
rsp->cause.data = (c_uint8_t *)"\x55\x15";
|
||||
rsp->cause.len = 2;
|
||||
|
||||
pgw_s5c_send_to_sgw(xact, >p_message);
|
||||
}
|
||||
|
|
|
@ -9,6 +9,6 @@
|
|||
void sgw_s11_handle_create_session_request(
|
||||
gtp_xact_t *xact, gtp_message_t *gtp_message)
|
||||
{
|
||||
d_assert(sgw_s5c_send_to_pgw(xact, gtp_message) == CORE_OK, return,
|
||||
d_assert(sgw_s5c_send_to_pgw(NULL, xact, gtp_message) == CORE_OK, return,
|
||||
"failed to send message");
|
||||
}
|
||||
|
|
|
@ -142,38 +142,41 @@ status_t sgw_path_close()
|
|||
return CORE_OK;
|
||||
}
|
||||
|
||||
status_t sgw_s11_send_to_mme(gtp_message_t *gtp_message)
|
||||
status_t sgw_s11_send_to_mme(gtp_xact_t *xact, gtp_message_t *gtp_message)
|
||||
{
|
||||
gtp_xact_t *xact = NULL;
|
||||
d_assert(gtp_message, return CORE_ERROR, "Null param");
|
||||
|
||||
xact = gtp_xact_local_create(&sgw_self()->gtp_xact_ctx,
|
||||
sgw_self()->s11_sock, &sgw_self()->s11_node, gtp_message);
|
||||
d_assert(xact, return CORE_ERROR, "gtp_xact_local_create failed");
|
||||
if (!xact)
|
||||
{
|
||||
xact = gtp_xact_local_create(&sgw_self()->gtp_xact_ctx,
|
||||
sgw_self()->s11_sock, &sgw_self()->s11_node);
|
||||
}
|
||||
d_assert(xact, return CORE_ERROR, "Null param");
|
||||
|
||||
d_assert(gtp_send(xact->sock, xact->gnode, xact->pkbuf) == CORE_OK,
|
||||
gtp_xact_delete(xact); return CORE_ERROR, "gtp_send error");
|
||||
d_assert(gtp_xact_commit(xact, gtp_message) == CORE_OK,
|
||||
return CORE_ERROR, "xact commit error");
|
||||
|
||||
return CORE_OK;
|
||||
}
|
||||
|
||||
status_t sgw_s5c_send_to_pgw(
|
||||
gtp_xact_t *s11_xact, gtp_message_t *gtp_message)
|
||||
gtp_xact_t *xact, gtp_xact_t *s11_xact, gtp_message_t *gtp_message)
|
||||
{
|
||||
gtp_xact_t *xact;
|
||||
|
||||
d_assert(s11_xact, return CORE_ERROR, "Null param");
|
||||
d_assert(gtp_message, return CORE_ERROR, "Null param");
|
||||
|
||||
xact = gtp_xact_local_create(&sgw_self()->gtp_xact_ctx,
|
||||
sgw_self()->s5c_sock, &sgw_self()->s5c_node, gtp_message);
|
||||
d_assert(xact, return CORE_ERROR, "gtp_xact_local_create failed");
|
||||
if (!xact)
|
||||
{
|
||||
xact = gtp_xact_local_create(&sgw_self()->gtp_xact_ctx,
|
||||
sgw_self()->s5c_sock, &sgw_self()->s5c_node);
|
||||
}
|
||||
d_assert(xact, return CORE_ERROR, "Null param");
|
||||
|
||||
d_assert(gtp_xact_associate(xact, s11_xact) == CORE_OK,
|
||||
gtp_xact_delete(xact); return CORE_ERROR, "association failed");
|
||||
|
||||
d_assert(gtp_send(xact->sock, xact->gnode, xact->pkbuf) == CORE_OK,
|
||||
gtp_xact_delete(xact); return CORE_ERROR, "gtp_send error");
|
||||
d_assert(gtp_xact_commit(xact, gtp_message) == CORE_OK,
|
||||
return CORE_ERROR, "gtp_send error");
|
||||
|
||||
return CORE_OK;
|
||||
}
|
||||
|
|
|
@ -10,9 +10,10 @@ extern "C" {
|
|||
CORE_DECLARE(status_t) sgw_path_open();
|
||||
CORE_DECLARE(status_t) sgw_path_close();
|
||||
|
||||
CORE_DECLARE(status_t) sgw_s11_send_to_mme(gtp_message_t *gtp_message);
|
||||
CORE_DECLARE(status_t) sgw_s11_send_to_mme(
|
||||
gtp_xact_t *xact, gtp_message_t *gtp_message);
|
||||
CORE_DECLARE(status_t) sgw_s5c_send_to_pgw(
|
||||
gtp_xact_t *s11_xact, gtp_message_t *gtp_message);
|
||||
gtp_xact_t *xact, gtp_xact_t *s11_xact, gtp_message_t *gtp_message);
|
||||
CORE_DECLARE(status_t) sgw_s5u_send_to_pgw(pkbuf_t *pkbuf);
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
|
Loading…
Reference in New Issue