26 Jul, 2019

1 commit

  • Implement the basics required for supporting high efficiency with mesh:
    include HE information elements in beacons, probe responses, and peering
    action frames, and check for compatible HE configurations when peering.

    Signed-off-by: Sven Eckelmann

    Forwarded: https://patchwork.kernel.org/patch/11029299/
    Link: https://lore.kernel.org/r/20190724163359.3507-2-sven@narfation.org
    Signed-off-by: Johannes Berg

    Sven Eckelmann
     

19 Jun, 2019

1 commit

  • Based on 2 normalized pattern(s):

    this program is free software you can redistribute it and or modify
    it under the terms of the gnu general public license version 2 as
    published by the free software foundation

    this program is free software you can redistribute it and or modify
    it under the terms of the gnu general public license version 2 as
    published by the free software foundation #

    extracted by the scancode license scanner the SPDX license identifier

    GPL-2.0-only

    has been chosen to replace the boilerplate/reference in 4122 file(s).

    Signed-off-by: Thomas Gleixner
    Reviewed-by: Enrico Weigelt
    Reviewed-by: Kate Stewart
    Reviewed-by: Allison Randal
    Cc: linux-spdx@vger.kernel.org
    Link: https://lkml.kernel.org/r/20190604081206.933168790@linutronix.de
    Signed-off-by: Greg Kroah-Hartman

    Thomas Gleixner
     

08 Apr, 2019

1 commit


20 Feb, 2019

1 commit


15 Feb, 2019

1 commit

  • The mesh table code walks over hash tables for two purposes. First of
    all it's used as part of a netlink dump process, but it is also used
    for looking up entries to delete using criteria other than the hash
    key.

    The second purpose is directly contrary to the design specification
    of rhashtable walks. It is only meant for use by netlink dumps.

    This is because rhashtable is resizable and you cannot obtain a
    stable walk over it during a resize process.

    In fact mesh's use of rhashtable for dumping is bogus too. Rather
    than using rhashtable walk's iterator to keep track of the current
    position, it always converts the current position to an integer
    which defeats the purpose of the iterator.

    Therefore this patch converts all uses of rhashtable walk into a
    simple linked list.

    This patch also adds a new spin lock to protect the hash table
    insertion/removal as well as the walk list modifications. In fact
    the previous code was buggy as the removals can race with each
    other, potentially resulting in a double-free.

    Cc: stable@vger.kernel.org
    Signed-off-by: Herbert Xu
    Signed-off-by: Johannes Berg

    Herbert Xu
     

19 Jan, 2019

1 commit


09 Nov, 2018

1 commit

  • When peering is in userspace, some implementations may want to control
    which peers are accepted based on RSSI in addition to the information
    elements being sent today. Add signal level so that info is available
    to clients.

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

    Bob Copeland
     

10 Sep, 2018

1 commit

  • TX status reporting to ieee80211s is through ieee80211s_update_metric.
    There are two problems about ieee80211s_update_metric:

    1. The purpose is to estimate the fail probability
    to a specific link. No need to restrict to data frame.

    2. Current implementation does not work if wireless driver does not
    pass tx_status with skb.

    Fix this by removing ieee80211_is_data condition, passing
    ieee80211_tx_status directly to ieee80211s_update_metric, and
    putting it in both __ieee80211_tx_status and ieee80211_tx_status_ext.

    Signed-off-by: Yuan-Chi Pang
    Signed-off-by: Johannes Berg

    Yuan-Chi Pang
     

20 Nov, 2017

1 commit

  • In preparation for unconditionally passing the struct timer_list pointer to
    all timer callbacks, switch to using the new timer_setup() and from_timer()
    to pass the timer pointer explicitly.

    Cc: Johannes Berg
    Cc: "David S. Miller"
    Cc: linux-wireless@vger.kernel.org
    Cc: netdev@vger.kernel.org
    Signed-off-by: Kees Cook
    Signed-off-by: Johannes Berg

    Kees Cook
     

06 Oct, 2017

