| 
9 | 9 | #include <linux/inet.h>  | 
10 | 10 | #include <linux/kernel.h>  | 
11 | 11 | #include <net/tcp.h>  | 
 | 12 | +#include <net/inet_common.h>  | 
12 | 13 | #include <net/netns/generic.h>  | 
13 | 14 | #include <net/mptcp.h>  | 
14 | 15 | #include <net/genetlink.h>  | 
@@ -1005,8 +1006,8 @@ static int mptcp_pm_nl_create_listen_socket(struct sock *sk,  | 
1005 | 1006 | 	bool is_ipv6 = sk->sk_family == AF_INET6;  | 
1006 | 1007 | 	int addrlen = sizeof(struct sockaddr_in);  | 
1007 | 1008 | 	struct sockaddr_storage addr;  | 
 | 1009 | +	struct sock *newsk, *ssk;  | 
1008 | 1010 | 	struct socket *ssock;  | 
1009 |  | -	struct sock *newsk;  | 
1010 | 1011 | 	int backlog = 1024;  | 
1011 | 1012 | 	int err;  | 
1012 | 1013 | 
 
  | 
@@ -1042,18 +1043,23 @@ static int mptcp_pm_nl_create_listen_socket(struct sock *sk,  | 
1042 | 1043 | 	if (entry->addr.family == AF_INET6)  | 
1043 | 1044 | 		addrlen = sizeof(struct sockaddr_in6);  | 
1044 | 1045 | #endif  | 
1045 |  | -	err = kernel_bind(ssock, (struct sockaddr *)&addr, addrlen);  | 
 | 1046 | +	ssk = mptcp_sk(newsk)->first;  | 
 | 1047 | +	if (ssk->sk_family == AF_INET)  | 
 | 1048 | +		err = inet_bind_sk(ssk, (struct sockaddr *)&addr, addrlen);  | 
 | 1049 | +#if IS_ENABLED(CONFIG_MPTCP_IPV6)  | 
 | 1050 | +	else if (ssk->sk_family == AF_INET6)  | 
 | 1051 | +		err = inet6_bind_sk(ssk, (struct sockaddr *)&addr, addrlen);  | 
 | 1052 | +#endif  | 
1046 | 1053 | 	if (err)  | 
1047 | 1054 | 		return err;  | 
1048 | 1055 | 
 
  | 
1049 | 1056 | 	inet_sk_state_store(newsk, TCP_LISTEN);  | 
1050 |  | -	err = kernel_listen(ssock, backlog);  | 
1051 |  | -	if (err)  | 
1052 |  | -		return err;  | 
1053 |  | - | 
1054 |  | -	mptcp_event_pm_listener(ssock->sk, MPTCP_EVENT_LISTENER_CREATED);  | 
1055 |  | - | 
1056 |  | -	return 0;  | 
 | 1057 | +	lock_sock(ssk);  | 
 | 1058 | +	err = __inet_listen_sk(ssk, backlog);  | 
 | 1059 | +	if (!err)  | 
 | 1060 | +		mptcp_event_pm_listener(ssk, MPTCP_EVENT_LISTENER_CREATED);  | 
 | 1061 | +	release_sock(ssk);  | 
 | 1062 | +	return err;  | 
1057 | 1063 | }  | 
1058 | 1064 | 
 
  | 
1059 | 1065 | int mptcp_pm_nl_get_local_id(struct mptcp_sock *msk, struct mptcp_addr_info *skc)  | 
 | 
0 commit comments