@@ -392,18 +392,41 @@ static void mptcp_set_connected(struct sock *sk)
392392 mptcp_data_unlock (sk );
393393}
394394
395+ static void subflow_set_remote_key (struct mptcp_sock * msk ,
396+ struct mptcp_subflow_context * subflow ,
397+ const struct mptcp_options_received * mp_opt )
398+ {
399+ /* active MPC subflow will reach here multiple times:
400+ * at subflow_finish_connect() time and at 4th ack time
401+ */
402+ if (subflow -> remote_key_valid )
403+ return ;
404+
405+ subflow -> remote_key_valid = 1 ;
406+ subflow -> remote_key = mp_opt -> sndr_key ;
407+ mptcp_crypto_key_sha (subflow -> remote_key , NULL , & subflow -> iasn );
408+ subflow -> iasn ++ ;
409+
410+ WRITE_ONCE (msk -> remote_key , subflow -> remote_key );
411+ WRITE_ONCE (msk -> ack_seq , subflow -> iasn );
412+ WRITE_ONCE (msk -> can_ack , true);
413+ atomic64_set (& msk -> rcv_wnd_sent , subflow -> iasn );
414+ }
415+
395416static void subflow_finish_connect (struct sock * sk , const struct sk_buff * skb )
396417{
397418 struct mptcp_subflow_context * subflow = mptcp_subflow_ctx (sk );
398419 struct mptcp_options_received mp_opt ;
399420 struct sock * parent = subflow -> conn ;
421+ struct mptcp_sock * msk ;
400422
401423 subflow -> icsk_af_ops -> sk_rx_dst_set (sk , skb );
402424
403425 /* be sure no special action on any packet other than syn-ack */
404426 if (subflow -> conn_finished )
405427 return ;
406428
429+ msk = mptcp_sk (parent );
407430 mptcp_propagate_sndbuf (parent , sk );
408431 subflow -> rel_write_seq = 1 ;
409432 subflow -> conn_finished = 1 ;
@@ -416,19 +439,16 @@ static void subflow_finish_connect(struct sock *sk, const struct sk_buff *skb)
416439 MPTCP_INC_STATS (sock_net (sk ),
417440 MPTCP_MIB_MPCAPABLEACTIVEFALLBACK );
418441 mptcp_do_fallback (sk );
419- pr_fallback (mptcp_sk ( subflow -> conn ) );
442+ pr_fallback (msk );
420443 goto fallback ;
421444 }
422445
423446 if (mp_opt .suboptions & OPTION_MPTCP_CSUMREQD )
424- WRITE_ONCE (mptcp_sk ( parent ) -> csum_enabled , true);
447+ WRITE_ONCE (msk -> csum_enabled , true);
425448 if (mp_opt .deny_join_id0 )
426- WRITE_ONCE (mptcp_sk ( parent ) -> pm .remote_deny_join_id0 , true);
449+ WRITE_ONCE (msk -> pm .remote_deny_join_id0 , true);
427450 subflow -> mp_capable = 1 ;
428- subflow -> can_ack = 1 ;
429- subflow -> remote_key = mp_opt .sndr_key ;
430- pr_debug ("subflow=%p, remote_key=%llu" , subflow ,
431- subflow -> remote_key );
451+ subflow_set_remote_key (msk , subflow , & mp_opt );
432452 MPTCP_INC_STATS (sock_net (sk ), MPTCP_MIB_MPCAPABLEACTIVEACK );
433453 mptcp_finish_connect (sk );
434454 mptcp_set_connected (parent );
@@ -466,15 +486,15 @@ static void subflow_finish_connect(struct sock *sk, const struct sk_buff *skb)
466486 subflow -> mp_join = 1 ;
467487 MPTCP_INC_STATS (sock_net (sk ), MPTCP_MIB_JOINSYNACKRX );
468488
469- if (subflow_use_different_dport (mptcp_sk ( parent ) , sk )) {
489+ if (subflow_use_different_dport (msk , sk )) {
470490 pr_debug ("synack inet_dport=%d %d" ,
471491 ntohs (inet_sk (sk )-> inet_dport ),
472492 ntohs (inet_sk (parent )-> inet_dport ));
473493 MPTCP_INC_STATS (sock_net (sk ), MPTCP_MIB_JOINPORTSYNACKRX );
474494 }
475495 } else if (mptcp_check_fallback (sk )) {
476496fallback :
477- mptcp_rcv_space_init (mptcp_sk ( parent ) , sk );
497+ mptcp_rcv_space_init (msk , sk );
478498 mptcp_set_connected (parent );
479499 }
480500 return ;
@@ -637,13 +657,12 @@ static void subflow_drop_ctx(struct sock *ssk)
637657}
638658
639659void mptcp_subflow_fully_established (struct mptcp_subflow_context * subflow ,
640- struct mptcp_options_received * mp_opt )
660+ const struct mptcp_options_received * mp_opt )
641661{
642662 struct mptcp_sock * msk = mptcp_sk (subflow -> conn );
643663
644- subflow -> remote_key = mp_opt -> sndr_key ;
664+ subflow_set_remote_key ( msk , subflow , mp_opt ) ;
645665 subflow -> fully_established = 1 ;
646- subflow -> can_ack = 1 ;
647666 WRITE_ONCE (msk -> fully_established , true);
648667}
649668
@@ -1198,16 +1217,8 @@ static bool subflow_check_data_avail(struct sock *ssk)
11981217 if (WARN_ON_ONCE (!skb ))
11991218 goto no_data ;
12001219
1201- /* if msk lacks the remote key, this subflow must provide an
1202- * MP_CAPABLE-based mapping
1203- */
1204- if (unlikely (!READ_ONCE (msk -> can_ack ))) {
1205- if (!subflow -> mpc_map )
1206- goto fallback ;
1207- WRITE_ONCE (msk -> remote_key , subflow -> remote_key );
1208- WRITE_ONCE (msk -> ack_seq , subflow -> map_seq );
1209- WRITE_ONCE (msk -> can_ack , true);
1210- }
1220+ if (unlikely (!READ_ONCE (msk -> can_ack )))
1221+ goto fallback ;
12111222
12121223 old_ack = READ_ONCE (msk -> ack_seq );
12131224 ack_seq = mptcp_subflow_get_mapped_dsn (subflow );
@@ -1480,6 +1491,7 @@ int __mptcp_subflow_connect(struct sock *sk, const struct mptcp_addr_info *loc,
14801491
14811492 mptcp_pm_get_flags_and_ifindex_by_id (msk , local_id ,
14821493 & flags , & ifindex );
1494+ subflow -> remote_key_valid = 1 ;
14831495 subflow -> remote_key = msk -> remote_key ;
14841496 subflow -> local_key = msk -> local_key ;
14851497 subflow -> token = msk -> token ;
@@ -1873,6 +1885,7 @@ static void subflow_ulp_clone(const struct request_sock *req,
18731885 new_ctx -> ssn_offset = subflow_req -> ssn_offset ;
18741886 new_ctx -> mp_join = 1 ;
18751887 new_ctx -> fully_established = 1 ;
1888+ new_ctx -> remote_key_valid = 1 ;
18761889 new_ctx -> backup = subflow_req -> backup ;
18771890 new_ctx -> remote_id = subflow_req -> remote_id ;
18781891 new_ctx -> token = subflow_req -> token ;
0 commit comments