linux-wireless.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Samuel Ortiz <samuel.ortiz@intel.com>
To: Johannes Berg <johannes@sipsolutions.net>
Cc: "Zhu, Yi" <yi.zhu@intel.com>,
	John Linville <linville@tuxdriver.com>,
	"linux-wireless@vger.kernel.org" <linux-wireless@vger.kernel.org>
Subject: Re: [PATCH] iwmc3200wifi: cfg80211 managed mode port
Date: Fri, 3 Jul 2009 15:10:43 +0200	[thread overview]
Message-ID: <20090703131037.GA4215@sortiz.org> (raw)
In-Reply-To: <1246608159.16770.53.camel@johannes.local>

On Fri, Jul 03, 2009 at 01:02:39AM -0700, Johannes Berg wrote:
> On Fri, 2009-07-03 at 01:55 +0200, Samuel Ortiz wrote:
> > This patch ports iwm to the new cfg80211 managed mode API.
> > Whenever those managed mode routines get combined with the ibss one, we will
> > just have to entirely get rid of the wext implementation (We may have to only
> > keep the iw_handler until cfg80211 does the wext registration for us).
> 
> Looks good. I'll take care of the combine part later.
Thanks in advance.

Cheers,
Samuel.

 
> johannes
> 
> > Signed-off-by: Samuel Ortiz <samuel.ortiz@intel.com>
> > ---
> >  drivers/net/wireless/iwmc3200wifi/cfg80211.c |  195 ++++++++++++++++
> >  drivers/net/wireless/iwmc3200wifi/rx.c       |   13 -
> >  drivers/net/wireless/iwmc3200wifi/wext.c     |  320 ++-------------------------
> >  3 files changed, 239 insertions(+), 289 deletions(-)
> > 
> > Index: iwm-2.6/drivers/net/wireless/iwmc3200wifi/cfg80211.c
> > ===================================================================
> > --- iwm-2.6.orig/drivers/net/wireless/iwmc3200wifi/cfg80211.c	2009-07-02 21:20:34.000000000 +0200
> > +++ iwm-2.6/drivers/net/wireless/iwmc3200wifi/cfg80211.c	2009-07-03 01:43:09.000000000 +0200
> > @@ -305,6 +305,25 @@ static int iwm_cfg80211_set_default_key(
> >  	return iwm_reset_profile(iwm);
> >  }
> >  
> > +int iwm_cfg80211_get_station(struct wiphy *wiphy, struct net_device *ndev,
> > +			     u8 *mac, struct station_info *sinfo)
> > +{
> > +	struct iwm_priv *iwm = ndev_to_iwm(ndev);
> > +
> > +	if (memcmp(mac, iwm->bssid, ETH_ALEN))
> > +		return -ENOENT;
> > +
> > +	sinfo->filled |= STATION_INFO_TX_BITRATE;
> > +	sinfo->txrate.legacy = iwm->rate * 10;
> > +
> > +	if (test_bit(IWM_STATUS_ASSOCIATED, &iwm->status)) {
> > +		sinfo->filled |= STATION_INFO_SIGNAL;
> > +		sinfo->signal = iwm->wstats.qual.level;
> > +	}
> > +
> > +	return 0;
> > +}
> > +
> >  
> >  int iwm_cfg80211_inform_bss(struct iwm_priv *iwm)
> >  {
> > @@ -500,6 +519,179 @@ static int iwm_cfg80211_leave_ibss(struc
> >  	return 0;
> >  }
> >  
> > +static int iwm_set_auth_type(struct iwm_priv *iwm,
> > +			     enum nl80211_auth_type sme_auth_type)
> > +{
> > +	u8 *auth_type = &iwm->umac_profile->sec.auth_type;
> > +
> > +	switch (sme_auth_type) {
> > +	case NL80211_AUTHTYPE_AUTOMATIC:
> > +	case NL80211_AUTHTYPE_OPEN_SYSTEM:
> > +		IWM_DBG_WEXT(iwm, DBG, "OPEN auth\n");
> > +		*auth_type = UMAC_AUTH_TYPE_OPEN;
> > +		break;
> > +	case NL80211_AUTHTYPE_SHARED_KEY:
> > +		if (iwm->umac_profile->sec.flags &
> > +		    (UMAC_SEC_FLG_WPA_ON_MSK | UMAC_SEC_FLG_RSNA_ON_MSK)) {
> > +			IWM_DBG_WEXT(iwm, DBG, "WPA auth alg\n");
> > +			*auth_type = UMAC_AUTH_TYPE_RSNA_PSK;
> > +		} else {
> > +			IWM_DBG_WEXT(iwm, DBG, "WEP shared key auth alg\n");
> > +			*auth_type = UMAC_AUTH_TYPE_LEGACY_PSK;
> > +		}
> > +
> > +		break;
> > +	default:
> > +		IWM_ERR(iwm, "Unsupported auth alg: 0x%x\n", sme_auth_type);
> > +		return -ENOTSUPP;
> > +	}
> > +
> > +	return 0;
> > +}
> > +
> > +static int iwm_set_wpa_version(struct iwm_priv *iwm, u32 wpa_version)
> > +{
> > +	if (!wpa_version) {
> > +		iwm->umac_profile->sec.flags = UMAC_SEC_FLG_LEGACY_PROFILE;
> > +		return 0;
> > +	}
> > +
> > +	if (wpa_version & NL80211_WPA_VERSION_2)
> > +		iwm->umac_profile->sec.flags = UMAC_SEC_FLG_RSNA_ON_MSK;
> > +
> > +	if (wpa_version & NL80211_WPA_VERSION_1)
> > +		iwm->umac_profile->sec.flags |= UMAC_SEC_FLG_WPA_ON_MSK;
> > +
> > +	return 0;
> > +}
> > +
> > +static int iwm_set_cipher(struct iwm_priv *iwm, u32 cipher, bool ucast)
> > +{
> > +	u8 *profile_cipher = ucast ? &iwm->umac_profile->sec.ucast_cipher :
> > +		&iwm->umac_profile->sec.mcast_cipher;
> > +
> > +	if (!cipher) {
> > +		*profile_cipher = UMAC_CIPHER_TYPE_NONE;
> > +		return 0;
> > +	}
> > +
> > +	switch (cipher) {
> > +	case IW_AUTH_CIPHER_NONE:
> > +		*profile_cipher = UMAC_CIPHER_TYPE_NONE;
> > +		break;
> > +	case WLAN_CIPHER_SUITE_WEP40:
> > +		*profile_cipher = UMAC_CIPHER_TYPE_WEP_40;
> > +		break;
> > +	case WLAN_CIPHER_SUITE_WEP104:
> > +		*profile_cipher = UMAC_CIPHER_TYPE_WEP_104;
> > +		break;
> > +	case WLAN_CIPHER_SUITE_TKIP:
> > +		*profile_cipher = UMAC_CIPHER_TYPE_TKIP;
> > +		break;
> > +	case WLAN_CIPHER_SUITE_CCMP:
> > +		*profile_cipher = UMAC_CIPHER_TYPE_CCMP;
> > +		break;
> > +	default:
> > +		IWM_ERR(iwm, "Unsupported cipher: 0x%x\n", cipher);
> > +		return -ENOTSUPP;
> > +	}
> > +
> > +	return 0;
> > +}
> > +
> > +static int iwm_set_key_mgt(struct iwm_priv *iwm, u32 key_mgt)
> > +{
> > +	u8 *auth_type = &iwm->umac_profile->sec.auth_type;
> > +
> > +	IWM_DBG_WEXT(iwm, DBG, "key_mgt: 0x%x\n", key_mgt);
> > +
> > +	if (key_mgt == WLAN_AKM_SUITE_8021X)
> > +		*auth_type = UMAC_AUTH_TYPE_8021X;
> > +	else if (key_mgt == WLAN_AKM_SUITE_PSK) {
> > +		if (iwm->umac_profile->sec.flags &
> > +		    (UMAC_SEC_FLG_WPA_ON_MSK | UMAC_SEC_FLG_RSNA_ON_MSK))
> > +			*auth_type = UMAC_AUTH_TYPE_RSNA_PSK;
> > +		else
> > +			*auth_type = UMAC_AUTH_TYPE_LEGACY_PSK;
> > +	} else {
> > +		IWM_ERR(iwm, "Invalid key mgt: 0x%x\n", key_mgt);
> > +		return -EINVAL;
> > +	}
> > +
> > +	return 0;
> > +}
> > +
> > +
> > +static int iwm_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev,
> > +				 struct cfg80211_connect_params *sme)
> > +{
> > +	struct iwm_priv *iwm = wiphy_to_iwm(wiphy);
> > +	struct ieee80211_channel *chan = sme->channel;
> > +	int ret;
> > +
> > +	if (!test_bit(IWM_STATUS_READY, &iwm->status))
> > +		return -EIO;
> > +
> > +	if (!sme->ssid)
> > +		return -EINVAL;
> > +
> > +	if (chan)
> > +		iwm->channel =
> > +			ieee80211_frequency_to_channel(chan->center_freq);
> > +
> > +	iwm->umac_profile->ssid.ssid_len = sme->ssid_len;
> > +	memcpy(iwm->umac_profile->ssid.ssid, sme->ssid, sme->ssid_len);
> > +
> > +	if (sme->bssid) {
> > +		IWM_DBG_WEXT(iwm, DBG, "BSSID: %pM\n", sme->bssid);
> > +		memcpy(&iwm->umac_profile->bssid[0], sme->bssid, ETH_ALEN);
> > +		iwm->umac_profile->bss_num = 1;
> > +	} else {
> > +		memset(&iwm->umac_profile->bssid[0], 0, ETH_ALEN);
> > +		iwm->umac_profile->bss_num = 0;
> > +	}
> > +
> > +	ret = iwm_set_auth_type(iwm, sme->auth_type);
> > +	if (ret < 0)
> > +		return ret;
> > +
> > +	ret = iwm_set_wpa_version(iwm, sme->crypto.wpa_versions);
> > +	if (ret < 0)
> > +		return ret;
> > +
> > +	if (sme->crypto.n_ciphers_pairwise) {
> > +		ret = iwm_set_cipher(iwm, sme->crypto.ciphers_pairwise[0],
> > +				     true);
> > +		if (ret < 0)
> > +			return ret;
> > +	}
> > +
> > +	ret = iwm_set_cipher(iwm, sme->crypto.cipher_group, false);
> > +	if (ret < 0)
> > +		return ret;
> > +
> > +	if (sme->crypto.n_akm_suites) {
> > +		ret = iwm_set_key_mgt(iwm, sme->crypto.akm_suites[0]);
> > +		if (ret < 0)
> > +			return ret;
> > +	}
> > +
> > +	return iwm_send_mlme_profile(iwm);
> > +}
> > +
> > +static int iwm_cfg80211_disconnect(struct wiphy *wiphy, struct net_device *dev,
> > +				   u16 reason_code)
> > +{
> > +	struct iwm_priv *iwm = wiphy_to_iwm(wiphy);
> > +
> > +	IWM_DBG_WEXT(iwm, DBG, "Active: %d\n", iwm->umac_profile_active);
> > +
> > +	if (iwm->umac_profile_active)
> > +		return iwm_invalidate_mlme_profile(iwm);
> > +
> > +	return 0;
> > +}
> > +
> >  static int iwm_cfg80211_set_txpower(struct wiphy *wiphy,
> >  				    enum tx_power_setting type, int dbm)
> >  {
> > @@ -549,8 +741,11 @@ static struct cfg80211_ops iwm_cfg80211_
> >  	.get_key = iwm_cfg80211_get_key,
> >  	.del_key = iwm_cfg80211_del_key,
> >  	.set_default_key = iwm_cfg80211_set_default_key,
> > +	.get_station = iwm_cfg80211_get_station,
> >  	.scan = iwm_cfg80211_scan,
> >  	.set_wiphy_params = iwm_cfg80211_set_wiphy_params,
> > +	.connect = iwm_cfg80211_connect,
> > +	.disconnect = iwm_cfg80211_disconnect,
> >  	.join_ibss = iwm_cfg80211_join_ibss,
> >  	.leave_ibss = iwm_cfg80211_leave_ibss,
> >  	.set_tx_power = iwm_cfg80211_set_txpower,
> > Index: iwm-2.6/drivers/net/wireless/iwmc3200wifi/wext.c
> > ===================================================================
> > --- iwm-2.6.orig/drivers/net/wireless/iwmc3200wifi/wext.c	2009-07-02 21:20:34.000000000 +0200
> > +++ iwm-2.6/drivers/net/wireless/iwmc3200wifi/wext.c	2009-07-03 01:18:56.000000000 +0200
> > @@ -21,31 +21,11 @@
> >   *
> >   */
> >  
> > -#include <linux/kernel.h>
> > -#include <linux/netdevice.h>
> >  #include <linux/wireless.h>
> > -#include <linux/if_arp.h>
> > -#include <linux/etherdevice.h>
> >  #include <net/cfg80211.h>
> > -#include <net/iw_handler.h>
> >  
> >  #include "iwm.h"
> > -#include "umac.h"
> >  #include "commands.h"
> > -#include "debug.h"
> > -
> > -static struct iw_statistics *iwm_get_wireless_stats(struct net_device *dev)
> > -{
> > -	struct iwm_priv *iwm = ndev_to_iwm(dev);
> > -	struct iw_statistics *wstats = &iwm->wstats;
> > -
> > -	if (!test_bit(IWM_STATUS_ASSOCIATED, &iwm->status)) {
> > -		memset(wstats, 0, sizeof(struct iw_statistics));
> > -		wstats->qual.updated = IW_QUAL_ALL_INVALID;
> > -	}
> > -
> > -	return wstats;
> > -}
> >  
> >  static int iwm_wext_siwfreq(struct net_device *dev,
> >  			    struct iw_request_info *info,
> > @@ -53,14 +33,12 @@ static int iwm_wext_siwfreq(struct net_d
> >  {
> >  	struct iwm_priv *iwm = ndev_to_iwm(dev);
> >  
> > -	if (freq->flags == IW_FREQ_AUTO)
> > -		return 0;
> > -
> > -	/* frequency/channel can only be set in IBSS mode */
> > -	if (iwm->conf.mode != UMAC_MODE_IBSS)
> > +	switch (iwm->conf.mode) {
> > +	case UMAC_MODE_IBSS:
> > +		return cfg80211_ibss_wext_giwfreq(dev, info, freq, extra);
> > +	default:
> >  		return -EOPNOTSUPP;
> > -
> > -	return cfg80211_ibss_wext_siwfreq(dev, info, freq, extra);
> > +	}
> >  }
> >  
> >  static int iwm_wext_giwfreq(struct net_device *dev,
> > @@ -69,69 +47,29 @@ static int iwm_wext_giwfreq(struct net_d
> >  {
> >  	struct iwm_priv *iwm = ndev_to_iwm(dev);
> >  
> > -	if (iwm->conf.mode == UMAC_MODE_IBSS)
> > +	switch (iwm->conf.mode) {
> > +	case UMAC_MODE_IBSS:
> >  		return cfg80211_ibss_wext_giwfreq(dev, info, freq, extra);
> > -
> > -	freq->e = 0;
> > -	freq->m = iwm->channel;
> > -
> > -	return 0;
> > +	case UMAC_MODE_BSS:
> > +		return cfg80211_mgd_wext_giwfreq(dev, info, freq, extra);
> > +	default:
> > +		return -EOPNOTSUPP;
> > +	}
> >  }
> >  
> >  static int iwm_wext_siwap(struct net_device *dev, struct iw_request_info *info,
> >  			  struct sockaddr *ap_addr, char *extra)
> >  {
> >  	struct iwm_priv *iwm = ndev_to_iwm(dev);
> > -	int ret;
> > -
> > -	IWM_DBG_WEXT(iwm, DBG, "Set BSSID: %pM\n", ap_addr->sa_data);
> >  
> > -	if (iwm->conf.mode == UMAC_MODE_IBSS)
> > +	switch (iwm->conf.mode) {
> > +	case UMAC_MODE_IBSS:
> >  		return cfg80211_ibss_wext_siwap(dev, info, ap_addr, extra);
> > -
> > -	if (!test_bit(IWM_STATUS_READY, &iwm->status))
> > -		return -EIO;
> > -
> > -	if (is_zero_ether_addr(ap_addr->sa_data) ||
> > -	    is_broadcast_ether_addr(ap_addr->sa_data)) {
> > -		IWM_DBG_WEXT(iwm, DBG, "clear mandatory bssid %pM\n",
> > -			     iwm->umac_profile->bssid[0]);
> > -		memset(&iwm->umac_profile->bssid[0], 0, ETH_ALEN);
> > -		iwm->umac_profile->bss_num = 0;
> > -	} else {
> > -		IWM_DBG_WEXT(iwm, DBG, "add mandatory bssid %pM\n",
> > -			     ap_addr->sa_data);
> > -		memcpy(&iwm->umac_profile->bssid[0], ap_addr->sa_data,
> > -		       ETH_ALEN);
> > -		iwm->umac_profile->bss_num = 1;
> > -	}
> > -
> > -	if (iwm->umac_profile_active) {
> > -		int i;
> > -
> > -		if (!memcmp(&iwm->umac_profile->bssid[0], iwm->bssid, ETH_ALEN))
> > -			return 0;
> > -
> > -		/*
> > -		 * If we're clearing the BSSID, and we're associated,
> > -		 * we have to clear the keys as they're no longer valid.
> > -		 */
> > -		if (is_zero_ether_addr(ap_addr->sa_data)) {
> > -			for (i = 0; i < IWM_NUM_KEYS; i++)
> > -				iwm->keys[i].key_len = 0;
> > -		}
> > -
> > -		ret = iwm_invalidate_mlme_profile(iwm);
> > -		if (ret < 0) {
> > -			IWM_ERR(iwm, "Couldn't invalidate profile\n");
> > -			return ret;
> > -		}
> > +	case UMAC_MODE_BSS:
> > +		return cfg80211_mgd_wext_siwap(dev, info, ap_addr, extra);
> > +	default:
> > +		return -EOPNOTSUPP;
> >  	}
> > -
> > -	if (iwm->umac_profile->ssid.ssid_len)
> > -		return iwm_send_mlme_profile(iwm);
> > -
> > -	return 0;
> >  }
> >  
> >  static int iwm_wext_giwap(struct net_device *dev, struct iw_request_info *info,
> > @@ -143,17 +81,10 @@ static int iwm_wext_giwap(struct net_dev
> >  	case UMAC_MODE_IBSS:
> >  		return cfg80211_ibss_wext_giwap(dev, info, ap_addr, extra);
> >  	case UMAC_MODE_BSS:
> > -		if (test_bit(IWM_STATUS_ASSOCIATED, &iwm->status)) {
> > -			ap_addr->sa_family = ARPHRD_ETHER;
> > -			memcpy(&ap_addr->sa_data, iwm->bssid, ETH_ALEN);
> > -		} else
> > -			memset(&ap_addr->sa_data, 0, ETH_ALEN);
> > -		break;
> > +		return cfg80211_mgd_wext_giwap(dev, info, ap_addr, extra);
> >  	default:
> >  		return -EOPNOTSUPP;
> >  	}
> > -
> > -	return 0;
> >  }
> >  
> >  static int iwm_wext_siwessid(struct net_device *dev,
> > @@ -161,36 +92,15 @@ static int iwm_wext_siwessid(struct net_
> >  			     struct iw_point *data, char *ssid)
> >  {
> >  	struct iwm_priv *iwm = ndev_to_iwm(dev);
> > -	size_t len = data->length;
> > -	int ret;
> > -
> > -	IWM_DBG_WEXT(iwm, DBG, "Set ESSID: >%s<\n", ssid);
> >  
> > -	if (iwm->conf.mode == UMAC_MODE_IBSS)
> > +	switch (iwm->conf.mode) {
> > +	case UMAC_MODE_IBSS:
> >  		return cfg80211_ibss_wext_siwessid(dev, info, data, ssid);
> > -
> > -	if (!test_bit(IWM_STATUS_READY, &iwm->status))
> > -		return -EIO;
> > -
> > -	if (len > 0 && ssid[len - 1] == '\0')
> > -		len--;
> > -
> > -	if (iwm->umac_profile_active) {
> > -		if (iwm->umac_profile->ssid.ssid_len == len &&
> > -		    !memcmp(iwm->umac_profile->ssid.ssid, ssid, len))
> > -			return 0;
> > -
> > -		ret = iwm_invalidate_mlme_profile(iwm);
> > -		if (ret < 0) {
> > -			IWM_ERR(iwm, "Couldn't invalidate profile\n");
> > -			return ret;
> > -		}
> > +	case UMAC_MODE_BSS:
> > +		return cfg80211_mgd_wext_siwessid(dev, info, data, ssid);
> > +	default:
> > +		return -EOPNOTSUPP;
> >  	}
> > -
> > -	iwm->umac_profile->ssid.ssid_len = len;
> > -	memcpy(iwm->umac_profile->ssid.ssid, ssid, len);
> > -
> > -	return iwm_send_mlme_profile(iwm);
> >  }
> >  
> >  static int iwm_wext_giwessid(struct net_device *dev,
> > @@ -199,174 +109,14 @@ static int iwm_wext_giwessid(struct net_
> >  {
> >  	struct iwm_priv *iwm = ndev_to_iwm(dev);
> >  
> > -	if (iwm->conf.mode == UMAC_MODE_IBSS)
> > +	switch (iwm->conf.mode) {
> > +	case UMAC_MODE_IBSS:
> >  		return cfg80211_ibss_wext_giwessid(dev, info, data, ssid);
> > -
> > -	if (!test_bit(IWM_STATUS_READY, &iwm->status))
> > -		return -EIO;
> > -
> > -	data->length = iwm->umac_profile->ssid.ssid_len;
> > -	if (data->length) {
> > -		memcpy(ssid, iwm->umac_profile->ssid.ssid, data->length);
> > -		data->flags = 1;
> > -	} else
> > -		data->flags = 0;
> > -
> > -	return 0;
> > -}
> > -
> > -static int iwm_wext_giwrate(struct net_device *dev,
> > -			    struct iw_request_info *info,
> > -			    struct iw_param *rate, char *extra)
> > -{
> > -	struct iwm_priv *iwm = ndev_to_iwm(dev);
> > -
> > -	rate->value = iwm->rate * 1000000;
> > -
> > -	return 0;
> > -}
> > -
> > -static int iwm_set_wpa_version(struct iwm_priv *iwm, u8 wpa_version)
> > -{
> > -	if (wpa_version & IW_AUTH_WPA_VERSION_WPA2)
> > -		iwm->umac_profile->sec.flags = UMAC_SEC_FLG_RSNA_ON_MSK;
> > -	else if (wpa_version & IW_AUTH_WPA_VERSION_WPA)
> > -		iwm->umac_profile->sec.flags = UMAC_SEC_FLG_WPA_ON_MSK;
> > -	else
> > -		iwm->umac_profile->sec.flags = UMAC_SEC_FLG_LEGACY_PROFILE;
> > -
> > -	return 0;
> > -}
> > -
> > -static int iwm_set_key_mgt(struct iwm_priv *iwm, u8 key_mgt)
> > -{
> > -	u8 *auth_type = &iwm->umac_profile->sec.auth_type;
> > -
> > -	IWM_DBG_WEXT(iwm, DBG, "key_mgt: 0x%x\n", key_mgt);
> > -
> > -	if (key_mgt == IW_AUTH_KEY_MGMT_802_1X)
> > -		*auth_type = UMAC_AUTH_TYPE_8021X;
> > -	else if (key_mgt == IW_AUTH_KEY_MGMT_PSK) {
> > -		if (iwm->umac_profile->sec.flags &
> > -		    (UMAC_SEC_FLG_WPA_ON_MSK | UMAC_SEC_FLG_RSNA_ON_MSK))
> > -			*auth_type = UMAC_AUTH_TYPE_RSNA_PSK;
> > -		else
> > -			*auth_type = UMAC_AUTH_TYPE_LEGACY_PSK;
> > -	} else {
> > -		IWM_ERR(iwm, "Invalid key mgt: 0x%x\n", key_mgt);
> > -		return -EINVAL;
> > -	}
> > -
> > -	return 0;
> > -}
> > -
> > -static int iwm_set_cipher(struct iwm_priv *iwm, u8 cipher, u8 ucast)
> > -{
> > -	u8 *profile_cipher = ucast ? &iwm->umac_profile->sec.ucast_cipher :
> > -		&iwm->umac_profile->sec.mcast_cipher;
> > -
> > -	switch (cipher) {
> > -	case IW_AUTH_CIPHER_NONE:
> > -		*profile_cipher = UMAC_CIPHER_TYPE_NONE;
> > -		break;
> > -	case IW_AUTH_CIPHER_WEP40:
> > -		*profile_cipher = UMAC_CIPHER_TYPE_WEP_40;
> > -		break;
> > -	case IW_AUTH_CIPHER_TKIP:
> > -		*profile_cipher = UMAC_CIPHER_TYPE_TKIP;
> > -		break;
> > -	case IW_AUTH_CIPHER_CCMP:
> > -		*profile_cipher = UMAC_CIPHER_TYPE_CCMP;
> > -		break;
> > -	case IW_AUTH_CIPHER_WEP104:
> > -		*profile_cipher = UMAC_CIPHER_TYPE_WEP_104;
> > -		break;
> > -	default:
> > -		IWM_ERR(iwm, "Unsupported cipher: 0x%x\n", cipher);
> > -		return -ENOTSUPP;
> > -	}
> > -
> > -	return 0;
> > -}
> > -
> > -static int iwm_set_auth_alg(struct iwm_priv *iwm, u8 auth_alg)
> > -{
> > -	u8 *auth_type = &iwm->umac_profile->sec.auth_type;
> > -
> > -	IWM_DBG_WEXT(iwm, DBG, "auth_alg: 0x%x\n", auth_alg);
> > -
> > -	switch (auth_alg) {
> > -	case IW_AUTH_ALG_OPEN_SYSTEM:
> > -		*auth_type = UMAC_AUTH_TYPE_OPEN;
> > -		break;
> > -	case IW_AUTH_ALG_SHARED_KEY:
> > -		if (iwm->umac_profile->sec.flags &
> > -		    (UMAC_SEC_FLG_WPA_ON_MSK | UMAC_SEC_FLG_RSNA_ON_MSK)) {
> > -			if (*auth_type == UMAC_AUTH_TYPE_8021X)
> > -				return -EINVAL;
> > -			*auth_type = UMAC_AUTH_TYPE_RSNA_PSK;
> > -		} else {
> > -			IWM_DBG_WEXT(iwm, DBG, "WEP shared key\n");
> > -			*auth_type = UMAC_AUTH_TYPE_LEGACY_PSK;
> > -		}
> > -		break;
> > -	case IW_AUTH_ALG_LEAP:
> > -	default:
> > -		IWM_ERR(iwm, "Unsupported auth alg: 0x%x\n", auth_alg);
> > -		return -ENOTSUPP;
> > -	}
> > -
> > -	return 0;
> > -}
> > -
> > -static int iwm_wext_siwauth(struct net_device *dev,
> > -			    struct iw_request_info *info,
> > -			    struct iw_param *data, char *extra)
> > -{
> > -	struct iwm_priv *iwm = ndev_to_iwm(dev);
> > -	int ret;
> > -
> > -	if ((data->flags) &
> > -	    (IW_AUTH_WPA_VERSION | IW_AUTH_KEY_MGMT |
> > -	     IW_AUTH_WPA_ENABLED | IW_AUTH_80211_AUTH_ALG)) {
> > -		/* We need to invalidate the current profile */
> > -		if (iwm->umac_profile_active) {
> > -			ret = iwm_invalidate_mlme_profile(iwm);
> > -			if (ret < 0) {
> > -				IWM_ERR(iwm, "Couldn't invalidate profile\n");
> > -				return ret;
> > -			}
> > -		}
> > -	}
> > -
> > -	switch (data->flags & IW_AUTH_INDEX) {
> > -	case IW_AUTH_WPA_VERSION:
> > -		return iwm_set_wpa_version(iwm, data->value);
> > -		break;
> > -	case IW_AUTH_CIPHER_PAIRWISE:
> > -		return iwm_set_cipher(iwm, data->value, 1);
> > -		break;
> > -	case IW_AUTH_CIPHER_GROUP:
> > -		return iwm_set_cipher(iwm, data->value, 0);
> > -		break;
> > -	case IW_AUTH_KEY_MGMT:
> > -		return iwm_set_key_mgt(iwm, data->value);
> > -		break;
> > -	case IW_AUTH_80211_AUTH_ALG:
> > -		return iwm_set_auth_alg(iwm, data->value);
> > -		break;
> > +	case UMAC_MODE_BSS:
> > +		return cfg80211_mgd_wext_giwessid(dev, info, data, ssid);
> >  	default:
> > -		return -ENOTSUPP;
> > +		return -EOPNOTSUPP;
> >  	}
> > -
> > -	return 0;
> > -}
> > -
> > -static int iwm_wext_giwauth(struct net_device *dev,
> > -			    struct iw_request_info *info,
> > -			    struct iw_param *data, char *extra)
> > -{
> > -	return 0;
> >  }
> >  
> >  static const iw_handler iwm_handlers[] =
> > @@ -404,7 +154,7 @@ static const iw_handler iwm_handlers[] =
> >  	(iw_handler) NULL,				/* -- hole -- */
> >  	(iw_handler) NULL,				/* -- hole -- */
> >  	(iw_handler) NULL,				/* SIOCSIWRATE */
> > -	(iw_handler) iwm_wext_giwrate,			/* SIOCGIWRATE */
> > +	(iw_handler) cfg80211_wext_giwrate,		/* SIOCGIWRATE */
> >  	(iw_handler) cfg80211_wext_siwrts,		/* SIOCSIWRTS */
> >  	(iw_handler) cfg80211_wext_giwrts,		/* SIOCGIWRTS */
> >  	(iw_handler) cfg80211_wext_siwfrag,	        /* SIOCSIWFRAG */
> > @@ -419,10 +169,10 @@ static const iw_handler iwm_handlers[] =
> >  	(iw_handler) cfg80211_wext_giwpower,		/* SIOCGIWPOWER */
> >  	(iw_handler) NULL,				/* -- hole -- */
> >  	(iw_handler) NULL,				/* -- hole -- */
> > -	(iw_handler) NULL,                              /* SIOCSIWGENIE */
> > +	(iw_handler) cfg80211_wext_siwgenie,            /* SIOCSIWGENIE */
> >  	(iw_handler) NULL,				/* SIOCGIWGENIE */
> > -	(iw_handler) iwm_wext_siwauth,			/* SIOCSIWAUTH */
> > -	(iw_handler) iwm_wext_giwauth,			/* SIOCGIWAUTH */
> > +	(iw_handler) cfg80211_wext_siwauth,		/* SIOCSIWAUTH */
> > +	(iw_handler) cfg80211_wext_giwauth,		/* SIOCGIWAUTH */
> >  	(iw_handler) cfg80211_wext_siwencodeext,	/* SIOCSIWENCODEEXT */
> >  	(iw_handler) NULL,				/* SIOCGIWENCODEEXT */
> >  	(iw_handler) NULL,				/* SIOCSIWPMKSA */
> > @@ -432,6 +182,6 @@ static const iw_handler iwm_handlers[] =
> >  const struct iw_handler_def iwm_iw_handler_def = {
> >  	.num_standard	= ARRAY_SIZE(iwm_handlers),
> >  	.standard	= (iw_handler *) iwm_handlers,
> > -	.get_wireless_stats = iwm_get_wireless_stats,
> > +	.get_wireless_stats = cfg80211_wireless_stats,
> >  };
> >  
> > Index: iwm-2.6/drivers/net/wireless/iwmc3200wifi/rx.c
> > ===================================================================
> > --- iwm-2.6.orig/drivers/net/wireless/iwmc3200wifi/rx.c	2009-07-02 21:19:58.000000000 +0200
> > +++ iwm-2.6/drivers/net/wireless/iwmc3200wifi/rx.c	2009-07-03 00:24:46.000000000 +0200
> > @@ -521,7 +521,10 @@ static int iwm_mlme_assoc_complete(struc
> >  
> >  		iwm_link_on(iwm);
> >  
> > -		memcpy(wrqu.ap_addr.sa_data, complete->bssid, ETH_ALEN);
> > +		cfg80211_connect_result(iwm_to_ndev(iwm),
> > +					complete->bssid,
> > +					NULL, 0, NULL, 0,
> > +					WLAN_STATUS_SUCCESS, GFP_KERNEL);
> >  		break;
> >  	case UMAC_ASSOC_COMPLETE_FAILURE:
> >  		clear_bit(IWM_STATUS_ASSOCIATED, &iwm->status);
> > @@ -529,6 +532,11 @@ static int iwm_mlme_assoc_complete(struc
> >  		iwm->channel = 0;
> >  
> >  		iwm_link_off(iwm);
> > +
> > +		cfg80211_connect_result(iwm_to_ndev(iwm), complete->bssid,
> > +					NULL, 0, NULL, 0,
> > +					WLAN_STATUS_UNSPECIFIED_FAILURE,
> > +					GFP_KERNEL);
> >  	default:
> >  		break;
> >  	}
> > @@ -538,9 +546,6 @@ static int iwm_mlme_assoc_complete(struc
> >  		return 0;
> >  	}
> >  
> > -	wrqu.ap_addr.sa_family = ARPHRD_ETHER;
> > -	wireless_send_event(iwm_to_ndev(iwm), SIOCGIWAP, &wrqu, NULL);
> > -
> >  	return 0;
> >  }
> >  



-- 
Intel Open Source Technology Centre
http://oss.intel.com/
---------------------------------------------------------------------
Intel Corporation SAS (French simplified joint stock company)
Registered headquarters: "Les Montalets"- 2, rue de Paris, 
92196 Meudon Cedex, France
Registration Number:  302 456 199 R.C.S. NANTERRE
Capital: 4,572,000 Euros

This e-mail and any attachments may contain confidential material for
the sole use of the intended recipient(s). Any review or distribution
by others is strictly prohibited. If you are not the intended
recipient, please contact the sender and delete all copies.


  reply	other threads:[~2009-07-03 13:08 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-07-01 19:26 [PATCH 00/20 v4] wireless patch dump Johannes Berg
2009-07-01 19:26 ` [PATCH 01/20 v4] wext: allow returning NULL stats Johannes Berg
2009-07-01 19:26 ` [PATCH 02/20 v4] mac80211: fix todo lock Johannes Berg
2009-07-01 19:26 ` [PATCH 03/20 v4] wext: default to y Johannes Berg
2009-07-01 19:26 ` [PATCH 04/20 v4] cfg80211: move break statement to correct place Johannes Berg
2009-07-01 19:26 ` [PATCH 05/20 v4] nl80211: clean up function definitions Johannes Berg
2009-07-01 19:26 ` [PATCH 06/20 v4] cfg80211: use proper allocation flags Johannes Berg
2009-07-01 19:26 ` [PATCH 07/20 v4] cfg80211: remove wireless_dev->bssid Johannes Berg
2009-07-01 19:26 ` [PATCH 08/20 v4] mac80211: tell SME about real auth state Johannes Berg
2009-07-01 19:26 ` [PATCH 09/20 v4] wext: constify extra argument to wireless_send_event Johannes Berg
2009-07-01 19:26 ` [PATCH 10/20 v4] cfg80211: introduce nl80211 testmode command Johannes Berg
2009-07-01 19:26 ` [PATCH 11/20 v4] mac80211: remove an unused function declaration Johannes Berg
2009-07-01 19:26 ` [PATCH 12/20 v4] wireless: define AKM suites Johannes Berg
2009-07-01 19:26 ` [PATCH 13/20 v4] cfg80211: connect/disconnect API Johannes Berg
2009-07-01 19:26 ` [PATCH 14/20 v4] cfg80211: emulate connect with auth/assoc Johannes Berg
2009-07-02  7:13   ` [PATCH 14/20 v4.1] " Johannes Berg
2009-07-01 19:26 ` [PATCH 15/20 v4] cfg80211: managed mode wext compatibility Johannes Berg
2009-07-02 23:55   ` [PATCH] iwmc3200wifi: cfg80211 managed mode port Samuel Ortiz
2009-07-03  8:02     ` Johannes Berg
2009-07-03 13:10       ` Samuel Ortiz [this message]
2009-07-05  1:37     ` Johannes Berg
2009-07-03  0:00   ` [PATCH] cfg80211: check for current_bss from giwrate Samuel Ortiz
2009-07-03  8:01     ` Johannes Berg
2009-07-01 19:26 ` [PATCH 16/20 v4] cfg80211: implement iwpower Johannes Berg
2009-07-01 19:26 ` [PATCH 17/20 v4] cfg80211: implement IWAP for WDS Johannes Berg
2009-07-01 19:26 ` [PATCH 18/20 v4] cfg80211: implement IWRATE Johannes Berg
2009-07-01 19:27 ` [PATCH 19/20 v4] cfg80211: implement get_wireless_stats Johannes Berg
2009-07-01 19:27 ` [PATCH 20/20 v4] mac80211: re-add HT disabling Johannes Berg
2009-07-01 19:40 ` [PATCH 21/20 v4] mac80211: remove auth algorithm retry Johannes Berg
2009-07-01 19:41 ` [PATCH 22/20 v4] mac80211: remove dead code, clean up Johannes Berg
2009-07-02  7:58 ` [PATCH] cfg80211: send events for userspace SME Johannes Berg

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20090703131037.GA4215@sortiz.org \
    --to=samuel.ortiz@intel.com \
    --cc=johannes@sipsolutions.net \
    --cc=linux-wireless@vger.kernel.org \
    --cc=linville@tuxdriver.com \
    --cc=yi.zhu@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).