* [PATCH 0/5] wireless: listen to bandwidths preferences
@ 2009-04-02 22:26 Luis R. Rodriguez
2009-04-02 22:26 ` [PATCH 1/5] cfg80211: Process regulatory max bandwidth checks for HT40 Luis R. Rodriguez
` (4 more replies)
0 siblings, 5 replies; 15+ messages in thread
From: Luis R. Rodriguez @ 2009-04-02 22:26 UTC (permalink / raw)
To: linville, johannes; +Cc: linux-wireless, Luis R. Rodriguez
This is an interim fix for dealing with bandwidth checks as
this will all be reworked later. We avoid problems in the future
by not exposing anything new over through an API. Debugfs can be used
to debug these new flags.
Luis R. Rodriguez (5):
cfg80211: Process regulatory max bandwidth checks for HT40
wireless: rename IEEE80211_CHAN_NO_FAT_* to HT40-/+
mac80211: check if HT40+/- is allowed before sending assoc
cfg80211: check allowed channel type upon userspace requests
mac80211: expose HT channel flags through debugfs
drivers/net/wireless/ath/regd.c | 10 +-
drivers/net/wireless/iwlwifi/iwl-core.c | 4 +-
drivers/net/wireless/iwlwifi/iwl-eeprom.c | 8 +-
include/net/wireless.h | 23 +++--
net/mac80211/debugfs.c | 15 +++
net/mac80211/ht.c | 11 ++-
net/mac80211/ieee80211_i.h | 3 +
net/mac80211/mlme.c | 4 +-
net/wireless/nl80211.c | 18 +++
net/wireless/reg.c | 194 ++++++++++++++++++++++------
10 files changed, 226 insertions(+), 64 deletions(-)
^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH 1/5] cfg80211: Process regulatory max bandwidth checks for HT40
2009-04-02 22:26 [PATCH 0/5] wireless: listen to bandwidths preferences Luis R. Rodriguez
@ 2009-04-02 22:26 ` Luis R. Rodriguez
2009-04-03 9:22 ` Johannes Berg
2009-04-02 22:26 ` [PATCH 2/5] wireless: rename IEEE80211_CHAN_NO_FAT_* to HT40-/+ Luis R. Rodriguez
` (3 subsequent siblings)
4 siblings, 1 reply; 15+ messages in thread
From: Luis R. Rodriguez @ 2009-04-02 22:26 UTC (permalink / raw)
To: linville, johannes; +Cc: linux-wireless, Luis R. Rodriguez
We are not correctly listening to the regulatory max bandwidth
settings. To actually make use of it we need to redesign things
a bit. This patch does the work for that. We do this to so we
can obey to regulatory rules accordingly for use of HT40.
We end up dealing with HT40 by having two passes for each channel.
The first check will see if a 20 MHz channel fits into the channel's
center freq on a given frequency range. We check for a 20 MHz
banwidth channel as that is the maximum an individual channel
will use, at least for now. The first pass will go ahead and
check if the regulatory rule for that given center of frequency
allows 40 MHz bandwidths and we use this to determine whether
or not the channel supports HT40 or not. So to support HT40 you'll
need at a regulatory rule that allows you to use 40 MHz channels
but you're channel must also be enabled and support 20 MHz by itself.
The second pass is done after we do the regulatory checks over
an device's supported channel list. On each channel we'll check
if the control channel and the extension both:
o exist
o are enabled
o regulatory allows 40 MHz bandwidth on its frequency range
This work allows allows us to idependently check for HT40- and
HT40+.
Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com>
---
drivers/net/wireless/ath/regd.c | 10 +-
include/net/wireless.h | 15 ++-
net/wireless/reg.c | 194 ++++++++++++++++++++++++++++++---------
3 files changed, 169 insertions(+), 50 deletions(-)
diff --git a/drivers/net/wireless/ath/regd.c b/drivers/net/wireless/ath/regd.c
index 4b5c851..a90c7cf 100644
--- a/drivers/net/wireless/ath/regd.c
+++ b/drivers/net/wireless/ath/regd.c
@@ -201,8 +201,10 @@ ath_reg_apply_beaconing_flags(struct wiphy *wiphy,
continue;
if (initiator == NL80211_REGDOM_SET_BY_COUNTRY_IE) {
- r = freq_reg_info(wiphy, ch->center_freq,
- &bandwidth, ®_rule);
+ r = freq_reg_info(wiphy,
+ ch->center_freq,
+ bandwidth,
+ ®_rule);
if (r)
continue;
/*
@@ -266,7 +268,7 @@ ath_reg_apply_active_scan_flags(struct wiphy *wiphy,
*/
ch = &sband->channels[11]; /* CH 12 */
- r = freq_reg_info(wiphy, ch->center_freq, &bandwidth, ®_rule);
+ r = freq_reg_info(wiphy, ch->center_freq, bandwidth, ®_rule);
if (!r) {
if (!(reg_rule->flags & NL80211_RRF_PASSIVE_SCAN))
if (ch->flags & IEEE80211_CHAN_PASSIVE_SCAN)
@@ -274,7 +276,7 @@ ath_reg_apply_active_scan_flags(struct wiphy *wiphy,
}
ch = &sband->channels[12]; /* CH 13 */
- r = freq_reg_info(wiphy, ch->center_freq, &bandwidth, ®_rule);
+ r = freq_reg_info(wiphy, ch->center_freq, bandwidth, ®_rule);
if (!r) {
if (!(reg_rule->flags & NL80211_RRF_PASSIVE_SCAN))
if (ch->flags & IEEE80211_CHAN_PASSIVE_SCAN)
diff --git a/include/net/wireless.h b/include/net/wireless.h
index 64a7620..e3077e1 100644
--- a/include/net/wireless.h
+++ b/include/net/wireless.h
@@ -44,6 +44,9 @@ enum ieee80211_band {
* is not permitted.
* @IEEE80211_CHAN_NO_FAT_BELOW: extension channel below this channel
* is not permitted.
+ * @IEEE80211_CHAN_NO_HT40: indicates no HT40 is allowed at all,
+ * when this is set %IEEE80211_CHAN_NO_FAT_ABOVE and
+ * %IEEE80211_CHAN_NO_FAT_BELOW will also be set.
*/
enum ieee80211_channel_flags {
IEEE80211_CHAN_DISABLED = 1<<0,
@@ -52,6 +55,7 @@ enum ieee80211_channel_flags {
IEEE80211_CHAN_RADAR = 1<<3,
IEEE80211_CHAN_NO_FAT_ABOVE = 1<<4,
IEEE80211_CHAN_NO_FAT_BELOW = 1<<5,
+ IEEE80211_CHAN_NO_HT40 = 1<<6,
};
/**
@@ -449,9 +453,10 @@ extern void wiphy_apply_custom_regulatory(
* freq_reg_info - get regulatory information for the given frequency
* @wiphy: the wiphy for which we want to process this rule for
* @center_freq: Frequency in KHz for which we want regulatory information for
- * @bandwidth: the bandwidth requirement you have in KHz, if you do not have one
- * you can set this to 0. If this frequency is allowed we then set
- * this value to the maximum allowed bandwidth.
+ * @desired_bw_khz: the desired max bandwidth you want to use per
+ * channel. Note that this is still 20 MHz if you want to use HT40
+ * as HT40 makes use of two channels for its 40 MHz width bandwidth.
+ * If set to 0 we'll assume you want the standard 20 MHz.
* @reg_rule: the regulatory rule which we have for this frequency
*
* Use this function to get the regulatory rule for a specific frequency on
@@ -466,7 +471,9 @@ extern void wiphy_apply_custom_regulatory(
* freq_in_rule_band() for our current definition of a band -- this is purely
* subjective and right now its 802.11 specific.
*/
-extern int freq_reg_info(struct wiphy *wiphy, u32 center_freq, u32 *bandwidth,
+extern int freq_reg_info(struct wiphy *wiphy,
+ u32 center_freq,
+ u32 desired_bw_khz,
const struct ieee80211_reg_rule **reg_rule);
#endif /* __NET_WIRELESS_H */
diff --git a/net/wireless/reg.c b/net/wireless/reg.c
index a3ed913..91f7b34 100644
--- a/net/wireless/reg.c
+++ b/net/wireless/reg.c
@@ -49,12 +49,6 @@ static struct regulatory_request *last_request;
/* To trigger userspace events */
static struct platform_device *reg_pdev;
-/* Keep the ordering from large to small */
-static u32 supported_bandwidths[] = {
- MHZ_TO_KHZ(40),
- MHZ_TO_KHZ(20),
-};
-
/*
* Central wireless core regulatory domains, we only need two,
* the current one and a world regulatory domain in case we have no
@@ -436,19 +430,20 @@ static bool is_valid_rd(const struct ieee80211_regdomain *rd)
return true;
}
-/* Returns value in KHz */
-static u32 freq_max_bandwidth(const struct ieee80211_freq_range *freq_range,
- u32 freq)
+static bool reg_does_bw_fit(const struct ieee80211_freq_range *freq_range,
+ u32 center_freq_khz,
+ u32 bw_khz)
{
- unsigned int i;
- for (i = 0; i < ARRAY_SIZE(supported_bandwidths); i++) {
- u32 start_freq_khz = freq - supported_bandwidths[i]/2;
- u32 end_freq_khz = freq + supported_bandwidths[i]/2;
- if (start_freq_khz >= freq_range->start_freq_khz &&
- end_freq_khz <= freq_range->end_freq_khz)
- return supported_bandwidths[i];
- }
- return 0;
+ u32 start_freq_khz, end_freq_khz;
+
+ start_freq_khz = center_freq_khz - (bw_khz/2);
+ end_freq_khz = center_freq_khz + (bw_khz/2);
+
+ if (start_freq_khz >= freq_range->start_freq_khz &&
+ end_freq_khz <= freq_range->end_freq_khz)
+ return true;
+
+ return false;
}
/**
@@ -848,14 +843,17 @@ static u32 map_regdom_flags(u32 rd_flags)
static int freq_reg_info_regd(struct wiphy *wiphy,
u32 center_freq,
- u32 *bandwidth,
+ u32 desired_bw_khz,
const struct ieee80211_reg_rule **reg_rule,
const struct ieee80211_regdomain *custom_regd)
{
int i;
bool band_rule_found = false;
const struct ieee80211_regdomain *regd;
- u32 max_bandwidth = 0;
+ bool bw_fits = false;
+
+ if (!desired_bw_khz)
+ desired_bw_khz = MHZ_TO_KHZ(20);
regd = custom_regd ? custom_regd : cfg80211_regdomain;
@@ -888,37 +886,53 @@ static int freq_reg_info_regd(struct wiphy *wiphy,
if (!band_rule_found)
band_rule_found = freq_in_rule_band(fr, center_freq);
- max_bandwidth = freq_max_bandwidth(fr, center_freq);
+ bw_fits = reg_does_bw_fit(fr,
+ center_freq,
+ desired_bw_khz);
- if (max_bandwidth && *bandwidth <= max_bandwidth) {
+ if (band_rule_found && bw_fits) {
*reg_rule = rr;
- *bandwidth = max_bandwidth;
- break;
+ return 0;
}
}
if (!band_rule_found)
return -ERANGE;
- return !max_bandwidth;
+ return -EINVAL;
}
EXPORT_SYMBOL(freq_reg_info);
-int freq_reg_info(struct wiphy *wiphy, u32 center_freq, u32 *bandwidth,
- const struct ieee80211_reg_rule **reg_rule)
+int freq_reg_info(struct wiphy *wiphy,
+ u32 center_freq,
+ u32 desired_bw_khz,
+ const struct ieee80211_reg_rule **reg_rule)
{
- return freq_reg_info_regd(wiphy, center_freq,
- bandwidth, reg_rule, NULL);
+ return freq_reg_info_regd(wiphy,
+ center_freq,
+ desired_bw_khz,
+ reg_rule,
+ NULL);
}
+/*
+ * Note that right now we assume the desired channel bandwidth
+ * is always 20 MHz for each individual channel (HT40 uses 20 MHz
+ * per channel, the primary and the extension channel). To support
+ * smaller custom bandwidths such as 5 MHz or 10 MHz we'll need a
+ * new ieee80211_channel.target_bw and re run the regulatory check
+ * on the wiphy with the target_bw specified. Then we can simply use
+ * that below for the desired_bw_khz below.
+ */
static void handle_channel(struct wiphy *wiphy, enum ieee80211_band band,
unsigned int chan_idx)
{
int r;
- u32 flags;
- u32 max_bandwidth = 0;
+ u32 flags, bw_flags = 0;
+ u32 desired_bw_khz = MHZ_TO_KHZ(20);
const struct ieee80211_reg_rule *reg_rule = NULL;
const struct ieee80211_power_rule *power_rule = NULL;
+ const struct ieee80211_freq_range *freq_range = NULL;
struct ieee80211_supported_band *sband;
struct ieee80211_channel *chan;
struct wiphy *request_wiphy = NULL;
@@ -933,8 +947,10 @@ static void handle_channel(struct wiphy *wiphy, enum ieee80211_band band,
flags = chan->orig_flags;
- r = freq_reg_info(wiphy, MHZ_TO_KHZ(chan->center_freq),
- &max_bandwidth, ®_rule);
+ r = freq_reg_info(wiphy,
+ MHZ_TO_KHZ(chan->center_freq),
+ desired_bw_khz,
+ ®_rule);
if (r) {
/*
@@ -977,6 +993,10 @@ static void handle_channel(struct wiphy *wiphy, enum ieee80211_band band,
}
power_rule = ®_rule->power_rule;
+ freq_range = ®_rule->freq_range;
+
+ if (freq_range->max_bandwidth_khz < MHZ_TO_KHZ(40))
+ bw_flags = IEEE80211_CHAN_NO_HT40;
if (last_request->initiator == NL80211_REGDOM_SET_BY_DRIVER &&
request_wiphy && request_wiphy == wiphy &&
@@ -987,19 +1007,19 @@ static void handle_channel(struct wiphy *wiphy, enum ieee80211_band band,
* settings
*/
chan->flags = chan->orig_flags =
- map_regdom_flags(reg_rule->flags);
+ map_regdom_flags(reg_rule->flags) | bw_flags;
chan->max_antenna_gain = chan->orig_mag =
(int) MBI_TO_DBI(power_rule->max_antenna_gain);
- chan->max_bandwidth = KHZ_TO_MHZ(max_bandwidth);
+ chan->max_bandwidth = KHZ_TO_MHZ(desired_bw_khz);
chan->max_power = chan->orig_mpwr =
(int) MBM_TO_DBM(power_rule->max_eirp);
return;
}
- chan->flags = flags | map_regdom_flags(reg_rule->flags);
+ chan->flags = flags | bw_flags | map_regdom_flags(reg_rule->flags);
chan->max_antenna_gain = min(chan->orig_mag,
(int) MBI_TO_DBI(power_rule->max_antenna_gain));
- chan->max_bandwidth = KHZ_TO_MHZ(max_bandwidth);
+ chan->max_bandwidth = KHZ_TO_MHZ(desired_bw_khz);
if (chan->orig_mpwr)
chan->max_power = min(chan->orig_mpwr,
(int) MBM_TO_DBM(power_rule->max_eirp));
@@ -1149,6 +1169,84 @@ static void reg_process_beacons(struct wiphy *wiphy)
wiphy_update_beacon_reg(wiphy);
}
+static void reg_process_ht_flags_channel(struct wiphy *wiphy,
+ enum ieee80211_band band,
+ unsigned int chan_idx)
+{
+ struct ieee80211_supported_band *sband;
+ struct ieee80211_channel *channel, *channel_before, *channel_after;
+ unsigned int i;
+
+ assert_cfg80211_lock();
+
+ sband = wiphy->bands[band];
+ BUG_ON(chan_idx >= sband->n_channels);
+ channel = &sband->channels[chan_idx];
+
+ if (channel->flags &
+ (IEEE80211_CHAN_DISABLED | IEEE80211_CHAN_NO_HT40)) {
+ channel->flags |= IEEE80211_CHAN_NO_FAT_ABOVE |
+ IEEE80211_CHAN_NO_FAT_BELOW;
+ return;
+ }
+
+ /*
+ * We need to ensure the extension channels exist to
+ * be able to use HT40- or HT40+, this finds them (or not)
+ */
+ for (i = 0; i < sband->n_channels; i++) {
+ struct ieee80211_channel *c = &sband->channels[i];
+ if (c->center_freq == (channel->center_freq - 20))
+ channel_before = c;
+ if (c->center_freq == (channel->center_freq + 20))
+ channel_after = c;
+ }
+
+ /*
+ * Please note that this assumes target bandwidth is 20 MHz,
+ * if that ever changes we also need to change the below logic
+ * to include that as well.
+ */
+ if (!channel_before || (channel_before->flags &
+ (IEEE80211_CHAN_DISABLED | IEEE80211_CHAN_NO_HT40)))
+ channel->flags |= IEEE80211_CHAN_NO_FAT_BELOW;
+ else
+ channel->flags &= ~IEEE80211_CHAN_NO_FAT_BELOW;
+
+ if (!channel_after || (channel_after->flags &
+ (IEEE80211_CHAN_DISABLED | IEEE80211_CHAN_NO_HT40)))
+ channel->flags |= IEEE80211_CHAN_NO_FAT_ABOVE;
+ else
+ channel->flags &= ~IEEE80211_CHAN_NO_FAT_ABOVE;
+}
+
+static void reg_process_ht_flags_band(struct wiphy *wiphy,
+ enum ieee80211_band band)
+{
+ unsigned int i;
+ struct ieee80211_supported_band *sband;
+
+ BUG_ON(!wiphy->bands[band]);
+ sband = wiphy->bands[band];
+
+ for (i = 0; i < sband->n_channels; i++)
+ reg_process_ht_flags_channel(wiphy, band, i);
+}
+
+static void reg_process_ht_flags(struct wiphy *wiphy)
+{
+ enum ieee80211_band band;
+
+ if (!wiphy)
+ return;
+
+ for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
+ if (wiphy->bands[band])
+ reg_process_ht_flags_band(wiphy, band);
+ }
+
+}
+
void wiphy_update_regulatory(struct wiphy *wiphy,
enum nl80211_reg_initiator initiator)
{
@@ -1162,6 +1260,7 @@ void wiphy_update_regulatory(struct wiphy *wiphy,
}
out:
reg_process_beacons(wiphy);
+ reg_process_ht_flags(wiphy);
if (wiphy->reg_notifier)
wiphy->reg_notifier(wiphy, last_request);
}
@@ -1172,9 +1271,11 @@ static void handle_channel_custom(struct wiphy *wiphy,
const struct ieee80211_regdomain *regd)
{
int r;
- u32 max_bandwidth = 0;
+ u32 desired_bw_khz = MHZ_TO_KHZ(20);
+ u32 bw_flags = 0;
const struct ieee80211_reg_rule *reg_rule = NULL;
const struct ieee80211_power_rule *power_rule = NULL;
+ const struct ieee80211_freq_range *freq_range = NULL;
struct ieee80211_supported_band *sband;
struct ieee80211_channel *chan;
@@ -1182,8 +1283,11 @@ static void handle_channel_custom(struct wiphy *wiphy,
BUG_ON(chan_idx >= sband->n_channels);
chan = &sband->channels[chan_idx];
- r = freq_reg_info_regd(wiphy, MHZ_TO_KHZ(chan->center_freq),
- &max_bandwidth, ®_rule, regd);
+ r = freq_reg_info_regd(wiphy,
+ MHZ_TO_KHZ(chan->center_freq),
+ desired_bw_khz,
+ ®_rule,
+ regd);
if (r) {
chan->flags = IEEE80211_CHAN_DISABLED;
@@ -1191,10 +1295,16 @@ static void handle_channel_custom(struct wiphy *wiphy,
}
power_rule = ®_rule->power_rule;
+ freq_range = ®_rule->freq_range;
+
+ if (freq_range->max_bandwidth_khz < MHZ_TO_KHZ(40))
+ bw_flags = IEEE80211_CHAN_NO_HT40 |
+ IEEE80211_CHAN_NO_FAT_BELOW |
+ IEEE80211_CHAN_NO_FAT_ABOVE;
- chan->flags |= map_regdom_flags(reg_rule->flags);
+ chan->flags |= map_regdom_flags(reg_rule->flags) | bw_flags;
chan->max_antenna_gain = (int) MBI_TO_DBI(power_rule->max_antenna_gain);
- chan->max_bandwidth = KHZ_TO_MHZ(max_bandwidth);
+ chan->max_bandwidth = KHZ_TO_MHZ(desired_bw_khz);
chan->max_power = (int) MBM_TO_DBM(power_rule->max_eirp);
}
--
1.6.0.6
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 2/5] wireless: rename IEEE80211_CHAN_NO_FAT_* to HT40-/+
2009-04-02 22:26 [PATCH 0/5] wireless: listen to bandwidths preferences Luis R. Rodriguez
2009-04-02 22:26 ` [PATCH 1/5] cfg80211: Process regulatory max bandwidth checks for HT40 Luis R. Rodriguez
@ 2009-04-02 22:26 ` Luis R. Rodriguez
2009-04-03 15:01 ` Gábor Stefanik
2009-04-02 22:26 ` [PATCH 3/5] mac80211: check if HT40+/- is allowed before sending assoc Luis R. Rodriguez
` (2 subsequent siblings)
4 siblings, 1 reply; 15+ messages in thread
From: Luis R. Rodriguez @ 2009-04-02 22:26 UTC (permalink / raw)
To: linville, johannes; +Cc: linux-wireless, Luis R. Rodriguez
This is more consistent with our nl80211 naming convention
for HT40-/+.
Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com>
---
drivers/net/wireless/iwlwifi/iwl-core.c | 4 ++--
drivers/net/wireless/iwlwifi/iwl-eeprom.c | 8 ++++----
include/net/wireless.h | 12 ++++++------
net/mac80211/mlme.c | 4 ++--
net/wireless/reg.c | 16 ++++++++--------
5 files changed, 22 insertions(+), 22 deletions(-)
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.c b/drivers/net/wireless/iwlwifi/iwl-core.c
index c54fb93..d558797 100644
--- a/drivers/net/wireless/iwlwifi/iwl-core.c
+++ b/drivers/net/wireless/iwlwifi/iwl-core.c
@@ -591,10 +591,10 @@ static u8 iwl_is_channel_extension(struct iwl_priv *priv,
if (extension_chan_offset == IEEE80211_HT_PARAM_CHA_SEC_ABOVE)
return !(ch_info->fat_extension_channel &
- IEEE80211_CHAN_NO_FAT_ABOVE);
+ IEEE80211_CHAN_NO_HT40PLUS);
else if (extension_chan_offset == IEEE80211_HT_PARAM_CHA_SEC_BELOW)
return !(ch_info->fat_extension_channel &
- IEEE80211_CHAN_NO_FAT_BELOW);
+ IEEE80211_CHAN_NO_HT40MINUS);
return 0;
}
diff --git a/drivers/net/wireless/iwlwifi/iwl-eeprom.c b/drivers/net/wireless/iwlwifi/iwl-eeprom.c
index 75517d0..9d73f19 100644
--- a/drivers/net/wireless/iwlwifi/iwl-eeprom.c
+++ b/drivers/net/wireless/iwlwifi/iwl-eeprom.c
@@ -481,8 +481,8 @@ int iwl_init_channel_map(struct iwl_priv *priv)
/* First write that fat is not enabled, and then enable
* one by one */
ch_info->fat_extension_channel =
- (IEEE80211_CHAN_NO_FAT_ABOVE |
- IEEE80211_CHAN_NO_FAT_BELOW);
+ (IEEE80211_CHAN_NO_HT40PLUS |
+ IEEE80211_CHAN_NO_HT40MINUS);
if (!(is_channel_valid(ch_info))) {
IWL_DEBUG_INFO(priv, "Ch. %d Flags %x [%sGHz] - "
@@ -561,7 +561,7 @@ int iwl_init_channel_map(struct iwl_priv *priv)
fat_extension_chan = 0;
else
fat_extension_chan =
- IEEE80211_CHAN_NO_FAT_BELOW;
+ IEEE80211_CHAN_NO_HT40MINUS;
/* Set up driver's info for lower half */
iwl_set_fat_chan_info(priv, ieeeband,
@@ -573,7 +573,7 @@ int iwl_init_channel_map(struct iwl_priv *priv)
iwl_set_fat_chan_info(priv, ieeeband,
(eeprom_ch_index[ch] + 4),
&(eeprom_ch_info[ch]),
- IEEE80211_CHAN_NO_FAT_ABOVE);
+ IEEE80211_CHAN_NO_HT40PLUS);
}
}
diff --git a/include/net/wireless.h b/include/net/wireless.h
index e3077e1..0331d26 100644
--- a/include/net/wireless.h
+++ b/include/net/wireless.h
@@ -40,21 +40,21 @@ enum ieee80211_band {
* on this channel.
* @IEEE80211_CHAN_NO_IBSS: IBSS is not allowed on this channel.
* @IEEE80211_CHAN_RADAR: Radar detection is required on this channel.
- * @IEEE80211_CHAN_NO_FAT_ABOVE: extension channel above this channel
+ * @IEEE80211_CHAN_NO_HT40PLUS: extension channel above this channel
* is not permitted.
- * @IEEE80211_CHAN_NO_FAT_BELOW: extension channel below this channel
+ * @IEEE80211_CHAN_NO_HT40MINUS: extension channel below this channel
* is not permitted.
* @IEEE80211_CHAN_NO_HT40: indicates no HT40 is allowed at all,
- * when this is set %IEEE80211_CHAN_NO_FAT_ABOVE and
- * %IEEE80211_CHAN_NO_FAT_BELOW will also be set.
+ * when this is set %IEEE80211_CHAN_NO_HT40PLUS and
+ * %IEEE80211_CHAN_NO_HT40MINUS will also be set.
*/
enum ieee80211_channel_flags {
IEEE80211_CHAN_DISABLED = 1<<0,
IEEE80211_CHAN_PASSIVE_SCAN = 1<<1,
IEEE80211_CHAN_NO_IBSS = 1<<2,
IEEE80211_CHAN_RADAR = 1<<3,
- IEEE80211_CHAN_NO_FAT_ABOVE = 1<<4,
- IEEE80211_CHAN_NO_FAT_BELOW = 1<<5,
+ IEEE80211_CHAN_NO_HT40PLUS = 1<<4,
+ IEEE80211_CHAN_NO_HT40MINUS = 1<<5,
IEEE80211_CHAN_NO_HT40 = 1<<6,
};
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c
index 7ecda9d..3670014 100644
--- a/net/mac80211/mlme.c
+++ b/net/mac80211/mlme.c
@@ -263,13 +263,13 @@ static void ieee80211_send_assoc(struct ieee80211_sub_if_data *sdata)
switch (ht_info->ht_param & IEEE80211_HT_PARAM_CHA_SEC_OFFSET) {
case IEEE80211_HT_PARAM_CHA_SEC_ABOVE:
- if (flags & IEEE80211_CHAN_NO_FAT_ABOVE) {
+ if (flags & IEEE80211_CHAN_NO_HT40PLUS) {
cap &= ~IEEE80211_HT_CAP_SUP_WIDTH_20_40;
cap &= ~IEEE80211_HT_CAP_SGI_40;
}
break;
case IEEE80211_HT_PARAM_CHA_SEC_BELOW:
- if (flags & IEEE80211_CHAN_NO_FAT_BELOW) {
+ if (flags & IEEE80211_CHAN_NO_HT40MINUS) {
cap &= ~IEEE80211_HT_CAP_SUP_WIDTH_20_40;
cap &= ~IEEE80211_HT_CAP_SGI_40;
}
diff --git a/net/wireless/reg.c b/net/wireless/reg.c
index 91f7b34..6f25ef4 100644
--- a/net/wireless/reg.c
+++ b/net/wireless/reg.c
@@ -1185,8 +1185,8 @@ static void reg_process_ht_flags_channel(struct wiphy *wiphy,
if (channel->flags &
(IEEE80211_CHAN_DISABLED | IEEE80211_CHAN_NO_HT40)) {
- channel->flags |= IEEE80211_CHAN_NO_FAT_ABOVE |
- IEEE80211_CHAN_NO_FAT_BELOW;
+ channel->flags |= IEEE80211_CHAN_NO_HT40PLUS |
+ IEEE80211_CHAN_NO_HT40MINUS;
return;
}
@@ -1209,15 +1209,15 @@ static void reg_process_ht_flags_channel(struct wiphy *wiphy,
*/
if (!channel_before || (channel_before->flags &
(IEEE80211_CHAN_DISABLED | IEEE80211_CHAN_NO_HT40)))
- channel->flags |= IEEE80211_CHAN_NO_FAT_BELOW;
+ channel->flags |= IEEE80211_CHAN_NO_HT40MINUS;
else
- channel->flags &= ~IEEE80211_CHAN_NO_FAT_BELOW;
+ channel->flags &= ~IEEE80211_CHAN_NO_HT40MINUS;
if (!channel_after || (channel_after->flags &
(IEEE80211_CHAN_DISABLED | IEEE80211_CHAN_NO_HT40)))
- channel->flags |= IEEE80211_CHAN_NO_FAT_ABOVE;
+ channel->flags |= IEEE80211_CHAN_NO_HT40PLUS;
else
- channel->flags &= ~IEEE80211_CHAN_NO_FAT_ABOVE;
+ channel->flags &= ~IEEE80211_CHAN_NO_HT40PLUS;
}
static void reg_process_ht_flags_band(struct wiphy *wiphy,
@@ -1299,8 +1299,8 @@ static void handle_channel_custom(struct wiphy *wiphy,
if (freq_range->max_bandwidth_khz < MHZ_TO_KHZ(40))
bw_flags = IEEE80211_CHAN_NO_HT40 |
- IEEE80211_CHAN_NO_FAT_BELOW |
- IEEE80211_CHAN_NO_FAT_ABOVE;
+ IEEE80211_CHAN_NO_HT40MINUS |
+ IEEE80211_CHAN_NO_HT40PLUS;
chan->flags |= map_regdom_flags(reg_rule->flags) | bw_flags;
chan->max_antenna_gain = (int) MBI_TO_DBI(power_rule->max_antenna_gain);
--
1.6.0.6
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 3/5] mac80211: check if HT40+/- is allowed before sending assoc
2009-04-02 22:26 [PATCH 0/5] wireless: listen to bandwidths preferences Luis R. Rodriguez
2009-04-02 22:26 ` [PATCH 1/5] cfg80211: Process regulatory max bandwidth checks for HT40 Luis R. Rodriguez
2009-04-02 22:26 ` [PATCH 2/5] wireless: rename IEEE80211_CHAN_NO_FAT_* to HT40-/+ Luis R. Rodriguez
@ 2009-04-02 22:26 ` Luis R. Rodriguez
2009-04-03 9:22 ` Johannes Berg
2009-04-02 22:26 ` [PATCH 4/5] cfg80211: check allowed channel type upon userspace requests Luis R. Rodriguez
2009-04-02 22:26 ` [PATCH 5/5] mac80211: expose HT channel flags through debugfs Luis R. Rodriguez
4 siblings, 1 reply; 15+ messages in thread
From: Luis R. Rodriguez @ 2009-04-02 22:26 UTC (permalink / raw)
To: linville, johannes; +Cc: linux-wireless, Luis R. Rodriguez
We weren't checking this at all.
Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com>
---
net/mac80211/ht.c | 11 +++++++++--
1 files changed, 9 insertions(+), 2 deletions(-)
diff --git a/net/mac80211/ht.c b/net/mac80211/ht.c
index 4e3c72f..01010e0 100644
--- a/net/mac80211/ht.c
+++ b/net/mac80211/ht.c
@@ -114,6 +114,9 @@ u32 ieee80211_enable_ht(struct ieee80211_sub_if_data *sdata,
ieee80211_channel_to_frequency(hti->control_chan))
enable_ht = false;
+ if (local->hw.conf.channel->flags & IEEE80211_CHAN_NO_HT40)
+ enable_ht = false;
+
if (enable_ht) {
channel_type = NL80211_CHAN_HT20;
@@ -122,10 +125,14 @@ u32 ieee80211_enable_ht(struct ieee80211_sub_if_data *sdata,
(hti->ht_param & IEEE80211_HT_PARAM_CHAN_WIDTH_ANY)) {
switch(hti->ht_param & IEEE80211_HT_PARAM_CHA_SEC_OFFSET) {
case IEEE80211_HT_PARAM_CHA_SEC_ABOVE:
- channel_type = NL80211_CHAN_HT40PLUS;
+ if (local->hw.conf.channel->flags &
+ IEEE80211_CHAN_NO_HT40PLUS)
+ channel_type = NL80211_CHAN_HT40PLUS;
break;
case IEEE80211_HT_PARAM_CHA_SEC_BELOW:
- channel_type = NL80211_CHAN_HT40MINUS;
+ if (local->hw.conf.channel->flags &
+ IEEE80211_CHAN_NO_HT40MINUS)
+ channel_type = NL80211_CHAN_HT40MINUS;
break;
}
}
--
1.6.0.6
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 4/5] cfg80211: check allowed channel type upon userspace requests
2009-04-02 22:26 [PATCH 0/5] wireless: listen to bandwidths preferences Luis R. Rodriguez
` (2 preceding siblings ...)
2009-04-02 22:26 ` [PATCH 3/5] mac80211: check if HT40+/- is allowed before sending assoc Luis R. Rodriguez
@ 2009-04-02 22:26 ` Luis R. Rodriguez
2009-04-03 9:23 ` Johannes Berg
2009-04-02 22:26 ` [PATCH 5/5] mac80211: expose HT channel flags through debugfs Luis R. Rodriguez
4 siblings, 1 reply; 15+ messages in thread
From: Luis R. Rodriguez @ 2009-04-02 22:26 UTC (permalink / raw)
To: linville, johannes; +Cc: linux-wireless, Luis R. Rodriguez
Thanks to nl80211 userspace can be very specific upon device
configuration. Before processing the request for the new HT40
channel types (HT40- or HT40+) we need to ensure we can use them
regulatory-wise. This wasn't required with wireless extensions as
specifying the channel type wasn't not available and configuration
was done towards the end implicitly upon association or reception
of beacons from the AP. For the new nl80211 we have to check this
when configuring the interfaces explicitly.
Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com>
---
net/wireless/nl80211.c | 18 ++++++++++++++++++
1 files changed, 18 insertions(+), 0 deletions(-)
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index 411c233..1d05b17 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -457,6 +457,24 @@ static int nl80211_set_wiphy(struct sk_buff *skb, struct genl_info *info)
if (!chan || chan->flags & IEEE80211_CHAN_DISABLED)
goto bad_res;
+ if (channel_type == NL80211_CHAN_HT40MINUS ||
+ channel_type == NL80211_CHAN_HT40PLUS)
+ if (chan->flags & IEEE80211_CHAN_NO_HT40)
+ goto bad_res;
+
+ if (channel_type == NL80211_CHAN_HT40MINUS &&
+ (chan->flags & IEEE80211_CHAN_NO_HT40MINUS))
+ goto bad_res;
+ else if (channel_type == NL80211_CHAN_HT40PLUS &&
+ (chan->flags & IEEE80211_CHAN_NO_HT40PLUS))
+ goto bad_res;
+
+ /*
+ * At this point we know if that if HT40 was requested
+ * we are allowed to use it and the extension channel
+ * exists.
+ */
+
if (channel_type == NL80211_CHAN_HT40MINUS)
sec_freq = freq - 20;
else if (channel_type == NL80211_CHAN_HT40PLUS)
--
1.6.0.6
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 5/5] mac80211: expose HT channel flags through debugfs
2009-04-02 22:26 [PATCH 0/5] wireless: listen to bandwidths preferences Luis R. Rodriguez
` (3 preceding siblings ...)
2009-04-02 22:26 ` [PATCH 4/5] cfg80211: check allowed channel type upon userspace requests Luis R. Rodriguez
@ 2009-04-02 22:26 ` Luis R. Rodriguez
2009-04-03 9:24 ` Johannes Berg
4 siblings, 1 reply; 15+ messages in thread
From: Luis R. Rodriguez @ 2009-04-02 22:26 UTC (permalink / raw)
To: linville, johannes; +Cc: linux-wireless, Luis R. Rodriguez
Since we are not going to be exporting HT40-/+
flags for now through nl80211 we supply the channel
flags as a whole through debugfs so users/testers can
see whether or not HT40-/+ is allowed.
Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com>
---
net/mac80211/debugfs.c | 15 +++++++++++++++
net/mac80211/ieee80211_i.h | 3 +++
2 files changed, 18 insertions(+), 0 deletions(-)
diff --git a/net/mac80211/debugfs.c b/net/mac80211/debugfs.c
index 210b9b6..e6b36e9 100644
--- a/net/mac80211/debugfs.c
+++ b/net/mac80211/debugfs.c
@@ -51,6 +51,15 @@ static const struct file_operations name## _ops = { \
DEBUGFS_READONLY_FILE(frequency, 20, "%d",
local->hw.conf.channel->center_freq);
+DEBUGFS_READONLY_FILE(ht40allowed, 20, "%d",
+ !(local->hw.conf.channel->flags &
+ IEEE80211_CHAN_NO_HT40));
+DEBUGFS_READONLY_FILE(ht40plusallowed, 20, "%d",
+ !(local->hw.conf.channel->flags &
+ IEEE80211_CHAN_NO_HT40PLUS));
+DEBUGFS_READONLY_FILE(ht40minusallowed, 20, "%d",
+ !(local->hw.conf.channel->flags &
+ IEEE80211_CHAN_NO_HT40MINUS));
DEBUGFS_READONLY_FILE(rts_threshold, 20, "%d",
local->rts_threshold);
DEBUGFS_READONLY_FILE(fragmentation_threshold, 20, "%d",
@@ -269,6 +278,9 @@ void debugfs_hw_add(struct ieee80211_local *local)
local->debugfs.keys = debugfs_create_dir("keys", phyd);
DEBUGFS_ADD(frequency);
+ DEBUGFS_ADD(ht40allowed);
+ DEBUGFS_ADD(ht40plusallowed);
+ DEBUGFS_ADD(ht40minusallowed);
DEBUGFS_ADD(rts_threshold);
DEBUGFS_ADD(fragmentation_threshold);
DEBUGFS_ADD(short_retry_limit);
@@ -324,6 +336,9 @@ void debugfs_hw_add(struct ieee80211_local *local)
void debugfs_hw_del(struct ieee80211_local *local)
{
DEBUGFS_DEL(frequency);
+ DEBUGFS_DEL(ht40allowed);
+ DEBUGFS_DEL(ht40plusallowed);
+ DEBUGFS_DEL(ht40minusallowed);
DEBUGFS_DEL(rts_threshold);
DEBUGFS_DEL(fragmentation_threshold);
DEBUGFS_DEL(short_retry_limit);
diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h
index e6ed78c..f48cab9 100644
--- a/net/mac80211/ieee80211_i.h
+++ b/net/mac80211/ieee80211_i.h
@@ -750,6 +750,9 @@ struct ieee80211_local {
struct dentry *rcdir;
struct dentry *rcname;
struct dentry *frequency;
+ struct dentry *ht40allowed;
+ struct dentry *ht40plusallowed;
+ struct dentry *ht40minusallowed;
struct dentry *rts_threshold;
struct dentry *fragmentation_threshold;
struct dentry *short_retry_limit;
--
1.6.0.6
^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [PATCH 1/5] cfg80211: Process regulatory max bandwidth checks for HT40
2009-04-02 22:26 ` [PATCH 1/5] cfg80211: Process regulatory max bandwidth checks for HT40 Luis R. Rodriguez
@ 2009-04-03 9:22 ` Johannes Berg
0 siblings, 0 replies; 15+ messages in thread
From: Johannes Berg @ 2009-04-03 9:22 UTC (permalink / raw)
To: Luis R. Rodriguez; +Cc: linville, linux-wireless
[-- Attachment #1: Type: text/plain, Size: 472 bytes --]
On Thu, 2009-04-02 at 18:26 -0400, Luis R. Rodriguez wrote:
> enum ieee80211_channel_flags {
> IEEE80211_CHAN_DISABLED = 1<<0,
> @@ -52,6 +55,7 @@ enum ieee80211_channel_flags {
> IEEE80211_CHAN_RADAR = 1<<3,
> IEEE80211_CHAN_NO_FAT_ABOVE = 1<<4,
> IEEE80211_CHAN_NO_FAT_BELOW = 1<<5,
> + IEEE80211_CHAN_NO_HT40 = 1<<6,
> };
As we've talked about, just a little work and you can live without this
constant [just for John's benefit]
johannes
[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 836 bytes --]
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 3/5] mac80211: check if HT40+/- is allowed before sending assoc
2009-04-02 22:26 ` [PATCH 3/5] mac80211: check if HT40+/- is allowed before sending assoc Luis R. Rodriguez
@ 2009-04-03 9:22 ` Johannes Berg
0 siblings, 0 replies; 15+ messages in thread
From: Johannes Berg @ 2009-04-03 9:22 UTC (permalink / raw)
To: Luis R. Rodriguez; +Cc: linville, linux-wireless
[-- Attachment #1: Type: text/plain, Size: 884 bytes --]
On Thu, 2009-04-02 at 18:26 -0400, Luis R. Rodriguez wrote:
> We weren't checking this at all.
>
> Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com>
> ---
> net/mac80211/ht.c | 11 +++++++++--
> 1 files changed, 9 insertions(+), 2 deletions(-)
>
> diff --git a/net/mac80211/ht.c b/net/mac80211/ht.c
> index 4e3c72f..01010e0 100644
> --- a/net/mac80211/ht.c
> +++ b/net/mac80211/ht.c
> @@ -114,6 +114,9 @@ u32 ieee80211_enable_ht(struct ieee80211_sub_if_data *sdata,
> ieee80211_channel_to_frequency(hti->control_chan))
> enable_ht = false;
>
> + if (local->hw.conf.channel->flags & IEEE80211_CHAN_NO_HT40)
> + enable_ht = false;
> +
> if (enable_ht) {
> channel_type = NL80211_CHAN_HT20;
And that's a bug -- it disallows HT20. But you don't need to check
NO_HT40, just below you check each of the two options anyway.
johannes
[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 836 bytes --]
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 4/5] cfg80211: check allowed channel type upon userspace requests
2009-04-02 22:26 ` [PATCH 4/5] cfg80211: check allowed channel type upon userspace requests Luis R. Rodriguez
@ 2009-04-03 9:23 ` Johannes Berg
0 siblings, 0 replies; 15+ messages in thread
From: Johannes Berg @ 2009-04-03 9:23 UTC (permalink / raw)
To: Luis R. Rodriguez; +Cc: linville, linux-wireless
[-- Attachment #1: Type: text/plain, Size: 1084 bytes --]
On Thu, 2009-04-02 at 18:26 -0400, Luis R. Rodriguez wrote:
> @@ -457,6 +457,24 @@ static int nl80211_set_wiphy(struct sk_buff *skb, struct genl_info *info)
> if (!chan || chan->flags & IEEE80211_CHAN_DISABLED)
> goto bad_res;
>
> + if (channel_type == NL80211_CHAN_HT40MINUS ||
> + channel_type == NL80211_CHAN_HT40PLUS)
> + if (chan->flags & IEEE80211_CHAN_NO_HT40)
> + goto bad_res;
> +
> + if (channel_type == NL80211_CHAN_HT40MINUS &&
> + (chan->flags & IEEE80211_CHAN_NO_HT40MINUS))
> + goto bad_res;
> + else if (channel_type == NL80211_CHAN_HT40PLUS &&
> + (chan->flags & IEEE80211_CHAN_NO_HT40PLUS))
> + goto bad_res;
> +
> + /*
> + * At this point we know if that if HT40 was requested
> + * we are allowed to use it and the extension channel
> + * exists.
> + */
> +
> if (channel_type == NL80211_CHAN_HT40MINUS)
> sec_freq = freq - 20;
> else if (channel_type == NL80211_CHAN_HT40PLUS)
And here you should remove the code below this where we still see the
first three lines.
johannes
[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 836 bytes --]
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 5/5] mac80211: expose HT channel flags through debugfs
2009-04-02 22:26 ` [PATCH 5/5] mac80211: expose HT channel flags through debugfs Luis R. Rodriguez
@ 2009-04-03 9:24 ` Johannes Berg
2009-04-03 18:12 ` Luis R. Rodriguez
0 siblings, 1 reply; 15+ messages in thread
From: Johannes Berg @ 2009-04-03 9:24 UTC (permalink / raw)
To: Luis R. Rodriguez; +Cc: linville, linux-wireless
[-- Attachment #1: Type: text/plain, Size: 301 bytes --]
On Thu, 2009-04-02 at 18:26 -0400, Luis R. Rodriguez wrote:
> +DEBUGFS_READONLY_FILE(ht40allowed, 20, "%d",
> + !(local->hw.conf.channel->flags &
> + IEEE80211_CHAN_NO_HT40));
Why don't you just expose
...FILE(flags, 20, "%#x", local->hw.conf.channel->flags))
?
johannes
[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 836 bytes --]
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 2/5] wireless: rename IEEE80211_CHAN_NO_FAT_* to HT40-/+
2009-04-02 22:26 ` [PATCH 2/5] wireless: rename IEEE80211_CHAN_NO_FAT_* to HT40-/+ Luis R. Rodriguez
@ 2009-04-03 15:01 ` Gábor Stefanik
2009-04-03 18:27 ` Luis R. Rodriguez
0 siblings, 1 reply; 15+ messages in thread
From: Gábor Stefanik @ 2009-04-03 15:01 UTC (permalink / raw)
To: Luis R. Rodriguez; +Cc: linville, johannes, linux-wireless
Greetings!
I think that other references to "fat" should be removed as well, in
favor of "HT40".
On Fri, Apr 3, 2009 at 12:26 AM, Luis R. Rodriguez
<lrodriguez@atheros.com> wrote:
> This is more consistent with our nl80211 naming convention
> for HT40-/+.
>
> Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com>
> ---
> =A0drivers/net/wireless/iwlwifi/iwl-core.c =A0 | =A0 =A04 ++--
> =A0drivers/net/wireless/iwlwifi/iwl-eeprom.c | =A0 =A08 ++++----
> =A0include/net/wireless.h =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0| =A0=
12 ++++++------
> =A0net/mac80211/mlme.c =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 | =
=A0 =A04 ++--
> =A0net/wireless/reg.c =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0=
| =A0 16 ++++++++--------
> =A05 files changed, 22 insertions(+), 22 deletions(-)
>
> diff --git a/drivers/net/wireless/iwlwifi/iwl-core.c b/drivers/net/wi=
reless/iwlwifi/iwl-core.c
> index c54fb93..d558797 100644
> --- a/drivers/net/wireless/iwlwifi/iwl-core.c
> +++ b/drivers/net/wireless/iwlwifi/iwl-core.c
> @@ -591,10 +591,10 @@ static u8 iwl_is_channel_extension(struct iwl_p=
riv *priv,
>
> =A0 =A0 =A0 =A0if (extension_chan_offset =3D=3D IEEE80211_HT_PARAM_CH=
A_SEC_ABOVE)
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0return !(ch_info->fat_extension_channe=
l &
This should be ch_info->ht40_channel or ht40_ext_channel IMO.
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0=
=A0 =A0 IEEE80211_CHAN_NO_FAT_ABOVE);
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0=
=A0 =A0 IEEE80211_CHAN_NO_HT40PLUS);
> =A0 =A0 =A0 =A0else if (extension_chan_offset =3D=3D IEEE80211_HT_PAR=
AM_CHA_SEC_BELOW)
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0return !(ch_info->fat_extension_channe=
l &
Same here.
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0=
=A0 =A0 IEEE80211_CHAN_NO_FAT_BELOW);
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0=
=A0 =A0 IEEE80211_CHAN_NO_HT40MINUS);
>
> =A0 =A0 =A0 =A0return 0;
> =A0}
> diff --git a/drivers/net/wireless/iwlwifi/iwl-eeprom.c b/drivers/net/=
wireless/iwlwifi/iwl-eeprom.c
> index 75517d0..9d73f19 100644
> --- a/drivers/net/wireless/iwlwifi/iwl-eeprom.c
> +++ b/drivers/net/wireless/iwlwifi/iwl-eeprom.c
> @@ -481,8 +481,8 @@ int iwl_init_channel_map(struct iwl_priv *priv)
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0/* First write that fa=
t is not enabled, and then enable
This is especially confusing - "First write that HT40 is disabled"
would be better.
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 * one by one */
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0ch_info->fat_extension=
_channel =3D
ch_info->ht40_channel =3D
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 (IEEE80=
211_CHAN_NO_FAT_ABOVE |
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0IEEE=
80211_CHAN_NO_FAT_BELOW);
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 (IEEE80=
211_CHAN_NO_HT40PLUS |
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0IEEE=
80211_CHAN_NO_HT40MINUS);
>
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0if (!(is_channel_valid=
(ch_info))) {
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0IWL_DE=
BUG_INFO(priv, "Ch. %d Flags %x [%sGHz] - "
> @@ -561,7 +561,7 @@ int iwl_init_channel_map(struct iwl_priv *priv)
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0fat_ex=
tension_chan =3D 0;
Same here.
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0else
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0fat_ex=
tension_chan =3D
Same here.
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0=
=A0 =A0 IEEE80211_CHAN_NO_FAT_BELOW;
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0=
=A0 =A0 IEEE80211_CHAN_NO_HT40MINUS;
>
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0/* Set up driver's inf=
o for lower half */
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0iwl_set_fat_chan_info(=
priv, ieeeband,
iwl_set_ht40_info would sound a lot better.
> @@ -573,7 +573,7 @@ int iwl_init_channel_map(struct iwl_priv *priv)
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0iwl_set_fat_chan_info(=
priv, ieeeband,
Same here.
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0=
=A0 =A0 =A0 =A0 =A0 =A0(eeprom_ch_index[ch] + 4),
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0=
=A0 =A0 =A0 =A0 =A0 =A0&(eeprom_ch_info[ch]),
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0=
=A0 =A0 =A0 =A0 =A0 =A0 IEEE80211_CHAN_NO_FAT_ABOVE);
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0=
=A0 =A0 =A0 =A0 =A0 =A0 IEEE80211_CHAN_NO_HT40PLUS);
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0}
> =A0 =A0 =A0 =A0}
>
> diff --git a/include/net/wireless.h b/include/net/wireless.h
> index e3077e1..0331d26 100644
> --- a/include/net/wireless.h
> +++ b/include/net/wireless.h
> @@ -40,21 +40,21 @@ enum ieee80211_band {
> =A0* =A0 =A0 on this channel.
> =A0* @IEEE80211_CHAN_NO_IBSS: IBSS is not allowed on this channel.
> =A0* @IEEE80211_CHAN_RADAR: Radar detection is required on this chann=
el.
> - * @IEEE80211_CHAN_NO_FAT_ABOVE: extension channel above this channe=
l
> + * @IEEE80211_CHAN_NO_HT40PLUS: extension channel above this channel
> =A0* =A0 =A0 is not permitted.
> - * @IEEE80211_CHAN_NO_FAT_BELOW: extension channel below this channe=
l
> + * @IEEE80211_CHAN_NO_HT40MINUS: extension channel below this channe=
l
> =A0* =A0 =A0 is not permitted.
> =A0* @IEEE80211_CHAN_NO_HT40: indicates no HT40 is allowed at all,
> - * =A0 =A0 when this is set %IEEE80211_CHAN_NO_FAT_ABOVE and
> - * =A0 =A0 %IEEE80211_CHAN_NO_FAT_BELOW will also be set.
> + * =A0 =A0 when this is set %IEEE80211_CHAN_NO_HT40PLUS and
> + * =A0 =A0 %IEEE80211_CHAN_NO_HT40MINUS will also be set.
> =A0*/
> =A0enum ieee80211_channel_flags {
> =A0 =A0 =A0 =A0IEEE80211_CHAN_DISABLED =A0 =A0 =A0 =A0 =3D 1<<0,
> =A0 =A0 =A0 =A0IEEE80211_CHAN_PASSIVE_SCAN =A0 =A0 =3D 1<<1,
> =A0 =A0 =A0 =A0IEEE80211_CHAN_NO_IBSS =A0 =A0 =A0 =A0 =A0=3D 1<<2,
> =A0 =A0 =A0 =A0IEEE80211_CHAN_RADAR =A0 =A0 =A0 =A0 =A0 =A0=3D 1<<3,
> - =A0 =A0 =A0 IEEE80211_CHAN_NO_FAT_ABOVE =A0 =A0 =3D 1<<4,
> - =A0 =A0 =A0 IEEE80211_CHAN_NO_FAT_BELOW =A0 =A0 =3D 1<<5,
> + =A0 =A0 =A0 IEEE80211_CHAN_NO_HT40PLUS =A0 =A0 =A0=3D 1<<4,
> + =A0 =A0 =A0 IEEE80211_CHAN_NO_HT40MINUS =A0 =A0 =3D 1<<5,
> =A0 =A0 =A0 =A0IEEE80211_CHAN_NO_HT40 =A0 =A0 =A0 =A0 =A0=3D 1<<6,
> =A0};
>
> diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c
> index 7ecda9d..3670014 100644
> --- a/net/mac80211/mlme.c
> +++ b/net/mac80211/mlme.c
> @@ -263,13 +263,13 @@ static void ieee80211_send_assoc(struct ieee802=
11_sub_if_data *sdata)
>
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0switch (ht_info->ht_param & IEEE80211_=
HT_PARAM_CHA_SEC_OFFSET) {
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0case IEEE80211_HT_PARAM_CHA_SEC_ABOVE:
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (flags & IEEE80211_C=
HAN_NO_FAT_ABOVE) {
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (flags & IEEE80211_C=
HAN_NO_HT40PLUS) {
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0cap &=3D=
~IEEE80211_HT_CAP_SUP_WIDTH_20_40;
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0cap &=3D=
~IEEE80211_HT_CAP_SGI_40;
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0}
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0break;
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0case IEEE80211_HT_PARAM_CHA_SEC_BELOW:
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (flags & IEEE80211_C=
HAN_NO_FAT_BELOW) {
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (flags & IEEE80211_C=
HAN_NO_HT40MINUS) {
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0cap &=3D=
~IEEE80211_HT_CAP_SUP_WIDTH_20_40;
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0cap &=3D=
~IEEE80211_HT_CAP_SGI_40;
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0}
> diff --git a/net/wireless/reg.c b/net/wireless/reg.c
> index 91f7b34..6f25ef4 100644
> --- a/net/wireless/reg.c
> +++ b/net/wireless/reg.c
> @@ -1185,8 +1185,8 @@ static void reg_process_ht_flags_channel(struct=
wiphy *wiphy,
>
> =A0 =A0 =A0 =A0if (channel->flags &
> =A0 =A0 =A0 =A0 =A0 =A0(IEEE80211_CHAN_DISABLED | IEEE80211_CHAN_NO_H=
T40)) {
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 channel->flags |=3D IEEE80211_CHAN_NO_F=
AT_ABOVE |
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 IEE=
E80211_CHAN_NO_FAT_BELOW;
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 channel->flags |=3D IEEE80211_CHAN_NO_H=
T40PLUS |
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 IEE=
E80211_CHAN_NO_HT40MINUS;
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0return;
> =A0 =A0 =A0 =A0}
>
> @@ -1209,15 +1209,15 @@ static void reg_process_ht_flags_channel(stru=
ct wiphy *wiphy,
> =A0 =A0 =A0 =A0 */
> =A0 =A0 =A0 =A0if (!channel_before || (channel_before->flags &
> =A0 =A0 =A0 =A0 =A0 =A0(IEEE80211_CHAN_DISABLED | IEEE80211_CHAN_NO_H=
T40)))
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 channel->flags |=3D IEEE80211_CHAN_NO_F=
AT_BELOW;
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 channel->flags |=3D IEEE80211_CHAN_NO_H=
T40MINUS;
> =A0 =A0 =A0 =A0else
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 channel->flags &=3D ~IEEE80211_CHAN_NO_=
=46AT_BELOW;
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 channel->flags &=3D ~IEEE80211_CHAN_NO_=
HT40MINUS;
>
> =A0 =A0 =A0 =A0if (!channel_after || (channel_after->flags &
> =A0 =A0 =A0 =A0 =A0 =A0(IEEE80211_CHAN_DISABLED | IEEE80211_CHAN_NO_H=
T40)))
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 channel->flags |=3D IEEE80211_CHAN_NO_F=
AT_ABOVE;
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 channel->flags |=3D IEEE80211_CHAN_NO_H=
T40PLUS;
> =A0 =A0 =A0 =A0else
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 channel->flags &=3D ~IEEE80211_CHAN_NO_=
=46AT_ABOVE;
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 channel->flags &=3D ~IEEE80211_CHAN_NO_=
HT40PLUS;
> =A0}
>
> =A0static void reg_process_ht_flags_band(struct wiphy *wiphy,
> @@ -1299,8 +1299,8 @@ static void handle_channel_custom(struct wiphy =
*wiphy,
>
> =A0 =A0 =A0 =A0if (freq_range->max_bandwidth_khz < MHZ_TO_KHZ(40))
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0bw_flags =3D IEEE80211_CHAN_NO_HT40 |
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0IEEE80211_CHAN_N=
O_FAT_BELOW |
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0IEEE80211_CHAN_N=
O_FAT_ABOVE;
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0IEEE80211_CHAN_N=
O_HT40MINUS |
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0IEEE80211_CHAN_N=
O_HT40PLUS;
>
> =A0 =A0 =A0 =A0chan->flags |=3D map_regdom_flags(reg_rule->flags) | b=
w_flags;
> =A0 =A0 =A0 =A0chan->max_antenna_gain =3D (int) MBI_TO_DBI(power_rule=
->max_antenna_gain);
> --
> 1.6.0.6
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-wirel=
ess" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at =A0http://vger.kernel.org/majordomo-info.html
>
I'll possibly submit a patch for this tomorrow (though I haven't
booted my Linux install for like a month, and it is still @
2.6.28-wl).
--=20
Vista: [V]iruses, [I]ntruders, [S]pyware, [T]rojans and [A]dware. :-)
--
To unsubscribe from this list: send the line "unsubscribe linux-wireles=
s" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 5/5] mac80211: expose HT channel flags through debugfs
2009-04-03 9:24 ` Johannes Berg
@ 2009-04-03 18:12 ` Luis R. Rodriguez
0 siblings, 0 replies; 15+ messages in thread
From: Luis R. Rodriguez @ 2009-04-03 18:12 UTC (permalink / raw)
To: Johannes Berg
Cc: Luis Rodriguez, linville@tuxdriver.com,
linux-wireless@vger.kernel.org
On Fri, Apr 03, 2009 at 02:24:19AM -0700, Johannes Berg wrote:
> On Thu, 2009-04-02 at 18:26 -0400, Luis R. Rodriguez wrote:
>
> > +DEBUGFS_READONLY_FILE(ht40allowed, 20, "%d",
> > + !(local->hw.conf.channel->flags &
> > + IEEE80211_CHAN_NO_HT40));
>
> Why don't you just expose
> ...FILE(flags, 20, "%#x", local->hw.conf.channel->flags))
I did first, I didn't like it. What I want is an easy to access
check for ht40- or ht40+. Not to have someone to cat the file and
do some bit map checks on it. This is debugfs afterall.
Luis
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 2/5] wireless: rename IEEE80211_CHAN_NO_FAT_* to HT40-/+
2009-04-03 15:01 ` Gábor Stefanik
@ 2009-04-03 18:27 ` Luis R. Rodriguez
2009-04-03 18:28 ` Luis R. Rodriguez
0 siblings, 1 reply; 15+ messages in thread
From: Luis R. Rodriguez @ 2009-04-03 18:27 UTC (permalink / raw)
To: Gábor Stefanik; +Cc: linville, johannes, linux-wireless
2009/4/3 G=C3=A1bor Stefanik <netrolller.3d@gmail.com>:
> Greetings!
>
> I think that other references to "fat" should be removed as well, in
> favor of "HT40".
Heh I take it you didn't get to patch #3?
Luis
--
To unsubscribe from this list: send the line "unsubscribe linux-wireles=
s" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 2/5] wireless: rename IEEE80211_CHAN_NO_FAT_* to HT40-/+
2009-04-03 18:27 ` Luis R. Rodriguez
@ 2009-04-03 18:28 ` Luis R. Rodriguez
2009-04-06 19:48 ` Luis R. Rodriguez
0 siblings, 1 reply; 15+ messages in thread
From: Luis R. Rodriguez @ 2009-04-03 18:28 UTC (permalink / raw)
To: Gábor Stefanik; +Cc: linville, johannes, linux-wireless
2009/4/3 Luis R. Rodriguez <lrodriguez@atheros.com>:
> 2009/4/3 G=C3=A1bor Stefanik <netrolller.3d@gmail.com>:
>> Greetings!
>>
>> I think that other references to "fat" should be removed as well, in
>> favor of "HT40".
>
> Heh I take it you didn't get to patch #3?
Oh wait, never mind. I'll address this.
Luis
--
To unsubscribe from this list: send the line "unsubscribe linux-wireles=
s" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 2/5] wireless: rename IEEE80211_CHAN_NO_FAT_* to HT40-/+
2009-04-03 18:28 ` Luis R. Rodriguez
@ 2009-04-06 19:48 ` Luis R. Rodriguez
0 siblings, 0 replies; 15+ messages in thread
From: Luis R. Rodriguez @ 2009-04-06 19:48 UTC (permalink / raw)
To: Gábor Stefanik; +Cc: linville, johannes, linux-wireless
On Fri, Apr 3, 2009 at 11:28 AM, Luis R. Rodriguez
<lrodriguez@atheros.com> wrote:
> 2009/4/3 Luis R. Rodriguez <lrodriguez@atheros.com>:
>> 2009/4/3 G=C3=A1bor Stefanik <netrolller.3d@gmail.com>:
>>> Greetings!
>>>
>>> I think that other references to "fat" should be removed as well, i=
n
>>> favor of "HT40".
>>
>> Heh I take it you didn't get to patch #3?
>
> Oh wait, never mind. I'll address this.
Eh I won't have time to rename that stuff but please feel free to send
on top. I'll post a new series in a bit.
Luis
--
To unsubscribe from this list: send the line "unsubscribe linux-wireles=
s" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 15+ messages in thread
end of thread, other threads:[~2009-04-06 19:48 UTC | newest]
Thread overview: 15+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-04-02 22:26 [PATCH 0/5] wireless: listen to bandwidths preferences Luis R. Rodriguez
2009-04-02 22:26 ` [PATCH 1/5] cfg80211: Process regulatory max bandwidth checks for HT40 Luis R. Rodriguez
2009-04-03 9:22 ` Johannes Berg
2009-04-02 22:26 ` [PATCH 2/5] wireless: rename IEEE80211_CHAN_NO_FAT_* to HT40-/+ Luis R. Rodriguez
2009-04-03 15:01 ` Gábor Stefanik
2009-04-03 18:27 ` Luis R. Rodriguez
2009-04-03 18:28 ` Luis R. Rodriguez
2009-04-06 19:48 ` Luis R. Rodriguez
2009-04-02 22:26 ` [PATCH 3/5] mac80211: check if HT40+/- is allowed before sending assoc Luis R. Rodriguez
2009-04-03 9:22 ` Johannes Berg
2009-04-02 22:26 ` [PATCH 4/5] cfg80211: check allowed channel type upon userspace requests Luis R. Rodriguez
2009-04-03 9:23 ` Johannes Berg
2009-04-02 22:26 ` [PATCH 5/5] mac80211: expose HT channel flags through debugfs Luis R. Rodriguez
2009-04-03 9:24 ` Johannes Berg
2009-04-03 18:12 ` Luis R. Rodriguez
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).