All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 1/4] nl80211: Parse channel type attribute in an IBSS join request
@ 2011-08-29 14:15 Alexander Simon
  2011-08-29 14:30 ` [PATCH v2 2/4] cfg80211: Add cfg80211_get_bss_ht to also match HT configuration Alexander Simon
                   ` (4 more replies)
  0 siblings, 5 replies; 13+ messages in thread
From: Alexander Simon @ 2011-08-29 14:15 UTC (permalink / raw)
  To: linux-wireless

Check if the requested HT mode can be used.
Extend cfg80211 IBSS struct for HT mode.

Signed-off-by: Alexander Simon <alexander.simon@saxnet.de>
---
 include/net/cfg80211.h |   11 +++++++++++
 net/wireless/chan.c    |   11 ++++++-----
 net/wireless/nl80211.c |   30 +++++++++++++++++++++++++++---
 3 files changed, 44 insertions(+), 8 deletions(-)

diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h
index 88112ca..6d6e4b1 100644
--- a/include/net/cfg80211.h
+++ b/include/net/cfg80211.h
@@ -1085,6 +1085,7 @@ struct cfg80211_ibss_params {
 	u8 *ssid;
 	u8 *bssid;
 	struct ieee80211_channel *channel;
+	enum nl80211_channel_type channel_type;
 	u8 *ie;
 	u8 ssid_len, ie_len;
 	u16 beacon_interval;
@@ -3086,6 +3087,16 @@ void cfg80211_cqm_pktloss_notify(struct net_device *dev,
 void cfg80211_gtk_rekey_notify(struct net_device *dev, const u8 *bssid,
 			       const u8 *replay_ctr, gfp_t gfp);
 
+/**
+ * cfg80211_can_use_ext_chan - test if ht40 on extension channel can be used
+ * @wiphy: the wiphy
+ * @chan: main channel
+ * @channel_type: HT mode
+ */
+bool cfg80211_can_use_ext_chan(struct wiphy *wiphy,
+			       struct ieee80211_channel *chan,
+			       enum nl80211_channel_type channel_type);
+
 /* Logging, debugging and troubleshooting/diagnostic helpers. */
 
 /* wiphy_printk helpers, similar to dev_printk */
diff --git a/net/wireless/chan.c b/net/wireless/chan.c
index 17cd0c0..8a9ab99 100644
--- a/net/wireless/chan.c
+++ b/net/wireless/chan.c
@@ -44,9 +44,9 @@ rdev_freq_to_chan(struct cfg80211_registered_device *rdev,
 	return chan;
 }
 
-static bool can_beacon_sec_chan(struct wiphy *wiphy,
-				struct ieee80211_channel *chan,
-				enum nl80211_channel_type channel_type)
+bool cfg80211_can_use_ext_chan(struct wiphy *wiphy,
+			       struct ieee80211_channel *chan,
+			       enum nl80211_channel_type channel_type)
 {
 	struct ieee80211_channel *sec_chan;
 	int diff;
@@ -75,6 +75,7 @@ static bool can_beacon_sec_chan(struct wiphy *wiphy,
 
 	return true;
 }
+EXPORT_SYMBOL(cfg80211_can_use_ext_chan);
 
 int cfg80211_set_freq(struct cfg80211_registered_device *rdev,
 		      struct wireless_dev *wdev, int freq,
@@ -109,8 +110,8 @@ int cfg80211_set_freq(struct cfg80211_registered_device *rdev,
 		switch (channel_type) {
 		case NL80211_CHAN_HT40PLUS:
 		case NL80211_CHAN_HT40MINUS:
-			if (!can_beacon_sec_chan(&rdev->wiphy, chan,
-						 channel_type)) {
+			if (!cfg80211_can_use_ext_chan(&rdev->wiphy, chan,
+						       channel_type)) {
 				printk(KERN_DEBUG
 				       "cfg80211: Secondary channel not "
 				       "allowed to initiate communication\n");
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index bddb559..50589df 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -4468,11 +4468,35 @@ static int nl80211_join_ibss(struct sk_buff *skb, struct genl_info *info)
 		ibss.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
 	}
 
-	ibss.channel = ieee80211_get_channel(wiphy,
-		nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ]));
+	if (info->attrs[NL80211_ATTR_WIPHY_CHANNEL_TYPE]) {
+		enum nl80211_channel_type channel_type;
+
+		channel_type = nla_get_u32(
+			info->attrs[NL80211_ATTR_WIPHY_CHANNEL_TYPE]);
+		if (channel_type != NL80211_CHAN_NO_HT &&
+		    channel_type != NL80211_CHAN_HT20 &&
+		    channel_type != NL80211_CHAN_HT40PLUS &&
+		    channel_type != NL80211_CHAN_HT40MINUS)
+			return -EINVAL;
+		ibss.channel_type = channel_type;
+	} else {
+		ibss.channel_type = NL80211_CHAN_NO_HT;
+	}
+
+	ibss.channel = rdev_freq_to_chan(rdev,
+		nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ]),
+		ibss.channel_type);
 	if (!ibss.channel ||
+	    ibss.channel->flags & IEEE80211_CHAN_PASSIVE_SCAN ||
 	    ibss.channel->flags & IEEE80211_CHAN_NO_IBSS ||
-	    ibss.channel->flags & IEEE80211_CHAN_DISABLED)
+	    ibss.channel->flags & IEEE80211_CHAN_RADAR)
+		return -EINVAL;
+
+	/* Both channels should be able to initiate communication */
+	if ((ibss.channel_type == NL80211_CHAN_HT40PLUS ||
+	     ibss.channel_type == NL80211_CHAN_HT40MINUS) &&
+	    !cfg80211_can_use_ext_chan(&rdev->wiphy, ibss.channel,
+				       ibss.channel_type))
 		return -EINVAL;
 
 	ibss.channel_fixed = !!info->attrs[NL80211_ATTR_FREQ_FIXED];
-- 
1.7.3.4



^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v2 2/4] cfg80211: Add cfg80211_get_bss_ht to also match HT configuration
  2011-08-29 14:15 [PATCH v2 1/4] nl80211: Parse channel type attribute in an IBSS join request Alexander Simon
@ 2011-08-29 14:30 ` Alexander Simon
  2011-08-31  6:37   ` Johannes Berg
  2011-09-09 14:07   ` Marek Lindner
  2011-08-29 14:31 ` [PATCH v2 3/4] mac80211: Add HT helper functions Alexander Simon
                   ` (3 subsequent siblings)
  4 siblings, 2 replies; 13+ messages in thread
From: Alexander Simon @ 2011-08-29 14:30 UTC (permalink / raw)
  To: linux-wireless

Keep cfg80211_get_bss for compatibility but make use of this new function by
matching any HT configuration.

Signed-off-by: Alexander Simon <alexander.simon@saxnet.de>
---
 include/net/cfg80211.h |   35 ++++++++++++++++++++++++++++-------
 net/wireless/scan.c    |   39 ++++++++++++++++++++++++++++++++++++---
 2 files changed, 64 insertions(+), 10 deletions(-)

diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h
index 6d6e4b1..a461b68 100644
--- a/include/net/cfg80211.h
+++ b/include/net/cfg80211.h
@@ -2577,18 +2577,39 @@ cfg80211_inform_bss(struct wiphy *wiphy,
 		    const u8 *ie, size_t ielen,
 		    s32 signal, gfp_t gfp);
 
-struct cfg80211_bss *cfg80211_get_bss(struct wiphy *wiphy,
-				      struct ieee80211_channel *channel,
-				      const u8 *bssid,
-				      const u8 *ssid, size_t ssid_len,
-				      u16 capa_mask, u16 capa_val);
+/**
+ * cfg80211_get_bss_ht - search for an BSS in scan results
+ * @wiphy: the wiphy
+ * @bssid: BSSID to match, if set
+ * @ssid: SSID to match
+ * @ssid_len: length of the SSID
+ * @capa_mask: AND mask for capabilities comparison
+ * @capa_val: SSID capabilities to match
+ * @check_ht: if to match for an HT mode
+ * @ht_mode: HT mode to match
+ *
+ * Return the first BSS found in the last scan.
+ * No match return NULL.
+ */
+struct cfg80211_bss *
+cfg80211_get_bss_ht(struct wiphy *wiphy, struct ieee80211_channel *channel,
+		    const u8 *bssid, const u8 *ssid, size_t ssid_len,
+		    u16 capa_mask, u16 capa_val, bool check_ht,
+		    enum nl80211_channel_type ht_mode);
+
+struct cfg80211_bss *
+cfg80211_get_bss(struct wiphy *wiphy, struct ieee80211_channel *channel,
+		 const u8 *bssid, const u8 *ssid, size_t ssid_len,
+		 u16 capa_mask, u16 capa_val);
+
 static inline struct cfg80211_bss *
 cfg80211_get_ibss(struct wiphy *wiphy,
 		  struct ieee80211_channel *channel,
 		  const u8 *ssid, size_t ssid_len)
 {
-	return cfg80211_get_bss(wiphy, channel, NULL, ssid, ssid_len,
-				WLAN_CAPABILITY_IBSS, WLAN_CAPABILITY_IBSS);
+	return cfg80211_get_bss_ht(wiphy, channel, NULL, ssid, ssid_len,
+				   WLAN_CAPABILITY_IBSS, WLAN_CAPABILITY_IBSS,
+				   false, NL80211_CHAN_NO_HT);
 }
 
 struct cfg80211_bss *cfg80211_get_mesh(struct wiphy *wiphy,
diff --git a/net/wireless/scan.c b/net/wireless/scan.c
index b0f0039..dcc608b 100644
--- a/net/wireless/scan.c
+++ b/net/wireless/scan.c
@@ -365,6 +365,21 @@ struct cfg80211_bss *cfg80211_get_bss(struct wiphy 
*wiphy,
 				      const u8 *ssid, size_t ssid_len,
 				      u16 capa_mask, u16 capa_val)
 {
+	/* call HT version with no HT requirements */
+	return cfg80211_get_bss_ht(wiphy, channel, bssid, ssid, ssid_len,
+				   capa_mask, capa_val, false,
+				   NL80211_CHAN_NO_HT);
+}
+EXPORT_SYMBOL(cfg80211_get_bss);
+
+struct cfg80211_bss *cfg80211_get_bss_ht(struct wiphy *wiphy,
+				         struct ieee80211_channel *channel,
+				         const u8 *bssid,
+				         const u8 *ssid, size_t ssid_len,
+				         u16 capa_mask, u16 capa_val,
+				         bool check_ht,
+				         enum nl80211_channel_type ht_mode)
+{
 	struct cfg80211_registered_device *dev = wiphy_to_dev(wiphy);
 	struct cfg80211_internal_bss *bss, *res = NULL;
 	unsigned long now = jiffies;
@@ -374,8 +389,26 @@ struct cfg80211_bss *cfg80211_get_bss(struct wiphy 
*wiphy,
 	list_for_each_entry(bss, &dev->bss_list, list) {
 		if ((bss->pub.capability & capa_mask) != capa_val)
 			continue;
-		if (channel && bss->pub.channel != channel)
-			continue;
+		if (channel) {
+			if (bss->pub.channel != channel)
+				continue;
+			if (check_ht) {
+				struct ieee80211_ht_info *ht_info;
+				ht_info = (struct ieee80211_ht_info *)
+					ieee80211_bss_get_ie(&bss->pub,
+						       WLAN_EID_HT_INFORMATION);
+				if (!ht_info)
+					continue;
+				if (ht_mode == NL80211_CHAN_HT40MINUS &&
+					      !(ht_info->ht_param &
+					      IEEE80211_HT_PARAM_CHA_SEC_BELOW))
+					continue;
+				if (ht_mode == NL80211_CHAN_HT40PLUS &&
+					      !(ht_info->ht_param &
+					      IEEE80211_HT_PARAM_CHA_SEC_ABOVE))
+					continue;
+			}
+		}
 		/* Don't get expired BSS structs */
 		if (time_after(now, bss->ts + IEEE80211_SCAN_RESULT_EXPIRE) &&
 		    !atomic_read(&bss->hold))
@@ -392,7 +425,7 @@ struct cfg80211_bss *cfg80211_get_bss(struct wiphy *wiphy,
 		return NULL;
 	return &res->pub;
 }
-EXPORT_SYMBOL(cfg80211_get_bss);
+EXPORT_SYMBOL(cfg80211_get_bss_ht);
 
 struct cfg80211_bss *cfg80211_get_mesh(struct wiphy *wiphy,
 				       struct ieee80211_channel *channel,
-- 
1.7.3.4



^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v2 3/4] mac80211: Add HT helper functions
  2011-08-29 14:15 [PATCH v2 1/4] nl80211: Parse channel type attribute in an IBSS join request Alexander Simon
  2011-08-29 14:30 ` [PATCH v2 2/4] cfg80211: Add cfg80211_get_bss_ht to also match HT configuration Alexander Simon
@ 2011-08-29 14:31 ` Alexander Simon
  2011-08-31  6:38   ` Johannes Berg
  2011-08-29 14:32 ` [PATCH v2 4/4] mac80211: Add HT operation modes for IBSS Alexander Simon
                   ` (2 subsequent siblings)
  4 siblings, 1 reply; 13+ messages in thread
From: Alexander Simon @ 2011-08-29 14:31 UTC (permalink / raw)
  To: linux-wireless

Some refactoring for IBSS HT.

Move HT info and capability IEs building code into separate functions.
---
 net/mac80211/ieee80211_i.h |    6 +++
 net/mac80211/util.c        |   91 +++++++++++++++++++++++++++++++++++--------
 net/mac80211/work.c        |   29 +-------------
 3 files changed, 81 insertions(+), 45 deletions(-)

diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h
index c204cee..ad94e59 100644
--- a/net/mac80211/ieee80211_i.h
+++ b/net/mac80211/ieee80211_i.h
@@ -1338,6 +1338,12 @@ void ieee80211_recalc_smps(struct ieee80211_local 
*local);
 size_t ieee80211_ie_split(const u8 *ies, size_t ielen,
 			  const u8 *ids, int n_ids, size_t offset);
 size_t ieee80211_ie_split_vendor(const u8 *ies, size_t ielen, size_t offset);
+u8 *ieee80211_ie_build_ht_cap(u8 *pos, struct ieee80211_supported_band 
*sband,
+			       u16 cap);
+u8 *ieee80211_ie_build_ht_info(u8 *pos,
+				struct ieee80211_sta_ht_cap *ht_cap,
+				struct ieee80211_channel *channel,
+				enum nl80211_channel_type channel_type);
 
 /* internal work items */
 void ieee80211_work_init(struct ieee80211_local *local);
diff --git a/net/mac80211/util.c b/net/mac80211/util.c
index ce916ff..a7697d8 100644
--- a/net/mac80211/util.c
+++ b/net/mac80211/util.c
@@ -816,23 +816,8 @@ int ieee80211_build_preq_ies(struct ieee80211_local 
*local, u8 *buffer,
 		offset = noffset;
 	}
 
-	if (sband->ht_cap.ht_supported) {
-		u16 cap = sband->ht_cap.cap;
-		__le16 tmp;
-
-		*pos++ = WLAN_EID_HT_CAPABILITY;
-		*pos++ = sizeof(struct ieee80211_ht_cap);
-		memset(pos, 0, sizeof(struct ieee80211_ht_cap));
-		tmp = cpu_to_le16(cap);
-		memcpy(pos, &tmp, sizeof(u16));
-		pos += sizeof(u16);
-		*pos++ = sband->ht_cap.ampdu_factor |
-			 (sband->ht_cap.ampdu_density <<
-				IEEE80211_HT_AMPDU_PARM_DENSITY_SHIFT);
-		memcpy(pos, &sband->ht_cap.mcs, sizeof(sband->ht_cap.mcs));
-		pos += sizeof(sband->ht_cap.mcs);
-		pos += 2 + 4 + 1; /* ext info, BF cap, antsel */
-	}
+	if (sband->ht_cap.ht_supported)
+		pos = ieee80211_ie_build_ht_cap(pos, sband, sband->ht_cap.cap);
 
 	/*
 	 * If adding more here, adjust code in main.c
@@ -1356,3 +1341,75 @@ void ieee80211_disable_rssi_reports(struct 
ieee80211_vif *vif)
 	_ieee80211_enable_rssi_reports(sdata, 0, 0);
 }
 EXPORT_SYMBOL(ieee80211_disable_rssi_reports);
+
+u8 *ieee80211_ie_build_ht_cap(u8 *pos, struct ieee80211_supported_band 
*sband,
+			       u16 cap)
+{
+	__le16 tmp;
+
+	*pos++ = WLAN_EID_HT_CAPABILITY;
+	*pos++ = sizeof(struct ieee80211_ht_cap);
+	memset(pos, 0, sizeof(struct ieee80211_ht_cap));
+
+	/* capability flags */
+	tmp = cpu_to_le16(cap);
+	memcpy(pos, &tmp, sizeof(u16));
+	pos += sizeof(u16);
+
+	/* AMPDU parameters */
+	*pos++ = sband->ht_cap.ampdu_factor |
+		 (sband->ht_cap.ampdu_density <<
+			IEEE80211_HT_AMPDU_PARM_DENSITY_SHIFT);
+
+	/* MCS set */
+	memcpy(pos, &sband->ht_cap.mcs, sizeof(sband->ht_cap.mcs));
+	pos += sizeof(sband->ht_cap.mcs);
+
+	/* extended capabilities */
+	pos += sizeof(__le16);
+
+	/* BF capabilities */
+	pos += sizeof(__le32);
+
+	/* antenna selection */
+	pos += sizeof(u8);
+
+	return pos;
+}
+
+u8 *ieee80211_ie_build_ht_info(u8 *pos,
+				struct ieee80211_sta_ht_cap *ht_cap,
+				struct ieee80211_channel *channel,
+				enum nl80211_channel_type channel_type)
+{
+	struct ieee80211_ht_info *ht_info;
+	/* Build HT Information */
+	*pos++ = WLAN_EID_HT_INFORMATION;
+	*pos++ = sizeof(struct ieee80211_ht_info);
+	ht_info = (struct ieee80211_ht_info *)pos;
+	ht_info->control_chan =
+			ieee80211_frequency_to_channel(channel->center_freq);
+	switch (channel_type) {
+	case NL80211_CHAN_HT40MINUS:
+		ht_info->ht_param = IEEE80211_HT_PARAM_CHA_SEC_BELOW;
+		break;
+	case NL80211_CHAN_HT40PLUS:
+		ht_info->ht_param = IEEE80211_HT_PARAM_CHA_SEC_ABOVE;
+		break;
+	case NL80211_CHAN_HT20:
+	default:
+		ht_info->ht_param = IEEE80211_HT_PARAM_CHA_SEC_NONE;
+		break;
+	}
+	if (ht_cap->cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40)
+		ht_info->ht_param |= IEEE80211_HT_PARAM_CHAN_WIDTH_ANY;
+	ht_info->operation_mode = 0x0000;
+	ht_info->stbc_param = 0x0000;
+
+	/* It seems that Basic MCS set and Supported MCS set
+	   are identical for the first 10 bytes */
+	memset(&ht_info->basic_set, 0, 16);
+	memcpy(&ht_info->basic_set, &ht_cap->mcs, 10);
+
+	return pos + sizeof(struct ieee80211_ht_info);
+}
diff --git a/net/mac80211/work.c b/net/mac80211/work.c
index 380b9a7..8d9251c 100644
--- a/net/mac80211/work.c
+++ b/net/mac80211/work.c
@@ -103,7 +103,6 @@ static void ieee80211_add_ht_ie(struct sk_buff *skb, const 
u8 *ht_info_ie,
 	u8 *pos;
 	u32 flags = channel->flags;
 	u16 cap = sband->ht_cap.cap;
-	__le16 tmp;
 
 	if (!sband->ht_cap.ht_supported)
 		return;
@@ -154,34 +153,8 @@ static void ieee80211_add_ht_ie(struct sk_buff *skb, 
const u8 *ht_info_ie,
 	}
 
 	/* reserve and fill IE */
-
 	pos = skb_put(skb, sizeof(struct ieee80211_ht_cap) + 2);
-	*pos++ = WLAN_EID_HT_CAPABILITY;
-	*pos++ = sizeof(struct ieee80211_ht_cap);
-	memset(pos, 0, sizeof(struct ieee80211_ht_cap));
-
-	/* capability flags */
-	tmp = cpu_to_le16(cap);
-	memcpy(pos, &tmp, sizeof(u16));
-	pos += sizeof(u16);
-
-	/* AMPDU parameters */
-	*pos++ = sband->ht_cap.ampdu_factor |
-		 (sband->ht_cap.ampdu_density <<
-			IEEE80211_HT_AMPDU_PARM_DENSITY_SHIFT);
-
-	/* MCS set */
-	memcpy(pos, &sband->ht_cap.mcs, sizeof(sband->ht_cap.mcs));
-	pos += sizeof(sband->ht_cap.mcs);
-
-	/* extended capabilities */
-	pos += sizeof(__le16);
-
-	/* BF capabilities */
-	pos += sizeof(__le32);
-
-	/* antenna selection */
-	pos += sizeof(u8);
+	ieee80211_ie_build_ht_cap(pos, sband, cap);
 }
 
 static void ieee80211_send_assoc(struct ieee80211_sub_if_data *sdata,
-- 
1.7.3.4



^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v2 4/4] mac80211: Add HT operation modes for IBSS
  2011-08-29 14:15 [PATCH v2 1/4] nl80211: Parse channel type attribute in an IBSS join request Alexander Simon
  2011-08-29 14:30 ` [PATCH v2 2/4] cfg80211: Add cfg80211_get_bss_ht to also match HT configuration Alexander Simon
  2011-08-29 14:31 ` [PATCH v2 3/4] mac80211: Add HT helper functions Alexander Simon
