Merge branch 'powerpc-next' of master.kernel.org:/pub/scm/linux/kernel/git/galak...
[cascardo/linux.git] / net / 8021q / vlan_dev.c
index fc60c6d..c961f08 100644 (file)
@@ -153,9 +153,6 @@ int vlan_skb_recv(struct sk_buff *skb, struct net_device *dev,
        struct net_device_stats *stats;
        unsigned short vlan_TCI;
 
-       if (dev->nd_net != &init_net)
-               goto err_free;
-
        skb = skb_share_check(skb, GFP_ATOMIC);
        if (skb == NULL)
                goto err_free;
@@ -171,7 +168,7 @@ int vlan_skb_recv(struct sk_buff *skb, struct net_device *dev,
        skb->dev = __find_vlan_dev(dev, vid);
        if (!skb->dev) {
                pr_debug("%s: ERROR: No net_device for VID: %u on dev: %s\n",
-                        __FUNCTION__, (unsigned int)vid, dev->name);
+                        __func__, (unsigned int)vid, dev->name);
                goto err_unlock;
        }
 
@@ -187,7 +184,7 @@ int vlan_skb_recv(struct sk_buff *skb, struct net_device *dev,
                                                  ntohs(vhdr->h_vlan_TCI));
 
        pr_debug("%s: priority: %u for TCI: %hu\n",
-                __FUNCTION__, skb->priority, ntohs(vhdr->h_vlan_TCI));
+                __func__, skb->priority, ntohs(vhdr->h_vlan_TCI));
 
        switch (skb->pkt_type) {
        case PACKET_BROADCAST: /* Yeah, stats collect these together.. */
@@ -268,7 +265,7 @@ static int vlan_dev_hard_header(struct sk_buff *skb, struct net_device *dev,
        struct net_device *vdev = dev;
 
        pr_debug("%s: skb: %p type: %hx len: %u vlan_id: %hx, daddr: %p\n",
-                __FUNCTION__, skb, type, len, vlan_dev_info(dev)->vlan_id,
+                __func__, skb, type, len, vlan_dev_info(dev)->vlan_id,
                 daddr);
 
        /* build vlan header only if re_order_header flag is NOT set.  This
@@ -340,7 +337,7 @@ static int vlan_dev_hard_header(struct sk_buff *skb, struct net_device *dev,
                        return -ENOMEM;
                }
                vlan_dev_info(vdev)->cnt_inc_headroom_on_tx++;
-               pr_debug("%s: %s: had to grow skb\n", __FUNCTION__, vdev->name);
+               pr_debug("%s: %s: had to grow skb\n", __func__, vdev->name);
        }
 
        if (build_vlan_header) {
@@ -366,8 +363,7 @@ static int vlan_dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
 {
        struct net_device_stats *stats = &dev->stats;
        struct vlan_ethhdr *veth = (struct vlan_ethhdr *)(skb->data);
-       DECLARE_MAC_BUF(mac);
-       DECLARE_MAC_BUF(mac2);
+
        /* Handle non-VLAN frames if they are sent to us, for example by DHCP.
         *
         * NOTE: THIS ASSUMES DIX ETHERNET, SPECIFICALLY NOT SUPPORTING
@@ -383,7 +379,7 @@ static int vlan_dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
                vlan_dev_info(dev)->cnt_encap_on_xmit++;
 
                pr_debug("%s: proto to encap: 0x%hx\n",
-                        __FUNCTION__, htons(veth->h_vlan_proto));
+                        __func__, ntohs(veth->h_vlan_proto));
                /* Construct the second two bytes. This field looks something
                 * like:
                 * usr_priority: 3 bits  (high bits)
@@ -404,9 +400,12 @@ static int vlan_dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
        }
 
        pr_debug("%s: about to send skb: %p to dev: %s\n",
-               __FUNCTION__, skb, skb->dev->name);
-       pr_debug("  %s %s %4hx %4hx %4hx\n",
-                print_mac(mac, veth->h_dest), print_mac(mac2, veth->h_source),
+               __func__, skb, skb->dev->name);
+       pr_debug("  " MAC_FMT " " MAC_FMT " %4hx %4hx %4hx\n",
+                veth->h_dest[0], veth->h_dest[1], veth->h_dest[2],
+                veth->h_dest[3], veth->h_dest[4], veth->h_dest[5],
+                veth->h_source[0], veth->h_source[1], veth->h_source[2],
+                veth->h_source[3], veth->h_source[4], veth->h_source[5],
                 veth->h_vlan_proto, veth->h_vlan_TCI,
                 veth->h_vlan_encapsulated_proto);
 
@@ -658,7 +657,7 @@ static int vlan_dev_init(struct net_device *dev)
        int subclass = 0;
 
        /* IFF_BROADCAST|IFF_MULTICAST; ??? */
-       dev->flags  = real_dev->flags & ~IFF_UP;
+       dev->flags  = real_dev->flags & ~(IFF_UP | IFF_PROMISC | IFF_ALLMULTI);
        dev->iflink = real_dev->ifindex;
        dev->state  = (real_dev->state & ((1<<__LINK_STATE_NOCARRIER) |
                                          (1<<__LINK_STATE_DORMANT))) |
@@ -690,6 +689,20 @@ static int vlan_dev_init(struct net_device *dev)
        return 0;
 }
 
+static void vlan_dev_uninit(struct net_device *dev)
+{
+       struct vlan_priority_tci_mapping *pm;
+       struct vlan_dev_info *vlan = vlan_dev_info(dev);
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(vlan->egress_priority_map); i++) {
+               while ((pm = vlan->egress_priority_map[i]) != NULL) {
+                       vlan->egress_priority_map[i] = pm->next;
+                       kfree(pm);
+               }
+       }
+}
+
 void vlan_setup(struct net_device *dev)
 {
        ether_setup(dev);
@@ -699,6 +712,7 @@ void vlan_setup(struct net_device *dev)
 
        dev->change_mtu         = vlan_dev_change_mtu;
        dev->init               = vlan_dev_init;
+       dev->uninit             = vlan_dev_uninit;
        dev->open               = vlan_dev_open;
        dev->stop               = vlan_dev_stop;
        dev->set_mac_address    = vlan_dev_set_mac_address;