diff --git a/lib/core/include/core_network.h b/lib/core/include/core_network.h index 9634e9774..6d9850922 100644 --- a/lib/core/include/core_network.h +++ b/lib/core/include/core_network.h @@ -5,6 +5,8 @@ #include "core_time.h" #include "core_list.h" +#define NO_FD_LOCK 1 /* New experimental method */ + #if HAVE_ARPA_INET_H #include #endif diff --git a/lib/core/src/unix/socket.c b/lib/core/src/unix/socket.c index a1fb64717..7bef31aca 100644 --- a/lib/core/src/unix/socket.c +++ b/lib/core/src/unix/socket.c @@ -9,6 +9,14 @@ #define MAX_SOCK_POOL_SIZE 512 #define MAX_SOCK_NODE_POOL_SIZE 512 +#if NO_FD_LOCK +#define FD_LOCK +#define FD_UNLOCK +#else +#define FD_LOCK mutex_lock(mutex); +#define FD_UNLOCK mutex_unlock(mutex); +#endif + static int max_fd; static list_t fd_list; static fd_set read_fds; @@ -659,7 +667,7 @@ status_t sock_register(sock_id id, sock_handler handler, void *data) return CORE_ERROR; } - mutex_lock(mutex); + FD_LOCK if (sock->fd > max_fd) { @@ -670,7 +678,7 @@ status_t sock_register(sock_id id, sock_handler handler, void *data) list_append(&fd_list, sock); - mutex_unlock(mutex); + FD_UNLOCK return CORE_OK; } @@ -679,11 +687,11 @@ status_t sock_unregister(sock_id id) { d_assert(id, return CORE_ERROR,); - mutex_lock(mutex); + FD_LOCK list_remove(&fd_list, id); - mutex_unlock(mutex); + FD_UNLOCK return CORE_OK; } @@ -693,19 +701,19 @@ int sock_is_registered(sock_id id) sock_t *sock = (sock_t *)id; sock_t *iter = NULL; - mutex_lock(mutex); + FD_LOCK d_assert(id, return CORE_ERROR,); for (iter = list_first(&fd_list); iter != NULL; iter = list_next(iter)) { if (iter == sock) { - mutex_unlock(mutex); + FD_UNLOCK return 1; } } - mutex_unlock(mutex); + FD_UNLOCK return 0; } @@ -811,7 +819,7 @@ static void set_fds(fd_set *fds) { sock_t *sock = NULL; - mutex_lock(mutex); + FD_LOCK FD_ZERO(fds); for (sock = list_first(&fd_list); sock != NULL; sock = list_next(sock)) @@ -819,14 +827,14 @@ static void set_fds(fd_set *fds) FD_SET(sock->fd, fds); } - mutex_unlock(mutex); + FD_UNLOCK } static void fd_dispatch(fd_set *fds) { sock_t *sock = NULL; - mutex_lock(mutex); + FD_LOCK for (sock = list_first(&fd_list); sock != NULL; sock = list_next(sock)) { @@ -839,5 +847,5 @@ static void fd_dispatch(fd_set *fds) } } - mutex_unlock(mutex); + FD_UNLOCK } diff --git a/src/mme/mme_context.c b/src/mme/mme_context.c index e3a8214d4..895eda138 100644 --- a/src/mme/mme_context.c +++ b/src/mme/mme_context.c @@ -5,6 +5,7 @@ #include "core_lib.h" #include "core_msgq.h" #include "core_fsm.h" +#include "core_network.h" #include #include @@ -1402,8 +1403,12 @@ status_t mme_enb_remove(mme_enb_t *enb) enb_ue_remove_in_enb(enb); +#ifdef NO_FD_LOCK +#else +#error do not use lock in socket fd if (enb->sock_type == SOCK_STREAM) s1ap_delete(enb->sock); +#endif core_free(enb->addr); index_free(&mme_enb_pool, enb); diff --git a/src/mme/mme_sm.c b/src/mme/mme_sm.c index 70bb32555..3c78423f3 100644 --- a/src/mme/mme_sm.c +++ b/src/mme/mme_sm.c @@ -122,6 +122,10 @@ void mme_state_operational(fsm_t *s, event_t *e) addr = (c_sockaddr_t *)event_get_param2(e); d_assert(addr, break, "Null param"); +#ifdef NO_FD_LOCK + enb = mme_enb_find_by_addr(addr); +#else +#error do not use lock in socket fd /* * * if socket type is SOCK_STREAM, @@ -132,6 +136,7 @@ void mme_state_operational(fsm_t *s, event_t *e) enb = mme_enb_find_by_sock(sock); else enb = mme_enb_find_by_addr(addr); +#endif core_free(addr); if (enb) diff --git a/src/mme/s1ap_sctp.c b/src/mme/s1ap_sctp.c index 50b5e6a18..492b78637 100644 --- a/src/mme/s1ap_sctp.c +++ b/src/mme/s1ap_sctp.c @@ -161,8 +161,14 @@ int s1ap_recv_handler(sock_id sock, void *data) event_set(&e, MME_EVT_S1AP_LO_CONNREFUSED); event_set_param1(&e, (c_uintptr_t)sock); event_set_param2(&e, (c_uintptr_t)addr); +#ifdef NO_FD_LOCK + sock_delete(sock); +#else +#error do not use lock in socket fd +#endif if (mme_event_send(&e) != CORE_OK) { + d_error("Event MME_EVT_S1AP_LO_CONNREFUSED failed"); core_free(addr); }