05 Feb, 2013

1 commit

  • Add routines to
    - maintain a PS mode for each peer and a non-peer PS mode
    - indicate own PS mode in transmitted frames
    - track neighbor STAs power modes
    - buffer frames when neighbors are in PS mode
    - add TIM and Awake Window IE to beacons
    - release frames in Mesh Peer Service Periods

    Add local_pm to sta_info to represent the link-specific power
    mode at this station towards the remote station. When a peer
    link is established, use the default power mode stored in mesh
    config. Update the PS status if the peering status of a neighbor
    changes.
    Maintain a mesh power mode for non-peer mesh STAs. Set the
    non-peer power mode to active mode during peering. Authenticated
    mesh peering is currently not working when either node is
    configured to be in power save mode.

    Indicate the current power mode in transmitted frames. Use QoS
    Nulls to indicate mesh power mode transitions.
    For performance reasons, calls to the function setting the frame
    flags are placed in HWMP routing routines, as there the STA
    pointer is already available.

    Add peer_pm to sta_info to represent the peer's link-specific
    power mode towards the local station. Add nonpeer_pm to
    represent the peer's power mode towards all non-peer stations.
    Track power modes based on received frames.

    Add the ps_data structure to ieee80211_if_mesh (for TIM map, PS
    neighbor counter and group-addressed frame buffer).

    Set WLAN_STA_PS flag for STA in PS mode to use the unicast frame
    buffering routines in the tx path. Update num_sta_ps to buffer
    and release group-addressed frames after DTIM beacons.

    Announce the awake window duration in beacons if in light or
    deep sleep mode towards any peer or non-peer. Create a TIM IE
    similarly to AP mode and add it to mesh beacons. Parse received
    Awake Window IEs and check TIM IEs for buffered frames.

    Release frames towards peers in mesh Peer Service Periods. Use
    the corresponding trigger frames and monitor the MPSP status.
    Append a QoS Null as trigger frame if neccessary to properly end
    the MPSP. Currently, in HT channels MPSPs behave imperfectly and
    show large delay spikes and frame losses.

    Signed-off-by: Marco Porsch
    Signed-off-by: Ivan Bezyazychnyy
    Signed-off-by: Mike Krinkin
    Signed-off-by: Max Filippov
    Signed-off-by: Johannes Berg

    Marco Porsch
     

26 Nov, 2012

1 commit


20 Jun, 2012

1 commit

  • Save and configure the wmm_acm per sdata, rather than
    per hardware.

    If wmm_acm is saved per hardware when running two
    interfaces simultaneously on the same hardware one
    interface's wmm policy will be affected by the other
    interface.

    Signed-off-by: Yoni Divinsky
    Signed-off-by: Luciano Coelho
    Signed-off-by: Johannes Berg

    Yoni Divinsky
     

11 Apr, 2012

3 commits


29 Nov, 2011

3 commits

  • We can't rely on ieee80211_select_queue() to do its job at this point
    since the skb->protocol is not yet known. Instead, factor out and reuse
    the queue mapping logic for injected frames.

    Also, to mitigate congestion, forwarded frames should be dropped if the
    outgoing queue was stopped. This was not correctly implemented as we
    were not checking the right queue. Furthermore, we were dropping frames
    that had arrived to their destination if that queue was stopped.

    Signed-off-by: Thomas Pedersen
    Signed-off-by: Javier Cardona
    Signed-off-by: John W. Linville

    Thomas Pedersen
     
  • This patch contains the processing changes in mac80211.

    Signed-off-by: Simon Wunderlich
    Signed-off-by: Mathias Kretschmer
    Signed-off-by: John W. Linville

    Simon Wunderlich
     
  • This feature has been superseded by the NoAck per Queue feature.

    Signed-off-by: Simon Wunderlich
    Signed-off-by: Mathias Kretschmer
    Signed-off-by: John W. Linville

    Simon Wunderlich
     

10 Nov, 2011

3 commits

  • We only need to set the skb queue twice:

    1. by the netdev, on local TX.
    2. when forwarding a mesh frame.

    We only need to set the qos header twice:

    1. by mac80211, on local TX.
    2. when putting a frame on the mpath->frame_queue

    We also don't need the RA in order to set the proper queue mapping since
    all mesh STAs are QoS, indicate this and do it once when the frame is
    received. Also fixes an issue where the QoS header and queue mapping was not
    set for unicast forwarded frames.

    Signed-off-by: Javier Cardona
    Signed-off-by: Thomas Pedersen
    Signed-off-by: John W. Linville

    Javier Cardona
     
  • Previously QoS multicast frames had the Normal Acknowledgment QoS
    control bits set. This would cause broadcast frames to be discarded by
    peers with which we have a BA session, since their sequence number would
    fall outside the allowed range. Set No Ack QoS control bits on multicast
    QoS frames and filter these in de-aggregation code.

    Signed-off-by: Thomas Pedersen

    v2: Use proper QoS Ack Policy ctl field mask (Christian)

    v3: Clean up conditional (Johannes)
    Signed-off-by: John W. Linville

    Thomas Pedersen
     
  • Janusz reported that the EOSP bit in mac80211 was
    getting cleared all the time. I had not found this
    since I tested uAPSD with a device that always set
    the bit itself. Preserve the bit when building the
    QoS header.

    Reported-by: Janusz Dziedzic
    Tested-by: Janusz Dziedzic
    Signed-off-by: Johannes Berg
    Signed-off-by: John W. Linville

    Johannes Berg
     