@ 2011-08-29 14:32 ` Alexander Simon
  2011-09-09 14:17   ` Marek Lindner
  2011-08-31  6:36 ` [PATCH v2 1/4] nl80211: Parse channel type attribute in an IBSS join request Johannes Berg
  2011-08-31 15:51 ` Marek Lindner
  4 siblings, 1 reply; 13+ messages in thread
From: Alexander Simon @ 2011-08-29 14:32 UTC (permalink / raw)
  To: linux-wireless

This means setting channel into HT mode and adding HT IEs in beacons.
Check if regdom allows this first.

If joining another HT network, use its HT mode.
If joining a non-HT network, use HT mode given by iw.
Join as legacy if neither iw nor remote beacon set an HT mode.
The same applies when merging with an older BSSID
(as it is basically leaving the current and joining the older BSSID).

If we receive a beacon from another station within our BSSID with a different 
HT
mode than us, we switch to its HT mode. If there are several stations with
different HT modes, it may take some time until all will have the same mode.
There is no way we can distinguish the "older" station.

Except for fixed channel mode, HT mode is also fixed. Join or merge ONLY if
channel AND HT mode matches.

And finally, allow frame aggregation in IBSS mode.

Signed-off-by: Alexander Simon <alexander.simon@saxnet.de>
---
 net/mac80211/agg-rx.c      |    2 +
 net/mac80211/agg-tx.c      |    5 +-
 net/mac80211/ht.c          |    2 +
 net/mac80211/ibss.c        |  154 ++++++++++++++++++++++++++++++++++++++-----
 net/mac80211/ieee80211_i.h |    4 +
 net/mac80211/rx.c          |    6 +-
 net/mac80211/util.c        |   25 +++++++
 7 files changed, 177 insertions(+), 21 deletions(-)

