[MAC80211]: Remove bitfields from struct ieee80211_sub_if_data
[linux-block.git] / net / mac80211 / ieee80211_ioctl.c
index 0e88564e524a237bce9ddcd833eee0f9e2c1311b..9964f057bcef9c63864fab6b3ee2d22f4d69bb8d 100644 (file)
@@ -270,7 +270,7 @@ static int ieee80211_ioctl_siwgenie(struct net_device *dev,
                int ret = ieee80211_sta_set_extra_ie(dev, extra, data->length);
                if (ret)
                        return ret;
-               sdata->u.sta.auto_bssid_sel = 0;
+               sdata->u.sta.flags &= ~IEEE80211_STA_AUTO_BSSID_SEL;
                ieee80211_sta_req_auth(dev, &sdata->u.sta);
                return 0;
        }
@@ -287,16 +287,6 @@ static int ieee80211_ioctl_siwgenie(struct net_device *dev,
        return -EOPNOTSUPP;
 }
 
-static int ieee80211_ioctl_set_radio_enabled(struct net_device *dev,
-                                            int val)
-{
-       struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
-       struct ieee80211_conf *conf = &local->hw.conf;
-
-       conf->radio_enabled = val;
-       return ieee80211_hw_config(wdev_priv(dev->ieee80211_ptr));
-}
-
 static int ieee80211_ioctl_giwname(struct net_device *dev,
                                   struct iw_request_info *info,
                                   char *name, char *extra)
