• Johannes Berg's avatar
    mac80211: don't split remain-on-channel for coalescing · 252ec2b3
    Johannes Berg authored
    Due to remain-on-channel scheduling delays, when we split an ROC
    while coalescing, we'll usually get a picture like this:
    existing ROC:  |------------------|
    current time:              ^
    new ROC:                   |------|              |-------|
    If the expected response frames are then transmitted by the peer
    in the hole between the two fragments of the new ROC, we miss
    them and the process (e.g. ANQP query) fails.
    mac80211 expects that the window to miss something is small:
    existing ROC:  |------------------|
    new ROC:                   |------||-------|
    but that's normally not the case.
    To avoid this problem, coalesce only if the new ROC's duration
    is <= the remaining time on the existing one:
    existing ROC:  |------------------|
    new ROC:                   |-----|
    and never split a new one but schedule it afterwards instead:
    existing ROC:  |------------------|
    new ROC:                                       |-------------|
    Reported-by: default avatarMatti Gottlieb <matti.gottlieb@intel.com>
    Reviewed-by: default avatarEliadX Peller <eliad@wizery.com>
    Reviewed-by: default avatarMatti Gottlieb <matti.gottlieb@intel.com>
    Tested-by: default avatarMatti Gottlieb <matti.gottlieb@intel.com>
    Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>