On 10/31/2013 03:54 AM, Hangbin Liu wrote:
On Wed, Oct 30, 2013 at 04:24:08PM +0100, Daniel Borkmann wrote:
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
Ah, I see, thanks for this patch
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. :)
Yes, It looks like this tool was written for SCTP conformance testing
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);
}
Ok, applied.
--
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