diff options
Diffstat (limited to 'tools/testing/selftests/bpf/network_helpers.c')
| -rw-r--r-- | tools/testing/selftests/bpf/network_helpers.c | 40 | 
1 files changed, 31 insertions, 9 deletions
diff --git a/tools/testing/selftests/bpf/network_helpers.c b/tools/testing/selftests/bpf/network_helpers.c index 2bb1f9b3841d..59cf81ec55af 100644 --- a/tools/testing/selftests/bpf/network_helpers.c +++ b/tools/testing/selftests/bpf/network_helpers.c @@ -21,6 +21,10 @@  #include "network_helpers.h"  #include "test_progs.h" +#ifndef IPPROTO_MPTCP +#define IPPROTO_MPTCP 262 +#endif +  #define clean_errno() (errno == 0 ? "None" : strerror(errno))  #define log_err(MSG, ...) ({						\  			int __save = errno;				\ @@ -73,13 +77,13 @@ int settimeo(int fd, int timeout_ms)  #define save_errno_close(fd) ({ int __save = errno; close(fd); errno = __save; }) -static int __start_server(int type, const struct sockaddr *addr, +static int __start_server(int type, int protocol, const struct sockaddr *addr,  			  socklen_t addrlen, int timeout_ms, bool reuseport)  {  	int on = 1;  	int fd; -	fd = socket(addr->sa_family, type, 0); +	fd = socket(addr->sa_family, type, protocol);  	if (fd < 0) {  		log_err("Failed to create server socket");  		return -1; @@ -113,8 +117,8 @@ error_close:  	return -1;  } -int start_server(int family, int type, const char *addr_str, __u16 port, -		 int timeout_ms) +static int start_server_proto(int family, int type, int protocol, +			      const char *addr_str, __u16 port, int timeout_ms)  {  	struct sockaddr_storage addr;  	socklen_t addrlen; @@ -122,10 +126,23 @@ int start_server(int family, int type, const char *addr_str, __u16 port,  	if (make_sockaddr(family, addr_str, port, &addr, &addrlen))  		return -1; -	return __start_server(type, (struct sockaddr *)&addr, +	return __start_server(type, protocol, (struct sockaddr *)&addr,  			      addrlen, timeout_ms, false);  } +int start_server(int family, int type, const char *addr_str, __u16 port, +		 int timeout_ms) +{ +	return start_server_proto(family, type, 0, addr_str, port, timeout_ms); +} + +int start_mptcp_server(int family, const char *addr_str, __u16 port, +		       int timeout_ms) +{ +	return start_server_proto(family, SOCK_STREAM, IPPROTO_MPTCP, addr_str, +				  port, timeout_ms); +} +  int *start_reuseport_server(int family, int type, const char *addr_str,  			    __u16 port, int timeout_ms, unsigned int nr_listens)  { @@ -144,7 +161,7 @@ int *start_reuseport_server(int family, int type, const char *addr_str,  	if (!fds)  		return NULL; -	fds[0] = __start_server(type, (struct sockaddr *)&addr, addrlen, +	fds[0] = __start_server(type, 0, (struct sockaddr *)&addr, addrlen,  				timeout_ms, true);  	if (fds[0] == -1)  		goto close_fds; @@ -154,7 +171,7 @@ int *start_reuseport_server(int family, int type, const char *addr_str,  		goto close_fds;  	for (; nr_fds < nr_listens; nr_fds++) { -		fds[nr_fds] = __start_server(type, (struct sockaddr *)&addr, +		fds[nr_fds] = __start_server(type, 0, (struct sockaddr *)&addr,  					     addrlen, timeout_ms, true);  		if (fds[nr_fds] == -1)  			goto close_fds; @@ -247,7 +264,7 @@ int connect_to_fd_opts(int server_fd, const struct network_helper_opts *opts)  	struct sockaddr_storage addr;  	struct sockaddr_in *addr_in;  	socklen_t addrlen, optlen; -	int fd, type; +	int fd, type, protocol;  	if (!opts)  		opts = &default_opts; @@ -258,6 +275,11 @@ int connect_to_fd_opts(int server_fd, const struct network_helper_opts *opts)  		return -1;  	} +	if (getsockopt(server_fd, SOL_SOCKET, SO_PROTOCOL, &protocol, &optlen)) { +		log_err("getsockopt(SOL_PROTOCOL)"); +		return -1; +	} +  	addrlen = sizeof(addr);  	if (getsockname(server_fd, (struct sockaddr *)&addr, &addrlen)) {  		log_err("Failed to get server addr"); @@ -265,7 +287,7 @@ int connect_to_fd_opts(int server_fd, const struct network_helper_opts *opts)  	}  	addr_in = (struct sockaddr_in *)&addr; -	fd = socket(addr_in->sin_family, type, 0); +	fd = socket(addr_in->sin_family, type, protocol);  	if (fd < 0) {  		log_err("Failed to create client socket");  		return -1;  | 
