Search Linux Wireless

Re: [PATCH] mac80211: eliminate IBSS warning in rate_lowest_index()

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

 



On Fri, 2008-06-13 at 16:50 +0200, Vladimir Koutny wrote:
> In IBSS mode prior to join/creation of new IBSS it is possible that
> a frame from unknown station is received and an ibss_add_sta() is
> called. This will cause a warning in rate_lowest_index() since the
> list of supported rates of our station is not initialized yet.
> 
> The fix is to add ibss stations with a rate we received that frame
> at; this single-element set will be extended later based on beacon
> data. Also there is no need to store stations from a foreign IBSS.

Looks sane to me, but I don't really test/understand the IBSS code.

> 
> Signed-off-by: Vladimir Koutny <vlado@xxxxxx>
> 
> ---
> 
> diff -Naur compat-wireless-2008-06-12-base/net/mac80211/ieee80211_i.h compat-wireless-2008-06-12/net/mac80211/ieee80211_i.h
> --- compat-wireless-2008-06-12-base/net/mac80211/ieee80211_i.h	2008-06-13 15:53:03.000000000 +0200
> +++ compat-wireless-2008-06-12/net/mac80211/ieee80211_i.h	2008-06-13 16:17:11.000000000 +0200
> @@ -886,7 +886,7 @@
>  int ieee80211_sta_set_extra_ie(struct net_device *dev, char *ie, size_t len);
>  struct sta_info *ieee80211_ibss_add_sta(struct net_device *dev,
>  					struct sk_buff *skb, u8 *bssid,
> -					u8 *addr);
> +					u8 *addr, u64 supp_rates);
>  int ieee80211_sta_deauthenticate(struct net_device *dev, u16 reason);
>  int ieee80211_sta_disassociate(struct net_device *dev, u16 reason);
>  void ieee80211_bss_info_change_notify(struct ieee80211_sub_if_data *sdata,
> diff -Naur compat-wireless-2008-06-12-base/net/mac80211/mlme.c compat-wireless-2008-06-12/net/mac80211/mlme.c
> --- compat-wireless-2008-06-12-base/net/mac80211/mlme.c	2008-06-13 15:52:54.000000000 +0200
> +++ compat-wireless-2008-06-12/net/mac80211/mlme.c	2008-06-13 16:18:24.000000000 +0200
> @@ -2863,7 +2863,8 @@
>  				       dev->name, print_mac(mac, mgmt->bssid));
>  			ieee80211_sta_join_ibss(dev, &sdata->u.sta, bss);
>  			ieee80211_ibss_add_sta(dev, NULL,
> -					       mgmt->bssid, mgmt->sa);
> +					       mgmt->bssid, mgmt->sa,
> +					       BIT(rx_status->rate_idx));
>  		}
>  	}
> 
> @@ -4307,12 +4308,13 @@
> 
>  struct sta_info *ieee80211_ibss_add_sta(struct net_device *dev,
>  					struct sk_buff *skb, u8 *bssid,
> -					u8 *addr)
> +					u8 *addr, u64 supp_rates)
>  {
>  	struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
>  	struct sta_info *sta;
>  	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
>  	DECLARE_MAC_BUF(mac);
> +	int band = local->hw.conf.channel->band;
> 
>  	/* TODO: Could consider removing the least recently used entry and
>  	 * allow new one to be added. */
> @@ -4324,6 +4326,9 @@
>  		return NULL;
>  	}
> 
> +	if (!ieee80211_bssid_match(bssid, sdata->u.sta.bssid))
> +		return NULL;
> +
>  	printk(KERN_DEBUG "%s: Adding new IBSS station %s (dev=%s)\n",
>  	       wiphy_name(local->hw.wiphy), print_mac(mac, addr), dev->name);
> 
> @@ -4333,8 +4338,10 @@
> 
>  	set_sta_flags(sta, WLAN_STA_AUTHORIZED);
> 
> -	sta->supp_rates[local->hw.conf.channel->band] =
> -		sdata->u.sta.supp_rates_bits[local->hw.conf.channel->band];
> +	if (supp_rates)
> +		sta->supp_rates[band] = supp_rates;
> +	else
> +		sta->supp_rates[band] = sdata->u.sta.supp_rates_bits[band];
> 
>  	rate_control_rate_init(sta, local);
> 
> diff -Naur compat-wireless-2008-06-12-base/net/mac80211/rx.c compat-wireless-2008-06-12/net/mac80211/rx.c
> --- compat-wireless-2008-06-12-base/net/mac80211/rx.c	2008-06-13 15:50:11.000000000 +0200
> +++ compat-wireless-2008-06-12/net/mac80211/rx.c	2008-06-13 16:17:11.000000000 +0200
> @@ -1846,8 +1846,13 @@
>  		if (!bssid)
>  			return 0;
>  		if ((rx->fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_MGMT &&
> -		    (rx->fc & IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_BEACON)
> +		    (rx->fc & IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_BEACON) {
> +			if (!rx->sta)
> +				rx->sta = ieee80211_ibss_add_sta(sdata->dev,
> +						rx->skb, bssid, hdr->addr2,
> +						BIT(rx->status->rate_idx));
>  			return 1;
> +		}
>  		else if (!ieee80211_bssid_match(bssid, sdata->u.sta.bssid)) {
>  			if (!(rx->flags & IEEE80211_RX_IN_SCAN))
>  				return 0;
> @@ -1860,7 +1865,8 @@
>  			rx->flags &= ~IEEE80211_RX_RA_MATCH;
>  		} else if (!rx->sta)
>  			rx->sta = ieee80211_ibss_add_sta(sdata->dev, rx->skb,
> -							 bssid, hdr->addr2);
> +						bssid, hdr->addr2,
> +						BIT(rx->status->rate_idx));
>  		break;
>  	case IEEE80211_IF_TYPE_MESH_POINT:
>  		if (!multicast &&
> 
> 

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