]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - net/8021q/vlan_dev.c
Merge branch 'kbuild' of git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild
[karo-tx-linux.git] / net / 8021q / vlan_dev.c
index 118956448cf6e4aa9a3609ccf7455a04596e24bf..01d7ba840df8dbf48b07e3c8697bb7c11f424a8d 100644 (file)
 #include <linux/if_vlan.h>
 #include <linux/netpoll.h>
 
-/*
- *     Rebuild the Ethernet MAC header. This is called after an ARP
- *     (or in future other address resolution) has completed on this
- *     sk_buff. We now let ARP fill in the other fields.
- *
- *     This routine CANNOT use cached dst->neigh!
- *     Really, it is used only when dst->neigh is wrong.
- *
- * TODO:  This needs a checkup, I'm ignorant here. --BLG
- */
-static int vlan_dev_rebuild_header(struct sk_buff *skb)
-{
-       struct net_device *dev = skb->dev;
-       struct vlan_ethhdr *veth = (struct vlan_ethhdr *)(skb->data);
-
-       switch (veth->h_vlan_encapsulated_proto) {
-#ifdef CONFIG_INET
-       case htons(ETH_P_IP):
-
-               /* TODO:  Confirm this will work with VLAN headers... */
-               return arp_find(veth->h_dest, skb);
-#endif
-       default:
-               pr_debug("%s: unable to resolve type %X addresses\n",
-                        dev->name, ntohs(veth->h_vlan_encapsulated_proto));
-
-               ether_addr_copy(veth->h_source, dev->dev_addr);
-               break;
-       }
-
-       return 0;
-}
-
 /*
  *     Create the VLAN header for an arbitrary protocol layer
  *
@@ -534,7 +501,6 @@ static int vlan_dev_get_lock_subclass(struct net_device *dev)
 
 static const struct header_ops vlan_header_ops = {
        .create  = vlan_dev_hard_header,
-       .rebuild = vlan_dev_rebuild_header,
        .parse   = eth_header_parse,
 };
 
@@ -554,7 +520,6 @@ static int vlan_passthru_hard_header(struct sk_buff *skb, struct net_device *dev
 
 static const struct header_ops vlan_passthru_header_ops = {
        .create  = vlan_passthru_hard_header,
-       .rebuild = dev_rebuild_header,
        .parse   = eth_header_parse,
 };
 
@@ -573,7 +538,6 @@ static int vlan_dev_init(struct net_device *dev)
        /* IFF_BROADCAST|IFF_MULTICAST; ??? */
        dev->flags  = real_dev->flags & ~(IFF_UP | IFF_PROMISC | IFF_ALLMULTI |
                                          IFF_MASTER | IFF_SLAVE);
-       dev->iflink = real_dev->ifindex;
        dev->state  = (real_dev->state & ((1<<__LINK_STATE_NOCARRIER) |
                                          (1<<__LINK_STATE_DORMANT))) |
                      (1<<__LINK_STATE_PRESENT);
@@ -589,6 +553,7 @@ static int vlan_dev_init(struct net_device *dev)
        if (dev->features & NETIF_F_VLAN_FEATURES)
                netdev_warn(real_dev, "VLAN features are set incorrectly.  Q-in-Q configurations may not work correctly.\n");
 
+       dev->vlan_features = real_dev->vlan_features & ~NETIF_F_ALL_FCOE;
 
        /* ipv6 shared card related stuff */
        dev->dev_id = real_dev->dev_id;
@@ -767,6 +732,13 @@ static void vlan_dev_netpoll_cleanup(struct net_device *dev)
 }
 #endif /* CONFIG_NET_POLL_CONTROLLER */
 
+static int vlan_dev_get_iflink(const struct net_device *dev)
+{
+       struct net_device *real_dev = vlan_dev_priv(dev)->real_dev;
+
+       return real_dev->ifindex;
+}
+
 static const struct ethtool_ops vlan_ethtool_ops = {
        .get_settings           = vlan_ethtool_get_settings,
        .get_drvinfo            = vlan_ethtool_get_drvinfo,
@@ -803,6 +775,7 @@ static const struct net_device_ops vlan_netdev_ops = {
 #endif
        .ndo_fix_features       = vlan_dev_fix_features,
        .ndo_get_lock_subclass  = vlan_dev_get_lock_subclass,
+       .ndo_get_iflink         = vlan_dev_get_iflink,
 };
 
 static void vlan_dev_free(struct net_device *dev)
@@ -827,5 +800,5 @@ void vlan_setup(struct net_device *dev)
        dev->destructor         = vlan_dev_free;
        dev->ethtool_ops        = &vlan_ethtool_ops;
 
-       memset(dev->broadcast, 0, ETH_ALEN);
+       eth_zero_addr(dev->broadcast);
 }