mac80211: proper bss private data handling
cfg80211 offers private data for each BSS struct, which mac80211 uses. However, mac80211 uses internal and external (cfg80211) BSS pointers interchangeably and has a hack to put the cfg80211 bss struct into the private struct. Remove this hack, properly converting between the pointers wherever necessary. Signed-off-by: Johannes Berg <johannes@sipsolutions.net> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
committed by
John W. Linville
parent
8e664fb3fd
commit
0c1ad2cac1
@@ -187,15 +187,17 @@ static void __ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
|
||||
static void ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
|
||||
struct ieee80211_bss *bss)
|
||||
{
|
||||
struct cfg80211_bss *cbss =
|
||||
container_of((void *)bss, struct cfg80211_bss, priv);
|
||||
struct ieee80211_supported_band *sband;
|
||||
u32 basic_rates;
|
||||
int i, j;
|
||||
u16 beacon_int = bss->cbss.beacon_interval;
|
||||
u16 beacon_int = cbss->beacon_interval;
|
||||
|
||||
if (beacon_int < 10)
|
||||
beacon_int = 10;
|
||||
|
||||
sband = sdata->local->hw.wiphy->bands[bss->cbss.channel->band];
|
||||
sband = sdata->local->hw.wiphy->bands[cbss->channel->band];
|
||||
|
||||
basic_rates = 0;
|
||||
|
||||
@@ -212,12 +214,12 @@ static void ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
|
||||
}
|
||||
}
|
||||
|
||||
__ieee80211_sta_join_ibss(sdata, bss->cbss.bssid,
|
||||
__ieee80211_sta_join_ibss(sdata, cbss->bssid,
|
||||
beacon_int,
|
||||
bss->cbss.channel,
|
||||
cbss->channel,
|
||||
basic_rates,
|
||||
bss->cbss.capability,
|
||||
bss->cbss.tsf);
|
||||
cbss->capability,
|
||||
cbss->tsf);
|
||||
}
|
||||
|
||||
static void ieee80211_rx_bss_info(struct ieee80211_sub_if_data *sdata,
|
||||
@@ -229,6 +231,7 @@ static void ieee80211_rx_bss_info(struct ieee80211_sub_if_data *sdata,
|
||||
{
|
||||
struct ieee80211_local *local = sdata->local;
|
||||
int freq;
|
||||
struct cfg80211_bss *cbss;
|
||||
struct ieee80211_bss *bss;
|
||||
struct sta_info *sta;
|
||||
struct ieee80211_channel *channel;
|
||||
@@ -283,8 +286,10 @@ static void ieee80211_rx_bss_info(struct ieee80211_sub_if_data *sdata,
|
||||
if (!bss)
|
||||
return;
|
||||
|
||||
cbss = container_of((void *)bss, struct cfg80211_bss, priv);
|
||||
|
||||
/* was just updated in ieee80211_bss_info_update */
|
||||
beacon_timestamp = bss->cbss.tsf;
|
||||
beacon_timestamp = cbss->tsf;
|
||||
|
||||
/* check if we need to merge IBSS */
|
||||
|
||||
@@ -297,11 +302,11 @@ static void ieee80211_rx_bss_info(struct ieee80211_sub_if_data *sdata,
|
||||
goto put_bss;
|
||||
|
||||
/* not an IBSS */
|
||||
if (!(bss->cbss.capability & WLAN_CAPABILITY_IBSS))
|
||||
if (!(cbss->capability & WLAN_CAPABILITY_IBSS))
|
||||
goto put_bss;
|
||||
|
||||
/* different channel */
|
||||
if (bss->cbss.channel != local->oper_channel)
|
||||
if (cbss->channel != local->oper_channel)
|
||||
goto put_bss;
|
||||
|
||||
/* different SSID */
|
||||
@@ -311,7 +316,7 @@ static void ieee80211_rx_bss_info(struct ieee80211_sub_if_data *sdata,
|
||||
goto put_bss;
|
||||
|
||||
/* same BSSID */
|
||||
if (memcmp(bss->cbss.bssid, sdata->u.ibss.bssid, ETH_ALEN) == 0)
|
||||
if (memcmp(cbss->bssid, sdata->u.ibss.bssid, ETH_ALEN) == 0)
|
||||
goto put_bss;
|
||||
|
||||
if (rx_status->flag & RX_FLAG_TSFT) {
|
||||
@@ -514,7 +519,7 @@ static void ieee80211_sta_find_ibss(struct ieee80211_sub_if_data *sdata)
|
||||
{
|
||||
struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
|
||||
struct ieee80211_local *local = sdata->local;
|
||||
struct ieee80211_bss *bss;
|
||||
struct cfg80211_bss *cbss;
|
||||
struct ieee80211_channel *chan = NULL;
|
||||
const u8 *bssid = NULL;
|
||||
int active_ibss;
|
||||
@@ -538,21 +543,23 @@ static void ieee80211_sta_find_ibss(struct ieee80211_sub_if_data *sdata)
|
||||
chan = ifibss->channel;
|
||||
if (!is_zero_ether_addr(ifibss->bssid))
|
||||
bssid = ifibss->bssid;
|
||||
bss = (void *)cfg80211_get_bss(local->hw.wiphy, chan, bssid,
|
||||
ifibss->ssid, ifibss->ssid_len,
|
||||
WLAN_CAPABILITY_IBSS |
|
||||
WLAN_CAPABILITY_PRIVACY,
|
||||
capability);
|
||||
cbss = cfg80211_get_bss(local->hw.wiphy, chan, bssid,
|
||||
ifibss->ssid, ifibss->ssid_len,
|
||||
WLAN_CAPABILITY_IBSS | WLAN_CAPABILITY_PRIVACY,
|
||||
capability);
|
||||
|
||||
if (bss) {
|
||||
if (cbss) {
|
||||
struct ieee80211_bss *bss;
|
||||
|
||||
bss = (void *)cbss->priv;
|
||||
#ifdef CONFIG_MAC80211_IBSS_DEBUG
|
||||
printk(KERN_DEBUG " sta_find_ibss: selected %pM current "
|
||||
"%pM\n", bss->cbss.bssid, ifibss->bssid);
|
||||
"%pM\n", cbss->bssid, ifibss->bssid);
|
||||
#endif /* CONFIG_MAC80211_IBSS_DEBUG */
|
||||
|
||||
printk(KERN_DEBUG "%s: Selected IBSS BSSID %pM"
|
||||
" based on configured SSID\n",
|
||||
sdata->name, bss->cbss.bssid);
|
||||
sdata->name, cbss->bssid);
|
||||
|
||||
ieee80211_sta_join_ibss(sdata, bss);
|
||||
ieee80211_rx_bss_put(local, bss);
|
||||
|
Reference in New Issue
Block a user