On 10/27/2013 04:11 AM, Hangbin Liu wrote:
Hi Daniel, When I run sctp_status test and set max_stream >= 10, the client will fail with "sendmsg: Invalid argument". Would you like to help have a look at this? # ./sctp_status -H 127.0.0.1 -P 9998 -h 127.0.0.1 -p 9999 -s -d 2 -M 20 remote:addr=127.0.0.1, port=distinct, family=2 local:addr=127.0.0.1, port=distinct32, family=2 Starting tests... socket(SOCK_STREAM, IPPROTO_SCTP) -> sk=3 bind(sk=3, [a:127.0.0.1,p:distinct32]) -- attempt 1/10 connect(sk=3) Client: Sending packets.(1/10) sendmsg(sk=3, assoc=0) 17768 bytes. SNDRCV(stream=1 flags=0x1 ppid=846930886) sendmsg(sk=3, assoc=0) 6250 bytes. SNDRCV(stream=2 flags=0x1 ppid=1714636915) sendmsg(sk=3, assoc=0) 23634 bytes. SNDRCV(stream=3 flags=0x1 ppid=424238335) sendmsg(sk=3, assoc=0) 5195 bytes. SNDRCV(stream=4 flags=0x1 ppid=1649760492) sendmsg(sk=3, assoc=0) 7978 bytes. SNDRCV(stream=5 flags=0x1 ppid=1189641421) sendmsg(sk=3, assoc=0) 22715 bytes. SNDRCV(stream=6 flags=0x1 ppid=1350490027) sendmsg(sk=3, assoc=0) 16883 bytes. SNDRCV(stream=7 flags=0x1 ppid=1102520059) sendmsg(sk=3, assoc=0) 10724 bytes. SNDRCV(stream=8 flags=0x1 ppid=1967513926) sendmsg(sk=3, assoc=0) 125 bytes. SNDRCV(stream=9 flags=0x1 ppid=1540383426) sendmsg(sk=3, assoc=0) 2133 bytes. SNDRCV(stream=10 flags=0x1 ppid=1303455736) *** sendmsg: Invalid argument ***
Hangbin, the below fix should do it (it worked for you up to that point as that is the default number of streams) ... will push that _at latest_ on Sunday night as I'll be mostly on travel the next days. Well, looking at the code, at some point in time these tools need a fresh start in general; those were probably just quickly clobbered together from the very early days of lksctp. :) diff --git a/src/apps/sctp_status.c b/src/apps/sctp_status.c index 3a05dc4..5bb48ef 100644 --- a/src/apps/sctp_status.c +++ b/src/apps/sctp_status.c @@ -675,11 +675,11 @@ int next_stream(int state, int pattern) { switch (pattern){ case STREAM_PATTERN_RANDOM: - state = rand() % (max_stream + 1); + state = rand() % max_stream; break; case STREAM_PATTERN_SEQUENTIAL: state = state + 1; - if (state > max_stream) + if (state >= max_stream) state = 0; break; } @@ -723,7 +723,7 @@ void client(int sk) { } /* client() */ void start_test(int role) { - int sk, pid; + int sk, pid, ret; int i = 0; DEBUG_PRINT(DEBUG_NONE, "\nStarting tests...\n"); @@ -745,6 +745,22 @@ void start_test(int role) { listen_r(sk, 1); accept_r(sk); } else { + if (max_stream > 0) { + struct sctp_initmsg initmsg; + + memset(&initmsg, 0, sizeof(initmsg)); + initmsg.sinit_num_ostreams = max_stream; + initmsg.sinit_max_instreams = max_stream; + initmsg.sinit_max_attempts = 3; + + ret = setsockopt(sk, IPPROTO_SCTP, SCTP_INITMSG, + &initmsg, sizeof(initmsg)); + if (ret < 0) { + perror("setsockopt(SCTP_INITMSG)"); + exit(0); + } + } + connect_r(sk, (struct sockaddr *)&s_rem, r_len); } -- To unsubscribe from this list: send the line "unsubscribe linux-sctp" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html