S1AP changes from net_lib to new socket library
This commit is contained in:
parent
65b7008378
commit
227cae5762
|
@ -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 \
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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 \
|
||||
|
|
|
@ -28,7 +28,6 @@ const struct testlist {
|
|||
{testtlv},
|
||||
{testaes},
|
||||
{testsha2},
|
||||
{testnetlib},
|
||||
{testsock},
|
||||
#if USE_USRSCTP != 1
|
||||
{testsctp},
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue