• Johannes Berg's avatar
    mac80211: rewrite remain-on-channel logic · aaa016cc
    Johannes Berg authored
    Jouni found a bug in the remain-on-channel logic: when a short item
    is queued, a long item is combined with it extending the original
    one, and then the long item is deleted, the timeout doesn't go back
    to the short one, and the short item ends up taking a long time. In
    this case, this showed as blocking scan when running two test cases
    back to back - the scan from the second was delayed even though all
    the remain-on-channel items should long have been gone.
    
    Fixing this with the current data structures turns out to be a bit
    complicated, we just remove the long item from the dependents list
    right now and don't recalculate the timeouts.
    
    There's a somewhat similar bug where we delete the short item and
    all the dependents go with it; to fix this we'd have to move them
    from the dependents to the real list.
    
    Instead of trying to do that, rewrite the code to not have all this
    complexity in the data structures: use a single list and allow more
    than one entry in it being marked as started. This makes the code a
    bit more complex, the worker needs to understand that it might need
    to just remove one of the started items, while keeping the device
    off-channel, but that's not more complicated than the nested data
    structures.
    
    This then fixes both issues described, and makes it easier to also
    limit the overall off-channel time when combining.
    
    TODO: as before, with hardware remain-on-channel, deleting an item
    after combining results in cancelling them all - we can keep track
    of the time elapsed and only cancel after that to fix this.
    Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
    aaa016cc
ieee80211_i.h 65.5 KB