Negociate SCTP stream ID with eNodeB (#63)

This commit is contained in:
Sukchan Lee
2018-05-18 17:14:29 +09:00
parent 76d8df3879
commit 9a0afe035a
7 changed files with 65 additions and 36 deletions

View File

@@ -106,6 +106,13 @@ typedef struct ipsubnet_t {
c_uint32_t mask[4];
} ipsubnet_t;
typedef struct _sctp_info_t {
c_uint32_t ppid;
c_uint16_t stream_no;
c_uint16_t inbound_streams;
c_uint16_t outbound_streams;
} sctp_info_t;
/*
* Init/Final
*/
@@ -207,7 +214,7 @@ CORE_DECLARE(int) core_sctp_sendmsg(sock_id id, const void *msg, size_t len,
#define CORE_SCTP_EAGAIN -2
#define CORE_SCTP_REMOTE_CLOSED -3
CORE_DECLARE(int) core_sctp_recvmsg(sock_id id, void *msg, size_t len,
c_sockaddr_t *from, c_uint32_t *ppid, c_uint16_t *stream_no);
c_sockaddr_t *from, sctp_info_t *sinfo);
/*
* TUN Driver
*/

View File

@@ -202,14 +202,14 @@ int core_sctp_sendmsg(sock_id id, const void *msg, size_t len,
}
int core_sctp_recvmsg(sock_id id, void *msg, size_t len,
c_sockaddr_t *from, c_uint32_t *ppid, c_uint16_t *stream_no)
c_sockaddr_t *from, sctp_info_t *sinfo)
{
sock_t *sock = (sock_t *)id;
int size;
socklen_t addrlen = sizeof(struct sockaddr_storage);
int flags = 0;
struct sctp_sndrcvinfo sinfo;
struct sctp_sndrcvinfo sndrcvinfo;
d_assert(id, return -1,);
@@ -217,7 +217,7 @@ int core_sctp_recvmsg(sock_id id, void *msg, size_t len,
{
size = sctp_recvmsg(sock->fd, msg, len,
from ? &from->sa : NULL, from ? &addrlen : NULL,
&sinfo, &flags);
&sndrcvinfo, &flags);
if (size < 0)
{
if (errno != EAGAIN)
@@ -251,7 +251,18 @@ int core_sctp_recvmsg(sock_id id, void *msg, size_t len,
}
if (not->sn_assoc_change.sac_state == SCTP_COMM_UP)
d_trace(3, "SCTP_COMM_UP\n");
{
d_trace(3, "SCTP_COMM_UP : inboud:%d, outbound = %d\n",
not->sn_assoc_change.sac_inbound_streams,
not->sn_assoc_change.sac_outbound_streams);
}
if (sinfo)
{
sinfo->inbound_streams =
not->sn_assoc_change.sac_inbound_streams;
sinfo->outbound_streams =
not->sn_assoc_change.sac_outbound_streams;
}
break;
case SCTP_SEND_FAILED :
d_error("SCTP_SEND_FAILED"
@@ -281,14 +292,10 @@ int core_sctp_recvmsg(sock_id id, void *msg, size_t len,
} while(1);
if (ppid)
if (sinfo)
{
*ppid = ntohl(sinfo.sinfo_ppid);
}
if (stream_no)
{
*stream_no = sinfo.sinfo_stream;
sinfo->ppid = ntohl(sndrcvinfo.sinfo_ppid);
sinfo->stream_no = sndrcvinfo.sinfo_stream;
}
return size;

View File

@@ -56,6 +56,7 @@ static void *THREAD_FUNC test2_main(thread_id id, void *data)
char str[STRLEN];
ssize_t size;
c_uint32_t ppid;
sctp_info_t sinfo;
c_sockaddr_t *addr;
c_sockaddr_t from;
@@ -66,9 +67,9 @@ static void *THREAD_FUNC test2_main(thread_id id, void *data)
rv = core_freeaddrinfo(addr);
ABTS_INT_EQUAL(tc, CORE_OK, rv);
size = core_sctp_recvmsg(sctp, str, STRLEN, &from, &ppid, NULL);
size = core_sctp_recvmsg(sctp, str, STRLEN, &from, &sinfo);
ABTS_INT_EQUAL(tc, strlen(DATASTR), size);
ABTS_INT_EQUAL(tc, PPID, ppid);
ABTS_INT_EQUAL(tc, PPID, sinfo.ppid);
rv = sock_delete(sctp);
ABTS_INT_EQUAL(tc, CORE_OK, rv);
@@ -149,7 +150,7 @@ static void sctp_test3(abts_case *tc, void *data)
c_sockaddr_t from, *addr;
char str[STRLEN];
char buf[CORE_ADDRSTRLEN];
c_uint32_t ppid;
sctp_info_t sinfo;
rv = core_getaddrinfo(&addr, AF_INET, NULL, PORT, AI_PASSIVE);
ABTS_INT_EQUAL(tc, CORE_OK, rv);
@@ -161,9 +162,9 @@ static void sctp_test3(abts_case *tc, void *data)
rv = thread_create(&test3_thread, NULL, test3_main, tc);
ABTS_INT_EQUAL(tc, CORE_OK, rv);
size = core_sctp_recvmsg(sctp, str, STRLEN, &from, &ppid, NULL);
size = core_sctp_recvmsg(sctp, str, STRLEN, &from, &sinfo);
ABTS_INT_EQUAL(tc, strlen(DATASTR), size);
ABTS_INT_EQUAL(tc, PPID, ppid);
ABTS_INT_EQUAL(tc, PPID, sinfo.ppid);
thread_join(&rv, test3_thread);
ABTS_INT_EQUAL(tc, strlen(DATASTR), rv);
@@ -181,7 +182,7 @@ static void *THREAD_FUNC test4_main(thread_id id, void *data)
c_sockaddr_t *addr;
char str[STRLEN];
ssize_t size;
c_uint32_t ppid;
sctp_info_t sinfo;
rv = core_getaddrinfo(&addr, AF_UNSPEC, NULL, PORT, 0);
ABTS_INT_EQUAL(tc, CORE_OK, rv);
@@ -193,9 +194,9 @@ static void *THREAD_FUNC test4_main(thread_id id, void *data)
size = core_sctp_sendmsg(sctp, DATASTR, strlen(DATASTR), NULL, PPID, 0);
ABTS_INT_EQUAL(tc, strlen(DATASTR), size);
size = core_sctp_recvmsg(sctp, str, STRLEN, NULL, &ppid, NULL);
size = core_sctp_recvmsg(sctp, str, STRLEN, NULL, &sinfo);
ABTS_INT_EQUAL(tc, strlen(DATASTR), size);
ABTS_INT_EQUAL(tc, PPID, ppid);
ABTS_INT_EQUAL(tc, PPID, sinfo.ppid);
rv = sock_delete(sctp);
ABTS_INT_EQUAL(tc, CORE_OK, rv);
@@ -211,7 +212,7 @@ static void sctp_test4(abts_case *tc, void *data)
ssize_t size;
c_sockaddr_t from, *addr;
char str[STRLEN];
c_uint32_t ppid;
sctp_info_t sinfo;
char buf[CORE_ADDRSTRLEN];
rv = core_getaddrinfo(&addr, AF_INET6, NULL, PORT, AI_PASSIVE);
@@ -224,10 +225,10 @@ static void sctp_test4(abts_case *tc, void *data)
rv = thread_create(&test4_thread, NULL, test4_main, tc);
ABTS_INT_EQUAL(tc, CORE_OK, rv);
size = core_sctp_recvmsg(sctp, str, STRLEN, &from, &ppid, NULL);
size = core_sctp_recvmsg(sctp, str, STRLEN, &from, &sinfo);
ABTS_INT_EQUAL(tc, strlen(DATASTR), size);
ABTS_STR_EQUAL(tc, "::1", CORE_ADDR(&from, buf));
ABTS_INT_EQUAL(tc, PPID, ppid);
ABTS_INT_EQUAL(tc, PPID, sinfo.ppid);
size = core_sctp_sendmsg(sctp, DATASTR, strlen(DATASTR), &from, PPID, 0);
ABTS_INT_EQUAL(tc, strlen(DATASTR), size);
@@ -247,7 +248,7 @@ static void *THREAD_FUNC test5_main(thread_id id, void *data)
sock_id sctp;
char str[STRLEN];
c_sockaddr_t from, *remote_addr, *addr;
c_uint32_t ppid;
sctp_info_t sinfo;
ssize_t size;
char buf[CORE_ADDRSTRLEN];
@@ -271,10 +272,10 @@ static void *THREAD_FUNC test5_main(thread_id id, void *data)
remote_addr, PPID, 0);
ABTS_INT_EQUAL(tc, strlen(DATASTR), size);
size = core_sctp_recvmsg(sctp, str, STRLEN, &from, &ppid, NULL);
size = core_sctp_recvmsg(sctp, str, STRLEN, &from, &sinfo);
ABTS_INT_EQUAL(tc, strlen(DATASTR), size);
ABTS_STR_EQUAL(tc, "::1", CORE_ADDR(&from, buf));
ABTS_INT_EQUAL(tc, PPID, ppid);
ABTS_INT_EQUAL(tc, PPID, sinfo.ppid);
rv = sock_delete(sctp);
ABTS_INT_EQUAL(tc, CORE_OK, rv);
@@ -291,7 +292,7 @@ static void sctp_test5(abts_case *tc, void *data)
c_sockaddr_t from, *addr;
socklen_t addrlen;
char str[STRLEN];
c_uint32_t ppid;
sctp_info_t sinfo;
char buf[CORE_ADDRSTRLEN];
rv = core_getaddrinfo(&addr, AF_INET6, NULL, PORT, AI_PASSIVE);
@@ -304,12 +305,13 @@ static void sctp_test5(abts_case *tc, void *data)
rv = thread_create(&test5_thread, NULL, test5_main, tc);
ABTS_INT_EQUAL(tc, CORE_OK, rv);
size = core_sctp_recvmsg(sctp, str, STRLEN, &from, &ppid, NULL);
size = core_sctp_recvmsg(sctp, str, STRLEN, &from, &sinfo);
ABTS_INT_EQUAL(tc, strlen(DATASTR), size);
ABTS_STR_EQUAL(tc, "::1", CORE_ADDR(&from, buf));
ABTS_INT_EQUAL(tc, PPID, ppid);
ABTS_INT_EQUAL(tc, PPID, sinfo.ppid);
size = core_sctp_sendmsg(sctp, DATASTR, strlen(DATASTR), &from, ppid, 0);
size = core_sctp_sendmsg(sctp, DATASTR, strlen(DATASTR), &from,
sinfo.ppid, 0);
ABTS_INT_EQUAL(tc, strlen(DATASTR), size);
thread_join(&rv, test5_thread);