Hi, > I guess my assumption was if ROC is currently active then a CMD_FRAME > (on the same channel) should just go out immediately, not be queued, and > not even bother checking the duration. (and in this case I'm not even > setting a duration for CMD_FRAME). Hm, yeah, I'd think so too? There's probably some logic to make sure it can still go out, so it doesn't come in just at the end of the ROC, but seems that should work? I mean, that's also exactly what should happen for a response frame, right? When you are using ROC to listen to requests, and then send a response. That'd be without setting a duration, normally. Even the code says: /* This will handle all kinds of coalescing and immediate TX */ ret = ieee80211_start_roc_work(local, sdata, params->chan, params->wait, cookie, skb, IEEE80211_ROC_TYPE_MGMT_TX); And then seems you should get into ... /* otherwise handle queueing */ list_for_each_entry(tmp, &local->roc_list, list) { if (tmp->chan != channel || tmp->sdata != sdata) continue; ... if (!local->ops->remain_on_channel) { ... ieee80211_handle_roc_started(roc, now); which does static void ieee80211_handle_roc_started(struct ieee80211_roc_work *roc, unsigned long start_time) { if (WARN_ON(roc->notified)) return; roc->start_time = start_time; roc->started = true; if (roc->mgmt_tx_cookie) { if (!WARN_ON(!roc->frame)) { ieee80211_tx_skb_tid_band(roc->sdata, roc->frame, 7, roc->chan->band); Not sure why that wouldn't work? > Does the OFFCHANNEL_TX_OK flag have any bearing on this? I found that I > have to set it even if ROC is ongoing, maybe thats another topic of > discussion. I think you have to just always set that flag unless you're transmitting on the operating channel. johannes