all address format is changed to support IPv4/IPv6 dual stack

This commit is contained in:
Sukchan Lee 2017-12-07 17:40:15 +09:00
parent ceda682290
commit 44fed77ac4
5 changed files with 40 additions and 25 deletions

View File

@ -398,7 +398,7 @@ typedef struct _mme_bearer_t {
c_uint32_t enb_s1u_teid;
ip_t enb_s1u_ip;
c_uint32_t sgw_s1u_teid;
c_uint32_t sgw_s1u_addr;
ip_t sgw_s1u_ip;
c_uint32_t target_s1u_teid; /* Target S1U TEID from HO-Req-Ack */
ip_t target_s1u_ip; /* Target S1U ADDR from HO-Req-Ack */

View File

@ -320,10 +320,10 @@ status_t mme_s11_build_create_bearer_response(
/* Data Plane(UL) : SGW-S1U */
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.addr = bearer->sgw_s1u_addr;
sgw_s1u_teid.teid = htonl(bearer->sgw_s1u_teid);
rv = gtp_ip_to_f_teid(&bearer->sgw_s1u_ip, &sgw_s1u_teid, &len);
d_assert(rv == CORE_OK, return CORE_ERROR,);
rsp->bearer_contexts.s4_u_sgsn_f_teid.presence = 1;
rsp->bearer_contexts.s4_u_sgsn_f_teid.data = &sgw_s1u_teid;
rsp->bearer_contexts.s4_u_sgsn_f_teid.len = GTP_F_TEID_IPV4_LEN;

View File

@ -85,7 +85,8 @@ 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->addr;
rv = gtp_f_teid_to_ip(sgw_s1u_teid, &bearer->sgw_s1u_ip);
d_assert(rv == CORE_OK, return,);
d_trace(3, "[GTP] Create Session Response : "
"MME[%d] <-- SGW[%d]\n", mme_ue->mme_s11_teid, mme_ue->sgw_s11_teid);
@ -209,6 +210,7 @@ void mme_s11_handle_delete_session_response(
void mme_s11_handle_create_bearer_request(
gtp_xact_t *xact, mme_ue_t *mme_ue, gtp_create_bearer_request_t *req)
{
status_t rv;
mme_bearer_t *bearer = NULL;
mme_sess_t *sess = NULL;
@ -263,7 +265,8 @@ 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->addr;
rv = gtp_f_teid_to_ip(sgw_s1u_teid, &bearer->sgw_s1u_ip);
d_assert(rv == CORE_OK, return,);
/* Bearer QoS */
d_assert(gtp_parse_bearer_qos(&bearer_qos,

View File

@ -151,6 +151,7 @@ status_t s1ap_build_downlink_nas_transport(
status_t s1ap_build_initial_context_setup_request(
pkbuf_t **s1apbuf, mme_ue_t *mme_ue, pkbuf_t *emmbuf)
{
status_t rv;
char buf[CORE_ADDRSTRLEN];
int encoded;
@ -229,12 +230,9 @@ status_t s1ap_build_initial_context_setup_request(
gbrQosInformation;
}
e_rab->transportLayerAddress.size = 4;
e_rab->transportLayerAddress.buf = core_calloc(
e_rab->transportLayerAddress.size, sizeof(c_uint8_t));
memcpy(e_rab->transportLayerAddress.buf, &bearer->sgw_s1u_addr,
e_rab->transportLayerAddress.size);
rv = s1ap_ip_to_BIT_STRING(
&bearer->sgw_s1u_ip, &e_rab->transportLayerAddress);
d_assert(rv == CORE_OK, return CORE_ERROR,);
s1ap_uint32_to_OCTET_STRING(bearer->sgw_s1u_teid, &e_rab->gTP_TEID);
if (emmbuf && emmbuf->len)
@ -317,6 +315,7 @@ status_t s1ap_build_e_rab_setup_request(
{
char buf[CORE_ADDRSTRLEN];
status_t rv;
int encoded;
s1ap_message_t message;
S1ap_E_RABSetupRequestIEs_t *ies = &message.s1ap_E_RABSetupRequestIEs;
@ -376,12 +375,9 @@ status_t s1ap_build_e_rab_setup_request(
e_rab->e_RABlevelQoSParameters.gbrQosInformation = gbrQosInformation;
}
e_rab->transportLayerAddress.size = 4;
e_rab->transportLayerAddress.buf =
core_calloc(e_rab->transportLayerAddress.size, sizeof(c_uint8_t));
memcpy(e_rab->transportLayerAddress.buf, &bearer->sgw_s1u_addr,
e_rab->transportLayerAddress.size);
rv = s1ap_ip_to_BIT_STRING(
&bearer->sgw_s1u_ip, &e_rab->transportLayerAddress);
d_assert(rv == CORE_OK, return CORE_ERROR,);
s1ap_uint32_to_OCTET_STRING(bearer->sgw_s1u_teid, &e_rab->gTP_TEID);
nasPdu = &e_rab->nAS_PDU;
@ -807,6 +803,7 @@ status_t s1ap_build_handover_request(
pkbuf_t **s1apbuf, mme_ue_t *mme_ue, enb_ue_t *target_ue,
S1ap_HandoverRequiredIEs_t *required)
{
status_t rv;
char buf[CORE_ADDRSTRLEN];
int encoded;
@ -884,12 +881,9 @@ status_t s1ap_build_handover_request(
gbrQosInformation;
}
e_rab->transportLayerAddress.size = 4;
e_rab->transportLayerAddress.buf = core_calloc(
e_rab->transportLayerAddress.size, sizeof(c_uint8_t));
memcpy(e_rab->transportLayerAddress.buf, &bearer->sgw_s1u_addr,
e_rab->transportLayerAddress.size);
rv = s1ap_ip_to_BIT_STRING(
&bearer->sgw_s1u_ip, &e_rab->transportLayerAddress);
d_assert(rv == CORE_OK, return CORE_ERROR,);
s1ap_uint32_to_OCTET_STRING(bearer->sgw_s1u_teid, &e_rab->gTP_TEID);
ASN_SEQUENCE_ADD(&ies->e_RABToBeSetupListHOReq, e_rab);

View File

@ -178,9 +178,27 @@ status_t testgtpu_enb_send(sock_id sock, c_uint32_t src_ip, c_uint32_t dst_ip)
(unsigned short *)icmp_h, sizeof(struct icmp_header_t));
memset(&to, 0, sizeof(c_sockaddr_t));
to.sin.sin_addr.s_addr = bearer->sgw_s1u_addr;
to.c_sa_port = htons(GTPV1_U_UDP_PORT);
to.c_sa_family = AF_INET;
if (bearer->sgw_s1u_ip.ipv4 && bearer->sgw_s1u_ip.ipv6)
{
to.c_sa_family = AF_INET6;
memcpy(to.sin6.sin6_addr.s6_addr,
bearer->sgw_s1u_ip.both.addr6, IPV6_LEN);
}
else if (bearer->sgw_s1u_ip.ipv4)
{
to.c_sa_family = AF_INET;
to.sin.sin_addr.s_addr = bearer->sgw_s1u_ip.addr;
}
else if (bearer->sgw_s1u_ip.ipv6)
{
to.c_sa_family = AF_INET6;
memcpy(to.sin6.sin6_addr.s6_addr, bearer->sgw_s1u_ip.addr6, IPV6_LEN);
}
else
d_assert(0, return CORE_ERROR,);
sent = core_sendto(sock, pkbuf->payload, pkbuf->len, 0, &to);
pkbuf_free(pkbuf);
if (sent < 0 || sent != pkbuf->len)