diff --git a/net/mac80211/agg-rx.c b/net/mac80211/agg-rx.c
index fd1aaf2..057c2a1 100644
--- a/net/mac80211/agg-rx.c
+++ b/net/mac80211/agg-rx.c
@@ -184,6 +184,8 @@ static void ieee80211_send_addba_resp(struct 
ieee80211_sub_if_data *sdata, u8 *d
 		memcpy(mgmt->bssid, sdata->vif.addr, ETH_ALEN);
 	else if (sdata->vif.type == NL80211_IFTYPE_STATION)
 		memcpy(mgmt->bssid, sdata->u.mgd.bssid, ETH_ALEN);
+	else if (sdata->vif.type == NL80211_IFTYPE_ADHOC)
+		memcpy(mgmt->bssid, sdata->u.ibss.bssid, ETH_ALEN);
 
 	mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
 					  IEEE80211_STYPE_ACTION);
diff --git a/net/mac80211/agg-tx.c b/net/mac80211/agg-tx.c
index 018108d..da91773 100644
--- a/net/mac80211/agg-tx.c
+++ b/net/mac80211/agg-tx.c
@@ -83,6 +83,8 @@ static void ieee80211_send_addba_request(struct 
ieee80211_sub_if_data *sdata,
 		memcpy(mgmt->bssid, sdata->vif.addr, ETH_ALEN);
 	else if (sdata->vif.type == NL80211_IFTYPE_STATION)
 		memcpy(mgmt->bssid, sdata->u.mgd.bssid, ETH_ALEN);
+	else if (sdata->vif.type == NL80211_IFTYPE_ADHOC)
+		memcpy(mgmt->bssid, sdata->u.ibss.bssid, ETH_ALEN);
 
 	mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
 					  IEEE80211_STYPE_ACTION);
