13 Jan, 2012

1 commit

  • commit a9b3cd7f32 (rcu: convert uses of rcu_assign_pointer(x, NULL) to
    RCU_INIT_POINTER) did a lot of incorrect changes, since it did a
    complete conversion of rcu_assign_pointer(x, y) to RCU_INIT_POINTER(x,
    y).

    We miss needed barriers, even on x86, when y is not NULL.

    Signed-off-by: Eric Dumazet
    CC: Stephen Hemminger
    CC: Paul E. McKenney
    Signed-off-by: David S. Miller

    Eric Dumazet
     

05 Jan, 2012

1 commit

  • kernel panic occurs when we create an IBSS mode and leave it for
    sometime without any joiner and this is introduced by the
    commit ec2b774e7c91094d8c00de579646f1162b87b01e where we don't
    put proper braces for 'list_for_each_entry_safe' and we pass an
    invalid 'sta' pointer to __sta_info_destroy

    EIP is at __list_add+0xe/0xa0
    EAX: f3b63db4 EBX: 00000000 ECX: eab88c1c EDX: 00000000
    ESI: 00000000 EDI: 00000246 EBP: f3b63d80 ESP: f3b63d58
    DS: 007b ES: 007b FS: 00d8 GS: 00e0 SS: 0068
    Process kworker/u:2 (pid: 198, ti=f3b62000 task=f3afbea0
    task.ti=f3b62000)
    Stack:
    00000000 00000000 f9ef9821 00000000 00000000 eab88c30
    f3b63d80 c017f623
    eab88bf0 eab88bf0 f3b63dd0 c066f925 00000000 00000002
    00000000 f9ef9821
    f3b63da0 c0180a2b eab88c1c eab88c30 00000002 f3afbea0
    eab88bf4 f3b63db4
    Call Trace:
    [] ? __ieee80211_stop_tx_ba_session+0x31/0x60
    [mac80211]
    [] ? debug_mutex_add_waiter+0x23/0x60
    [] __mutex_lock_common+0xd5/0x390
    [] ? __ieee80211_stop_tx_ba_session+0x31/0x60
    [mac80211]
    [] ? trace_hardirqs_off+0xb/0x10
    [] mutex_lock_nested+0x47/0x60
    [] ? __ieee80211_stop_tx_ba_session+0x31/0x60
    [mac80211]
    [] __ieee80211_stop_tx_ba_session+0x31/0x60
    [mac80211]
    [] ieee80211_sta_tear_down_BA_sessions+0x39/0x60 [mac80211]
    [] __sta_info_destroy+0x57/0x780 [mac80211]
    [] ieee80211_sta_expire+0x93/0xb0 [mac80211]
    [] ieee80211_ibss_work+0x2d6/0x530 [mac80211]

    Cc: Marek Lindner
    Signed-off-by: Mohammed Shafi Shajakhan
    Signed-off-by: John W. Linville

    Mohammed Shafi Shajakhan
     

22 Dec, 2011

1 commit


20 Dec, 2011

1 commit

  • The commit 42624d4913a00219a8fdbb4bafd634d1d843be85
    created following sparse warning
    >net/mac80211/sta_info.c:965:24: warning: incorrect type in assignment (different address spaces)
    >net/mac80211/sta_info.c:965:24: expected struct tid_ampdu_tx *tid_tx
    >net/mac80211/sta_info.c:965:24: got struct tid_ampdu_tx [noderef] *

    Making use of rcu_dereference_protected to fix the problem.

    V2:
    - Replacing rcu_dereference with rcu_dereference_protected
    as suggested by Johannes.
    - Adding mutex_lock/unlock to satisfy the condition at
    rcu_dereference_protected

    Cc: Nishant Sarmukadam
    Reported-by: Johannes Berg
    Signed-off-by: Yogesh Ashok Powar
    Signed-off-by: John W. Linville

    Yogesh Ashok Powar
     

16 Dec, 2011

