28 Apr, 2017

4 commits

  • Instead of hand-coding the bit manipulations, use the bitfield
    macros to generate the code for the encoded bitrate.

    Signed-off-by: Johannes Berg

    Johannes Berg
     
  • This field will need to be used again for HE, so rename it now.

    Again, mostly done with this spatch:

    @@
    expression status;
    @@
    -status->vht_nss
    +status->nss
    @@
    expression status;
    @@
    -status.vht_nss
    +status.nss

    Signed-off-by: Johannes Berg

    Johannes Berg
     
  • We currently use a lot of flags that are mutually incompatible,
    separate this out into actual encoding and bandwidth enum values.

    Much of this again done with spatch, with manual post-editing,
    mostly to add the switch statements and get rid of the conversions.

    @@
    expression status;
    @@
    -status->enc_flags |= RX_ENC_FLAG_80MHZ
    +status->bw = RATE_INFO_BW_80
    @@
    expression status;
    @@
    -status->enc_flags |= RX_ENC_FLAG_40MHZ
    +status->bw = RATE_INFO_BW_40
    @@
    expression status;
    @@
    -status->enc_flags |= RX_ENC_FLAG_20MHZ
    +status->bw = RATE_INFO_BW_20
    @@
    expression status;
    @@
    -status->enc_flags |= RX_ENC_FLAG_160MHZ
    +status->bw = RATE_INFO_BW_160
    @@
    expression status;
    @@
    -status->enc_flags |= RX_ENC_FLAG_5MHZ
    +status->bw = RATE_INFO_BW_5
    @@
    expression status;
    @@
    -status->enc_flags |= RX_ENC_FLAG_10MHZ
    +status->bw = RATE_INFO_BW_10

    @@
    expression status;
    @@
    -status->enc_flags |= RX_ENC_FLAG_VHT
    +status->encoding = RX_ENC_VHT
    @@
    expression status;
    @@
    -status->enc_flags |= RX_ENC_FLAG_HT
    +status->encoding = RX_ENC_HT
    @@
    expression status;
    @@
    -status.enc_flags |= RX_ENC_FLAG_VHT
    +status.encoding = RX_ENC_VHT
    @@
    expression status;
    @@
    -status.enc_flags |= RX_ENC_FLAG_HT
    +status.encoding = RX_ENC_HT

    @@
    expression status;
    @@
    -(status->enc_flags & RX_ENC_FLAG_HT)
    +(status->encoding == RX_ENC_HT)
    @@
    expression status;
    @@
    -(status->enc_flags & RX_ENC_FLAG_VHT)
    +(status->encoding == RX_ENC_VHT)

    @@
    expression status;
    @@
    -(status->enc_flags & RX_ENC_FLAG_5MHZ)
    +(status->bw == RATE_INFO_BW_5)
    @@
    expression status;
    @@
    -(status->enc_flags & RX_ENC_FLAG_10MHZ)
    +(status->bw == RATE_INFO_BW_10)
    @@
    expression status;
    @@
    -(status->enc_flags & RX_ENC_FLAG_40MHZ)
    +(status->bw == RATE_INFO_BW_40)
    @@
    expression status;
    @@
    -(status->enc_flags & RX_ENC_FLAG_80MHZ)
    +(status->bw == RATE_INFO_BW_80)
    @@
    expression status;
    @@
    -(status->enc_flags & RX_ENC_FLAG_160MHZ)
    +(status->bw == RATE_INFO_BW_160)

    Signed-off-by: Johannes Berg

    Johannes Berg
     
  • In preparation for adding support for HE rates, clean up
    the driver report encoding for rate/bandwidth reporting
    on RX frames.

    Much of this patch was done with the following spatch:

    @@
    expression status;
    @@
    -status->flag & (RX_FLAG_HT | RX_FLAG_VHT)
    +status->enc_flags & (RX_ENC_FLAG_HT | RX_ENC_FLAG_VHT)

    @@
    assignment operator op;
    expression status;
    @@
    -status->flag op RX_FLAG_SHORTPRE
    +status->enc_flags op RX_ENC_FLAG_SHORTPRE
    @@
    expression status;
    @@
    -status->flag & RX_FLAG_SHORTPRE
    +status->enc_flags & RX_ENC_FLAG_SHORTPRE

    @@
    assignment operator op;
    expression status;
    @@
    -status->flag op RX_FLAG_HT
    +status->enc_flags op RX_ENC_FLAG_HT
    @@
    expression status;
    @@
    -status->flag & RX_FLAG_HT
    +status->enc_flags & RX_ENC_FLAG_HT

    @@
    assignment operator op;
    expression status;
    @@
    -status->flag op RX_FLAG_40MHZ
    +status->enc_flags op RX_ENC_FLAG_40MHZ
    @@
    expression status;
    @@
    -status->flag & RX_FLAG_40MHZ
    +status->enc_flags & RX_ENC_FLAG_40MHZ

    @@
    assignment operator op;
    expression status;
    @@
    -status->flag op RX_FLAG_SHORT_GI
    +status->enc_flags op RX_ENC_FLAG_SHORT_GI
    @@
    expression status;
    @@
    -status->flag & RX_FLAG_SHORT_GI
    +status->enc_flags & RX_ENC_FLAG_SHORT_GI

    @@
    assignment operator op;
    expression status;
    @@
    -status->flag op RX_FLAG_HT_GF
    +status->enc_flags op RX_ENC_FLAG_HT_GF
    @@
    expression status;
    @@
    -status->flag & RX_FLAG_HT_GF
    +status->enc_flags & RX_ENC_FLAG_HT_GF

    @@
    assignment operator op;
    expression status;
    @@
    -status->flag op RX_FLAG_VHT
    +status->enc_flags op RX_ENC_FLAG_VHT
    @@
    expression status;
    @@
    -status->flag & RX_FLAG_VHT
    +status->enc_flags & RX_ENC_FLAG_VHT

    @@
    assignment operator op;
    expression status;
    @@
    -status->flag op RX_FLAG_STBC_MASK
    +status->enc_flags op RX_ENC_FLAG_STBC_MASK
    @@
    expression status;
    @@
    -status->flag & RX_FLAG_STBC_MASK
    +status->enc_flags & RX_ENC_FLAG_STBC_MASK

    @@
    assignment operator op;
    expression status;
    @@
    -status->flag op RX_FLAG_LDPC
    +status->enc_flags op RX_ENC_FLAG_LDPC
    @@
    expression status;
    @@
    -status->flag & RX_FLAG_LDPC
    +status->enc_flags & RX_ENC_FLAG_LDPC

    @@
    assignment operator op;
    expression status;
    @@
    -status->flag op RX_FLAG_10MHZ
    +status->enc_flags op RX_ENC_FLAG_10MHZ
    @@
    expression status;
    @@
    -status->flag & RX_FLAG_10MHZ
    +status->enc_flags & RX_ENC_FLAG_10MHZ

    @@
    assignment operator op;
    expression status;
    @@
    -status->flag op RX_FLAG_5MHZ
    +status->enc_flags op RX_ENC_FLAG_5MHZ
    @@
    expression status;
    @@
    -status->flag & RX_FLAG_5MHZ
    +status->enc_flags & RX_ENC_FLAG_5MHZ

    @@
    assignment operator op;
    expression status;
    @@
    -status->vht_flag op RX_VHT_FLAG_80MHZ
    +status->enc_flags op RX_ENC_FLAG_80MHZ
    @@
    expression status;
    @@
    -status->vht_flag & RX_VHT_FLAG_80MHZ
    +status->enc_flags & RX_ENC_FLAG_80MHZ

    @@
    assignment operator op;
    expression status;
    @@
    -status->vht_flag op RX_VHT_FLAG_160MHZ
    +status->enc_flags op RX_ENC_FLAG_160MHZ
    @@
    expression status;
    @@
    -status->vht_flag & RX_VHT_FLAG_160MHZ
    +status->enc_flags & RX_ENC_FLAG_160MHZ

    @@
    assignment operator op;
    expression status;
    @@
    -status->vht_flag op RX_VHT_FLAG_BF
    +status->enc_flags op RX_ENC_FLAG_BF
    @@
    expression status;
    @@
    -status->vht_flag & RX_VHT_FLAG_BF
    +status->enc_flags & RX_ENC_FLAG_BF

    @@
    assignment operator op;
    expression status, STBC;
    @@
    -status->flag op STBC << RX_FLAG_STBC_SHIFT
    +status->enc_flags op STBC << RX_ENC_FLAG_STBC_SHIFT

    @@
    assignment operator op;
    expression status;
    @@
    -status.flag op RX_FLAG_SHORTPRE
    +status.enc_flags op RX_ENC_FLAG_SHORTPRE
    @@
    expression status;
    @@
    -status.flag & RX_FLAG_SHORTPRE
    +status.enc_flags & RX_ENC_FLAG_SHORTPRE

    @@
    assignment operator op;
    expression status;
    @@
    -status.flag op RX_FLAG_HT
    +status.enc_flags op RX_ENC_FLAG_HT
    @@
    expression status;
    @@
    -status.flag & RX_FLAG_HT
    +status.enc_flags & RX_ENC_FLAG_HT

    @@
    assignment operator op;
    expression status;
    @@
    -status.flag op RX_FLAG_40MHZ
    +status.enc_flags op RX_ENC_FLAG_40MHZ
    @@
    expression status;
    @@
    -status.flag & RX_FLAG_40MHZ
    +status.enc_flags & RX_ENC_FLAG_40MHZ

    @@
    assignment operator op;
    expression status;
    @@
    -status.flag op RX_FLAG_SHORT_GI
    +status.enc_flags op RX_ENC_FLAG_SHORT_GI
    @@
    expression status;
    @@
    -status.flag & RX_FLAG_SHORT_GI
    +status.enc_flags & RX_ENC_FLAG_SHORT_GI

    @@
    assignment operator op;
    expression status;
    @@
    -status.flag op RX_FLAG_HT_GF
    +status.enc_flags op RX_ENC_FLAG_HT_GF
    @@
    expression status;
    @@
    -status.flag & RX_FLAG_HT_GF
    +status.enc_flags & RX_ENC_FLAG_HT_GF

    @@
    assignment operator op;
    expression status;
    @@
    -status.flag op RX_FLAG_VHT
    +status.enc_flags op RX_ENC_FLAG_VHT
    @@
    expression status;
    @@
    -status.flag & RX_FLAG_VHT
    +status.enc_flags & RX_ENC_FLAG_VHT

    @@
    assignment operator op;
    expression status;
    @@
    -status.flag op RX_FLAG_STBC_MASK
    +status.enc_flags op RX_ENC_FLAG_STBC_MASK
    @@
    expression status;
    @@
    -status.flag & RX_FLAG_STBC_MASK
    +status.enc_flags & RX_ENC_FLAG_STBC_MASK

    @@
    assignment operator op;
    expression status;
    @@
    -status.flag op RX_FLAG_LDPC
    +status.enc_flags op RX_ENC_FLAG_LDPC
    @@
    expression status;
    @@
    -status.flag & RX_FLAG_LDPC
    +status.enc_flags & RX_ENC_FLAG_LDPC

    @@
    assignment operator op;
    expression status;
    @@
    -status.flag op RX_FLAG_10MHZ
    +status.enc_flags op RX_ENC_FLAG_10MHZ
    @@
    expression status;
    @@
    -status.flag & RX_FLAG_10MHZ
    +status.enc_flags & RX_ENC_FLAG_10MHZ

    @@
    assignment operator op;
    expression status;
    @@
    -status.flag op RX_FLAG_5MHZ
    +status.enc_flags op RX_ENC_FLAG_5MHZ
    @@
    expression status;
    @@
    -status.flag & RX_FLAG_5MHZ
    +status.enc_flags & RX_ENC_FLAG_5MHZ

    @@
    assignment operator op;
    expression status;
    @@
    -status.vht_flag op RX_VHT_FLAG_80MHZ
    +status.enc_flags op RX_ENC_FLAG_80MHZ
    @@
    expression status;
    @@
    -status.vht_flag & RX_VHT_FLAG_80MHZ
    +status.enc_flags & RX_ENC_FLAG_80MHZ

    @@
    assignment operator op;
    expression status;
    @@
    -status.vht_flag op RX_VHT_FLAG_160MHZ
    +status.enc_flags op RX_ENC_FLAG_160MHZ
    @@
    expression status;
    @@
    -status.vht_flag & RX_VHT_FLAG_160MHZ
    +status.enc_flags & RX_ENC_FLAG_160MHZ

    @@
    assignment operator op;
    expression status;
    @@
    -status.vht_flag op RX_VHT_FLAG_BF
    +status.enc_flags op RX_ENC_FLAG_BF
    @@
    expression status;
    @@
    -status.vht_flag & RX_VHT_FLAG_BF
    +status.enc_flags & RX_ENC_FLAG_BF

    @@
    assignment operator op;
    expression status, STBC;
    @@
    -status.flag op STBC << RX_FLAG_STBC_SHIFT
    +status.enc_flags op STBC << RX_ENC_FLAG_STBC_SHIFT

    @@
    @@
    -RX_FLAG_STBC_SHIFT
    +RX_ENC_FLAG_STBC_SHIFT

    Signed-off-by: Johannes Berg

    Johannes Berg
     