@@ -380,7 +382,8 @@ int ieee80211_start_tx_ba_session(struct ieee80211_sta 
*pubsta, u16 tid,
 	 */
 	if (sdata->vif.type != NL80211_IFTYPE_STATION &&
 	    sdata->vif.type != NL80211_IFTYPE_AP_VLAN &&
-	    sdata->vif.type != NL80211_IFTYPE_AP)
+	    sdata->vif.type != NL80211_IFTYPE_AP &&
+	    sdata->vif.type != NL80211_IFTYPE_ADHOC)
 		return -EINVAL;
 
 	if (test_sta_flags(sta, WLAN_STA_BLOCK_BA)) {
diff --git a/net/mac80211/ht.c b/net/mac80211/ht.c
index 7cfc286..211ebaf 100644
--- a/net/mac80211/ht.c
+++ b/net/mac80211/ht.c
@@ -203,6 +203,8 @@ void ieee80211_send_delba(struct ieee80211_sub_if_data 
*sdata,
 		memcpy(mgmt->bssid, sdata->vif.addr, ETH_ALEN);
 	else if (sdata->vif.type == NL80211_IFTYPE_STATION)
 		memcpy(mgmt->bssid, sdata->u.mgd.bssid, ETH_ALEN);
+	else if (sdata->vif.type == NL80211_IFTYPE_ADHOC)
+		memcpy(mgmt->bssid, sdata->u.ibss.bssid, ETH_ALEN);
 
 	mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
 					  IEEE80211_STYPE_ACTION);
diff --git a/net/mac80211/ibss.c b/net/mac80211/ibss.c
index 56c24ca..a9667c5 100644
--- a/net/mac80211/ibss.c
+++ b/net/mac80211/ibss.c
@@ -35,6 +35,56 @@
 
 #define IEEE80211_IBSS_MAX_STA_ENTRIES 128
 
+static void ieee80211_update_ht_elems(struct ieee80211_sub_if_data *sdata,
+				      struct ieee80211_mgmt *mgmt,
+				      struct ieee80211_ht_info *ht_info)
+{
+	struct ieee80211_local *local = sdata->local;
+	struct ieee80211_supported_band *sband =
+			local->hw.wiphy->bands[local->oper_channel->band];
+	enum nl80211_channel_type channel_type =
+			ieee80211_ht_info_to_channel_type(ht_info);
+
+	if (!cfg80211_can_use_ext_chan(sdata->wdev.wiphy, local->oper_channel,
+				       channel_type))
+		channel_type = NL80211_CHAN_HT20;
+
+	if (channel_type != local->_oper_channel_type) {
+		struct sk_buff *skb = rcu_dereference_protected(
+				sdata->u.ibss.presp,
+				lockdep_is_held(&ifibss->mtx));
+		struct sk_buff *nskb;
+		u8 *ht_ie;
+
+		/* update HT IE. If not yet existing, create one */
+		nskb = skb_copy(skb, GFP_ATOMIC);
+		ht_ie = (u8 *)cfg80211_find_ie(WLAN_EID_HT_CAPABILITY,
+					       (const u8 *)(nskb->data + 24 +
+							sizeof(mgmt->u.beacon)),
+					       nskb->len - 24 -
+							sizeof(mgmt->u.beacon));
+		if (!ht_ie)
+			ht_ie = skb_put(nskb, 4 +
+					      sizeof(struct ieee80211_ht_cap) +
+					      sizeof(struct ieee80211_ht_info));
+
+		ht_ie = ieee80211_ie_build_ht_cap(ht_ie, sband,
+						  sband->ht_cap.cap);
+		ht_ie = ieee80211_ie_build_ht_info(ht_ie, &sband->ht_cap,
+					     local->oper_channel, channel_type);
+		rcu_assign_pointer(sdata->u.ibss.presp, nskb);
+		kfree_skb(skb);
+
+		if(!ieee80211_set_channel_type(local, sdata, channel_type)) {
+			channel_type = NL80211_CHAN_HT20;
+			WARN_ON(!ieee80211_set_channel_type(local, sdata,
+							    channel_type));
+		}
+
+		ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_CHANNEL);
+	}
+
+}
 
 static void ieee80211_rx_mgmt_auth_ibss(struct ieee80211_sub_if_data *sdata,
 					struct ieee80211_mgmt *mgmt,
@@ -64,6 +114,7 @@ static void ieee80211_rx_mgmt_auth_ibss(struct 
ieee80211_sub_if_data *sdata,
 static void __ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
 				      const u8 *bssid, const int beacon_int,
 				      struct ieee80211_channel *chan,
+				      enum nl80211_channel_type channel_type,
 				      const u32 basic_rates,
 				      const u16 capability, u64 tsf)
 {
@@ -104,8 +155,17 @@ static void __ieee80211_sta_join_ibss(struct 
ieee80211_sub_if_data *sdata,
 
 	sdata->drop_unencrypted = capability & WLAN_CAPABILITY_PRIVACY ? 1 : 0;
 
+	/* entering a legacy IBSS. Use given HT configuration. */
+	if (channel_type == NL80211_CHAN_NO_HT)
+		channel_type = ifibss->channel_type;
 	local->oper_channel = chan;
-	WARN_ON(!ieee80211_set_channel_type(local, sdata, NL80211_CHAN_NO_HT));
+
+	/* if phy is on a different extension channel, setting ht40 will fail */
+	if (!ieee80211_set_channel_type(local, sdata, channel_type)) {
+		channel_type = NL80211_CHAN_HT20;
+		WARN_ON(!ieee80211_set_channel_type(local, sdata,
+						    channel_type));
+	}
 	ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_CHANNEL);
 
 	sband = local->hw.wiphy->bands[chan->band];
@@ -171,6 +231,18 @@ static void __ieee80211_sta_join_ibss(struct 
ieee80211_sub_if_data *sdata,
 		memcpy(skb_put(skb, ifibss->ie_len),
 		       ifibss->ie, ifibss->ie_len);
 
+	/* add HT capability and information IEs */
+	if (channel_type != NL80211_CHAN_NO_HT && sband->ht_cap.ht_supported) {
+		pos = skb_put(skb, 4 +
+				   sizeof(struct ieee80211_ht_cap) +
+				   sizeof(struct ieee80211_ht_info));
+		pos = ieee80211_ie_build_ht_cap(pos, sband, sband->ht_cap.cap);
+		pos = ieee80211_ie_build_ht_info(pos,
+						 &sband->ht_cap,
+						 chan,
+						 channel_type);
+	}
+
 	if (local->hw.queues >= 4) {
 		pos = skb_put(skb, 9);
 		*pos++ = WLAN_EID_VENDOR_SPECIFIC;
@@ -219,6 +291,8 @@ static void ieee80211_sta_join_ibss(struct 
ieee80211_sub_if_data *sdata,
 	u32 basic_rates;
 	int i, j;
 	u16 beacon_int = cbss->beacon_interval;
+	const u8 *ht_info_ie;
+	enum nl80211_channel_type channel_type = NL80211_CHAN_NO_HT;
 
 	lockdep_assert_held(&sdata->u.ibss.mtx);
 
@@ -242,9 +316,24 @@ static void ieee80211_sta_join_ibss(struct 
ieee80211_sub_if_data *sdata,
 		}
 	}
 
+	ht_info_ie = ieee80211_bss_get_ie(cbss, WLAN_EID_HT_INFORMATION);
+	if (ht_info_ie)
+		channel_type = ieee80211_ht_info_to_channel_type(
+			(struct ieee80211_ht_info *) (ht_info_ie + 2));
+
+	if (!cfg80211_can_use_ext_chan(sdata->wdev.wiphy, cbss->channel,
+				       channel_type)) {
+		channel_type = NL80211_CHAN_HT20;
+#ifdef CONFIG_MAC80211_IBSS_DEBUG
+		printk(KERN_DEBUG "%s: IBSS not allowed on secondary channel\n",
+		       sdata->name);
+#endif
+	}
+
 	__ieee80211_sta_join_ibss(sdata, cbss->bssid,
 				  beacon_int,
 				  cbss->channel,
+				  channel_type,
 				  basic_rates,
 				  cbss->capability,
 				  cbss->tsf);
@@ -310,11 +399,24 @@ static void ieee80211_rx_bss_info(struct 
ieee80211_sub_if_data *sdata,
 			} else
 				sta = ieee80211_ibss_add_sta(sdata, mgmt->bssid,
 						mgmt->sa, supp_rates,
-						GFP_ATOMIC);
+						elems->ht_cap_elem, GFP_ATOMIC);
 		}
 
-		if (sta && elems->wmm_info)
-			set_sta_flags(sta, WLAN_STA_WME);
+		if (sta) {
+			if (elems->wmm_info)
+				set_sta_flags(sta, WLAN_STA_WME);
+
+			/* remote station uses ht */
+			if (elems->ht_info_elem) {
+				ieee80211_update_ht_elems(sdata, mgmt,
+							  elems->ht_info_elem);
+				ieee80211_ht_cap_ie_to_sta_ht_cap(
+						local->hw.wiphy->bands[
+						     local->oper_channel->band],
+						elems->ht_cap_elem,
+						&sta->sta.ht_cap);
+			}
+		}
 
 		rcu_read_unlock();
 	}
@@ -404,7 +506,8 @@ static void ieee80211_rx_bss_info(struct 
ieee80211_sub_if_data *sdata,
 		ieee80211_sta_join_ibss(sdata, bss);
 		supp_rates = ieee80211_sta_get_rates(local, elems, band);
 		ieee80211_ibss_add_sta(sdata, mgmt->bssid, mgmt->sa,
-				       supp_rates, GFP_KERNEL);
+				       supp_rates, elems->ht_cap_elem,
+				       GFP_KERNEL);
 	}
 
  put_bss:
