#
7dcb2bea |
| 07-May-2013 |
Adrian Chadd <adrian@FreeBSD.org> |
Re-work how transmit buffer limits are enforced - partly to fix the PR, but partly to just tidy up things.
The problem here - there are too many TX buffers in the queue! By the time one needs to tra
Re-work how transmit buffer limits are enforced - partly to fix the PR, but partly to just tidy up things.
The problem here - there are too many TX buffers in the queue! By the time one needs to transmit an EAPOL frame (for this PR, it's the response to the group rekey notification from the AP) there are no ath_buf entries free and the EAPOL frame doesn't go out.
Now, the problem!
* Enforcing the TX buffer limitation _before_ we dequeue the frame? Bad idea. Because.. * .. it means I can't check whether the mbuf has M_EAPOL set.
The solution(s):
* De-queue the frame first * Don't bother doing the TX buffer minimum free check until after we know whether it's an EAPOL frame or not. * If it's an EAPOL frame, allocate the buffer from the mgmt pool rather than the default pool.
Whilst I'm here:
* Add a tweak to limit how many buffers a single node can acquire. * Don't enforce that for EAPOL frames. * .. set that to default to 1/4 of the available buffers, or 32, whichever is more sane.
This doesn't fix issues due to a sleeping node or a very poor performing node; but this doesn't make it worse.
Tested:
* AR5416 STA, TX'ing 100+ mbit UDP to an AP, but only 50mbit being received (thus the TX queue fills up.) * .. with CCMP / WPA2 encryption configured * .. and the group rekey time set to 10 seconds, just to elicit the behaviour very quickly.
PR: kern/138379
show more ...
|
#
69e6d7b7 |
| 12-Apr-2013 |
Simon J. Gerraty <sjg@FreeBSD.org> |
sync from head
|
#
876a84e8 |
| 18-Mar-2013 |
Martin Matuska <mm@FreeBSD.org> |
MFC @248461
|
#
0e168bb8 |
| 11-Mar-2013 |
Adrian Chadd <adrian@FreeBSD.org> |
Add a few new fields to the RX vendor radiotap header:
* a flags field that lets me know what's going on; * the hardware ratecode, unmolested by conversion to a bitrate; * the HAL rs_flags field, us
Add a few new fields to the RX vendor radiotap header:
* a flags field that lets me know what's going on; * the hardware ratecode, unmolested by conversion to a bitrate; * the HAL rs_flags field, useful for debugging; * specifically mark aggregate sub-frames.
This stuff sorely needs tidying up - it's missing some important stuff (eg numdelims) and it would be nice to put the flags at the beginning rather than at the end.
Tested:
* AR9380, STA mode, 2x2 HT40, monitoring RSSI and EVM values
show more ...
|
#
6b3ba411 |
| 11-Mar-2013 |
Adrian Chadd <adrian@FreeBSD.org> |
Bump the EVM array size up to fit the AR9380 EVM entries.
|
#
d241a0e6 |
| 26-Feb-2013 |
Xin LI <delphij@FreeBSD.org> |
IFC @247348.
|
#
d9a44755 |
| 08-Feb-2013 |
David E. O'Brien <obrien@FreeBSD.org> |
Sync with HEAD.
|
#
8a60b77d |
| 09-Jan-2013 |
Neel Natu <neel@FreeBSD.org> |
IFC @ r245205
|
#
e1c562d8 |
| 08-Jan-2013 |
Adrian Chadd <adrian@FreeBSD.org> |
Add support for triggering spectral scan upon a channel reset/change.
This is intended to support reporting FFT results during active channel scans, for users who would like to fiddle around with wr
Add support for triggering spectral scan upon a channel reset/change.
This is intended to support reporting FFT results during active channel scans, for users who would like to fiddle around with writing applications that do both FFT visualisation _and_ AP scanning.
* add a new ioctl to enable/trigger spectral scan at channel change/reset; * set do_spectral consistently if it's enabled, so a channel set/reset will carry forth the correct PHY error configuration so frames are actually received; * for NICs that don't do spectral scan, don't bother checking the spectral scan state on channel change/reset.
Tested:
* AR9280 - STA and scanning; * AR5416 - STA, ensured that the SS code doesn't panic
show more ...
|
#
46b1c55d |
| 04-Jan-2013 |
Neel Natu <neel@FreeBSD.org> |
IFC @ r244983.
|
#
9af351f9 |
| 02-Jan-2013 |
Adrian Chadd <adrian@FreeBSD.org> |
Add a new (skeleton) spectral mode manager module.
|
Revision tags: release/9.1.0 |
|
#
e477abf7 |
| 27-Nov-2012 |
Alexander Motin <mav@FreeBSD.org> |
MFC @ r241285
|
#
a10c6f55 |
| 11-Nov-2012 |
Neel Natu <neel@FreeBSD.org> |
IFC @ r242684
|
#
23090366 |
| 04-Nov-2012 |
Simon J. Gerraty <sjg@FreeBSD.org> |
Sync from head
|
#
f1bc738e |
| 18-Sep-2012 |
Adrian Chadd <adrian@FreeBSD.org> |
Implement my first cut at filtered frames in aggregation sessions.
The hardware can optionally "filter" frames if successive transmissions to a given node (ie, "entry in the keycache") fail. That w
Implement my first cut at filtered frames in aggregation sessions.
The hardware can optionally "filter" frames if successive transmissions to a given node (ie, "entry in the keycache") fail. That way the hardware can implement a kind of early abort of all the other frames queued to that destination, rather than simply trying to TX each frame to that destination (and failing.)
The background:
* If a frame comes back as being filtered, the hardware didn't try to TX it (or it was outside the TX burst opportunity.) So, take it as a hint that some (but not all, see below) frames to the destination may be filtered.
* If the CLRDMASK bit is set in a TX descriptor, the "filter to this destination" bit in the keycache entry is cleared and TX to that host will be unconditionally retried.
* Right now everything has the CLRDMASK bit set, so filtered frames tend to be aggregates and frames that fall outside of the WME burst window. It was a bit worse in the past as I had messed up the TX flags and CLRDMASK wasn't being set on aggregate frames.
The annoying bits:
* It's easy (ish) to do for aggregate session frames - firstly, they can be retried in any order as long as they're within the BAW, and there's already a bunch of infrastructure tracking how many frames the TID has queued to the hardware (tid->hwq_depth.) However, for frames that bypassed the software queue, hwq_depth doesn't get incremented. I'll fix that in a subsequent commit.
* For non-aggregate session frames, the only retries that can occur are ones for sequence numbers that hvaen't successfully been TXed yet. Since there's no re-ordering going on in non-aggregate sessions, if any subsequent seqno frames make it out, any filtered frames before that seqno need to be dropped.
Hence why this initially is just for aggregate session frames.
* Since there may be intermediary frames to the destination that have CLRDMASK set - for example, any directly dispatched management frames to that destination - it's possible that there will be some filtered frames followed up by some non filtered frames. Thus, it can't be assumed that once you see a filtered frame for the given destination node, all subsequent frames for all TIDs will be filtered.
Ok, with that in mind:
* Create a per-TID filtered frame queue for frames that the hardware returns as filtered.
* Track filtered frames per-tid, rather than per-node. It just makes the locking much easier.
* When a filtered frame appears in the completion function, the node transitions to "filtered", and all subsequent completed error frames (filtered or otherwise) are put on the filtered frame queue. The TID is paused once (during the transition from non-filtered to filtered).
* If a filtered frame retry count exceeds SWMAX_RETRIES, a BAR should be sent.
* Once all the frames queued to the hardware for the given filtered frame TID, transition back from filtered frame to non-filtered frame, which means pre-pending all the filtered frames onto the head of the software queue, clearing the filtered frame state and unpausing the TID.
Things get quite hairy around handling completion (aggr, non-aggr, norm, direct-dispatched frames to a hardware queue); whether it's an "error", "cleanup" or "BAR" state as well as filtered, which order to do things in (eg do filtered BEFORE checking for BAR, as the filter completion may be needed to actually transmit a BAR frame.)
This work has definitely reminded me that I have to tidy up all the locking and remove some of the ridiculous lock/unlock/lock/unlock going on in the completion functions.
It's also reminded me that I should really split out TID versus hardware TXQ locking, even if the underlying locking is still the destination hardware TXQ.
Finally, this is all pre-requisite for working on AP mode power save support (PS-POLL, uAPSD) as well as improving performance to misbehaving nodes (as they can transition into filter mode, stopping any TX until everything has caught up.)
Finally (ish) - this should also be done for non-aggregate sessions as there are still plenty of laptops and mobile devices that don't speak 802.11n but do wish for stable, useful power save AP support where packets aren't simply dropped. This requires software retransmission for non-aggregate sessions to be implemented, which includes the caveats I've mentioned above.
Finally finally - this doesn't yet do anything about the CLRDMASK bit in the TX descriptor. That's still unconditionally set to 1. I'll debug the current work (mostly ensuring I haven't busted up the hairy transitions between BAR, filtered, error (all frames in an aggregate failing) and cleanup (when transitioning from aggregation -> non-aggregation.))
Finally finally finally - this is all original work by yours truely, rather than ported from the Atheros internal driver codebase or Linux ath9k.
Tested: * AR9280, AR5416 in STA mode * AR9280, AR9130 in hostap mode * Lots and lots of iperf testing in very marginal and non-marginal conditions, complete with inducing filtered frames + BAR TX conditions.
show more ...
|
#
e11b6fa3 |
| 03-Aug-2012 |
Gleb Smirnoff <glebius@FreeBSD.org> |
Merge head r233826 through r239010.
|
#
3ba90526 |
| 31-Jul-2012 |
Adrian Chadd <adrian@FreeBSD.org> |
Placeholder ioctl for an upcoming rate control statistics API change.
|
#
be4f96a6 |
| 20-Jul-2012 |
Adrian Chadd <adrian@FreeBSD.org> |
Introduce a rate table TLV so rate table statistics consumers know how to map rix -> rate code.
|
#
9e38f708 |
| 20-Jul-2012 |
Adrian Chadd <adrian@FreeBSD.org> |
Create an ioctl API for fetching the current rate control information.
|
#
c7f5bb7a |
| 15-Jul-2012 |
Adrian Chadd <adrian@FreeBSD.org> |
Handle RX Keymiss events.
The AR9003 series NICs implement a separate RX error to signal that a Keycache miss occured. The earlier NICs would not set the key index valid bit.
I'll dig into the dif
Handle RX Keymiss events.
The AR9003 series NICs implement a separate RX error to signal that a Keycache miss occured. The earlier NICs would not set the key index valid bit.
I'll dig into the difference between "no key index bit set" and "keycache miss".
show more ...
|
#
de720122 |
| 15-Jul-2012 |
Gleb Smirnoff <glebius@FreeBSD.org> |
Merge head r236710 through r238467.
|
#
6cf87ec8 |
| 13-Jul-2012 |
Xin LI <delphij@FreeBSD.org> |
IFC @238412.
|
#
b652778e |
| 11-Jul-2012 |
Peter Grehan <grehan@FreeBSD.org> |
IFC @ r238370
|
#
e1b5ab97 |
| 24-Jun-2012 |
Adrian Chadd <adrian@FreeBSD.org> |
Introduce an optional ath(4) radiotap vendor extension.
This includes a few new fields in each RXed frame:
* per chain RX RSSI (ctl and ext); * current RX chainmask; * EVM information; * PHY error
Introduce an optional ath(4) radiotap vendor extension.
This includes a few new fields in each RXed frame:
* per chain RX RSSI (ctl and ext); * current RX chainmask; * EVM information; * PHY error code; * basic RX status bits (CRC error, PHY error, etc).
This is primarily to allow me to do some userland PHY error processing for radar and spectral scan data. However since EVM and per-chain RSSI is provided, others may find it useful for a variety of tasks.
The default is to not compile in the radiotap vendor extensions, primarily because tcpdump doesn't seem to handle the particular vendor extension layout I'm using, and I'd rather not break existing code out there that may be (badly) parsing the radiotap data.
Instead, add the option 'ATH_ENABLE_RADIOTAP_VENDOR_EXT' to your kernel configuration file to enable these options.
show more ...
|
#
94fe37d2 |
| 10-Jun-2012 |
Adrian Chadd <adrian@FreeBSD.org> |
Add a new ioctl for ath(4) which returns the aggregate statistics.
|