06 Mar, 2017

2 commits

  • We don't really need three different bits for each, since the
    types are mutually exclusive. Use just two bits for it.

    Signed-off-by: Johannes Berg

    Johannes Berg
     
  • As moving average is not considering fractional part, it will
    get stuck at the same level after certain state. For example,
    with current values, it can get stuck at 96. Fortunately the
    current threshold 95%, but if it were increased to 96 or more
    mesh paths would never be deactivated. Fix failure average
    movement by using EWMA helpers, which does take into account
    fractional parts.

    Signed-off-by: Rajkumar Manoharan
    [johannes: pick a larger EWMA factor for more precision with
    the limited range that we will feed into it, adjust to new API]
    Signed-off-by: Johannes Berg

    Manoharan, Rajkumar
     

02 Mar, 2017

1 commit

  • Declaring the factor is counter-intuitive, and people are prone
    to using small(-ish) values even when that makes no sense.

    Change the DECLARE_EWMA() macro to take the fractional precision,
    in bits, rather than a factor, and update all users.

    While at it, add some more documentation.

    Acked-by: David S. Miller
    Signed-off-by: Johannes Berg

    Johannes Berg
     

27 Feb, 2017

1 commit

  • When RX aggregation starts, transmitter may continue send frames
    with SN smaller than SSN until the AddBA response is received.
    However, the reorder buffer is already initialized at this point,
    which will cause the drop of such frames as duplicates since the
    head SN of the reorder buffer is set to the SSN, which is bigger.

    Cc: stable@vger.kernel.org
    Signed-off-by: Sara Sharon
    Signed-off-by: Johannes Berg

    Sara Sharon
     

