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_RELEASE_ACCESS_BEARERS_REQUEST_TYPE:
case GTP_CREATE_INDIRECT_DATA_FORWARDING_TUNNEL_REQUEST_TYPE: case GTP_CREATE_INDIRECT_DATA_FORWARDING_TUNNEL_REQUEST_TYPE:
case GTP_DELETE_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); xact = list_first(&gnode->remote_list);
break; break;
@ -325,6 +326,7 @@ static gtp_xact_t *gtp_xact_find(
case GTP_RELEASE_ACCESS_BEARERS_RESPONSE_TYPE: case GTP_RELEASE_ACCESS_BEARERS_RESPONSE_TYPE:
case GTP_CREATE_INDIRECT_DATA_FORWARDING_TUNNEL_RESPONSE_TYPE: case GTP_CREATE_INDIRECT_DATA_FORWARDING_TUNNEL_RESPONSE_TYPE:
case GTP_DELETE_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); xact = list_first(&gnode->local_list);
break; 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"); 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; status_t rv;
mme_ue_t *mme_ue = NULL; mme_ue_t *mme_ue = NULL;
mme_sess_t *sess; mme_sess_t *sess;
pkbuf_t *s11buf = NULL; pkbuf_t *s11buf = NULL;
d_assert(xact, return, "Null param");
d_assert(bearer, return, "Null param"); d_assert(bearer, return, "Null param");
mme_ue = bearer->mme_ue; mme_ue = bearer->mme_ue;
d_assert(mme_ue, return, "Null param"); 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); rv = mme_s11_build_downlink_data_notification_ack(&s11buf, sess);
d_assert(rv == CORE_OK, return, "S11 build error"); d_assert(rv == CORE_OK, return, "S11 build error");
rv = mme_s11_send_to_sgw(bearer->sgw, d_assert(gtp_xact_commit(xact,
GTP_DOWNLINK_DATA_NOTIFICATION_ACKNOWLEDGE_TYPE, sess->sgw_s11_teid, GTP_DOWNLINK_DATA_NOTIFICATION_ACKNOWLEDGE_TYPE,
s11buf); sess->sgw_s11_teid, s11buf) == CORE_OK,
return , "xact commit error");
/* FIXME : Send s1 paging */ /* 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_delete_session_response(mme_bearer_t *bearer);
CORE_DECLARE(void) emm_handle_service_request( CORE_DECLARE(void) emm_handle_service_request(
mme_ue_t *mme_ue, nas_service_request_t *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 #ifdef __cplusplus
} }

View File

@ -60,9 +60,12 @@ void emm_state_operational(fsm_t *s, event_t *e)
case GTP_DELETE_SESSION_RESPONSE_TYPE: case GTP_DELETE_SESSION_RESPONSE_TYPE:
emm_handle_delete_session_response(bearer); emm_handle_delete_session_response(bearer);
case GTP_DOWNLINK_DATA_NOTIFICATION_TYPE: 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;
} }
}
break; break;
} }

View File

@ -160,11 +160,13 @@ void mme_s11_handle_release_access_bearers_response(
} }
void mme_s11_handle_downlink_data_notification( 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; event_t e;
mme_bearer_t *bearer = NULL; mme_bearer_t *bearer = NULL;
d_assert(xact, return, "Null param");
d_assert(sess, return, "Null param"); d_assert(sess, return, "Null param");
d_assert(noti, 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(&e, MME_EVT_EMM_BEARER_FROM_S11);
event_set_param1(&e, (c_uintptr_t)bearer->index); event_set_param1(&e, (c_uintptr_t)bearer->index);
event_set_param2(&e, (c_uintptr_t)GTP_DOWNLINK_DATA_NOTIFICATION_TYPE); event_set_param2(&e, (c_uintptr_t)GTP_DOWNLINK_DATA_NOTIFICATION_TYPE);
event_set_param3(&e, (c_uintptr_t)xact);
mme_event_send(&e); 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( CORE_DECLARE(void) mme_s11_handle_release_access_bearers_response(
mme_sess_t *sess, gtp_release_access_bearers_response_t *rsp); mme_sess_t *sess, gtp_release_access_bearers_response_t *rsp);
CORE_DECLARE(void) mme_s11_handle_downlink_data_notification( 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 #ifdef __cplusplus
} }

View File

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

View File

@ -407,3 +407,10 @@ void sgw_handle_lo_dldata_notification(sgw_bearer_t *bearer)
d_trace(3, "[GTP] Downlink Data Notification : " d_trace(3, "[GTP] Downlink Data Notification : "
"SGW[%d] --> MME[%d]\n", sess->sgw_s11_teid, sess->mme_s11_teid); "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); 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_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 #ifdef __cplusplus
} }
#endif /* __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 * FIXME : Data buffering required
* *
*/ */
if (CHECK_DL_NOTI_SENT(bearer)) if (!CHECK_DL_NOTI_SENT(bearer))
{ {
event_t e; event_t e;
status_t rv; 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); event_set_param1(&e, (c_uintptr_t)bearer->index);
rv = sgw_event_send(&e); rv = sgw_event_send(&e);
if (rv != CORE_OK) 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( sgw_handle_release_access_bearers_request(
xact, sess, xact, sess,
&gtp_message.release_access_bearers_request); &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; break;
default: default:
d_warn("Not implmeneted(type:%d)", type); d_warn("Not implmeneted(type:%d)", type);