* [PATCH 1/2] cfg80211: add support for setting the ad-hoc multicast rate @ 2010-11-11 14:07 Felix Fietkau 2010-11-11 14:07 ` [PATCH 2/2] mac80211: " Felix Fietkau 2010-11-16 22:27 ` [PATCH 1/2] cfg80211: " Johannes Berg 0 siblings, 2 replies; 7+ messages in thread From: Felix Fietkau @ 2010-11-11 14:07 UTC (permalink / raw) To: linux-wireless; +Cc: linville, johannes Signed-off-by: Felix Fietkau <nbd@openwrt.org> --- include/linux/nl80211.h | 4 ++++ include/net/cfg80211.h | 2 ++ net/wireless/nl80211.c | 4 ++++ 3 files changed, 10 insertions(+), 0 deletions(-) diff --git a/include/linux/nl80211.h b/include/linux/nl80211.h index fb877b5..9ee61fa 100644 --- a/include/linux/nl80211.h +++ b/include/linux/nl80211.h @@ -804,6 +804,8 @@ enum nl80211_commands { * @NL80211_ATTR_SUPPORT_IBSS_RSN: The device supports IBSS RSN, which mostly * means support for per-station GTKs. * + * @NL80211_ATTR_MCAST_RATE: Multicast tx rate (in 100 kbps) for IBSS + * * @NL80211_ATTR_MAX: highest attribute number currently defined * @__NL80211_ATTR_AFTER_LAST: internal use */ @@ -973,6 +975,8 @@ enum nl80211_attrs { NL80211_ATTR_SUPPORT_IBSS_RSN, + NL80211_ATTR_MCAST_RATE, + /* add attributes here, update the policy in nl80211.c */ __NL80211_ATTR_AFTER_LAST, diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h index e5702f5..15cc593 100644 --- a/include/net/cfg80211.h +++ b/include/net/cfg80211.h @@ -923,6 +923,7 @@ struct cfg80211_disassoc_request { * @privacy: this is a protected network, keys will be configured * after joining * @basic_rates: bitmap of basic rates to use when creating the IBSS + * @mcast_rate: multicast tx rate (in 100 kbps) */ struct cfg80211_ibss_params { u8 *ssid; @@ -934,6 +935,7 @@ struct cfg80211_ibss_params { u32 basic_rates; bool channel_fixed; bool privacy; + int mcast_rate; }; /** diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index 4e78e3f..b3da2e0 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c @@ -167,6 +167,7 @@ static const struct nla_policy nl80211_policy[NL80211_ATTR_MAX+1] = { [NL80211_ATTR_WIPHY_TX_POWER_SETTING] = { .type = NLA_U32 }, [NL80211_ATTR_WIPHY_TX_POWER_LEVEL] = { .type = NLA_U32 }, [NL80211_ATTR_FRAME_TYPE] = { .type = NLA_U16 }, + [NL80211_ATTR_MCAST_RATE] = { .type = NLA_U32 }, }; /* policy for the key attributes */ @@ -3652,6 +3653,9 @@ static int nl80211_join_ibss(struct sk_buff *skb, struct genl_info *info) return -EINVAL; } } + if (info->attrs[NL80211_ATTR_MCAST_RATE]) + ibss.mcast_rate = + nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE]); if (ibss.privacy && info->attrs[NL80211_ATTR_KEYS]) { connkeys = nl80211_parse_connkeys(rdev, -- 1.7.2.2 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 2/2] mac80211: add support for setting the ad-hoc multicast rate 2010-11-11 14:07 [PATCH 1/2] cfg80211: add support for setting the ad-hoc multicast rate Felix Fietkau @ 2010-11-11 14:07 ` Felix Fietkau 2010-11-16 22:27 ` Johannes Berg 2010-11-16 22:27 ` [PATCH 1/2] cfg80211: " Johannes Berg 1 sibling, 1 reply; 7+ messages in thread From: Felix Fietkau @ 2010-11-11 14:07 UTC (permalink / raw) To: linux-wireless; +Cc: linville, johannes Signed-off-by: Felix Fietkau <nbd@openwrt.org> --- include/net/mac80211.h | 6 ++++-- net/mac80211/ibss.c | 1 + net/mac80211/rate.c | 19 +++++++++++++++---- net/mac80211/tx.c | 5 +++-- 4 files changed, 23 insertions(+), 8 deletions(-) diff --git a/include/net/mac80211.h b/include/net/mac80211.h index 9fdf982..e4d173e 100644 --- a/include/net/mac80211.h +++ b/include/net/mac80211.h @@ -205,6 +205,7 @@ enum ieee80211_bss_change { * @basic_rates: bitmap of basic rates, each bit stands for an * index into the rate table configured by the driver in * the current band. + * @mcast_rate: multicast rate for AP and Ad-Hoc (in 100 kbps) * @bssid: The BSSID for this BSS * @enable_beacon: whether beaconing should be enabled or not * @channel_type: Channel type for this BSS -- the hardware might be @@ -244,6 +245,7 @@ struct ieee80211_bss_conf { u16 assoc_capability; u64 timestamp; u32 basic_rates; + u32 mcast_rate; u16 ht_operation_mode; s32 cqm_rssi_thold; u32 cqm_rssi_hyst; @@ -2640,7 +2642,7 @@ enum rate_control_changed { * @rate_idx_mask: user-requested rate mask (not MCS for now) * @skb: the skb that will be transmitted, the control information in it needs * to be filled in - * @ap: whether this frame is sent out in AP mode + * @bss: whether this frame is sent out in AP or IBSS mode */ struct ieee80211_tx_rate_control { struct ieee80211_hw *hw; @@ -2651,7 +2653,7 @@ struct ieee80211_tx_rate_control { bool rts, short_preamble; u8 max_rate_idx; u32 rate_idx_mask; - bool ap; + bool bss; }; struct rate_control_ops { diff --git a/net/mac80211/ibss.c b/net/mac80211/ibss.c index 239c483..6fe6837 100644 --- a/net/mac80211/ibss.c +++ b/net/mac80211/ibss.c @@ -915,6 +915,7 @@ int ieee80211_ibss_join(struct ieee80211_sub_if_data *sdata, sdata->u.ibss.privacy = params->privacy; sdata->u.ibss.basic_rates = params->basic_rates; + sdata->vif.bss_conf.mcast_rate = params->mcast_rate; sdata->vif.bss_conf.beacon_int = params->beacon_interval; diff --git a/net/mac80211/rate.c b/net/mac80211/rate.c index 33f7699..76de4f8 100644 --- a/net/mac80211/rate.c +++ b/net/mac80211/rate.c @@ -211,10 +211,20 @@ static bool rc_no_data_or_no_ack(struct ieee80211_tx_rate_control *txrc) return (info->flags & IEEE80211_TX_CTL_NO_ACK) || !ieee80211_is_data(fc); } -static void rc_send_low_broadcast(s8 *idx, u32 basic_rates, u8 max_rate_idx) +static void rc_send_low_broadcast(s8 *idx, u32 basic_rates, u32 mcast_rate, + struct ieee80211_supported_band *sband) { u8 i; + if (mcast_rate) { + for (i = 0; i < sband->n_bitrates; i++) { + if (sband->bitrates[i].bitrate == mcast_rate) { + *idx = i; + return; + } + } + } + if (basic_rates == 0) return; /* assume basic rates unknown and accept rate */ if (*idx < 0) @@ -222,7 +232,7 @@ static void rc_send_low_broadcast(s8 *idx, u32 basic_rates, u8 max_rate_idx) if (basic_rates & (1 << *idx)) return; /* selected rate is a basic rate */ - for (i = *idx + 1; i <= max_rate_idx; i++) { + for (i = *idx + 1; i <= sband->n_bitrates; i++) { if (basic_rates & (1 << i)) { *idx = i; return; @@ -243,10 +253,11 @@ bool rate_control_send_low(struct ieee80211_sta *sta, info->control.rates[0].count = (info->flags & IEEE80211_TX_CTL_NO_ACK) ? 1 : txrc->hw->max_rate_tries; - if (!sta && txrc->ap) + if (!sta && txrc->bss) rc_send_low_broadcast(&info->control.rates[0].idx, txrc->bss_conf->basic_rates, - txrc->sband->n_bitrates); + txrc->bss_conf->mcast_rate, + txrc->sband); return true; } return false; diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c index 96c5943..87ba4ef 100644 --- a/net/mac80211/tx.c +++ b/net/mac80211/tx.c @@ -622,7 +622,8 @@ ieee80211_tx_h_rate_ctrl(struct ieee80211_tx_data *tx) txrc.max_rate_idx = -1; else txrc.max_rate_idx = fls(txrc.rate_idx_mask) - 1; - txrc.ap = tx->sdata->vif.type == NL80211_IFTYPE_AP; + txrc.bss = (tx->sdata->vif.type == NL80211_IFTYPE_AP || + tx->sdata->vif.type == NL80211_IFTYPE_ADHOC); /* set up RTS protection if desired */ if (len > tx->local->hw.wiphy->rts_threshold) { @@ -2301,7 +2302,7 @@ struct sk_buff *ieee80211_beacon_get_tim(struct ieee80211_hw *hw, txrc.max_rate_idx = -1; else txrc.max_rate_idx = fls(txrc.rate_idx_mask) - 1; - txrc.ap = true; + txrc.bss = true; rate_control_get_rate(sdata, NULL, &txrc); info->control.vif = vif; -- 1.7.2.2 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH 2/2] mac80211: add support for setting the ad-hoc multicast rate 2010-11-11 14:07 ` [PATCH 2/2] mac80211: " Felix Fietkau @ 2010-11-16 22:27 ` Johannes Berg 2010-11-17 3:00 ` Felix Fietkau 0 siblings, 1 reply; 7+ messages in thread From: Johannes Berg @ 2010-11-16 22:27 UTC (permalink / raw) To: Felix Fietkau; +Cc: linux-wireless, linville On Thu, 2010-11-11 at 15:07 +0100, Felix Fietkau wrote: > + if (mcast_rate) { > + for (i = 0; i < sband->n_bitrates; i++) { > + if (sband->bitrates[i].bitrate == mcast_rate) { > + *idx = i; > + return; > + } > + } > + } That conversion loop really shouldn't be in the hotpath. johannes ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 2/2] mac80211: add support for setting the ad-hoc multicast rate 2010-11-16 22:27 ` Johannes Berg @ 2010-11-17 3:00 ` Felix Fietkau 0 siblings, 0 replies; 7+ messages in thread From: Felix Fietkau @ 2010-11-17 3:00 UTC (permalink / raw) To: Johannes Berg; +Cc: linux-wireless, linville On 2010-11-16 11:27 PM, Johannes Berg wrote: > On Thu, 2010-11-11 at 15:07 +0100, Felix Fietkau wrote: > >> + if (mcast_rate) { >> + for (i = 0; i < sband->n_bitrates; i++) { >> + if (sband->bitrates[i].bitrate == mcast_rate) { >> + *idx = i; >> + return; >> + } >> + } >> + } > > That conversion loop really shouldn't be in the hotpath. Seems like the change got merged already, I'll send follow-up fixes soon. - Felix ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 1/2] cfg80211: add support for setting the ad-hoc multicast rate 2010-11-11 14:07 [PATCH 1/2] cfg80211: add support for setting the ad-hoc multicast rate Felix Fietkau 2010-11-11 14:07 ` [PATCH 2/2] mac80211: " Felix Fietkau @ 2010-11-16 22:27 ` Johannes Berg 2010-11-16 23:34 ` Felix Fietkau 1 sibling, 1 reply; 7+ messages in thread From: Johannes Berg @ 2010-11-16 22:27 UTC (permalink / raw) To: Felix Fietkau; +Cc: linux-wireless, linville On Thu, 2010-11-11 at 15:07 +0100, Felix Fietkau wrote: > + if (info->attrs[NL80211_ATTR_MCAST_RATE]) > + ibss.mcast_rate = > + nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE]); That should really check that the rate is supported, and maybe that it's a basic rate. johannes ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 1/2] cfg80211: add support for setting the ad-hoc multicast rate 2010-11-16 22:27 ` [PATCH 1/2] cfg80211: " Johannes Berg @ 2010-11-16 23:34 ` Felix Fietkau 2010-11-16 23:45 ` Johannes Berg 0 siblings, 1 reply; 7+ messages in thread From: Felix Fietkau @ 2010-11-16 23:34 UTC (permalink / raw) To: Johannes Berg; +Cc: linux-wireless, linville On 2010-11-16 11:27 PM, Johannes Berg wrote: > On Thu, 2010-11-11 at 15:07 +0100, Felix Fietkau wrote: > >> + if (info->attrs[NL80211_ATTR_MCAST_RATE]) >> + ibss.mcast_rate = >> + nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE]); > > That should really check that the rate is supported, and maybe that it's > a basic rate. But what about band changes then? - Felix ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 1/2] cfg80211: add support for setting the ad-hoc multicast rate 2010-11-16 23:34 ` Felix Fietkau @ 2010-11-16 23:45 ` Johannes Berg 0 siblings, 0 replies; 7+ messages in thread From: Johannes Berg @ 2010-11-16 23:45 UTC (permalink / raw) To: Felix Fietkau; +Cc: linux-wireless, linville On Wed, 2010-11-17 at 00:34 +0100, Felix Fietkau wrote: > On 2010-11-16 11:27 PM, Johannes Berg wrote: > > On Thu, 2010-11-11 at 15:07 +0100, Felix Fietkau wrote: > > > >> + if (info->attrs[NL80211_ATTR_MCAST_RATE]) > >> + ibss.mcast_rate = > >> + nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE]); > > > > That should really check that the rate is supported, and maybe that it's > > a basic rate. > But what about band changes then? Yeah but what about them? You don't handle them anyway -- should maybe do a per-band setting? Basically right now you end up ignoring the rate if it's not available. johannes ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2010-11-17 3:00 UTC | newest] Thread overview: 7+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2010-11-11 14:07 [PATCH 1/2] cfg80211: add support for setting the ad-hoc multicast rate Felix Fietkau 2010-11-11 14:07 ` [PATCH 2/2] mac80211: " Felix Fietkau 2010-11-16 22:27 ` Johannes Berg 2010-11-17 3:00 ` Felix Fietkau 2010-11-16 22:27 ` [PATCH 1/2] cfg80211: " Johannes Berg 2010-11-16 23:34 ` Felix Fietkau 2010-11-16 23:45 ` Johannes Berg
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).