SCTP recv interface will be changed. (Progressing...)

This commit is contained in:
Sukchan Lee 2018-05-30 17:45:14 +09:00
parent 3d78f285be
commit 9aed43075c
6 changed files with 86 additions and 9 deletions

View File

@ -209,9 +209,13 @@ CORE_DECLARE(status_t) sctp_client(sock_id *new,
CORE_DECLARE(status_t) sctp_connect(sock_id id, c_sockaddr_t *sa_list);
CORE_DECLARE(int) core_sctp_sendmsg(sock_id id, const void *msg, size_t len,
c_sockaddr_t *to, c_uint32_t ppid, c_uint16_t stream_no);
CORE_DECLARE(int) core_sctp_recvmsg(sock_id id, void *msg, size_t len,
c_sockaddr_t *from, sctp_info_t *sinfo, int *msg_flags);
CORE_DECLARE(int) core_sctp_recvdata(sock_id id, void *msg, size_t len,
c_sockaddr_t *from, sctp_info_t *sinfo);
#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,
CORE_DECLARE(int) core_sctp_recvmsg2(sock_id id, void *msg, size_t len,
c_sockaddr_t *from, sctp_info_t *sinfo);
/*
* TUN Driver

View File

@ -202,6 +202,76 @@ 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, sctp_info_t *sinfo, int *msg_flags)
{
sock_t *sock = (sock_t *)id;
int size;
socklen_t addrlen = sizeof(struct sockaddr_storage);
int flags = 0;
struct sctp_sndrcvinfo sndrcvinfo;
d_assert(id, return -1,);
size = sctp_recvmsg(sock->fd, msg, len,
from ? &from->sa : NULL, from ? &addrlen : NULL,
&sndrcvinfo, &flags);
if (size < 0)
{
d_error("sctp_recvmsg(%d) failed(%d:%s)",
size, errno, strerror(errno));
return size;
}
if (msg_flags)
{
*msg_flags = flags;
}
if (sinfo)
{
sinfo->ppid = ntohl(sndrcvinfo.sinfo_ppid);
sinfo->stream_no = sndrcvinfo.sinfo_stream;
}
return size;
}
int core_sctp_recvdata(sock_id id, void *msg, size_t len,
c_sockaddr_t *from, sctp_info_t *sinfo)
{
int size;
int flags = 0;
do
{
size = core_sctp_recvmsg(id, msg, len, from, sinfo, &flags);
if (size < 0)
{
d_error("core_sctp_recvdata(%d) failed(%d:%s)",
size, errno, strerror(errno));
return size;
}
if (flags & MSG_NOTIFICATION)
{
/* Nothing */
}
else if (flags & MSG_EOR)
{
break;
}
else
{
d_assert(0, return -1,);
}
} while(1);
return size;
}
int core_sctp_recvmsg2(sock_id id, void *msg, size_t len,
c_sockaddr_t *from, sctp_info_t *sinfo)
{
sock_t *sock = (sock_t *)id;

View File

@ -67,7 +67,7 @@ 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, &sinfo);
size = core_sctp_recvdata(sctp, str, STRLEN, &from, &sinfo);
ABTS_INT_EQUAL(tc, strlen(DATASTR), size);
ABTS_INT_EQUAL(tc, PPID, sinfo.ppid);
@ -162,7 +162,7 @@ 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, &sinfo);
size = core_sctp_recvdata(sctp, str, STRLEN, &from, &sinfo);
ABTS_INT_EQUAL(tc, strlen(DATASTR), size);
ABTS_INT_EQUAL(tc, PPID, sinfo.ppid);
@ -194,7 +194,7 @@ 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, &sinfo);
size = core_sctp_recvdata(sctp, str, STRLEN, NULL, &sinfo);
ABTS_INT_EQUAL(tc, strlen(DATASTR), size);
ABTS_INT_EQUAL(tc, PPID, sinfo.ppid);
@ -225,7 +225,7 @@ 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, &sinfo);
size = core_sctp_recvdata(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, sinfo.ppid);
@ -272,7 +272,7 @@ 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, &sinfo);
size = core_sctp_recvdata(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, sinfo.ppid);
@ -305,7 +305,7 @@ 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, &sinfo);
size = core_sctp_recvdata(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, sinfo.ppid);

View File

@ -22,6 +22,8 @@ char* mme_event_get_name(event_t *e)
return "MME_EVT_S1AP_DELAYED_SEND";
case MME_EVT_S1AP_LO_ACCEPT:
return "MME_EVT_S1AP_LO_ACCEPT";
case MME_EVT_S1AP_LO_SCTP_COMM_UP:
return "MME_EVT_S1AP_LO_SCTP_COMM_UP";
case MME_EVT_S1AP_LO_CONNREFUSED:
return "MME_EVT_S1AP_LO_CONNREFUSED";
case MME_EVT_S1AP_S1_HOLDING_TIMER:

View File

@ -16,6 +16,7 @@ typedef enum {
MME_EVT_S1AP_MESSAGE,
MME_EVT_S1AP_DELAYED_SEND,
MME_EVT_S1AP_LO_ACCEPT,
MME_EVT_S1AP_LO_SCTP_COMM_UP,
MME_EVT_S1AP_LO_CONNREFUSED,
MME_EVT_S1AP_S1_HOLDING_TIMER,

View File

@ -71,7 +71,7 @@ status_t s1ap_recv(sock_id id, pkbuf_t *pkbuf)
{
int size;
size = core_sctp_recvmsg(id, pkbuf->payload, MAX_SDU_LEN, NULL, NULL);
size = core_sctp_recvdata(id, pkbuf->payload, MAX_SDU_LEN, NULL, NULL);
if (size <= 0)
{
d_error("s1ap_recv() failed");
@ -146,7 +146,7 @@ int s1ap_recv_handler(sock_id sock, void *data)
return -1;
}
size = core_sctp_recvmsg(sock, pkbuf->payload, pkbuf->len, NULL, &sinfo);
size = core_sctp_recvmsg2(sock, pkbuf->payload, pkbuf->len, NULL, &sinfo);
if (size <= 0)
{
pkbuf_free(pkbuf);