mirror of
				https://github.com/open5gs/open5gs.git
				synced 2025-11-03 21:43:25 +00:00 
			
		
		
		
	Negociate SCTP stream ID with eNodeB (#63)
This commit is contained in:
		@@ -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
 | 
			
		||||
 */
 | 
			
		||||
 
 | 
			
		||||
@@ -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;
 | 
			
		||||
 
 | 
			
		||||
@@ -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);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user