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 ---