5 commits

  • Now that IBSS no longer needs to insert stations
    from atomic context, we can get rid of all the
    special cases for that, and even get rid of the
    sta_lock (though it needs to stay as tim_lock.)

    This makes the station management code much more
    straight-forward.

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

    Johannes Berg
     
  • In order to notify drivers and simplify the station
    management code, defer IBSS station insertion to a
    work item and don't do it directly while receiving
    a frame.

    This increases the complexity in IBSS a little bit,
    but it's pretty straight forward and it allows us
    to reduce the station management complexity (next
    patch) considerably.

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

    Johannes Berg
     
  • No real changes, just note that they are const.

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

    Johannes Berg
     
  • Currently, each AP interface will send multicast
    traffic if any interface has a station entry even
    if that station entry is allocated only. With the
    new station state management we can easily fix it
    by adding a counter that counts each authorized
    station only and send multicast traffic only when
    the correct interface has at least one authorized
    station.

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

    Johannes Berg
     
  • Station entries can have various states, the most
    important ones being auth, assoc and authorized.
    This patch prepares us for telling the driver about
    these states, we don't want to confuse drivers with
    strange transitions, so with this we enforce that
    they move in the right order between them (back and
    forth); some transitions might happen before the
    driver even knows about the station, but at least
    runtime transitions will be ordered correctly.

    As a consequence, IBSS and MESH stations will now
    have the ASSOC flag set (so they can transition to
    AUTHORIZED), and we can get rid of a special case
    in TX processing.

    When freeing a station, unwind the state so that
    other parts of the code (or drivers later) can rely
    on the transitions.

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

    Johannes Berg
     

14 Dec, 2011

1 commit

  • When a station leaves suddenly while ampdu traffic to that station is still
    running, there is a possibility that the ampdu pending queues are not freed due
    to a race condition leading to memory leaks. In '__sta_info_destroy' when we
    attempt to destroy the ampdu sessions in 'ieee80211_sta_tear_down_BA_sessions',
    the driver calls 'ieee80211_stop_tx_ba_cb_irqsafe' to delete the ampdu
    structures (tid_tx) and splice the pending queues and this job gets queued in
    sdata workqueue. However, the sta entry can get destroyed before the above work
    gets scheduled and hence the race.

    Purging the queues and freeing the tid_tx to avoid the leak. The better solution
    would be to fix the race, but that can be taken up in a separate patch.

    Signed-off-by: Nishant Sarmukadam
    Signed-off-by: Yogesh Ashok Powar
    Signed-off-by: John W. Linville

    Yogesh Ashok Powar
     

29 Nov, 2011

1 commit

  • This fixes frequent WARN_ONs when using AP VLAN + aggregation, as these vifs
    are virtual and not registered with drivers.
    Use sta_info_get_bss instead of sta_info_get in aggregation callbacks, so
    that these callbacks can find the station entry when called with the AP vif.

    Signed-off-by: Felix Fietkau
    Signed-off-by: John W. Linville

    Felix Fietkau
     

08 Nov, 2011

1 commit


18 Oct, 2011

1 commit


15 Oct, 2011

1 commit


12 Oct, 2011

1 commit


01 Oct, 2011

