Search Linux Wireless

Re: [PATCH] mac80211: fix rx data handling for non-data frames on multiple vifs

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

 



On Fri, 2010-01-22 at 00:36 +0100, Felix Fietkau wrote:

> Fix this by restructuring the loop so that it prepares the rx data just
> before making the skb copy and calling the rx handlers.
> 
> Cc: stable@xxxxxxxxxx
> Signed-off-by: Felix Fietkau <nbd@xxxxxxxxxxx>
> ---
> --- a/net/mac80211/rx.c
> +++ b/net/mac80211/rx.c
> @@ -2348,22 +2348,6 @@ static void __ieee80211_rx_handle_packet
>  			    sdata->vif.type == NL80211_IFTYPE_AP_VLAN)
>  				continue;
>  
> -			rx.sta = sta_info_get(sdata, hdr->addr2);
> -
> -			rx.flags |= IEEE80211_RX_RA_MATCH;
> -			prepares = prepare_for_handlers(sdata, &rx, hdr);
> -
> -			if (!prepares)
> -				continue;
> -
> -			if (status->flag & RX_FLAG_MMIC_ERROR) {
> -				rx.sdata = sdata;
> -				if (rx.flags & IEEE80211_RX_RA_MATCH)
> -					ieee80211_rx_michael_mic_report(hdr,
> -									&rx);
> -				continue;
> -			}
> -
>  			/*
>  			 * frame is destined for this interface, but if it's
>  			 * not also for the previous one we handle that after
> @@ -2375,6 +2359,22 @@ static void __ieee80211_rx_handle_packet
>  				continue;
>  			}
>  
> +			rx.sta = sta_info_get(prev, hdr->addr2);
> +
> +			rx.flags |= IEEE80211_RX_RA_MATCH;
> +			prepares = prepare_for_handlers(prev, &rx, hdr);
> +
> +			if (!prepares)
> +				goto next;
> +
> +			if (status->flag & RX_FLAG_MMIC_ERROR) {
> +				rx.sdata = prev;
> +				if (rx.flags & IEEE80211_RX_RA_MATCH)
> +					ieee80211_rx_michael_mic_report(hdr,
> +									&rx);
> +				goto next;
> +			}
> +
>  			/*
>  			 * frame was destined for the previous interface
>  			 * so invoke RX handlers for it
> @@ -2387,11 +2387,22 @@ static void __ieee80211_rx_handle_packet
>  					       "multicast frame for %s\n",
>  					       wiphy_name(local->hw.wiphy),
>  					       prev->name);
> -				continue;
> +				goto next;
>  			}
>  			ieee80211_invoke_rx_handlers(prev, &rx, skb_new, rate);
> +next:
>  			prev = sdata;
>  		}
> +
> +		if (prev) {
> +			rx.sta = sta_info_get(prev, hdr->addr2);
> +
> +			rx.flags |= IEEE80211_RX_RA_MATCH;
> +			prepares = prepare_for_handlers(prev, &rx, hdr);
> +
> +			if (!prepares)
> +				prev = NULL;
> +		}
>  	}
>  	if (prev)
>  		ieee80211_invoke_rx_handlers(prev, &rx, skb, rate);

That's kinda subtle, but looks correct at first and second glance,
thanks.

johannes

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