On Fri, 2012-03-16 at 14:38 +0100, Marco Porsch wrote: > On 03/16/12 13:44, Johannes Berg wrote: > > On Fri, 2012-03-16 at 10:26 +0100, Marco Porsch wrote: > >> Hi all, > >> > >> in sta_info.c : ieee80211_sta_ps_deliver_response the > >> IEEE80211_TX_STATUS_EOSP is set for all to-be-sent frames, not only for > >> the last. But only the last buffered frame actually gets the EOSP flag. > >> > >> > >> /* set EOSP for the frame */ > >> if (reason == IEEE80211_FRAME_RELEASE_UAPSD&& > >> qoshdr&& skb_queue_empty(&frames)) > >> *qoshdr |= IEEE80211_QOS_CTL_EOSP; > >> > >> info->flags |= IEEE80211_TX_STATUS_EOSP | > >> IEEE80211_TX_CTL_REQ_TX_STATUS; > >> > >> > >> Consequence is, that the WLAN_STA_SP flag gets cleared (multiple times) > >> in ieee80211_tx_status before the last frame with EOSP has been sent. > >> Is this correct? > > > > Looks like the bug is above, the EOSP/TX_STATUS should only be set for > > the last frame? > > I Agree. But what about the case, when the last frame is not a QoS > frame? Can this even happen - or is U-APSD only for QoS STA? uAPSD can only be used by a QoS STA. > Then we would have to manually append a QoS Null with the EOSP flag + > TX_STATUS? > > So like this: > > /* set EOSP for the _last_ frame or appended a QoS Null when needed */ > if (reason == IEEE80211_FRAME_RELEASE_UAPSD && > skb_queue_empty(&frames)) { > if (qoshdr) { > *qoshdr |= IEEE80211_QOS_CTL_EOSP; > > info->flags |= IEEE80211_TX_STATUS_EOSP | > IEEE80211_TX_CTL_REQ_TX_STATUS; > } else { > ieee80211_send_null_response(sdata, tid, reason); > } > } No, I think it should be more like this: /* set EOSP for the frame */ if (skb_queue_empty(&frames)) { if (reason == IEEE80211_FRAME_RELEASE_UAPSD && qoshdr) *qoshdr |= IEEE80211_QOS_CTL_EOSP; info->flags |= IEEE80211_TX_STATUS_EOSP | IEEE80211_TX_CTL_REQ_TX_STATUS; } johannes -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html