Commit 4a6849e4 authored by Vladimir Oltean's avatar Vladimir Oltean Committed by Jakub Kicinski
Browse files

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: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
Acked-by: default avatarNikolay Aleksandrov <nikolay@nvidia.com>
Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent c5f6e5eb
Loading
Loading
Loading
Loading
+0 −10
Original line number Diff line number Diff line
@@ -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 */
+85 −0
Original line number Diff line number Diff line
@@ -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,
+0 −84
Original line number Diff line number Diff line
@@ -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)