add create indirect data forwarding tunnel response

This commit is contained in:
Sukchan Lee 2017-09-13 20:35:19 +09:00
parent ff7ef740c0
commit 271ba54423
11 changed files with 149 additions and 51 deletions

View File

@ -441,7 +441,6 @@ status_t mme_s11_build_create_indirect_data_forwarding_tunnel_request(
bearers[i]->s1_u_enodeb_f_teid.data = &tunnel_teid[i];
bearers[i]->s1_u_enodeb_f_teid.len = GTP_F_TEID_IPV4_LEN;
i++;
printf("DL\n");
}
if (MME_HAVE_UL_INDIRECT_TUNNEL(bearer))
@ -460,7 +459,6 @@ status_t mme_s11_build_create_indirect_data_forwarding_tunnel_request(
bearers[i]->s12_rnc_f_teid.presence = 1;
bearers[i]->s12_rnc_f_teid.data = &tunnel_teid[i];
bearers[i]->s12_rnc_f_teid.len = GTP_F_TEID_IPV4_LEN;
printf("UL\n");
i++;
}

View File

@ -332,3 +332,9 @@ void mme_s11_handle_downlink_data_notification(
rv = gtp_xact_commit(xact);
d_assert(rv == CORE_OK, return, "xact_commit error");
}
void mme_s11_handle_create_indirect_data_forwarding_tunnel_response(
gtp_xact_t *xact, mme_ue_t *mme_ue,
gtp_create_indirect_data_forwarding_tunnel_response_t *rsp)
{
}

View File

@ -24,6 +24,9 @@ CORE_DECLARE(void) mme_s11_handle_release_access_bearers_response(
CORE_DECLARE(void) mme_s11_handle_downlink_data_notification(
gtp_xact_t *xact, mme_ue_t *mme_ue,
gtp_downlink_data_notification_t *noti);
CORE_DECLARE(void) mme_s11_handle_create_indirect_data_forwarding_tunnel_response(
gtp_xact_t *xact, mme_ue_t *mme_ue,
gtp_create_indirect_data_forwarding_tunnel_response_t *rsp);
#ifdef __cplusplus
}

View File

@ -355,6 +355,11 @@ void mme_state_operational(fsm_t *s, event_t *e)
/* Start T3413 */
tm_start(mme_ue->t3413);
break;
case GTP_CREATE_INDIRECT_DATA_FORWARDING_TUNNEL_RESPONSE_TYPE:
mme_s11_handle_create_indirect_data_forwarding_tunnel_response(
xact, mme_ue,
&message.create_indirect_data_forwarding_tunnel_response);
break;
default:
d_warn("Not implmeneted(type:%d)", message.h.type);
break;

View File

