]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - net/8021q/vlan_dev.c
Pull nptcg into release branch
[mv-sheeva.git] / net / 8021q / vlan_dev.c
index 8059fa42b0859a1217946d91fde310d21baaba32..41a76a05e6fdd8ddb4f63342c5f6bc0e2620698e 100644 (file)
@@ -382,7 +382,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));
+                        __FUNCTION__, ntohs(veth->h_vlan_proto));
                /* Construct the second two bytes. This field looks something
                 * like:
                 * usr_priority: 3 bits  (high bits)
@@ -563,6 +563,7 @@ static int vlan_dev_stop(struct net_device *dev)
        struct net_device *real_dev = vlan_dev_info(dev)->real_dev;
 
        dev_mc_unsync(real_dev, dev);
+       dev_unicast_unsync(real_dev, dev);
        if (dev->flags & IFF_ALLMULTI)
                dev_set_allmulti(real_dev, -1);
        if (dev->flags & IFF_PROMISC)
@@ -634,9 +635,10 @@ static void vlan_dev_change_rx_flags(struct net_device *dev, int change)
                dev_set_promiscuity(real_dev, dev->flags & IFF_PROMISC ? 1 : -1);
 }
 
-static void vlan_dev_set_multicast_list(struct net_device *vlan_dev)
+static void vlan_dev_set_rx_mode(struct net_device *vlan_dev)
 {
        dev_mc_sync(vlan_dev_info(vlan_dev)->real_dev, vlan_dev);
+       dev_unicast_sync(vlan_dev_info(vlan_dev)->real_dev, vlan_dev);
 }
 
 /*
@@ -658,7 +660,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 +692,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,10 +715,12 @@ 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;
-       dev->set_multicast_list = vlan_dev_set_multicast_list;
+       dev->set_rx_mode        = vlan_dev_set_rx_mode;
+       dev->set_multicast_list = vlan_dev_set_rx_mode;
        dev->change_rx_flags    = vlan_dev_change_rx_flags;
        dev->do_ioctl           = vlan_dev_ioctl;
        dev->destructor         = free_netdev;