Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 10 Apr 2007 06:39:01 -0400
From:      Randall Stewart <rrs@cisco.com>
To:        Martin Kulas <coolaz@web.de>
Cc:        freebsd-current@freebsd.org
Subject:   Re: netcat with SCTP support
Message-ID:  <461B6945.90109@cisco.com>
In-Reply-To: <20070409214504.GA1780@thunderbird.tld>
References:  <20070409214504.GA1780@thunderbird.tld>

next in thread | previous in thread | raw e-mail | index | archive | help
Martin:

Thanks for checking out SCTP for netcat... let me
see if I can re-create this bug with current and figure
out what is broken... This sounds like a bug with the
TCP model..

I will be a bit slow.. I am on vacation this week and for
some crazy reason my wife thinks I should be working on
putting in a yard instead of working on the computer :-)

I can work only limited times in the AM when everyone
is still asleep :-0


So to recreate this.. I set things up run it
and ctl-c the client?

R

Martin Kulas wrote:
> Hello!
> 
> I am running -CURRENT and I am happy to have SCTP support.  I wrote a patch
> for netcat so I can experiment with SCTP.  The patch opens a SCTP socket
> in one-to-one style. 
> But there is a problem I could not solve: If I open an SCTP listening socket 
> with netcat and connect to it with netcat, data transfer works correctly.  When I
> kill the client process, the server process does not react on the
> SHUTDOWN-chunk sent to it: poll() does not notify the process that the
> association has been closed.  Using TCP poll() works correctly.
> Does anyone know how to solve this problem?
> 
> Thanks in advance,
> Martin
> 
> <patch>
> --- netcat.c.orig	Fri Mar 30 21:58:02 2007
> +++ netcat.c	Mon Apr  9 16:59:21 2007
> @@ -44,6 +44,7 @@
>  #ifdef IPSEC
>  #include <netinet6/ipsec.h>
>  #endif
> +#include <netinet/sctp.h>
>  #include <netinet/tcp.h>
>  #include <netinet/ip.h>
>  #include <arpa/telnet.h>
> @@ -71,6 +72,7 @@
>  
>  /* Command Line Options */
>  int	Eflag;					/* Use IPsec ESP */
> +int	cflag;					/* Use SCTP */
>  int	dflag;					/* detached, no stdin */
>  unsigned int iflag;				/* Interval Flag */
>  int	jflag;					/* use jumbo frames if we can */
> @@ -138,8 +140,11 @@
>  	sv = NULL;
>  
>  	while ((ch = getopt(argc, argv,
> -	    "46e:DEdhi:jklnoP:p:rSs:tT:Uuvw:X:x:z")) != -1) {
> +	    "c46e:DEdhi:jklnoP:p:rSs:tT:Uuvw:X:x:z")) != -1) {
>  		switch (ch) {
> +		case 'c':
> +			cflag = 1;
> +			break;
>  		case '4':
>  			family = AF_INET;
>  			break;
> @@ -257,6 +262,8 @@
>  	if (argv[0] && !argv[1] && family == AF_UNIX) {
>  		if (uflag)
>  			errx(1, "cannot use -u and -U");
> +		if (cflag)
> +			errx(1, "cannot use -c and -U");
>  		host = argv[0];
>  		uport = NULL;
>  	} else if (argv[0] && !argv[1]) {
> @@ -283,13 +290,23 @@
>  	if (family != AF_UNIX) {
>  		memset(&hints, 0, sizeof(struct addrinfo));
>  		hints.ai_family = family;
> -		hints.ai_socktype = uflag ? SOCK_DGRAM : SOCK_STREAM;
> -		hints.ai_protocol = uflag ? IPPROTO_UDP : IPPROTO_TCP;
> +		if (cflag) {
> +		    hints.ai_socktype = SOCK_STREAM;
> +		    // XXX IPPROTO_SCTP not supported form getaddrinfo
> +		} else {
> +		    hints.ai_socktype = uflag ? SOCK_DGRAM : SOCK_STREAM;
> +		    hints.ai_protocol = uflag ? IPPROTO_UDP : IPPROTO_TCP;
> +		}
>  		if (nflag)
>  			hints.ai_flags |= AI_NUMERICHOST;
>  	}
>  
> +	if ( cflag && uflag )
> +	    errx(1, "cannot use -c and -u");
> +
>  	if (xflag) {
> +		if (cflag)
> +			errx(1, "no proxy support for SCTP mode");
>  		if (uflag)
>  			errx(1, "no proxy support for UDP mode");
>  
> @@ -418,7 +435,7 @@
>  				}
>  
>  				printf("Connection to %s %s port [%s/%s] succeeded!\n",
> -				    host, portlist[i], uflag ? "udp" : "tcp",
> +				    host, portlist[i], uflag ? "udp" : (cflag ? "sctp" : "tcp"),
>  				    sv ? sv->s_name : "*");
>  			}
>  			if (!zflag)
> @@ -515,9 +532,15 @@
>  
>  	res0 = res;
>  	do {
> -		if ((s = socket(res0->ai_family, res0->ai_socktype,
> -		    res0->ai_protocol)) < 0)
> -			continue;
> +		if (cflag) {
> +			if ((s = socket(res0->ai_family, res0->ai_socktype,
> +			    IPPROTO_SCTP)) < 0)
> +				continue;
> +		} else {
> +			if ((s = socket(res0->ai_family, res0->ai_socktype,
> +			    res0->ai_protocol)) < 0)
> +				continue;
> +		}
>  #ifdef IPSEC
>  		if (ipsec_policy[0] != NULL)
>  			add_ipsec_policy(s, ipsec_policy[0]);
> @@ -532,7 +555,8 @@
>  			memset(&ahints, 0, sizeof(struct addrinfo));
>  			ahints.ai_family = res0->ai_family;
>  			ahints.ai_socktype = uflag ? SOCK_DGRAM : SOCK_STREAM;
> -			ahints.ai_protocol = uflag ? IPPROTO_UDP : IPPROTO_TCP;
> +			if (!cflag)
> +			    ahints.ai_protocol = uflag ? IPPROTO_UDP : IPPROTO_TCP;
>  			ahints.ai_flags = AI_PASSIVE;
>  			if ((error = getaddrinfo(sflag, pflag, &ahints, &ares)))
>  				errx(1, "getaddrinfo: %s", gai_strerror(error));
> @@ -549,7 +573,7 @@
>  			break;
>  		else if (vflag)
>  			warn("connect to %s port %s (%s) failed", host, port,
> -			    uflag ? "udp" : "tcp");
> +			    uflag ? "udp" : (cflag ? "sctp" : "tcp") );
>  
>  		close(s);
>  		s = -1;
> @@ -587,10 +611,15 @@
>  
>  	res0 = res;
>  	do {
> -		if ((s = socket(res0->ai_family, res0->ai_socktype,
> -		    res0->ai_protocol)) < 0)
> -			continue;
> -
> +		if (cflag) {
> +		    if ((s = socket(res0->ai_family, res0->ai_socktype,
> +			IPPROTO_SCTP)) < 0)
> +			    continue;
> +		} else {
> +		    if ((s = socket(res0->ai_family, res0->ai_socktype,
> +			res0->ai_protocol)) < 0)
> +			    continue;
> +		}
>  		ret = setsockopt(s, SOL_SOCKET, SO_REUSEPORT, &x, sizeof(x));
>  		if (ret == -1)
>  			err(1, NULL);
> </patch>


-- 
Randall Stewart
NSSTG - Cisco Systems Inc.
803-345-0369 <or> 803-317-4952 (cell)



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?461B6945.90109>