Update downlink data notification

This commit is contained in:
James Park 2017-08-02 17:32:50 -07:00
parent 55c3d5e92e
commit 420953fa32
11 changed files with 39 additions and 11 deletions

View File

@ -313,6 +313,7 @@ static gtp_xact_t *gtp_xact_find(
case GTP_RELEASE_ACCESS_BEARERS_REQUEST_TYPE:
case GTP_CREATE_INDIRECT_DATA_FORWARDING_TUNNEL_REQUEST_TYPE:
case GTP_DELETE_INDIRECT_DATA_FORWARDING_TUNNEL_REQUEST_TYPE:
case GTP_DOWNLINK_DATA_NOTIFICATION_ACKNOWLEDGE_TYPE:
xact = list_first(&gnode->remote_list);
break;
@ -325,6 +326,7 @@ static gtp_xact_t *gtp_xact_find(
case GTP_RELEASE_ACCESS_BEARERS_RESPONSE_TYPE:
case GTP_CREATE_INDIRECT_DATA_FORWARDING_TUNNEL_RESPONSE_TYPE:
case GTP_DELETE_INDIRECT_DATA_FORWARDING_TUNNEL_RESPONSE_TYPE:
case GTP_DOWNLINK_DATA_NOTIFICATION_TYPE:
xact = list_first(&gnode->local_list);
break;

View File

@ -785,13 +785,15 @@ void emm_handle_service_request(
d_assert(emm_send_to_enb(enb_ue, s1apbuf) == CORE_OK,, "s1ap send error");
}
void emm_handle_downlink_data_notification(mme_bearer_t *bearer)
void emm_handle_downlink_data_notification(gtp_xact_t *xact,
mme_bearer_t *bearer)
{
status_t rv;
mme_ue_t *mme_ue = NULL;
mme_sess_t *sess;
pkbuf_t *s11buf = NULL;
d_assert(xact, return, "Null param");
d_assert(bearer, return, "Null param");
mme_ue = bearer->mme_ue;
d_assert(mme_ue, return, "Null param");
@ -803,9 +805,10 @@ void emm_handle_downlink_data_notification(mme_bearer_t *bearer)
rv = mme_s11_build_downlink_data_notification_ack(&s11buf, sess);
d_assert(rv == CORE_OK, return, "S11 build error");
rv = mme_s11_send_to_sgw(bearer->sgw,
GTP_DOWNLINK_DATA_NOTIFICATION_ACKNOWLEDGE_TYPE, sess->sgw_s11_teid,
s11buf);
d_assert(gtp_xact_commit(xact,
GTP_DOWNLINK_DATA_NOTIFICATION_ACKNOWLEDGE_TYPE,
sess->sgw_s11_teid, s11buf) == CORE_OK,
return , "xact commit error");
/* FIXME : Send s1 paging */
}

View File

@ -31,7 +31,8 @@ CORE_DECLARE(void) emm_handle_delete_session_request(mme_ue_t *mme_ue);
CORE_DECLARE(void) emm_handle_delete_session_response(mme_bearer_t *bearer);
CORE_DECLARE(void) emm_handle_service_request(
mme_ue_t *mme_ue, nas_service_request_t *service_request);
CORE_DECLARE(void) emm_handle_downlink_data_notification(mme_bearer_t *bearer);
CORE_DECLARE(void) emm_handle_downlink_data_notification(gtp_xact_t *xact,
mme_bearer_t *bearer);
#ifdef __cplusplus
}

View File

@ -60,8 +60,11 @@ void emm_state_operational(fsm_t *s, event_t *e)
case GTP_DELETE_SESSION_RESPONSE_TYPE:
emm_handle_delete_session_response(bearer);
case GTP_DOWNLINK_DATA_NOTIFICATION_TYPE:
emm_handle_downlink_data_notification(bearer);
{
gtp_xact_t *xact = (gtp_xact_t *)event_get_param3(e);
emm_handle_downlink_data_notification(xact, bearer);
break;
}
}
break;

View File

