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 193 193 union iwreq_data wreq; 194 194 195 195 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); 197 207 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); 198 212 memset(&wreq, 0, sizeof(wreq)); 199 213 IEEE80211_ADDR_COPY(wreq.addr.sa_data, ni->ni_bssid); 200 214 wreq.addr.sa_family = ARPHRD_ETHER; … … 216 230 } 217 231 218 232 void 233 ieee80211_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 248 void 219 249 ieee80211_notify_node_leave(struct ieee80211_node *ni) 220 250 { 221 251 struct ieee80211vap *vap = ni->ni_vap; … … 223 253 union iwreq_data wreq; 224 254 225 255 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); 230 279 } else { 231 280 /* fire off wireless event station leaving */ 232 281 memset(&wreq, 0, sizeof(wreq)); -
madwifi-0.9.3/net80211/ieee80211_node.c
old new 120 120 vap->iv_inact_auth = IEEE80211_INACT_AUTH; 121 121 vap->iv_inact_run = IEEE80211_INACT_RUN; 122 122 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; 123 127 } 124 128 125 129 void … … 192 196 { 193 197 struct ieee80211com *ic = vap->iv_ic; 194 198 199 del_timer(&vap->iv_leavedelay); 195 200 ieee80211_node_table_reset(&ic->ic_sta, vap); 196 201 if (vap->iv_bss != NULL) { 197 202 ieee80211_free_node(vap->iv_bss); -
madwifi-0.9.3/net80211/ieee80211_proto.h
old new 295 295 */ 296 296 void ieee80211_notify_node_join(struct ieee80211_node *, int); 297 297 void ieee80211_notify_node_leave(struct ieee80211_node *); 298 void ieee80211_notify_node_leave_delayed(unsigned long data); 298 299 void ieee80211_notify_scan_done(struct ieee80211vap *); 299 300 void ieee80211_notify_sta_stats(struct ieee80211_node *ni); 300 301 -
madwifi-0.9.3/net80211/ieee80211_var.h
old new 405 405 struct ieee80211_app_ie_t app_ie[IEEE80211_APPIE_NUM_OF_FRAME]; /* app-specified IEs by frame type */ 406 406 u_int32_t app_filter; /* filters which management frames are forwarded to app */ 407 407 408 struct timer_list iv_leavedelay; /* delay notify station leave old ap on roam */ 408 409 }; 409 410 MALLOC_DECLARE(M_80211_VAP); 410 411
