mac80211: notify driver about IBSS status

Some drivers (e.g. iwlwifi) need to know and try
to figure it out based on other things, but making
it explicit is definitely better.

Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
Johannes Berg 2010-04-28 17:40:43 +02:00 committed by John W. Linville
parent 76f2736401
commit 8fc214ba95
2 changed files with 10 additions and 2 deletions

View File

@ -145,6 +145,7 @@ struct ieee80211_low_level_stats {
* @BSS_CHANGED_BEACON_ENABLED: Beaconing should be * @BSS_CHANGED_BEACON_ENABLED: Beaconing should be
* enabled/disabled (beaconing modes) * enabled/disabled (beaconing modes)
* @BSS_CHANGED_CQM: Connection quality monitor config changed * @BSS_CHANGED_CQM: Connection quality monitor config changed
* @BSS_CHANGED_IBSS: IBSS join status changed
*/ */
enum ieee80211_bss_change { enum ieee80211_bss_change {
BSS_CHANGED_ASSOC = 1<<0, BSS_CHANGED_ASSOC = 1<<0,
@ -158,6 +159,7 @@ enum ieee80211_bss_change {
BSS_CHANGED_BEACON = 1<<8, BSS_CHANGED_BEACON = 1<<8,
BSS_CHANGED_BEACON_ENABLED = 1<<9, BSS_CHANGED_BEACON_ENABLED = 1<<9,
BSS_CHANGED_CQM = 1<<10, BSS_CHANGED_CQM = 1<<10,
BSS_CHANGED_IBSS = 1<<11,
}; };
/** /**
@ -167,6 +169,8 @@ enum ieee80211_bss_change {
* to that BSS) that can change during the lifetime of the BSS. * to that BSS) that can change during the lifetime of the BSS.
* *
* @assoc: association status * @assoc: association status
* @ibss_joined: indicates whether this station is part of an IBSS
* or not
* @aid: association ID number, valid only when @assoc is true * @aid: association ID number, valid only when @assoc is true
* @use_cts_prot: use CTS protection * @use_cts_prot: use CTS protection
* @use_short_preamble: use 802.11b short preamble; * @use_short_preamble: use 802.11b short preamble;
@ -194,7 +198,7 @@ enum ieee80211_bss_change {
struct ieee80211_bss_conf { struct ieee80211_bss_conf {
const u8 *bssid; const u8 *bssid;
/* association related data */ /* association related data */
bool assoc; bool assoc, ibss_joined;
u16 aid; u16 aid;
/* erp related data */ /* erp related data */
bool use_cts_prot; bool use_cts_prot;

View File

@ -170,6 +170,8 @@ static void __ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
bss_change |= BSS_CHANGED_BSSID; bss_change |= BSS_CHANGED_BSSID;
bss_change |= BSS_CHANGED_BEACON; bss_change |= BSS_CHANGED_BEACON;
bss_change |= BSS_CHANGED_BEACON_ENABLED; bss_change |= BSS_CHANGED_BEACON_ENABLED;
bss_change |= BSS_CHANGED_IBSS;
sdata->vif.bss_conf.ibss_joined = true;
ieee80211_bss_info_change_notify(sdata, bss_change); ieee80211_bss_info_change_notify(sdata, bss_change);
ieee80211_sta_def_wmm_params(sdata, sband->n_bitrates, supp_rates); ieee80211_sta_def_wmm_params(sdata, sband->n_bitrates, supp_rates);
@ -950,7 +952,9 @@ int ieee80211_ibss_leave(struct ieee80211_sub_if_data *sdata)
kfree(sdata->u.ibss.ie); kfree(sdata->u.ibss.ie);
skb = sdata->u.ibss.presp; skb = sdata->u.ibss.presp;
rcu_assign_pointer(sdata->u.ibss.presp, NULL); rcu_assign_pointer(sdata->u.ibss.presp, NULL);
ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BEACON_ENABLED); sdata->vif.bss_conf.ibss_joined = false;
ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BEACON_ENABLED |
BSS_CHANGED_IBSS);
synchronize_rcu(); synchronize_rcu();
kfree_skb(skb); kfree_skb(skb);