01 Oct, 2011

1 commit

  • The flaglock in struct sta_info has long been
    something that I wanted to get rid of, this
    finally does the conversion to atomic bitops.

    The conversion itself is straight-forward in
    most places, a few things needed to change a
    bit since we can no longer use multiple bits
    at the same time.

    On x86-64, this is a fairly significant code
    size reduction:
    text data bss dec hex
    427861 23648 1008 452517 6e7a5 before
    425383 23648 976 450007 6ddd7 after

    Signed-off-by: Johannes Berg
    Signed-off-by: John W. Linville

    Johannes Berg
     

15 Sep, 2011

2 commits


28 Jun, 2011

1 commit


23 Dec, 2010

1 commit

  • There's a redundant rcu_read_lock/unlock pair, a
    redundant variable, and a few redundant accesses
    to the 1d_to_ac array. Fix this to make the code
    neater and easier to follow.

    Signed-off-by: Johannes Berg
    Signed-off-by: John W. Linville

    Johannes Berg
     

18 Nov, 2010

1 commit

  • In many places we've just hardcoded the
    AC numbers -- which is a relic from the
    original mac80211 (d80211). Add constants
    for them so we know what we're talking
    about.

    Signed-off-by: Johannes Berg
    Signed-off-by: John W. Linville

    Johannes Berg
     

06 Jan, 2010

1 commit

  • Since I removed the master netdev, we've been
    keeping internal queues only, and even before
    that we never told the networking stack above
    the virtual interfaces about congestion. This
    means that packets are queued in mac80211 and
    the upper layers never know, possibly leading
    to memory exhaustion and other problems.

    This patch makes all interfaces multiqueue and
    uses ndo_select_queue to put the packets into
    queues per AC. Additionally, when the driver
    stops a queue, we now stop all corresponding
    queues for the virtual interfaces as well.

    The injection case will use VO by default for
    non-data frames, and BE for data frames, but
    downgrade any data frames according to ACM. It
    needs to be fleshed out in the future to allow
    chosing the queue/AC in radiotap.

    Reported-by: Lennert Buytenhek
    Signed-off-by: Johannes Berg
    Cc: stable@kernel.org [2.6.32]
    Signed-off-by: John W. Linville

    Johannes Berg
     

25 Jul, 2009

1 commit

  • With the internal 'pending' queue system in place, we can simply
    put packets there instead of pushing them off to the master dev,
    getting rid of the master interface completely.

    Signed-off-by: Johannes Berg
    Signed-off-by: John W. Linville

    Johannes Berg
     

11 Jun, 2009

1 commit

  • In order to handle powersave frames properly we had needed
    to pass these out to the device queues again, and introduce
    the skb->requeue bit. This, however, also has unnecessary
    overhead by needing to 'clean up' already tried frames, and
    this clean-up code is also buggy when software encryption
    is used.

    Instead of sending the frames via the master netdev queue
    again, simply put them into the pending queue. This also
    fixes a problem where frames for that particular station
    could be reordered when some were still on the software
    queues and older ones are re-injected into the software
    queue after them.

    Signed-off-by: Johannes Berg
    Signed-off-by: John W. Linville

    Johannes Berg
     

23 May, 2009

1 commit

  • The patch moves some utility functions from mac80211 to cfg80211.
    Because these functions are doing generic 802.11 operations so they
    are not mac80211 specific. The moving allows some fullmac drivers
    to be also benefit from these utility functions.

    Signed-off-by: Zhu Yi
    Signed-off-by: Samuel Ortiz
    Signed-off-by: John W. Linville

    Zhu Yi
     

14 May, 2009

1 commit

  • There's this internal wifi_wme_noack_test variable that
    we use to set the QoS control if set. For one, it is
    unlikely that it is set. Secondly, if set it needs to
    influence the IEEE80211_TX_CTL_NO_ACK TX control flag,
    and finally we should also be able to set it at all, so
    make it available in debugfs.

    Signed-off-by: Johannes Berg
    Signed-off-by: John W. Linville

    Johannes Berg
     

17 Mar, 2009

