S1AP changes from net_lib to new socket library

This commit is contained in:
Sukchan Lee 2017-11-23 02:53:33 +00:00
parent 65b7008378
commit 227cae5762
13 changed files with 115 additions and 115 deletions

View File

@ -8,7 +8,7 @@ libcore_la_SOURCES = \
../include/core_fsm.h ../include/core_general.h ../include/core.h \
../include/core.h.in ../include/core_index.h ../include/core_lib.h \
../include/core_list.h ../include/core_msgq.h ../include/core_mutex.h \
../include/core_net.h ../include/core_param.h ../include/core_pkbuf.h \
../include/core_network.h ../include/core_param.h ../include/core_pkbuf.h \
../include/core_pool.h ../include/core_queue.h ../include/core_ringbuf.h \
../include/core_rwlock.h ../include/core_semaphore.h ../include/core_sha1.h \
../include/core_sha1_hmac.h ../include/core_sha2.h ../include/core_sha2_hmac.h \
@ -16,7 +16,6 @@ libcore_la_SOURCES = \
../include/core_timer.h ../include/core_tlv.h ../include/core_tlv_msg.h \
../include/core_atomic.h ../include/core_portable.h \
../include/core_version.h ../include/core_event.h ../include/core_hash.h \
../include/core_network.h \
\
debug.c version.c fsm.c msgq.c ringbuf.c timer.c tlv.c tlv_msg.c hash.c \
aes.c aes_cmac.c sha1.c sha1_hmac.c sha2.c sha2_hmac.c misc.c event.c \
@ -27,7 +26,7 @@ libcore_la_SOURCES = \
../include/arch/unix/core_arch_semaphore.h \
../include/arch/unix/core_arch_thread.h \
unix/start.c unix/errorcodes.c unix/pkbuf.c \
unix/rand.c unix/time.c unix/file.c unix/net_lib.c \
unix/rand.c unix/time.c unix/file.c \
unix/thread.c unix/signal.c \
unix/atomic.c unix/cond.c unix/mutex.c unix/rwlock.c unix/semaphore.c \
unix/socket.c unix/udp.c unix/tcp.c unix/tun.c \

View File

@ -16,7 +16,8 @@
#include "core.h"
#include "core_lib.h"
#include "core_net.h"
#include "core_arch_network.h"
static char *stuffbuffer(char *buf, size_t bufsize, const char *s)
{

View File

@ -4,7 +4,6 @@
#include "core_general.h"
#include "core_debug.h"
#include "core_pool.h"
#include "core_net.h"
pool_declare(file_pool, file_t, MAX_NUM_OF_FILE);

View File

@ -221,8 +221,11 @@ int core_sctp_recvmsg(sock_id id, void *msg, size_t len,
&sinfo, &flags);
if (size < 0)
{
d_error("sctp_recvmsg(len:%ld) failed(%d:%s)",
len, errno, strerror(errno));
if (errno != EAGAIN)
{
d_error("sctp_recvmsg(%d) failed(%d:%s)",
size, errno, strerror(errno));
}
return size;
}

View File

@ -105,13 +105,14 @@ status_t sock_bind(sock_id id, c_sockaddr_t *sa)
if (bind(sock->fd, &sa->sa, addrlen) != 0)
{
d_error("socket bind(%s:%d) failed(%d:%s)",
CORE_NTOP(sa, buf), sa->sin.sin_port, errno, strerror(errno));
CORE_NTOP(sa, buf), ntohs(sa->c_sa_port),
errno, strerror(errno));
return CORE_ERROR;
}
memcpy(&sock->local_addr, sa, sizeof(sock->local_addr));
d_trace(1, "socket bind %s:%d\n", CORE_NTOP(sa, buf), sa->sin.sin_port);
d_trace(1, "socket bind %s:%d\n", CORE_NTOP(sa, buf), ntohs(sa->c_sa_port));
return CORE_OK;
}
@ -131,13 +132,15 @@ status_t sock_connect(sock_id id, c_sockaddr_t *sa)
if (connect(sock->fd, &sa->sa, addrlen) != 0)
{
d_error("socket connect(%s:%d) failed(%d:%s)",
CORE_NTOP(sa, buf), sa->sin.sin_port, errno, strerror(errno));
CORE_NTOP(sa, buf), ntohs(sa->c_sa_port),
errno, strerror(errno));
return CORE_ERROR;
}
memcpy(&sock->remote_addr, sa, sizeof(sock->remote_addr));
d_trace(1, "socket connect %s:%d\n", CORE_NTOP(sa, buf), sa->sin.sin_port);
d_trace(1, "socket connect %s:%d\n", CORE_NTOP(sa, buf),
ntohs(sa->c_sa_port));
return CORE_OK;
}

