@@ -1159,7 +1159,7 @@ static int fdb_add_entry(struct net_bridge *br, struct net_bridge_port *source,
11591159static int __br_fdb_add (struct ndmsg * ndm , struct net_bridge * br ,
11601160 struct net_bridge_port * p , const unsigned char * addr ,
11611161 u16 nlh_flags , u16 vid , struct nlattr * nfea_tb [],
1162- struct netlink_ext_ack * extack )
1162+ bool * notified , struct netlink_ext_ack * extack )
11631163{
11641164 int err = 0 ;
11651165
@@ -1190,6 +1190,8 @@ static int __br_fdb_add(struct ndmsg *ndm, struct net_bridge *br,
11901190 spin_unlock_bh (& br -> hash_lock );
11911191 }
11921192
1193+ if (!err )
1194+ * notified = true;
11931195 return err ;
11941196}
11951197
@@ -1202,7 +1204,7 @@ static const struct nla_policy br_nda_fdb_pol[NFEA_MAX + 1] = {
12021204int br_fdb_add (struct ndmsg * ndm , struct nlattr * tb [],
12031205 struct net_device * dev ,
12041206 const unsigned char * addr , u16 vid , u16 nlh_flags ,
1205- struct netlink_ext_ack * extack )
1207+ bool * notified , struct netlink_ext_ack * extack )
12061208{
12071209 struct nlattr * nfea_tb [NFEA_MAX + 1 ], * attr ;
12081210 struct net_bridge_vlan_group * vg ;
@@ -1265,10 +1267,10 @@ int br_fdb_add(struct ndmsg *ndm, struct nlattr *tb[],
12651267
12661268 /* VID was specified, so use it. */
12671269 err = __br_fdb_add (ndm , br , p , addr , nlh_flags , vid , nfea_tb ,
1268- extack );
1270+ notified , extack );
12691271 } else {
12701272 err = __br_fdb_add (ndm , br , p , addr , nlh_flags , 0 , nfea_tb ,
1271- extack );
1273+ notified , extack );
12721274 if (err || !vg || !vg -> num_vlans )
12731275 goto out ;
12741276
@@ -1280,7 +1282,7 @@ int br_fdb_add(struct ndmsg *ndm, struct nlattr *tb[],
12801282 if (!br_vlan_should_use (v ))
12811283 continue ;
12821284 err = __br_fdb_add (ndm , br , p , addr , nlh_flags , v -> vid ,
1283- nfea_tb , extack );
1285+ nfea_tb , notified , extack );
12841286 if (err )
12851287 goto out ;
12861288 }
@@ -1292,7 +1294,7 @@ int br_fdb_add(struct ndmsg *ndm, struct nlattr *tb[],
12921294
12931295static int fdb_delete_by_addr_and_port (struct net_bridge * br ,
12941296 const struct net_bridge_port * p ,
1295- const u8 * addr , u16 vlan )
1297+ const u8 * addr , u16 vlan , bool * notified )
12961298{
12971299 struct net_bridge_fdb_entry * fdb ;
12981300
@@ -1301,18 +1303,19 @@ static int fdb_delete_by_addr_and_port(struct net_bridge *br,
13011303 return - ENOENT ;
13021304
13031305 fdb_delete (br , fdb , true);
1306+ * notified = true;
13041307
13051308 return 0 ;
13061309}
13071310
13081311static int __br_fdb_delete (struct net_bridge * br ,
13091312 const struct net_bridge_port * p ,
1310- const unsigned char * addr , u16 vid )
1313+ const unsigned char * addr , u16 vid , bool * notified )
13111314{
13121315 int err ;
13131316
13141317 spin_lock_bh (& br -> hash_lock );
1315- err = fdb_delete_by_addr_and_port (br , p , addr , vid );
1318+ err = fdb_delete_by_addr_and_port (br , p , addr , vid , notified );
13161319 spin_unlock_bh (& br -> hash_lock );
13171320
13181321 return err ;
@@ -1321,7 +1324,7 @@ static int __br_fdb_delete(struct net_bridge *br,
13211324/* Remove neighbor entry with RTM_DELNEIGH */
13221325int br_fdb_delete (struct ndmsg * ndm , struct nlattr * tb [],
13231326 struct net_device * dev ,
1324- const unsigned char * addr , u16 vid ,
1327+ const unsigned char * addr , u16 vid , bool * notified ,
13251328 struct netlink_ext_ack * extack )
13261329{
13271330 struct net_bridge_vlan_group * vg ;
@@ -1351,17 +1354,17 @@ int br_fdb_delete(struct ndmsg *ndm, struct nlattr *tb[],
13511354 return - EINVAL ;
13521355 }
13531356
1354- err = __br_fdb_delete (br , p , addr , vid );
1357+ err = __br_fdb_delete (br , p , addr , vid , notified );
13551358 } else {
13561359 err = - ENOENT ;
1357- err &= __br_fdb_delete (br , p , addr , 0 );
1360+ err &= __br_fdb_delete (br , p , addr , 0 , notified );
13581361 if (!vg || !vg -> num_vlans )
13591362 return err ;
13601363
13611364 list_for_each_entry (v , & vg -> vlan_list , vlist ) {
13621365 if (!br_vlan_should_use (v ))
13631366 continue ;
1364- err &= __br_fdb_delete (br , p , addr , v -> vid );
1367+ err &= __br_fdb_delete (br , p , addr , v -> vid , notified );
13651368 }
13661369 }
13671370
0 commit comments