1 commit

  • In preparation for unconditionally passing the struct timer_list pointer to
    all timer callbacks, switch to using the new timer_setup() and from_timer()
    to pass the timer pointer explicitly. This requires adding a pointer back
    to the sta_info since container_of() can't resolve the sta_info.

    Cc: Johannes Berg
    Cc: "David S. Miller"
    Cc: linux-wireless@vger.kernel.org
    Cc: netdev@vger.kernel.org
    Cc: Thomas Gleixner
    Signed-off-by: Kees Cook
    Signed-off-by: Johannes Berg

    Kees Cook
     

13 Dec, 2016

1 commit


06 Apr, 2016

6 commits

  • The mesh path table needs to be around for the entire time the
    interface is in mesh mode, as users can perform an mpath dump
    at any time. The existing path table lifetime is instead tied
    to the mesh BSS which can cause crashes when different MBSSes
    are joined in the context of a single interface, or when the
    path table is dumped when no MBSS is joined.

    Introduce a new function to perform the final teardown of the
    interface and perform path table cleanup there. We already
    free the individual path elements when the leaving the mesh
    so no additional cleanup is needed there. This fixes the
    following crash:

    [ 47.753026] BUG: unable to handle kernel paging request at fffffff0
    [ 47.753026] IP: [] kthread_data+0xa/0xe
    [ 47.753026] *pde = 00741067 *pte = 00000000
    [ 47.753026] Oops: 0000 [#4] PREEMPT
    [ 47.753026] Modules linked in: ppp_generic slhc 8021q garp mrp sch_fq_codel iptable_mangle ipt_MASQUERADE nf_nat_masquerade_ipv4 iptable_nat nf_conntrack_ipv4 nf_defrag_ipv4 nf_nat_ipv4 nf_nat ip_tables ath9k_htc ath5k 8139too ath10k_pci ath10k_core arc4 ath9k ath9k_common ath9k_hw mac80211 ath cfg80211 cpufreq_powersave br_netfilter bridge stp llc ipw usb_wwan sierra_net usbnet af_alg natsemi via_rhine mii iTCO_wdt iTCO_vendor_support gpio_ich sierra coretemp pcspkr i2c_i801 lpc_ich ata_generic ata_piix libata ide_pci_generic piix e1000e igb i2c_algo_bit ptp pps_core [last unloaded: 8139too]
    [ 47.753026] CPU: 0 PID: 12 Comm: kworker/u2:1 Tainted: G D W 4.5.0-wt-V3 #6
    [ 47.753026] Hardware name: To Be Filled By O.E.M./To be filled by O.E.M., BIOS 080016 11/07/2014
    [ 47.753026] task: f645a0c0 ti: f6462000 task.ti: f6462000
    [ 47.753026] EIP: 0060:[] EFLAGS: 00010002 CPU: 0
    [ 47.753026] EIP is at kthread_data+0xa/0xe
    [ 47.753026] EAX: 00000000 EBX: 00000000 ECX: 00000000 EDX: 00000000
    [ 47.753026] ESI: f645a0c0 EDI: f645a2fc EBP: f6463a80 ESP: f6463a78
    [ 47.753026] DS: 007b ES: 007b FS: 0000 GS: 0000 SS: 0068
    [ 47.753026] CR0: 8005003b CR2: 00000014 CR3: 353e5000 CR4: 00000690
    [ 47.753026] Stack:
    [ 47.753026] c0236866 00000000 f6463aac c05768b4 00000009 f6463ba8 f6463ab0 c0247010
    [ 47.753026] 00000000 f645a0c0 f6464000 00000009 f6463ba8 f6463ab8 c0576eb2 f645a0c0
    [ 47.753026] f6463aec c0228be4 c06335a4 f6463adc f6463ad0 c06c06d4 f6463ae4 c02471b0
    [ 47.753026] Call Trace:
    [ 47.753026] [] ? wq_worker_sleeping+0xb/0x78
    [ 47.753026] [] __schedule+0xda/0x587
    [ 47.753026] [] ? vprintk_default+0x12/0x14
    [ 47.753026] [] schedule+0x72/0x89
    [ 47.753026] [] do_exit+0xb8/0x71d
    [ 47.753026] [] ? kmsg_dump+0xa9/0xae
    [ 47.753026] [] oops_end+0x69/0x70
    [ 47.753026] [] no_context+0x1bb/0x1c5
    [ 47.753026] [] __bad_area_nosemaphore+0x136/0x140
    [ 47.753026] [] ? vmalloc_sync_all+0x19a/0x19a
    [ 47.753026] [] bad_area_nosemaphore+0xd/0x10
    [ 47.753026] [] __do_page_fault+0x26c/0x320
    [ 47.753026] [] ? vmalloc_sync_all+0x19a/0x19a
    [ 47.753026] [] do_page_fault+0xb/0xd
    [ 47.753026] [] error_code+0x58/0x60
    [ 47.753026] [] ? vmalloc_sync_all+0x19a/0x19a
    [ 47.753026] [] ? kthread_data+0xa/0xe
    [ 47.753026] [] ? wq_worker_sleeping+0xb/0x78
    [ 47.753026] [] __schedule+0xda/0x587
    [ 47.753026] [] ? vprintk_default+0x12/0x14
    [ 47.753026] [] schedule+0x72/0x89
    [ 47.753026] [] do_exit+0xb8/0x71d
    [ 47.753026] [] ? kmsg_dump+0xa9/0xae
    [ 47.753026] [] oops_end+0x69/0x70
    [ 47.753026] [] no_context+0x1bb/0x1c5
    [ 47.753026] [] __bad_area_nosemaphore+0x136/0x140
    [ 47.753026] [] ? vmalloc_sync_all+0x19a/0x19a
    [ 47.753026] [] bad_area_nosemaphore+0xd/0x10
    [ 47.753026] [] __do_page_fault+0x26c/0x320
    [ 47.753026] [] ? vmalloc_sync_all+0x19a/0x19a
    [ 47.753026] [] do_page_fault+0xb/0xd
    [ 47.753026] [] error_code+0x58/0x60
    [ 47.753026] [] ? vmalloc_sync_all+0x19a/0x19a
    [ 47.753026] [] ? kthread_data+0xa/0xe
    [ 47.753026] [] ? wq_worker_sleeping+0xb/0x78
    [ 47.753026] [] __schedule+0xda/0x587
    [ 47.753026] [] ? put_io_context_active+0x6d/0x95
    [ 47.753026] [] schedule+0x72/0x89
    [ 47.753026] [] do_exit+0x6cc/0x71d
    [ 47.753026] [] oops_end+0x69/0x70
    [ 47.753026] [] no_context+0x1bb/0x1c5
    [ 47.753026] [] __bad_area_nosemaphore+0x136/0x140
    [ 47.753026] [] ? vmalloc_sync_all+0x19a/0x19a
    [ 47.753026] [] bad_area_nosemaphore+0xd/0x10
    [ 47.753026] [] __do_page_fault+0x26c/0x320
    [ 47.753026] [] ? debug_smp_processor_id+0x12/0x16
    [ 47.753026] [] ? __switch_to+0x24/0x40e
    [ 47.753026] [] ? vmalloc_sync_all+0x19a/0x19a
    [ 47.753026] [] do_page_fault+0xb/0xd
    [ 47.753026] [] error_code+0x58/0x60
    [ 47.753026] [] ? vmalloc_sync_all+0x19a/0x19a
    [ 47.753026] [] ? rhashtable_walk_init+0x5c/0x93
    [ 47.753026] [] mesh_path_tbl_expire.isra.24+0x19/0x82 [mac80211]
    [ 47.753026] [] mesh_path_expire+0x11/0x1f [mac80211]
    [ 47.753026] [] ieee80211_mesh_work+0x73/0x1a9 [mac80211]
    [ 47.753026] [] ieee80211_iface_work+0x2ff/0x311 [mac80211]
    [ 47.753026] [] process_one_work+0x14b/0x24e
    [ 47.753026] [] worker_thread+0x249/0x343
    [ 47.753026] [] ? process_scheduled_works+0x24/0x24
    [ 47.753026] [] kthread+0x9e/0xa3
    [ 47.753026] [] ret_from_kernel_thread+0x20/0x40
    [ 47.753026] [] ? kthread_parkme+0x18/0x18
    [ 47.753026] Code: 6b c0 85 c0 75 05 e8 fb 74 fc ff 89 f8 84 c0 75 08 8d 45 e8 e8 34 dd 33 00 83 c4 28 5b 5e 5f 5d c3 55 8b 80 10 02 00 00 89 e5 5d 40 f0 c3 55 b9 04 00 00 00 89 e5 52 8b 90 10 02 00 00 8d 45
    [ 47.753026] EIP: [] kthread_data+0xa/0xe SS:ESP 0068:f6463a78
    [ 47.753026] CR2: 00000000fffffff0
    [ 47.753026] ---[ end trace 867ca0bdd0767790 ]---

    Fixes: 3b302ada7f0a ("mac80211: mesh: move path tables into if_mesh")
    Reported-by: Fred Veldini
    Signed-off-by: Bob Copeland
    Signed-off-by: Johannes Berg

    Bob Copeland
     
  • Several of the mesh path fields are undocumented and some
    of the documentation is no longer correct or relevant after
    the switch to rhashtable. Clean up the kernel doc
    accordingly and reorder some fields to match the structure
    layout.

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

    Bob Copeland
     
  • Reduce padding waste in struct mesh_table and struct rmc_entry by
    moving the smaller fields to the end.

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

    Bob Copeland
     
  • Since we have converted the mesh path tables to rhashtable, we are
    no longer swapping out the entire mesh_pathtbl pointer with RCU.
    As a result, we no longer need indirection to the hlist head for
    the gates list and can simply embed it, saving a pair of
    pointer-sized allocations.

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

    Bob Copeland
     
  • The RMC cache has 256 list heads plus a u32, which puts it at the
    unfortunate size of 4104 bytes with padding. kmalloc() will then
    round this up to the next power-of-two, so we wind up actually
    using two pages here where most of the second is wasted.

    Switch to hlist heads here to reduce the structure size down to
    fit within a page.

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

    Bob Copeland
     
  • The mesh_path_reclaim() function, called from an rcu callback, cancels
    the mesh_path_timer associated with a mesh path. Unfortunately, this
    call can happen much later, perhaps after the hash table itself is
    destroyed.

    Such a situation led to the following crash in mesh_path_send_to_gates()
    when dereferencing the tbl pointer:

    [ 23.901661] BUG: unable to handle kernel NULL pointer dereference at 0000000000000008
    [ 23.905516] IP: [] mesh_path_send_to_gates+0x2b/0x740
    [ 23.908757] PGD 99ca067 PUD 99c4067 PMD 0
    [ 23.910789] Oops: 0000 [#1] PREEMPT SMP DEBUG_PAGEALLOC
    [ 23.913485] CPU: 0 PID: 0 Comm: swapper/0 Not tainted 4.5.0-rc6-wt+ #43
    [ 23.916675] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS Debian-1.8.2-1 04/01/2014
    [ 23.920471] task: ffffffff81685500 ti: ffffffff81678000 task.ti: ffffffff81678000
    [ 23.922619] RIP: 0010:[] [] mesh_path_send_to_gates+0x2b/0x740
    [ 23.925237] RSP: 0018:ffff88000b403d30 EFLAGS: 00010286
    [ 23.926739] RAX: 0000000000000000 RBX: ffff880009bc0d20 RCX: 0000000000000102
    [ 23.928796] RDX: 000000000000002e RSI: 0000000000000001 RDI: ffff880009bc0d20
    [ 23.930895] RBP: ffff88000b403e18 R08: 0000000000000001 R09: 0000000000000001
    [ 23.932917] R10: 0000000000000000 R11: 0000000000000001 R12: ffff880009c20940
    [ 23.936370] R13: ffff880009bc0e70 R14: ffff880009c21c40 R15: ffff880009bc0d20
    [ 23.939823] FS: 0000000000000000(0000) GS:ffff88000b400000(0000) knlGS:0000000000000000
    [ 23.943688] CS: 0010 DS: 0000 ES: 0000 CR0: 000000008005003b
    [ 23.946429] CR2: 0000000000000008 CR3: 00000000099c5000 CR4: 00000000000006b0
    [ 23.949861] Stack:
    [ 23.950840] 000000000000002e ffff880009c20940 ffff88000b403da8 ffffffff8109e551
    [ 23.954467] ffffffff82711be2 000000000000002e 0000000000000000 ffffffff8166a5f5
    [ 23.958141] 0000000000685ce8 0000000000000246 ffff880009bc0d20 ffff880009c20940
    [ 23.961801] Call Trace:
    [ 23.962987]
    [ 23.963963] [] ? vprintk_emit+0x351/0x5e0
    [ 23.966782] [] ? vprintk_default+0x1f/0x30
    [ 23.969529] [] ? printk+0x48/0x50
    [ 23.971956] [] mesh_path_timer+0x133/0x160
    [ 23.974707] [] ? mesh_nexthop_resolve+0x230/0x230
    [ 23.977775] [] call_timer_fn+0xce/0x330
    [ 23.980448] [] ? call_timer_fn+0x5/0x330
    [ 23.983126] [] ? mesh_nexthop_resolve+0x230/0x230
    [ 23.986091] [] run_timer_softirq+0x22c/0x390

    Instead of cancelling in the RCU callback, set a new flag to prevent the
    timer from being rearmed, and then cancel the timer synchronously when
    freeing the mesh path. This leaves mesh_path_reclaim() doing nothing
    but kfree, so switch to kfree_rcu().

    Fixes: 3b302ada7f0a ("mac80211: mesh: move path tables into if_mesh")
    Signed-off-by: Bob Copeland
    Signed-off-by: Johannes Berg

    Bob Copeland
     

05 Apr, 2016

3 commits

  • In the time since the mesh path table was implemented as an
    RCU-traversable, dynamically growing hash table, a generic RCU
    hashtable implementation was added to the kernel.

    Switch the mesh path table over to rhashtable to remove some code
    and also gain some features like automatic shrinking.

    Cc: Thomas Graf
    Cc: netdev@vger.kernel.org
    Signed-off-by: Bob Copeland
    Signed-off-by: Johannes Berg

    Bob Copeland
     
  • The mesh path table uses a struct mesh_node in its hlists in
    order to support a resizable hash table: the mesh_node provides
    an indirection to the actual mesh path so that two different
    bucket lists can point to the same path entry.

    However, for the known gates list, we don't need this indirection
    because there is ever only one list. So we can just embed the
    hlist_node in the mesh path itself, which simplifies things a bit
    and saves a linear search whenever we need to find an item in
    the list.

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

    Bob Copeland
     
  • The mesh path and mesh gate hashtables are global, containing
    all of the mpaths for every mesh interface, but the paths are
    all tied logically to a single interface. The common case is
    just a single mesh interface, so optimize for that by moving
    the global hashtable into the per-interface struct.

    Doing so allows us to drop sdata pointer comparisons inside
    the lookups and also saves a few bytes of BSS and data.

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

    Bob Copeland
     

02 Mar, 2016

1 commit

  • …inux/kernel/git/jberg/mac80211-next

    Johannes Berg says:

    ====================
    Here's another round of updates for -next:
    * big A-MSDU RX performance improvement (avoid linearize of paged RX)
    * rfkill changes: cleanups, documentation, platform properties
    * basic PBSS support in cfg80211
    * MU-MIMO action frame processing support
    * BlockAck reordering & duplicate detection offload support
    * various cleanups & little fixes
    ====================

    Signed-off-by: David S. Miller <davem@davemloft.net>

    David S. Miller
     

24 Feb, 2016

1 commit


26 Jan, 2016

1 commit

  • During a sw scan ieee80211_iface_work ignores work items for all vifs.
    However after the scan complete work is requeued only for STA, ADHOC
    and MESH iftypes.

    This occasionally results in event processing getting delayed/not
    processed for iftype AP when it coexists with a STA. This can result
    in data halt and eventually disconnection on the AP interface.

    Cc: stable@vger.kernel.org
    Signed-off-by: Sachin Kulkarni
    Signed-off-by: Johannes Berg

    Sachin Kulkarni
     

05 Oct, 2015

1 commit


22 Sep, 2015

1 commit

  • Implement the basics required for supporting very high throughput
    with mesh: include VHT information elements in beacons, probe
    responses, and peering action frames, and check for compatible VHT
    configurations when peering.

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

    Bob Copeland
     

09 Oct, 2014

1 commit


26 Nov, 2013

2 commits


18 Jun, 2013

1 commit

  • Instead of updating the mesh beacon immediately when
    requested (which would require the sdata_lock()), defer it
    to the mac80211 workqueue.

    Fixes yet another deadlock on calling sta_info_flush()
    with the sdata_lock() held from ieee80211_stop_mesh(). We
    could just drop the sdata_lock() around the
    mesh_sta_cleanup() call, but this path is also taken from
    several non-locked error paths.

    Signed-off-by: Thomas Pedersen
    [fix comment position]
    Signed-off-by: Johannes Berg

    Thomas Pedersen
     

11 Jun, 2013

1 commit


03 Jun, 2013

1 commit

  • Cap max peerings at 63 in accordance with IEEE-2012 8.4.2.100.7.
    Triggers a beacon regeneration every time the number of peerings changes.
    Previously this would only happen if the "accepting peerings" bit changed.

    Signed-off-by: Jacob Minshall
    Signed-off-by: Johannes Berg

    Jacob Minshall
     

08 Apr, 2013

1 commit

  • Most times that mesh_path_add() is called, it is followed by
    a lookup to get the just-added mpath. We can instead just
    return the new mpath in the case that we allocated one (or the
    existing one if already there), so do that. Also, reorder the
    code in mesh_path_add a bit so that we don't need to allocate
    in the pre-existing case.

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

    Bob Copeland
     

06 Mar, 2013

1 commit


15 Feb, 2013

4 commits

  • There's various code with strange indentation,
    questionable loop and locking constructs, etc.

    The bigger change is moving the "sdata" argument
    to the first argument of all functions, like all
    other mac80211 functions that have one.

    Signed-off-by: Johannes Berg

    Johannes Berg
     
  • Previously, the entire mesh beacon would be generated each
    time the beacon timer fired. Instead generate a beacon
    head and tail (so the TIM can easily be inserted when mesh
    power save is on) when starting a mesh or the MBSS
    parameters change.

    Also add a mutex for protecting beacon updates and
    preventing leaks.

    Signed-off-by: Thomas Pedersen
    Signed-off-by: Johannes Berg

    Thomas Pedersen
     
  • Make all the parsed IE pointers const, and propagate
    the change to all the users etc.

    Signed-off-by: Johannes Berg

    Johannes Berg
     
  • A few mesh utility functions will call
    ieee80211_bss_info_change_notify(), and then the caller
    might notify the driver of the same change again. Avoid
    this redundancy by propagating the BSS changes and
    generally calling bss_info_change_notify() once per
    change.

    Signed-off-by: Thomas Pedersen
    Signed-off-by: Johannes Berg

    Thomas Pedersen
     

12 Feb, 2013

1 commit

  • The patch "mac80211: clean up mesh sta allocation warning"
    moved some mesh initialization into a path which is only
    called when the kernel handles peering. This causes a hang
    when mac80211 tries to clean up a userspace-allocated
    station entry and delete a timer which has never been
    initialized.

    To avoid this, only do any mesh sta peering teardown if
    the kernel is actually handling it.

    The same is true when quiescing before suspend.

    Signed-off-by: Thomas Pedersen
    Signed-off-by: Johannes Berg

    Thomas Pedersen
     

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
     

17 Jan, 2013

1 commit