From 702549184667edf6c92dcaab006d3150914b6747 Mon Sep 17 00:00:00 2001 From: Sukchan Lee Date: Fri, 24 Nov 2017 10:03:48 +0000 Subject: [PATCH] add sock type in enb context --- src/mme/mme_context.c | 14 +++++++++++--- src/mme/mme_context.h | 3 ++- src/mme/mme_sm.c | 19 +++++++++---------- src/mme/s1ap_path.c | 3 ++- src/mme/s1ap_sctp.c | 2 +- 5 files changed, 25 insertions(+), 16 deletions(-) diff --git a/src/mme/mme_context.c b/src/mme/mme_context.c index 01e4e6592..e9b539fe0 100644 --- a/src/mme/mme_context.c +++ b/src/mme/mme_context.c @@ -1009,6 +1009,7 @@ mme_enb_t* mme_enb_add(sock_id sock, c_sockaddr_t *addr) enb->sock = sock; enb->addr = addr; + enb->sock_type = mme_enb_sock_type(enb->sock); list_init(&enb->enb_ue_list); @@ -1040,7 +1041,7 @@ status_t mme_enb_remove(mme_enb_t *enb) enb_ue_remove_in_enb(enb); - if (mme_enb_sock_is_stream(enb->sock)) + if (enb->sock_type == SOCK_STREAM) s1ap_sctp_delete(enb->sock); core_free(enb->addr); @@ -1120,10 +1121,17 @@ mme_enb_t *mme_enb_this(hash_index_t *hi) return hash_this_val(hi); } -int mme_enb_sock_is_stream(sock_id sock) +int mme_enb_sock_type(sock_id sock) { d_assert(sock, return 0,); - return (mme_self()->s1ap_sock != sock); + if (mme_self()->s1ap_sock == sock) + { + return SOCK_SEQPACKET; + } + else + { + return SOCK_STREAM; + } } diff --git a/src/mme/mme_context.h b/src/mme/mme_context.h index d769a5fb7..1d8cf72a8 100644 --- a/src/mme/mme_context.h +++ b/src/mme/mme_context.h @@ -113,6 +113,7 @@ typedef struct _mme_enb_t { fsm_t sm; /* A state machine */ c_uint32_t enb_id; /* eNB_ID received from eNB */ + int sock_type; /* SOCK_STREAM or SOCK_SEQPACKET */ sock_id sock; /* eNB S1AP Socket */ c_sockaddr_t *addr; /* eNB S1AP Address */ @@ -454,7 +455,7 @@ CORE_DECLARE(status_t) mme_enb_set_enb_id( CORE_DECLARE(hash_index_t *) mme_enb_first(); CORE_DECLARE(hash_index_t *) mme_enb_next(hash_index_t *hi); CORE_DECLARE(mme_enb_t *) mme_enb_this(hash_index_t *hi); -CORE_DECLARE(int) mme_enb_sock_is_stream(sock_id sock); +CORE_DECLARE(int) mme_enb_sock_type(sock_id sock); CORE_DECLARE(mme_ue_t*) mme_ue_add(enb_ue_t *enb_ue); CORE_DECLARE(status_t) mme_ue_remove(mme_ue_t *mme_ue); diff --git a/src/mme/mme_sm.c b/src/mme/mme_sm.c index a2da379b4..e36998120 100644 --- a/src/mme/mme_sm.c +++ b/src/mme/mme_sm.c @@ -89,11 +89,7 @@ void mme_state_operational(fsm_t *s, event_t *e) d_trace(1, "eNB-S1 accepted[%s] in master_sm module\n", CORE_NTOP(addr, buf)); - if (mme_enb_sock_is_stream(sock)) - enb = mme_enb_find_by_sock(sock); - else - enb = mme_enb_find_by_addr(addr); - + enb = mme_enb_find_by_addr(addr); if (!enb) { #if USE_USRSCTP != 1 @@ -125,7 +121,13 @@ void mme_state_operational(fsm_t *s, event_t *e) addr = (c_sockaddr_t *)event_get_param2(e); d_assert(addr, break, "Null param"); - if (mme_enb_sock_is_stream(sock)) + /* + * + * if socket type is SOCK_STREAM, + * I'm not sure whether address is available or not. + * So, I'll use 'sock_id' at this point. + */ + if (mme_enb_sock_type(sock) == SOCK_STREAM) enb = mme_enb_find_by_sock(sock); else enb = mme_enb_find_by_addr(addr); @@ -161,10 +163,7 @@ void mme_state_operational(fsm_t *s, event_t *e) pkbuf = (pkbuf_t *)event_get_param3(e); d_assert(pkbuf, break, "Null param"); - if (mme_enb_sock_is_stream(sock)) - enb = mme_enb_find_by_sock(sock); - else - enb = mme_enb_find_by_addr(addr); + enb = mme_enb_find_by_addr(addr); core_free(addr); d_assert(enb, break, "No eNB context"); diff --git a/src/mme/s1ap_path.c b/src/mme/s1ap_path.c index a18558c99..8c1d4ddd6 100644 --- a/src/mme/s1ap_path.c +++ b/src/mme/s1ap_path.c @@ -19,7 +19,8 @@ status_t s1ap_send_to_enb(mme_enb_t *enb, pkbuf_t *pkbuf) d_assert(pkbuf,,); d_assert(enb->sock,,); - rv = s1ap_send(enb->sock, pkbuf, enb->addr); + rv = s1ap_send(enb->sock, pkbuf, + enb->sock_type == SOCK_STREAM ? NULL : enb->addr); if (rv != CORE_OK) { d_error("s1_send error"); diff --git a/src/mme/s1ap_sctp.c b/src/mme/s1ap_sctp.c index a08d752d8..7d6fc7919 100644 --- a/src/mme/s1ap_sctp.c +++ b/src/mme/s1ap_sctp.c @@ -203,7 +203,7 @@ status_t s1ap_send(sock_id sock, pkbuf_t *pkbuf, c_sockaddr_t *addr) d_assert(pkbuf, return CORE_ERROR,); sent = core_sctp_sendmsg(sock, pkbuf->payload, pkbuf->len, - NULL, SCTP_S1AP_PPID, 0); + addr, SCTP_S1AP_PPID, 0); d_trace(10,"Sent %d->%d bytes\n", pkbuf->len, sent); d_trace_hex(10, pkbuf->payload, pkbuf->len); if (sent < 0 || sent != pkbuf->len)