@ -160,11 +160,13 @@ void mme_s11_handle_release_access_bearers_response(
}
void mme_s11_handle_downlink_data_notification(
mme_sess_t *sess, gtp_downlink_data_notification_t *noti)
gtp_xact_t *xact, mme_sess_t *sess,
gtp_downlink_data_notification_t *noti)
{
event_t e;
mme_bearer_t *bearer = NULL;
d_assert(xact, return, "Null param");
d_assert(sess, return, "Null param");
d_assert(noti, return, "Null param");
@ -177,5 +179,6 @@ void mme_s11_handle_downlink_data_notification(
event_set(&e, MME_EVT_EMM_BEARER_FROM_S11);
event_set_param1(&e, (c_uintptr_t)bearer->index);
event_set_param2(&e, (c_uintptr_t)GTP_DOWNLINK_DATA_NOTIFICATION_TYPE);
event_set_param3(&e, (c_uintptr_t)xact);
mme_event_send(&e);
}

View File

@ -18,7 +18,8 @@ CORE_DECLARE(void) mme_s11_handle_delete_session_response(
CORE_DECLARE(void) mme_s11_handle_release_access_bearers_response(
mme_sess_t *sess, gtp_release_access_bearers_response_t *rsp);
CORE_DECLARE(void) mme_s11_handle_downlink_data_notification(
mme_sess_t *sess, gtp_downlink_data_notification_t *noti);
gtp_xact_t *xact, mme_sess_t *sess,
gtp_downlink_data_notification_t *noti);
#ifdef __cplusplus
}

View File

@ -329,6 +329,7 @@ void mme_state_operational(fsm_t *s, event_t *e)
case GTP_DOWNLINK_DATA_NOTIFICATION_TYPE:
mme_s11_handle_downlink_data_notification(
xact,
sess, &gtp_message.downlink_data_notification);
break;
default:

View File

@ -407,3 +407,10 @@ void sgw_handle_lo_dldata_notification(sgw_bearer_t *bearer)
d_trace(3, "[GTP] Downlink Data Notification : "
"SGW[%d] --> MME[%d]\n", sess->sgw_s11_teid, sess->mme_s11_teid);
}
void sgw_handle_downlink_data_notification_ack(sgw_sess_t *sess,
gtp_downlink_data_notification_acknowledge_t *ack)
{
d_trace(3, "[GTP] Downlink Data Notification Ack: "
"MME[%d] --> SGW[%d]\n", sess->mme_s11_teid, sess->sgw_s11_teid);
}

View File

@ -27,6 +27,9 @@ CORE_DECLARE(void) sgw_handle_release_access_bearers_request(gtp_xact_t *xact,
sgw_sess_t *sess, gtp_release_access_bearers_request_t *req);
CORE_DECLARE(void) sgw_handle_lo_dldata_notification(sgw_bearer_t *bearer);
CORE_DECLARE(void) sgw_handle_downlink_data_notification_ack(sgw_sess_t *sess,
gtp_downlink_data_notification_acknowledge_t *ack);
#ifdef __cplusplus
}
#endif /* __cplusplus */

View File

@ -125,12 +125,12 @@ static int _gtpv1_s5u_recv_cb(net_sock_t *sock, void *data)
* FIXME : Data buffering required
*
*/
if (CHECK_DL_NOTI_SENT(bearer))
if (!CHECK_DL_NOTI_SENT(bearer))
{
event_t e;
status_t rv;
event_set(&e, SGW_EVT_S5C_SESSION_MSG);
event_set(&e, SGW_EVT_LO_DLDATA_NOTI);
event_set_param1(&e, (c_uintptr_t)bearer->index);
rv = sgw_event_send(&e);
if (rv != CORE_OK)

View File

@ -108,7 +108,11 @@ void sgw_state_operational(fsm_t *s, event_t *e)
sgw_handle_release_access_bearers_request(
xact, sess,
&gtp_message.release_access_bearers_request);
break;
case GTP_DOWNLINK_DATA_NOTIFICATION_ACKNOWLEDGE_TYPE:
sgw_handle_downlink_data_notification_ack(
sess,
&gtp_message.downlink_data_notification_acknowledge);
break;
default:
d_warn("Not implmeneted(type:%d)", type);