@@ -328,6 +328,16 @@ bool mptcp_syn_options(struct sock *sk, const struct sk_buff *skb,
328
328
opts -> sndr_key = subflow -> local_key ;
329
329
* size = TCPOLEN_MPTCP_MPC_SYN ;
330
330
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;
331
341
}
332
342
return false;
333
343
}
@@ -337,16 +347,55 @@ void mptcp_rcv_synsent(struct sock *sk)
337
347
struct mptcp_subflow_context * subflow = mptcp_subflow_ctx (sk );
338
348
struct tcp_sock * tp = tcp_sk (sk );
339
349
340
- pr_debug ("subflow=%p" , subflow );
341
350
if (subflow -> request_mptcp && tp -> rx_opt .mptcp .mp_capable ) {
342
351
subflow -> mp_capable = 1 ;
343
352
subflow -> can_ack = 1 ;
344
353
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 ) {
346
363
tcp_sk (sk )-> is_mptcp = 0 ;
347
364
}
348
365
}
349
366
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
+
350
399
static bool mptcp_established_options_mp (struct sock * sk , struct sk_buff * skb ,
351
400
unsigned int * size ,
352
401
unsigned int remaining ,
@@ -356,17 +405,21 @@ static bool mptcp_established_options_mp(struct sock *sk, struct sk_buff *skb,
356
405
struct mptcp_ext * mpext ;
357
406
unsigned int data_len ;
358
407
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;
362
416
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 ) {
370
423
mpext = mptcp_get_ext (skb );
371
424
data_len = mpext ? mpext -> data_len : 0 ;
372
425
@@ -394,6 +447,14 @@ static bool mptcp_established_options_mp(struct sock *sk, struct sk_buff *skb,
394
447
data_len );
395
448
396
449
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;
397
458
}
398
459
return false;
399
460
}
@@ -674,10 +735,12 @@ static bool check_fully_established(struct mptcp_sock *msk, struct sock *sk,
674
735
return true;
675
736
676
737
subflow -> pm_notified = 1 ;
677
- if (subflow -> mp_join )
738
+ if (subflow -> mp_join ) {
739
+ clear_3rdack_retransmission (sk );
678
740
mptcp_pm_subflow_established (msk , subflow );
679
- else
741
+ } else {
680
742
mptcp_pm_fully_established (msk );
743
+ }
681
744
return true;
682
745
}
683
746
@@ -860,6 +923,16 @@ void mptcp_write_options(__be32 *ptr, struct mptcp_out_options *opts)
860
923
0 , opts -> rm_id );
861
924
}
862
925
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
+
863
936
if (OPTION_MPTCP_MPJ_SYNACK & opts -> suboptions ) {
864
937
* ptr ++ = mptcp_option (MPTCPOPT_MP_JOIN ,
865
938
TCPOLEN_MPTCP_MPJ_SYNACK ,
@@ -870,6 +943,13 @@ void mptcp_write_options(__be32 *ptr, struct mptcp_out_options *opts)
870
943
ptr += 1 ;
871
944
}
872
945
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
+
873
953
if (opts -> ext_copy .use_ack || opts -> ext_copy .use_map ) {
874
954
struct mptcp_ext * mpext = & opts -> ext_copy ;
875
955
u8 len = TCPOLEN_MPTCP_DSS_BASE ;
0 commit comments