forked from acouzens/open5gs
intermediate
This commit is contained in:
parent
3e05717180
commit
ceda682290
|
@ -332,8 +332,7 @@ struct _mme_ue_t {
|
|||
|
||||
#define MME_HAVE_SGW_S1U_PATH(__sESS) \
|
||||
((__sESS) && (mme_bearer_first(__sESS)) && \
|
||||
((mme_default_bearer_in_sess(__sESS)->sgw_s1u_teid) && \
|
||||
(mme_default_bearer_in_sess(__sESS)->sgw_s1u_addr)))
|
||||
((mme_default_bearer_in_sess(__sESS)->sgw_s1u_teid)))
|
||||
|
||||
#define MME_HAVE_SGW_S11_PATH(__mME) \
|
||||
((__mME) && ((__mME)->sgw_s11_teid))
|
||||
|
@ -371,27 +370,23 @@ typedef struct _mme_sess_t {
|
|||
} mme_sess_t;
|
||||
|
||||
#define MME_HAVE_ENB_S1U_PATH(__bEARER) \
|
||||
((__bEARER) && ((__bEARER)->enb_s1u_teid) && ((__bEARER)->enb_s1u_addr))
|
||||
((__bEARER) && ((__bEARER)->enb_s1u_teid))
|
||||
|
||||
#define MME_HAVE_ENB_DL_INDIRECT_TUNNEL(__bEARER) \
|
||||
((__bEARER) && ((__bEARER)->enb_dl_teid) && ((__bEARER)->enb_dl_addr))
|
||||
((__bEARER) && ((__bEARER)->enb_dl_teid))
|
||||
#define MME_HAVE_ENB_UL_INDIRECT_TUNNEL(__bEARER) \
|
||||
((__bEARER) && ((__bEARER)->enb_ul_teid) && ((__bEARER)->enb_ul_addr))
|
||||
((__bEARER) && ((__bEARER)->enb_ul_teid))
|
||||
#define MME_HAVE_SGW_DL_INDIRECT_TUNNEL(__bEARER) \
|
||||
((__bEARER) && ((__bEARER)->sgw_dl_teid) && ((__bEARER)->sgw_dl_addr))
|
||||
((__bEARER) && ((__bEARER)->sgw_dl_teid))
|
||||
#define MME_HAVE_SGW_UL_INDIRECT_TUNNEL(__bEARER) \
|
||||
((__bEARER) && ((__bEARER)->sgw_ul_teid) && ((__bEARER)->sgw_ul_addr))
|
||||
((__bEARER) && ((__bEARER)->sgw_ul_teid))
|
||||
#define CLEAR_INDIRECT_TUNNEL(__bEARER) \
|
||||
do { \
|
||||
d_assert((__bEARER), break, "Null param"); \
|
||||
(__bEARER)->enb_dl_teid = 0; \
|
||||
(__bEARER)->enb_dl_addr = 0; \
|
||||
(__bEARER)->enb_ul_teid = 0; \
|
||||
(__bEARER)->enb_ul_addr = 0; \
|
||||
(__bEARER)->sgw_dl_teid = 0; \
|
||||
(__bEARER)->sgw_dl_addr = 0; \
|
||||
(__bEARER)->sgw_ul_teid = 0; \
|
||||
(__bEARER)->sgw_ul_addr = 0; \
|
||||
} while(0)
|
||||
typedef struct _mme_bearer_t {
|
||||
lnode_t node; /* A node of list_t */
|
||||
|
@ -401,22 +396,22 @@ typedef struct _mme_bearer_t {
|
|||
c_uint8_t ebi; /* EPS Bearer ID */
|
||||
|
||||
c_uint32_t enb_s1u_teid;
|
||||
c_uint32_t enb_s1u_addr;
|
||||
ip_t enb_s1u_ip;
|
||||
c_uint32_t sgw_s1u_teid;
|
||||
c_uint32_t sgw_s1u_addr;
|
||||
|
||||
c_uint32_t target_s1u_teid; /* Target S1U TEID from HO-Req-Ack */
|
||||
c_uint32_t target_s1u_addr; /* Target S1U ADDR from HO-Req-Ack */
|
||||
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 */
|
||||
|
||||
c_uint32_t enb_dl_teid;
|
||||
c_uint32_t enb_dl_addr;
|
||||
ip_t enb_dl_ip;
|
||||
c_uint32_t enb_ul_teid;
|
||||
c_uint32_t enb_ul_addr;
|
||||
ip_t enb_ul_ip;
|
||||
|
||||
c_uint32_t sgw_dl_teid;
|
||||
c_uint32_t sgw_dl_addr;
|
||||
ip_t sgw_dl_ip;
|
||||
c_uint32_t sgw_ul_teid;
|
||||
c_uint32_t sgw_ul_addr;
|
||||
ip_t sgw_ul_ip;
|
||||
|
||||
qos_t qos;
|
||||
tlv_octet_t tft; /* Saved TFT */
|
||||
|
|
|
@ -177,6 +177,7 @@ status_t mme_s11_build_modify_bearer_request(pkbuf_t **pkbuf,
|
|||
gtp_modify_bearer_request_t *req = >p_message.modify_bearer_request;
|
||||
|
||||
gtp_f_teid_t enb_s1u_teid;
|
||||
int len;
|
||||
gtp_uli_t uli;
|
||||
char uli_buf[GTP_MAX_ULI_LEN];
|
||||
|
||||
|
@ -195,14 +196,13 @@ status_t mme_s11_build_modify_bearer_request(pkbuf_t **pkbuf,
|
|||
|
||||
/* Data Plane(DL) : ENB-S1U */
|
||||
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.addr = bearer->enb_s1u_addr;
|
||||
enb_s1u_teid.teid = htonl(bearer->enb_s1u_teid);
|
||||
rv = gtp_ip_to_f_teid(&bearer->enb_s1u_ip, &enb_s1u_teid, &len);
|
||||
d_assert(rv == CORE_OK, return CORE_ERROR,);
|
||||
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;
|
||||
req->bearer_contexts_to_be_modified.s1_u_enodeb_f_teid.len =
|
||||
GTP_F_TEID_IPV4_LEN;
|
||||
req->bearer_contexts_to_be_modified.s1_u_enodeb_f_teid.len = len;
|
||||
|
||||
if (uli_presence)
|
||||
{
|
||||
|
@ -284,6 +284,7 @@ status_t mme_s11_build_create_bearer_response(
|
|||
|
||||
gtp_cause_t cause;
|
||||
gtp_f_teid_t enb_s1u_teid, sgw_s1u_teid;
|
||||
int len;
|
||||
gtp_uli_t uli;
|
||||
char uli_buf[GTP_MAX_ULI_LEN];
|
||||
|
||||
|
@ -309,13 +310,13 @@ status_t mme_s11_build_create_bearer_response(
|
|||
|
||||
/* Data Plane(DL) : ENB-S1U */
|
||||
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.addr = bearer->enb_s1u_addr;
|
||||
enb_s1u_teid.teid = htonl(bearer->enb_s1u_teid);
|
||||
rv = gtp_ip_to_f_teid(&bearer->enb_s1u_ip, &enb_s1u_teid, &len);
|
||||
d_assert(rv == CORE_OK, return CORE_ERROR,);
|
||||
rsp->bearer_contexts.s1_u_enodeb_f_teid.presence = 1;
|
||||
rsp->bearer_contexts.s1_u_enodeb_f_teid.data = &enb_s1u_teid;
|
||||
rsp->bearer_contexts.s1_u_enodeb_f_teid.len = GTP_F_TEID_IPV4_LEN;
|
||||
rsp->bearer_contexts.s1_u_enodeb_f_teid.len = len;
|
||||
|
||||
/* Data Plane(UL) : SGW-S1U */
|
||||
memset(&sgw_s1u_teid, 0, sizeof(gtp_f_teid_t));
|
||||
|
@ -415,6 +416,7 @@ status_t mme_s11_build_create_indirect_data_forwarding_tunnel_request(
|
|||
tlv_bearer_context_t *bearers[GTP_MAX_NUM_OF_INDIRECT_TUNNEL];
|
||||
gtp_f_teid_t dl_teid[GTP_MAX_NUM_OF_INDIRECT_TUNNEL];
|
||||
gtp_f_teid_t ul_teid[GTP_MAX_NUM_OF_INDIRECT_TUNNEL];
|
||||
int len;
|
||||
|
||||
d_assert(mme_ue, return CORE_ERROR, "Null param");
|
||||
|
||||
|
@ -431,29 +433,29 @@ status_t mme_s11_build_create_indirect_data_forwarding_tunnel_request(
|
|||
if (MME_HAVE_ENB_DL_INDIRECT_TUNNEL(bearer))
|
||||
{
|
||||
memset(&dl_teid[i], 0, sizeof(gtp_f_teid_t));
|
||||
dl_teid[i].ipv4 = 1;
|
||||
dl_teid[i].interface_type =
|
||||
GTP_F_TEID_ENODEB_GTP_U_FOR_DL_DATA_FORWARDING;
|
||||
dl_teid[i].addr = bearer->enb_dl_addr;
|
||||
dl_teid[i].teid = htonl(bearer->enb_dl_teid);
|
||||
rv = gtp_ip_to_f_teid(&bearer->enb_dl_ip, &dl_teid[i], &len);
|
||||
d_assert(rv == CORE_OK, return CORE_ERROR,);
|
||||
d_assert(bearers[i], return CORE_ERROR,);
|
||||
bearers[i]->s1_u_enodeb_f_teid.presence = 1;
|
||||
bearers[i]->s1_u_enodeb_f_teid.data = &dl_teid[i];
|
||||
bearers[i]->s1_u_enodeb_f_teid.len = GTP_F_TEID_IPV4_LEN;
|
||||
bearers[i]->s1_u_enodeb_f_teid.len = len;
|
||||
}
|
||||
|
||||
if (MME_HAVE_ENB_UL_INDIRECT_TUNNEL(bearer))
|
||||
{
|
||||
memset(&ul_teid[i], 0, sizeof(gtp_f_teid_t));
|
||||
ul_teid[i].ipv4 = 1;
|
||||
ul_teid[i].interface_type =
|
||||
GTP_F_TEID_ENODEB_GTP_U_FOR_UL_DATA_FORWARDING;
|
||||
ul_teid[i].addr = bearer->enb_ul_addr;
|
||||
ul_teid[i].teid = htonl(bearer->enb_ul_teid);
|
||||
rv = gtp_ip_to_f_teid(&bearer->enb_ul_ip, &ul_teid[i], &len);
|
||||
d_assert(rv == CORE_OK, return CORE_ERROR,);
|
||||
d_assert(bearers[i], return CORE_ERROR,);
|
||||
bearers[i]->s12_rnc_f_teid.presence = 1;
|
||||
bearers[i]->s12_rnc_f_teid.data = &ul_teid[i];
|
||||
bearers[i]->s12_rnc_f_teid.len = GTP_F_TEID_IPV4_LEN;
|
||||
bearers[i]->s12_rnc_f_teid.len = len;
|
||||
}
|
||||
|
||||
if (MME_HAVE_ENB_DL_INDIRECT_TUNNEL(bearer) ||
|
||||
|
|
|
@ -401,7 +401,8 @@ 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->addr;
|
||||
rv = gtp_f_teid_to_ip(teid, &bearer->sgw_dl_ip);
|
||||
d_assert(rv == CORE_OK, return,);
|
||||
}
|
||||
if (bearers[i]->s2b_u_epdg_f_teid_5.presence)
|
||||
{
|
||||
|
@ -409,7 +410,8 @@ 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->addr;
|
||||
rv = gtp_f_teid_to_ip(teid, &bearer->sgw_ul_ip);
|
||||
d_assert(rv == CORE_OK, return,);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -670,6 +670,7 @@ status_t s1ap_build_path_switch_failure(pkbuf_t **s1apbuf,
|
|||
|
||||
status_t s1ap_build_handover_command(pkbuf_t **s1apbuf, enb_ue_t *source_ue)
|
||||
{
|
||||
status_t rv;
|
||||
char buf[CORE_ADDRSTRLEN];
|
||||
|
||||
int encoded;
|
||||
|
@ -709,12 +710,9 @@ status_t s1ap_build_handover_command(pkbuf_t **s1apbuf, enb_ue_t *source_ue)
|
|||
e_rab->dL_transportLayerAddress =
|
||||
(S1ap_TransportLayerAddress_t *)
|
||||
core_calloc(1, sizeof(S1ap_TransportLayerAddress_t));
|
||||
e_rab->dL_transportLayerAddress->size = 4;
|
||||
e_rab->dL_transportLayerAddress->buf = core_calloc(
|
||||
e_rab->dL_transportLayerAddress->size, sizeof(c_uint8_t));
|
||||
memcpy(e_rab->dL_transportLayerAddress->buf,
|
||||
&bearer->sgw_dl_addr,
|
||||
e_rab->dL_transportLayerAddress->size);
|
||||
rv = s1ap_ip_to_BIT_STRING(
|
||||
&bearer->sgw_dl_ip, e_rab->dL_transportLayerAddress);
|
||||
d_assert(rv == CORE_OK, return CORE_ERROR,);
|
||||
|
||||
e_rab->dL_gTP_TEID = (S1ap_GTP_TEID_t *)
|
||||
core_calloc(1, sizeof(S1ap_GTP_TEID_t));
|
||||
|
@ -727,13 +725,9 @@ status_t s1ap_build_handover_command(pkbuf_t **s1apbuf, enb_ue_t *source_ue)
|
|||
e_rab->uL_S1ap_TransportLayerAddress =
|
||||
(S1ap_TransportLayerAddress_t *)
|
||||
core_calloc(1, sizeof(S1ap_TransportLayerAddress_t));
|
||||
e_rab->uL_S1ap_TransportLayerAddress->size = 4;
|
||||
e_rab->uL_S1ap_TransportLayerAddress->buf = core_calloc(
|
||||
e_rab->uL_S1ap_TransportLayerAddress->size,
|
||||
sizeof(c_uint8_t));
|
||||
memcpy(e_rab->uL_S1ap_TransportLayerAddress->buf,
|
||||
&bearer->sgw_ul_addr,
|
||||
e_rab->uL_S1ap_TransportLayerAddress->size);
|
||||
rv = s1ap_ip_to_BIT_STRING(
|
||||
&bearer->sgw_ul_ip, e_rab->uL_S1ap_TransportLayerAddress);
|
||||
d_assert(rv == CORE_OK, return CORE_ERROR,);
|
||||
|
||||
e_rab->uL_S1ap_GTP_TEID = (S1ap_GTP_TEID_t *)
|
||||
core_calloc(1, sizeof(S1ap_GTP_TEID_t));
|
||||
|
|
|
@ -145,23 +145,22 @@ status_t s1ap_ip_to_BIT_STRING(ip_t *ip, BIT_STRING_t *bit_string)
|
|||
|
||||
if (ip->ipv4 && ip->ipv6)
|
||||
{
|
||||
ip->ipv4 = 1;
|
||||
ip->ipv6 = 1;
|
||||
bit_string->size = IPV4V6_LEN;
|
||||
bit_string->buf = core_calloc(bit_string->size, sizeof(c_uint8_t));
|
||||
memcpy(bit_string->buf, &ip->both.addr, IPV4_LEN);
|
||||
memcpy(bit_string->buf+IPV4_LEN, &ip->both.addr6, IPV6_LEN);
|
||||
bit_string->size = IPV4V6_LEN;
|
||||
}
|
||||
else if (ip->ipv4)
|
||||
{
|
||||
ip->ipv4 = 1;
|
||||
memcpy(bit_string->buf, &ip->addr, IPV4_LEN);
|
||||
bit_string->size = IPV4_LEN;
|
||||
bit_string->buf = core_calloc(bit_string->size, sizeof(c_uint8_t));
|
||||
memcpy(bit_string->buf, &ip->addr, IPV4_LEN);
|
||||
}
|
||||
else if (ip->ipv6)
|
||||
{
|
||||
ip->ipv6 = 1;
|
||||
memcpy(bit_string->buf, &ip->addr6, IPV6_LEN);
|
||||
bit_string->size = IPV6_LEN;
|
||||
bit_string->buf = core_calloc(bit_string->size, sizeof(c_uint8_t));
|
||||
memcpy(bit_string->buf, &ip->addr6, IPV6_LEN);
|
||||
}
|
||||
else
|
||||
d_assert(0, return CORE_ERROR,);
|
||||
|
|
|
@ -289,8 +289,9 @@ void s1ap_handle_initial_context_setup_response(
|
|||
memcpy(&bearer->enb_s1u_teid, e_rab->gTP_TEID.buf,
|
||||
sizeof(bearer->enb_s1u_teid));
|
||||
bearer->enb_s1u_teid = ntohl(bearer->enb_s1u_teid);
|
||||
memcpy(&bearer->enb_s1u_addr, e_rab->transportLayerAddress.buf,
|
||||
sizeof(bearer->enb_s1u_addr));
|
||||
rv = s1ap_BIT_STRING_to_ip(
|
||||
&e_rab->transportLayerAddress, &bearer->enb_s1u_ip);
|
||||
d_assert(rv == CORE_OK, return,);
|
||||
|
||||
if (FSM_CHECK(&bearer->sm, esm_state_active))
|
||||
{
|
||||
|
@ -308,6 +309,7 @@ void s1ap_handle_initial_context_setup_response(
|
|||
void s1ap_handle_e_rab_setup_response(
|
||||
mme_enb_t *enb, s1ap_message_t *message)
|
||||
{
|
||||
status_t rv;
|
||||
char buf[CORE_ADDRSTRLEN];
|
||||
int i;
|
||||
|
||||
|
@ -347,8 +349,9 @@ void s1ap_handle_e_rab_setup_response(
|
|||
memcpy(&bearer->enb_s1u_teid, e_rab->gTP_TEID.buf,
|
||||
sizeof(bearer->enb_s1u_teid));
|
||||
bearer->enb_s1u_teid = ntohl(bearer->enb_s1u_teid);
|
||||
memcpy(&bearer->enb_s1u_addr, e_rab->transportLayerAddress.buf,
|
||||
sizeof(bearer->enb_s1u_addr));
|
||||
rv = s1ap_BIT_STRING_to_ip(
|
||||
&e_rab->transportLayerAddress, &bearer->enb_s1u_ip);
|
||||
d_assert(rv == CORE_OK, return,);
|
||||
|
||||
if (FSM_CHECK(&bearer->sm, esm_state_active))
|
||||
{
|
||||
|
@ -661,8 +664,9 @@ void s1ap_handle_path_switch_request(
|
|||
memcpy(&bearer->enb_s1u_teid, e_rab->gTP_TEID.buf,
|
||||
sizeof(bearer->enb_s1u_teid));
|
||||
bearer->enb_s1u_teid = ntohl(bearer->enb_s1u_teid);
|
||||
memcpy(&bearer->enb_s1u_addr, e_rab->transportLayerAddress.buf,
|
||||
sizeof(bearer->enb_s1u_addr));
|
||||
rv = s1ap_BIT_STRING_to_ip(
|
||||
&e_rab->transportLayerAddress, &bearer->enb_s1u_ip);
|
||||
d_assert(rv == CORE_OK, return,);
|
||||
|
||||
GTP_COUNTER_INCREMENT(
|
||||
mme_ue, GTP_COUNTER_MODIFY_BEARER_BY_PATH_SWITCH);
|
||||
|
@ -776,8 +780,9 @@ void s1ap_handle_handover_request_ack(mme_enb_t *enb, s1ap_message_t *message)
|
|||
memcpy(&bearer->target_s1u_teid, e_rab->gTP_TEID.buf,
|
||||
sizeof(bearer->target_s1u_teid));
|
||||
bearer->target_s1u_teid = ntohl(bearer->target_s1u_teid);
|
||||
memcpy(&bearer->target_s1u_addr, e_rab->transportLayerAddress.buf,
|
||||
sizeof(bearer->target_s1u_addr));
|
||||
rv = s1ap_BIT_STRING_to_ip(
|
||||
&e_rab->transportLayerAddress, &bearer->target_s1u_ip);
|
||||
d_assert(rv == CORE_OK, return,);
|
||||
|
||||
if (e_rab->dL_transportLayerAddress && e_rab->dL_gTP_TEID)
|
||||
{
|
||||
|
@ -786,8 +791,9 @@ void s1ap_handle_handover_request_ack(mme_enb_t *enb, s1ap_message_t *message)
|
|||
memcpy(&bearer->enb_dl_teid, e_rab->dL_gTP_TEID->buf,
|
||||
sizeof(bearer->enb_dl_teid));
|
||||
bearer->enb_dl_teid = ntohl(bearer->enb_dl_teid);
|
||||
memcpy(&bearer->enb_dl_addr, e_rab->dL_transportLayerAddress->buf,
|
||||
sizeof(bearer->enb_dl_addr));
|
||||
rv = s1ap_BIT_STRING_to_ip(
|
||||
e_rab->dL_transportLayerAddress, &bearer->enb_dl_ip);
|
||||
d_assert(rv == CORE_OK, return,);
|
||||
}
|
||||
|
||||
if (e_rab->uL_S1ap_TransportLayerAddress && e_rab->uL_S1ap_GTP_TEID)
|
||||
|
@ -797,9 +803,9 @@ void s1ap_handle_handover_request_ack(mme_enb_t *enb, s1ap_message_t *message)
|
|||
memcpy(&bearer->enb_ul_teid, e_rab->uL_S1ap_GTP_TEID->buf,
|
||||
sizeof(bearer->enb_ul_teid));
|
||||
bearer->enb_ul_teid = ntohl(bearer->enb_ul_teid);
|
||||
memcpy(&bearer->enb_ul_addr,
|
||||
e_rab->uL_S1ap_TransportLayerAddress->buf,
|
||||
sizeof(bearer->enb_ul_addr));
|
||||
rv = s1ap_BIT_STRING_to_ip(
|
||||
e_rab->uL_S1ap_TransportLayerAddress, &bearer->enb_ul_ip);
|
||||
d_assert(rv == CORE_OK, return,);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1004,7 +1010,7 @@ void s1ap_handle_handover_notification(mme_enb_t *enb, s1ap_message_t *message)
|
|||
while(bearer)
|
||||
{
|
||||
bearer->enb_s1u_teid = bearer->target_s1u_teid;
|
||||
bearer->enb_s1u_addr = bearer->target_s1u_addr;
|
||||
memcpy(&bearer->enb_s1u_ip, &bearer->target_s1u_ip, sizeof(ip_t));
|
||||
|
||||
GTP_COUNTER_INCREMENT(
|
||||
mme_ue, GTP_COUNTER_MODIFY_BEARER_BY_HANDOVER_NOTIFY);
|
||||
|
|
Loading…
Reference in New Issue