19 Oct, 2016

1 commit

  • On drivers setting the SUPPORTS_REORDERING_BUFFER hardware flag,
    we crash when the peer sends an AddBA request while we already
    have a session open on the seame TID; this is because on those
    drivers, the tid_agg_rx is left NULL even though the session is
    valid, and the agg_session_valid bit is set.

    To fix this, store the dialog tokens outside the tid_agg_rx to
    be able to compare them to the received AddBA request.

    Fixes: f89e07d4cf26 ("mac80211: agg-rx: refuse ADDBA Request with timeout update")
    Reported-by: Emmanuel Grumbach
    Signed-off-by: Johannes Berg

    Johannes Berg
     

20 Sep, 2016

1 commit

  • mac80211 currently uses rhashtable with insecure_elasticity set
    to true. The latter is because of duplicate objects. What's
    more, mac80211 walks the rhashtable chains by hand which is broken
    as rhashtable may contain multiple tables due to resizing or
    rehashing.

    This patch fixes it by converting it to the newly added rhltable
    interface which is designed for use with duplicate objects.

    With rhltable a lookup returns a list of objects instead of a
    single one. This is then fed into the existing for_each_sta_info
    macro.

    This patch also deletes the sta_addr_hash function since rhashtable
    defaults to jhash.

    Signed-off-by: Herbert Xu
    Signed-off-by: David S. Miller

    Herbert Xu
     

