update gtp_f_teid_t

This commit is contained in:
Sukchan Lee 2017-12-07 14:48:25 +09:00
parent 48cdb1e390
commit 6d412139ef
6 changed files with 40 additions and 37 deletions

View File

@ -15,8 +15,6 @@ extern "C" {
#define SCTP_X2AP_PPID 27
#define MAX_NUM_OF_S1AP_SERVER 4
#define MAX_NUM_OF_GTP_SERVER 4
#define MAX_NUM_OF_GTP_CLIENT 16
#define MAX_NUM_OF_ENB 128
#define MAX_NUM_OF_UE 128
@ -98,14 +96,12 @@ typedef struct _guti_t {
* S1AP : 9.2.2.1 Transport Layer Address, See 36.414
* GTP : 8.22 Fully Qualified TEID (F-TEID) */
typedef struct _ip_t {
ED3(c_uint8_t ipv4:1;,
c_uint8_t ipv6:1;,
c_uint8_t reserved:6;)
union {
/* GTP_F_TEID_IPV4 */
c_uint32_t addr;
/* GTP_F_TEID_IPV6 */
c_uint8_t addr6[IPV6_LEN];
/* GTP_F_TEID_BOTH */
struct {
c_uint32_t addr;
c_uint8_t addr6[IPV6_LEN];

View File

@ -64,21 +64,21 @@ status_t gtp_f_teid_to_sockaddr(
{
addr->next = addr6;
addr->sin.sin_addr.s_addr = f_teid->ip.both.addr;
memcpy(addr6->sin6.sin6_addr.s6_addr, f_teid->ip.both.addr6, IPV6_LEN);
addr->sin.sin_addr.s_addr = f_teid->both.addr;
memcpy(addr6->sin6.sin6_addr.s6_addr, f_teid->both.addr6, IPV6_LEN);
*list = addr;
}
else if (f_teid->ipv4)
{
addr->sin.sin_addr.s_addr = f_teid->ip.addr;
addr->sin.sin_addr.s_addr = f_teid->addr;
core_free(addr6);
*list = addr;
}
else if (f_teid->ipv6)
{
memcpy(addr6->sin6.sin6_addr.s6_addr, f_teid->ip.addr6, IPV6_LEN);
memcpy(addr6->sin6.sin6_addr.s6_addr, f_teid->addr6, IPV6_LEN);
core_free(addr);
*list = addr6;
@ -98,27 +98,22 @@ status_t gtp_sockaddr_to_f_teid(
{
d_assert(f_teid, return CORE_ERROR,);
f_teid->ipv4 = 0;
f_teid->ipv6 = 0;
memset(&f_teid->ip, 0, sizeof(ip_t));
if (addr && addr6)
{
f_teid->ipv4 = 1;
f_teid->ip.both.addr = addr->sin.sin_addr.s_addr;
f_teid->both.addr = addr->sin.sin_addr.s_addr;
f_teid->ipv6 = 1;
memcpy(f_teid->ip.both.addr6, addr6->sin6.sin6_addr.s6_addr, IPV6_LEN);
memcpy(f_teid->both.addr6, addr6->sin6.sin6_addr.s6_addr, IPV6_LEN);
}
else if (addr)
{
f_teid->ipv4 = 1;
f_teid->ip.addr = addr->sin.sin_addr.s_addr;
f_teid->addr = addr->sin.sin_addr.s_addr;
}
else if (addr6)
{
f_teid->ipv6 = 1;
memcpy(f_teid->ip.addr6, addr6->sin6.sin6_addr.s6_addr, IPV6_LEN);
memcpy(f_teid->addr6, addr6->sin6.sin6_addr.s6_addr, IPV6_LEN);
}
else
d_assert(0, return CORE_ERROR,);
@ -155,16 +150,16 @@ gtp_f_teid_t *gtp_f_teid_copy(gtp_f_teid_t *dst, gtp_f_teid_t *src)
if (dst->ipv4 && dst->ipv6)
{
dst->ip.both.addr = src->ip.both.addr;
memcpy(dst->ip.both.addr6, src->ip.both.addr6, IPV6_LEN);
dst->both.addr = src->both.addr;
memcpy(dst->both.addr6, src->both.addr6, IPV6_LEN);
}
else if (dst->ipv4)
{
dst->ip.addr = src->ip.addr;
dst->addr = src->addr;
}
else if (dst->ipv6)
{
memcpy(dst->ip.addr6, src->ip.addr6, IPV6_LEN);
memcpy(dst->addr6, src->addr6, IPV6_LEN);
}
else
d_assert(0, return NULL,);

View File

@ -351,7 +351,19 @@ ED3(c_uint8_t ipv4:1;,
c_uint8_t ipv6:1;,
c_uint8_t interface_type:6;)
c_uint32_t teid;
ip_t ip;
union {
/* GTP_F_TEID_IPV4 */
c_uint32_t addr;
/* GTP_F_TEID_IPV6 */
c_uint8_t addr6[IPV6_LEN];
/* GTP_F_TEID_BOTH */
struct {
c_uint32_t addr;
c_uint8_t addr6[IPV6_LEN];
} both;
};
} __attribute__ ((packed)) gtp_f_teid_t;
/* 8.44 UE Time Zone */

View File

@ -84,7 +84,7 @@ status_t mme_s11_build_create_session_request(
{
/* FIXME */
pgw_s5c_teid.ipv4 = 1;
pgw_s5c_teid.ip.addr = pdn->pgw.ipv4_addr;
pgw_s5c_teid.addr = pdn->pgw.ipv4_addr;
req->pgw_s5_s8_address_for_control_plane_or_pmip.presence = 1;
req->pgw_s5_s8_address_for_control_plane_or_pmip.len =
GTP_F_TEID_IPV4_LEN;
@ -201,7 +201,7 @@ status_t mme_s11_build_modify_bearer_request(pkbuf_t **pkbuf,
memset(&enb_s1u_teid, 0, sizeof(gtp_f_teid_t));
enb_s1u_teid.ipv4 = 1;
enb_s1u_teid.interface_type = GTP_F_TEID_S1_U_ENODEB_GTP_U;
enb_s1u_teid.ip.addr = bearer->enb_s1u_addr;
enb_s1u_teid.addr = bearer->enb_s1u_addr;
enb_s1u_teid.teid = htonl(bearer->enb_s1u_teid);
req->bearer_contexts_to_be_modified.s1_u_enodeb_f_teid.presence = 1;
req->bearer_contexts_to_be_modified.s1_u_enodeb_f_teid.data = &enb_s1u_teid;
@ -315,7 +315,7 @@ status_t mme_s11_build_create_bearer_response(
memset(&enb_s1u_teid, 0, sizeof(gtp_f_teid_t));
enb_s1u_teid.ipv4 = 1;
enb_s1u_teid.interface_type = GTP_F_TEID_S1_U_ENODEB_GTP_U;
enb_s1u_teid.ip.addr = bearer->enb_s1u_addr;
enb_s1u_teid.addr = bearer->enb_s1u_addr;
enb_s1u_teid.teid = htonl(bearer->enb_s1u_teid);
rsp->bearer_contexts.s1_u_enodeb_f_teid.presence = 1;
rsp->bearer_contexts.s1_u_enodeb_f_teid.data = &enb_s1u_teid;
@ -325,7 +325,7 @@ status_t mme_s11_build_create_bearer_response(
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.ip.addr = bearer->sgw_s1u_addr;
sgw_s1u_teid.addr = bearer->sgw_s1u_addr;
sgw_s1u_teid.teid = htonl(bearer->sgw_s1u_teid);
rsp->bearer_contexts.s4_u_sgsn_f_teid.presence = 1;
rsp->bearer_contexts.s4_u_sgsn_f_teid.data = &sgw_s1u_teid;
@ -438,7 +438,7 @@ status_t mme_s11_build_create_indirect_data_forwarding_tunnel_request(
dl_teid[i].ipv4 = 1;
dl_teid[i].interface_type =
GTP_F_TEID_ENODEB_GTP_U_FOR_DL_DATA_FORWARDING;
dl_teid[i].ip.addr = bearer->enb_dl_addr;
dl_teid[i].addr = bearer->enb_dl_addr;
dl_teid[i].teid = htonl(bearer->enb_dl_teid);
d_assert(bearers[i], return CORE_ERROR,);
bearers[i]->s1_u_enodeb_f_teid.presence = 1;
@ -452,7 +452,7 @@ status_t mme_s11_build_create_indirect_data_forwarding_tunnel_request(
ul_teid[i].ipv4 = 1;
ul_teid[i].interface_type =
GTP_F_TEID_ENODEB_GTP_U_FOR_UL_DATA_FORWARDING;
ul_teid[i].ip.addr = bearer->enb_ul_addr;
ul_teid[i].addr = bearer->enb_ul_addr;
ul_teid[i].teid = htonl(bearer->enb_ul_teid);
d_assert(bearers[i], return CORE_ERROR,);
bearers[i]->s12_rnc_f_teid.presence = 1;

View File

@ -85,7 +85,7 @@ void mme_s11_handle_create_session_response(
/* Data Plane(UL) : SGW-S1U */
sgw_s1u_teid = rsp->bearer_contexts_created.s1_u_enodeb_f_teid.data;
bearer->sgw_s1u_teid = ntohl(sgw_s1u_teid->teid);
bearer->sgw_s1u_addr = sgw_s1u_teid->ip.addr;
bearer->sgw_s1u_addr = sgw_s1u_teid->addr;
d_trace(3, "[GTP] Create Session Response : "
"MME[%d] <-- SGW[%d]\n", mme_ue->mme_s11_teid, mme_ue->sgw_s11_teid);
@ -263,7 +263,7 @@ void mme_s11_handle_create_bearer_request(
/* Data Plane(UL) : SGW-S1U */
sgw_s1u_teid = req->bearer_contexts.s1_u_enodeb_f_teid.data;
bearer->sgw_s1u_teid = ntohl(sgw_s1u_teid->teid);
bearer->sgw_s1u_addr = sgw_s1u_teid->ip.addr;
bearer->sgw_s1u_addr = sgw_s1u_teid->addr;
/* Bearer QoS */
d_assert(gtp_parse_bearer_qos(&bearer_qos,
@ -401,7 +401,7 @@ void mme_s11_handle_create_indirect_data_forwarding_tunnel_response(
d_assert(teid, return,);
bearer->sgw_dl_teid = ntohl(teid->teid);
bearer->sgw_dl_addr = teid->ip.addr;
bearer->sgw_dl_addr = teid->addr;
}
if (bearers[i]->s2b_u_epdg_f_teid_5.presence)
{
@ -409,7 +409,7 @@ void mme_s11_handle_create_indirect_data_forwarding_tunnel_response(
d_assert(teid, return,);
bearer->sgw_ul_teid = ntohl(teid->teid);
bearer->sgw_ul_addr = teid->ip.addr;
bearer->sgw_ul_addr = teid->addr;
}
}

View File

@ -81,7 +81,7 @@ static void gtp_message_test1(abts_case *tc, void *data)
s11.interface_type = GTP_F_TEID_S11_MME_GTP_C;
s11.teid = htonl(0x80000084);
core_inet_pton(AF_INET, "10.50.54.10", &sa);
s11.ip.addr = sa.sin.sin_addr.s_addr;
s11.addr = sa.sin.sin_addr.s_addr;
req.sender_f_teid_for_control_plane.presence = 1;
req.sender_f_teid_for_control_plane.data = &s11;
req.sender_f_teid_for_control_plane.len = GTP_F_TEID_IPV4_LEN;
@ -90,7 +90,7 @@ static void gtp_message_test1(abts_case *tc, void *data)
s5.ipv4 = 1;
s5.interface_type = GTP_F_TEID_S5_S8_PGW_GTP_C;
core_inet_pton(AF_INET, "10.50.54.37", &sa);
s5.ip.addr = sa.sin.sin_addr.s_addr;
s5.addr = sa.sin.sin_addr.s_addr;
req.pgw_s5_s8_address_for_control_plane_or_pmip.presence = 1;
req.pgw_s5_s8_address_for_control_plane_or_pmip.data = &s5;
req.pgw_s5_s8_address_for_control_plane_or_pmip.len = GTP_F_TEID_IPV4_LEN;