@@ -417,7 +520,8 @@ static void ieee80211_rx_bss_info(struct 
ieee80211_sub_if_data *sdata,
  * must be callable in atomic context.
  */
 struct sta_info *ieee80211_ibss_add_sta(struct ieee80211_sub_if_data *sdata,
-					u8 *bssid,u8 *addr, u32 supp_rates,
+					u8 *bssid, u8 *addr, u32 supp_rates,
+					struct ieee80211_ht_cap *ht_cap,
 					gfp_t gfp)
 {
 	struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
@@ -458,6 +562,11 @@ struct sta_info *ieee80211_ibss_add_sta(struct 
ieee80211_sub_if_data *sdata,
 	sta->sta.supp_rates[band] = supp_rates |
 			ieee80211_mandatory_rates(local, band);
 
+	/* fill in ht rates */
+	if (ht_cap)
+		ieee80211_ht_cap_ie_to_sta_ht_cap(local->hw.wiphy->bands[band],
+				ht_cap, &sta->sta.ht_cap);
+
 	rate_control_rate_init(sta);
 
 	/* If it fails, maybe we raced another insertion? */
@@ -556,8 +665,8 @@ static void ieee80211_sta_create_ibss(struct 
ieee80211_sub_if_data *sdata)
 		sdata->drop_unencrypted = 0;
 
 	__ieee80211_sta_join_ibss(sdata, bssid, sdata->vif.bss_conf.beacon_int,
-				  ifibss->channel, ifibss->basic_rates,
-				  capability, 0);
+				  ifibss->channel, ifibss->channel_type,
+				  ifibss->basic_rates, capability, 0);
 }
 
 /*
@@ -594,10 +703,12 @@ static void ieee80211_sta_find_ibss(struct 
ieee80211_sub_if_data *sdata)
 		chan = ifibss->channel;
 	if (!is_zero_ether_addr(ifibss->bssid))
 		bssid = ifibss->bssid;
-	cbss = cfg80211_get_bss(local->hw.wiphy, chan, bssid,
-				ifibss->ssid, ifibss->ssid_len,
-				WLAN_CAPABILITY_IBSS | WLAN_CAPABILITY_PRIVACY,
-				capability);
+	cbss = cfg80211_get_bss_ht(local->hw.wiphy, chan, bssid,
+				   ifibss->ssid, ifibss->ssid_len,
+				   WLAN_CAPABILITY_IBSS |
+						WLAN_CAPABILITY_PRIVACY,
+				   capability, ifibss->fixed_channel,
+				   ifibss->channel_type);
 
 	if (cbss) {
 		struct ieee80211_bss *bss;
@@ -896,10 +1007,15 @@ int ieee80211_ibss_join(struct ieee80211_sub_if_data 
*sdata,
 	struct sk_buff *skb;
 
 	skb = dev_alloc_skb(sdata->local->hw.extra_tx_headroom +
-			    36 /* bitrates */ +
-			    34 /* SSID */ +
-			    3  /* DS params */ +
-			    4  /* IBSS params */ +
+			    sizeof(struct ieee80211_hdr_3addr) +
+			    12 /* struct ieee80211_mgmt.u.beacon */ +
+			    2 + IEEE80211_MAX_SSID_LEN /* max SSID */ +
+			    2 + 8 /* max Supported Rates */ +
+			    3 /* max DS params */ +
+			    4 /* IBSS params */ +
+			    2 + (IEEE80211_MAX_SUPP_RATES - 8) +
+			    2 + sizeof(struct ieee80211_ht_cap) +
+			    2 + sizeof(struct ieee80211_ht_info) +
 			    params->ie_len);
 	if (!skb)
 		return -ENOMEM;
