Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 26584
b: refs/heads/master
c: d57336e
h: refs/heads/master
v: v3
  • Loading branch information
Daniel Drake authored and John W. Linville committed May 5, 2006
1 parent d768eea commit c815b0f
Show file tree
Hide file tree
Showing 6 changed files with 41 additions and 4 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 995c99268e0b12eb3c8939211ba5368dd92d98d9
refs/heads/master: d57336e3f2dd7c2d1fbe4a8323029869fb6e1f00
3 changes: 2 additions & 1 deletion trunk/include/net/ieee80211softmac.h
Original file line number Diff line number Diff line change
Expand Up @@ -204,7 +204,8 @@ struct ieee80211softmac_device {

/* couple of flags */
u8 scanning:1, /* protects scanning from being done multiple times at once */
associated:1;
associated:1,
running:1;

struct ieee80211softmac_scaninfo *scaninfo;
struct ieee80211softmac_assoc_info associnfo;
Expand Down
17 changes: 15 additions & 2 deletions trunk/net/ieee80211/softmac/ieee80211softmac_assoc.c
Original file line number Diff line number Diff line change
Expand Up @@ -51,11 +51,12 @@ ieee80211softmac_assoc(struct ieee80211softmac_device *mac, struct ieee80211soft
spin_lock_irqsave(&mac->lock, flags);
mac->associnfo.associating = 1;
mac->associated = 0; /* just to make sure */
spin_unlock_irqrestore(&mac->lock, flags);

/* Set a timer for timeout */
/* FIXME: make timeout configurable */
schedule_delayed_work(&mac->associnfo.timeout, 5 * HZ);
if (likely(mac->running))
schedule_delayed_work(&mac->associnfo.timeout, 5 * HZ);
spin_unlock_irqrestore(&mac->lock, flags);
}

void
Expand Down Expand Up @@ -319,6 +320,9 @@ ieee80211softmac_handle_assoc_response(struct net_device * dev,
u16 status = le16_to_cpup(&resp->status);
struct ieee80211softmac_network *network = NULL;
unsigned long flags;

if (unlikely(!mac->running))
return -ENODEV;

spin_lock_irqsave(&mac->lock, flags);

Expand Down Expand Up @@ -377,10 +381,16 @@ ieee80211softmac_handle_disassoc(struct net_device * dev,
{
struct ieee80211softmac_device *mac = ieee80211_priv(dev);
unsigned long flags;

if (unlikely(!mac->running))
return -ENODEV;

if (memcmp(disassoc->header.addr2, mac->associnfo.bssid, ETH_ALEN))
return 0;

if (memcmp(disassoc->header.addr1, mac->dev->dev_addr, ETH_ALEN))
return 0;

dprintk(KERN_INFO PFX "got disassoc frame\n");
netif_carrier_off(dev);
spin_lock_irqsave(&mac->lock, flags);
Expand All @@ -400,6 +410,9 @@ ieee80211softmac_handle_reassoc_req(struct net_device * dev,
struct ieee80211softmac_device *mac = ieee80211_priv(dev);
struct ieee80211softmac_network *network;

if (unlikely(!mac->running))
return -ENODEV;

network = ieee80211softmac_get_network_by_bssid(mac, resp->header.addr3);
if (!network) {
dprintkl(KERN_INFO PFX "reassoc request from unknown network\n");
Expand Down
11 changes: 11 additions & 0 deletions trunk/net/ieee80211/softmac/ieee80211softmac_auth.c
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,11 @@ ieee80211softmac_auth_queue(void *data)

/* Lock and set flags */
spin_lock_irqsave(&mac->lock, flags);
if (unlikely(!mac->running)) {
/* Prevent reschedule on workqueue flush */
spin_unlock_irqrestore(&mac->lock, flags);
return;
}
net->authenticated = 0;
net->authenticating = 1;
/* add a timeout call so we eventually give up waiting for an auth reply */
Expand Down Expand Up @@ -124,6 +129,9 @@ ieee80211softmac_auth_resp(struct net_device *dev, struct ieee80211_auth *auth)
unsigned long flags;
u8 * data;

if (unlikely(!mac->running))
return -ENODEV;

/* Find correct auth queue item */
spin_lock_irqsave(&mac->lock, flags);
list_for_each(list_ptr, &mac->auth_queue) {
Expand Down Expand Up @@ -336,6 +344,9 @@ ieee80211softmac_deauth_resp(struct net_device *dev, struct ieee80211_deauth *de
struct ieee80211softmac_network *net = NULL;
struct ieee80211softmac_device *mac = ieee80211_priv(dev);

if (unlikely(!mac->running))
return -ENODEV;

if (!deauth) {
dprintk("deauth without deauth packet. eek!\n");
return 0;
Expand Down
4 changes: 4 additions & 0 deletions trunk/net/ieee80211/softmac/ieee80211softmac_module.c
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,8 @@ ieee80211softmac_clear_pending_work(struct ieee80211softmac_device *sm)
ieee80211softmac_wait_for_scan(sm);

spin_lock_irqsave(&sm->lock, flags);
sm->running = 0;

/* Free all pending assoc work items */
cancel_delayed_work(&sm->associnfo.work);

Expand Down Expand Up @@ -204,6 +206,8 @@ void ieee80211softmac_start(struct net_device *dev)
assert(0);
if (mac->txrates_change)
mac->txrates_change(dev, change, &oldrates);

mac->running = 1;
}
EXPORT_SYMBOL_GPL(ieee80211softmac_start);

Expand Down
8 changes: 8 additions & 0 deletions trunk/net/ieee80211/softmac/ieee80211softmac_scan.c
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,15 @@ void ieee80211softmac_scan(void *d)
// TODO: is this if correct, or should we do this only if scanning from assoc request?
if (sm->associnfo.req_essid.len)
ieee80211softmac_send_mgt_frame(sm, &sm->associnfo.req_essid, IEEE80211_STYPE_PROBE_REQ, 0);

spin_lock_irqsave(&sm->lock, flags);
if (unlikely(!sm->running)) {
/* Prevent reschedule on workqueue flush */
spin_unlock_irqrestore(&sm->lock, flags);
break;
}
schedule_delayed_work(&si->softmac_scan, IEEE80211SOFTMAC_PROBE_DELAY);
spin_unlock_irqrestore(&sm->lock, flags);
return;
} else {
dprintk(PFX "Not probing Channel %d (not allowed here)\n", si->channels[current_channel_idx].channel);
Expand Down

0 comments on commit c815b0f

Please sign in to comment.