Ticket #1404: patch-txdrop1sec.diff

File patch-txdrop1sec.diff, 5.1 kB (added by t.schulz@zetesind.com, 2 years ago)
  • madwifi-0.9.3/net80211/ieee80211_linux.c

    old new  
    193193        union iwreq_data wreq; 
    194194 
    195195        if (ni == vap->iv_bss) {  
    196                 if (newassoc)  
     196                /* cancel delayed notify station leave old ap */ 
     197                if (del_timer(&vap->iv_leavedelay)) 
     198                        IEEE80211_DPRINTF(vap, IEEE80211_MSG_ASSOC, 
     199                                "%s: cancelled delayed notify leave  %lu\n", 
     200                                __func__, jiffies); 
     201                if (newassoc) { 
     202                        IEEE80211_DPRINTF(vap, IEEE80211_MSG_ASSOC, 
     203                                "%s: bssid %s " 
     204                                "netif_carrier_on(%p) state 0x%lx  %lu\n", 
     205                                __func__, ether_sprintf(ni->ni_bssid), 
     206                                dev, dev->state, jiffies); 
    197207                        netif_carrier_on(dev); 
     208                } else 
     209                        IEEE80211_DPRINTF(vap, IEEE80211_MSG_ASSOC, 
     210                                "%s: bssid %s newassoc=0  %lu\n", 
     211                                __func__, ether_sprintf(ni->ni_bssid), jiffies); 
    198212                memset(&wreq, 0, sizeof(wreq)); 
    199213                IEEE80211_ADDR_COPY(wreq.addr.sa_data, ni->ni_bssid); 
    200214                wreq.addr.sa_family = ARPHRD_ETHER; 
     
    216230} 
    217231 
    218232void 
     233ieee80211_notify_node_leave_delayed(unsigned long data) 
     234{ 
     235        struct ieee80211vap *vap = (struct ieee80211vap *)data; 
     236        struct net_device *dev = vap->iv_dev; 
     237        union iwreq_data wreq; 
     238 
     239        IEEE80211_DPRINTF(vap, IEEE80211_MSG_ASSOC, 
     240                "%s: netif_carrier_off(%p) state 0x%lx  %lu\n", 
     241                __func__, dev, dev->state, jiffies); 
     242        netif_carrier_off(dev); 
     243        memset(wreq.ap_addr.sa_data, 0, ETHER_ADDR_LEN); 
     244        wreq.ap_addr.sa_family = ARPHRD_ETHER; 
     245        wireless_send_event(dev, SIOCGIWAP, &wreq, NULL); 
     246} 
     247 
     248void 
    219249ieee80211_notify_node_leave(struct ieee80211_node *ni) 
    220250{ 
    221251        struct ieee80211vap *vap = ni->ni_vap; 
     
    223253        union iwreq_data wreq; 
    224254 
    225255        if (ni == vap->iv_bss) { 
    226                 netif_carrier_off(dev); 
    227                 memset(wreq.ap_addr.sa_data, 0, ETHER_ADDR_LEN); 
    228                 wreq.ap_addr.sa_family = ARPHRD_ETHER; 
    229                 wireless_send_event(dev, SIOCGIWAP, &wreq, NULL); 
     256                /* 
     257                 * Delay notify this station leave old ap, because 
     258                 * a) the Linux kernel limits linkwatch events to 1 per sec 
     259                 *    causing drop TX data this long if netif_carrier_off() 
     260                 *    is followed by netif_carrier_on() shortly afterwards, 
     261                 * b) wpa_supplicant acts on wireless event "Not-Associated", 
     262                 *    but should not, as event "New-AP" follows shortly 
     263                 *    afterwards. 
     264                 * When roaming the association to the new ap will usually 
     265                 * succeed within 5..50 msec and the notify delay timer will 
     266                 * be deleted. If association does not succeed within the 
     267                 * delay, the timer will expire and notify "Not-Associated" 
     268                 * to upper layers. 
     269                 */ 
     270                unsigned long delay = msecs_to_jiffies(100);    /* 100 msec */ 
     271                if (vap->iv_opmode == IEEE80211_M_STA) { 
     272                        IEEE80211_DPRINTF(vap, IEEE80211_MSG_ASSOC, 
     273                                "%s: delay %lu notify leave bssid %s  %lu\n", 
     274                                __func__, delay, ether_sprintf(ni->ni_bssid), 
     275                                jiffies); 
     276                        mod_timer(&vap->iv_leavedelay, jiffies + delay); 
     277                } else 
     278                        ieee80211_notify_node_leave_delayed((unsigned long)vap); 
    230279        } else { 
    231280                /* fire off wireless event station leaving */ 
    232281                memset(&wreq, 0, sizeof(wreq)); 
  • madwifi-0.9.3/net80211/ieee80211_node.c

    old new  
    120120        vap->iv_inact_auth = IEEE80211_INACT_AUTH; 
    121121        vap->iv_inact_run = IEEE80211_INACT_RUN; 
    122122        vap->iv_inact_probe = IEEE80211_INACT_PROBE; 
     123        /* delayed notify about station leave old ap before roam to new */ 
     124        init_timer(&vap->iv_leavedelay); 
     125        vap->iv_leavedelay.function = ieee80211_notify_node_leave_delayed; 
     126        vap->iv_leavedelay.data = (unsigned long)vap; 
    123127} 
    124128 
    125129void 
     
    192196{ 
    193197        struct ieee80211com *ic = vap->iv_ic; 
    194198 
     199        del_timer(&vap->iv_leavedelay); 
    195200        ieee80211_node_table_reset(&ic->ic_sta, vap); 
    196201        if (vap->iv_bss != NULL) { 
    197202                ieee80211_free_node(vap->iv_bss); 
  • madwifi-0.9.3/net80211/ieee80211_proto.h

    old new  
    295295 */ 
    296296void ieee80211_notify_node_join(struct ieee80211_node *, int); 
    297297void ieee80211_notify_node_leave(struct ieee80211_node *); 
     298void ieee80211_notify_node_leave_delayed(unsigned long data); 
    298299void ieee80211_notify_scan_done(struct ieee80211vap *); 
    299300void ieee80211_notify_sta_stats(struct ieee80211_node *ni); 
    300301 
  • madwifi-0.9.3/net80211/ieee80211_var.h

    old new  
    405405        struct ieee80211_app_ie_t app_ie[IEEE80211_APPIE_NUM_OF_FRAME]; /* app-specified IEs by frame type */ 
    406406        u_int32_t app_filter;                   /* filters which management frames are forwarded to app */ 
    407407 
     408        struct timer_list iv_leavedelay;        /* delay notify station leave old ap on roam */ 
    408409}; 
    409410MALLOC_DECLARE(M_80211_VAP); 
    410411