@@ -112,7 +112,7 @@ static void subflow_finish_connect(struct sock *sk, const struct sk_buff *skb)
112112
113113 subflow -> icsk_af_ops -> sk_rx_dst_set (sk , skb );
114114
115- if (subflow -> conn && !subflow -> conn_finished ) {
115+ if (!subflow -> conn_finished ) {
116116 pr_debug ("subflow=%p, remote_key=%llu" , mptcp_subflow_ctx (sk ),
117117 subflow -> remote_key );
118118 mptcp_finish_connect (sk );
@@ -182,6 +182,7 @@ static struct sock *subflow_syn_recv_sock(const struct sock *sk,
182182 struct mptcp_subflow_context * listener = mptcp_subflow_ctx (sk );
183183 struct mptcp_subflow_request_sock * subflow_req ;
184184 struct tcp_options_received opt_rx ;
185+ struct sock * new_msk = NULL ;
185186 struct sock * child ;
186187
187188 pr_debug ("listener=%p, req=%p, conn=%p" , listener , req , listener -> conn );
@@ -197,7 +198,7 @@ static struct sock *subflow_syn_recv_sock(const struct sock *sk,
197198 * out-of-order pkt, which will not carry the MP_CAPABLE
198199 * opt even on mptcp enabled paths
199200 */
200- goto create_child ;
201+ goto create_msk ;
201202 }
202203
203204 opt_rx .mptcp .mp_capable = 0 ;
@@ -207,7 +208,13 @@ static struct sock *subflow_syn_recv_sock(const struct sock *sk,
207208 subflow_req -> remote_key_valid = 1 ;
208209 } else {
209210 subflow_req -> mp_capable = 0 ;
211+ goto create_child ;
210212 }
213+
214+ create_msk :
215+ new_msk = mptcp_sk_clone (listener -> conn , req );
216+ if (!new_msk )
217+ subflow_req -> mp_capable = 0 ;
211218 }
212219
213220create_child :
@@ -221,22 +228,22 @@ static struct sock *subflow_syn_recv_sock(const struct sock *sk,
221228 * handshake
222229 */
223230 if (!ctx )
224- return child ;
231+ goto out ;
225232
226233 if (ctx -> mp_capable ) {
227- if (mptcp_token_new_accept (ctx -> token ))
228- goto close_child ;
234+ /* new mpc subflow takes ownership of the newly
235+ * created mptcp socket
236+ */
237+ ctx -> conn = new_msk ;
238+ new_msk = NULL ;
229239 }
230240 }
231241
242+ out :
243+ /* dispose of the left over mptcp master, if any */
244+ if (unlikely (new_msk ))
245+ sock_put (new_msk );
232246 return child ;
233-
234- close_child :
235- pr_debug ("closing child socket" );
236- tcp_send_active_reset (child , GFP_ATOMIC );
237- inet_csk_prepare_forced_close (child );
238- tcp_done (child );
239- return NULL ;
240247}
241248
242249static struct inet_connection_sock_af_ops subflow_specific ;
@@ -432,9 +439,6 @@ static bool subflow_check_data_avail(struct sock *ssk)
432439 if (subflow -> data_avail )
433440 return true;
434441
435- if (!subflow -> conn )
436- return false;
437-
438442 msk = mptcp_sk (subflow -> conn );
439443 for (;;) {
440444 u32 map_remaining ;
@@ -554,11 +558,10 @@ static void subflow_data_ready(struct sock *sk)
554558 struct mptcp_subflow_context * subflow = mptcp_subflow_ctx (sk );
555559 struct sock * parent = subflow -> conn ;
556560
557- if (!parent || ! subflow -> mp_capable ) {
561+ if (!subflow -> mp_capable ) {
558562 subflow -> tcp_data_ready (sk );
559563
560- if (parent )
561- parent -> sk_data_ready (parent );
564+ parent -> sk_data_ready (parent );
562565 return ;
563566 }
564567
@@ -572,7 +575,7 @@ static void subflow_write_space(struct sock *sk)
572575 struct sock * parent = subflow -> conn ;
573576
574577 sk_stream_write_space (sk );
575- if (parent && sk_stream_is_writeable (sk )) {
578+ if (sk_stream_is_writeable (sk )) {
576579 set_bit (MPTCP_SEND_SPACE , & mptcp_sk (parent )-> flags );
577580 smp_mb__after_atomic ();
578581 /* set SEND_SPACE before sk_stream_write_space clears NOSPACE */
@@ -687,18 +690,18 @@ static bool subflow_is_done(const struct sock *sk)
687690static void subflow_state_change (struct sock * sk )
688691{
689692 struct mptcp_subflow_context * subflow = mptcp_subflow_ctx (sk );
690- struct sock * parent = READ_ONCE ( subflow -> conn ) ;
693+ struct sock * parent = subflow -> conn ;
691694
692695 __subflow_state_change (sk );
693696
694697 /* as recvmsg() does not acquire the subflow socket for ssk selection
695698 * a fin packet carrying a DSS can be unnoticed if we don't trigger
696699 * the data available machinery here.
697700 */
698- if (parent && subflow -> mp_capable && mptcp_subflow_data_available (sk ))
701+ if (subflow -> mp_capable && mptcp_subflow_data_available (sk ))
699702 mptcp_data_ready (parent , sk );
700703
701- if (parent && !(parent -> sk_shutdown & RCV_SHUTDOWN ) &&
704+ if (!(parent -> sk_shutdown & RCV_SHUTDOWN ) &&
702705 !subflow -> rx_eof && subflow_is_done (sk )) {
703706 subflow -> rx_eof = 1 ;
704707 parent -> sk_shutdown |= RCV_SHUTDOWN ;
@@ -793,6 +796,9 @@ static void subflow_ulp_clone(const struct request_sock *req,
793796 new_ctx -> tcp_data_ready = old_ctx -> tcp_data_ready ;
794797 new_ctx -> tcp_state_change = old_ctx -> tcp_state_change ;
795798 new_ctx -> tcp_write_space = old_ctx -> tcp_write_space ;
799+ new_ctx -> rel_write_seq = 1 ;
800+ new_ctx -> tcp_sock = newsk ;
801+
796802 new_ctx -> mp_capable = 1 ;
797803 new_ctx -> fourth_ack = subflow_req -> remote_key_valid ;
798804 new_ctx -> can_ack = subflow_req -> remote_key_valid ;
0 commit comments