@@ -920,13 +1036,15 @@ int ieee80211_ibss_join(struct ieee80211_sub_if_data 
*sdata,
 	sdata->vif.bss_conf.beacon_int = params->beacon_interval;
 
 	sdata->u.ibss.channel = params->channel;
+	sdata->u.ibss.channel_type = params->channel_type;
 	sdata->u.ibss.fixed_channel = params->channel_fixed;
 
 	/* fix ourselves to that channel now already */
 	if (params->channel_fixed) {
 		sdata->local->oper_channel = params->channel;
-		WARN_ON(!ieee80211_set_channel_type(sdata->local, sdata,
-						    NL80211_CHAN_NO_HT));
+		if(!ieee80211_set_channel_type(sdata->local, sdata,
+					       params->channel_type))
+			return -EINVAL;
 	}
 
 	if (params->ie) {
diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h
index ad94e59..f74368b 100644
--- a/net/mac80211/ieee80211_i.h
+++ b/net/mac80211/ieee80211_i.h
@@ -464,6 +464,7 @@ struct ieee80211_if_ibss {
 	u8 ssid_len, ie_len;
 	u8 *ie;
 	struct ieee80211_channel *channel;
+	enum nl80211_channel_type channel_type;
 
 	unsigned long ibss_join_req;
 	/* probe response/beacon for IBSS */
@@ -1084,6 +1085,7 @@ void ieee80211_ibss_notify_scan_completed(struct 
ieee80211_local *local);
 void ieee80211_ibss_setup_sdata(struct ieee80211_sub_if_data *sdata);
 struct sta_info *ieee80211_ibss_add_sta(struct ieee80211_sub_if_data *sdata,
 					u8 *bssid, u8 *addr, u32 supp_rates,
+					struct ieee80211_ht_cap *ht_cap,
 					gfp_t gfp);
 int ieee80211_ibss_join(struct ieee80211_sub_if_data *sdata,
 			struct cfg80211_ibss_params *params);
@@ -1372,6 +1374,8 @@ ieee80211_get_channel_mode(struct ieee80211_local 
*local,
 bool ieee80211_set_channel_type(struct ieee80211_local *local,
 				struct ieee80211_sub_if_data *sdata,
 				enum nl80211_channel_type chantype);
+enum nl80211_channel_type ieee80211_ht_info_to_channel_type(
+					struct ieee80211_ht_info *ht_info);
 
 #ifdef CONFIG_MAC80211_NOINLINE
 #define debug_noinline noinline
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c
index f45fd2f..f10700c 100644
--- a/net/mac80211/rx.c
+++ b/net/mac80211/rx.c
@@ -2160,7 +2160,8 @@ ieee80211_rx_h_action(struct ieee80211_rx_data *rx)
 		 */
 		if (sdata->vif.type != NL80211_IFTYPE_STATION &&
 		    sdata->vif.type != NL80211_IFTYPE_AP_VLAN &&
-		    sdata->vif.type != NL80211_IFTYPE_AP)
+		    sdata->vif.type != NL80211_IFTYPE_AP &&
+		    sdata->vif.type != NL80211_IFTYPE_ADHOC)
 			break;
 
 		/* verify action_code is present */
@@ -2694,7 +2695,8 @@ static int prepare_for_handlers(struct ieee80211_rx_data 
*rx,
 			else
 				rate_idx = status->rate_idx;
 			rx->sta = ieee80211_ibss_add_sta(sdata, bssid,
-					hdr->addr2, BIT(rate_idx), GFP_ATOMIC);
+					hdr->addr2, BIT(rate_idx), NULL,
+								GFP_ATOMIC);
 		}
 		break;
 	case NL80211_IFTYPE_MESH_POINT:
diff --git a/net/mac80211/util.c b/net/mac80211/util.c
index a7697d8..06d0a31 100644
--- a/net/mac80211/util.c
+++ b/net/mac80211/util.c
@@ -1413,3 +1413,28 @@ u8 *ieee80211_ie_build_ht_info(u8 *pos,
 
 	return pos + sizeof(struct ieee80211_ht_info);
 }
+
+enum nl80211_channel_type ieee80211_ht_info_to_channel_type(
+					struct ieee80211_ht_info *ht_info)
+{
+	enum nl80211_channel_type channel_type;
+
+	if (!ht_info)
+		return NL80211_CHAN_NO_HT;
+
+	switch (ht_info->ht_param & IEEE80211_HT_PARAM_CHA_SEC_OFFSET) {
+	case IEEE80211_HT_PARAM_CHA_SEC_NONE:
+		channel_type = NL80211_CHAN_HT20;
+		break;
+	case IEEE80211_HT_PARAM_CHA_SEC_ABOVE:
+		channel_type = NL80211_CHAN_HT40PLUS;
+		break;
+	case IEEE80211_HT_PARAM_CHA_SEC_BELOW:
+		channel_type = NL80211_CHAN_HT40MINUS;
+		break;
+	default:
+		channel_type = NL80211_CHAN_NO_HT;
+	}
+
+	return channel_type;
+}
-- 
1.7.3.4



^ permalink raw reply related	[flat|nested] 13+ messages in thread

* Re: [PATCH v2 1/4] nl80211: Parse channel type attribute in an IBSS join request
  2011-08-29 14:15 [PATCH v2 1/4] nl80211: Parse channel type attribute in an IBSS join request Alexander Simon
                   ` (2 preceding siblings ...)
  2011-08-29 14:32 ` [PATCH v2 4/4] mac80211: Add HT operation modes for IBSS Alexander Simon
@ 2011-08-31  6:36 ` Johannes Berg
  2011-08-31 13:49   ` Alexander Simon
  2011-08-31 15:51 ` Marek Lindner
  4 siblings, 1 reply; 13+ messages in thread
From: Johannes Berg @ 2011-08-31  6:36 UTC (permalink / raw)
  To: Alexander Simon; +Cc: linux-wireless

On Mon, 2011-08-29 at 16:15 +0200, Alexander Simon wrote:

> +/**
> + * cfg80211_can_use_ext_chan - test if ht40 on extension channel can be used
> + * @wiphy: the wiphy
> + * @chan: main channel
> + * @channel_type: HT mode
> + */
> +bool cfg80211_can_use_ext_chan(struct wiphy *wiphy,
> +			       struct ieee80211_channel *chan,
> +			       enum nl80211_channel_type channel_type);

Use for what? That's confusing. You're asking if it can be used for
beaconing, as the old function name *clearly* said. Now you're making it
confusing.

johannes


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v2 2/4] cfg80211: Add cfg80211_get_bss_ht to also match HT configuration
  2011-08-29 14:30 ` [PATCH v2 2/4] cfg80211: Add cfg80211_get_bss_ht to also match HT configuration Alexander Simon
@ 2011-08-31  6:37   ` Johannes Berg
  2011-09-09 14:07   ` Marek Lindner
  1 sibling, 0 replies; 13+ messages in thread
From: Johannes Berg @ 2011-08-31  6:37 UTC (permalink / raw)
  To: Alexander Simon; +Cc: linux-wireless

On Mon, 2011-08-29 at 16:30 +0200, Alexander Simon wrote:

> +/**
> + * cfg80211_get_bss_ht - search for an BSS in scan results
> + * @wiphy: the wiphy
> + * @bssid: BSSID to match, if set
> + * @ssid: SSID to match
> + * @ssid_len: length of the SSID
> + * @capa_mask: AND mask for capabilities comparison
> + * @capa_val: SSID capabilities to match
> + * @check_ht: if to match for an HT mode
> + * @ht_mode: HT mode to match
> + *
> + * Return the first BSS found in the last scan.
> + * No match return NULL.
> + */
> +struct cfg80211_bss *
> +cfg80211_get_bss_ht(struct wiphy *wiphy, struct ieee80211_channel *channel,
> +		    const u8 *bssid, const u8 *ssid, size_t ssid_len,
> +		    u16 capa_mask, u16 capa_val, bool check_ht,
> +		    enum nl80211_channel_type ht_mode);
> +
> +struct cfg80211_bss *
> +cfg80211_get_bss(struct wiphy *wiphy, struct ieee80211_channel *channel,
> +		 const u8 *bssid, const u8 *ssid, size_t ssid_len,
> +		 u16 capa_mask, u16 capa_val);

Make this an inline now.

I'm not happy. I told you this before. Next time I'm just going to say
"read my previous comments".

johannes


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v2 3/4] mac80211: Add HT helper functions
  2011-08-29 14:31 ` [PATCH v2 3/4] mac80211: Add HT helper functions Alexander Simon
@ 2011-08-31  6:38   ` Johannes Berg
  0 siblings, 0 replies; 13+ messages in thread
From: Johannes Berg @ 2011-08-31  6:38 UTC (permalink / raw)
  To: Alexander Simon; +Cc: linux-wireless

On Mon, 2011-08-29 at 16:31 +0200, Alexander Simon wrote:
> Some refactoring for IBSS HT.
> 
> Move HT info and capability IEs building code into separate functions.

Total patch fuckup. No S-o-b, line-wrapped, etc.

johannes



^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v2 1/4] nl80211: Parse channel type attribute in an IBSS join request
  2011-08-31  6:36 ` [PATCH v2 1/4] nl80211: Parse channel type attribute in an IBSS join request Johannes Berg
@ 2011-08-31 13:49   ` Alexander Simon
  2011-09-01 13:18     ` Johannes Berg
  0 siblings, 1 reply; 13+ messages in thread
From: Alexander Simon @ 2011-08-31 13:49 UTC (permalink / raw)
  To: Johannes Berg; +Cc: linux-wireless

> Use for what? That's confusing. You're asking if it can be used for
> beaconing, as the old function name *clearly* said. Now you're making it
> confusing.
I'm not only asking for beaconing. In 4/4, i am using this function to see if 
regdom allows me to use HT40 on the extension channel (beacons and data 
traffic). Hence can_use_ext_chan.

Even cfg80211_set_freq in net/wireless/chan.c uses this to see if we can 
communicate (see printk) on that channel.

So my suggestion would be to use that name. But I'd also use the old if 
preferred.

Alex

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v2 1/4] nl80211: Parse channel type attribute in an IBSS join request
  2011-08-29 14:15 [PATCH v2 1/4] nl80211: Parse channel type attribute in an IBSS join request Alexander Simon
                   ` (3 preceding siblings ...)
  2011-08-31  6:36 ` [PATCH v2 1/4] nl80211: Parse channel type attribute in an IBSS join request Johannes Berg
@ 2011-08-31 15:51 ` Marek Lindner
  2011-08-31 16:44   ` Alexander Simon
  4 siblings, 1 reply; 13+ messages in thread
From: Marek Lindner @ 2011-08-31 15:51 UTC (permalink / raw)
  To: Alexander Simon; +Cc: linux-wireless

On Monday, August 29, 2011 16:15:47 Alexander Simon wrote:
>         if (!ibss.channel ||
> +           ibss.channel->flags & IEEE80211_CHAN_PASSIVE_SCAN ||
>             ibss.channel->flags & IEEE80211_CHAN_NO_IBSS ||
> -           ibss.channel->flags & IEEE80211_CHAN_DISABLED)
> +           ibss.channel->flags & IEEE80211_CHAN_RADAR)
> +               return -EINVAL;

Do you mind elaborating why this patch removes the IEEE80211_CHAN_DISABLED 
check and adds the IEEE80211_CHAN_RADAR check instead ? Copy and paste error ?

Cheers,
Marek

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v2 1/4] nl80211: Parse channel type attribute in an IBSS join request
  2011-08-31 15:51 ` Marek Lindner
