]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - net/8021q/vlan_dev.c
vlan: Change vlan_dev_set_vlan_flag() to handle multiple flags at once
[linux-2.6-omap-h63xx.git] / net / 8021q / vlan_dev.c
index 41a76a05e6fdd8ddb4f63342c5f6bc0e2620698e..76c665cdab6619670b97303bae18d14bf83f928a 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) {
@@ -382,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__, ntohs(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)
@@ -403,7 +400,7 @@ 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);
+               __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],
@@ -510,18 +507,16 @@ int vlan_dev_set_egress_priority(const struct net_device *dev,
 }
 
 /* Flags are defined in the vlan_flags enum in include/linux/if_vlan.h file. */
-int vlan_dev_set_vlan_flag(const struct net_device *dev,
-                          u32 flag, short flag_val)
+int vlan_dev_change_flags(const struct net_device *dev, u32 flags, u32 mask)
 {
-       /* verify flag is supported */
-       if (flag == VLAN_FLAG_REORDER_HDR) {
-               if (flag_val)
-                       vlan_dev_info(dev)->flags |= VLAN_FLAG_REORDER_HDR;
-               else
-                       vlan_dev_info(dev)->flags &= ~VLAN_FLAG_REORDER_HDR;
-               return 0;
-       }
-       return -EINVAL;
+       struct vlan_dev_info *vlan = vlan_dev_info(dev);
+       u32 old_flags = vlan->flags;
+
+       if (mask & ~VLAN_FLAG_REORDER_HDR)
+               return -EINVAL;
+
+       vlan->flags = (old_flags & ~mask) | (flags & mask);
+       return 0;
 }
 
 void vlan_dev_get_realdev_name(const struct net_device *dev, char *result)
@@ -666,6 +661,8 @@ static int vlan_dev_init(struct net_device *dev)
                                          (1<<__LINK_STATE_DORMANT))) |
                      (1<<__LINK_STATE_PRESENT);
 
+       dev->features |= real_dev->features & real_dev->vlan_features;
+
        /* ipv6 shared card related stuff */
        dev->dev_id = real_dev->dev_id;