forked from acouzens/open5gs
all address format is changed to support IPv4/IPv6 dual stack
This commit is contained in:
parent
ceda682290
commit
44fed77ac4
|
@ -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 */
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue