Search Linux Wireless

Re: [PATCH 2/2] ath9k: always set common->macaddr to the MAC adress of a virtual interface

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

 



On Tue, Apr 16, 2013 at 12:51:57PM +0200, Felix Fietkau wrote:
> In some cases it can be useful to change the MAC address of a virtual
> interface to something that's completely different from the EEPROM
> stored MAC address. In this case it is a bad idea to use the EEPROM MAC
> address for calculating the BSSID mask, as that would make it too wide.
> 
> In one case a few devices have been observed to send ACKs for many
> packets on the channel not directed at them, which results in a neat
> Denial of Service attack on the channel.

This was really giving me a hard time. Thanks a lot for finding the cause
and fixing that. :)

Cheers,
	Simon
> 
> Signed-off-by: Felix Fietkau <nbd@xxxxxxxxxxx>
> ---
>  drivers/net/wireless/ath/ath9k/ath9k.h | 7 +++----
>  drivers/net/wireless/ath/ath9k/main.c  | 9 +++++++--
>  2 files changed, 10 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/net/wireless/ath/ath9k/ath9k.h b/drivers/net/wireless/ath/ath9k/ath9k.h
> index 86d3572..1915f12 100644
> --- a/drivers/net/wireless/ath/ath9k/ath9k.h
> +++ b/drivers/net/wireless/ath/ath9k/ath9k.h
> @@ -658,11 +658,10 @@ enum sc_op_flags {
>  struct ath_rate_table;
>  
>  struct ath9k_vif_iter_data {
> -	const u8 *hw_macaddr; /* phy's hardware address, set
> -			       * before starting iteration for
> -			       * valid bssid mask.
> -			       */
> +	u8 hw_macaddr[ETH_ALEN]; /* address of the first vif */
>  	u8 mask[ETH_ALEN]; /* bssid mask */
> +	bool has_hw_macaddr;
> +
>  	int naps;      /* number of AP vifs */
>  	int nmeshes;   /* number of mesh vifs */
>  	int nstations; /* number of station vifs */
> diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c
> index a383483..6963862 100644
> --- a/drivers/net/wireless/ath/ath9k/main.c
> +++ b/drivers/net/wireless/ath/ath9k/main.c
> @@ -839,10 +839,14 @@ static void ath9k_vif_iter(void *data, u8 *mac, struct ieee80211_vif *vif)
>  	struct ath9k_vif_iter_data *iter_data = data;
>  	int i;
>  
> -	if (iter_data->hw_macaddr)
> +	if (iter_data->has_hw_macaddr) {
>  		for (i = 0; i < ETH_ALEN; i++)
>  			iter_data->mask[i] &=
>  				~(iter_data->hw_macaddr[i] ^ mac[i]);
> +	} else {
> +		memcpy(iter_data->hw_macaddr, mac, ETH_ALEN);
> +		iter_data->has_hw_macaddr = true;
> +	}
>  
>  	switch (vif->type) {
>  	case NL80211_IFTYPE_AP:
> @@ -891,7 +895,6 @@ void ath9k_calculate_iter_data(struct ieee80211_hw *hw,
>  	 * together with the BSSID mask when matching addresses.
>  	 */
>  	memset(iter_data, 0, sizeof(*iter_data));
> -	iter_data->hw_macaddr = common->macaddr;
>  	memset(&iter_data->mask, 0xff, ETH_ALEN);
>  
>  	if (vif)
> @@ -901,6 +904,8 @@ void ath9k_calculate_iter_data(struct ieee80211_hw *hw,
>  	ieee80211_iterate_active_interfaces_atomic(
>  		sc->hw, IEEE80211_IFACE_ITER_RESUME_ALL,
>  		ath9k_vif_iter, iter_data);
> +
> +	memcpy(common->macaddr, iter_data->hw_macaddr, ETH_ALEN);
>  }
>  
>  /* Called with sc->mutex held. */
> -- 
> 1.8.0.2
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

Attachment: signature.asc
Description: Digital signature


[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Wireless Personal Area Network]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite Hiking]     [MIPS Linux]     [ARM Linux]     [Linux RAID]

  Powered by Linux