@ -724,7 +724,7 @@ sgw_bearer_t* sgw_bearer_add(sgw_sess_t *sess)
list_init(&bearer->tunnel_list);
tunnel = sgw_tunnel_add(bearer, GTP_F_TEID_S1_U_ENODEB_GTP_U);
tunnel = sgw_tunnel_add(bearer, GTP_F_TEID_S1_U_SGW_GTP_U);
d_assert(tunnel, return NULL, "Tunnel context allocation failed");
return bearer;
@ -905,7 +905,7 @@ sgw_tunnel_t* sgw_direct_tunnel_in_bearer(sgw_bearer_t *bearer)
tunnel = sgw_tunnel_first(bearer);
while(tunnel)
{
if (tunnel->interface_type == GTP_F_TEID_S1_U_ENODEB_GTP_U)
if (tunnel->interface_type == GTP_F_TEID_S1_U_SGW_GTP_U)
{
return tunnel;
}
@ -916,44 +916,6 @@ sgw_tunnel_t* sgw_direct_tunnel_in_bearer(sgw_bearer_t *bearer)
return NULL;
}
sgw_tunnel_t* sgw_dl_indirect_tunnel_in_bearer(sgw_bearer_t *bearer)
{
sgw_tunnel_t *tunnel = NULL;
d_assert(bearer, return NULL, "Null param");
tunnel = sgw_tunnel_first(bearer);
while (tunnel)
{
if (tunnel->interface_type ==
GTP_F_TEID_ENODEB_GTP_U_FOR_DL_DATA_FORWARDING)
return tunnel;
tunnel = sgw_tunnel_next(tunnel);
}
return NULL;
}
sgw_tunnel_t* sgw_ul_indirect_tunnel_in_bearer(sgw_bearer_t *bearer)
{
sgw_tunnel_t *tunnel = NULL;
d_assert(bearer, return NULL, "Null param");
tunnel = sgw_tunnel_first(bearer);
while (tunnel)
{
if (tunnel->interface_type ==
GTP_F_TEID_ENODEB_GTP_U_FOR_UL_DATA_FORWARDING)
return tunnel;
tunnel = sgw_tunnel_next(tunnel);
}
return NULL;
}
sgw_tunnel_t* sgw_tunnel_first(sgw_bearer_t *bearer)
{
d_assert(bearer, return NULL, "Null param");

View File

@ -223,10 +223,6 @@ CORE_DECLARE(status_t) sgw_tunnel_remove_all(sgw_bearer_t *bearer);
CORE_DECLARE(sgw_tunnel_t*) sgw_tunnel_find(index_t index);
CORE_DECLARE(sgw_tunnel_t*) sgw_tunnel_find_by_teid(c_uint32_t teid);
CORE_DECLARE(sgw_tunnel_t*) sgw_direct_tunnel_in_bearer(sgw_bearer_t *bearer);
CORE_DECLARE(sgw_tunnel_t*) sgw_dl_indirect_tunnel_in_bearer(
sgw_bearer_t *bearer);
CORE_DECLARE(sgw_tunnel_t*) sgw_ul_indirect_tunnel_in_bearer(
sgw_bearer_t *bearer);
CORE_DECLARE(sgw_tunnel_t*) sgw_tunnel_first(sgw_bearer_t *bearer);
CORE_DECLARE(sgw_tunnel_t*) sgw_tunnel_next(sgw_tunnel_t *tunnel);

View File

@ -271,13 +271,13 @@ static int _gtpv1_s1u_recv_cb(net_sock_t *sock, void *data)
gnode.addr = tunnel->remote_addr;
gnode.port = GTPV1_U_UDP_PORT;
if (tunnel->interface_type == GTP_F_TEID_S1_U_ENODEB_GTP_U)
if (tunnel->interface_type == GTP_F_TEID_S1_U_SGW_GTP_U)
gnode.sock = sgw_self()->s5u_sock;
else if (tunnel->interface_type ==
GTP_F_TEID_ENODEB_GTP_U_FOR_DL_DATA_FORWARDING)
GTP_F_TEID_SGW_GTP_U_FOR_DL_DATA_FORWARDING)
gnode.sock = sgw_self()->s1u_sock;
else if (tunnel->interface_type ==
GTP_F_TEID_ENODEB_GTP_U_FOR_UL_DATA_FORWARDING)
GTP_F_TEID_SGW_GTP_U_FOR_UL_DATA_FORWARDING)
gnode.sock = sgw_self()->s1u_sock;
else
d_assert(0, return -1, "Invalid type(%d)",

View File

@ -4,6 +4,7 @@
#include "core_lib.h"
#include "gtp_types.h"
#include "gtp_conv.h"
#include "sgw_event.h"
#include "sgw_context.h"
@ -521,3 +522,120 @@ void sgw_s11_handle_downlink_data_notification_ack(sgw_ue_t *sgw_ue,
d_trace(3, "[GTP] Downlink Data Notification Ack: "
"MME[%d] --> SGW[%d]\n", sgw_ue->mme_s11_teid, sgw_ue->sgw_s11_teid);
}
void sgw_s11_handle_create_indirect_data_forwarding_tunnel_request(
gtp_xact_t *s11_xact, sgw_ue_t *sgw_ue,
gtp_create_indirect_data_forwarding_tunnel_request_t *req)
{
status_t rv;
gtp_create_indirect_data_forwarding_tunnel_response_t *rsp = NULL;
pkbuf_t *pkbuf = NULL;
gtp_message_t gtp_message;
int i;
sgw_bearer_t *bearer = NULL;
sgw_tunnel_t *tunnel = NULL;
gtp_cause_t cause;
tlv_bearer_context_t *req_bearers[GTP_MAX_NUM_OF_INDIRECT_TUNNEL];
tlv_bearer_context_t *rsp_bearers[GTP_MAX_NUM_OF_INDIRECT_TUNNEL];
gtp_f_teid_t *req_teid = NULL;
gtp_f_teid_t rsp_teid[GTP_MAX_NUM_OF_INDIRECT_TUNNEL];
d_assert(sgw_ue, return, "Null param");
d_assert(s11_xact, return, "Null param");
d_assert(req, return, "Null param");
rsp = &gtp_message.create_indirect_data_forwarding_tunnel_response;
memset(&gtp_message, 0, sizeof(gtp_message_t));
gtp_bearers_in_create_indirect_tunnel_request(&req_bearers, req);
gtp_bearers_in_create_indirect_tunnel_response(&rsp_bearers, rsp);
memset(&cause, 0, sizeof(cause));
cause.value = GTP_CAUSE_REQUEST_ACCEPTED;
rsp->cause.presence = 1;
rsp->cause.data = &cause;
rsp->cause.len = sizeof(cause);
for (i = 0; req_bearers[i]->presence; i++)
{
if (req_bearers[i]->eps_bearer_id.presence == 0)
{
d_error("No EBI");
}
bearer = sgw_bearer_find_by_ue_ebi(sgw_ue,
req_bearers[i]->eps_bearer_id.u8);
d_assert(bearer, return, "No Bearer Context");
if (req_bearers[i]->s1_u_enodeb_f_teid.presence)
{
req_teid = req_bearers[i]->s1_u_enodeb_f_teid.data;
d_assert(req_teid, return,);
tunnel = sgw_tunnel_add(bearer,
GTP_F_TEID_SGW_GTP_U_FOR_DL_DATA_FORWARDING);
d_assert(tunnel, return, "No Tunnel Context");
}
else if (req_bearers[i]->s12_rnc_f_teid.presence)
{
req_teid = req_bearers[i]->s12_rnc_f_teid.data;
d_assert(req_teid, return,);
tunnel = sgw_tunnel_add(bearer,
GTP_F_TEID_SGW_GTP_U_FOR_UL_DATA_FORWARDING);
d_assert(tunnel, return, "No Tunnel Context");
}
else
d_assert(0, return, "Not Supported");
tunnel->remote_teid = ntohl(req_teid->teid);
tunnel->remote_addr = req_teid->ipv4_addr;
d_assert(rsp_bearers[i], return,);
rsp_bearers[i]->presence = 1;
rsp_bearers[i]->eps_bearer_id.presence = 1;
rsp_bearers[i]->eps_bearer_id.u8 = bearer->ebi;
memset(&rsp_teid[i], 0, sizeof(gtp_f_teid_t));
rsp_teid[i].ipv4 = 1;
rsp_teid[i].ipv4_addr = tunnel->local_addr;
rsp_teid[i].teid = htonl(tunnel->local_teid);
rsp_teid[i].interface_type = tunnel->interface_type;
if (tunnel->interface_type ==
GTP_F_TEID_SGW_GTP_U_FOR_DL_DATA_FORWARDING)
{
rsp_bearers[i]->s4_u_sgsn_f_teid.presence = 1;
rsp_bearers[i]->s4_u_sgsn_f_teid.data = &rsp_teid[i];
rsp_bearers[i]->s4_u_sgsn_f_teid.len = GTP_F_TEID_IPV4_LEN;
}
else if (tunnel->interface_type ==
GTP_F_TEID_SGW_GTP_U_FOR_UL_DATA_FORWARDING)
{
rsp_bearers[i]->s2b_u_epdg_f_teid_5.presence = 1;
rsp_bearers[i]->s2b_u_epdg_f_teid_5.data = &rsp_teid[i];
rsp_bearers[i]->s2b_u_epdg_f_teid_5.len = GTP_F_TEID_IPV4_LEN;
}
}
gtp_message.h.type =
GTP_CREATE_INDIRECT_DATA_FORWARDING_TUNNEL_RESPONSE_TYPE;
gtp_message.h.teid = sgw_ue->mme_s11_teid;
rv = gtp_build_msg(&pkbuf, &gtp_message);
d_assert(rv == CORE_OK, return, "gtp build failed");
rv = gtp_xact_update_tx(s11_xact, &gtp_message.h, pkbuf);
d_assert(rv == CORE_OK, return, "gtp_xact_update_tx error");
rv = gtp_xact_commit(s11_xact);
d_assert(rv == CORE_OK, return, "xact_commit error");
d_trace(3, "[GTP] Create Indirect Data Forwarding Tunnel Response : "
"MME[%d] --> SGW[%d]\n", sgw_ue->mme_s11_teid, sgw_ue->sgw_s11_teid);
}

View File

@ -24,6 +24,10 @@ CORE_DECLARE(void) sgw_s11_handle_release_access_bearers_request(
CORE_DECLARE(void) sgw_s11_handle_lo_dldata_notification(sgw_bearer_t *bearer);
CORE_DECLARE(void) sgw_s11_handle_downlink_data_notification_ack(
sgw_ue_t *sgw_ue, gtp_downlink_data_notification_acknowledge_t *ack);
CORE_DECLARE(void) sgw_s11_handle_create_indirect_data_forwarding_tunnel_request(
gtp_xact_t *s11_xact, sgw_ue_t *sgw_ue,
gtp_create_indirect_data_forwarding_tunnel_request_t *req);
#ifdef __cplusplus
}
#endif /* __cplusplus */

View File

@ -93,7 +93,7 @@ void sgw_s5c_handle_create_session_response(gtp_xact_t *s5c_xact,
/* Send 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.interface_type = tunnel->interface_type;
sgw_s1u_teid.ipv4_addr = tunnel->local_addr;
sgw_s1u_teid.teid = htonl(tunnel->local_teid);
rsp->bearer_contexts_created.s1_u_enodeb_f_teid.presence = 1;
@ -242,7 +242,7 @@ void sgw_s5c_handle_create_bearer_request(gtp_xact_t *s5c_xact,
/* Send 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.interface_type = tunnel->interface_type;
sgw_s1u_teid.ipv4_addr = tunnel->local_addr;
sgw_s1u_teid.teid = htonl(tunnel->local_teid);
req->bearer_contexts.s1_u_enodeb_f_teid.presence = 1;

View File

@ -101,6 +101,12 @@ void sgw_state_operational(fsm_t *s, event_t *e)
sgw_s11_handle_downlink_data_notification_ack(sgw_ue,
&message.downlink_data_notification_acknowledge);
break;
case GTP_CREATE_INDIRECT_DATA_FORWARDING_TUNNEL_REQUEST_TYPE:
sgw_s11_handle_create_indirect_data_forwarding_tunnel_request(
xact, sgw_ue,
&message.
create_indirect_data_forwarding_tunnel_request);
break;
default:
d_warn("Not implmeneted(type:%d)", message.h.type);
break;