1 This patch causes STA mode interfaces to disassociate if transmission of assoc/auth
2 critical packets failed.
4 Signed-off-by: Felix Fietkau <nbd@openwrt.org>
10 if (ts->ts_status & HAL_TXERR_XRETRY) {
11 sc->sc_stats.ast_tx_xretries++;
12 + if (SKB_CB(bf->bf_skb)->auth_pkt &&
13 + (ni->ni_vap->iv_opmode == IEEE80211_M_STA)) {
14 + struct ieee80211vap *vap = ni->ni_vap;
16 + /* if roaming is enabled, try reassociating, otherwise
17 + * disassociate and go back to the scan state */
18 + vap->iv_mgtsend.function(vap->iv_mgtsend.data);
20 if (ni->ni_flags & IEEE80211_NODE_UAPSD_TRIG) {
21 ni->ni_stats.ns_tx_eosplost++;
22 DPRINTF(sc, ATH_DEBUG_UAPSD,
23 --- a/net80211/ieee80211_linux.c
24 +++ b/net80211/ieee80211_linux.c
27 skb_reserve(skb, align - off);
29 + SKB_CB(skb)->auth_pkt = 0;
30 SKB_CB(skb)->ni = NULL;
31 SKB_CB(skb)->flags = 0;
32 SKB_CB(skb)->next = NULL;
33 --- a/net80211/ieee80211_linux.h
34 +++ b/net80211/ieee80211_linux.h
36 void (*next_destructor)(struct sk_buff *skb);
38 struct sk_buff *next; /* fast frame sk_buf chain */
43 --- a/net80211/ieee80211_output.c
44 +++ b/net80211/ieee80211_output.c
47 hdrsize = sizeof(struct ieee80211_frame);
49 + SKB_CB(skb)->auth_pkt = (eh.ether_type == __constant_htons(ETHERTYPE_PAE));
51 switch (vap->iv_opmode) {
52 case IEEE80211_M_IBSS:
53 case IEEE80211_M_AHDEMO:
55 ie->param_len = frm - &ie->param_oui[0];
61 * Send a probe request frame with the specified ssid
63 sizeof(u_int16_t)+IEEE80211_CHALLENGE_LEN : 0));
65 senderr(ENOMEM, is_tx_nobuf);
66 + SKB_CB(skb)->auth_pkt = 1;
69 (is_shared_key) ? htole16(IEEE80211_AUTH_ALG_SHARED)
71 vap->app_ie[IEEE80211_APPIE_FRAME_ASSOC_REQ].length);
73 senderr(ENOMEM, is_tx_nobuf);
74 + SKB_CB(skb)->auth_pkt = 1;
77 if (vap->iv_opmode == IEEE80211_M_IBSS)