add Create Indirect Data Forward Tunnel Request
This commit is contained in:
parent
b65256152c
commit
0bdd02227c
|
@ -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 */
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -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__ */
|
||||
|
|
@ -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 */
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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 =
|
||||
>p_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(>p_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, >p_message);
|
||||
d_assert(rv == CORE_OK, return CORE_ERROR, "gtp build failed");
|
||||
|
||||
return CORE_OK;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#define TRACE_MODULE _nasconv
|
||||
#define TRACE_MODULE _nas_conv
|
||||
|
||||
#include "core_debug.h"
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#define TRACE_MODULE _s1conv
|
||||
#define TRACE_MODULE _s1ap_conv
|
||||
|
||||
#include "core_debug.h"
|
||||
|
||||
|
|
|
@ -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");
|
||||
|
|
Loading…
Reference in New Issue