View File

@ -11,7 +11,6 @@
#include "core_rwlock.h"
#include "core_semaphore.h"
#include "core_thread.h"
#include "core_net.h"
#include "core_network.h"
#include "core_file.h"
#include "core_pkbuf.h"
@ -46,7 +45,6 @@ status_t core_initialize(void)
rwlock_init();
atomic_init();
thread_init();
net_init();
sock_init();
file_init();
pkbuf_init();
@ -72,7 +70,6 @@ void core_terminate(void)
pkbuf_final();
file_final();
sock_final();
net_final();
thread_final();
atomic_final();
rwlock_final();

View File

@ -3,7 +3,7 @@
bin_PROGRAMS = testcore
testcore_SOURCES = \
abts.c testds.c testfsm.c testnetlib.c testsock.c testthread.c testtlv.c \
abts.c testds.c testfsm.c testsock.c testthread.c testtlv.c \
testaes.c testfile.c testlock.c testatomic.c testsha.c testtime.c \
testdir.c testfilecopy.c testmsgq.c testsleep.c testtimer.c \
testpkbuf.c testmisc.c testhash.c \

View File

@ -28,7 +28,6 @@ const struct testlist {
{testtlv},
{testaes},
{testsha2},
{testnetlib},
{testsock},
#if USE_USRSCTP != 1
{testsctp},

View File

@ -62,7 +62,6 @@ abts_suite *testfsm(abts_suite *suite);
abts_suite *testtlv(abts_suite *suite);
abts_suite *testaes(abts_suite *suite);
abts_suite *testsha2(abts_suite *suite);
abts_suite *testnetlib(abts_suite *suite);
abts_suite *testsock(abts_suite *suite);
abts_suite *testsctp(abts_suite *suite);
abts_suite *testtime(abts_suite *suite);

View File

@ -93,8 +93,8 @@ void mme_state_operational(fsm_t *s, event_t *e)
if (!enb)
{
#if USE_USRSCTP != 1
int rc = net_register_sock(sock, s1ap_recv_cb, NULL);
d_assert(rc == 0, break, "register _s1ap_recv_cb failed");
status_t rv = sock_register(sock, s1ap_recv_cb, NULL);
d_assert(rv == CORE_OK, break, "register s1ap_recv_cb failed");
#endif
mme_enb_t *enb = mme_enb_add(sock);
@ -107,7 +107,7 @@ void mme_state_operational(fsm_t *s, event_t *e)
d_warn("eNB context duplicated with IP-address [%s]!!!",
INET_NTOP(&addr, buf));
#if USE_USRSCTP != 1
net_close(sock);
sock_delete(sock);
#endif
d_warn("S1 Socket Closed");
}

View File

@ -7,37 +7,37 @@
#include "s1ap_path.h"
static int s1ap_accept_cb(net_sock_t *net_sock, void *data);
static int s1ap_accept_cb(sock_id sock, void *data);
status_t s1ap_open(void)
{
char buf[INET_ADDRSTRLEN];
int rc;
#if 0 /* ADDR */
char buf[CORE_ADDRSTRLEN];
#endif
status_t rv;
c_sockaddr_t addr;
rc = net_listen_ext(&mme_self()->s1ap_sock,
SOCK_STREAM, IPPROTO_SCTP, SCTP_S1AP_PPID,
mme_self()->s1ap_addr, mme_self()->s1ap_port);
if (rc != 0)
{
d_error("Can't establish S1-ENB(port:%d) path(%d:%s)",
mme_self()->s1ap_port, errno, strerror(errno));
mme_self()->s1ap_sock = NULL;
return CORE_ERROR;
}
memset(&addr, 0, sizeof(c_sockaddr_t));
addr.sin.sin_addr.s_addr = mme_self()->s1ap_addr;
addr.c_sa_family = AF_INET;
addr.c_sa_port = htons(mme_self()->s1ap_port);
rc = net_register_sock(
mme_self()->s1ap_sock, s1ap_accept_cb, NULL);
if (rc != 0)
{
d_error("Can't establish S1-ENB path(%d:%s)",
errno, strerror(errno));
net_close(mme_self()->s1ap_sock);
mme_self()->s1ap_sock = NULL;
return CORE_ERROR;
}
rv = sctp_socket(&mme_self()->s1ap_sock, AF_INET, SOCK_STREAM);
d_assert(rv == CORE_OK, return CORE_ERROR,);
rv = sock_bind(mme_self()->s1ap_sock, &addr);
d_assert(rv == CORE_OK, return CORE_ERROR,);
rv = sock_listen(mme_self()->s1ap_sock);
d_assert(rv == CORE_OK, return CORE_ERROR,);
rv = sock_register(mme_self()->s1ap_sock, s1ap_accept_cb, NULL);
d_assert(rv == CORE_OK, return CORE_ERROR,);
#if 0 /* ADDR */
d_trace(1, "s1_enb_listen() %s:%d\n",
INET_NTOP(&mme_self()->s1ap_addr, buf), mme_self()->s1ap_port);
#endif
return CORE_OK;
}
@ -45,15 +45,14 @@ status_t s1ap_open(void)
status_t s1ap_close()
{
s1ap_sctp_close(mme_self()->s1ap_sock);
mme_self()->s1ap_sock = NULL;
mme_self()->s1ap_sock = 0;
return CORE_OK;
}
status_t s1ap_sctp_close(net_sock_t *sock)
status_t s1ap_sctp_close(sock_id sock)
{
net_unregister_sock(sock);
net_close(sock);
sock_delete(sock);
return CORE_OK;
}
@ -63,39 +62,44 @@ status_t s1ap_final()
return CORE_OK;
}
static int s1ap_accept_cb(net_sock_t *net_sock, void *data)
static int s1ap_accept_cb(sock_id id, void *data)
{
char buf[INET_ADDRSTRLEN];
ssize_t r;
net_sock_t *remote_sock;
char buf[CORE_ADDRSTRLEN];
status_t rv;
sock_id new;
d_assert(net_sock, return -1, "Null param");
d_assert(id, return -1, "Null param");
r = net_accept(&remote_sock, net_sock, 0);
if (r > 0)
rv = sock_accept(&new, id);
if (rv == CORE_OK)
{
c_sockaddr_t *addr = sock_remote_addr_get(new);;
event_t e;
c_uint32_t addr = remote_sock->remote.sin_addr.s_addr;
c_uint16_t port = ntohs(remote_sock->remote.sin_port);
c_uint32_t ip = addr->sin.sin_addr.s_addr;
c_uint16_t port = ntohs(addr->c_sa_port);
d_trace(1, "eNB-S1 accepted[%s] in s1_path module\n",
INET_NTOP(&addr, buf));
CORE_NTOP(addr, buf));
event_set(&e, MME_EVT_S1AP_LO_ACCEPT);
event_set_param1(&e, (c_uintptr_t)remote_sock);
event_set_param2(&e, (c_uintptr_t)addr);
event_set_param1(&e, (c_uintptr_t)new);
event_set_param2(&e, (c_uintptr_t)ip);
event_set_param3(&e, (c_uintptr_t)port);
/* FIXME : how to close remote_sock */
mme_event_send(&e);
return 0;
}
else
{
d_error("net_accept failed(r = %d, errno = %d)", r, errno);
d_error("sock accept failed(%d:%s)", errno, strerror(errno));
return -1;
}
return r;
}
static status_t s1ap_recv(net_sock_t *sock, pkbuf_t *pkbuf)
static status_t s1ap_recv(sock_id sock, pkbuf_t *pkbuf)
{
event_t e;
@ -111,11 +115,12 @@ static status_t s1ap_recv(net_sock_t *sock, pkbuf_t *pkbuf)
return mme_event_send(&e);
}
int s1ap_recv_cb(net_sock_t *sock, void *data)
int s1ap_recv_cb(sock_id sock, void *data)
{
status_t rv;
pkbuf_t *pkbuf;
ssize_t r;
int rc;
event_t e;
d_assert(sock, return -1, "Null param");
@ -127,56 +132,42 @@ int s1ap_recv_cb(net_sock_t *sock, void *data)
d_fatal("Can't allocate pkbuf");
/* Read data from socket to exit from select */
net_read(sock, tmp_buf, MAX_SDU_LEN, 0);
core_recv(sock, tmp_buf, MAX_SDU_LEN, 0);
return -1;
}
r = net_read(sock, pkbuf->payload, pkbuf->len, 0);
if (r == -2)
{
pkbuf_free(pkbuf);
}
else if (r <= 0)
rc = core_sctp_recvmsg(sock, pkbuf->payload, pkbuf->len,
NULL, NULL, NULL);
if (rc <= 0)
{
pkbuf_free(pkbuf);
if (sock->sndrcv_errno == EAGAIN)
{
d_warn("net_read failed(%d:%s)",
sock->sndrcv_errno, strerror(sock->sndrcv_errno));
if (errno == 0 || errno == EAGAIN)
return 0;
}
else if (sock->sndrcv_errno == ECONNREFUSED)
if (rc == CORE_SCTP_REMOTE_CLOSED)
{
d_warn("net_read failed(%d:%s)",
sock->sndrcv_errno, strerror(sock->sndrcv_errno));
}
else
{
d_error("net_read failed(%d:%s)",
sock->sndrcv_errno, strerror(sock->sndrcv_errno));
event_set(&e, MME_EVT_S1AP_LO_CONNREFUSED);
event_set_param1(&e, (c_uintptr_t)sock);
mme_event_send(&e);
return 0;
}
event_t e;
event_set(&e, MME_EVT_S1AP_LO_CONNREFUSED);
event_set_param1(&e, (c_uintptr_t)sock);
mme_event_send(&e);
d_error("core_sctp_recvmsg(%d) failed(%d:%s)",
rc, errno, strerror(errno));
return -1;
}
else
{
pkbuf->len = r;
rv = s1ap_recv(sock, pkbuf);
if (rv != CORE_OK)
{
pkbuf_free(pkbuf);
d_error("s1_recv() failed");
return -1;
}
pkbuf->len = rc;
rv = s1ap_recv(sock, pkbuf);
if (rv != CORE_OK)
{
pkbuf_free(pkbuf);
d_error("s1_recv() failed");
return -1;
}
return 0;
@ -209,23 +200,26 @@ status_t s1ap_send(net_sock_t *s, pkbuf_t *pkbuf)
}
#endif
status_t s1ap_sendto(net_sock_t *s, pkbuf_t *pkbuf,
c_uint32_t addr, c_uint16_t port)
status_t s1ap_sendto(sock_id sock, pkbuf_t *pkbuf,
c_uint32_t ipv4, c_uint16_t port)
{
char buf[INET_ADDRSTRLEN];
ssize_t sent;
#if 0 /* ADDR */
char buf[CORE_ADDRSTRLEN];
#endif
int sent;
d_assert(s, return CORE_ERROR, "Null param");
d_assert(sock, return CORE_ERROR, "Null param");
d_assert(pkbuf, return CORE_ERROR, "Null param");
sent = net_sendto(s, pkbuf->payload, pkbuf->len, addr, port);
sent = core_sctp_sendmsg(sock, pkbuf->payload, pkbuf->len, NULL, 18, 0);
#if 0 /* ADDR */
d_trace(10,"Sent %d->%d bytes to [%s:%d]\n",
pkbuf->len, sent, INET_NTOP(&addr, buf), port);
#endif
d_trace_hex(10, pkbuf->payload, pkbuf->len);
if (sent < 0 || sent != pkbuf->len)
{
d_error("net_send error (%d:%s)",
s->sndrcv_errno, strerror(s->sndrcv_errno));
d_error("core_sctp_sendmsg error (%d:%s)", errno, strerror(errno));
return CORE_ERROR;
}
pkbuf_free(pkbuf);

View File

@ -107,6 +107,9 @@ abts_suite *test_s1setup(abts_suite *suite)
{
suite = ADD_SUITE(suite)
extern int _sctp;
d_trace_level(&_sctp, 10);
abts_run_test(suite, s1setup_test1, NULL);
abts_run_test(suite, s1setup_test2, NULL);

View File

@ -7,6 +7,10 @@
#include "mme_context.h"
#include "s1ap_path.h"
#if 1 /* ADDR */
#include <arpa/inet.h>
#endif
status_t tests1ap_enb_connect(sock_id *new)
{
char buf[INET_ADDRSTRLEN];
@ -46,14 +50,13 @@ status_t tests1ap_enb_send(sock_id id, pkbuf_t *sendbuf)
int tests1ap_enb_read(sock_id id, pkbuf_t *recvbuf)
{
c_uint32_t ppid;
int size = core_sctp_recvmsg(id,
recvbuf->payload, MAX_SDU_LEN, NULL, &ppid, NULL);
#if 0
if (ppid != 18)
int size;
do
{
d_error("Invalid PPID = %d\n", ppid);
}
#endif
size = core_sctp_recvmsg(id,
recvbuf->payload, MAX_SDU_LEN, NULL, &ppid, NULL);
} while(size <= 0);
recvbuf->len = size;
return size;