@ 2011-08-31 16:44   ` Alexander Simon
  0 siblings, 0 replies; 13+ messages in thread
From: Alexander Simon @ 2011-08-31 16:44 UTC (permalink / raw)
  To: Marek Lindner; +Cc: linux-wireless

Am Mittwoch, 31. August 2011, 17:51:20 schrieben Sie:
> On Monday, August 29, 2011 16:15:47 Alexander Simon wrote:
> >         if (!ibss.channel ||
> > 
> > +           ibss.channel->flags & IEEE80211_CHAN_PASSIVE_SCAN ||
> > 
> >             ibss.channel->flags & IEEE80211_CHAN_NO_IBSS ||
> > 
> > -           ibss.channel->flags & IEEE80211_CHAN_DISABLED)
> > +           ibss.channel->flags & IEEE80211_CHAN_RADAR)
> > +               return -EINVAL;
> 
> Do you mind elaborating why this patch removes the IEEE80211_CHAN_DISABLED
> check and adds the IEEE80211_CHAN_RADAR check instead ? Copy and paste error
> ?
You're right.

I've adopted this from the check in cfg80211_can_use_ext_chan in 
net/wireless/chan.c and probably missed the DISABLED check.

Thanks.
Will be fixed in v3.

Alex

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v2 1/4] nl80211: Parse channel type attribute in an IBSS join request
  2011-08-31 13:49   ` Alexander Simon
