forked from acouzens/open5gs
update gtp_f_teid_t
This commit is contained in:
parent
48cdb1e390
commit
6d412139ef
|
@ -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];
|
||||
|
|
|
@ -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,);
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue