@@ -328,6 +328,16 @@ bool mptcp_syn_options(struct sock *sk, const struct sk_buff *skb,
328328 opts -> sndr_key = subflow -> local_key ;
329329 * size = TCPOLEN_MPTCP_MPC_SYN ;
330330 return true;
331+ } else if (subflow -> request_join ) {
332+ pr_debug ("remote_token=%u, nonce=%u" , subflow -> remote_token ,
333+ subflow -> local_nonce );
334+ opts -> suboptions = OPTION_MPTCP_MPJ_SYN ;
335+ opts -> join_id = subflow -> local_id ;
336+ opts -> token = subflow -> remote_token ;
337+ opts -> nonce = subflow -> local_nonce ;
338+ opts -> backup = subflow -> request_bkup ;
339+ * size = TCPOLEN_MPTCP_MPJ_SYN ;
340+ return true;
331341 }
332342 return false;
333343}
@@ -337,16 +347,55 @@ void mptcp_rcv_synsent(struct sock *sk)
337347 struct mptcp_subflow_context * subflow = mptcp_subflow_ctx (sk );
338348 struct tcp_sock * tp = tcp_sk (sk );
339349
340- pr_debug ("subflow=%p" , subflow );
341350 if (subflow -> request_mptcp && tp -> rx_opt .mptcp .mp_capable ) {
342351 subflow -> mp_capable = 1 ;
343352 subflow -> can_ack = 1 ;
344353 subflow -> remote_key = tp -> rx_opt .mptcp .sndr_key ;
345- } else {
354+ pr_debug ("subflow=%p, remote_key=%llu" , subflow ,
355+ subflow -> remote_key );
356+ } else if (subflow -> request_join && tp -> rx_opt .mptcp .mp_join ) {
357+ subflow -> mp_join = 1 ;
358+ subflow -> thmac = tp -> rx_opt .mptcp .thmac ;
359+ subflow -> remote_nonce = tp -> rx_opt .mptcp .nonce ;
360+ pr_debug ("subflow=%p, thmac=%llu, remote_nonce=%u" , subflow ,
361+ subflow -> thmac , subflow -> remote_nonce );
362+ } else if (subflow -> request_mptcp ) {
346363 tcp_sk (sk )-> is_mptcp = 0 ;
347364 }
348365}
349366
367+ /* MP_JOIN client subflow must wait for 4th ack before sending any data:
368+ * TCP can't schedule delack timer before the subflow is fully established.
369+ * MPTCP uses the delack timer to do 3rd ack retransmissions
370+ */
371+ static void schedule_3rdack_retransmission (struct sock * sk )
372+ {
373+ struct inet_connection_sock * icsk = inet_csk (sk );
374+ struct tcp_sock * tp = tcp_sk (sk );
375+ unsigned long timeout ;
376+
377+ /* reschedule with a timeout above RTT, as we must look only for drop */
378+ if (tp -> srtt_us )
379+ timeout = tp -> srtt_us << 1 ;
380+ else
381+ timeout = TCP_TIMEOUT_INIT ;
382+
383+ WARN_ON_ONCE (icsk -> icsk_ack .pending & ICSK_ACK_TIMER );
384+ icsk -> icsk_ack .pending |= ICSK_ACK_SCHED | ICSK_ACK_TIMER ;
385+ icsk -> icsk_ack .timeout = timeout ;
386+ sk_reset_timer (sk , & icsk -> icsk_delack_timer , timeout );
387+ }
388+
389+ static void clear_3rdack_retransmission (struct sock * sk )
390+ {
391+ struct inet_connection_sock * icsk = inet_csk (sk );
392+
393+ sk_stop_timer (sk , & icsk -> icsk_delack_timer );
394+ icsk -> icsk_ack .timeout = 0 ;
395+ icsk -> icsk_ack .ato = 0 ;
396+ icsk -> icsk_ack .pending &= ~(ICSK_ACK_SCHED | ICSK_ACK_TIMER );
397+ }
398+
350399static bool mptcp_established_options_mp (struct sock * sk , struct sk_buff * skb ,
351400 unsigned int * size ,
352401 unsigned int remaining ,
@@ -356,17 +405,21 @@ static bool mptcp_established_options_mp(struct sock *sk, struct sk_buff *skb,
356405 struct mptcp_ext * mpext ;
357406 unsigned int data_len ;
358407
359- pr_debug ("subflow=%p fully established=%d seq=%x:%x remaining=%d" ,
360- subflow , subflow -> fully_established , subflow -> snd_isn ,
361- skb ? TCP_SKB_CB (skb )-> seq : 0 , remaining );
408+ /* When skb is not available, we better over-estimate the emitted
409+ * options len. A full DSS option (28 bytes) is longer than
410+ * TCPOLEN_MPTCP_MPC_ACK_DATA(22) or TCPOLEN_MPTCP_MPJ_ACK(24), so
411+ * tell the caller to defer the estimate to
412+ * mptcp_established_options_dss(), which will reserve enough space.
413+ */
414+ if (!skb )
415+ return false;
362416
363- if (subflow -> mp_capable && !subflow -> fully_established && skb &&
364- subflow -> snd_isn == TCP_SKB_CB (skb )-> seq ) {
365- /* When skb is not available, we better over-estimate the
366- * emitted options len. A full DSS option is longer than
367- * TCPOLEN_MPTCP_MPC_ACK_DATA, so let's the caller try to fit
368- * that.
369- */
417+ /* MPC/MPJ needed only on 3rd ack packet */
418+ if (subflow -> fully_established ||
419+ subflow -> snd_isn != TCP_SKB_CB (skb )-> seq )
420+ return false;
421+
422+ if (subflow -> mp_capable ) {
370423 mpext = mptcp_get_ext (skb );
371424 data_len = mpext ? mpext -> data_len : 0 ;
372425
@@ -394,6 +447,14 @@ static bool mptcp_established_options_mp(struct sock *sk, struct sk_buff *skb,
394447 data_len );
395448
396449 return true;
450+ } else if (subflow -> mp_join ) {
451+ opts -> suboptions = OPTION_MPTCP_MPJ_ACK ;
452+ memcpy (opts -> hmac , subflow -> hmac , MPTCPOPT_HMAC_LEN );
453+ * size = TCPOLEN_MPTCP_MPJ_ACK ;
454+ pr_debug ("subflow=%p" , subflow );
455+
456+ schedule_3rdack_retransmission (sk );
457+ return true;
397458 }
398459 return false;
399460}
@@ -674,10 +735,12 @@ static bool check_fully_established(struct mptcp_sock *msk, struct sock *sk,
674735 return true;
675736
676737 subflow -> pm_notified = 1 ;
677- if (subflow -> mp_join )
738+ if (subflow -> mp_join ) {
739+ clear_3rdack_retransmission (sk );
678740 mptcp_pm_subflow_established (msk , subflow );
679- else
741+ } else {
680742 mptcp_pm_fully_established (msk );
743+ }
681744 return true;
682745}
683746
@@ -860,6 +923,16 @@ void mptcp_write_options(__be32 *ptr, struct mptcp_out_options *opts)
860923 0 , opts -> rm_id );
861924 }
862925
926+ if (OPTION_MPTCP_MPJ_SYN & opts -> suboptions ) {
927+ * ptr ++ = mptcp_option (MPTCPOPT_MP_JOIN ,
928+ TCPOLEN_MPTCP_MPJ_SYN ,
929+ opts -> backup , opts -> join_id );
930+ put_unaligned_be32 (opts -> token , ptr );
931+ ptr += 1 ;
932+ put_unaligned_be32 (opts -> nonce , ptr );
933+ ptr += 1 ;
934+ }
935+
863936 if (OPTION_MPTCP_MPJ_SYNACK & opts -> suboptions ) {
864937 * ptr ++ = mptcp_option (MPTCPOPT_MP_JOIN ,
865938 TCPOLEN_MPTCP_MPJ_SYNACK ,
@@ -870,6 +943,13 @@ void mptcp_write_options(__be32 *ptr, struct mptcp_out_options *opts)
870943 ptr += 1 ;
871944 }
872945
946+ if (OPTION_MPTCP_MPJ_ACK & opts -> suboptions ) {
947+ * ptr ++ = mptcp_option (MPTCPOPT_MP_JOIN ,
948+ TCPOLEN_MPTCP_MPJ_ACK , 0 , 0 );
949+ memcpy (ptr , opts -> hmac , MPTCPOPT_HMAC_LEN );
950+ ptr += 5 ;
951+ }
952+
873953 if (opts -> ext_copy .use_ack || opts -> ext_copy .use_map ) {
874954 struct mptcp_ext * mpext = & opts -> ext_copy ;
875955 u8 len = TCPOLEN_MPTCP_DSS_BASE ;
0 commit comments