On Apr 5, 2009, at 8:58 PM, Michael Buesch wrote:

> On Sunday 05 April 2009 20:01:22 Francesco Gringoli wrote:
>> On Mar 30, 2009, at 11:35 PM, Francesco Gringoli wrote:
>>
>>>
>>> On Mar 28, 2009, at 12:41 AM, Michael Buesch wrote:
>>>
>>>>
Hi Michael,

>
> I think this really is completely getting overengineered by now.
>
> I'm not going to apply such a patch unless you tell me why it's  
> needed.
> Having such an incredible mechanism for an absolute corner case that  
> happens
> once in a billion frames but doesn't harm anybody is not really  
> acceptable.
No problem :-) I simply sent the patch I'm using in my test  
environment where I get this behavior for the 0.1% of the received  
frames when FCSFAIL is set. Note that here we collect traces for  
experiments with 802.11 protocol, so we need this kind of patches.

I understand that very few of us are doing such kind of experiments  
and users are not, I simply sent a comment about these devices. It may  
improve knowledge about them.

Cheers,
-FG

>
>
> If you have FCSFAIL set, you're expected to receive crap. It's as  
> simple as that.
> If you don't want crap, don't set the bit.
>
>
>> Index: wireless-testing/drivers/net/wireless/b43/xmit.c
>> ===================================================================
>> --- drivers/net/wireless/b43/xmit.c  2009-03-26 19:41:53.000000000  
>> +0100
>> +++ drivers/net/wireless/b43/xmit.c  2009-03-27 20:55:31.000000000  
>> +0100
>> @@ -27,6 +27,7 @@
>>
>>  */
>>
>> +#include <linux/crc32.h>
>>  #include "xmit.h"
>>  #include "phy_common.h"
>>  #include "dma.h"
>> @@ -560,6 +562,67 @@
>>              goto drop;
>>      }
>>      plcp = (struct b43_plcp_hdr6 *)(skb->data + padding);
>> +
>> +    if ((dev->wl->filter_flags & FIF_FCSFAIL) && !(macstat &
>> B43_RX_MAC_FCSERR)) {
>> +            int mismatch = 0;
>> +            int skb_len = skb->len - 6 - padding;
>> +            u8* plcp_data = (u8*) plcp;
>> +            if (phystat0 & B43_RX_PHYST0_OFDM) {
>> +                    int pkt_len = plcp_data[0] |
>> +                            plcp_data[1] <<  8 |
>> +                            plcp_data[2] << 16 |
>> +                            plcp_data[3] << 24;
>> +                    pkt_len >>= 5;
>> +                    pkt_len &= 0xFFF;
>> +                    if(pkt_len != skb_len) {
>> +                            mismatch = 1;
>> +                    }
>> +            }
>> +            else {
>> +                    int speed;
>> +                    int len1 = (plcp_data[3] << 8) | plcp_data[2];
>> +                    int len2;
>> +                    switch(plcp_data[0]) {
>> +                    case 0x0A:
>> +                            speed = 2;
>> +                            break;
>> +                    case 0x14:
>> +                            speed = 4;
>> +                            break;
>> +                    case 0x37:
>> +                            speed = 11;
>> +                            break;
>> +                    case 0x6E:
>> +                            speed = 22;
>> +                            break;
>> +                    default:
>> +                            speed = 1;
>> +                            break;
>> +                    }
>> +                    len2 = skb_len * 16 / speed;
>> +                    if((skb_len * 16 % speed) > 0)
>> +                            len2++;
>> +
>> +                    if(len1 != len2) {
>> +                            mismatch = 1;
>> +                    }
>> +            }
>> +            if(mismatch) {
>> +                    dev->wl->ieee_stats.dot11FCSErrorCount++;
>> +                    macstat |= B43_RX_MAC_FCSERR;
>> +                    status.flag |= RX_FLAG_FAILED_FCS_CRC;
>> +                    plcp_data = (u8*) (struct b43_plcp_hdr6 *)(skb->data);
>> +                    b43dbg(dev->wl, "RX: padding or plcp mismatch, setting 
>> FCSFAIL  
>> and
>> keeping frame (" \
>> +                            "%02X %02X %02X %02X padding = %d, len = %d)\n",
>> +                            plcp_data[0],
>> +                            plcp_data[1],
>> +                            plcp_data[2],
>> +                            plcp_data[3],
>> +                            padding,
>> +                            skb->len);
>> +            }
>> +        }
>> +
>>      skb_pull(skb, sizeof(struct b43_plcp_hdr6) + padding);
>>      /* The skb contains the Wireless Header + payload data now */
>>      if (unlikely(skb->len < (2 + 2 + 6 /*minimum hdr */  + FCS_LEN))) {
>> @@ -569,6 +648,23 @@
>>      wlhdr = (struct ieee80211_hdr *)(skb->data);
>>      fctl = wlhdr->frame_control;
>>
>> +    /* if we keep bad frames we should compute again the FCS as fw can
>> skip marking */
>> +        if ((dev->wl->filter_flags & FIF_FCSFAIL) && !(macstat &
>> B43_RX_MAC_FCSERR)) {
>> +            u32 fcs1, fcs2;
>> +            u8* fcs_ptr = skb->data + skb->len - FCS_LEN;
>> +            fcs1 = fcs_ptr[0] |
>> +                    fcs_ptr[1] << 8  |
>> +                    fcs_ptr[2] << 16 |
>> +                    fcs_ptr[3] << 24;
>> +            fcs2 = ~ether_crc_le(skb->len - FCS_LEN, skb->data);
>> +            if(fcs1 != fcs2) {
>> +                    b43dbg(dev->wl, "RX: FCS wrong not reported, setting 
>> FCSFAIL and
>> keeping\n");
>> +                    macstat |= B43_RX_MAC_FCSERR;
>> +                    dev->wl->ieee_stats.dot11FCSErrorCount++;
>> +                    status.flag |= RX_FLAG_FAILED_FCS_CRC;
>> +            }
>> +    }
>> +
>>      if (macstat & B43_RX_MAC_DEC) {
>>              unsigned int keyidx;
>>              int wlhdr_len;
>> @@ -617,6 +721,10 @@
>>               * Drop the frame, if we are not interested in corrupted 
>> frames.  
>> */
>>              if (!(dev->wl->filter_flags & FIF_PLCPFAIL))
>>                      goto drop;
>> +            else {
>> +                    b43dbg(dev->wl, "RX: PLCP corrupted, discarding\n");
>> +                    goto drop;
>> +            }
>>      }
>>      status.antenna = !!(phystat0 & B43_RX_PHYST0_ANT);
>>
>>
>>
>>
>
>
>
> -- 
> Greetings, Michael.

-------

Francesco Gringoli, PhD - Assistant Professor
Dept. of Electrical Engineering for Automation
University of Brescia
via Branze, 38
25123 Brescia
ITALY

Ph:  ++39.030.3715843
FAX: ++39.030.380014
WWW: http://www.ing.unibs.it/~gringoli




_______________________________________________
Bcm43xx-dev mailing list
[email protected]
https://lists.berlios.de/mailman/listinfo/bcm43xx-dev

Reply via email to