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 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);
>  	}
> 

-- 

Thanks & Best Regards
Hangbin Liu <liuhangbin@xxxxxxxxx>
--
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