1. 06 2月, 2014 1 次提交
    • J
      cfg80211: send scan results from work queue · f9d15d16
      Johannes Berg 提交于
      Due to the previous commit, when a scan finishes, it is in theory
      possible to hit the following sequence:
       1. interface starts being removed
       2. scan is cancelled by driver and cfg80211 is notified
       3. scan done work is scheduled
       4. interface is removed completely, rdev->scan_req is freed,
          event sent to userspace but scan done work remains pending
       5. new scan is requested on another virtual interface
       6. scan done work runs, freeing the still-running scan
      
      To fix this situation, hang on to the scan done message and block
      new scans while that is the case, and only send the message from
      the work function, regardless of whether the scan_req is already
      freed from interface removal. This makes step 5 above impossible
      and changes step 6 to be
       5. scan done work runs, sending the scan done message
      
      As this can't work for wext, so we send the message immediately,
      but this shouldn't be an issue since we still return -EBUSY.
      Signed-off-by: NJohannes Berg <johannes.berg@intel.com>
      f9d15d16
  2. 09 1月, 2014 1 次提交
  3. 06 12月, 2013 1 次提交
    • E
      cfg80211: don't "leak" uncompleted scans · 4a58e7c3
      Eliad Peller 提交于
      ___cfg80211_scan_done() can be called in some cases
      (e.g. on NETDEV_DOWN) before the low level driver
      notified scan completion (which is indicated by
      passing leak=true).
      
      Clearing rdev->scan_req in this case is buggy, as
      scan_done_wk might have already being queued/running
      (and can't be flushed as it takes rtnl()).
      
      If a new scan will be requested at this stage, the
      scan_done_wk will try freeing it (instead of the
      previous scan), and this will later result in
      a use after free.
      
      Simply remove the "leak" option, and replace it with
      a standard WARN_ON.
      
      An example backtrace after such crash:
      Unable to handle kernel paging request at virtual address fffffee5
      pgd = c0004000
      [fffffee5] *pgd=9fdf6821, *pte=00000000, *ppte=00000000
      Internal error: Oops: 17 [#1] SMP ARM
      PC is at cfg80211_scan_done+0x28/0xc4 [cfg80211]
      LR is at __ieee80211_scan_completed+0xe4/0x2dc [mac80211]
      [<bf0077b0>] (cfg80211_scan_done+0x28/0xc4 [cfg80211])
      [<bf0973d4>] (__ieee80211_scan_completed+0xe4/0x2dc [mac80211])
      [<bf0982cc>] (ieee80211_scan_work+0x94/0x4f0 [mac80211])
      [<c005fd10>] (process_one_work+0x1b0/0x4a8)
      [<c0060404>] (worker_thread+0x138/0x37c)
      [<c0066d70>] (kthread+0xa4/0xb0)
      Signed-off-by: NEliad Peller <eliad@wizery.com>
      Signed-off-by: NJohannes Berg <johannes.berg@intel.com>
      4a58e7c3
  4. 21 10月, 2013 1 次提交
  5. 04 9月, 2013 1 次提交
  6. 16 7月, 2013 1 次提交
  7. 24 6月, 2013 1 次提交
  8. 25 5月, 2013 2 次提交
  9. 24 3月, 2013 1 次提交
    • J
      cfg80211: always check for scan end on P2P device · f9f47529
      Johannes Berg 提交于
      If a P2P device wdev is removed while it has a scan, then the
      scan completion might crash later as it is already freed by
      that time. To avoid the crash always check the scan completion
      when the P2P device is being removed for some reason. If the
      driver already canceled it, don't want and free it, otherwise
      warn and leak it to avoid later crashes.
      
      In order to do this, locking needs to be changed away from the
      rdev mutex (which can't always be guaranteed). For now, use
      the sched_scan_mtx instead, I'll rename it to just scan_mtx in
      a later patch.
      Signed-off-by: NJohannes Berg <johannes.berg@intel.com>
      f9f47529
  10. 07 3月, 2013 1 次提交
    • J
      cfg80211: fix potential BSS memory leak and update · 1345ee6a
      Johannes Berg 提交于
      In the odd case that while updating information from a beacon,
      a BSS was found that is part of a hidden group, we drop the
      new information. In this case, however, we leak the IE buffer
      from the update, and erroneously update the entry's timestamp
      so it will never time out. Fix both these issues.
      
      Cc: Larry Finger <Larry.Finger@lwfinger.net>
      Signed-off-by: NJohannes Berg <johannes.berg@intel.com>
      1345ee6a
  11. 15 2月, 2013 1 次提交
  12. 13 2月, 2013 1 次提交
  13. 12 2月, 2013 4 次提交
    • J
      cfg80211: move TSF into IEs · 8cef2c9d
      Johannes Berg 提交于
      While technically the TSF isn't an IE, it can be
      necessary to distinguish between the TSF from a
      beacon and a probe response, in particular in
      order to know the next DTIM TBTT, as not all APs
      are spec compliant wrt. TSF==0 being a DTIM TBTT
      and thus the DTIM count needs to be taken into
      account as well.
      
      To allow this, move the TSF into the IE struct
      so it can be known whence it came.
      Signed-off-by: NJohannes Berg <johannes.berg@intel.com>
      8cef2c9d
    • J
      cfg80211: remove scan ies NULL check · 83c7aa1a
      Johannes Berg 提交于
      There's no way scan BSS IEs can be NULL as even
      if the allocation fails the frame is discarded.
      Remove some code checking for this and document
      that it is always non-NULL.
      Signed-off-by: NJohannes Berg <johannes.berg@intel.com>
      83c7aa1a
    • J
      cfg80211: track hidden SSID networks properly · 776b3580
      Johannes Berg 提交于
      Currently, cfg80211 will copy beacon IEs from a previously
      received hidden SSID beacon to a probe response entry, if
      that entry is created after the beacon entry. However, if
      it is the other way around, or if the beacon is updated,
      such changes aren't propagated.
      
      Fix this by tracking the relation between the probe
      response and beacon BSS structs in this case.
      
      In case drivers have private data stored in a BSS struct
      and need access to such data from a beacon entry, cfg80211
      now provides the hidden_beacon_bss pointer from the probe
      response entry to the beacon entry.
      Signed-off-by: NJohannes Berg <johannes.berg@intel.com>
      776b3580
    • J
      cfg80211: pass wiphy to cfg80211_ref_bss/put_bss · 5b112d3d
      Johannes Berg 提交于
      This prepares for using the spinlock instead of krefs
      which is needed in the next patch to track the refs
      of combined BSSes correctly.
      
      Acked-by: Bing Zhao <bzhao@marvell.com> [mwifiex]
      Signed-off-by: NJohannes Berg <johannes.berg@intel.com>
      5b112d3d
  14. 05 2月, 2013 9 次提交
  15. 31 1月, 2013 1 次提交
  16. 24 1月, 2013 1 次提交
  17. 30 11月, 2012 4 次提交
  18. 23 11月, 2012 1 次提交
    • J
      cfg80211: use DS or HT operation IEs to determine BSS channel · 0172bb75
      Johannes Berg 提交于
      Currently, mac80211 checks the DS params IE if present and
      uses it for the (primary) BSS channel, instead of the one
      that the frame was received on. This is particularly useful
      in the 2.4 GHz band since a frame is often received on one
      of the adjacent channels due to overlap.
      
      Move this code to cfg80211 so other drivers also do this.
      
      Additionally, on 5 GHz, in particular with some (possibly)
      upcoming changes in 802.11ai and duplicate transmissions
      when wider channels are used, something similar happens.
      So if present, also use the (primary) channel information
      contained in the HT operation IE.
      Signed-off-by: NJohannes Berg <johannes.berg@intel.com>
      0172bb75
  19. 18 10月, 2012 4 次提交
  20. 05 9月, 2012 1 次提交
  21. 12 7月, 2012 1 次提交
  22. 10 5月, 2012 1 次提交
    • J
      wireless: Convert compare_ether_addr to ether_addr_equal · ac422d3c
      Joe Perches 提交于
      Use the new bool function ether_addr_equal to add
      some clarity and reduce the likelihood for misuse
      of compare_ether_addr for sorting.
      
      I removed a conversion from scan.c/cmp_bss_core
      that appears to be a sorting function.
      
      Done via cocci script:
      
      $ cat compare_ether_addr.cocci
      @@
      expression a,b;
      @@
      -	!compare_ether_addr(a, b)
      +	ether_addr_equal(a, b)
      
      @@
      expression a,b;
      @@
      -	compare_ether_addr(a, b)
      +	!ether_addr_equal(a, b)
      
      @@
      expression a,b;
      @@
      -	!ether_addr_equal(a, b) == 0
      +	ether_addr_equal(a, b)
      
      @@
      expression a,b;
      @@
      -	!ether_addr_equal(a, b) != 0
      +	!ether_addr_equal(a, b)
      
      @@
      expression a,b;
      @@
      -	ether_addr_equal(a, b) == 0
      +	!ether_addr_equal(a, b)
      
      @@
      expression a,b;
      @@
      -	ether_addr_equal(a, b) != 0
      +	ether_addr_equal(a, b)
      
      @@
      expression a,b;
      @@
      -	!!ether_addr_equal(a, b)
      +	ether_addr_equal(a, b)
      Signed-off-by: NJoe Perches <joe@perches.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      ac422d3c