11 commits

  • iwlwifi has a separate EOSP notification from
    the device, and to make use of that properly
    it needs to be passed to mac80211. To be able
    to mix with tx_status_irqsafe and rx_irqsafe
    it also needs to be an "_irqsafe" version in
    the sense that it goes through the tasklet,
    the actual flag clearing would be IRQ-safe
    but doing it directly would cause reordering
    issues.

    This is needed in the case of a P2P GO going
    into an absence period without transmitting
    any frames that should be driver-released as
    in this case there's no other way to inform
    mac80211 that the service period ended. Note
    that for drivers that don't use the _irqsafe
    functions another version of this function
    will be required.

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

    Johannes Berg
     
  • iwlwifi needs to know the number of frames that are
    going to be sent to a station while it is asleep so
    it can properly handle the uCode blocking of that
    station.

    Before uAPSD, we got by by telling the device that
    a single frame was going to be released whenever we
    encountered IEEE80211_TX_CTL_POLL_RESPONSE. With
    uAPSD, however, that is no longer possible since
    there could be more than a single frame.

    To support this model, add a new callback to notify
    drivers when frames are going to be released.

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

    Johannes Berg
     
  • 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
     
  • If a PS-poll frame is retried (but was received)
    there is no way to detect that since it has no
    sequence number. As a consequence, the standard
    asks us to not react to PS-poll frames until the
    response to one made it out (was ACKed or lost).

    Implement this by using the WLAN_STA_SP flags to
    also indicate a PS-Poll "service period" and the
    IEEE80211_TX_STATUS_EOSP flag for the response
    packet to indicate the end of the "SP" as usual.

    We could use separate flags, but that will most
    likely completely confuse drivers, and while the
    standard doesn't exclude simultaneously polling
    using uAPSD and PS-Poll, doing that seems quite
    problematic.

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

    Johannes Berg
     
  • For PS-poll, there's a possible race between
    us expiring a frame and the station polling
    for it -- send it a null frame in that case.

    For uAPSD, the standard says that we have to
    send a frame in each SP, so send null if we
    don't have any other frames.

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

    Johannes Berg
     
  • Add uAPSD support to mac80211. This is probably not
    possible with all devices, so advertising it with
    the cfg80211 flag will be left up to drivers that
    want it.

    Due to my previous patches it is now a fairly
    straight-forward extension. Drivers need to have
    accurate TX status reporting for the EOSP frame.
    For drivers that buffer themselves, the provided
    APIs allow releasing the right number of frames,
    but then drivers need to set EOSP and more-data
    themselves. This is documented in more detail in
    the new code itself.

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

    Johannes Berg
     
  • If there are frames for a station buffered in
    the driver, mac80211 announces those in the TIM
    IE but there's no way to release them. Add new
    API to release such frames and use it when the
    station polls for a frame.

    Since the API will soon also be used for uAPSD
    it is easily extensible.

    Note that before this change drivers announcing
    driver-buffered frames in the TIM bit actually
    will respond to a PS-Poll with a potentially
    lower priority frame (if there are any frames
    buffered in mac80211), after this patch a driver
    that hasn't been changed will no longer respond
    at all. This only affects ath9k, which will need
    to be fixed to implement the new API.

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

    Johannes Berg
     
  • For uAPSD support we'll need to have per-AC PS
    buffers. As this is a major undertaking, split
    the buffers before really adding support for
    uAPSD. This already makes some reference to the
    uapsd_queues variable, but for now that will
    never be non-zero.

    Since book-keeping is complicated, also change
    the logic for keeping a maximum of frames only
    and allow 64 frames per AC (up from 128 for a
    station).

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

    Johannes Berg
     
  • mac80211 will expire normal PS-buffered frames, but
    if the device rejected some frames for a sleeping
    station, these won't be on the ps_tx_buf queue but
    on the tx_filtered queue instead; this is done to
    avoid reordering.

    However, mac80211 will not expire frames from the
    filtered queue, let's fix that.

    Also add a more comments to what all this expiry is
    doing and how it works.

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

    Johannes Berg
     
  • Currently, the TIM bit for a given station is set
    and cleared all over the place. Since the logic to
    set/clear it will become much more complex when we
    add uAPSD support, as a first step let's collect
    the entire logic in one place. This requires a few
    small adjustments to other places.

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

    Johannes Berg
     
  • For uAPSD implementation, it is necessary to know on
    which ACs frames are buffered. mac80211 obviously
    knows about the frames it has buffered itself, but
    with aggregation many drivers buffer frames. Thus,
    mac80211 needs to be informed about this.

    For now, since we don't have APSD in any form, this
    will unconditionally set the TIM bit for the station
    but later with uAPSD only some ACs might cause the
    TIM bit to be set.

    ath9k is the only driver using this API and I only
    modify it in the most basic way, it won't be able
    to implement uAPSD with this yet. But it can't do
    that anyway since there's no way to selectively
    release frames to the peer yet.

    Since drivers will buffer frames per TID, let them
    inform mac80211 on a per TID basis, mac80211 will
    then sort out the AC mapping itself.

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

    Johannes Berg
     

