From 23fa36bc230ba1b7cf7fc0cea27cdd4df7c915db Mon Sep 17 00:00:00 2001 From: Sukchan Lee Date: Fri, 24 Nov 2017 15:04:45 +0000 Subject: [PATCH] name changes --- lib/3gpp/types.h | 5 + .../include/arch/unix/core_arch_network.h | 4 + lib/core/include/core_network.h | 4 - src/mme/mme_context.c | 7 - src/mme/mme_sm.c | 2 +- src/mme/s1ap_path.h | 10 +- src/mme/s1ap_sctp.c | 201 ++++++++---------- src/mme/s1ap_usrsctp.c | 113 +++++----- test/attach_test.c | 4 +- test/testpacket.c | 22 +- test/testpacket.h | 2 +- 11 files changed, 176 insertions(+), 198 deletions(-) diff --git a/lib/3gpp/types.h b/lib/3gpp/types.h index 185ac9fcd..a56289884 100644 --- a/lib/3gpp/types.h +++ b/lib/3gpp/types.h @@ -7,6 +7,11 @@ extern "C" { #endif /* __cplusplus */ +#define S1AP_SCTP_PORT 36412 + +#define SCTP_S1AP_PPID 18 +#define SCTP_X2AP_PPID 27 + #define MAX_NUM_OF_ENB 128 #define MAX_NUM_OF_UE 128 #define MAX_NUM_OF_SESS 4 diff --git a/lib/core/include/arch/unix/core_arch_network.h b/lib/core/include/arch/unix/core_arch_network.h index 3e837f57c..dd477c1b3 100644 --- a/lib/core/include/arch/unix/core_arch_network.h +++ b/lib/core/include/arch/unix/core_arch_network.h @@ -8,6 +8,10 @@ #include #endif +#if HAVE_NETDB_H +#include +#endif + #if HAVE_SYS_SOCKET_H #include #endif diff --git a/lib/core/include/core_network.h b/lib/core/include/core_network.h index 7c36b72d2..96801aa15 100644 --- a/lib/core/include/core_network.h +++ b/lib/core/include/core_network.h @@ -4,10 +4,6 @@ #include "core_errno.h" #include "core_time.h" -#if HAVE_NETDB_H -#include -#endif - #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ diff --git a/src/mme/mme_context.c b/src/mme/mme_context.c index 7a8ec80b8..0a78193e7 100644 --- a/src/mme/mme_context.c +++ b/src/mme/mme_context.c @@ -17,8 +17,6 @@ #define MAX_CELL_PER_ENB 8 -#define S1AP_SCTP_PORT 36412 - static mme_context_t self; pool_declare(mme_sgw_pool, mme_sgw_t, MAX_NUM_OF_GTP_NODE); @@ -864,13 +862,8 @@ status_t mme_context_setup_trace_module() d_trace_level(&_s1ap_build, s1ap); extern int _s1ap_handler; d_trace_level(&_s1ap_handler, s1ap); -#if USE_USRSCTP == 1 - extern int _s1ap_usrsctp; - d_trace_level(&_s1ap_usrsctp, s1ap); -#else extern int _s1ap_sctp; d_trace_level(&_s1ap_sctp, s1ap); -#endif extern int _s1ap_path; d_trace_level(&_s1ap_path, s1ap); extern int _s1ap_recv; diff --git a/src/mme/mme_sm.c b/src/mme/mme_sm.c index e36998120..5ca7140a5 100644 --- a/src/mme/mme_sm.c +++ b/src/mme/mme_sm.c @@ -93,7 +93,7 @@ void mme_state_operational(fsm_t *s, event_t *e) if (!enb) { #if USE_USRSCTP != 1 - status_t rv = sock_register(sock, s1ap_recv_cb, NULL); + status_t rv = sock_register(sock, s1ap_recv_handler, NULL); d_assert(rv == CORE_OK, break, "register s1ap_recv_cb failed"); #endif diff --git a/src/mme/s1ap_path.h b/src/mme/s1ap_path.h index 4f68f4ef6..64cef0e8d 100644 --- a/src/mme/s1ap_path.h +++ b/src/mme/s1ap_path.h @@ -10,9 +10,6 @@ extern "C" { #endif /* __cplusplus */ -#define SCTP_S1AP_PPID 18 -#define SCTP_X2AP_PPID 27 - CORE_DECLARE(status_t) s1ap_init(c_uint16_t port); CORE_DECLARE(status_t) s1ap_final(); @@ -25,9 +22,12 @@ CORE_DECLARE(status_t) s1ap_client(sock_id *new, int family, int type, const char *hostname, c_uint16_t port); CORE_DECLARE(status_t) s1ap_delete(sock_id sock); -CORE_DECLARE(status_t) s1ap_recv(sock_id id, pkbuf_t *pkbuf); +CORE_DECLARE(int) s1ap_recv_handler(sock_id sock, void *data); + CORE_DECLARE(status_t) s1ap_send(sock_id sock, pkbuf_t *pkbuf, c_sockaddr_t *addr); +CORE_DECLARE(status_t) s1ap_recv(sock_id id, pkbuf_t *pkbuf); + CORE_DECLARE(status_t) s1ap_send_to_enb(mme_enb_t *enb, pkbuf_t *pkb); CORE_DECLARE(status_t) s1ap_delayed_send_to_enb(mme_enb_t *enb, pkbuf_t *pkbuf, c_uint32_t duration); @@ -56,8 +56,6 @@ CORE_DECLARE(status_t) s1ap_send_handover_cancel_ack(enb_ue_t *source_ue); CORE_DECLARE(status_t) s1ap_send_mme_status_transfer( enb_ue_t *target_ue, S1ap_ENBStatusTransferIEs_t *ies); -int s1ap_recv_cb(sock_id sock, void *data); - #ifdef __cplusplus } #endif /* __cplusplus */ diff --git a/src/mme/s1ap_sctp.c b/src/mme/s1ap_sctp.c index f6239369e..80246dca2 100644 --- a/src/mme/s1ap_sctp.c +++ b/src/mme/s1ap_sctp.c @@ -7,7 +7,7 @@ #include "s1ap_path.h" -static int s1ap_accept_cb(sock_id sock, void *data); +static int s1ap_accept_handler(sock_id sock, void *data); status_t s1ap_init(c_uint16_t port) { @@ -25,7 +25,7 @@ status_t s1ap_open(void) int family = AF_INET; int type = SOCK_STREAM; const char *hostname = NULL; - c_uint16_t port = 36412; + c_uint16_t port = S1AP_SCTP_PORT; rv = s1ap_server(&mme_self()->s1ap_sock, family, type, hostname, port); if (rv != CORE_OK) @@ -53,7 +53,7 @@ status_t s1ap_server(sock_id *new, rv = sctp_server(new, family, type, hostname, port); d_assert(rv == CORE_OK, return CORE_ERROR,); - rv = sock_register(mme_self()->s1ap_sock, s1ap_accept_cb, NULL); + rv = sock_register(mme_self()->s1ap_sock, s1ap_accept_handler, NULL); d_assert(rv == CORE_OK, return CORE_ERROR,); addr = sock_local_addr_get(*new); @@ -76,7 +76,42 @@ status_t s1ap_delete(sock_id sock) return sock_delete(sock); } -static int s1ap_accept_cb(sock_id id, void *data) +status_t s1ap_send(sock_id sock, pkbuf_t *pkbuf, c_sockaddr_t *addr) +{ + int sent; + + d_assert(sock, return CORE_ERROR,); + d_assert(pkbuf, return CORE_ERROR,); + + sent = core_sctp_sendmsg(sock, pkbuf->payload, pkbuf->len, + 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) + { + d_error("core_sctp_sendmsg error (%d:%s)", errno, strerror(errno)); + return CORE_ERROR; + } + pkbuf_free(pkbuf); + + return CORE_OK; +} + +status_t s1ap_recv(sock_id id, pkbuf_t *pkbuf) +{ + int size; + + size = core_sctp_recvmsg(id, pkbuf->payload, MAX_SDU_LEN, NULL, NULL, NULL); + if (size <= 0) + { + return CORE_ERROR; + } + + pkbuf->len = size; + return CORE_OK;; +} + +static int s1ap_accept_handler(sock_id id, void *data) { char buf[CORE_ADDRSTRLEN]; status_t rv; @@ -113,17 +148,64 @@ static int s1ap_accept_cb(sock_id id, void *data) return -1; } - } -static status_t s1ap_recv_handler(sock_id sock, pkbuf_t *pkbuf) +int s1ap_recv_handler(sock_id sock, void *data) { + status_t rv; + pkbuf_t *pkbuf; + int size; event_t e; c_sockaddr_t *addr = NULL; - status_t rv; - d_assert(sock, return CORE_ERROR, "Null param"); - d_assert(pkbuf, return CORE_ERROR, "Null param"); + d_assert(sock, return -1, "Null param"); + + pkbuf = pkbuf_alloc(0, MAX_SDU_LEN); + if (pkbuf == NULL) + { + char tmp_buf[MAX_SDU_LEN]; + + d_fatal("Can't allocate pkbuf"); + + /* Read data from socket to exit from select */ + core_recv(sock, tmp_buf, MAX_SDU_LEN, 0); + + return -1; + } + + size = core_sctp_recvmsg(sock, pkbuf->payload, pkbuf->len, + NULL, NULL, NULL); + if (size <= 0) + { + pkbuf_free(pkbuf); + + if (errno == 0 || errno == EAGAIN) + return 0; + + if (size == CORE_SCTP_REMOTE_CLOSED) + { + addr = core_calloc(1, sizeof(c_sockaddr_t)); + d_assert(addr, return -1,); + memcpy(addr, sock_remote_addr_get(sock), sizeof(c_sockaddr_t)); + + event_set(&e, MME_EVT_S1AP_LO_CONNREFUSED); + event_set_param1(&e, (c_uintptr_t)sock); + event_set_param2(&e, (c_uintptr_t)addr); + if (mme_event_send(&e) != CORE_OK) + { + pkbuf_free(pkbuf); + core_free(addr); + } + + return 0; + } + + d_error("core_sctp_recvmsg(%d) failed(%d:%s)", + size, errno, strerror(errno)); + return -1; + } + + pkbuf->len = size; d_trace(10, "S1AP_PDU is received from eNB-Inf\n"); d_trace_hex(10, pkbuf->payload, pkbuf->len); @@ -143,106 +225,5 @@ static status_t s1ap_recv_handler(sock_id sock, pkbuf_t *pkbuf) core_free(addr); } - return rv; -} - -int s1ap_recv_cb(sock_id sock, void *data) -{ - status_t rv; - pkbuf_t *pkbuf; - int rc; - event_t e; - - d_assert(sock, return -1, "Null param"); - - pkbuf = pkbuf_alloc(0, MAX_SDU_LEN); - if (pkbuf == NULL) - { - char tmp_buf[MAX_SDU_LEN]; - - d_fatal("Can't allocate pkbuf"); - - /* Read data from socket to exit from select */ - core_recv(sock, tmp_buf, MAX_SDU_LEN, 0); - - return -1; - } - - rc = core_sctp_recvmsg(sock, pkbuf->payload, pkbuf->len, - NULL, NULL, NULL); - if (rc <= 0) - { - pkbuf_free(pkbuf); - - if (errno == 0 || errno == EAGAIN) - return 0; - - if (rc == CORE_SCTP_REMOTE_CLOSED) - { - c_sockaddr_t *addr = core_calloc(1, sizeof(c_sockaddr_t)); - d_assert(addr, return -1,); - memcpy(addr, sock_remote_addr_get(sock), sizeof(c_sockaddr_t)); - - event_set(&e, MME_EVT_S1AP_LO_CONNREFUSED); - event_set_param1(&e, (c_uintptr_t)sock); - event_set_param2(&e, (c_uintptr_t)addr); - if (mme_event_send(&e) != CORE_OK) - { - pkbuf_free(pkbuf); - core_free(addr); - } - - return 0; - } - - d_error("core_sctp_recvmsg(%d) failed(%d:%s)", - rc, errno, strerror(errno)); - return -1; - } - - pkbuf->len = rc; - - rv = s1ap_recv_handler(sock, pkbuf); - if (rv != CORE_OK) - { - d_error("s1_recv() failed"); - return -1; - } - return 0; } - -status_t s1ap_recv(sock_id id, pkbuf_t *pkbuf) -{ - int size; - - size = core_sctp_recvmsg(id, pkbuf->payload, MAX_SDU_LEN, NULL, NULL, NULL); - if (size <= 0) - { - return CORE_ERROR; - } - - pkbuf->len = size; - return CORE_OK;; -} - -status_t s1ap_send(sock_id sock, pkbuf_t *pkbuf, c_sockaddr_t *addr) -{ - int sent; - - d_assert(sock, return CORE_ERROR,); - d_assert(pkbuf, return CORE_ERROR,); - - sent = core_sctp_sendmsg(sock, pkbuf->payload, pkbuf->len, - 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) - { - d_error("core_sctp_sendmsg error (%d:%s)", errno, strerror(errno)); - return CORE_ERROR; - } - pkbuf_free(pkbuf); - - return CORE_OK; -} diff --git a/src/mme/s1ap_usrsctp.c b/src/mme/s1ap_usrsctp.c index d90d2868d..54ac75315 100644 --- a/src/mme/s1ap_usrsctp.c +++ b/src/mme/s1ap_usrsctp.c @@ -1,4 +1,4 @@ -#define TRACE_MODULE _s1ap_usrsctp +#define TRACE_MODULE _s1ap_sctp #include "core_debug.h" #include "core_thread.h" @@ -7,6 +7,10 @@ #include "s1ap_path.h" +#if HAVE_NETDB_H +#include +#endif + #if HAVE_USRSCTP_H #ifndef INET #define INET 1 @@ -26,7 +30,7 @@ static status_t s1ap_usrsctp_bind(sock_id id, c_sockaddr_t *sa); static status_t s1ap_usrsctp_connect(sock_id id, c_sockaddr_t *sa); static status_t s1ap_usrsctp_listen(sock_id id); -static int s1ap_usrsctp_recv_cb(struct socket *sock, +static int s1ap_usrsctp_recv_handler(struct socket *sock, union sctp_sockstore addr, void *data, size_t datalen, struct sctp_rcvinfo rcv, int flags, void *ulp_info); @@ -55,6 +59,37 @@ status_t s1ap_final() return CORE_OK; } +status_t s1ap_open(void) +{ + status_t rv; + int family = AF_INET; + int type = SOCK_SEQPACKET; + const char *hostname = NULL; + c_uint16_t port = S1AP_SCTP_PORT; + + rv = s1ap_server(&mme_self()->s1ap_sock, family, type, hostname, port); + if (rv != CORE_OK) + { + d_error("s1ap_server(%d:%d:%s:%d) failed", + family, type, hostname, port); + return CORE_ERROR; + } + + return CORE_OK; +} + +status_t s1ap_close() +{ + return s1ap_delete(mme_self()->s1ap_sock); +} + +status_t s1ap_delete(sock_id sock) +{ + d_assert(sock, return CORE_ERROR,); + usrsctp_close((struct socket *)sock); + return CORE_OK; +} + status_t s1ap_server(sock_id *new, int family, int type, const char *hostname, c_uint16_t port) { @@ -68,7 +103,7 @@ status_t s1ap_server(sock_id *new, while(sa) { rv = s1ap_usrsctp_socket(new, - sa->c_sa_family, type, s1ap_usrsctp_recv_cb); + sa->c_sa_family, type, s1ap_usrsctp_recv_handler); if (rv != CORE_OK) continue; if (s1ap_usrsctp_bind(*new, sa) == CORE_OK) @@ -137,35 +172,31 @@ status_t s1ap_client(sock_id *new, return CORE_OK; } -status_t s1ap_open(void) +status_t s1ap_send(sock_id id, pkbuf_t *pkbuf, c_sockaddr_t *addr) { - status_t rv; - int family = AF_INET; - int type = SOCK_SEQPACKET; - const char *hostname = NULL; - c_uint16_t port = 36412; + ssize_t sent; + struct socket *sock = (struct socket *)id; + struct sctp_sndinfo sndinfo; - rv = s1ap_server(&mme_self()->s1ap_sock, family, type, hostname, port); - if (rv != CORE_OK) + d_assert(id, return CORE_ERROR, "Null param"); + d_assert(pkbuf, return CORE_ERROR, "Null param"); + + memset((void *)&sndinfo, 0, sizeof(struct sctp_sndinfo)); + sndinfo.snd_ppid = htonl(SCTP_S1AP_PPID); + sent = usrsctp_sendv(sock, pkbuf->payload, pkbuf->len, + addr ? &addr->sa : NULL, addr ? 1 : 0, + (void *)&sndinfo, (socklen_t)sizeof(struct sctp_sndinfo), + SCTP_SENDV_SNDINFO, 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) { - d_error("s1ap_server(%d:%d:%s:%d) failed", - family, type, hostname, port); + d_error("sent : %d, pkbuf->len : %d\n", sent, pkbuf->len); return CORE_ERROR; } - - return CORE_OK; -} + pkbuf_free(pkbuf); -status_t s1ap_close() -{ - s1ap_delete(mme_self()->s1ap_sock); - return CORE_OK; -} - -status_t s1ap_delete(sock_id sock) -{ - d_assert(sock, return CORE_ERROR,); - usrsctp_close((struct socket *)sock); return CORE_OK; } @@ -204,34 +235,6 @@ status_t s1ap_recv(sock_id id, pkbuf_t *pkbuf) return CORE_OK; } -status_t s1ap_send(sock_id id, pkbuf_t *pkbuf, c_sockaddr_t *addr) -{ - ssize_t sent; - struct socket *sock = (struct socket *)id; - struct sctp_sndinfo sndinfo; - - d_assert(id, return CORE_ERROR, "Null param"); - d_assert(pkbuf, return CORE_ERROR, "Null param"); - - memset((void *)&sndinfo, 0, sizeof(struct sctp_sndinfo)); - sndinfo.snd_ppid = htonl(SCTP_S1AP_PPID); - sent = usrsctp_sendv(sock, pkbuf->payload, pkbuf->len, - addr ? &addr->sa : NULL, addr ? 1 : 0, - (void *)&sndinfo, (socklen_t)sizeof(struct sctp_sndinfo), - SCTP_SENDV_SNDINFO, 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) - { - d_error("sent : %d, pkbuf->len : %d\n", sent, pkbuf->len); - return CORE_ERROR; - } - pkbuf_free(pkbuf); - - return CORE_OK; -} - static status_t s1ap_usrsctp_socket(sock_id *new, int family, int type, int (*receive_cb)(struct socket *sock, union sctp_sockstore addr, @@ -347,7 +350,7 @@ static status_t s1ap_usrsctp_listen(sock_id id) return CORE_OK; } -static int s1ap_usrsctp_recv_cb(struct socket *sock, +static int s1ap_usrsctp_recv_handler(struct socket *sock, union sctp_sockstore addr, void *data, size_t datalen, struct sctp_rcvinfo rcv, int flags, void *ulp_info) { diff --git a/test/attach_test.c b/test/attach_test.c index fde38426f..6c29847d2 100644 --- a/test/attach_test.c +++ b/test/attach_test.c @@ -141,8 +141,8 @@ static void attach_test1(abts_case *tc, void *data) ABTS_INT_EQUAL(tc, CORE_OK, rv); /* eNB connects to SGW */ - gtpu = testgtpu_enb_connect(); - ABTS_INT_NEQUAL(tc, 0, gtpu); + rv = testgtpu_enb_connect(>pu); + ABTS_INT_EQUAL(tc, CORE_OK, rv); /* Send S1-Setup Reqeust */ rv = tests1ap_build_setup_req( diff --git a/test/testpacket.c b/test/testpacket.c index 47373e042..ba233044e 100644 --- a/test/testpacket.c +++ b/test/testpacket.c @@ -15,7 +15,7 @@ status_t tests1ap_enb_connect(sock_id *new) { status_t rv; - rv = s1ap_client(new, AF_INET, SOCK_STREAM, NULL, 36412); + rv = s1ap_client(new, AF_INET, SOCK_STREAM, NULL, S1AP_SCTP_PORT); d_assert(rv == CORE_OK, return CORE_ERROR,); return CORE_OK; @@ -23,8 +23,7 @@ status_t tests1ap_enb_connect(sock_id *new) status_t tests1ap_enb_close(sock_id id) { - s1ap_delete(id); - return CORE_OK; + return s1ap_delete(id); } status_t tests1ap_enb_read(sock_id id, pkbuf_t *recvbuf) @@ -37,30 +36,29 @@ status_t tests1ap_enb_send(sock_id id, pkbuf_t *sendbuf) return s1ap_send(id, sendbuf, NULL); } -sock_id testgtpu_enb_connect(void) +status_t testgtpu_enb_connect(sock_id *new) { char buf[INET_ADDRSTRLEN]; status_t rv; mme_context_t *mme = mme_self(); - sock_id sock = 0; c_sockaddr_t addr; - if (test_only_control_plane) return 1; + if (test_only_control_plane) return CORE_OK; - if (!mme) return 0; + if (!mme) return CORE_ERROR; memset(&addr, 0, sizeof(c_sockaddr_t)); addr.sin.sin_addr.s_addr = mme->gtpc_addr; addr.c_sa_family = AF_INET; addr.c_sa_port = htons(GTPV1_U_UDP_PORT); - rv = udp_socket(&sock, AF_INET); - d_assert(rv == CORE_OK, return 0,); + rv = udp_socket(new, AF_INET); + d_assert(rv == CORE_OK, return CORE_ERROR,); - rv = sock_bind(sock, &addr); - d_assert(rv == CORE_OK, return 0,); + rv = sock_bind(*new, &addr); + d_assert(rv == CORE_OK, return CORE_ERROR,); - return sock; + return CORE_OK; } status_t testgtpu_enb_close(sock_id sock) diff --git a/test/testpacket.h b/test/testpacket.h index 031c12a3b..32a7d1aaa 100644 --- a/test/testpacket.h +++ b/test/testpacket.h @@ -12,7 +12,7 @@ CORE_DECLARE(status_t) tests1ap_enb_close(sock_id id); CORE_DECLARE(status_t) tests1ap_enb_send(sock_id id, pkbuf_t *sendbuf); CORE_DECLARE(status_t) tests1ap_enb_read(sock_id id, pkbuf_t *recvbuf); -CORE_DECLARE(sock_id) testgtpu_enb_connect(void); +CORE_DECLARE(status_t) testgtpu_enb_connect(sock_id *new); CORE_DECLARE(status_t) testgtpu_enb_close(sock_id sock); CORE_DECLARE(status_t) testgtpu_enb_send(sock_id sock, c_uint32_t src_ip, c_uint32_t dst_ip);