add Create Indirect Data Forward Tunnel Request

This commit is contained in:
Sukchan Lee 2017-09-13 16:22:39 +09:00
parent b65256152c
commit 0bdd02227c
13 changed files with 266 additions and 35 deletions

View File

@ -7,17 +7,19 @@
extern "C" {
#endif /* __cplusplus */
#define MAX_NUM_OF_ENB 128
#define MAX_NUM_OF_UE 128
#define MAX_NUM_OF_SESS 4
#define MAX_NUM_OF_BEARER 4
#define MAX_NUM_OF_PF 16 /* Num of Packet Filter per Bearer */
#define MAX_NUM_OF_GTP_NODE 8
#define MAX_NUM_OF_ENB 128
#define MAX_NUM_OF_UE 128
#define MAX_NUM_OF_SESS 4
#define MAX_NUM_OF_BEARER 4
#define MAX_NUM_OF_TUNNEL 3 /* Num of Indirect Tunnel per Bearer */
#define MAX_NUM_OF_PF 16 /* Num of Packet Filter per Bearer */
#define MAX_NUM_OF_GTP_NODE 8
#define MAX_POOL_OF_UE (MAX_NUM_OF_ENB * MAX_NUM_OF_UE)
#define MAX_POOL_OF_SESS (MAX_POOL_OF_UE * MAX_NUM_OF_SESS)
#define MAX_POOL_OF_BEARER (MAX_POOL_OF_SESS * MAX_NUM_OF_BEARER)
#define MAX_POOL_OF_PF (MAX_POOL_OF_BEARER * MAX_NUM_OF_PF)
#define MAX_POOL_OF_UE (MAX_NUM_OF_ENB * MAX_NUM_OF_UE)
#define MAX_POOL_OF_SESS (MAX_POOL_OF_UE * MAX_NUM_OF_SESS)
#define MAX_POOL_OF_BEARER (MAX_POOL_OF_SESS * MAX_NUM_OF_BEARER)
#define MAX_POOL_OF_TUNNEL (MAX_POOL_OF_BEARER * MAX_NUM_OF_TUNNEL)
#define MAX_POOL_OF_PF (MAX_POOL_OF_BEARER * MAX_NUM_OF_PF)
#define MAX_NUM_OF_PCC_RULE 8
#define MAX_NUM_OF_FLOW 8 /* Num of Flow per PCC Rule */

View File

@ -3,8 +3,8 @@
noinst_LTLIBRARIES = libgtp.la
libgtp_la_SOURCES = \
gtp_message.h gtp_types.h gtp_path.h gtp_xact.h \
gtp_message.c gtp_types.c gtp_path.c gtp_xact.c
gtp_message.h gtp_types.h gtp_conv.h gtp_path.h gtp_xact.h \
gtp_message.c gtp_types.c gtp_conv.c gtp_path.c gtp_xact.c
libgtp_la_DEPENDENCIES = \
$(top_srcdir)/lib/base/libbase.la

62
lib/gtp/gtp_conv.c Normal file
View File

@ -0,0 +1,62 @@
#define TRACE_MODULE _gtp_conv
#include "core_debug.h"
#include "gtp_conv.h"
void gtp_bearers_in_create_indirect_tunnel_request(
tlv_bearer_context_t *bearers[][GTP_MAX_NUM_OF_INDIRECT_TUNNEL],
gtp_create_indirect_data_forwarding_tunnel_request_t *req)
{
(*bearers)[0] = &req->bearer_context_0;
(*bearers)[1] = &req->bearer_context_1;
(*bearers)[2] = &req->bearer_context_2;
(*bearers)[3] = &req->bearer_context_3;
(*bearers)[4] = &req->bearer_context_4;
(*bearers)[5] = &req->bearer_context_5;
(*bearers)[6] = &req->bearer_context_6;
(*bearers)[7] = &req->bearer_context_7;
(*bearers)[8] = &req->bearer_context_8;
(*bearers)[9] = &req->bearer_context_9;
(*bearers)[10] = &req->bearer_context_10;
(*bearers)[11] = &req->bearer_context_11;
(*bearers)[12] = &req->bearer_context_12;
(*bearers)[13] = &req->bearer_context_13;
(*bearers)[14] = &req->bearer_context_14;
(*bearers)[15] = &req->bearer_context_15;
(*bearers)[16] = &req->bearer_context_16;
(*bearers)[17] = &req->bearer_context_17;
(*bearers)[18] = &req->bearer_context_18;
(*bearers)[19] = &req->bearer_context_19;
(*bearers)[20] = &req->bearer_context_20;
(*bearers)[21] = &req->bearer_context_21;
}
void gtp_bearers_in_create_indirect_tunnel_response(
tlv_bearer_context_t *bearers[][GTP_MAX_NUM_OF_INDIRECT_TUNNEL],
gtp_create_indirect_data_forwarding_tunnel_response_t *rsp)
{
(*bearers)[0] = &rsp->bearer_context_0;
(*bearers)[1] = &rsp->bearer_context_1;
(*bearers)[2] = &rsp->bearer_context_2;
(*bearers)[3] = &rsp->bearer_context_3;
(*bearers)[4] = &rsp->bearer_context_4;
(*bearers)[5] = &rsp->bearer_context_5;
(*bearers)[6] = &rsp->bearer_context_6;
(*bearers)[7] = &rsp->bearer_context_7;
(*bearers)[8] = &rsp->bearer_context_8;
(*bearers)[9] = &rsp->bearer_context_9;
(*bearers)[10] = &rsp->bearer_context_10;
(*bearers)[11] = &rsp->bearer_context_11;
(*bearers)[12] = &rsp->bearer_context_12;
(*bearers)[13] = &rsp->bearer_context_13;
(*bearers)[14] = &rsp->bearer_context_14;
(*bearers)[15] = &rsp->bearer_context_15;
(*bearers)[16] = &rsp->bearer_context_16;
(*bearers)[17] = &rsp->bearer_context_17;
(*bearers)[18] = &rsp->bearer_context_18;
(*bearers)[19] = &rsp->bearer_context_19;
(*bearers)[20] = &rsp->bearer_context_20;
(*bearers)[21] = &rsp->bearer_context_21;
}

25
lib/gtp/gtp_conv.h Normal file
View File

@ -0,0 +1,25 @@
#ifndef __GTP_CONV_H__
#define __GTP_CONV_H__
#include "gtp_message.h"
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
#define GTP_MAX_NUM_OF_INDIRECT_TUNNEL 22
/* Create Indirect Data Forwarding Tunnel Request/Response */
CORE_DECLARE(void) gtp_bearers_in_create_indirect_tunnel_request(
tlv_bearer_context_t *bearers[][GTP_MAX_NUM_OF_INDIRECT_TUNNEL],
gtp_create_indirect_data_forwarding_tunnel_request_t *req);
CORE_DECLARE(void) gtp_bearers_in_create_indirect_tunnel_response(
tlv_bearer_context_t *bearers[][GTP_MAX_NUM_OF_INDIRECT_TUNNEL],
gtp_create_indirect_data_forwarding_tunnel_response_t *rsp);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* __GTP_CONV_H__ */

View File

@ -27,7 +27,9 @@
#include "core_debug.h"
#include "core_lib.h"
#include "gtp_types.h"
#include "gtp_message.h"
/* 8.13 Protocol Configuration Options (PCO)
* 10.5.6.3 Protocol configuration options in 3GPP TS 24.008 */

View File

@ -356,6 +356,31 @@ typedef struct _mme_sess_t {
#define MME_HAVE_ENB_S1U_PATH(__bEARER) \
((__bEARER) && ((__bEARER)->enb_s1u_teid) && ((__bEARER)->enb_s1u_addr))
#define MME_HAVE_DL_INDIRECT_TUNNEL(__bEARER) \
((__bEARER) && ((__bEARER)->enb_dl_teid) && ((__bEARER)->enb_dl_addr))
#define MME_HAVE_UL_INDIRECT_TUNNEL(__bEARER) \
((__bEARER) && ((__bEARER)->enb_ul_teid) && ((__bEARER)->enb_ul_addr))
#define CLEAR_INDIRECT_TUNNEL(__mME) \
do { \
mme_sess_t *sess = NULL; \
mme_bearer_t *bearer = NULL; \
d_assert((__mME), break, "Null param"); \
sess = mme_sess_first(__mME); \
while (sess != NULL) \
{ \
bearer = mme_bearer_first(sess); \
while(bearer != NULL) \
{ \
bearer->enb_dl_teid = 0; \
bearer->enb_dl_addr = 0; \
bearer->enb_ul_teid = 0; \
bearer->enb_ul_addr = 0; \
bearer = mme_bearer_next(bearer); \
} \
sess = mme_sess_next(sess); \
} \
} while(0)
typedef struct _mme_bearer_t {
lnode_t node; /* A node of list_t */
index_t index; /* An index of this node */

View File

@ -250,17 +250,17 @@ status_t mme_gtp_send_create_bearer_response(mme_bearer_t *bearer)
return CORE_OK;
}
status_t mme_gtp_send_release_access_bearers_response(mme_sess_t *sess)
status_t mme_gtp_send_release_access_bearers_request(mme_ue_t *mme_ue)
{
status_t rv;
gtp_header_t h;
pkbuf_t *pkbuf = NULL;
gtp_xact_t *xact = NULL;
mme_ue_t *mme_ue = NULL;
mme_sess_t *sess = NULL;
d_assert(sess, return CORE_ERROR, "Null param");
mme_ue = sess->mme_ue;
d_assert(mme_ue, return CORE_ERROR, "Null param");
sess = mme_sess_first(mme_ue);
d_assert(sess, return CORE_ERROR, "Null param");
memset(&h, 0, sizeof(gtp_header_t));
h.type = GTP_RELEASE_ACCESS_BEARERS_REQUEST_TYPE;
@ -277,3 +277,33 @@ status_t mme_gtp_send_release_access_bearers_response(mme_sess_t *sess)
return CORE_OK;
}
status_t mme_gtp_send_create_indirect_data_forwarding_tunnel_request(
mme_ue_t *mme_ue)
{
status_t rv;
gtp_header_t h;
pkbuf_t *pkbuf = NULL;
gtp_xact_t *xact = NULL;
mme_sess_t *sess = NULL;
d_assert(mme_ue, return CORE_ERROR, "Null param");
sess = mme_sess_first(mme_ue);
d_assert(sess, return CORE_ERROR, "Null param");
memset(&h, 0, sizeof(gtp_header_t));
h.type = GTP_CREATE_INDIRECT_DATA_FORWARDING_TUNNEL_REQUEST_TYPE;
h.teid = mme_ue->sgw_s11_teid;
rv = mme_s11_build_create_indirect_data_forwarding_tunnel_request(
&pkbuf, h.type, mme_ue);
d_assert(rv == CORE_OK, return CORE_ERROR, "S11 build error");
xact = gtp_xact_local_create(sess->sgw, &h, pkbuf);
d_assert(xact, return CORE_ERROR, "Null param");
rv = gtp_xact_commit(xact);
d_assert(rv == CORE_OK, return CORE_ERROR, "xact_commit error");
return CORE_OK;
}

View File

@ -19,8 +19,11 @@ CORE_DECLARE(status_t) mme_gtp_send_delete_session_request(mme_sess_t *sess);
CORE_DECLARE(status_t) mme_gtp_send_delete_all_sessions(mme_ue_t *mme_ue);
CORE_DECLARE(status_t) mme_gtp_send_create_bearer_response(
mme_bearer_t *bearer);
CORE_DECLARE(status_t) mme_gtp_send_release_access_bearers_response(
mme_sess_t *sess);
CORE_DECLARE(status_t) mme_gtp_send_release_access_bearers_request(
mme_ue_t *mme_ue);
CORE_DECLARE(status_t)
mme_gtp_send_create_indirect_data_forwarding_tunnel_request(
mme_ue_t *mme_ue);
#ifdef __cplusplus
}

View File

@ -3,6 +3,7 @@
#include "core_debug.h"
#include "gtp_types.h"
#include "gtp_conv.h"
#include "gtp_message.h"
#include "types.h"
@ -394,3 +395,83 @@ status_t mme_s11_build_downlink_data_notification_ack(
return CORE_OK;
}
status_t mme_s11_build_create_indirect_data_forwarding_tunnel_request(
pkbuf_t **pkbuf, c_uint8_t type, mme_ue_t *mme_ue)
{
status_t rv;
int i;
mme_sess_t *sess = NULL;
mme_bearer_t *bearer = NULL;
gtp_message_t gtp_message;
gtp_create_indirect_data_forwarding_tunnel_request_t *req =
&gtp_message.create_indirect_data_forwarding_tunnel_request;
tlv_bearer_context_t *bearers[GTP_MAX_NUM_OF_INDIRECT_TUNNEL];
gtp_f_teid_t tunnel_teid[GTP_MAX_NUM_OF_INDIRECT_TUNNEL];
d_assert(mme_ue, return CORE_ERROR, "Null param");
gtp_bearers_in_create_indirect_tunnel_request(&bearers, req);
memset(&gtp_message, 0, sizeof(gtp_message_t));
i = 0;
sess = mme_sess_first(mme_ue);
while (sess != NULL)
{
bearer = mme_bearer_first(sess);
while(bearer != NULL)
{
if (MME_HAVE_DL_INDIRECT_TUNNEL(bearer))
{
bearers[i]->presence = 1;
bearers[i]->eps_bearer_id.presence = 1;
bearers[i]->eps_bearer_id.u8 = bearer->ebi;
memset(&tunnel_teid[i], 0, sizeof(gtp_f_teid_t));
tunnel_teid[i].ipv4 = 1;
tunnel_teid[i].interface_type =
GTP_F_TEID_ENODEB_GTP_U_FOR_DL_DATA_FORWARDING;
tunnel_teid[i].ipv4_addr = bearer->enb_dl_addr;
tunnel_teid[i].teid = htonl(bearer->enb_dl_teid);
d_assert(bearers[i], return CORE_ERROR,);
bearers[i]->s1_u_enodeb_f_teid.presence = 1;
bearers[i]->s1_u_enodeb_f_teid.data = &tunnel_teid[i];
bearers[i]->s1_u_enodeb_f_teid.len = GTP_F_TEID_IPV4_LEN;
i++;
printf("DL\n");
}
if (MME_HAVE_UL_INDIRECT_TUNNEL(bearer))
{
bearers[i]->presence = 1;
bearers[i]->eps_bearer_id.presence = 1;
bearers[i]->eps_bearer_id.u8 = bearer->ebi;
memset(&tunnel_teid[i], 0, sizeof(gtp_f_teid_t));
tunnel_teid[i].ipv4 = 1;
tunnel_teid[i].interface_type =
GTP_F_TEID_ENODEB_GTP_U_FOR_UL_DATA_FORWARDING;
tunnel_teid[i].ipv4_addr = bearer->enb_ul_addr;
tunnel_teid[i].teid = htonl(bearer->enb_ul_teid);
d_assert(bearers[i], return CORE_ERROR,);
bearers[i]->s12_rnc_f_teid.presence = 1;
bearers[i]->s12_rnc_f_teid.data = &tunnel_teid[i];
bearers[i]->s12_rnc_f_teid.len = GTP_F_TEID_IPV4_LEN;
printf("UL\n");
i++;
}
bearer = mme_bearer_next(bearer);
}
sess = mme_sess_next(sess);
}
gtp_message.h.type = type;
rv = gtp_build_msg(pkbuf, &gtp_message);
d_assert(rv == CORE_OK, return CORE_ERROR, "gtp build failed");
return CORE_OK;
}

View File

@ -19,6 +19,9 @@ CORE_DECLARE(status_t) mme_s11_build_release_access_bearers_request(
pkbuf_t **pkbuf, c_uint8_t type);
CORE_DECLARE(status_t) mme_s11_build_downlink_data_notification_ack(
pkbuf_t **pkbuf, c_uint8_t type, mme_ue_t *mme_ue);
CORE_DECLARE(status_t)
mme_s11_build_create_indirect_data_forwarding_tunnel_request(
pkbuf_t **pkbuf, c_uint8_t type, mme_ue_t *mme_ue);
#ifdef __cplusplus
}

