Re: alfa awus036nhr v2 and module rtl8xxxu
On 02/04/2016 11:41 AM, Jes Sorensen wrote: Larry Fingerwrites: On 02/04/2016 10:45 AM, Jes Sorensen wrote: Drunk Cat writes: problem: it does not connect to any wifi network you can see the time out on dmesg lsusb Bus 002 Device 007: ID 0bda:817f Realtek Semiconductor Corp. RTL8188RU 802.11n WLAN Adapter iwconfig wlp0s20u1 IEEE 802.11bgn ESSID:off/any Mode:Managed Access Point: Not-Associated Tx-Power=20 dBm Retry short limit:7 RTS thr=2347 B Fragment thr:off Power Management:off dmesg Not sure what distribution you are running, but I am seeing problems with NetworkManager in recent Fedora. Could you try the following: 1) Unplug the WiFi dongle 2) (Re)load the driver (rmmod rtl8xxxu ; insmod rtl8xxxu) 3) Restart NetworkManager 'systemctl restart NetworkManager' 4) Plug in the WiFi dongle Jes, I can confirm what Drunk Cat sees. There is something different about the RTL8192RU as using the iwconfig utility shows no APs in the scan. I hope to get to debugging the problem soon. OK - thats unfortunate. Most likely the wrong antenna path is being enabled for it, or something like that. Once I finish up the 8723bu/8192eu patchset, I'll try to find some time to look at it, if you don't nail it before. It definitely is an antenna path problem. I finally got a few scans with signal levels in the -100 dBm range. Larry -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [RFC v2] iwlwifi: pcie: transmit queue auto-sizing
On 02/05/2016 12:44 AM, Michal Kazior wrote: Per-station queues sound tricky if you consider bufferbloat. To maximize use of airtime (i.e. txop) you need to send big aggregates. Since aggregates are per station-tid to maximize multi-station performance (in AP mode) you'll need to queue a lot of frames, per each station, depending on the chosen tx rate. A bursted txop can be as big as 5-10ms. If you consider you want to queue 5-10ms worth of data for *each* station at any given time you obviously introduce a lot of lag. If you have 10 stations you might end up with service period at 10*10ms = 100ms. This gets even worse if you consider MU-MIMO because you need to do an expensive sounding procedure before transmitting. So while SU aggregation can probably still work reasonably well with shorter bursts (1-2ms) MU needs at least 3ms to get *any* gain when compared to SU (which obviously means you want more to actually make MU pay off). The rule of thumb is the longer you wait the bigger capacity you can get. Apparently there's interest in maximizing throughput but it stands in direct opposition of keeping the latency down so I've been thinking how to satisfy both. I really think this should be tunable. For instance, someone making an AP that is mostly for letting lots of users stream movies would care a lot more about throughput than someone making an AP that is mainly for browsing the web and doing more latency-sensitive activities. The current approach ath10k is taking (patches in review [1][2]) is to use mac80211 software queues for per-station queuing, exposing queue state to firmware (it decides where frames should be dequeued from) and making it possible to stop/wake per-station tx subqueue with fake netdev queues. I'm starting to think this is not the right way though because it's inherently hard to control latency and there's a huge memory overhead associated with the fake netdev queues. Also fq_codel is a less effective with this kind of setup. My current thinking is that the entire problem should be solved via (per-AC) qdiscs, e.g. fq_codel. I guess one could use limit/target/interval/quantum knobs to tune it for higher latency of aggregation-oriented Wi-Fi links where long service time (think 100-200ms) is acceptable. However fq_codel is oblivious to how Wi-Fi works in the first place, i.e. Wi-Fi gets better throughput if you deliver bursts of packets destined to the same station. Moreover this gets even more complicated with MU-MIMO where you may want to consider spatial location (which influences signal quality when grouped) of each station when you decide which set of stations you're going to aggregate to in parallel. Since drivers have a finite tx ring this it is important to deliver bursts that can actually be aggregated efficiently. This means driver would need to be able to tell qdisc about per-flow conditions to influence the RR scheme in some way (assuming a qdiscs even understands flows; do we need a unified way of talking about flows between qdiscs and drivers?). I wonder if it would work better if we removed most of the tid handling and aggregation logic in the firmware. Maybe just have the mgt Q and best effort (and skip VO/VI). Let the OS tell (or suggest to) the firmware when aggregation starts and stops. That might at least cut the number of queues in half, saving memory and latency up and down the stack. Thanks, Ben -- Ben GreearCandela Technologies Inc http://www.candelatech.com -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH 1/2] ath10k: fix pktlog in QCA99X0
Currently, we are providing wrong payload data of pktlog to trace points. Data we receive from FW through copy engine 8 contains pktlog data alone. We don't need to parse anything in driver before handing it to trace points. Fixes: afb0bf7f530b ("ath10k: add support for pktlog in QCA99X0") Signed-off-by: Ashok Raj Nagarajan--- drivers/net/wireless/ath/ath10k/htt_rx.c | 6 +- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/drivers/net/wireless/ath/ath10k/htt_rx.c b/drivers/net/wireless/ath/ath10k/htt_rx.c index 3079434..1ff04d4 100644 --- a/drivers/net/wireless/ath/ath10k/htt_rx.c +++ b/drivers/net/wireless/ath/ath10k/htt_rx.c @@ -2143,11 +2143,7 @@ EXPORT_SYMBOL(ath10k_htt_t2h_msg_handler); void ath10k_htt_rx_pktlog_completion_handler(struct ath10k *ar, struct sk_buff *skb) { - struct ath10k_pktlog_10_4_hdr *hdr = - (struct ath10k_pktlog_10_4_hdr *)skb->data; - - trace_ath10k_htt_pktlog(ar, hdr->payload, - sizeof(*hdr) + __le16_to_cpu(hdr->size)); + trace_ath10k_htt_pktlog(ar, skb->data, skb->len); dev_kfree_skb_any(skb); } EXPORT_SYMBOL(ath10k_htt_rx_pktlog_completion_handler); -- 1.9.1 -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH 2/2] ath10k: add hw_rev to trace events to support pktlog
pktlog data is different between firmware variants (eg. 10.2 vs 10.4). To have a unified user space script to decode pktlog trace events generated, it is desirable to know which firmware variant has provided the events and thereby decode the pktlogs appropriately. Hardware revision (hw_rev) helps to determine the firmware variant sending these trace events. So add hw_rev to trace events. Signed-off-by: Ashok Raj Nagarajan--- drivers/net/wireless/ath/ath10k/trace.h | 15 --- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/drivers/net/wireless/ath/ath10k/trace.h b/drivers/net/wireless/ath/ath10k/trace.h index 71bdb36..e0d00ce 100644 --- a/drivers/net/wireless/ath/ath10k/trace.h +++ b/drivers/net/wireless/ath/ath10k/trace.h @@ -250,6 +250,7 @@ TRACE_EVENT(ath10k_wmi_dbglog, TP_STRUCT__entry( __string(device, dev_name(ar->dev)) __string(driver, dev_driver_string(ar->dev)) + __field(u8, hw_type); __field(size_t, buf_len) __dynamic_array(u8, buf, buf_len) ), @@ -257,14 +258,16 @@ TRACE_EVENT(ath10k_wmi_dbglog, TP_fast_assign( __assign_str(device, dev_name(ar->dev)); __assign_str(driver, dev_driver_string(ar->dev)); + __entry->hw_type = ar->hw_rev; __entry->buf_len = buf_len; memcpy(__get_dynamic_array(buf), buf, buf_len); ), TP_printk( - "%s %s len %zu", + "%s %s %d len %zu", __get_str(driver), __get_str(device), + __entry->hw_type, __entry->buf_len ) ); @@ -277,6 +280,7 @@ TRACE_EVENT(ath10k_htt_pktlog, TP_STRUCT__entry( __string(device, dev_name(ar->dev)) __string(driver, dev_driver_string(ar->dev)) + __field(u8, hw_type); __field(u16, buf_len) __dynamic_array(u8, pktlog, buf_len) ), @@ -284,14 +288,16 @@ TRACE_EVENT(ath10k_htt_pktlog, TP_fast_assign( __assign_str(device, dev_name(ar->dev)); __assign_str(driver, dev_driver_string(ar->dev)); + __entry->hw_type = ar->hw_rev; __entry->buf_len = buf_len; memcpy(__get_dynamic_array(pktlog), buf, buf_len); ), TP_printk( - "%s %s size %hu", + "%s %s %d size %hu", __get_str(driver), __get_str(device), + __entry->hw_type, __entry->buf_len ) ); @@ -440,6 +446,7 @@ TRACE_EVENT(ath10k_htt_rx_desc, TP_STRUCT__entry( __string(device, dev_name(ar->dev)) __string(driver, dev_driver_string(ar->dev)) + __field(u8, hw_type); __field(u16, len) __dynamic_array(u8, rxdesc, len) ), @@ -447,14 +454,16 @@ TRACE_EVENT(ath10k_htt_rx_desc, TP_fast_assign( __assign_str(device, dev_name(ar->dev)); __assign_str(driver, dev_driver_string(ar->dev)); + __entry->hw_type = ar->hw_rev; __entry->len = len; memcpy(__get_dynamic_array(rxdesc), data, len); ), TP_printk( - "%s %s rxdesc len %d", + "%s %s %d rxdesc len %d", __get_str(driver), __get_str(device), + __entry->hw_type, __entry->len ) ); -- 1.9.1 -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [RFC v2] iwlwifi: pcie: transmit queue auto-sizing
> A bursted txop can be as big as 5-10ms. If you consider you want to > queue 5-10ms worth of data for *each* station at any given time you > obviously introduce a lot of lag. If you have 10 stations you might > end up with service period at 10*10ms = 100ms. This gets even worse if > you consider MU-MIMO because you need to do an expensive sounding > procedure before transmitting. So while SU aggregation can probably > still work reasonably well with shorter bursts (1-2ms) MU needs at > least 3ms to get *any* gain when compared to SU (which obviously means > you want more to actually make MU pay off). I am not sure where you get these numbers. Got a spreadsheet? Gradually reducing the maximum sized txop as a function of the number of stations makes sense. If you have 10 stations pending delivery and reduced the max txop to 1ms, you hurt bandwidth at that instant, but by offering more service to more stations, in less time, they will converge on a reasonable share of the bandwidth for each, faster[1]. And I'm sure that the person videoconferencing on a link like that would appreciate getting some service inside of a 10ms interval, rather than a 100ms. yes, there's overhead, and that's not the right number, which would vary as to g,n,ac and successors. You will also get more opportunities to use mu-mimo with shorter bursts extant and more stations being regularly serviced. [1] https://www.youtube.com/watch?v=Rb-UnHDw02o at about 13:50 > The rule of thumb is the > longer you wait the bigger capacity you can get. This is not strictly true as the "fountain" of packets is regulated by acks on the other side of the link, and ramp up or down as a function of service time and loss. > > Apparently there's interest in maximizing throughput but it stands in > direct opposition of keeping the latency down so I've been thinking > how to satisfy both. > > The current approach ath10k is taking (patches in review [1][2]) is to > use mac80211 software queues for per-station queuing, exposing queue > state to firmware (it decides where frames should be dequeued from) > and making it possible to stop/wake per-station tx subqueue with fake > netdev queues. I'm starting to think this is not the right way though > because it's inherently hard to control latency and there's a huge > memory overhead associated with the fake netdev queues. What is this overhead? Applying things like codel tend to dramatically shorten the amount of skbs extant... modern 802.11ac capable hardware has tons more memory... > Also fq_codel > is a less effective with this kind of setup. fq_codel's principal problems with working with wifi are long and documented in the talk above. > My current thinking is that the entire problem should be solved via > (per-AC) qdiscs, e.g. fq_codel. I guess one could use > limit/target/interval/quantum knobs to tune it for higher latency of > aggregation-oriented Wi-Fi links where long service time (think > 100-200ms) is acceptable. However fq_codel is oblivious to how Wi-Fi > works in the first place, i.e. Wi-Fi gets better throughput if you > deliver bursts of packets destined to the same station. Moreover this > gets even more complicated with MU-MIMO where you may want to consider > spatial location (which influences signal quality when grouped) of > each station when you decide which set of stations you're going to > aggregate to in parallel. Since drivers have a finite tx ring this it > is important to deliver bursts that can actually be aggregated > efficiently. This means driver would need to be able to tell qdisc > about per-flow conditions to influence the RR scheme in some way > (assuming a qdiscs even understands flows; do we need a unified way of > talking about flows between qdiscs and drivers?). This is a very good summary of the problems in layering fq_codel as it exists today on top of wifi as it exists today. :/ Our conclusion several years ago was that as the information needed to do things more right was in the mac80211 layer that we could not evolve the qdisc layer to suit, and needed to move the core ideas into the mac80211 layer. Things have evolved since, but I still think we can't get enough info up to the qdisc layer (locks and so on) to use it sanely. > > [1]: https://www.spinics.net/lists/linux-wireless/msg146187.html > [2]: https://www.spinics.net/lists/linux-wireless/msg146512.html I will review! > For reference, ath10k has around 1400 tx descriptors, though in practice not all are usable, and in stock firmware, I'm guessing the NIC will never be able to actually fill up it's tx descriptors and stop traffic. Instead, it just allows the stack to try to TX, then drops the frame... >>> >>> >>> 1400 descriptors, ok... but they are not organised in queues? >>> (forgive my ignorance of athX drivers) >> >> >> I think all the details are in the firmware, at least for now. > > Yeah. Basically ath10k has a flat set of tx descriptors which are > AC-agnostic.
carl9170 client RTS/CTS option being overridden by WAP's WMM option
Has anyone experienced that RTS/CTS handshaking stops occurring at the client if the the access point enables WMM? Using the carl9170 driver with RTS/CTS handshaking enabled on a USB Ubiquiti SR71-USB (Atheros AR9170 based wireless adapter). RTS/CTS will stop working when WMM is enabled on the WAP. The network is running in 802.11n C-band (5GHz) channels in Infrastructure mode with an Atheros AR9370 based Access Point. We are using RTS/CTS handshaking to reduce “Hidden Node” effects. Other clients in the network require WMM to be enabled. For reasons cited in http://www.smallnetbuilder.com/wireless/wireless-features/30938-dont- mess-with-wmm, WMM should be enabled to support 802.11e, required for 802.11n to use HT (High Throughput) link rates. With the WMM turned OFF at the AP and RTS value = 256 at the Ubiquiti client, the RTS/CTS handshake functions normally. With WMM turned ON at the AP and RTS value = 256 still on at the client no RTS/CTS handshake occurs. The carl9170 client stops sending the RTS, and the carl1970 client ignoring the CTS messages transmitted by the AP, causing collisions because of my “Hidden Node” condition. Had to get scope plots of the RF network traffic between the AP and client to observe this happening. thanks, EricN�r��yb�X��ǧv�^�){.n�+{��*ޕ�,�{ay�ʇڙ�,j��f���h���z��w��� ���j:+v���w�j�mzZ+�ݢj"��!�i
[RFC 1/2] cfg80211: add support for ht_caps mcs rxmask override
Allows the ht_caps mcs rxmask to be defined on the fly. In this implementation, the given rxmask is applied to every band available. This is only applicable for radio cards without internal rc. Signed-off-by: Cedric Debarge--- include/net/cfg80211.h | 7 +++ net/mac80211/cfg.c | 48 + net/mac80211/main.c| 53 ++ 3 files changed, 100 insertions(+), 8 deletions(-) diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h index 9e1b24c..257404b 100644 --- a/include/net/cfg80211.h +++ b/include/net/cfg80211.h @@ -2500,6 +2500,8 @@ struct cfg80211_qos_map { * and returning to the base channel for communication with the AP. * @tdls_cancel_channel_switch: Stop channel-switching with a TDLS peer. Both * peers must be on the base channel when the call completes. + * + * @set_htcap_rxmask: Override hardware capabilities for ht_caps mcs rxmask. */ struct cfg80211_ops { int (*suspend)(struct wiphy *wiphy, struct cfg80211_wowlan *wow); @@ -2765,6 +2767,8 @@ struct cfg80211_ops { void(*tdls_cancel_channel_switch)(struct wiphy *wiphy, struct net_device *dev, const u8 *addr); + + int (*set_htcap_rxmask)(struct wiphy *wiphy, uint8_t *rxmask); }; /* @@ -3121,6 +3125,8 @@ struct wiphy_vendor_command { * wiphy is theirs, e.g. in global notifiers * @bands: information about bands/channels supported by this device * + * @init_bands: save of the originals information about bands. + * * @mgmt_stypes: bitmasks of frame subtypes that can be subscribed to or * transmitted through nl80211, points to an array indexed by interface * type @@ -3266,6 +3272,7 @@ struct wiphy { const void *privid; struct ieee80211_supported_band *bands[IEEE80211_NUM_BANDS]; + struct ieee80211_supported_band *init_bands[IEEE80211_NUM_BANDS]; /* Lets us get back the wiphy on the callback */ void (*reg_notifier)(struct wiphy *wiphy, diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c index 66d22de..daa415b 100644 --- a/net/mac80211/cfg.c +++ b/net/mac80211/cfg.c @@ -3350,6 +3350,53 @@ static int ieee80211_del_tx_ts(struct wiphy *wiphy, struct net_device *dev, return -ENOENT; } +static int ieee80211_set_htcap_rxmask(struct wiphy *wiphy, uint8_t *rxmask) +{ + struct ieee80211_local *local = wiphy_priv(wiphy); + struct ieee80211_supported_band *sband; + struct ieee80211_supported_band *iband; + int blank = 1; + int empty; + int i; + + if (ieee80211_hw_check(>hw, HAS_RATE_CONTROL)) + return -EINVAL; + + mutex_lock(>iflist_mtx); + empty = list_empty(>interfaces); + mutex_unlock(>iflist_mtx); + + if (!empty) + return -EBUSY; + + for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++) + if (rxmask[i]) { + blank = 0; + break; + } + + for (i = 0; i < IEEE80211_NUM_BANDS; i++) { + int j; + + sband = wiphy->bands[i]; + iband = wiphy->init_bands[i]; + + if (!iband) + continue; + + for (j = 0; j < IEEE80211_HT_MCS_MASK_LEN; j++) { + if (blank) + sband->ht_cap.mcs.rx_mask[j] = + iband->ht_cap.mcs.rx_mask[j]; + else + sband->ht_cap.mcs.rx_mask[j] = rxmask[j] & + iband->ht_cap.mcs.rx_mask[j]; + } + } + + return 0; +} + const struct cfg80211_ops mac80211_config_ops = { .add_virtual_intf = ieee80211_add_iface, .del_virtual_intf = ieee80211_del_iface, @@ -3435,4 +3482,5 @@ const struct cfg80211_ops mac80211_config_ops = { .set_ap_chanwidth = ieee80211_set_ap_chanwidth, .add_tx_ts = ieee80211_add_tx_ts, .del_tx_ts = ieee80211_del_tx_ts, + .set_htcap_rxmask = ieee80211_set_htcap_rxmask, }; diff --git a/net/mac80211/main.c b/net/mac80211/main.c index 6bcf0fa..138f1e4 100644 --- a/net/mac80211/main.c +++ b/net/mac80211/main.c @@ -789,15 +789,37 @@ static int ieee80211_init_cipher_suites(struct ieee80211_local *local) return 0; } +static int ieee80211_alloc_init_bands(struct wiphy *wiphy) +{ + int i; + + memset(wiphy->init_bands, 0, IEEE80211_NUM_BANDS); + for (i = 0; i < IEEE80211_NUM_BANDS; i++) { + if (!wiphy->bands[i]) + continue; + + wiphy->init_bands[i] = kzalloc(sizeof(*wiphy->init_bands[i]), + GFP_KERNEL); + if (!wiphy->init_bands[i]) +
[RFC 2/2] nl80211: add nl attribute to set ht_caps mcs rxmask override
This adds the NL80211_ATTR_WIPHY_HTCAP_RXMASK attribute to NL80211_CMD_SET_WIPHY in order for the user to specify the ht_caps mcs rxmask. Signed-off-by: Cedric Debarge--- include/uapi/linux/nl80211.h | 5 + net/wireless/nl80211.c | 18 ++ net/wireless/rdev-ops.h | 11 +++ net/wireless/trace.h | 15 +++ 4 files changed, 49 insertions(+) diff --git a/include/uapi/linux/nl80211.h b/include/uapi/linux/nl80211.h index 7758969..50a53d8 100644 --- a/include/uapi/linux/nl80211.h +++ b/include/uapi/linux/nl80211.h @@ -1794,6 +1794,9 @@ enum nl80211_commands { * connecting to a PCP, and in %NL80211_CMD_START_AP to start * a PCP instead of AP. Relevant for DMG networks only. * + * @NL80211_ATTR_WIPHY_HTCAP_RXMASK: Override hardware capabilities for ht_caps + * mcs rxmask. + * * @NUM_NL80211_ATTR: total number of nl80211_attrs available * @NL80211_ATTR_MAX: highest attribute number currently defined * @__NL80211_ATTR_AFTER_LAST: internal use @@ -2170,6 +2173,8 @@ enum nl80211_attrs { NL80211_ATTR_PBSS, + NL80211_ATTR_WIPHY_HTCAP_RXMASK, + /* add attributes here, update the policy in nl80211.c */ __NL80211_ATTR_AFTER_LAST, diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index 268cb49..ef5ec8b 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c @@ -402,6 +402,9 @@ static const struct nla_policy nl80211_policy[NUM_NL80211_ATTR] = { [NL80211_ATTR_SCHED_SCAN_DELAY] = { .type = NLA_U32 }, [NL80211_ATTR_REG_INDOOR] = { .type = NLA_FLAG }, [NL80211_ATTR_PBSS] = { .type = NLA_FLAG }, + [NL80211_ATTR_WIPHY_HTCAP_RXMASK] = { .type = NLA_BINARY, + .len = IEEE80211_HT_MCS_MASK_LEN + }, }; /* policy for the key attributes */ @@ -2243,6 +2246,21 @@ static int nl80211_set_wiphy(struct sk_buff *skb, struct genl_info *info) return result; } + if (info->attrs[NL80211_ATTR_WIPHY_HTCAP_RXMASK]) { + u8 rxmask[IEEE80211_HT_MCS_MASK_LEN]; + + if (wdev) + return -EOPNOTSUPP; + + memcpy(rxmask, + nla_data(info->attrs[NL80211_ATTR_WIPHY_HTCAP_RXMASK]), + IEEE80211_HT_MCS_MASK_LEN); + + result = rdev_set_htcap_rxmask(rdev, rxmask); + if (result) + return result; + } + changed = 0; if (info->attrs[NL80211_ATTR_WIPHY_RETRY_SHORT]) { diff --git a/net/wireless/rdev-ops.h b/net/wireless/rdev-ops.h index 8ae0c04..488adb9 100644 --- a/net/wireless/rdev-ops.h +++ b/net/wireless/rdev-ops.h @@ -1071,4 +1071,15 @@ rdev_set_coalesce(struct cfg80211_registered_device *rdev, trace_rdev_return_int(>wiphy, ret); return ret; } + +static inline int +rdev_set_htcap_rxmask(struct cfg80211_registered_device *rdev, uint8_t *rxmask) +{ + int ret; + + trace_rdev_set_htcap_rxmask(>wiphy, rxmask); + ret = rdev->ops->set_htcap_rxmask(>wiphy, rxmask); + trace_rdev_return_int(>wiphy, ret); + return ret; +} #endif /* __CFG80211_RDEV_OPS */ diff --git a/net/wireless/trace.h b/net/wireless/trace.h index 09b242b..d7c8c3c 100644 --- a/net/wireless/trace.h +++ b/net/wireless/trace.h @@ -2120,6 +2120,21 @@ TRACE_EVENT(rdev_tdls_cancel_channel_switch, WIPHY_PR_ARG, NETDEV_PR_ARG, MAC_PR_ARG(addr)) ); +TRACE_EVENT(rdev_set_htcap_rxmask, + TP_PROTO(struct wiphy *wiphy, uint8_t *rxmask), + TP_ARGS(wiphy, rxmask), + TP_STRUCT__entry( + WIPHY_ENTRY + __array(uint8_t, rxmask, IEEE80211_HT_MCS_MASK_LEN) + ), + TP_fast_assign( + WIPHY_ASSIGN; + memcpy(__entry->rxmask, rxmask, IEEE80211_HT_MCS_MASK_LEN); + ), + TP_printk(WIPHY_PR_FMT ", %*ph", + WIPHY_PR_ARG, IEEE80211_HT_MCS_MASK_LEN, &__entry->rxmask[0]) +); + /* * cfg80211 exported functions traces * */ -- 1.9.1 -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[RFC 0/2] mac80211: add support for ht_caps mcs rxmask override
This patchset allows the ht_caps mcs rxmask to be defined on the fly. It applies the given rxmask to all available bands. This is actually limited to radio cards without internal rc. Cedric DEBARGE (2): cfg80211: add support for ht_caps mcs rxmask override nl80211: add nl attribute to set ht_caps mcs rxmask override include/net/cfg80211.h | 7 ++ include/uapi/linux/nl80211.h | 5 + net/mac80211/cfg.c | 48 +++ net/mac80211/main.c | 53 +--- net/wireless/nl80211.c | 18 +++ net/wireless/rdev-ops.h | 11 + net/wireless/trace.h | 15 + 7 files changed, 149 insertions(+), 8 deletions(-) -- 1.9.1 -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH v2 1/4] lib: move strtobool to kstrtobool
On Thu, Feb 4, 2016 at 3:55 PM, Rasmus Villemoeswrote: > On Thu, Feb 04 2016, Kees Cook wrote: > >> Create the kstrtobool_from_user helper and moves strtobool logic into >> the new kstrtobool (matching all the other kstrto* functions). Provides >> an inline wrapper for existing strtobool callers. >> >> Signed-off-by: Kees Cook >> --- >> include/linux/kernel.h | 3 +++ >> include/linux/string.h | 6 +- >> lib/kstrtox.c | 35 +++ >> lib/string.c | 29 - >> 4 files changed, 43 insertions(+), 30 deletions(-) >> >> diff --git a/include/linux/kernel.h b/include/linux/kernel.h >> index f31638c6e873..cdc25f47a23f 100644 >> --- a/include/linux/kernel.h >> +++ b/include/linux/kernel.h >> @@ -357,6 +357,7 @@ int __must_check kstrtou16(const char *s, unsigned int >> base, u16 *res); >> int __must_check kstrtos16(const char *s, unsigned int base, s16 *res); >> int __must_check kstrtou8(const char *s, unsigned int base, u8 *res); >> int __must_check kstrtos8(const char *s, unsigned int base, s8 *res); >> +int __must_check kstrtobool(const char *s, unsigned int base, bool *res); >> >> int __must_check kstrtoull_from_user(const char __user *s, size_t count, >> unsigned int base, unsigned long long *res); >> int __must_check kstrtoll_from_user(const char __user *s, size_t count, >> unsigned int base, long long *res); >> @@ -368,6 +369,8 @@ int __must_check kstrtou16_from_user(const char __user >> *s, size_t count, unsigne >> int __must_check kstrtos16_from_user(const char __user *s, size_t count, >> unsigned int base, s16 *res); >> int __must_check kstrtou8_from_user(const char __user *s, size_t count, >> unsigned int base, u8 *res); >> int __must_check kstrtos8_from_user(const char __user *s, size_t count, >> unsigned int base, s8 *res); >> +int __must_check kstrtobool_from_user(const char __user *s, size_t count, >> + unsigned int base, bool *res); >> >> static inline int __must_check kstrtou64_from_user(const char __user *s, >> size_t count, unsigned int base, u64 *res) >> { >> diff --git a/include/linux/string.h b/include/linux/string.h >> index 9eebc66d957a..d2fb21b1081d 100644 >> --- a/include/linux/string.h >> +++ b/include/linux/string.h >> @@ -128,7 +128,11 @@ extern char **argv_split(gfp_t gfp, const char *str, >> int *argcp); >> extern void argv_free(char **argv); >> >> extern bool sysfs_streq(const char *s1, const char *s2); >> -extern int strtobool(const char *s, bool *res); >> +extern int kstrtobool(const char *s, unsigned int base, bool *res); >> +static inline int strtobool(const char *s, bool *res) >> +{ >> + return kstrtobool(s, 0, res); >> +} >> >> #ifdef CONFIG_BINARY_PRINTF >> int vbin_printf(u32 *bin_buf, size_t size, const char *fmt, va_list args); >> diff --git a/lib/kstrtox.c b/lib/kstrtox.c >> index 94be244e8441..e18f088704d7 100644 >> --- a/lib/kstrtox.c >> +++ b/lib/kstrtox.c >> @@ -321,6 +321,40 @@ int kstrtos8(const char *s, unsigned int base, s8 *res) >> } >> EXPORT_SYMBOL(kstrtos8); >> >> +/** >> + * kstrtobool - convert common user inputs into boolean values >> + * @s: input string >> + * @base: ignored >> + * @res: result >> + * >> + * This routine returns 0 iff the first character is one of 'Yy1Nn0'. >> + * Otherwise it will return -EINVAL. Value pointed to by res is >> + * updated upon finding a match. >> + */ >> +int kstrtobool(const char *s, unsigned int base, bool *res) >> +{ > > Being able to create the kstrtobool_from_user with a single macro > invocation is convenient, but I don't think that justifies the ugliness > of having an unused parameter. People reading this code or trying to use > the interface will wonder what it's doing there, and it will generate > slightly larger code for all the users of strtobool. > > So I'd just make a separate explicit definition of kstrtobool_from_user > (the stack buffer sizing doesn't apply to the strings we want to parse > anyway, though 11 is of course plenty). Okay, thanks. So many things were bothering me, but I feared code duplication would be seen as worse. I'm much happier to drop the unused argument. :) I'll send a v3 with all the changes. -Kees -- Kees Cook Chrome OS & Brillo Security -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[RESEND] Re: carl9170 client RTS/CTS option being overridden by WAP's WMM option
On Friday, February 05, 2016 04:07:22 PM Eric Hillary wrote: > Has anyone experienced that RTS/CTS handshaking stops occurring at the > client if the the access point enables WMM? yes, the 802.11-draftn device has problems (rx and tx become stuck) with 802.11n and proper WMM (and with RTS/CTS). Sadly, I don't know of any workaround that works for all the configurations I tested, other than going for a ath9k_htc device. > Using the carl9170 driver with RTS/CTS handshaking enabled on a USB > Ubiquiti SR71-USB (Atheros AR9170 based wireless adapter). RTS/CTS will > stop working when WMM is enabled on the WAP. You can overwrite carl9170's behavior (per device). You need to have DEBUGFS enabled for the driver (CONFIG_CARL9170_DEBUGFS). There is a control setting in: /sys/kernel/debug/ieee80211/phyX/carl9170/erp 1 - Automatic (default) 2 - Set by mac80211 3 - Force off 4 - Force CTS 5 - Force RTS You can try echo 2 > erp. And check the setting with cat erp > The network is running in 802.11n C-band (5GHz) channels in > Infrastructure mode with an Atheros AR9370 based Access Point. We are > using RTS/CTS handshaking to reduce “Hidden Node” effects. Other > clients in the network require WMM to be enabled. For reasons cited in > http://www.smallnetbuilder.com/wireless/wireless-features/30938-dont- > mess-with-wmm, WMM should be enabled to support 802.11e, > required for 802.11n to use HT (High Throughput) link rates. > > With the WMM turned OFF at the AP and RTS value = 256 at the Ubiquiti > client, the RTS/CTS handshake functions normally. With WMM turned ON at > the AP and RTS value = 256 still on at the client no RTS/CTS handshake > occurs. The carl9170 client stops sending the RTS, and the carl1970 > client ignoring the CTS messages transmitted by the AP, causing > collisions because of my “Hidden Node” condition. > > Had to get scope plots of the RF network traffic between the AP and > client to observe this happening. scope plots from a real analyzer? I would love to have a look at those :). Regards, Christian -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH v3 4/4] param: convert some "on"/"off" users to strtobool
This changes several users of manual "on"/"off" parsing to use strtobool. Some side-effects: - these uses will now parse y/n/1/0 meaningfully too - the early_param uses will now bubble up parse errors Signed-off-by: Kees CookAcked-by: Heiko Carstens Acked-by: Michael Ellerman Cc: x...@kernel.org Cc: linuxppc-...@lists.ozlabs.org Cc: linux-s...@vger.kernel.org --- v3: - retain __setup return values, andy.shevchenko - remove unused "base" argument --- arch/powerpc/kernel/rtasd.c | 7 ++- arch/powerpc/platforms/pseries/hotplug-cpu.c | 10 ++ arch/s390/kernel/time.c | 8 ++-- arch/s390/kernel/topology.c | 7 ++- arch/x86/kernel/aperture_64.c| 12 ++-- include/linux/tick.h | 2 +- kernel/time/hrtimer.c| 10 ++ kernel/time/tick-sched.c | 10 ++ 8 files changed, 15 insertions(+), 51 deletions(-) diff --git a/arch/powerpc/kernel/rtasd.c b/arch/powerpc/kernel/rtasd.c index 5a2c049c1c61..0ae5cb84d4e2 100644 --- a/arch/powerpc/kernel/rtasd.c +++ b/arch/powerpc/kernel/rtasd.c @@ -49,7 +49,7 @@ static unsigned int rtas_error_log_buffer_max; static unsigned int event_scan; static unsigned int rtas_event_scan_rate; -static int full_rtas_msgs = 0; +static bool full_rtas_msgs; /* Stop logging to nvram after first fatal error */ static int logging_enabled; /* Until we initialize everything, @@ -592,10 +592,7 @@ __setup("surveillance=", surveillance_setup); static int __init rtasmsgs_setup(char *str) { - if (strcmp(str, "on") == 0) - full_rtas_msgs = 1; - else if (strcmp(str, "off") == 0) - full_rtas_msgs = 0; + kstrtobool(str, _rtas_msgs); return 1; } diff --git a/arch/powerpc/platforms/pseries/hotplug-cpu.c b/arch/powerpc/platforms/pseries/hotplug-cpu.c index 32274f72fe3f..282837a1d74b 100644 --- a/arch/powerpc/platforms/pseries/hotplug-cpu.c +++ b/arch/powerpc/platforms/pseries/hotplug-cpu.c @@ -47,20 +47,14 @@ static DEFINE_PER_CPU(enum cpu_state_vals, current_state) = CPU_STATE_OFFLINE; static enum cpu_state_vals default_offline_state = CPU_STATE_OFFLINE; -static int cede_offline_enabled __read_mostly = 1; +static bool cede_offline_enabled __read_mostly = true; /* * Enable/disable cede_offline when available. */ static int __init setup_cede_offline(char *str) { - if (!strcmp(str, "off")) - cede_offline_enabled = 0; - else if (!strcmp(str, "on")) - cede_offline_enabled = 1; - else - return 0; - return 1; + return (kstrtobool(str, _offline_enabled) == 0); } __setup("cede_offline=", setup_cede_offline); diff --git a/arch/s390/kernel/time.c b/arch/s390/kernel/time.c index 99f84ac31307..580bc7299ec3 100644 --- a/arch/s390/kernel/time.c +++ b/arch/s390/kernel/time.c @@ -1433,7 +1433,7 @@ device_initcall(etr_init_sysfs); /* * Server Time Protocol (STP) code. */ -static int stp_online; +static bool stp_online; static struct stp_sstpi stp_info; static void *stp_page; @@ -1444,11 +1444,7 @@ static struct timer_list stp_timer; static int __init early_parse_stp(char *p) { - if (strncmp(p, "off", 3) == 0) - stp_online = 0; - else if (strncmp(p, "on", 2) == 0) - stp_online = 1; - return 0; + return kstrtobool(p, _online); } early_param("stp", early_parse_stp); diff --git a/arch/s390/kernel/topology.c b/arch/s390/kernel/topology.c index 40b8102fdadb..64298a867589 100644 --- a/arch/s390/kernel/topology.c +++ b/arch/s390/kernel/topology.c @@ -37,7 +37,7 @@ static void set_topology_timer(void); static void topology_work_fn(struct work_struct *work); static struct sysinfo_15_1_x *tl_info; -static int topology_enabled = 1; +static bool topology_enabled = true; static DECLARE_WORK(topology_work, topology_work_fn); /* @@ -444,10 +444,7 @@ static const struct cpumask *cpu_book_mask(int cpu) static int __init early_parse_topology(char *p) { - if (strncmp(p, "off", 3)) - return 0; - topology_enabled = 0; - return 0; + return kstrtobool(p, _enabled); } early_param("topology", early_parse_topology); diff --git a/arch/x86/kernel/aperture_64.c b/arch/x86/kernel/aperture_64.c index 6e85f713641d..0a2bb1f62e72 100644 --- a/arch/x86/kernel/aperture_64.c +++ b/arch/x86/kernel/aperture_64.c @@ -227,19 +227,11 @@ static u32 __init search_agp_bridge(u32 *order, int *valid_agp) return 0; } -static int gart_fix_e820 __initdata = 1; +static bool gart_fix_e820 __initdata = true; static int __init parse_gart_mem(char *p) { - if (!p) - return -EINVAL; - - if (!strncmp(p, "off", 3)) - gart_fix_e820 = 0; - else if (!strncmp(p, "on", 2)) -
[PATCH v3 1/4] lib: move strtobool to kstrtobool
Create the kstrtobool_from_user helper and moves strtobool logic into the new kstrtobool (matching all the other kstrto* functions). Provides an inline wrapper for existing strtobool callers. Signed-off-by: Kees Cook--- v3: - drop needless "base" argument, rasmus --- include/linux/kernel.h | 2 ++ include/linux/string.h | 6 +- lib/kstrtox.c | 50 ++ lib/string.c | 29 - 4 files changed, 57 insertions(+), 30 deletions(-) diff --git a/include/linux/kernel.h b/include/linux/kernel.h index f31638c6e873..f4fa2b29c38c 100644 --- a/include/linux/kernel.h +++ b/include/linux/kernel.h @@ -357,6 +357,7 @@ int __must_check kstrtou16(const char *s, unsigned int base, u16 *res); int __must_check kstrtos16(const char *s, unsigned int base, s16 *res); int __must_check kstrtou8(const char *s, unsigned int base, u8 *res); int __must_check kstrtos8(const char *s, unsigned int base, s8 *res); +int __must_check kstrtobool(const char *s, bool *res); int __must_check kstrtoull_from_user(const char __user *s, size_t count, unsigned int base, unsigned long long *res); int __must_check kstrtoll_from_user(const char __user *s, size_t count, unsigned int base, long long *res); @@ -368,6 +369,7 @@ int __must_check kstrtou16_from_user(const char __user *s, size_t count, unsigne int __must_check kstrtos16_from_user(const char __user *s, size_t count, unsigned int base, s16 *res); int __must_check kstrtou8_from_user(const char __user *s, size_t count, unsigned int base, u8 *res); int __must_check kstrtos8_from_user(const char __user *s, size_t count, unsigned int base, s8 *res); +int __must_check kstrtobool_from_user(const char __user *s, size_t count, bool *res); static inline int __must_check kstrtou64_from_user(const char __user *s, size_t count, unsigned int base, u64 *res) { diff --git a/include/linux/string.h b/include/linux/string.h index 9eebc66d957a..2217224684c9 100644 --- a/include/linux/string.h +++ b/include/linux/string.h @@ -128,7 +128,11 @@ extern char **argv_split(gfp_t gfp, const char *str, int *argcp); extern void argv_free(char **argv); extern bool sysfs_streq(const char *s1, const char *s2); -extern int strtobool(const char *s, bool *res); +extern int kstrtobool(const char *s, bool *res); +static inline int strtobool(const char *s, bool *res) +{ + return kstrtobool(s, res); +} #ifdef CONFIG_BINARY_PRINTF int vbin_printf(u32 *bin_buf, size_t size, const char *fmt, va_list args); diff --git a/lib/kstrtox.c b/lib/kstrtox.c index 94be244e8441..e8ba4a013e82 100644 --- a/lib/kstrtox.c +++ b/lib/kstrtox.c @@ -321,6 +321,56 @@ int kstrtos8(const char *s, unsigned int base, s8 *res) } EXPORT_SYMBOL(kstrtos8); +/** + * kstrtobool - convert common user inputs into boolean values + * @s: input string + * @res: result + * + * This routine returns 0 iff the first character is one of 'Yy1Nn0'. + * Otherwise it will return -EINVAL. Value pointed to by res is + * updated upon finding a match. + */ +int kstrtobool(const char *s, bool *res) +{ + if (!s) + return -EINVAL; + + switch (s[0]) { + case 'y': + case 'Y': + case '1': + *res = true; + return 0; + case 'n': + case 'N': + case '0': + *res = false; + return 0; + default: + break; + } + + return -EINVAL; +} +EXPORT_SYMBOL(kstrtobool); + +/* + * Since "base" would be a nonsense argument, this open-codes the + * _from_user helper instead of using the helper macro below. + */ +int kstrtobool_from_user(const char __user *s, size_t count, bool *res) +{ + /* Longest string needed to differentiate, newline, terminator */ + char buf[4]; + + count = min(count, sizeof(buf) - 1); + if (copy_from_user(buf, s, count)) + return -EFAULT; + buf[count] = '\0'; + return kstrtobool(buf, res); +} +EXPORT_SYMBOL(kstrtobool_from_user); + #define kstrto_from_user(f, g, type) \ int f(const char __user *s, size_t count, unsigned int base, type *res) \ { \ diff --git a/lib/string.c b/lib/string.c index 0323c0d5629a..1a90db9bc6e1 100644 --- a/lib/string.c +++ b/lib/string.c @@ -630,35 +630,6 @@ bool sysfs_streq(const char *s1, const char *s2) } EXPORT_SYMBOL(sysfs_streq); -/** - * strtobool - convert common user inputs into boolean values - * @s: input string - * @res: result - * - * This routine returns 0 iff the first character is one of 'Yy1Nn0'. - * Otherwise it will return -EINVAL. Value pointed to by res is - * updated upon finding a match. - */ -int strtobool(const char *s, bool *res) -{ - switch (s[0]) { - case 'y': - case 'Y': - case '1': - *res = true; - break; -
[PATCH v3 3/4] lib: add "on"/"off" support to kstrtobool
Add support for "on" and "off" when converting to boolean. Signed-off-by: Kees Cook--- v3: - add dropped descripion change, andy.shevchenko --- lib/kstrtox.c | 20 +--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/lib/kstrtox.c b/lib/kstrtox.c index e8ba4a013e82..d8a5cf66c316 100644 --- a/lib/kstrtox.c +++ b/lib/kstrtox.c @@ -326,9 +326,9 @@ EXPORT_SYMBOL(kstrtos8); * @s: input string * @res: result * - * This routine returns 0 iff the first character is one of 'Yy1Nn0'. - * Otherwise it will return -EINVAL. Value pointed to by res is - * updated upon finding a match. + * This routine returns 0 iff the first character is one of 'Yy1Nn0', or + * [oO][NnFf] for "on" and "off". Otherwise it will return -EINVAL. Value + * pointed to by res is updated upon finding a match. */ int kstrtobool(const char *s, bool *res) { @@ -346,6 +346,20 @@ int kstrtobool(const char *s, bool *res) case '0': *res = false; return 0; + case 'o': + case 'O': + switch (s[1]) { + case 'n': + case 'N': + *res = true; + return 0; + case 'f': + case 'F': + *res = false; + return 0; + default: + break; + } default: break; } -- 2.6.3 -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH v3 2/4] lib: update single-char callers of strtobool
Some callers of strtobool were passing a pointer to unterminated strings. In preparation of adding multi-character processing to kstrtobool, update the callers to not pass single-character pointers, and switch to using the new kstrtobool_from_user helper where possible. Signed-off-by: Kees CookCc: Amitkumar Karwar Cc: Nishant Sarmukadam Cc: Kalle Valo Cc: Steve French Cc: linux-c...@vger.kernel.org --- v3: - drop needless buffer, andy.shevchenko - drop unused "base" argument --- drivers/net/wireless/marvell/mwifiex/debugfs.c | 10 ++--- fs/cifs/cifs_debug.c | 56 +++--- fs/cifs/cifs_debug.h | 2 +- fs/cifs/cifsfs.c | 6 +-- fs/cifs/cifsglob.h | 4 +- 5 files changed, 24 insertions(+), 54 deletions(-) diff --git a/drivers/net/wireless/marvell/mwifiex/debugfs.c b/drivers/net/wireless/marvell/mwifiex/debugfs.c index 0b9c580af988..2eff989c6d9f 100644 --- a/drivers/net/wireless/marvell/mwifiex/debugfs.c +++ b/drivers/net/wireless/marvell/mwifiex/debugfs.c @@ -880,14 +880,12 @@ mwifiex_reset_write(struct file *file, { struct mwifiex_private *priv = file->private_data; struct mwifiex_adapter *adapter = priv->adapter; - char cmd; bool result; + int rc; - if (copy_from_user(, ubuf, sizeof(cmd))) - return -EFAULT; - - if (strtobool(, )) - return -EINVAL; + rc = kstrtobool_from_user(ubuf, count, ); + if (rc) + return rc; if (!result) return -EINVAL; diff --git a/fs/cifs/cifs_debug.c b/fs/cifs/cifs_debug.c index 50b268483302..788e19195991 100644 --- a/fs/cifs/cifs_debug.c +++ b/fs/cifs/cifs_debug.c @@ -255,7 +255,6 @@ static const struct file_operations cifs_debug_data_proc_fops = { static ssize_t cifs_stats_proc_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos) { - char c; bool bv; int rc; struct list_head *tmp1, *tmp2, *tmp3; @@ -263,11 +262,8 @@ static ssize_t cifs_stats_proc_write(struct file *file, struct cifs_ses *ses; struct cifs_tcon *tcon; - rc = get_user(c, buffer); - if (rc) - return rc; - - if (strtobool(, ) == 0) { + rc = kstrtobool_from_user(buffer, count, ); + if (rc == 0) { #ifdef CONFIG_CIFS_STATS2 atomic_set(, 0); atomic_set(, 0); @@ -290,6 +286,8 @@ static ssize_t cifs_stats_proc_write(struct file *file, } } spin_unlock(_tcp_ses_lock); + } else { + return rc; } return count; @@ -433,17 +431,17 @@ static int cifsFYI_proc_open(struct inode *inode, struct file *file) static ssize_t cifsFYI_proc_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos) { - char c; + char c[2] = { '\0' }; bool bv; int rc; - rc = get_user(c, buffer); + rc = get_user(c[0], buffer); if (rc) return rc; - if (strtobool(, ) == 0) + if (strtobool(c, ) == 0) cifsFYI = bv; - else if ((c > '1') && (c <= '9')) - cifsFYI = (int) (c - '0'); /* see cifs_debug.h for meanings */ + else if ((c[0] > '1') && (c[0] <= '9')) + cifsFYI = (int) (c[0] - '0'); /* see cifs_debug.h for meanings */ return count; } @@ -471,20 +469,12 @@ static int cifs_linux_ext_proc_open(struct inode *inode, struct file *file) static ssize_t cifs_linux_ext_proc_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos) { - char c; - bool bv; int rc; - rc = get_user(c, buffer); + rc = kstrtobool_from_user(buffer, count, ); if (rc) return rc; - rc = strtobool(, ); - if (rc) - return rc; - - linuxExtEnabled = bv; - return count; } @@ -511,20 +501,12 @@ static int cifs_lookup_cache_proc_open(struct inode *inode, struct file *file) static ssize_t cifs_lookup_cache_proc_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos) { - char c; - bool bv; int rc; - rc = get_user(c, buffer); + rc = kstrtobool_from_user(buffer, count, ); if (rc) return rc; - rc = strtobool(, ); - if (rc) - return rc; - - lookupCacheEnabled = bv; - return count; } @@ -551,20 +533,12 @@ static int traceSMB_proc_open(struct inode *inode, struct file *file) static ssize_t traceSMB_proc_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos) { -
Re: [PATCH v2 2/4] lib: update single-char callers of strtobool
On Fri, Feb 5, 2016 at 2:46 AM, David Laightwrote: > From: Kees Cook >> Sent: 04 February 2016 21:01 >> Some callers of strtobool were passing a pointer to unterminated strings. >> In preparation of adding multi-character processing to kstrtobool, update >> the callers to not pass single-character pointers, and switch to using the >> new kstrtobool_from_user helper where possible. > > Personally I think you should change the name of the function so that the > compiler (and linker) will pick up places that have not been changed. > Relying on people to make the required changes will cause problems. After the single-character users were pointed out, I looked for others and there aren't any. > The current code (presumably) treats "no", "nyet" and "nkjkkrkjrkjterkj" as > false. > Changing that behaviour will break things. There's no change there. All three of those will still be "false". Perhaps my changelog shouldn't say "unterminated" but rather "character array". > If you want to support "on" and "off", then maybe check for the supplied > string > starting with the character sequences "on\0" and "off\0" (as well as any > others). > This doesn't need the input string be '\0' terminated - since you match y and > n > without looking at the 2nd byte. > You'd have to be extremely unlucky to get a page fault in the 3 bytes > following an 'o' if the caller supplied a single byte buffer. I'd prefer to keep the switch statement as short as possible, and I don't want to do full string compares. And as you say, even fixing the single-byte callers seems like a needless exercise, but seeing as how it's a net clean-up, I think it's good they way I've got the series. -Kees -- Kees Cook Chrome OS & Brillo Security -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [RFC v2] iwlwifi: pcie: transmit queue auto-sizing
On 4 February 2016 at 22:14, Ben Greearwrote: > On 02/04/2016 12:56 PM, Grumbach, Emmanuel wrote: >> On 02/04/2016 10:46 PM, Ben Greear wrote: >>> On 02/04/2016 12:16 PM, Emmanuel Grumbach wrote: As many (all?) WiFi devices, Intel WiFi devices have transmit queues which have 256 transmit descriptors each and each descriptor corresponds to an MPDU. This means that when it is full, the queue contains 256 * ~1500 bytes to be transmitted (if we don't have A-MSDUs). The purpose of those queues is to have enough packets to be ready for transmission so that when the device gets an opportunity to transmit (TxOP), it can take as many packets as the spec allows and aggregate them into one A-MPDU or even several A-MPDUs if we are using bursts. >>> >>> I guess this is only really usable if you have exactly one >>> peer connected (ie, in station mode)? >>> >>> Otherwise, you could have one slow peer and one fast one, >>> and then I suspect this would not work so well? >> >> >> Yes. I guess this one (big) limitation. I guess that what would happen >> in this case is that the the latency would constantly jitter. But I also Hmm.. You'd probably need to track per-station packet sojourn time as well and make it possible to stop/wake queues per station. >> noticed that I could reduce the transmit queue to 130 descriptors >> (instead of 256) and still reach maximal throughput because we can >> refill the queues quickly enough. >> In iwlwifi, we have plans to have one queue for each peer. >> This is under development. Not sure when it'll be ready. It also requires >> firmware change obviously. > > Per-peer queues will probably be nice, especially if we can keep the > buffer bloat manageable. Per-station queues sound tricky if you consider bufferbloat. To maximize use of airtime (i.e. txop) you need to send big aggregates. Since aggregates are per station-tid to maximize multi-station performance (in AP mode) you'll need to queue a lot of frames, per each station, depending on the chosen tx rate. A bursted txop can be as big as 5-10ms. If you consider you want to queue 5-10ms worth of data for *each* station at any given time you obviously introduce a lot of lag. If you have 10 stations you might end up with service period at 10*10ms = 100ms. This gets even worse if you consider MU-MIMO because you need to do an expensive sounding procedure before transmitting. So while SU aggregation can probably still work reasonably well with shorter bursts (1-2ms) MU needs at least 3ms to get *any* gain when compared to SU (which obviously means you want more to actually make MU pay off). The rule of thumb is the longer you wait the bigger capacity you can get. Apparently there's interest in maximizing throughput but it stands in direct opposition of keeping the latency down so I've been thinking how to satisfy both. The current approach ath10k is taking (patches in review [1][2]) is to use mac80211 software queues for per-station queuing, exposing queue state to firmware (it decides where frames should be dequeued from) and making it possible to stop/wake per-station tx subqueue with fake netdev queues. I'm starting to think this is not the right way though because it's inherently hard to control latency and there's a huge memory overhead associated with the fake netdev queues. Also fq_codel is a less effective with this kind of setup. My current thinking is that the entire problem should be solved via (per-AC) qdiscs, e.g. fq_codel. I guess one could use limit/target/interval/quantum knobs to tune it for higher latency of aggregation-oriented Wi-Fi links where long service time (think 100-200ms) is acceptable. However fq_codel is oblivious to how Wi-Fi works in the first place, i.e. Wi-Fi gets better throughput if you deliver bursts of packets destined to the same station. Moreover this gets even more complicated with MU-MIMO where you may want to consider spatial location (which influences signal quality when grouped) of each station when you decide which set of stations you're going to aggregate to in parallel. Since drivers have a finite tx ring this it is important to deliver bursts that can actually be aggregated efficiently. This means driver would need to be able to tell qdisc about per-flow conditions to influence the RR scheme in some way (assuming a qdiscs even understands flows; do we need a unified way of talking about flows between qdiscs and drivers?). [1]: https://www.spinics.net/lists/linux-wireless/msg146187.html [2]: https://www.spinics.net/lists/linux-wireless/msg146512.html >>> For reference, ath10k has around 1400 tx descriptors, though >>> in practice not all are usable, and in stock firmware, I'm guessing >>> the NIC will never be able to actually fill up it's tx descriptors >>> and stop traffic. Instead, it just allows the stack to try to >>> TX, then drops the frame... >> >> >> 1400 descriptors, ok... but they are not
[RFC v2] mac80211: add A-MSDU tx support
Requires software tx queueing support. frag_list support (for zero-copy) is optional. Signed-off-by: Felix Fietkau--- include/net/mac80211.h | 14 + net/mac80211/agg-tx.c | 5 ++ net/mac80211/debugfs.c | 2 + net/mac80211/ieee80211_i.h | 1 + net/mac80211/tx.c | 151 + 5 files changed, 173 insertions(+) diff --git a/include/net/mac80211.h b/include/net/mac80211.h index 5714774..f50bbd2 100644 --- a/include/net/mac80211.h +++ b/include/net/mac80211.h @@ -709,6 +709,7 @@ enum mac80211_tx_info_flags { * @IEEE80211_TX_CTRL_PS_RESPONSE: This frame is a response to a poll * frame (PS-Poll or uAPSD). * @IEEE80211_TX_CTRL_RATE_INJECT: This frame is injected with rate information + * @IEEE80211_TX_CTRL_AMSDU: This frame is an A-MSDU frame * * These flags are used in tx_info->control.flags. */ @@ -716,6 +717,7 @@ enum mac80211_tx_control_flags { IEEE80211_TX_CTRL_PORT_CTRL_PROTO = BIT(0), IEEE80211_TX_CTRL_PS_RESPONSE = BIT(1), IEEE80211_TX_CTRL_RATE_INJECT = BIT(2), + IEEE80211_TX_CTRL_AMSDU = BIT(3), }; /* @@ -1964,6 +1966,12 @@ struct ieee80211_txq { * order and does not need to manage its own reorder buffer or BA session * timeout. * + * @IEEE80211_HW_TX_AMSDU: Hardware (or driver) supports software aggregated + * A-MSDU frames. Requires software tx queueing support. + * + * @IEEE80211_HW_TX_FRAG_LIST: Hardware (or driver) supports sending frag_list + * skbs, needed for zero-copy software A-MSDU. + * * @NUM_IEEE80211_HW_FLAGS: number of hardware flags, used for sizing arrays */ enum ieee80211_hw_flags { @@ -2001,6 +2009,8 @@ enum ieee80211_hw_flags { IEEE80211_HW_BEACON_TX_STATUS, IEEE80211_HW_NEEDS_UNIQUE_STA_ADDR, IEEE80211_HW_SUPPORTS_REORDERING_BUFFER, + IEEE80211_HW_TX_AMSDU, + IEEE80211_HW_TX_FRAG_LIST, /* keep last, obviously */ NUM_IEEE80211_HW_FLAGS @@ -2073,6 +2083,9 @@ enum ieee80211_hw_flags { * size is smaller (an example is LinkSys WRT120N with FW v1.0.07 * build 002 Jun 18 2012). * + * @max_tx_amsdu_subframes: maximum number of subframes used in software + * A-MSDU aggregation + * * @offchannel_tx_hw_queue: HW queue ID to use for offchannel TX * (if %IEEE80211_HW_QUEUE_CONTROL is set) * @@ -2127,6 +2140,7 @@ struct ieee80211_hw { u8 max_rate_tries; u8 max_rx_aggregation_subframes; u8 max_tx_aggregation_subframes; + u8 max_tx_amsdu_subframes; u8 offchannel_tx_hw_queue; u8 radiotap_mcs_details; u16 radiotap_vht_details; diff --git a/net/mac80211/agg-tx.c b/net/mac80211/agg-tx.c index 4932e9f..42fa810 100644 --- a/net/mac80211/agg-tx.c +++ b/net/mac80211/agg-tx.c @@ -935,6 +935,7 @@ void ieee80211_process_addba_resp(struct ieee80211_local *local, size_t len) { struct tid_ampdu_tx *tid_tx; + struct ieee80211_txq *txq; u16 capab, tid; u8 buf_size; bool amsdu; @@ -945,6 +946,10 @@ void ieee80211_process_addba_resp(struct ieee80211_local *local, buf_size = (capab & IEEE80211_ADDBA_PARAM_BUF_SIZE_MASK) >> 6; buf_size = min(buf_size, local->hw.max_tx_aggregation_subframes); + txq = sta->sta.txq[tid]; + if (!amsdu && txq) + set_bit(IEEE80211_TXQ_NO_AMSDU, _txq_info(txq)->flags); + mutex_lock(>ampdu_mlme.mtx); tid_tx = rcu_dereference_protected_tid_tx(sta, tid); diff --git a/net/mac80211/debugfs.c b/net/mac80211/debugfs.c index e433d0c..847779d 100644 --- a/net/mac80211/debugfs.c +++ b/net/mac80211/debugfs.c @@ -127,6 +127,8 @@ static const char *hw_flag_names[NUM_IEEE80211_HW_FLAGS + 1] = { FLAG(BEACON_TX_STATUS), FLAG(NEEDS_UNIQUE_STA_ADDR), FLAG(SUPPORTS_REORDERING_BUFFER), + FLAG(TX_AMSDU), + FLAG(TX_FRAG_LIST), /* keep last for the build bug below */ (void *)0x1 diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h index a49c103..e68d8db 100644 --- a/net/mac80211/ieee80211_i.h +++ b/net/mac80211/ieee80211_i.h @@ -799,6 +799,7 @@ struct mac80211_qos_map { enum txq_info_flags { IEEE80211_TXQ_STOP, IEEE80211_TXQ_AMPDU, + IEEE80211_TXQ_NO_AMSDU, }; struct txq_info { diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c index a5aa275..f681048 100644 --- a/net/mac80211/tx.c +++ b/net/mac80211/tx.c @@ -1324,6 +1324,10 @@ struct sk_buff *ieee80211_tx_dequeue(struct ieee80211_hw *hw, out: spin_unlock_bh(>queue.lock); + if (skb && skb_has_frag_list(skb) && + !ieee80211_hw_check(>hw, TX_FRAG_LIST)) + skb_linearize(skb); + return skb; } EXPORT_SYMBOL(ieee80211_tx_dequeue); @@ -2763,6 +2767,149 @@ void ieee80211_clear_fast_xmit(struct sta_info *sta) kfree_rcu(fast_tx,
RE: [PATCH v2 2/4] lib: update single-char callers of strtobool
From: Kees Cook > Sent: 04 February 2016 21:01 > Some callers of strtobool were passing a pointer to unterminated strings. > In preparation of adding multi-character processing to kstrtobool, update > the callers to not pass single-character pointers, and switch to using the > new kstrtobool_from_user helper where possible. Personally I think you should change the name of the function so that the compiler (and linker) will pick up places that have not been changed. Relying on people to make the required changes will cause problems. The current code (presumably) treats "no", "nyet" and "nkjkkrkjrkjterkj" as false. Changing that behaviour will break things. If you want to support "on" and "off", then maybe check for the supplied string starting with the character sequences "on\0" and "off\0" (as well as any others). This doesn't need the input string be '\0' terminated - since you match y and n without looking at the 2nd byte. You'd have to be extremely unlucky to get a page fault in the 3 bytes following an 'o' if the caller supplied a single byte buffer. David -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [ath9k-devel] how to kick off wifi user
qiaowrites: > Now I setup AP (ath9k driver) and want to find a way to kick off a > special wifi user from the AP. I know “iw dev station del”, You're confusing levels of the ISO 7 level models. The place where you kick AP users would be in hostapd, not on the driver level. Or do you think it is feasible to do things differently, depending if you use ath9k, ath10, iwlwifi, or whatever? That would be clumsy. Instead, do it in the piece that actually makes your system an access point, hostapd. And therefore this is probably the wrong mailing list to ask such questions. Holger -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: Finer grained control than ap_isolate
On 2016-02-05 07:22, brian demsky wrote: > Is there a mechanism that can be used to allow some clients/ports on a > given SSID and AP to communicate, but to block others from > communicating? > > In other words, can I implement something like firewall rules between > clients on the same SSID/AP? You might be able to use ap_isolate + bridge hairpin mode + ebtables. - Felix -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: BCM43142 doesn't work
On 6 February 2016 at 00:53, Samuel Siebwrote: > However, what happens is: > Feb 04 11:55:50 localhost kernel: bcma: bus0: Found chip with id 43142, rev > 0x01 and package 0x08 > Feb 04 11:55:50 localhost kernel: bcma: bus0: Core 0 found: ChipCommon > (manuf 0x4BF, id 0x800, rev 0x28, class 0x0) > Feb 04 11:55:50 localhost kernel: bcma: bus0: Core 1 found: IEEE 802.11 > (manuf 0x4BF, id 0x812, rev 0x21, class 0x0) > Feb 04 11:55:50 localhost kernel: bcma: bus0: Core 2 found: PCIe (manuf > 0x4BF, id 0x820, rev 0x16, class 0x0) > Feb 04 11:55:50 localhost kernel: bcma: bus0: Core 3 found: UNKNOWN (manuf > 0x43B, id 0x368, rev 0x00, class 0x0) > Feb 04 11:55:50 localhost kernel: bcma: bus0: Bus registered Which means bcma (bus!) supports BCM43132. It detects bus (!) devices correctly and registers them. There is no driver supporting wireless device found on this chipset. It's a bit like having support for PCI bus. You still need driver for various devices that can be found/connected to such bus. -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
BCM43142 doesn't work
I found a message to this list from 2013 that indicates the BCM43142 chipset should work: https://marc.info/?l=linux-wireless=137223374523831=2 However, what happens is: Feb 04 11:55:50 localhost kernel: bcma: bus0: Found chip with id 43142, rev 0x01 and package 0x08 Feb 04 11:55:50 localhost kernel: bcma: bus0: Core 0 found: ChipCommon (manuf 0x4BF, id 0x800, rev 0x28, class 0x0) Feb 04 11:55:50 localhost kernel: bcma: bus0: Core 1 found: IEEE 802.11 (manuf 0x4BF, id 0x812, rev 0x21, class 0x0) Feb 04 11:55:50 localhost kernel: bcma: bus0: Core 2 found: PCIe (manuf 0x4BF, id 0x820, rev 0x16, class 0x0) Feb 04 11:55:50 localhost kernel: bcma: bus0: Core 3 found: UNKNOWN (manuf 0x43B, id 0x368, rev 0x00, class 0x0) Feb 04 11:55:50 localhost kernel: bcma: bus0: Bus registered Nothing else in the logs, no devices created. Am I missing something like firmware? I would prefer to not have to use a 3rd party driver or worse, ndiswrapper. This is in an HP laptop. lscpi: 03:00.0 Network controller: Broadcom Corporation BCM43142 802.11b/g/n (rev 01) DeviceName: Harrier Subsystem: Hewlett-Packard Company Device 2230 Flags: bus master, fast devsel, latency 0, IRQ 38 Memory at f0c0 (64-bit, non-prefetchable) [size=32K] Capabilities: [40] Power Management version 3 Capabilities: [58] Vendor Specific Information: Len=78 Capabilities: [48] MSI: Enable- Count=1/1 Maskable- 64bit+ Capabilities: [d0] Express Endpoint, MSI 00 Capabilities: [100] Advanced Error Reporting Capabilities: [13c] Virtual Channel Capabilities: [160] Device Serial Number Capabilities: [16c] Power Budgeting Kernel driver in use: bcma-pci-bridge Kernel modules: bcma 03:00.0 0280: 14e4:4365 (rev 01) DeviceName: Harrier Subsystem: 103c:2230 -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: BCM43142 doesn't work
On 02/05/2016 04:41 PM, Rafał Miłecki wrote: On 6 February 2016 at 00:53, Samuel Siebwrote: However, what happens is: Feb 04 11:55:50 localhost kernel: bcma: bus0: Found chip with id 43142, rev 0x01 and package 0x08 Feb 04 11:55:50 localhost kernel: bcma: bus0: Core 0 found: ChipCommon (manuf 0x4BF, id 0x800, rev 0x28, class 0x0) Feb 04 11:55:50 localhost kernel: bcma: bus0: Core 1 found: IEEE 802.11 (manuf 0x4BF, id 0x812, rev 0x21, class 0x0) Feb 04 11:55:50 localhost kernel: bcma: bus0: Core 2 found: PCIe (manuf 0x4BF, id 0x820, rev 0x16, class 0x0) Feb 04 11:55:50 localhost kernel: bcma: bus0: Core 3 found: UNKNOWN (manuf 0x43B, id 0x368, rev 0x00, class 0x0) Feb 04 11:55:50 localhost kernel: bcma: bus0: Bus registered Which means bcma (bus!) supports BCM43132. It detects bus (!) devices correctly and registers them. There is no driver supporting wireless device found on this chipset. Thank you, that makes sense. So I will need a 3rd party driver after all. Unfortunately, the wireless chipset is not one of the specs listed in most stores. -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html