12 Sep, 2016

1 commit


11 Aug, 2016

1 commit

  • Mesh HWMP module will be able to rely on the HW
    RC algorithm if it exists, for path metric calculations.

    This allows the metric calculation mechanism to calculate
    a correct metric, based on PER and last TX rate both via
    HW RC algorithm if it exists or via parameters collected
    by the SW.

    Signed-off-by: Maxim Altshul
    Signed-off-by: Johannes Berg

    Maxim Altshul
     

31 May, 2016

1 commit

  • The header field is defined as u8[] but also accessed as struct
    ieee80211_hdr. Enforce an alignment of 2 to prevent unnecessary
    unaligned accesses, which can be very harmful for performance on many
    platforms.

    Fixes: e495c24731a2 ("mac80211: extend fast-xmit for more ciphers")
    Cc: stable@vger.kernel.org
    Signed-off-by: Felix Fietkau
    Signed-off-by: Johannes Berg

    Felix Fietkau
     

10 Apr, 2016

1 commit


06 Apr, 2016

6 commits

  • If the driver advertises the new HW flag USE_RSS, make the
    station statistics on the fast-rx path per-CPU. This will
    enable calling the RX in parallel, only hitting locking or
    shared cachelines when the fast-RX path isn't available.

    Signed-off-by: Johannes Berg

    Johannes Berg
     
  • The regular RX path has a lot of code, but with a few
    assumptions on the hardware it's possible to reduce the
    amount of code significantly. Currently the assumptions
    on the driver are the following:
    * hardware/driver reordering buffer (if supporting aggregation)
    * hardware/driver decryption & PN checking (if using encryption)
    * hardware/driver did de-duplication
    * hardware/driver did A-MSDU deaggregation
    * AP_LINK_PS is used (in AP mode)
    * no client powersave handling in mac80211 (in client mode)

    of which some are actually checked per packet:
    * de-duplication
    * PN checking
    * decryption
    and additionally packets must
    * not be A-MSDU (have been deaggregated by driver/device)
    * be data packets
    * not be fragmented
    * be unicast
    * have RFC 1042 header

    Additionally dynamically we assume:
    * no encryption or CCMP/GCMP, TKIP/WEP/other not allowed
    * station must be authorized
    * 4-addr format not enabled

    Some data needed for the RX path is cached in a new per-station
    "fast_rx" structure, so that we only need to look at this and
    the packet, no other memory when processing packets on the fast
    RX path.

    After doing the above per-packet checks, the data path collapses
    down to a pretty simple conversion function taking advantage of
    the data cached in the small fast_rx struct.

    This should speed up the RX processing, and will make it easier
    to reason about parallelizing RX (for which statistics will need
    to be per-CPU still.)

    Signed-off-by: Johannes Berg

    Johannes Berg
     
  • On 32-bit platforms, the 64-bit counters we keep need to be protected
    to be consistently read. Use the u64_stats_sync mechanism to do that.

    In order to not end up with overly long lines, refactor the tidstats
    assignments a bit.

    Signed-off-by: Johannes Berg

    Johannes Berg
     
  • When storing the last_rate_* values in the RX code, there's nothing
    to guarantee consistency, so a concurrent reader could see, e.g.
    last_rate_idx on the new value, but last_rate_flag still on the old,
    getting completely bogus values in the end.

    To fix this, I lifted the sta_stats_encode_rate() function from my
    old rate statistics code, which encodes the entire rate data into a
    single 16-bit value, avoiding the consistency issue.

    Signed-off-by: Johannes Berg

    Johannes Berg
     
  • Instead of touching the rx_stats.last_rx from the status path, introduce
    and use a status_stats.last_ack variable. This will make rx_stats.last_rx
    indicate when the last frame was received, making it available for real
    "last_rx" and statistics gathering; statistics, when done per-CPU, will
    need to figure out which place was updated last for those items where the
    "last" value is exposed.

    Signed-off-by: Johannes Berg

    Johannes Berg
     
  • Move the averaged values out of rx_stats and into rx_stats_avg,
    to cleanly split them out. The averaged ones cannot be supported
    for parallel RX in a per-CPU fashion, while the other values can
    be collected per CPU and then combined/selected when needed.

    Signed-off-by: Johannes Berg

    Johannes Berg
     