1 commit

  • Incorrect local->wmm_acm bits were set for AC_BK and AC_BE. Fix this
    and add some comments to make it easier to understand the AC-to-UP(pair)
    mapping. Set the wmm_acm bits (and show WMM debug) even if the driver
    does not implement conf_tx() handler.

    In addition, fix the ACM-based AC downgrade code to not use the
    highest priority in error cases. We need to break the loop to get the
    correct AC_BK value (3) instead of returning 0 (which would indicate
    AC_VO). The comment here was not really very useful either, so let's
    provide somewhat more helpful description of the situation.

    Since it is very unlikely that the ACM flag would be set for AC_BK and
    AC_BE, these bugs are not likely to be seen in real life networks.
    Anyway, better do these things correctly should someone really use
    silly AP configuration (and to pass some functionality tests, too).

    Remove the TODO comment about handling ACM. Downgrading AC is
    perfectly valid mechanism for ACM. Eventually, we may add support for
    WMM-AC and send a request for a TS, but anyway, that functionality
    won't be here at the location of this TODO comment.

    Signed-off-by: Jouni Malinen
    Signed-off-by: John W. Linville

    Jouni Malinen
     

28 Feb, 2009

1 commit

  • Hardware with AMPDU queues currently has broken aggregation.

    This patch fixes it by making all A-MPDUs go over the regular AC queues,
    but keeping track of the hardware queues in mac80211. As a first rough
    version, it actually stops the AC queue for extended periods of time,
    which can be removed by adding buffering internal to mac80211, but is
    currently not a huge problem because people rarely use multiple TIDs
    that are in the same AC (and iwlwifi currently doesn't operate as AP).

    This is a short-term fix, my current medium-term plan, which I hope to
    execute soon as well, but am not sure can finish before .30, looks like
    this:
    1) rework the internal queuing layer in mac80211 that we use for
    fragments if the driver stopped queue in the middle of a fragmented
    frame to be able to queue more frames at once (rather than just a
    single frame with its fragments)
    2) instead of stopping the entire AC queue, queue up the frames in a
    per-station/per-TID queue during aggregation session initiation,
    when the session has come up take all those frames and put them
    onto the queue from 1)
    3) push the ampdu queue layer abstraction this patch introduces in
    mac80211 into the driver, and remove the virtual queue stuff from
    mac80211 again

    This plan will probably also affect ath9k in that mac80211 queues the
    frames instead of passing them down, even when there are no ampdu queues.

    Signed-off-by: Johannes Berg
    Signed-off-by: John W. Linville

    Johannes Berg
     

01 Nov, 2008

1 commit

  • Wireless HW without any dedicated queues for aggregation
    do not need the ampdu_queues mechanism present right now
    in mac80211. Since mac80211 is still incomplete wrt TX MQ
    changes, do not allow aggregation sessions for drivers that
    set ampdu_queues.

    This is only an interim hack until Intel fixes the requeue issue.

    Signed-off-by: Sujith
    Signed-off-by: Luis Rodriguez
    Signed-off-by: John W. Linville

    Sujith
     

28 Oct, 2008

1 commit


01 Oct, 2008

1 commit


21 Sep, 2008

1 commit


16 Sep, 2008

1 commit

  • This patch changes mac80211 to share some more data about
    stations with drivers. Should help iwlwifi and ath9k when
    they get around to updating, and might also help with
    implementing rate control algorithms without internals.

    Signed-off-by: Johannes Berg
    Cc: Sujith Manoharan
    Signed-off-by: John W. Linville

    Johannes Berg
     

30 Aug, 2008

1 commit


03 Aug, 2008

1 commit


30 Jul, 2008

1 commit

  • This patch fixes mac80211 to not use the skb->cb over the queue step
    from virtual interfaces to the master. The patch also, for now,
    disables aggregation because that would still require requeuing,
    will fix that in a separate patch. There are two other places (software
    requeue and powersaving stations) where requeue can happen, but that is
    not currently used by any drivers/not possible to use respectively.

    Signed-off-by: Johannes Berg
    Signed-off-by: John W. Linville

    Johannes Berg
     

20 Jul, 2008

1 commit


18 Jul, 2008

3 commits

  • We can simply use the qdisc->q.lock for all of the
    qdisc tree synchronization.

    Signed-off-by: David S. Miller

    David S. Miller
     
  • The only behavior change is that we do not drop packets under any
    circumstances. If that is absolutely needed, we could easily add it
    back.

    With cleanups and help from Johannes Berg.

    Signed-off-by: David S. Miller

    David S. Miller
     
  • alloc_netdev_mq() now allocates an array of netdev_queue
    structures for TX, based upon the queue_count argument.

    Furthermore, all accesses to the TX queues are now vectored
    through the netdev_get_tx_queue() and netdev_for_each_tx_queue()
    interfaces. This makes it easy to grep the tree for all
    things that want to get to a TX queue of a net device.

    Problem spots which are not really multiqueue aware yet, and
    only work with one queue, can easily be spotted by grepping
    for all netdev_get_tx_queue() calls that pass in a zero index.

    Signed-off-by: David S. Miller

    David S. Miller
     

09 Jul, 2008

3 commits