Improve sanity check for queue-push fail

This commit is contained in:
Sukchan Lee 2019-05-06 23:13:26 +09:00
parent ab81e38487
commit bc180c3ffc
11 changed files with 112 additions and 38 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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