mirror of
https://github.com/torvalds/linux.git
synced 2024-11-01 01:31:44 +00:00
mac80211: introduce a new scan state "decision"
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>
This commit is contained in:
parent
f502d09b75
commit
2fb3f028a9
@ -678,7 +678,7 @@ struct ieee80211_local {
|
|||||||
int scan_channel_idx;
|
int scan_channel_idx;
|
||||||
int scan_ies_len;
|
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 delayed_work scan_work;
|
||||||
struct ieee80211_sub_if_data *scan_sdata;
|
struct ieee80211_sub_if_data *scan_sdata;
|
||||||
enum nl80211_channel_type oper_channel_type;
|
enum nl80211_channel_type oper_channel_type;
|
||||||
|
@ -376,7 +376,7 @@ static int ieee80211_start_sw_scan(struct ieee80211_local *local)
|
|||||||
}
|
}
|
||||||
mutex_unlock(&local->iflist_mtx);
|
mutex_unlock(&local->iflist_mtx);
|
||||||
|
|
||||||
local->scan_state = SCAN_SET_CHANNEL;
|
local->scan_state = SCAN_DECISION;
|
||||||
local->scan_channel_idx = 0;
|
local->scan_channel_idx = 0;
|
||||||
|
|
||||||
spin_lock_bh(&local->filter_lock);
|
spin_lock_bh(&local->filter_lock);
|
||||||
@ -474,18 +474,27 @@ static int __ieee80211_start_scan(struct ieee80211_sub_if_data *sdata,
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ieee80211_scan_state_set_channel(struct ieee80211_local *local,
|
static int ieee80211_scan_state_decision(struct ieee80211_local *local,
|
||||||
unsigned long *next_delay)
|
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 no more bands/channels left, complete scan */
|
||||||
if (local->scan_channel_idx >= local->scan_req->n_channels) {
|
if (local->scan_channel_idx >= local->scan_req->n_channels) {
|
||||||
ieee80211_scan_completed(&local->hw, false);
|
ieee80211_scan_completed(&local->hw, false);
|
||||||
return 1;
|
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;
|
skip = 0;
|
||||||
chan = local->scan_req->channels[local->scan_channel_idx];
|
chan = local->scan_req->channels[local->scan_channel_idx];
|
||||||
|
|
||||||
@ -505,7 +514,7 @@ static int ieee80211_scan_state_set_channel(struct ieee80211_local *local,
|
|||||||
local->scan_channel_idx++;
|
local->scan_channel_idx++;
|
||||||
|
|
||||||
if (skip)
|
if (skip)
|
||||||
return 0;
|
return;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Probe delay is used to update the NAV, cf. 11.1.3.2.2
|
* Probe delay is used to update the NAV, cf. 11.1.3.2.2
|
||||||
@ -520,13 +529,13 @@ static int ieee80211_scan_state_set_channel(struct ieee80211_local *local,
|
|||||||
if (chan->flags & IEEE80211_CHAN_PASSIVE_SCAN ||
|
if (chan->flags & IEEE80211_CHAN_PASSIVE_SCAN ||
|
||||||
!local->scan_req->n_ssids) {
|
!local->scan_req->n_ssids) {
|
||||||
*next_delay = IEEE80211_PASSIVE_CHANNEL_TIME;
|
*next_delay = IEEE80211_PASSIVE_CHANNEL_TIME;
|
||||||
return 0;
|
local->scan_state = SCAN_DECISION;
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* active scan, send probes */
|
||||||
*next_delay = IEEE80211_PROBE_DELAY;
|
*next_delay = IEEE80211_PROBE_DELAY;
|
||||||
local->scan_state = SCAN_SEND_PROBE;
|
local->scan_state = SCAN_SEND_PROBE;
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ieee80211_scan_state_send_probe(struct ieee80211_local *local,
|
static void ieee80211_scan_state_send_probe(struct ieee80211_local *local,
|
||||||
@ -547,7 +556,7 @@ static void ieee80211_scan_state_send_probe(struct ieee80211_local *local,
|
|||||||
* on the channel.
|
* on the channel.
|
||||||
*/
|
*/
|
||||||
*next_delay = IEEE80211_CHANNEL_TIME;
|
*next_delay = IEEE80211_CHANNEL_TIME;
|
||||||
local->scan_state = SCAN_SET_CHANNEL;
|
local->scan_state = SCAN_DECISION;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ieee80211_scan_work(struct work_struct *work)
|
void ieee80211_scan_work(struct work_struct *work)
|
||||||
@ -593,10 +602,13 @@ void ieee80211_scan_work(struct work_struct *work)
|
|||||||
*/
|
*/
|
||||||
do {
|
do {
|
||||||
switch (local->scan_state) {
|
switch (local->scan_state) {
|
||||||
case SCAN_SET_CHANNEL:
|
case SCAN_DECISION:
|
||||||
if (ieee80211_scan_state_set_channel(local, &next_delay))
|
if (ieee80211_scan_state_decision(local, &next_delay))
|
||||||
return;
|
return;
|
||||||
break;
|
break;
|
||||||
|
case SCAN_SET_CHANNEL:
|
||||||
|
ieee80211_scan_state_set_channel(local, &next_delay);
|
||||||
|
break;
|
||||||
case SCAN_SEND_PROBE:
|
case SCAN_SEND_PROBE:
|
||||||
ieee80211_scan_state_send_probe(local, &next_delay);
|
ieee80211_scan_state_send_probe(local, &next_delay);
|
||||||
break;
|
break;
|
||||||
|
Loading…
Reference in New Issue
Block a user