@@ -1922,13 +1922,16 @@ static void mptcp_pm_nl_fullmesh(struct mptcp_sock *msk,
19221922 spin_unlock_bh (& msk -> pm .lock );
19231923}
19241924
1925- static int mptcp_nl_set_flags (struct net * net ,
1926- struct mptcp_addr_info * addr ,
1927- u8 bkup , u8 changed )
1925+ static void mptcp_nl_set_flags (struct net * net , struct mptcp_addr_info * addr ,
1926+ u8 flags , u8 changed )
19281927{
1928+ u8 is_subflow = !!(flags & MPTCP_PM_ADDR_FLAG_SUBFLOW );
1929+ u8 bkup = !!(flags & MPTCP_PM_ADDR_FLAG_BACKUP );
19291930 long s_slot = 0 , s_num = 0 ;
19301931 struct mptcp_sock * msk ;
1931- int ret = - EINVAL ;
1932+
1933+ if (changed == MPTCP_PM_ADDR_FLAG_FULLMESH && !is_subflow )
1934+ return ;
19321935
19331936 while ((msk = mptcp_token_iter_next (net , & s_slot , & s_num )) != NULL ) {
19341937 struct sock * sk = (struct sock * )msk ;
@@ -1938,8 +1941,9 @@ static int mptcp_nl_set_flags(struct net *net,
19381941
19391942 lock_sock (sk );
19401943 if (changed & MPTCP_PM_ADDR_FLAG_BACKUP )
1941- ret = mptcp_pm_nl_mp_prio_send_ack (msk , addr , NULL , bkup );
1942- if (changed & MPTCP_PM_ADDR_FLAG_FULLMESH )
1944+ mptcp_pm_nl_mp_prio_send_ack (msk , addr , NULL , bkup );
1945+ /* Subflows will only be recreated if the SUBFLOW flag is set */
1946+ if (is_subflow && (changed & MPTCP_PM_ADDR_FLAG_FULLMESH ))
19431947 mptcp_pm_nl_fullmesh (msk , addr );
19441948 release_sock (sk );
19451949
@@ -1948,7 +1952,7 @@ static int mptcp_nl_set_flags(struct net *net,
19481952 cond_resched ();
19491953 }
19501954
1951- return ret ;
1955+ return ;
19521956}
19531957
19541958int mptcp_pm_nl_set_flags (struct mptcp_pm_addr_entry * local ,
@@ -1961,7 +1965,6 @@ int mptcp_pm_nl_set_flags(struct mptcp_pm_addr_entry *local,
19611965 struct mptcp_pm_addr_entry * entry ;
19621966 struct pm_nl_pernet * pernet ;
19631967 u8 lookup_by_id = 0 ;
1964- u8 bkup = 0 ;
19651968
19661969 pernet = pm_nl_get_pernet (net );
19671970
@@ -1974,9 +1977,6 @@ int mptcp_pm_nl_set_flags(struct mptcp_pm_addr_entry *local,
19741977 }
19751978 }
19761979
1977- if (local -> flags & MPTCP_PM_ADDR_FLAG_BACKUP )
1978- bkup = 1 ;
1979-
19801980 spin_lock_bh (& pernet -> lock );
19811981 entry = lookup_by_id ? __lookup_addr_by_id (pernet , local -> addr .id ) :
19821982 __lookup_addr (pernet , & local -> addr );
@@ -1998,7 +1998,7 @@ int mptcp_pm_nl_set_flags(struct mptcp_pm_addr_entry *local,
19981998 * local = * entry ;
19991999 spin_unlock_bh (& pernet -> lock );
20002000
2001- mptcp_nl_set_flags (net , & local -> addr , bkup , changed );
2001+ mptcp_nl_set_flags (net , & local -> addr , entry -> flags , changed );
20022002 return 0 ;
20032003}
20042004
0 commit comments