05 Apr, 2016

4 commits


24 Feb, 2016

2 commits

  • If any frames are dropped that are part of a BA session, the reorder
    buffer will "indefinitely" (until the timeout) wait for them to come
    in (or a BAR moving the window) and won't release frames after them.
    This means it isn't possible to filter frames within a BA session in
    firmware.

    Introduce an API function that allows such filtering. Calling this
    function will move the BA window forward to the new SSN, and allows
    marking frames after the SSN as having been filtered, so any future
    reordering activity will release frames while skipping the holes.

    Signed-off-by: Sara Sharon
    Signed-off-by: Emmanuel Grumbach
    Signed-off-by: Johannes Berg

    Sara Sharon
     
  • Enable driver to manage the reordering logic itself.
    This is needed for example for the iwlwifi driver that
    will support hardware assisted reordering.

    Signed-off-by: Sara Sharon
    Signed-off-by: Emmanuel Grumbach
    Signed-off-by: Johannes Berg

    Sara Sharon
     

04 Dec, 2015

1 commit

  • add ieee80211_iter_keys_rcu() to iterate over uploaded
    keys in atomic context (when rcu is locked)

    The station removal code removes the keys only after
    calling synchronize_net(), so it's not safe to iterate
    the keys at this point (and postponing the actual key
    deletion with call_rcu() might result in some
    badly-ordered ops calls).

    Add a flag to indicate a station is being removed,
    and skip the configured keys if it's set.

    Signed-off-by: Eliad Peller
    Signed-off-by: Emmanuel Grumbach
    Signed-off-by: Johannes Berg

    Eliad Peller
     

