Search Linux Wireless

Re: [PATCH] mac80211: Free current bss information in few places where we don't need it any more

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, 2009-02-04 at 18:28 +0530, Vasanthakumar Thiagarajan wrote:
> Signed-off-by: Vasanthakumar Thiagarajan <vasanth@xxxxxxxxxxx>

Looks good to me.

Acked-by: Johannes Berg <johannes@xxxxxxxxxxxxxxxx>

> ---
>  net/mac80211/ieee80211_i.h |    2 ++
>  net/mac80211/mlme.c        |   38 +++++++++++++++++++++-----------------
>  net/mac80211/scan.c        |   13 +++++++++++++
>  3 files changed, 36 insertions(+), 17 deletions(-)
> 
> diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h
> index eaf3603..5a1f19a 100644
> --- a/net/mac80211/ieee80211_i.h
> +++ b/net/mac80211/ieee80211_i.h
> @@ -955,6 +955,8 @@ ieee80211_rx_bss_get(struct ieee80211_local *local, u8 *bssid, int freq,
>  		     u8 *ssid, u8 ssid_len);
>  void ieee80211_rx_bss_put(struct ieee80211_local *local,
>  			  struct ieee80211_bss *bss);
> +void ieee80211_rx_bss_remove(struct ieee80211_sub_if_data *sdata, u8 *bssid,
> +			     int freq, u8 *ssid, u8 ssid_len);
>  
>  /* interface handling */
>  int ieee80211_if_add(struct ieee80211_local *local, const char *name,
> diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c
> index 57967d3..91c9a5a 100644
> --- a/net/mac80211/mlme.c
> +++ b/net/mac80211/mlme.c
> @@ -840,6 +840,14 @@ static void ieee80211_direct_probe(struct ieee80211_sub_if_data *sdata,
>  		       sdata->dev->name, ifsta->bssid);
>  		ifsta->state = IEEE80211_STA_MLME_DISABLED;
>  		ieee80211_sta_send_apinfo(sdata, ifsta);
> +
> +		/*
> +		 * Most likely AP is not in the range so remove the
> +		 * bss information associated to the AP
> +		 */
> +		ieee80211_rx_bss_remove(sdata, ifsta->bssid,
> +				sdata->local->hw.conf.channel->center_freq,
> +				ifsta->ssid, ifsta->ssid_len);
>  		return;
>  	}
>  
> @@ -871,6 +879,9 @@ static void ieee80211_authenticate(struct ieee80211_sub_if_data *sdata,
>  		       sdata->dev->name, ifsta->bssid);
>  		ifsta->state = IEEE80211_STA_MLME_DISABLED;
>  		ieee80211_sta_send_apinfo(sdata, ifsta);
> +		ieee80211_rx_bss_remove(sdata, ifsta->bssid,
> +				sdata->local->hw.conf.channel->center_freq,
> +				ifsta->ssid, ifsta->ssid_len);
>  		return;
>  	}
>  
> @@ -933,8 +944,12 @@ static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata,
>  
>  	ieee80211_sta_send_apinfo(sdata, ifsta);
>  
> -	if (self_disconnected || reason == WLAN_REASON_DISASSOC_STA_HAS_LEFT)
> +	if (self_disconnected || reason == WLAN_REASON_DISASSOC_STA_HAS_LEFT) {
>  		ifsta->state = IEEE80211_STA_MLME_DISABLED;
> +		ieee80211_rx_bss_remove(sdata, ifsta->bssid,
> +				sdata->local->hw.conf.channel->center_freq,
> +				ifsta->ssid, ifsta->ssid_len);
> +	}
>  
>  	rcu_read_unlock();
>  
> @@ -1017,6 +1032,9 @@ static void ieee80211_associate(struct ieee80211_sub_if_data *sdata,
>  		       sdata->dev->name, ifsta->bssid);
>  		ifsta->state = IEEE80211_STA_MLME_DISABLED;
>  		ieee80211_sta_send_apinfo(sdata, ifsta);
> +		ieee80211_rx_bss_remove(sdata, ifsta->bssid,
> +				sdata->local->hw.conf.channel->center_freq,
> +				ifsta->ssid, ifsta->ssid_len);
>  		return;
>  	}
>  
> @@ -1042,7 +1060,6 @@ static void ieee80211_associated(struct ieee80211_sub_if_data *sdata,
>  	struct ieee80211_local *local = sdata->local;
>  	struct sta_info *sta;
>  	int disassoc;
> -	bool remove_bss = false;
>  
>  	/* TODO: start monitoring current AP signal quality and number of
>  	 * missed beacons. Scan other channels every now and then and search
> @@ -1068,7 +1085,6 @@ static void ieee80211_associated(struct ieee80211_sub_if_data *sdata,
>  				       "range\n",
>  				       sdata->dev->name, ifsta->bssid);
>  				disassoc = 1;
> -				remove_bss = true;
>  			} else
>  				ieee80211_send_probe_req(sdata, ifsta->bssid,
>  							 ifsta->ssid,
> @@ -1088,24 +1104,12 @@ static void ieee80211_associated(struct ieee80211_sub_if_data *sdata,
>  
>  	rcu_read_unlock();
>  
> -	if (disassoc) {
> +	if (disassoc)
>  		ieee80211_set_disassoc(sdata, ifsta, true, true,
>  					WLAN_REASON_PREV_AUTH_NOT_VALID);
> -		if (remove_bss) {
> -			struct ieee80211_bss *bss;
> -
> -			bss = ieee80211_rx_bss_get(local, ifsta->bssid,
> -					local->hw.conf.channel->center_freq,
> -					ifsta->ssid, ifsta->ssid_len);
> -			if (bss) {
> -				atomic_dec(&bss->users);
> -				ieee80211_rx_bss_put(local, bss);
> -			}
> -		}
> -	} else {
> +	else
>  		mod_timer(&ifsta->timer, jiffies +
>  				      IEEE80211_MONITORING_INTERVAL);
> -	}
>  }
>  
> 
> diff --git a/net/mac80211/scan.c b/net/mac80211/scan.c
> index 282e6a0..50719ea 100644
> --- a/net/mac80211/scan.c
> +++ b/net/mac80211/scan.c
> @@ -327,6 +327,19 @@ ieee80211_bss_info_update(struct ieee80211_local *local,
>  	return bss;
>  }
>  
> +void ieee80211_rx_bss_remove(struct ieee80211_sub_if_data *sdata, u8 *bssid,
> +			     int freq, u8 *ssid, u8 ssid_len)
> +{
> +	struct ieee80211_bss *bss;
> +	struct ieee80211_local *local = sdata->local;
> +
> +	bss = ieee80211_rx_bss_get(local, bssid, freq, ssid, ssid_len);
> +	if (bss) {
> +		atomic_dec(&bss->users);
> +		ieee80211_rx_bss_put(local, bss);
> +	}
> +}
> +
>  ieee80211_rx_result
>  ieee80211_scan_rx(struct ieee80211_sub_if_data *sdata, struct sk_buff *skb,
>  		  struct ieee80211_rx_status *rx_status)

Attachment: signature.asc
Description: This is a digitally signed message part


[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Device Mapper]
  Powered by Linux