[NET]: Make the device list and device lookups per namespace.
[deliverable/linux.git] / net / mac80211 / ieee80211.c
index 8f472379b128ed6e1665c5453f3ecd1fb215d587..506cfa06b18415f01cfa5f118b092f73ded0e6e6 100644 (file)
@@ -21,6 +21,7 @@
 #include <linux/wireless.h>
 #include <linux/rtnetlink.h>
 #include <linux/bitmap.h>
+#include <net/net_namespace.h>
 #include <net/cfg80211.h>
 
 #include "ieee80211_common.h"
@@ -354,7 +355,7 @@ static void ieee80211_if_open(struct net_device *dev)
        switch (sdata->type) {
        case IEEE80211_IF_TYPE_STA:
        case IEEE80211_IF_TYPE_IBSS:
-               sdata->u.sta.prev_bssid_set = 0;
+               sdata->u.sta.flags &= ~IEEE80211_STA_PREV_BSSID_SET;
                break;
        }
 }
@@ -442,6 +443,7 @@ static int ieee80211_open(struct net_device *dev)
        } else {
                ieee80211_if_config(dev);
                ieee80211_reset_erp_info(dev);
+               ieee80211_enable_keys(sdata);
        }
 
        if (sdata->type == IEEE80211_IF_TYPE_STA &&
@@ -510,6 +512,9 @@ static int ieee80211_stop(struct net_device *dev)
                local->monitors--;
                if (!local->monitors)
                        local->hw.conf.flags &= ~IEEE80211_CONF_RADIOTAP;
+       } else {
+               /* disable all keys for as long as this netdev is down */
+               ieee80211_disable_keys(sdata);
        }
 
        local->open_count--;
@@ -555,23 +560,21 @@ static void ieee80211_set_multicast_list(struct net_device *dev)
        unsigned short flags;
 
        netif_tx_lock_nested(local->mdev, TX_LOCK_MASTER);
-       if (((dev->flags & IFF_ALLMULTI) != 0) ^ (sdata->allmulti != 0)) {
-               if (sdata->allmulti) {
-                       sdata->allmulti = 0;
+       if (((dev->flags & IFF_ALLMULTI) != 0) ^
+           ((sdata->flags & IEEE80211_SDATA_ALLMULTI) != 0)) {
+               if (sdata->flags & IEEE80211_SDATA_ALLMULTI)
                        local->iff_allmultis--;
-               } else {
-                       sdata->allmulti = 1;
+               else
                        local->iff_allmultis++;
-               }
+               sdata->flags ^= IEEE80211_SDATA_ALLMULTI;
        }
-       if (((dev->flags & IFF_PROMISC) != 0) ^ (sdata->promisc != 0)) {
-               if (sdata->promisc) {
-                       sdata->promisc = 0;
+       if (((dev->flags & IFF_PROMISC) != 0) ^
+           ((sdata->flags & IEEE80211_SDATA_PROMISC) != 0)) {
+               if (sdata->flags & IEEE80211_SDATA_PROMISC)
                        local->iff_promiscs--;
-               } else {
-                       sdata->promisc = 1;
+               else
                        local->iff_promiscs++;
-               }
+               sdata->flags ^= IEEE80211_SDATA_PROMISC;
        }
        if (dev->mc_count != sdata->mc_count) {
                local->mc_count = local->mc_count - sdata->mc_count +
@@ -740,16 +743,16 @@ void ieee80211_erp_info_change_notify(struct net_device *dev, u8 changes)
        struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
        if (local->ops->erp_ie_changed)
                local->ops->erp_ie_changed(local_to_hw(local), changes,
-                                          sdata->use_protection,
-                                          !sdata->short_preamble);
+                       !!(sdata->flags & IEEE80211_SDATA_USE_PROTECTION),
+                       !(sdata->flags & IEEE80211_SDATA_SHORT_PREAMBLE));
 }
 
 void ieee80211_reset_erp_info(struct net_device *dev)
 {
        struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 
-       sdata->short_preamble = 0;
-       sdata->use_protection = 0;
+       sdata->flags &= ~(IEEE80211_SDATA_USE_PROTECTION |
+                       IEEE80211_SDATA_SHORT_PREAMBLE);
        ieee80211_erp_info_change_notify(dev,
                                         IEEE80211_ERP_CHANGE_PROTECTION |
                                         IEEE80211_ERP_CHANGE_PREAMBLE);
@@ -876,10 +879,15 @@ static void ieee80211_remove_tx_extra(struct ieee80211_local *local,
 
        pkt_data = (struct ieee80211_tx_packet_data *)skb->cb;
        pkt_data->ifindex = control->ifindex;
-       pkt_data->mgmt_iface = (control->type == IEEE80211_IF_TYPE_MGMT);
-       pkt_data->req_tx_status = !!(control->flags & IEEE80211_TXCTL_REQ_TX_STATUS);
-       pkt_data->do_not_encrypt = !!(control->flags & IEEE80211_TXCTL_DO_NOT_ENCRYPT);
-       pkt_data->requeue = !!(control->flags & IEEE80211_TXCTL_REQUEUE);
+       pkt_data->flags = 0;
+       if (control->flags & IEEE80211_TXCTL_REQ_TX_STATUS)
+               pkt_data->flags |= IEEE80211_TXPD_REQ_TX_STATUS;
+       if (control->flags & IEEE80211_TXCTL_DO_NOT_ENCRYPT)
+               pkt_data->flags |= IEEE80211_TXPD_DO_NOT_ENCRYPT;
+       if (control->flags & IEEE80211_TXCTL_REQUEUE)
+               pkt_data->flags |= IEEE80211_TXPD_REQUEUE;
+       if (control->type == IEEE80211_IF_TYPE_MGMT)
+               pkt_data->flags |= IEEE80211_TXPD_MGMT_IFACE;
        pkt_data->queue = control->queue;
 
        hdrlen = ieee80211_get_hdrlen_from_skb(skb);
@@ -887,7 +895,7 @@ static void ieee80211_remove_tx_extra(struct ieee80211_local *local,
        if (!key)
                goto no_key;
 
-       switch (key->alg) {
+       switch (key->conf.alg) {
        case ALG_WEP:
                iv_len = WEP_IV_LEN;
                mic_len = WEP_ICV_LEN;
@@ -904,7 +912,8 @@ static void ieee80211_remove_tx_extra(struct ieee80211_local *local,
                goto no_key;
        }
 
-       if (skb->len >= mic_len && key->force_sw_encrypt)
+       if (skb->len >= mic_len &&
+           !(key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE))
                skb_trim(skb, skb->len - mic_len);
        if (skb->len >= iv_len && skb->len > hdrlen) {
                memmove(skb->data + iv_len, skb->data, hdrlen);
This page took 0.026548 seconds and 5 git commands to generate.