|  | 
| 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