From bc180c3ffc431a06a49e0de1af71098fd91d561b Mon Sep 17 00:00:00 2001 From: Sukchan Lee Date: Mon, 6 May 2019 23:13:26 +0900 Subject: [PATCH] Improve sanity check for queue-push fail --- src/mme/mme_event.h | 3 --- src/mme/mme_fd_path.c | 22 ++++++++++++++++++---- src/mme/mme_gtp_path.c | 7 ++++++- src/mme/s1ap_lksctp.c | 38 +++++++++++++++++++++++++++++++++----- src/mme/s1ap_path.c | 16 ++++++++++++++-- src/mme/s1ap_usrsctp.c | 10 +++++----- src/pgw/pgw_event.h | 3 --- src/pgw/pgw_fd_path.c | 24 +++++++++++++++++++----- src/pgw/pgw_gtp_path.c | 7 ++++++- src/sgw/sgw_event.h | 3 --- src/sgw/sgw_gtp_path.c | 17 +++++++++++------ 11 files changed, 112 insertions(+), 38 deletions(-) diff --git a/src/mme/mme_event.h b/src/mme/mme_event.h index 9654ba09eb..18799c13ba 100644 --- a/src/mme/mme_event.h +++ b/src/mme/mme_event.h @@ -68,9 +68,6 @@ void mme_event_free(mme_event_t *e); void mme_event_timeout(void *data); -#define mme_event_send(__ptr_e) \ - ogs_assert(ogs_queue_push(mme_self()->queue, ((__ptr_e))) == OGS_OK) - const char *mme_event_get_name(mme_event_t *e); #ifdef __cplusplus diff --git a/src/mme/mme_fd_path.c b/src/mme/mme_fd_path.c index 5d3f70ca55..afcff859c7 100644 --- a/src/mme/mme_fd_path.c +++ b/src/mme/mme_fd_path.c @@ -383,12 +383,19 @@ static void mme_s6a_aia_cb(void *data, struct msg **msg) out: if (!error) { + int rv; e = mme_event_new(MME_EVT_S6A_MESSAGE); ogs_assert(e); e->mme_ue = mme_ue; e->pkbuf = s6abuf; - mme_event_send(e); - ogs_pollset_notify(mme_self()->pollset); + rv = ogs_queue_push(mme_self()->queue, e); + if (rv != OGS_OK) { + ogs_error("ogs_queue_push() failed:%d", (int)rv); + ogs_pkbuf_free(e->pkbuf); + mme_event_free(e); + } else { + ogs_pollset_notify(mme_self()->pollset); + } } /* Free the message */ @@ -1029,12 +1036,19 @@ static void mme_s6a_ula_cb(void *data, struct msg **msg) if (!error) { + int rv; e = mme_event_new(MME_EVT_S6A_MESSAGE); ogs_assert(e); e->mme_ue = mme_ue; e->pkbuf = s6abuf; - mme_event_send(e); - ogs_pollset_notify(mme_self()->pollset); + rv = ogs_queue_push(mme_self()->queue, e); + if (rv != OGS_OK) { + ogs_error("ogs_queue_push() failed:%d", (int)rv); + ogs_pkbuf_free(e->pkbuf); + mme_event_free(e); + } else { + ogs_pollset_notify(mme_self()->pollset); + } } /* Free the message */ diff --git a/src/mme/mme_gtp_path.c b/src/mme/mme_gtp_path.c index 4baf8f3a98..633c7e7ae2 100644 --- a/src/mme/mme_gtp_path.c +++ b/src/mme/mme_gtp_path.c @@ -25,7 +25,12 @@ static void _gtpv2_c_recv_cb(short when, ogs_socket_t fd, void *data) e = mme_event_new(MME_EVT_S11_MESSAGE); ogs_assert(e); e->pkbuf = pkbuf; - mme_event_send(e); + rv = ogs_queue_push(mme_self()->queue, e); + if (rv != OGS_OK) { + ogs_error("ogs_queue_push() failed:%d", (int)rv); + ogs_pkbuf_free(e->pkbuf); + mme_event_free(e); + } } static ogs_sockaddr_t *pgw_addr_find_by_family(ogs_list_t *list, int family) diff --git a/src/mme/s1ap_lksctp.c b/src/mme/s1ap_lksctp.c index 8ae0060019..cb8405955d 100644 --- a/src/mme/s1ap_lksctp.c +++ b/src/mme/s1ap_lksctp.c @@ -98,6 +98,7 @@ static void accept_handler(short when, ogs_socket_t fd, void *data) new = ogs_sock_accept(sock); if (new) { + int rv; ogs_sockaddr_t *addr = NULL; mme_event_t *e = NULL; @@ -112,7 +113,12 @@ static void accept_handler(short when, ogs_socket_t fd, void *data) ogs_assert(e); e->enb_sock = new; e->enb_addr = addr; - mme_event_send(e); + rv = ogs_queue_push(mme_self()->queue, e); + if (rv != OGS_OK) { + ogs_warn("ogs_queue_push() failed:%d", (int)rv); + ogs_free(e->enb_addr); + mme_event_free(e); + } } else { @@ -122,6 +128,7 @@ static void accept_handler(short when, ogs_socket_t fd, void *data) void s1ap_recv_handler(short when, ogs_socket_t fd, void *data) { + int rv; ogs_pkbuf_t *pkbuf; int size; mme_event_t *e = NULL; @@ -190,7 +197,12 @@ void s1ap_recv_handler(short when, ogs_socket_t fd, void *data) not->sn_assoc_change.sac_inbound_streams; e->outbound_streams = not->sn_assoc_change.sac_outbound_streams; - mme_event_send(e); + rv = ogs_queue_push(mme_self()->queue, e); + if (rv != OGS_OK) { + ogs_warn("ogs_queue_push() failed:%d", (int)rv); + ogs_free(e->enb_addr); + mme_event_free(e); + } } else if (not->sn_assoc_change.sac_state == SCTP_SHUTDOWN_COMP || not->sn_assoc_change.sac_state == SCTP_COMM_LOST) @@ -209,7 +221,12 @@ void s1ap_recv_handler(short when, ogs_socket_t fd, void *data) ogs_assert(e); e->enb_sock = sock; e->enb_addr = addr; - mme_event_send(e); + rv = ogs_queue_push(mme_self()->queue, e); + if (rv != OGS_OK) { + ogs_warn("ogs_queue_push() failed:%d", (int)rv); + ogs_free(e->enb_addr); + mme_event_free(e); + } } break; } @@ -228,7 +245,12 @@ void s1ap_recv_handler(short when, ogs_socket_t fd, void *data) ogs_assert(e); e->enb_sock = sock; e->enb_addr = addr; - mme_event_send(e); + rv = ogs_queue_push(mme_self()->queue, e); + if (rv != OGS_OK) { + ogs_warn("ogs_queue_push() failed:%d", (int)rv); + ogs_free(e->enb_addr); + mme_event_free(e); + } break; } case SCTP_PEER_ADDR_CHANGE: @@ -276,7 +298,13 @@ void s1ap_recv_handler(short when, ogs_socket_t fd, void *data) e->enb_sock = sock; e->enb_addr = addr; e->pkbuf = pkbuf; - mme_event_send(e); + rv = ogs_queue_push(mme_self()->queue, e); + if (rv != OGS_OK) { + ogs_warn("ogs_queue_push() failed:%d", (int)rv); + ogs_free(e->enb_addr); + ogs_pkbuf_free(e->pkbuf); + mme_event_free(e); + } return; } diff --git a/src/mme/s1ap_path.c b/src/mme/s1ap_path.c index 6703b34085..7921ab15c6 100644 --- a/src/mme/s1ap_path.c +++ b/src/mme/s1ap_path.c @@ -127,6 +127,7 @@ int s1ap_delayed_send_to_enb_ue( int s1ap_send_to_esm(mme_ue_t *mme_ue, ogs_pkbuf_t *esmbuf) { + int rv; mme_event_t *e = NULL; ogs_assert(mme_ue); @@ -136,7 +137,12 @@ int s1ap_send_to_esm(mme_ue_t *mme_ue, ogs_pkbuf_t *esmbuf) ogs_assert(e); e->mme_ue = mme_ue; e->pkbuf = esmbuf; - mme_event_send(e); + rv = ogs_queue_push(mme_self()->queue, e); + if (rv != OGS_OK) { + ogs_warn("ogs_queue_push() failed:%d", (int)rv); + ogs_pkbuf_free(e->pkbuf); + mme_event_free(e); + } return OGS_OK; } @@ -207,13 +213,19 @@ int s1ap_send_to_nas(enb_ue_t *enb_ue, ogs_assert(h); if (h->protocol_discriminator == NAS_PROTOCOL_DISCRIMINATOR_EMM) { + int rv; e = mme_event_new(MME_EVT_EMM_MESSAGE); ogs_assert(e); e->enb_ue = enb_ue; e->s1ap_code = procedureCode; e->nas_type = security_header_type.type; e->pkbuf = nasbuf; - mme_event_send(e); + rv = ogs_queue_push(mme_self()->queue, e); + if (rv != OGS_OK) { + ogs_warn("ogs_queue_push() failed:%d", (int)rv); + ogs_pkbuf_free(e->pkbuf); + mme_event_free(e); + } } else if (h->protocol_discriminator == NAS_PROTOCOL_DISCRIMINATOR_ESM) { diff --git a/src/mme/s1ap_usrsctp.c b/src/mme/s1ap_usrsctp.c index 1a007c10ed..184ebe56a9 100644 --- a/src/mme/s1ap_usrsctp.c +++ b/src/mme/s1ap_usrsctp.c @@ -429,7 +429,7 @@ static int s1ap_usrsctp_recv_handler(struct socket *sock, rv = ogs_queue_push(mme_self()->queue, e); if (rv != OGS_OK) { ogs_warn("ogs_queue_push() failed:%d", (int)rv); - ogs_free(addr); + ogs_free(e->enb_addr); mme_event_free(e); } else { ogs_pollset_notify(mme_self()->pollset); @@ -454,7 +454,7 @@ static int s1ap_usrsctp_recv_handler(struct socket *sock, rv = ogs_queue_push(mme_self()->queue, e); if (rv != OGS_OK) { ogs_warn("ogs_queue_push() failed:%d", (int)rv); - ogs_free(addr); + ogs_free(e->enb_addr); mme_event_free(e); } else { ogs_pollset_notify(mme_self()->pollset); @@ -480,7 +480,7 @@ static int s1ap_usrsctp_recv_handler(struct socket *sock, rv = ogs_queue_push(mme_self()->queue, e); if (rv != OGS_OK) { ogs_warn("ogs_queue_push() failed:%d", (int)rv); - ogs_free(addr); + ogs_free(e->enb_addr); mme_event_free(e); } else { ogs_pollset_notify(mme_self()->pollset); @@ -539,8 +539,8 @@ static int s1ap_usrsctp_recv_handler(struct socket *sock, rv = ogs_queue_push(mme_self()->queue, e); if (rv != OGS_OK) { ogs_warn("ogs_queue_push() failed:%d", (int)rv); - ogs_free(addr); - ogs_pkbuf_free(pkbuf); + ogs_free(e->enb_addr); + ogs_pkbuf_free(e->pkbuf); mme_event_free(e); } else { ogs_pollset_notify(mme_self()->pollset); diff --git a/src/pgw/pgw_event.h b/src/pgw/pgw_event.h index 8b7412e34a..bbe2a8b837 100644 --- a/src/pgw/pgw_event.h +++ b/src/pgw/pgw_event.h @@ -32,9 +32,6 @@ void pgw_event_final(void); pgw_event_t *pgw_event_new(pgw_event_e id); void pgw_event_free(pgw_event_t *e); -#define pgw_event_send(__ptr_e) \ - ogs_assert(ogs_queue_push(pgw_self()->queue, ((__ptr_e))) == OGS_OK) - const char *pgw_event_get_name(pgw_event_t *e); #ifdef __cplusplus diff --git a/src/pgw/pgw_fd_path.c b/src/pgw/pgw_fd_path.c index 26076b53eb..58c6bb9d85 100644 --- a/src/pgw/pgw_fd_path.c +++ b/src/pgw/pgw_fd_path.c @@ -712,14 +712,21 @@ out: e->gxbuf = gxbuf; e->xact_index = xact->index; e->gtpbuf = gtpbuf; - pgw_event_send(e); - ogs_pollset_notify(pgw_self()->pollset); + rv = ogs_queue_push(pgw_self()->queue, e); + if (rv != OGS_OK) { + ogs_error("ogs_queue_push() failed:%d", (int)rv); + gx_message_free(gx_message); + ogs_pkbuf_free(e->gxbuf); + ogs_pkbuf_free(e->gtpbuf); + pgw_event_free(e); + } else { + ogs_pollset_notify(pgw_self()->pollset); + } } else { gx_message_free(gx_message); ogs_pkbuf_free(gxbuf); - ogs_pkbuf_free(gtpbuf); } @@ -942,8 +949,15 @@ static int pgw_gx_rar_cb( struct msg **msg, struct avp *avp, e->sess_index = sess->index; e->gxbuf = gxbuf; - pgw_event_send(e); - ogs_pollset_notify(pgw_self()->pollset); + rv = ogs_queue_push(pgw_self()->queue, e); + if (rv != OGS_OK) { + ogs_error("ogs_queue_push() failed:%d", (int)rv); + gx_message_free(gx_message); + ogs_pkbuf_free(e->gxbuf); + pgw_event_free(e); + } else { + ogs_pollset_notify(pgw_self()->pollset); + } /* Set the Auth-Application-Id AVP */ ret = fd_msg_avp_new(fd_auth_application_id, 0, &avp); diff --git a/src/pgw/pgw_gtp_path.c b/src/pgw/pgw_gtp_path.c index 292947ace3..9884e0b8b6 100644 --- a/src/pgw/pgw_gtp_path.c +++ b/src/pgw/pgw_gtp_path.c @@ -94,7 +94,12 @@ static void _gtpv2_c_recv_cb(short when, ogs_socket_t fd, void *data) ogs_assert(e); e->gtpbuf = pkbuf; - pgw_event_send(e); + rv = ogs_queue_push(pgw_self()->queue, e); + if (rv != OGS_OK) { + ogs_error("ogs_queue_push() failed:%d", (int)rv); + ogs_pkbuf_free(e->gtpbuf); + pgw_event_free(e); + } } static void _gtpv1_u_recv_cb(short when, ogs_socket_t fd, void *data) diff --git a/src/sgw/sgw_event.h b/src/sgw/sgw_event.h index 8200801ff8..2edf6427a0 100644 --- a/src/sgw/sgw_event.h +++ b/src/sgw/sgw_event.h @@ -32,9 +32,6 @@ void sgw_event_final(void); sgw_event_t *sgw_event_new(sgw_event_e id); void sgw_event_free(sgw_event_t *e); -#define sgw_event_send(__ptr_e) \ - ogs_assert(ogs_queue_push(sgw_self()->queue, ((__ptr_e))) == OGS_OK) - const char *sgw_event_get_name(sgw_event_t *e); #ifdef __cplusplus diff --git a/src/sgw/sgw_gtp_path.c b/src/sgw/sgw_gtp_path.c index 1425d4a08f..9074eb3768 100644 --- a/src/sgw/sgw_gtp_path.c +++ b/src/sgw/sgw_gtp_path.c @@ -29,17 +29,18 @@ static void _gtpv2_c_recv_cb(short when, ogs_socket_t fd, void *data) teid = ntohl(gtp_h->teid); if (SGW_S5C_TEID(teid)) - { e = sgw_event_new(SGW_EVT_S5C_MESSAGE); - } else - { e = sgw_event_new(SGW_EVT_S11_MESSAGE); - } ogs_assert(e); e->pkbuf = pkbuf; - sgw_event_send(e); + rv = ogs_queue_push(sgw_self()->queue, e); + if (rv != OGS_OK) { + ogs_error("ogs_queue_push() failed:%d", (int)rv); + ogs_pkbuf_free(e->pkbuf); + sgw_event_free(e); + } } static void _gtpv1_u_recv_cb(short when, ogs_socket_t fd, void *data) @@ -206,7 +207,11 @@ static void _gtpv1_u_recv_cb(short when, ogs_socket_t fd, void *data) e = sgw_event_new(SGW_EVT_LO_DLDATA_NOTI); ogs_assert(e); e->bearer = bearer; - sgw_event_send(e); + rv = ogs_queue_push(sgw_self()->queue, e); + if (rv != OGS_OK) { + ogs_error("ogs_queue_push() failed:%d", (int)rv); + sgw_event_free(e); + } SGW_SET_UE_STATE(sgw_ue, SGW_DL_NOTI_SENT); }