View File

@ -1,4 +1,4 @@
#define TRACE_MODULE _nasconv
#define TRACE_MODULE _nas_conv
#include "core_debug.h"

View File

@ -1,4 +1,4 @@
#define TRACE_MODULE _s1conv
#define TRACE_MODULE _s1ap_conv
#include "core_debug.h"

View File

@ -399,18 +399,12 @@ void s1ap_handle_ue_context_release_request(
if (cause == S1ap_CauseRadioNetwork_user_inactivity)
{
mme_ue_t *mme_ue = enb_ue->mme_ue;
d_assert(mme_ue, return,);
if (MME_HAVE_SGW_S11_PATH(mme_ue))
{
mme_sess_t *sess = mme_sess_first(mme_ue);
while (sess != NULL)
{
rv = mme_gtp_send_release_access_bearers_response(sess);
d_assert(rv == CORE_OK, return,
"mme_gtp_send_release_access_bearers_response failed");
sess = mme_sess_next(sess);
}
rv = mme_gtp_send_release_access_bearers_request(mme_ue);
d_assert(rv == CORE_OK, return, "gtp send failed");
}
else
{
@ -696,7 +690,7 @@ void s1ap_handle_handover_required(mme_enb_t *enb, s1ap_message_t *message)
void s1ap_handle_handover_request_ack(mme_enb_t *enb, s1ap_message_t *message)
{
//status_t rv;
status_t rv;
char buf[INET_ADDRSTRLEN];
int i;
@ -762,16 +756,20 @@ void s1ap_handle_handover_request_ack(mme_enb_t *enb, s1ap_message_t *message)
e_rab->uL_S1ap_TransportLayerAddress->buf,
sizeof(bearer->enb_ul_addr));
}
#if 0
rv = mme_gtp_send_modify_bearer_request(bearer);
d_assert(rv == CORE_OK, return, "gtp send failed");
#endif
}
S1AP_STORE_DATA(
&mme_ue->container, &ies->target_ToSource_TransparentContainer);
rv = mme_gtp_send_create_indirect_data_forwarding_tunnel_request(mme_ue);
d_assert(rv == CORE_OK, return, "gtp send failed");
#if 0
rv = mme_gtp_send_modify_bearer_request(bearer);
d_assert(rv == CORE_OK, return, "gtp send failed");
#endif
#if 0
rv = s1ap_send_handover_request(mme_ue, ies);
d_assert(rv == CORE_OK,, "s1ap send error");