mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-07 13:53:24 +00:00
net: bridge: move br_vlan_replay to br_switchdev.c
br_vlan_replay() is relevant only if CONFIG_NET_SWITCHDEV is enabled, so move it to br_switchdev.c. Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com> Acked-by: Nikolay Aleksandrov <nikolay@nvidia.com> Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
c5f6e5ebc2
commit
4a6849e461
@ -1459,9 +1459,6 @@ void br_vlan_notify(const struct net_bridge *br,
|
||||
const struct net_bridge_port *p,
|
||||
u16 vid, u16 vid_range,
|
||||
int cmd);
|
||||
int br_vlan_replay(struct net_device *br_dev, struct net_device *dev,
|
||||
const void *ctx, bool adding, struct notifier_block *nb,
|
||||
struct netlink_ext_ack *extack);
|
||||
bool br_vlan_can_enter_range(const struct net_bridge_vlan *v_curr,
|
||||
const struct net_bridge_vlan *range_end);
|
||||
|
||||
@ -1713,13 +1710,6 @@ static inline u16 br_vlan_flags(const struct net_bridge_vlan *v, u16 pvid)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int br_vlan_replay(struct net_device *br_dev,
|
||||
struct net_device *dev, const void *ctx,
|
||||
bool adding, struct notifier_block *nb,
|
||||
struct netlink_ext_ack *extack)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* br_vlan_options.c */
|
||||
|
@ -327,6 +327,91 @@ static int br_fdb_replay(const struct net_device *br_dev, const void *ctx,
|
||||
return err;
|
||||
}
|
||||
|
||||
static int br_vlan_replay_one(struct notifier_block *nb,
|
||||
struct net_device *dev,
|
||||
struct switchdev_obj_port_vlan *vlan,
|
||||
const void *ctx, unsigned long action,
|
||||
struct netlink_ext_ack *extack)
|
||||
{
|
||||
struct switchdev_notifier_port_obj_info obj_info = {
|
||||
.info = {
|
||||
.dev = dev,
|
||||
.extack = extack,
|
||||
.ctx = ctx,
|
||||
},
|
||||
.obj = &vlan->obj,
|
||||
};
|
||||
int err;
|
||||
|
||||
err = nb->notifier_call(nb, action, &obj_info);
|
||||
return notifier_to_errno(err);
|
||||
}
|
||||
|
||||
static int br_vlan_replay(struct net_device *br_dev, struct net_device *dev,
|
||||
const void *ctx, bool adding,
|
||||
struct notifier_block *nb,
|
||||
struct netlink_ext_ack *extack)
|
||||
{
|
||||
struct net_bridge_vlan_group *vg;
|
||||
struct net_bridge_vlan *v;
|
||||
struct net_bridge_port *p;
|
||||
struct net_bridge *br;
|
||||
unsigned long action;
|
||||
int err = 0;
|
||||
u16 pvid;
|
||||
|
||||
ASSERT_RTNL();
|
||||
|
||||
if (!nb)
|
||||
return 0;
|
||||
|
||||
if (!netif_is_bridge_master(br_dev))
|
||||
return -EINVAL;
|
||||
|
||||
if (!netif_is_bridge_master(dev) && !netif_is_bridge_port(dev))
|
||||
return -EINVAL;
|
||||
|
||||
if (netif_is_bridge_master(dev)) {
|
||||
br = netdev_priv(dev);
|
||||
vg = br_vlan_group(br);
|
||||
p = NULL;
|
||||
} else {
|
||||
p = br_port_get_rtnl(dev);
|
||||
if (WARN_ON(!p))
|
||||
return -EINVAL;
|
||||
vg = nbp_vlan_group(p);
|
||||
br = p->br;
|
||||
}
|
||||
|
||||
if (!vg)
|
||||
return 0;
|
||||
|
||||
if (adding)
|
||||
action = SWITCHDEV_PORT_OBJ_ADD;
|
||||
else
|
||||
action = SWITCHDEV_PORT_OBJ_DEL;
|
||||
|
||||
pvid = br_get_pvid(vg);
|
||||
|
||||
list_for_each_entry(v, &vg->vlan_list, vlist) {
|
||||
struct switchdev_obj_port_vlan vlan = {
|
||||
.obj.orig_dev = dev,
|
||||
.obj.id = SWITCHDEV_OBJ_ID_PORT_VLAN,
|
||||
.flags = br_vlan_flags(v, pvid),
|
||||
.vid = v->vid,
|
||||
};
|
||||
|
||||
if (!br_vlan_should_use(v))
|
||||
continue;
|
||||
|
||||
err = br_vlan_replay_one(nb, dev, &vlan, ctx, action, extack);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
static int nbp_switchdev_sync_objs(struct net_bridge_port *p, const void *ctx,
|
||||
struct notifier_block *atomic_nb,
|
||||
struct notifier_block *blocking_nb,
|
||||
|
@ -1860,90 +1860,6 @@ void br_vlan_notify(const struct net_bridge *br,
|
||||
kfree_skb(skb);
|
||||
}
|
||||
|
||||
static int br_vlan_replay_one(struct notifier_block *nb,
|
||||
struct net_device *dev,
|
||||
struct switchdev_obj_port_vlan *vlan,
|
||||
const void *ctx, unsigned long action,
|
||||
struct netlink_ext_ack *extack)
|
||||
{
|
||||
struct switchdev_notifier_port_obj_info obj_info = {
|
||||
.info = {
|
||||
.dev = dev,
|
||||
.extack = extack,
|
||||
.ctx = ctx,
|
||||
},
|
||||
.obj = &vlan->obj,
|
||||
};
|
||||
int err;
|
||||
|
||||
err = nb->notifier_call(nb, action, &obj_info);
|
||||
return notifier_to_errno(err);
|
||||
}
|
||||
|
||||
int br_vlan_replay(struct net_device *br_dev, struct net_device *dev,
|
||||
const void *ctx, bool adding, struct notifier_block *nb,
|
||||
struct netlink_ext_ack *extack)
|
||||
{
|
||||
struct net_bridge_vlan_group *vg;
|
||||
struct net_bridge_vlan *v;
|
||||
struct net_bridge_port *p;
|
||||
struct net_bridge *br;
|
||||
unsigned long action;
|
||||
int err = 0;
|
||||
u16 pvid;
|
||||
|
||||
ASSERT_RTNL();
|
||||
|
||||
if (!nb)
|
||||
return 0;
|
||||
|
||||
if (!netif_is_bridge_master(br_dev))
|
||||
return -EINVAL;
|
||||
|
||||
if (!netif_is_bridge_master(dev) && !netif_is_bridge_port(dev))
|
||||
return -EINVAL;
|
||||
|
||||
if (netif_is_bridge_master(dev)) {
|
||||
br = netdev_priv(dev);
|
||||
vg = br_vlan_group(br);
|
||||
p = NULL;
|
||||
} else {
|
||||
p = br_port_get_rtnl(dev);
|
||||
if (WARN_ON(!p))
|
||||
return -EINVAL;
|
||||
vg = nbp_vlan_group(p);
|
||||
br = p->br;
|
||||
}
|
||||
|
||||
if (!vg)
|
||||
return 0;
|
||||
|
||||
if (adding)
|
||||
action = SWITCHDEV_PORT_OBJ_ADD;
|
||||
else
|
||||
action = SWITCHDEV_PORT_OBJ_DEL;
|
||||
|
||||
pvid = br_get_pvid(vg);
|
||||
|
||||
list_for_each_entry(v, &vg->vlan_list, vlist) {
|
||||
struct switchdev_obj_port_vlan vlan = {
|
||||
.obj.orig_dev = dev,
|
||||
.obj.id = SWITCHDEV_OBJ_ID_PORT_VLAN,
|
||||
.flags = br_vlan_flags(v, pvid),
|
||||
.vid = v->vid,
|
||||
};
|
||||
|
||||
if (!br_vlan_should_use(v))
|
||||
continue;
|
||||
|
||||
err = br_vlan_replay_one(nb, dev, &vlan, ctx, action, extack);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
/* check if v_curr can enter a range ending in range_end */
|
||||
bool br_vlan_can_enter_range(const struct net_bridge_vlan *v_curr,
|
||||
const struct net_bridge_vlan *range_end)
|
||||
|
Loading…
Reference in New Issue
Block a user