@ 2011-09-01 13:18     ` Johannes Berg
  0 siblings, 0 replies; 13+ messages in thread
From: Johannes Berg @ 2011-09-01 13:18 UTC (permalink / raw)
  To: Alexander Simon; +Cc: linux-wireless

On Wed, 2011-08-31 at 15:49 +0200, Alexander Simon wrote:
> > Use for what? That's confusing. You're asking if it can be used for
> > beaconing, as the old function name *clearly* said. Now you're making it
> > confusing.
> I'm not only asking for beaconing. In 4/4, i am using this function to see if 
> regdom allows me to use HT40 on the extension channel (beacons and data 
> traffic). Hence can_use_ext_chan.
> 
> Even cfg80211_set_freq in net/wireless/chan.c uses this to see if we can 
> communicate (see printk) on that channel.
> 
> So my suggestion would be to use that name. But I'd also use the old if 
> preferred.

But the type of usage should be made clear. You're going to use it for
uncontrolled transmissions, so regulatory rules that apply are different
than "can I use this channel to connect to an AP" for example. The "can
beacon" made that obvious. Obviously, if I can beacon, I can also TX
data, but vice versa isn't necessarily true depending on regulatory
rules, since data TX can happen controlled by the AP (e.g. DFS
channels).

johannes


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v2 2/4] cfg80211: Add cfg80211_get_bss_ht to also match HT configuration
  2011-08-29 14:30 ` [PATCH v2 2/4] cfg80211: Add cfg80211_get_bss_ht to also match HT configuration Alexander Simon
  2011-08-31  6:37   ` Johannes Berg
@ 2011-09-09 14:07   ` Marek Lindner
  1 sibling, 0 replies; 13+ messages in thread
From: Marek Lindner @ 2011-09-09 14:07 UTC (permalink / raw)
  To: Alexander Simon; +Cc: linux-wireless

On Monday, August 29, 2011 16:30:41 Alexander Simon wrote:
> +               if (channel) {
> +                       if (bss->pub.channel != channel)
> +                               continue;
> +                       if (check_ht) {
> +                               struct ieee80211_ht_info *ht_info;
> +                               ht_info = (struct ieee80211_ht_info *)
> +                                       ieee80211_bss_get_ie(&bss->pub,
> +                                                      WLAN_EID_HT_INFORMATION); 
> +                               if (!ht_info)
> +                                       continue;
> +                               if (ht_mode == NL80211_CHAN_HT40MINUS &&
> +                                             !(ht_info->ht_param &
> +                                             IEEE80211_HT_PARAM_CHA_SEC_BELOW))
> +                                       continue;
> +                               if (ht_mode == NL80211_CHAN_HT40PLUS &&
> +                                             !(ht_info->ht_param &
> +                                             IEEE80211_HT_PARAM_CHA_SEC_ABOVE))
> +                                       continue;
> +                       }
> +               }

What is the idea behind only checking the ht mode if a channel was specified ?
Is see no immediate need for this dependency - maybe I overlooked something ?

Cheers,
Marek


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v2 4/4] mac80211: Add HT operation modes for IBSS
  2011-08-29 14:32 ` [PATCH v2 4/4] mac80211: Add HT operation modes for IBSS Alexander Simon
@ 2011-09-09 14:17   ` Marek Lindner
  0 siblings, 0 replies; 13+ messages in thread
From: Marek Lindner @ 2011-09-09 14:17 UTC (permalink / raw)
  To: Alexander Simon; +Cc: linux-wireless

On Monday, August 29, 2011 16:32:12 you wrote:
> @@ -380,7 +382,8 @@ int ieee80211_start_tx_ba_session(struct ieee80211_sta
> *pubsta, u16 tid,
>  	 */
>  	if (sdata->vif.type != NL80211_IFTYPE_STATION &&
>  	    sdata->vif.type != NL80211_IFTYPE_AP_VLAN &&
> -	    sdata->vif.type != NL80211_IFTYPE_AP)
> +	    sdata->vif.type != NL80211_IFTYPE_AP &&
> +	    sdata->vif.type != NL80211_IFTYPE_ADHOC)
>  		return -EINVAL;

You should update the comment regarding IBSS mode direct above this check too.


> +		/* update HT IE. If not yet existing, create one */
> +		nskb = skb_copy(skb, GFP_ATOMIC);
> +		ht_ie = (u8 *)cfg80211_find_ie(WLAN_EID_HT_CAPABILITY,
> +					       (const u8 *)(nskb->data + 24 +
> +							sizeof(mgmt->u.beacon)),
> +					       nskb->len - 24 -
> +							sizeof(mgmt->u.beacon));
> +		if (!ht_ie)
> +			ht_ie = skb_put(nskb, 4 +
> +					      sizeof(struct ieee80211_ht_cap) +
> +					      sizeof(struct ieee80211_ht_info));

AFAIK, you can not safely assume that you have enough room left for skb_put(). 
You might trigger a skb_over_panic().


> @@ -2160,7 +2160,8 @@ ieee80211_rx_h_action(struct ieee80211_rx_data *rx)
>  		 */
>  		if (sdata->vif.type != NL80211_IFTYPE_STATION &&
>  		    sdata->vif.type != NL80211_IFTYPE_AP_VLAN &&
> -		    sdata->vif.type != NL80211_IFTYPE_AP)
> +		    sdata->vif.type != NL80211_IFTYPE_AP &&
> +		    sdata->vif.type != NL80211_IFTYPE_ADHOC)
>  			break;

Also requires a "comment update".

Cheers,
Marek

^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2011-09-09 14:17 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-08-29 14:15 [PATCH v2 1/4] nl80211: Parse channel type attribute in an IBSS join request Alexander Simon
2011-08-29 14:30 ` [PATCH v2 2/4] cfg80211: Add cfg80211_get_bss_ht to also match HT configuration Alexander Simon
2011-08-31  6:37   ` Johannes Berg
2011-09-09 14:07   ` Marek Lindner
2011-08-29 14:31 ` [PATCH v2 3/4] mac80211: Add HT helper functions Alexander Simon
2011-08-31  6:38   ` Johannes Berg
2011-08-29 14:32 ` [PATCH v2 4/4] mac80211: Add HT operation modes for IBSS Alexander Simon
2011-09-09 14:17   ` Marek Lindner
2011-08-31  6:36 ` [PATCH v2 1/4] nl80211: Parse channel type attribute in an IBSS join request Johannes Berg
2011-08-31 13:49   ` Alexander Simon
2011-09-01 13:18     ` Johannes Berg
2011-08-31 15:51 ` Marek Lindner
2011-08-31 16:44   ` Alexander Simon

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.