br_fdb.c (e887b2df62513505ac6f6db2cb59ee6234ab042b) | br_fdb.c (0d2cfbd41c4a5a0ca5598d1874b1081138cd64c6) |
---|---|
1// SPDX-License-Identifier: GPL-2.0-or-later 2/* 3 * Forwarding database 4 * Linux ethernet bridge 5 * 6 * Authors: 7 * Lennert Buytenhek <buytenh@gnu.org> 8 */ --- 714 unchanged lines hidden (view full) --- 723 + nla_total_size(sizeof(u16)) /* NDA_VLAN */ 724 + nla_total_size(sizeof(struct nda_cacheinfo)) 725 + nla_total_size(0) /* NDA_FDB_EXT_ATTRS */ 726 + nla_total_size(sizeof(u8)); /* NFEA_ACTIVITY_NOTIFY */ 727} 728 729static int br_fdb_replay_one(struct notifier_block *nb, 730 struct net_bridge_fdb_entry *fdb, | 1// SPDX-License-Identifier: GPL-2.0-or-later 2/* 3 * Forwarding database 4 * Linux ethernet bridge 5 * 6 * Authors: 7 * Lennert Buytenhek <buytenh@gnu.org> 8 */ --- 714 unchanged lines hidden (view full) --- 723 + nla_total_size(sizeof(u16)) /* NDA_VLAN */ 724 + nla_total_size(sizeof(struct nda_cacheinfo)) 725 + nla_total_size(0) /* NDA_FDB_EXT_ATTRS */ 726 + nla_total_size(sizeof(u8)); /* NFEA_ACTIVITY_NOTIFY */ 727} 728 729static int br_fdb_replay_one(struct notifier_block *nb, 730 struct net_bridge_fdb_entry *fdb, |
731 struct net_device *dev) | 731 struct net_device *dev, const void *ctx) |
732{ 733 struct switchdev_notifier_fdb_info item; 734 int err; 735 736 item.addr = fdb->key.addr.addr; 737 item.vid = fdb->key.vlan_id; 738 item.added_by_user = test_bit(BR_FDB_ADDED_BY_USER, &fdb->flags); 739 item.offloaded = test_bit(BR_FDB_OFFLOADED, &fdb->flags); 740 item.is_local = test_bit(BR_FDB_LOCAL, &fdb->flags); 741 item.info.dev = dev; | 732{ 733 struct switchdev_notifier_fdb_info item; 734 int err; 735 736 item.addr = fdb->key.addr.addr; 737 item.vid = fdb->key.vlan_id; 738 item.added_by_user = test_bit(BR_FDB_ADDED_BY_USER, &fdb->flags); 739 item.offloaded = test_bit(BR_FDB_OFFLOADED, &fdb->flags); 740 item.is_local = test_bit(BR_FDB_LOCAL, &fdb->flags); 741 item.info.dev = dev; |
742 item.info.ctx = ctx; |
|
742 743 err = nb->notifier_call(nb, SWITCHDEV_FDB_ADD_TO_DEVICE, &item); 744 return notifier_to_errno(err); 745} 746 747int br_fdb_replay(struct net_device *br_dev, struct net_device *dev, | 743 744 err = nb->notifier_call(nb, SWITCHDEV_FDB_ADD_TO_DEVICE, &item); 745 return notifier_to_errno(err); 746} 747 748int br_fdb_replay(struct net_device *br_dev, struct net_device *dev, |
748 struct notifier_block *nb) | 749 const void *ctx, struct notifier_block *nb) |
749{ 750 struct net_bridge_fdb_entry *fdb; 751 struct net_bridge *br; 752 int err = 0; 753 754 if (!netif_is_bridge_master(br_dev) || !netif_is_bridge_port(dev)) 755 return -EINVAL; 756 --- 4 unchanged lines hidden (view full) --- 761 hlist_for_each_entry_rcu(fdb, &br->fdb_list, fdb_node) { 762 struct net_bridge_port *dst = READ_ONCE(fdb->dst); 763 struct net_device *dst_dev; 764 765 dst_dev = dst ? dst->dev : br->dev; 766 if (dst_dev != br_dev && dst_dev != dev) 767 continue; 768 | 750{ 751 struct net_bridge_fdb_entry *fdb; 752 struct net_bridge *br; 753 int err = 0; 754 755 if (!netif_is_bridge_master(br_dev) || !netif_is_bridge_port(dev)) 756 return -EINVAL; 757 --- 4 unchanged lines hidden (view full) --- 762 hlist_for_each_entry_rcu(fdb, &br->fdb_list, fdb_node) { 763 struct net_bridge_port *dst = READ_ONCE(fdb->dst); 764 struct net_device *dst_dev; 765 766 dst_dev = dst ? dst->dev : br->dev; 767 if (dst_dev != br_dev && dst_dev != dev) 768 continue; 769 |
769 err = br_fdb_replay_one(nb, fdb, dst_dev); | 770 err = br_fdb_replay_one(nb, fdb, dst_dev, ctx); |
770 if (err) 771 break; 772 } 773 774 rcu_read_unlock(); 775 776 return err; 777} --- 578 unchanged lines hidden --- | 771 if (err) 772 break; 773 } 774 775 rcu_read_unlock(); 776 777 return err; 778} --- 578 unchanged lines hidden --- |