trouble sending BAR frame
PseudoCylon
moonlightakkiy at yahoo.ca
Mon Jul 5 09:05:42 UTC 2010
Hello,
Hiccups sending BAR frame.
1) ieee80211_send_bar() in ieee80211_ht.c
http://fxr.watson.org/fxr/source/net80211/ieee80211_ht.c?im=bigexcerpts#L2146
2146 ret = ic->ic_raw_xmit(ni, m, NULL);
2147 if (ret != 0) {
2148 /* xmit failed, clear state flag */
2149 tap->txa_flags &= ~IEEE80211_AGGR_BARPEND;
2150 goto bad;
2151 }
2152 /* XXX hack against tx complete happening before timer is started */
2153 if (tap->txa_flags & IEEE80211_AGGR_BARPEND)
2154 bar_start_timer(tap);
2155 return 0;
2156 bad:
2157 ieee80211_free_node(ni);
2158 return ret;
It says when ic_raw_xmit() succeeds, dose not free node, but free node when ic_raw_xmit() fails. Drivers free node ether success or fail, so node will be freed twice when tx fails, and we will get ambushed by page fault later.
2) bar_tx_complete()
http://fxr.watson.org/fxr/source/net80211/ieee80211_ht.c?im=bigexcerpts#L2044
2044 if (status) /* ACK'd */
2045 bar_stop_timer(tap);
2046 ic->ic_bar_response(ni, tap, status);
and ieee80211_bar_response()
http://fxr.watson.org/fxr/source/net80211/ieee80211_ht.c?im=bigexcerpts#L2056
2056 if (status != 0) { /* got ACK */
2057 IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_11N,
2058 ni, "BAR moves BA win <%u:%u> (%u frames) txseq %u tid %u",
2059 tap->txa_start,
2060 IEEE80211_SEQ_ADD(tap->txa_start, tap->txa_wnd-1),
2061 tap->txa_qframes, tap->txa_seqpending,
2062 WME_AC_TO_TID(tap->txa_ac));
2063
2064 /* NB: timer already stopped in bar_tx_complete */
2065 tap->txa_start = tap->txa_seqpending;
2066 tap->txa_flags &= ~IEEE80211_AGGR_BARPEND;
2067 }
"status" the last argument of ieee80211_process_callback() is 0 on success according to IEEE80211_OUTPUT(9), so when tx succeeds, BAR frame is repeatedly sent max retry times and at the end DELBA will be sent.
I commented out
2157 //ieee80211_free_node(ni);
and negated "status"
2044 if (!status)
2056 if (status == 0)
It's been working fine for a couple of days.
AK
More information about the freebsd-net
mailing list