diff options
Diffstat (limited to 'tools/testing/selftests/net/mptcp/mptcp_connect.c')
| -rw-r--r-- | tools/testing/selftests/net/mptcp/mptcp_connect.c | 71 | 
1 files changed, 59 insertions, 12 deletions
diff --git a/tools/testing/selftests/net/mptcp/mptcp_connect.c b/tools/testing/selftests/net/mptcp/mptcp_connect.c index 99579c0223c1..cedee5b952ba 100644 --- a/tools/testing/selftests/net/mptcp/mptcp_connect.c +++ b/tools/testing/selftests/net/mptcp/mptcp_connect.c @@ -34,8 +34,8 @@ extern int optind;  #define TCP_ULP 31  #endif +static int  poll_timeout = 10 * 1000;  static bool listen_mode; -static int  poll_timeout;  enum cfg_mode {  	CFG_MODE_POLL, @@ -50,11 +50,21 @@ static int cfg_sock_proto	= IPPROTO_MPTCP;  static bool tcpulp_audit;  static int pf = AF_INET;  static int cfg_sndbuf; +static int cfg_rcvbuf; +static bool cfg_join;  static void die_usage(void)  { -	fprintf(stderr, "Usage: mptcp_connect [-6] [-u] [-s MPTCP|TCP] [-p port] -m mode]" -		"[ -l ] [ -t timeout ] connect_address\n"); +	fprintf(stderr, "Usage: mptcp_connect [-6] [-u] [-s MPTCP|TCP] [-p port] [-m mode]" +		"[-l] connect_address\n"); +	fprintf(stderr, "\t-6 use ipv6\n"); +	fprintf(stderr, "\t-t num -- set poll timeout to num\n"); +	fprintf(stderr, "\t-S num -- set SO_SNDBUF to num\n"); +	fprintf(stderr, "\t-R num -- set SO_RCVBUF to num\n"); +	fprintf(stderr, "\t-p num -- use port num\n"); +	fprintf(stderr, "\t-m [MPTCP|TCP] -- use tcp or mptcp sockets\n"); +	fprintf(stderr, "\t-s [mmap|poll] -- use poll (default) or mmap\n"); +	fprintf(stderr, "\t-u -- check mptcp ulp\n");  	exit(1);  } @@ -97,6 +107,17 @@ static void xgetaddrinfo(const char *node, const char *service,  	}  } +static void set_rcvbuf(int fd, unsigned int size) +{ +	int err; + +	err = setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &size, sizeof(size)); +	if (err) { +		perror("set SO_RCVBUF"); +		exit(1); +	} +} +  static void set_sndbuf(int fd, unsigned int size)  {  	int err; @@ -230,6 +251,7 @@ static int sock_connect_mptcp(const char * const remoteaddr,  static size_t do_rnd_write(const int fd, char *buf, const size_t len)  { +	static bool first = true;  	unsigned int do_w;  	ssize_t bw; @@ -237,10 +259,19 @@ static size_t do_rnd_write(const int fd, char *buf, const size_t len)  	if (do_w == 0 || do_w > len)  		do_w = len; +	if (cfg_join && first && do_w > 100) +		do_w = 100; +  	bw = write(fd, buf, do_w);  	if (bw < 0)  		perror("write"); +	/* let the join handshake complete, before going on */ +	if (cfg_join && first) { +		usleep(200000); +		first = false; +	} +  	return bw;  } @@ -365,8 +396,11 @@ static int copyfd_io_poll(int infd, int peerfd, int outfd)  					break;  				/* ... but we still receive. -				 * Close our write side. +				 * Close our write side, ev. give some time +				 * for address notification  				 */ +				if (cfg_join) +					usleep(400000);  				shutdown(peerfd, SHUT_WR);  			} else {  				if (errno == EINTR) @@ -383,6 +417,10 @@ static int copyfd_io_poll(int infd, int peerfd, int outfd)  		}  	} +	/* leave some time for late join/announce */ +	if (cfg_join) +		usleep(400000); +  	close(peerfd);  	return 0;  } @@ -638,7 +676,7 @@ static void maybe_close(int fd)  {  	unsigned int r = rand(); -	if (r & 1) +	if (!cfg_join && (r & 1))  		close(fd);  } @@ -704,6 +742,8 @@ int main_loop(void)  	check_getpeername_connect(fd); +	if (cfg_rcvbuf) +		set_rcvbuf(fd, cfg_rcvbuf);  	if (cfg_sndbuf)  		set_sndbuf(fd, cfg_sndbuf); @@ -745,7 +785,7 @@ int parse_mode(const char *mode)  	return 0;  } -int parse_sndbuf(const char *size) +static int parse_int(const char *size)  {  	unsigned long s; @@ -765,17 +805,19 @@ int parse_sndbuf(const char *size)  		die_usage();  	} -	cfg_sndbuf = s; - -	return 0; +	return (int)s;  }  static void parse_opts(int argc, char **argv)  {  	int c; -	while ((c = getopt(argc, argv, "6lp:s:hut:m:b:")) != -1) { +	while ((c = getopt(argc, argv, "6jlp:s:hut:m:S:R:")) != -1) {  		switch (c) { +		case 'j': +			cfg_join = true; +			cfg_mode = CFG_MODE_POLL; +			break;  		case 'l':  			listen_mode = true;  			break; @@ -802,8 +844,11 @@ static void parse_opts(int argc, char **argv)  		case 'm':  			cfg_mode = parse_mode(optarg);  			break; -		case 'b': -			cfg_sndbuf = parse_sndbuf(optarg); +		case 'S': +			cfg_sndbuf = parse_int(optarg); +			break; +		case 'R': +			cfg_rcvbuf = parse_int(optarg);  			break;  		}  	} @@ -831,6 +876,8 @@ int main(int argc, char *argv[])  		if (fd < 0)  			return 1; +		if (cfg_rcvbuf) +			set_rcvbuf(fd, cfg_rcvbuf);  		if (cfg_sndbuf)  			set_sndbuf(fd, cfg_sndbuf);  |