intermediate

This commit is contained in:
Sukchan Lee 2017-12-07 17:23:45 +09:00
parent 3e05717180
commit ceda682290
6 changed files with 65 additions and 67 deletions

View File

@ -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 */

View File

@ -177,6 +177,7 @@ status_t mme_s11_build_modify_bearer_request(pkbuf_t **pkbuf,
gtp_modify_bearer_request_t *req = &gtp_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) ||

View File

@ -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,);
}
}

View File

@ -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));

View File

@ -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,);

View File

@ -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);