Re: [lksctp-developers] sctp_status: Got sendmsg: Invalid argument when set max_stream larger than 10

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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




[Index of Archives]     [Linux Networking Development]     [Linux OMAP]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux