forked from mirrors/linux
		
	mptcp: Check connection state before attempting send
MPTCP should wait for an active connection or skip sending depending on the connection state, as TCP does. This happens before the possible passthrough to a regular TCP sendmsg because the subflow's socket type (MPTCP or TCP fallback) is not known until the connection is complete. This is also relevent at disconnect time, where data should not be sent in certain MPTCP-level connection states. Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
							parent
							
								
									0a303214f8
								
							
						
					
					
						commit
						1954b86016
					
				
					 1 changed files with 10 additions and 2 deletions
				
			
		|  | @ -419,6 +419,15 @@ static int mptcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) | |||
| 		return -EOPNOTSUPP; | ||||
| 
 | ||||
| 	lock_sock(sk); | ||||
| 
 | ||||
| 	timeo = sock_sndtimeo(sk, msg->msg_flags & MSG_DONTWAIT); | ||||
| 
 | ||||
| 	if ((1 << sk->sk_state) & ~(TCPF_ESTABLISHED | TCPF_CLOSE_WAIT)) { | ||||
| 		ret = sk_stream_wait_connect(sk, &timeo); | ||||
| 		if (ret) | ||||
| 			goto out; | ||||
| 	} | ||||
| 
 | ||||
| 	ssock = __mptcp_tcp_fallback(msk); | ||||
| 	if (unlikely(ssock)) { | ||||
| fallback: | ||||
|  | @ -427,8 +436,6 @@ static int mptcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) | |||
| 		return ret >= 0 ? ret + copied : (copied ? copied : ret); | ||||
| 	} | ||||
| 
 | ||||
| 	timeo = sock_sndtimeo(sk, msg->msg_flags & MSG_DONTWAIT); | ||||
| 
 | ||||
| 	ssk = mptcp_subflow_get(msk); | ||||
| 	if (!ssk) { | ||||
| 		release_sock(sk); | ||||
|  | @ -460,6 +467,7 @@ static int mptcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) | |||
| 
 | ||||
| 	ssk_check_wmem(msk, ssk); | ||||
| 	release_sock(ssk); | ||||
| out: | ||||
| 	release_sock(sk); | ||||
| 	return ret; | ||||
| } | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Mat Martineau
						Mat Martineau