Skip to content

Commit

Permalink
mac80211: introduce a new scan state "decision"
Browse files Browse the repository at this point in the history
Introduce a new scan state "decision" which is entered after
every completed scan operation and decides about the next steps.
At first the decision is in any case to scan the next channel.
This shouldn't introduce any functional changes.

Signed-off-by: Helmut Schaa <helmut.schaa@googlemail.com>
Acked-by: Johannes Berg <johannes@sipsolutions.net>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
  • Loading branch information
Helmut Schaa authored and John W. Linville committed Jul 27, 2009
1 parent f502d09 commit 2fb3f02
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 15 deletions.
2 changes: 1 addition & 1 deletion net/mac80211/ieee80211_i.h
Original file line number Diff line number Diff line change
Expand Up @@ -678,7 +678,7 @@ struct ieee80211_local {
int scan_channel_idx;
int scan_ies_len;

enum { SCAN_SET_CHANNEL, SCAN_SEND_PROBE } scan_state;
enum { SCAN_DECISION, SCAN_SET_CHANNEL, SCAN_SEND_PROBE } scan_state;
struct delayed_work scan_work;
struct ieee80211_sub_if_data *scan_sdata;
enum nl80211_channel_type oper_channel_type;
Expand Down
40 changes: 26 additions & 14 deletions net/mac80211/scan.c
Original file line number Diff line number Diff line change
Expand Up @@ -376,7 +376,7 @@ static int ieee80211_start_sw_scan(struct ieee80211_local *local)
}
mutex_unlock(&local->iflist_mtx);

local->scan_state = SCAN_SET_CHANNEL;
local->scan_state = SCAN_DECISION;
local->scan_channel_idx = 0;

spin_lock_bh(&local->filter_lock);
Expand Down Expand Up @@ -474,18 +474,27 @@ static int __ieee80211_start_scan(struct ieee80211_sub_if_data *sdata,
return rc;
}

static int ieee80211_scan_state_set_channel(struct ieee80211_local *local,
unsigned long *next_delay)
static int ieee80211_scan_state_decision(struct ieee80211_local *local,
unsigned long *next_delay)
{
int skip;
struct ieee80211_channel *chan;
struct ieee80211_sub_if_data *sdata = local->scan_sdata;

/* if no more bands/channels left, complete scan */
if (local->scan_channel_idx >= local->scan_req->n_channels) {
ieee80211_scan_completed(&local->hw, false);
return 1;
}

*next_delay = 0;
local->scan_state = SCAN_SET_CHANNEL;
return 0;
}

static void ieee80211_scan_state_set_channel(struct ieee80211_local *local,
unsigned long *next_delay)
{
int skip;
struct ieee80211_channel *chan;
struct ieee80211_sub_if_data *sdata = local->scan_sdata;

skip = 0;
chan = local->scan_req->channels[local->scan_channel_idx];

Expand All @@ -505,7 +514,7 @@ static int ieee80211_scan_state_set_channel(struct ieee80211_local *local,
local->scan_channel_idx++;

if (skip)
return 0;
return;

/*
* Probe delay is used to update the NAV, cf. 11.1.3.2.2
Expand All @@ -520,13 +529,13 @@ static int ieee80211_scan_state_set_channel(struct ieee80211_local *local,
if (chan->flags & IEEE80211_CHAN_PASSIVE_SCAN ||
!local->scan_req->n_ssids) {
*next_delay = IEEE80211_PASSIVE_CHANNEL_TIME;
return 0;
local->scan_state = SCAN_DECISION;
return;
}

/* active scan, send probes */
*next_delay = IEEE80211_PROBE_DELAY;
local->scan_state = SCAN_SEND_PROBE;

return 0;
}

static void ieee80211_scan_state_send_probe(struct ieee80211_local *local,
Expand All @@ -547,7 +556,7 @@ static void ieee80211_scan_state_send_probe(struct ieee80211_local *local,
* on the channel.
*/
*next_delay = IEEE80211_CHANNEL_TIME;
local->scan_state = SCAN_SET_CHANNEL;
local->scan_state = SCAN_DECISION;
}

void ieee80211_scan_work(struct work_struct *work)
Expand Down Expand Up @@ -593,10 +602,13 @@ void ieee80211_scan_work(struct work_struct *work)
*/
do {
switch (local->scan_state) {
case SCAN_SET_CHANNEL:
if (ieee80211_scan_state_set_channel(local, &next_delay))
case SCAN_DECISION:
if (ieee80211_scan_state_decision(local, &next_delay))
return;
break;
case SCAN_SET_CHANNEL:
ieee80211_scan_state_set_channel(local, &next_delay);
break;
case SCAN_SEND_PROBE:
ieee80211_scan_state_send_probe(local, &next_delay);
break;
Expand Down

0 comments on commit 2fb3f02

Please sign in to comment.