22 Sep, 2011

1 commit

  • Conflicts:
    MAINTAINERS
    drivers/net/Kconfig
    drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c
    drivers/net/ethernet/broadcom/tg3.c
    drivers/net/wireless/iwlwifi/iwl-pci.c
    drivers/net/wireless/iwlwifi/iwl-trans-tx-pcie.c
    drivers/net/wireless/rt2x00/rt2800usb.c
    drivers/net/wireless/wl12xx/main.c

    David S. Miller
     

21 Sep, 2011

1 commit


20 Sep, 2011

1 commit


15 Sep, 2011

1 commit

  • Juuso optimised the timer to not run all the
    time in commit 3393a608c4979a94d1887efc05b7.
    However, after that it will still run once
    more even if all frames just expired. Fixing
    that also makes the function return value a
    little clearer in the process.

    Also, while at it, change the return value
    to bool (instead of int).

    Cc: Juuso Oikarinen
    Signed-off-by: Johannes Berg
    Signed-off-by: John W. Linville

    Johannes Berg
     

14 Sep, 2011

1 commit

  • Since my commit 34e895075e21be3e21e71d6317440d1ee7969ad0
    ("mac80211: allow station add/remove to sleep") there is
    a race in mac80211 when it clears the TIM bit because a
    sleeping station disconnected, the spinlock isn't held
    around the relevant code any more. Use the right API to
    acquire the spinlock correctly.

    Cc: stable@kernel.org [2.6.34+]
    Signed-off-by: Johannes Berg
    Signed-off-by: John W. Linville

    Johannes Berg
     

30 Aug, 2011

1 commit


26 Aug, 2011

2 commits

  • When associating to an AP, the station might miss the first EAP
    packet that the AP sends due to a race condition between the association
    success procedure and the rx flow in mac80211.
    In such cases, the packet might fall in ieee80211_rx_h_check due to
    the fact that the relevant rx->sta wasn't allocated yet.
    Allocation of the relevant station info struct before actually
    sending the association request and setting it with a new
    dummy_sta flag solve this problem.
    The station will accept only EAP packets from the AP while it
    is in the pre-association/dummy state.
    This dummy station entry is not seen by normal sta_info_get()
    calls, only by sta_info_get_bss_rx().
    The driver is not notified for the first insertion of the
    dummy station. The driver is notified only after the association
    is complete and the dummy flag is removed from the station entry.
    That way, all the rest of the code flow should be untouched by
    this change.

    Signed-off-by: Guy Eilam
    Signed-off-by: John W. Linville

    Guy Eilam
     
  • Divided the sta_info_insert_rcu function to 3 mini-functions:
    sta_info_insert_check - the initial checks done when inserting
    a new station
    sta_info_insert_ibss - the function that handles the station
    addition for IBSS interfaces
    sta_info_insert_non_ibss - the function that handles the station
    addition in other cases

    The outer API was not changed.
    The refactoring was done for better usage of the different
    stages in the station addition in new scenarios added
    in the next commit.

    Signed-off-by: Guy Eilam
    Signed-off-by: John W. Linville

    Guy Eilam
     

23 Aug, 2011

1 commit


12 Aug, 2011

1 commit


02 Aug, 2011

1 commit

  • When assigning a NULL value to an RCU protected pointer, no barrier
    is needed. The rcu_assign_pointer, used to handle that but will soon
    change to not handle the special case.

    Convert all rcu_assign_pointer of NULL value.

    //smpl
    @@ expression P; @@

    - rcu_assign_pointer(P, NULL)
    + RCU_INIT_POINTER(P, NULL)

    //

    Signed-off-by: Stephen Hemminger
    Acked-by: Paul E. McKenney
    Signed-off-by: David S. Miller

    Stephen Hemminger
     

09 Jul, 2011

1 commit


17 May, 2011

2 commits