21 Oct, 2015

3 commits

  • Group station statistics by where they're (mostly) updated
    (TX, RX and TX-status) and group them into sub-structs of
    the struct sta_info.

    Also rename the variables since the grouping now makes it
    obvious where they belong.

    This makes it easier to identify where the statistics are
    updated in the code, and thus easier to think about them.

    Signed-off-by: Johannes Berg

    Johannes Berg
     
  • There's little point in keeping (and even sending to userspace)
    the beacon_loss_count value per station, since it can only apply
    to the AP on a managed-mode connection. Move the value to ifmgd,
    advertise it only in managed mode, and remove it from ethtool as
    it's available through better interfaces.

    Signed-off-by: Johannes Berg

    Johannes Berg
     
  • This file only feeds a debugfs file that isn't very useful, so remove
    it. If necessary, we can add other ways to get this information, for
    example in the NL80211_CMD_PROBE_CLIENT response.

    Signed-off-by: Johannes Berg

    Johannes Berg
     

15 Oct, 2015

1 commit


22 Sep, 2015

1 commit


14 Aug, 2015

1 commit

  • Instead of using the out-of-line average calculation, use the new
    DECLARE_EWMA() macro to declare a signal EWMA, and use that.

    This actually *reduces* the code size slightly (on x86-64) while
    also reducing the station info size by 80 bytes.

    Signed-off-by: Johannes Berg

    Johannes Berg
     

17 Jul, 2015

7 commits

  • According to 802.11-2012 13.3.1, a mesh STA should assign an AID
    upon receipt of a mesh peering open frame rather than using the link
    id of the peer. Using the peer link id has two potential issues:
    it may not be unique among the peers, and by its nature it is random,
    so the TIM may not compress well.

    In preparation for allocating it properly, use sta->sta.aid, but keep
    the existing behavior of using the plid in the aid we send.

    Signed-off-by: Bob Copeland
    Signed-off-by: Johannes Berg

    Bob Copeland
     
  • This value is only used in mesh, so move it into the new mesh
    sub-struct of the station info.

    Signed-off-by: Johannes Berg

    Johannes Berg
     
  • Define a station chandef, to be used for wider-bw TDLS peers. When both
    peers support the feature, upgrade the channel bandwidth to the maximum
    allowed by both peers and regulatory. Currently widths up to 80MHz are
    supported in the 5GHz band.

    When a TDLS peer connects/disconnects recalculate the channel type of the
    current chanctx.
    Make the chanctx width calculation consider wider-bw TDLS peers and
    similarly fix the max_required_bw calculation for the chanctx min_def.
    Since the sta->bandwidth is calculated only later on, take
    bss_conf.chandef.width as the minimal width for station interface.

    Set the upgraded channel width in the VHT-operation set during TDLS setup.

    Signed-off-by: Arik Nemtsov
    Signed-off-by: Emmanuel Grumbach
    Signed-off-by: Johannes Berg

    Arik Nemtsov
     
  • Allow a device to specify support for the TDLS wider-bandwidth feature.
    Indicate this support during TDLS setup in the ext-capab IE and set an
    appropriate station flag when our TDLS peer supports it.
    This feature gives TDLS peers the ability to use a wider channel than
    the base width of the BSS. For instance VHT capable TDLS peers connected
    on a 20MHz channel can extend the channel to 80MHz, if regulatory
    considerations allow it.

    Do not cap the bandwidth of such stations by the current BSS channel width
    in mac80211.

    Signed-off-by: Arik Nemtsov
    Signed-off-by: Emmanuel Grumbach
    Signed-off-by: Johannes Berg

    Arik Nemtsov
     
  • There are now a fairly large number of mesh fields that really
    aren't needed in any other modes; move those into their own
    structure and allocate them separately.

    Signed-off-by: Johannes Berg

    Johannes Berg
     
  • Currently, the station hash table lookup (or iteration) must
    access two cachelines for each station - the one with the hash
    table node, and the one with the MAC address.

    Duplicate the MAC address next to the hash node to get rid of
    this. Since the MAC address is static there's no consistency
    problem introduced by this.

    Signed-off-by: Johannes Berg

    Johannes Berg
     
  • There are no RX queues in mac80211 (yet), the comment should refer
    to the TID (including one slot for non-QoS) rather than 'RX queue'.

    Signed-off-by: Johannes Berg

    Johannes Berg