@@ -512,13 +502,14 @@ static int ieee80211_ioctl_siwfreq(struct net_device *dev,
        struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 
        if (sdata->type == IEEE80211_IF_TYPE_STA)
-               sdata->u.sta.auto_channel_sel = 0;
+               sdata->u.sta.flags &= ~IEEE80211_STA_AUTO_CHANNEL_SEL;
 
        /* freq->e == 0: freq->m = channel; otherwise freq = m * 10^e */
        if (freq->e == 0) {
                if (freq->m < 0) {
                        if (sdata->type == IEEE80211_IF_TYPE_STA)
-                               sdata->u.sta.auto_channel_sel = 1;
+                               sdata->u.sta.flags |=
+                                       IEEE80211_STA_AUTO_CHANNEL_SEL;
                        return 0;
                } else
                        return ieee80211_set_channel(local, freq->m, -1);
@@ -573,7 +564,10 @@ static int ieee80211_ioctl_siwessid(struct net_device *dev,
                        sdata->u.sta.ssid_len = len;
                        return 0;
                }
-               sdata->u.sta.auto_ssid_sel = !data->flags;
+               if (data->flags)
+                       sdata->u.sta.flags &= ~IEEE80211_STA_AUTO_SSID_SEL;
+               else
+                       sdata->u.sta.flags |= IEEE80211_STA_AUTO_SSID_SEL;
                ret = ieee80211_sta_set_ssid(dev, ssid, len);
                if (ret)
                        return ret;
@@ -640,13 +634,13 @@ static int ieee80211_ioctl_siwap(struct net_device *dev,
                               ETH_ALEN);
                        return 0;
                }
-               if (is_zero_ether_addr((u8 *) &ap_addr->sa_data)) {
-                       sdata->u.sta.auto_bssid_sel = 1;
-                       sdata->u.sta.auto_channel_sel = 1;
-               else if (is_broadcast_ether_addr((u8 *) &ap_addr->sa_data))
-                       sdata->u.sta.auto_bssid_sel = 1;
+               if (is_zero_ether_addr((u8 *) &ap_addr->sa_data))
+                       sdata->u.sta.flags |= IEEE80211_STA_AUTO_BSSID_SEL |
+                               IEEE80211_STA_AUTO_CHANNEL_SEL;
+               else if (is_broadcast_ether_addr((u8 *) &ap_addr->sa_data))
+                       sdata->u.sta.flags |= IEEE80211_STA_AUTO_BSSID_SEL;
                else
-                       sdata->u.sta.auto_bssid_sel = 0;
+                       sdata->u.sta.flags &= ~IEEE80211_STA_AUTO_BSSID_SEL;
                ret = ieee80211_sta_set_bssid(dev, (u8 *) &ap_addr->sa_data);
                if (ret)
                        return ret;
@@ -1069,8 +1063,12 @@ static int ieee80211_ioctl_prism2_param(struct net_device *dev,
 
        case PRISM2_PARAM_CTS_PROTECT_ERP_FRAMES:
                if (sdata->type == IEEE80211_IF_TYPE_AP) {
-                       sdata->use_protection = !!value;
-                       ieee80211_erp_info_change_notify(dev, IEEE80211_ERP_CHANGE_PROTECTION);
+                       if (value)
+                               sdata->flags |= IEEE80211_SDATA_USE_PROTECTION;
+                       else
+                               sdata->flags &= ~IEEE80211_SDATA_USE_PROTECTION;
+                       ieee80211_erp_info_change_notify(dev,
+                                       IEEE80211_ERP_CHANGE_PROTECTION);
                } else {
                        ret = -ENOENT;
                }
@@ -1078,22 +1076,17 @@ static int ieee80211_ioctl_prism2_param(struct net_device *dev,
 
        case PRISM2_PARAM_PREAMBLE:
                if (sdata->type != IEEE80211_IF_TYPE_AP) {
-                       sdata->short_preamble = !!value;
-                       ieee80211_erp_info_change_notify(dev, IEEE80211_ERP_CHANGE_PREAMBLE);
+                       if (value)
+                               sdata->flags |= IEEE80211_SDATA_SHORT_PREAMBLE;
+                       else
+                               sdata->flags &= ~IEEE80211_SDATA_SHORT_PREAMBLE;
+                       ieee80211_erp_info_change_notify(dev,
+                                       IEEE80211_ERP_CHANGE_PREAMBLE);
                } else {
                        ret = -ENOENT;
                }
                break;
 
-       case PRISM2_PARAM_STAT_TIME:
-               if (!local->stat_time && value) {
-                       local->stat_timer.expires = jiffies + HZ * value / 100;
-                       add_timer(&local->stat_timer);
-               } else if (local->stat_time && !value) {
-                       del_timer_sync(&local->stat_timer);
-               }
-               local->stat_time = value;
-               break;
        case PRISM2_PARAM_SHORT_SLOT_TIME:
                if (value)
                        local->hw.conf.flags |= IEEE80211_CONF_SHORT_SLOT_TIME;
@@ -1107,35 +1100,10 @@ static int ieee80211_ioctl_prism2_param(struct net_device *dev,
                local->next_mode = value;
                break;
 
-       case PRISM2_PARAM_RADIO_ENABLED:
-               ret = ieee80211_ioctl_set_radio_enabled(dev, value);
-               break;
-
-       case PRISM2_PARAM_ANTENNA_MODE:
-               local->hw.conf.antenna_mode = value;
-               if (ieee80211_hw_config(local))
-                       ret = -EINVAL;
-               break;
-
-       case PRISM2_PARAM_STA_ANTENNA_SEL:
-               local->sta_antenna_sel = value;
-               break;
-
-       case PRISM2_PARAM_TX_POWER_REDUCTION:
-               if (value < 0)
-                       ret = -EINVAL;
-               else
-                       local->hw.conf.tx_power_reduction = value;
-               break;
-
        case PRISM2_PARAM_KEY_TX_RX_THRESHOLD:
                local->key_tx_rx_threshold = value;
                break;
 
-       case PRISM2_PARAM_DEFAULT_WEP_ONLY:
-               ret = ieee80211_ioctl_default_wep_only(local, value);
-               break;
-
        case PRISM2_PARAM_WIFI_WME_NOACK_TEST:
                local->wifi_wme_noack_test = value;
                break;
@@ -1148,8 +1116,12 @@ static int ieee80211_ioctl_prism2_param(struct net_device *dev,
                if (sdata->type != IEEE80211_IF_TYPE_STA &&
                    sdata->type != IEEE80211_IF_TYPE_IBSS)
                        ret = -EINVAL;
-               else
-                       sdata->u.sta.mixed_cell = !!value;
+               else {
+                       if (value)
+                               sdata->u.sta.flags |= IEEE80211_STA_MIXED_CELL;
+                       else
+                               sdata->u.sta.flags &= ~IEEE80211_STA_MIXED_CELL;
+               }
                break;
 
        case PRISM2_PARAM_HW_MODES:
@@ -1159,21 +1131,23 @@ static int ieee80211_ioctl_prism2_param(struct net_device *dev,
        case PRISM2_PARAM_CREATE_IBSS:
                if (sdata->type != IEEE80211_IF_TYPE_IBSS)
                        ret = -EINVAL;
-               else
-                       sdata->u.sta.create_ibss = !!value;
+               else {
+                       if (value)
+                               sdata->u.sta.flags |= IEEE80211_STA_CREATE_IBSS;
+                       else
+                               sdata->u.sta.flags &= ~IEEE80211_STA_CREATE_IBSS;
+               }
                break;
        case PRISM2_PARAM_WMM_ENABLED:
                if (sdata->type != IEEE80211_IF_TYPE_STA &&
                    sdata->type != IEEE80211_IF_TYPE_IBSS)
                        ret = -EINVAL;
-               else
-                       sdata->u.sta.wmm_enabled = !!value;
-               break;
-       case PRISM2_PARAM_RADAR_DETECT:
-               local->hw.conf.radar_detect = value;
-               break;
-       case PRISM2_PARAM_SPECTRUM_MGMT:
-               local->hw.conf.spect_mgmt = value;
+               else {
+                       if (value)
+                               sdata->u.sta.flags |= IEEE80211_STA_WMM_ENABLED;
+                       else
+                               sdata->u.sta.flags &= ~IEEE80211_STA_WMM_ENABLED;
+               }
                break;
        default:
                ret = -EOPNOTSUPP;
@@ -1201,16 +1175,13 @@ static int ieee80211_ioctl_get_prism2_param(struct net_device *dev,
                break;
 
        case PRISM2_PARAM_CTS_PROTECT_ERP_FRAMES:
-               *param = sdata->use_protection;
+               *param = !!(sdata->flags & IEEE80211_SDATA_USE_PROTECTION);
                break;
 
        case PRISM2_PARAM_PREAMBLE:
-               *param = sdata->short_preamble;
+               *param = !!(sdata->flags & IEEE80211_SDATA_SHORT_PREAMBLE);
                break;
 
-       case PRISM2_PARAM_STAT_TIME:
-               *param = local->stat_time;
-               break;
        case PRISM2_PARAM_SHORT_SLOT_TIME:
                *param = !!(local->hw.conf.flags & IEEE80211_CONF_SHORT_SLOT_TIME);
                break;
@@ -1219,26 +1190,10 @@ static int ieee80211_ioctl_get_prism2_param(struct net_device *dev,
                *param = local->next_mode;
                break;
 
-       case PRISM2_PARAM_ANTENNA_MODE:
-               *param = local->hw.conf.antenna_mode;
-               break;
-
-       case PRISM2_PARAM_STA_ANTENNA_SEL:
-               *param = local->sta_antenna_sel;
-               break;
-
-       case PRISM2_PARAM_TX_POWER_REDUCTION:
-               *param = local->hw.conf.tx_power_reduction;
-               break;
-
        case PRISM2_PARAM_KEY_TX_RX_THRESHOLD:
                *param = local->key_tx_rx_threshold;
                break;
 
-       case PRISM2_PARAM_DEFAULT_WEP_ONLY:
-               *param = local->default_wep_only;
-               break;
-
        case PRISM2_PARAM_WIFI_WME_NOACK_TEST:
                *param = local->wifi_wme_noack_test;
                break;
@@ -1255,7 +1210,8 @@ static int ieee80211_ioctl_get_prism2_param(struct net_device *dev,
                if (sdata->type != IEEE80211_IF_TYPE_IBSS)
                        ret = -EINVAL;
                else
-                       *param = !!sdata->u.sta.create_ibss;
+                       *param = !!(sdata->u.sta.flags &
+                                       IEEE80211_STA_CREATE_IBSS);
                break;
 
        case PRISM2_PARAM_MIXED_CELL:
@@ -1263,14 +1219,16 @@ static int ieee80211_ioctl_get_prism2_param(struct net_device *dev,
                    sdata->type != IEEE80211_IF_TYPE_IBSS)
                        ret = -EINVAL;
                else
-                       *param = !!sdata->u.sta.mixed_cell;
+                       *param = !!(sdata->u.sta.flags &
+                                       IEEE80211_STA_MIXED_CELL);
                break;
        case PRISM2_PARAM_WMM_ENABLED:
                if (sdata->type != IEEE80211_IF_TYPE_STA &&
                    sdata->type != IEEE80211_IF_TYPE_IBSS)
                        ret = -EINVAL;
                else
-                       *param = !!sdata->u.sta.wmm_enabled;
+                       *param = !!(sdata->u.sta.flags &
+                                       IEEE80211_STA_WMM_ENABLED);
                break;
        default:
                ret = -EOPNOTSUPP;
@@ -1411,22 +1369,12 @@ static int ieee80211_ioctl_siwauth(struct net_device *dev,
                        ret = -EINVAL;
                else {
                        /*
-                        * TODO: sdata->u.sta.key_mgmt does not match with WE18
-                        * value completely; could consider modifying this to
-                        * be closer to WE18. For now, this value is not really
-                        * used for anything else than Privacy matching, so the
-                        * current code here should be more or less OK.
+                        * Key management was set by wpa_supplicant,
+                        * we only need this to associate to a network
+                        * that has privacy enabled regardless of not
+                        * having a key.
                         */
-                       if (data->value & IW_AUTH_KEY_MGMT_802_1X) {
-                               sdata->u.sta.key_mgmt =
-                                       IEEE80211_KEY_MGMT_WPA_EAP;
-                       } else if (data->value & IW_AUTH_KEY_MGMT_PSK) {
-                               sdata->u.sta.key_mgmt =
-                                       IEEE80211_KEY_MGMT_WPA_PSK;
-                       } else {
-                               sdata->u.sta.key_mgmt =
-                                       IEEE80211_KEY_MGMT_NONE;
-                       }
+                       sdata->u.sta.key_management_enabled = !!data->value;
                }
                break;
        case IW_AUTH_80211_AUTH_ALG: