Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c1d3ee99 authored by Patrick McHardy's avatar Patrick McHardy Committed by David S. Miller
Browse files

[VLAN]: Split up device checks



Move the checks of the underlying device to a seperate function.

Signed-off-by: default avatarPatrick McHardy <kaber@trash.net>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 42429aae
Loading
Loading
Loading
Loading
+32 −24
Original line number Original line Diff line number Diff line
@@ -410,57 +410,65 @@ static void vlan_transfer_operstate(const struct net_device *dev, struct net_dev
	}
	}
}
}


/*  Attach a VLAN device to a mac address (ie Ethernet Card).
static int vlan_check_real_dev(struct net_device *real_dev, unsigned short vlan_id)
 *  Returns the device that was created, or NULL if there was
 *  an error of some kind.
 */
static struct net_device *register_vlan_device(struct net_device *real_dev,
					       unsigned short VLAN_ID)
{
{
	struct vlan_group *grp, *ngrp = NULL;
	struct net_device *new_dev;
	char name[IFNAMSIZ];

#ifdef VLAN_DEBUG
	printk(VLAN_DBG "%s: if_name -:%s:-	vid: %i\n",
		__FUNCTION__, eth_IF_name, VLAN_ID);
#endif

	if (VLAN_ID >= VLAN_VID_MASK)
		goto out_ret_null;

	if (real_dev->features & NETIF_F_VLAN_CHALLENGED) {
	if (real_dev->features & NETIF_F_VLAN_CHALLENGED) {
		printk(VLAN_DBG "%s: VLANs not supported on %s.\n",
		printk(VLAN_DBG "%s: VLANs not supported on %s.\n",
			__FUNCTION__, real_dev->name);
			__FUNCTION__, real_dev->name);
		goto out_ret_null;
		return -EOPNOTSUPP;
	}
	}


	if ((real_dev->features & NETIF_F_HW_VLAN_RX) &&
	if ((real_dev->features & NETIF_F_HW_VLAN_RX) &&
	    !real_dev->vlan_rx_register) {
	    !real_dev->vlan_rx_register) {
		printk(VLAN_DBG "%s: Device %s has buggy VLAN hw accel.\n",
		printk(VLAN_DBG "%s: Device %s has buggy VLAN hw accel.\n",
			__FUNCTION__, real_dev->name);
			__FUNCTION__, real_dev->name);
		goto out_ret_null;
		return -EOPNOTSUPP;
	}
	}


	if ((real_dev->features & NETIF_F_HW_VLAN_FILTER) &&
	if ((real_dev->features & NETIF_F_HW_VLAN_FILTER) &&
	    (!real_dev->vlan_rx_add_vid || !real_dev->vlan_rx_kill_vid)) {
	    (!real_dev->vlan_rx_add_vid || !real_dev->vlan_rx_kill_vid)) {
		printk(VLAN_DBG "%s: Device %s has buggy VLAN hw accel.\n",
		printk(VLAN_DBG "%s: Device %s has buggy VLAN hw accel.\n",
			__FUNCTION__, real_dev->name);
			__FUNCTION__, real_dev->name);
		goto out_ret_null;
		return -EOPNOTSUPP;
	}
	}


	/* The real device must be up and operating in order to
	/* The real device must be up and operating in order to
	 * assosciate a VLAN device with it.
	 * assosciate a VLAN device with it.
	 */
	 */
	if (!(real_dev->flags & IFF_UP))
	if (!(real_dev->flags & IFF_UP))
		goto out_ret_null;
		return -ENETDOWN;


	if (__find_vlan_dev(real_dev, VLAN_ID) != NULL) {
	if (__find_vlan_dev(real_dev, vlan_id) != NULL) {
		/* was already registered. */
		/* was already registered. */
		printk(VLAN_DBG "%s: ALREADY had VLAN registered\n", __FUNCTION__);
		printk(VLAN_DBG "%s: ALREADY had VLAN registered\n", __FUNCTION__);
		goto out_ret_null;
		return -EEXIST;
	}
	}


	return 0;
}

/*  Attach a VLAN device to a mac address (ie Ethernet Card).
 *  Returns the device that was created, or NULL if there was
 *  an error of some kind.
 */
static struct net_device *register_vlan_device(struct net_device *real_dev,
					       unsigned short VLAN_ID)
{
	struct vlan_group *grp, *ngrp = NULL;
	struct net_device *new_dev;
	char name[IFNAMSIZ];

#ifdef VLAN_DEBUG
	printk(VLAN_DBG "%s: if_name -:%s:-	vid: %i\n",
		__FUNCTION__, eth_IF_name, VLAN_ID);
#endif

	if (VLAN_ID >= VLAN_VID_MASK)
		goto out_ret_null;

	if (vlan_check_real_dev(real_dev, VLAN_ID) < 0)
		goto out_ret_null;

	/* Gotta set up the fields for the device. */
	/* Gotta set up the fields for the device. */
#ifdef VLAN_DEBUG
#ifdef VLAN_DEBUG
	printk(VLAN_DBG "About to allocate name, vlan_name_type: %i\n",
	printk(VLAN_DBG "About to allocate name, vlan_name_type: %i\n",