/* We have 12 bits of vlan ID.
*
- * We must not drop the vlan_group_lock until we hold a
+ * We must not drop allow preempt until we hold a
* reference to the device (netif_rx does that) or we
* fail.
*/
- spin_lock_bh(&vlan_group_lock);
+ rcu_read_lock();
skb->dev = __find_vlan_dev(dev, vid);
if (!skb->dev) {
- spin_unlock_bh(&vlan_group_lock);
+ rcu_read_unlock();
#ifdef VLAN_DEBUG
printk(VLAN_DBG "%s: ERROR: No net_device for VID: %i on dev: %s [%i]\n",
*/
if (dev != VLAN_DEV_INFO(skb->dev)->real_dev) {
- spin_unlock_bh(&vlan_group_lock);
+ rcu_read_unlock();
#ifdef VLAN_DEBUG
printk(VLAN_DBG "%s: dropping skb: %p because came in on wrong device, dev: %s real_dev: %s, skb_dev: %s\n",
/* TODO: Add a more specific counter here. */
stats->rx_errors++;
}
- spin_unlock_bh(&vlan_group_lock);
+ rcu_read_lock();
return 0;
}
/* TODO: Add a more specific counter here. */
stats->rx_errors++;
}
- spin_unlock_bh(&vlan_group_lock);
+ rcu_read_unlock();
return 0;
}
/* TODO: Add a more specific counter here. */
stats->rx_errors++;
}
- spin_unlock_bh(&vlan_group_lock);
+ rcu_read_unlock();
return 0;
}
struct dev_mc_list *dmi = dev->mc_list;
while (dmi) {
- dev_mc_delete(dev, dmi->dmi_addr, dmi->dmi_addrlen, 0);
printk(KERN_DEBUG "%s: del %.2x:%.2x:%.2x:%.2x:%.2x:%.2x mcast address from vlan interface\n",
dev->name,
dmi->dmi_addr[0],
dmi->dmi_addr[3],
dmi->dmi_addr[4],
dmi->dmi_addr[5]);
+ dev_mc_delete(dev, dmi->dmi_addr, dmi->dmi_addrlen, 0);
dmi = dev->mc_list;
}
vlan_flush_mc_list(dev);
return 0;
}
+
+int vlan_dev_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
+{
+ struct net_device *real_dev = VLAN_DEV_INFO(dev)->real_dev;
+ struct ifreq ifrr;
+ int err = -EOPNOTSUPP;
+
+ strncpy(ifrr.ifr_name, real_dev->name, IFNAMSIZ);
+ ifrr.ifr_ifru = ifr->ifr_ifru;
+
+ switch(cmd) {
+ case SIOCGMIIPHY:
+ case SIOCGMIIREG:
+ case SIOCSMIIREG:
+ if (real_dev->do_ioctl && netif_device_present(real_dev))
+ err = real_dev->do_ioctl(dev, &ifrr, cmd);
+ break;
+
+ case SIOCETHTOOL:
+ err = dev_ethtool(&ifrr);
+ }
+
+ if (!err)
+ ifr->ifr_ifru = ifrr.ifr_ifru;
+
+ return err;
+}
+
/** Taken from Gleb + Lennert's VLAN code, and modified... */
void vlan_dev_set_multicast_list(struct net_device *vlan_dev)
{