@@ -1981,63 +1981,87 @@ static int mptcp_nl_set_flags(struct net *net,
19811981 return ret ;
19821982}
19831983
1984- int mptcp_pm_nl_set_flags (struct genl_info * info )
1984+ int mptcp_pm_nl_set_flags (struct mptcp_pm_addr_entry * local ,
1985+ struct mptcp_addr_info * remote ,
1986+ struct genl_info * info )
19851987{
1986- struct mptcp_pm_addr_entry addr = { .addr = { .family = AF_UNSPEC }, };
1987- struct nlattr * attr = info -> attrs [MPTCP_PM_ATTR_ADDR ];
19881988 u8 changed , mask = MPTCP_PM_ADDR_FLAG_BACKUP |
19891989 MPTCP_PM_ADDR_FLAG_FULLMESH ;
19901990 struct net * net = genl_info_net (info );
19911991 struct mptcp_pm_addr_entry * entry ;
19921992 struct pm_nl_pernet * pernet ;
19931993 u8 lookup_by_id = 0 ;
19941994 u8 bkup = 0 ;
1995- int ret ;
19961995
19971996 pernet = pm_nl_get_pernet (net );
19981997
1999- ret = mptcp_pm_parse_entry (attr , info , false, & addr );
2000- if (ret < 0 )
2001- return ret ;
2002-
2003- if (addr .addr .family == AF_UNSPEC ) {
1998+ if (local -> addr .family == AF_UNSPEC )
20041999 lookup_by_id = 1 ;
2005- if (!addr .addr .id ) {
2006- GENL_SET_ERR_MSG (info , "missing required inputs" );
2007- return - EOPNOTSUPP ;
2008- }
2009- }
20102000
2011- if (addr . flags & MPTCP_PM_ADDR_FLAG_BACKUP )
2001+ if (local -> flags & MPTCP_PM_ADDR_FLAG_BACKUP )
20122002 bkup = 1 ;
20132003
20142004 spin_lock_bh (& pernet -> lock );
2015- entry = lookup_by_id ? __lookup_addr_by_id (pernet , addr . addr .id ) :
2016- __lookup_addr (pernet , & addr . addr );
2005+ entry = lookup_by_id ? __lookup_addr_by_id (pernet , local -> addr .id ) :
2006+ __lookup_addr (pernet , & local -> addr );
20172007 if (!entry ) {
20182008 spin_unlock_bh (& pernet -> lock );
20192009 GENL_SET_ERR_MSG (info , "address not found" );
20202010 return - EINVAL ;
20212011 }
2022- if ((addr . flags & MPTCP_PM_ADDR_FLAG_FULLMESH ) &&
2012+ if ((local -> flags & MPTCP_PM_ADDR_FLAG_FULLMESH ) &&
20232013 (entry -> flags & MPTCP_PM_ADDR_FLAG_SIGNAL )) {
20242014 spin_unlock_bh (& pernet -> lock );
20252015 GENL_SET_ERR_MSG (info , "invalid addr flags" );
20262016 return - EINVAL ;
20272017 }
20282018
2029- changed = (addr . flags ^ entry -> flags ) & mask ;
2030- entry -> flags = (entry -> flags & ~mask ) | (addr . flags & mask );
2031- addr = * entry ;
2019+ changed = (local -> flags ^ entry -> flags ) & mask ;
2020+ entry -> flags = (entry -> flags & ~mask ) | (local -> flags & mask );
2021+ * local = * entry ;
20322022 spin_unlock_bh (& pernet -> lock );
20332023
2034- mptcp_nl_set_flags (net , & addr . addr , bkup , changed );
2024+ mptcp_nl_set_flags (net , & local -> addr , bkup , changed );
20352025 return 0 ;
20362026}
20372027
20382028int mptcp_pm_nl_set_flags_doit (struct sk_buff * skb , struct genl_info * info )
20392029{
2040- return mptcp_pm_set_flags (info );
2030+ struct mptcp_pm_addr_entry loc = { .addr = { .family = AF_UNSPEC }, };
2031+ struct nlattr * attr_rem = info -> attrs [MPTCP_PM_ATTR_ADDR_REMOTE ];
2032+ struct mptcp_addr_info rem = { .family = AF_UNSPEC , };
2033+ struct nlattr * attr_loc ;
2034+ int ret ;
2035+
2036+ if (GENL_REQ_ATTR_CHECK (info , MPTCP_PM_ATTR_ADDR ))
2037+ return - EINVAL ;
2038+
2039+ attr_loc = info -> attrs [MPTCP_PM_ATTR_ADDR ];
2040+ ret = mptcp_pm_parse_entry (attr_loc , info , false, & loc );
2041+ if (ret < 0 )
2042+ return ret ;
2043+
2044+ if (loc .addr .family == AF_UNSPEC ) {
2045+ if (!loc .addr .id ) {
2046+ NL_SET_ERR_MSG_ATTR (info -> extack , attr_loc ,
2047+ "missing address ID" );
2048+ return - EOPNOTSUPP ;
2049+ }
2050+ }
2051+
2052+ if (attr_rem ) {
2053+ ret = mptcp_pm_parse_addr (attr_rem , info , & rem );
2054+ if (ret < 0 )
2055+ return ret ;
2056+
2057+ if (rem .family == AF_UNSPEC ) {
2058+ NL_SET_ERR_MSG_ATTR (info -> extack , attr_rem ,
2059+ "invalid remote address family" );
2060+ return - EINVAL ;
2061+ }
2062+ }
2063+
2064+ return mptcp_pm_set_flags (& loc , & rem , info );
20412065}
20422066
20432067static void mptcp_nl_mcast_send (struct net * net , struct sk_buff * nlskb , gfp_t gfp )
0 commit comments