diff options
| author | Stephen Hemminger <shemminger@osdl.org> | 2006-05-08 19:01:20 -0400 |
|---|---|---|
| committer | Stephen Hemminger <shemminger@osdl.org> | 2006-05-08 19:01:20 -0400 |
| commit | 23aee82e75c1ced9492cbff6090b8e213d95945e (patch) | |
| tree | 2d8f0f7fc59a65bffc852c7dc167ee6b196c07a7 /net | |
| parent | 8ec93459655a3618dedec6360bb28d63f0010ef6 (diff) | |
| parent | 178e0cc5ff249965c6cfbd78b1af6a5e614d837c (diff) | |
Merge branch 'upstream-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-2.6
Diffstat (limited to 'net')
| -rw-r--r-- | net/ieee80211/softmac/ieee80211softmac_assoc.c | 17 | ||||
| -rw-r--r-- | net/ieee80211/softmac/ieee80211softmac_auth.c | 16 | ||||
| -rw-r--r-- | net/ieee80211/softmac/ieee80211softmac_module.c | 4 | ||||
| -rw-r--r-- | net/ieee80211/softmac/ieee80211softmac_scan.c | 8 |
4 files changed, 41 insertions, 4 deletions
diff --git a/net/ieee80211/softmac/ieee80211softmac_assoc.c b/net/ieee80211/softmac/ieee80211softmac_assoc.c index fb79ce7d6439..57ea9f6f465c 100644 --- a/net/ieee80211/softmac/ieee80211softmac_assoc.c +++ b/net/ieee80211/softmac/ieee80211softmac_assoc.c | |||
| @@ -51,11 +51,12 @@ ieee80211softmac_assoc(struct ieee80211softmac_device *mac, struct ieee80211soft | |||
| 51 | spin_lock_irqsave(&mac->lock, flags); | 51 | spin_lock_irqsave(&mac->lock, flags); |
| 52 | mac->associnfo.associating = 1; | 52 | mac->associnfo.associating = 1; |
| 53 | mac->associated = 0; /* just to make sure */ | 53 | mac->associated = 0; /* just to make sure */ |
| 54 | spin_unlock_irqrestore(&mac->lock, flags); | ||
| 55 | 54 | ||
| 56 | /* Set a timer for timeout */ | 55 | /* Set a timer for timeout */ |
| 57 | /* FIXME: make timeout configurable */ | 56 | /* FIXME: make timeout configurable */ |
| 58 | schedule_delayed_work(&mac->associnfo.timeout, 5 * HZ); | 57 | if (likely(mac->running)) |
| 58 | schedule_delayed_work(&mac->associnfo.timeout, 5 * HZ); | ||
| 59 | spin_unlock_irqrestore(&mac->lock, flags); | ||
| 59 | } | 60 | } |
| 60 | 61 | ||
| 61 | void | 62 | void |
| @@ -319,6 +320,9 @@ ieee80211softmac_handle_assoc_response(struct net_device * dev, | |||
| 319 | u16 status = le16_to_cpup(&resp->status); | 320 | u16 status = le16_to_cpup(&resp->status); |
| 320 | struct ieee80211softmac_network *network = NULL; | 321 | struct ieee80211softmac_network *network = NULL; |
| 321 | unsigned long flags; | 322 | unsigned long flags; |
| 323 | |||
| 324 | if (unlikely(!mac->running)) | ||
| 325 | return -ENODEV; | ||
| 322 | 326 | ||
| 323 | spin_lock_irqsave(&mac->lock, flags); | 327 | spin_lock_irqsave(&mac->lock, flags); |
| 324 | 328 | ||
| @@ -377,10 +381,16 @@ ieee80211softmac_handle_disassoc(struct net_device * dev, | |||
| 377 | { | 381 | { |
| 378 | struct ieee80211softmac_device *mac = ieee80211_priv(dev); | 382 | struct ieee80211softmac_device *mac = ieee80211_priv(dev); |
| 379 | unsigned long flags; | 383 | unsigned long flags; |
| 384 | |||
| 385 | if (unlikely(!mac->running)) | ||
| 386 | return -ENODEV; | ||
| 387 | |||
| 380 | if (memcmp(disassoc->header.addr2, mac->associnfo.bssid, ETH_ALEN)) | 388 | if (memcmp(disassoc->header.addr2, mac->associnfo.bssid, ETH_ALEN)) |
| 381 | return 0; | 389 | return 0; |
| 390 | |||
| 382 | if (memcmp(disassoc->header.addr1, mac->dev->dev_addr, ETH_ALEN)) | 391 | if (memcmp(disassoc->header.addr1, mac->dev->dev_addr, ETH_ALEN)) |
| 383 | return 0; | 392 | return 0; |
| 393 | |||
| 384 | dprintk(KERN_INFO PFX "got disassoc frame\n"); | 394 | dprintk(KERN_INFO PFX "got disassoc frame\n"); |
| 385 | netif_carrier_off(dev); | 395 | netif_carrier_off(dev); |
| 386 | spin_lock_irqsave(&mac->lock, flags); | 396 | spin_lock_irqsave(&mac->lock, flags); |
| @@ -400,6 +410,9 @@ ieee80211softmac_handle_reassoc_req(struct net_device * dev, | |||
| 400 | struct ieee80211softmac_device *mac = ieee80211_priv(dev); | 410 | struct ieee80211softmac_device *mac = ieee80211_priv(dev); |
| 401 | struct ieee80211softmac_network *network; | 411 | struct ieee80211softmac_network *network; |
| 402 | 412 | ||
| 413 | if (unlikely(!mac->running)) | ||
| 414 | return -ENODEV; | ||
| 415 | |||
| 403 | network = ieee80211softmac_get_network_by_bssid(mac, resp->header.addr3); | 416 | network = ieee80211softmac_get_network_by_bssid(mac, resp->header.addr3); |
| 404 | if (!network) { | 417 | if (!network) { |
| 405 | dprintkl(KERN_INFO PFX "reassoc request from unknown network\n"); | 418 | dprintkl(KERN_INFO PFX "reassoc request from unknown network\n"); |
diff --git a/net/ieee80211/softmac/ieee80211softmac_auth.c b/net/ieee80211/softmac/ieee80211softmac_auth.c index 9a0eac6c61eb..06e332624665 100644 --- a/net/ieee80211/softmac/ieee80211softmac_auth.c +++ b/net/ieee80211/softmac/ieee80211softmac_auth.c | |||
| @@ -86,6 +86,11 @@ ieee80211softmac_auth_queue(void *data) | |||
| 86 | 86 | ||
| 87 | /* Lock and set flags */ | 87 | /* Lock and set flags */ |
| 88 | spin_lock_irqsave(&mac->lock, flags); | 88 | spin_lock_irqsave(&mac->lock, flags); |
| 89 | if (unlikely(!mac->running)) { | ||
| 90 | /* Prevent reschedule on workqueue flush */ | ||
| 91 | spin_unlock_irqrestore(&mac->lock, flags); | ||
| 92 | return; | ||
| 93 | } | ||
| 89 | net->authenticated = 0; | 94 | net->authenticated = 0; |
| 90 | net->authenticating = 1; | 95 | net->authenticating = 1; |
| 91 | /* add a timeout call so we eventually give up waiting for an auth reply */ | 96 | /* add a timeout call so we eventually give up waiting for an auth reply */ |
| @@ -124,6 +129,9 @@ ieee80211softmac_auth_resp(struct net_device *dev, struct ieee80211_auth *auth) | |||
| 124 | unsigned long flags; | 129 | unsigned long flags; |
| 125 | u8 * data; | 130 | u8 * data; |
| 126 | 131 | ||
| 132 | if (unlikely(!mac->running)) | ||
| 133 | return -ENODEV; | ||
| 134 | |||
| 127 | /* Find correct auth queue item */ | 135 | /* Find correct auth queue item */ |
| 128 | spin_lock_irqsave(&mac->lock, flags); | 136 | spin_lock_irqsave(&mac->lock, flags); |
| 129 | list_for_each(list_ptr, &mac->auth_queue) { | 137 | list_for_each(list_ptr, &mac->auth_queue) { |
| @@ -298,8 +306,6 @@ ieee80211softmac_deauth_from_net(struct ieee80211softmac_device *mac, | |||
| 298 | 306 | ||
| 299 | /* can't transmit data right now... */ | 307 | /* can't transmit data right now... */ |
| 300 | netif_carrier_off(mac->dev); | 308 | netif_carrier_off(mac->dev); |
| 301 | /* let's try to re-associate */ | ||
| 302 | schedule_work(&mac->associnfo.work); | ||
| 303 | spin_unlock_irqrestore(&mac->lock, flags); | 309 | spin_unlock_irqrestore(&mac->lock, flags); |
| 304 | } | 310 | } |
| 305 | 311 | ||
| @@ -338,6 +344,9 @@ ieee80211softmac_deauth_resp(struct net_device *dev, struct ieee80211_deauth *de | |||
| 338 | struct ieee80211softmac_network *net = NULL; | 344 | struct ieee80211softmac_network *net = NULL; |
| 339 | struct ieee80211softmac_device *mac = ieee80211_priv(dev); | 345 | struct ieee80211softmac_device *mac = ieee80211_priv(dev); |
| 340 | 346 | ||
| 347 | if (unlikely(!mac->running)) | ||
| 348 | return -ENODEV; | ||
| 349 | |||
| 341 | if (!deauth) { | 350 | if (!deauth) { |
| 342 | dprintk("deauth without deauth packet. eek!\n"); | 351 | dprintk("deauth without deauth packet. eek!\n"); |
| 343 | return 0; | 352 | return 0; |
| @@ -360,5 +369,8 @@ ieee80211softmac_deauth_resp(struct net_device *dev, struct ieee80211_deauth *de | |||
| 360 | } | 369 | } |
| 361 | 370 | ||
| 362 | ieee80211softmac_deauth_from_net(mac, net); | 371 | ieee80211softmac_deauth_from_net(mac, net); |
| 372 | |||
| 373 | /* let's try to re-associate */ | ||
| 374 | schedule_work(&mac->associnfo.work); | ||
| 363 | return 0; | 375 | return 0; |
| 364 | } | 376 | } |
diff --git a/net/ieee80211/softmac/ieee80211softmac_module.c b/net/ieee80211/softmac/ieee80211softmac_module.c index be83bdc1644a..6252be2c0db9 100644 --- a/net/ieee80211/softmac/ieee80211softmac_module.c +++ b/net/ieee80211/softmac/ieee80211softmac_module.c | |||
| @@ -89,6 +89,8 @@ ieee80211softmac_clear_pending_work(struct ieee80211softmac_device *sm) | |||
| 89 | ieee80211softmac_wait_for_scan(sm); | 89 | ieee80211softmac_wait_for_scan(sm); |
| 90 | 90 | ||
| 91 | spin_lock_irqsave(&sm->lock, flags); | 91 | spin_lock_irqsave(&sm->lock, flags); |
| 92 | sm->running = 0; | ||
| 93 | |||
| 92 | /* Free all pending assoc work items */ | 94 | /* Free all pending assoc work items */ |
| 93 | cancel_delayed_work(&sm->associnfo.work); | 95 | cancel_delayed_work(&sm->associnfo.work); |
| 94 | 96 | ||
| @@ -204,6 +206,8 @@ void ieee80211softmac_start(struct net_device *dev) | |||
| 204 | assert(0); | 206 | assert(0); |
| 205 | if (mac->txrates_change) | 207 | if (mac->txrates_change) |
| 206 | mac->txrates_change(dev, change, &oldrates); | 208 | mac->txrates_change(dev, change, &oldrates); |
| 209 | |||
| 210 | mac->running = 1; | ||
| 207 | } | 211 | } |
| 208 | EXPORT_SYMBOL_GPL(ieee80211softmac_start); | 212 | EXPORT_SYMBOL_GPL(ieee80211softmac_start); |
| 209 | 213 | ||
diff --git a/net/ieee80211/softmac/ieee80211softmac_scan.c b/net/ieee80211/softmac/ieee80211softmac_scan.c index 2b9e7edfa3ce..d31cf77498c4 100644 --- a/net/ieee80211/softmac/ieee80211softmac_scan.c +++ b/net/ieee80211/softmac/ieee80211softmac_scan.c | |||
| @@ -115,7 +115,15 @@ void ieee80211softmac_scan(void *d) | |||
| 115 | // TODO: is this if correct, or should we do this only if scanning from assoc request? | 115 | // TODO: is this if correct, or should we do this only if scanning from assoc request? |
| 116 | if (sm->associnfo.req_essid.len) | 116 | if (sm->associnfo.req_essid.len) |
| 117 | ieee80211softmac_send_mgt_frame(sm, &sm->associnfo.req_essid, IEEE80211_STYPE_PROBE_REQ, 0); | 117 | ieee80211softmac_send_mgt_frame(sm, &sm->associnfo.req_essid, IEEE80211_STYPE_PROBE_REQ, 0); |
| 118 | |||
| 119 | spin_lock_irqsave(&sm->lock, flags); | ||
| 120 | if (unlikely(!sm->running)) { | ||
| 121 | /* Prevent reschedule on workqueue flush */ | ||
| 122 | spin_unlock_irqrestore(&sm->lock, flags); | ||
| 123 | break; | ||
| 124 | } | ||
| 118 | schedule_delayed_work(&si->softmac_scan, IEEE80211SOFTMAC_PROBE_DELAY); | 125 | schedule_delayed_work(&si->softmac_scan, IEEE80211SOFTMAC_PROBE_DELAY); |
| 126 | spin_unlock_irqrestore(&sm->lock, flags); | ||
| 119 | return; | 127 | return; |
| 120 | } else { | 128 | } else { |
| 121 | dprintk(PFX "Not probing Channel %d (not allowed here)\n", si->channels[current_channel_idx].channel); | 129 | dprintk(PFX "Not probing Channel %d (not allowed here)\n", si->channels[current_channel_idx].channel); |
