* finding or making jordens@debian.org--zd1211/zd1211--integration--0--patch-1 * finding or making jordens@debian.org--zd1211/zd1211--integration--0--patch-2 * computing changeset A/ {arch}/zd1211/zd1211--monitor-mode A/ {arch}/zd1211/zd1211--monitor-mode/zd1211--monitor-mode--0 A/ {arch}/zd1211/zd1211--monitor-mode/zd1211--monitor-mode--0/jordens@debian.org--zd1211 A/ {arch}/zd1211/zd1211--monitor-mode/zd1211--monitor-mode--0/jordens@debian.org--zd1211/patch-log A {arch}/zd1211/zd1211--integration/zd1211--integration--0/jordens@debian.org--zd1211/patch-log/patch-2 A {arch}/zd1211/zd1211--monitor-mode/zd1211--monitor-mode--0/jordens@debian.org--zd1211/patch-log/base-0 A {arch}/zd1211/zd1211--monitor-mode/zd1211--monitor-mode--0/jordens@debian.org--zd1211/patch-log/patch-1 M src/zd1205.c M src/zdapi.h * changeset report * modified files --- orig/src/zd1205.c +++ mod/src/zd1205.c @@ -2526,6 +2526,7 @@ u8 rx_offset = macp->rxOffset; u8 FrameEndInd; + u8 BaseFrmType = 0; // Extension Info @@ -2537,14 +2538,13 @@ /* DA Index | SA Index | Rx Decrypt Type | Rx Status */ /*****************************************************/ - // Accept Data/Management frame only. wla_hdr = (plcp_wla_Header_t *)&rfd->RxBuffer[macp->rxOffset]; + BaseFrmType = BaseFrameType(wla_hdr); frame_len = (le32_to_cpu(rfd->ActualCount) & 0x3fff) - rx_offset; frame_len -= macp->rxOffset; len1 = frame_len + macp->rxOffset; len = frame_len + macp->rxOffset - EXTRA_INFO_LEN; - PlcpRate = wla_hdr->PlcpHdr[0]; if (frame_len == 0) { @@ -2570,9 +2570,13 @@ { macp->ErrToHostFrmCnt++; return FALSE; - } - if (bWepBit(wla_hdr)) + } else if (FrameEndInd & (BIT_1 | BIT_2 | BIT_4 | BIT_6)) + { + return false; + } + + if ((BaseFrmType == DATA) && bWepBit(wla_hdr)) { //if (macp->cardSetting.EncryMode == ENCRY_TKIP) // min_length = 48; @@ -2605,86 +2609,94 @@ return false; } - // Check if the SwRfd->frame_len matched the length derived from PLCP. - bOfdmFrm = (FrameEndInd & BIT_0); + if ((BaseFrmType == DATA) || (BaseFrmType == MANAGEMENT)) + { + // Check if the SwRfd->frame_len matched the length derived from PLCP. + bOfdmFrm = (FrameEndInd & BIT_0); + + PlcpRate = wla_hdr->PlcpHdr[0]; - if (bOfdmFrm) - { - // it's OFDM - macp->rxOFDMDataFrame++; + if (bOfdmFrm) + { + // it's OFDM + macp->rxOFDMDataFrame++; #ifdef HOST_IF_USB - macp->PHYFreOFDMframe = 1; + macp->PHYFreOFDMframe = 1; #endif - switch(PlcpRate & 0xF) { - case 0x0B: //6M + switch(PlcpRate & 0xF) { + case 0x0B: //6M - macp->rxInfo.rate = RATE_6M; - break; + macp->rxInfo.rate = RATE_6M; + break; - case 0x0F: //9M - macp->rxInfo.rate = RATE_9M; - break; + case 0x0F: //9M + macp->rxInfo.rate = RATE_9M; + break; - case 0x0A: //12M - macp->rxInfo.rate = RATE_12M; + case 0x0A: //12M + macp->rxInfo.rate = RATE_12M; - break; + break; - case 0x0E: //18M - macp->rxInfo.rate = RATE_18M; - break; + case 0x0E: //18M + macp->rxInfo.rate = RATE_18M; + break; - case 0x09: //24M - macp->rxInfo.rate = RATE_24M; - break; + case 0x09: //24M + macp->rxInfo.rate = RATE_24M; + break; - case 0x0D: //36M - macp->rxInfo.rate = RATE_36M; - break; + case 0x0D: //36M + macp->rxInfo.rate = RATE_36M; + break; - case 0x08: //48M - macp->rxInfo.rate = RATE_48M; - break; + case 0x08: //48M + macp->rxInfo.rate = RATE_48M; + break; - case 0x0C: //54M - macp->rxInfo.rate = RATE_54M; - break; + case 0x0C: //54M + macp->rxInfo.rate = RATE_54M; + break; - default: - break; - } + default: + break; + } - } else - { - // it's CCK - macp->rx11bDataFrame++; - // the value from PHY is in scale from Max is 0 and Min is 0xb5 - switch(PlcpRate) { - case 0x0A: + } else + { + // it's CCK + macp->rx11bDataFrame++; + // the value from PHY is in scale from Max is 0 and Min is 0xb5 + switch(PlcpRate) { + case 0x0A: - macp->rxInfo.rate = RATE_1M; - break; + macp->rxInfo.rate = RATE_1M; + break; - case 0x14: - macp->rxInfo.rate = RATE_2M; - break; + case 0x14: + macp->rxInfo.rate = RATE_2M; + break; - case 0x37: - macp->rxInfo.rate = RATE_5M; - break; + case 0x37: + macp->rxInfo.rate = RATE_5M; + break; - case 0x6E: - macp->rxInfo.rate = RATE_11M; - break; + case 0x6E: + macp->rxInfo.rate = RATE_11M; + break; - default: - break; - } - } + default: + break; + } + } + } else + { + macp->rxInfo.rate = RATE_1M; + } macp->rxSignalQuality = rfd->RxBuffer[len]; @@ -3398,8 +3410,33 @@ if (SubFrameType(wla_hdr) != BEACON) { macp->bFrmRxed1 = 1; } + + if (zd1205_validate_frame(macp, rfd) == false) { + //int i; + //int frame_len=(le32_to_cpu(rfd->ActualCount)&0x3fff)-macp->rxOffset; + ZD1211DEBUG(4, "zd1211: invalid frame\n"); + //plcp_wla_Header_t *wla_hdrb; + //printk("zd1211: invalid frame\n"); + //printk("\nAddr1: "); + //for(i=0;i<6;i++) + // printk("%02x ", wla_hdr->Address1[i]); + //printk("\nAddr2: "); + //for(i=0;i<6;i++) + // printk("%02x ", wla_hdr->Address2[i]); + //printk("\nAddr3: "); + //for(i=0;i<6;i++) + // printk("%02x ", wla_hdr->Address3[i]); + //printk("\nDuration:%d",*(u16 *)wla_hdr->Duration); + //printk("\nFrmCtl:%d",*(u16 *)wla_hdr->FrameCtrl); + //printk("\nLength:%d\n",frame_len); + + + macp->invalid_frame_good_crc ++; + zd1205_add_skb_to_end(macp, rx_struct); + continue; + } - if (!macp->sniffer_on) { + if ((!macp->sniffer_on) && (BssType != IW_MODE_MONITOR)) { BaseFrmType = BaseFrameType(wla_hdr); if ((BaseFrmType == DATA) || (BaseFrmType == MANAGEMENT)) { //Data or Management Frames @@ -3412,31 +3449,6 @@ data_sz + macp->rfd_size, PCI_DMA_FROMDEVICE); #endif - if (zd1205_validate_frame(macp, rfd) == false) { - //int i; - //int frame_len=(le32_to_cpu(rfd->ActualCount)&0x3fff)-macp->rxOffset; - ZD1211DEBUG(4, "zd1211: invalid frame\n"); - //plcp_wla_Header_t *wla_hdrb; - //printk("zd1211: invalid frame\n"); - //printk("\nAddr1: "); - //for(i=0;i<6;i++) - // printk("%02x ", wla_hdr->Address1[i]); - //printk("\nAddr2: "); - //for(i=0;i<6;i++) - // printk("%02x ", wla_hdr->Address2[i]); - //printk("\nAddr3: "); - //for(i=0;i<6;i++) - // printk("%02x ", wla_hdr->Address3[i]); - //printk("\nDuration:%d",*(u16 *)wla_hdr->Duration); - //printk("\nFrmCtl:%d",*(u16 *)wla_hdr->FrameCtrl); - //printk("\nLength:%d\n",frame_len); - - - macp->invalid_frame_good_crc ++; - zd1205_add_skb_to_end(macp, rx_struct); - continue; - } - seq = getSeq(wla_hdr); frag = getFrag(wla_hdr); pTa = getTA(wla_hdr); @@ -3767,7 +3779,7 @@ defrag_comp: rfd_cnt++; - if (!macp->sniffer_on) { + if ((!macp->sniffer_on) && (BssType != IW_MODE_MONITOR)) { if (BaseFrmType == DATA) macp->TotalRxDataFrmBytes += (hdrLen+bodyLen); @@ -3796,7 +3808,7 @@ skb_put(skb, data_sz - PLCP_HEADER); skb->mac.raw = skb->data; skb->pkt_type = PACKET_OTHERHOST; - skb->protocol = htons(ETH_P_802_2); + skb->protocol = __constant_htons(ETH_P_802_2); skb->dev = dev; skb->ip_summed = CHECKSUM_NONE; netif_rx(skb); @@ -4431,6 +4443,37 @@ } +void +zd1205_monitor_mode_enable(struct zd1205_private *macp) +{ + struct net_device *dev = macp->device; + + if (netif_running(dev)) + netif_stop_queue(dev); + + dev->type = ARPHRD_IEEE80211; + zd_writel(0x01, SnifferOn); + /* zd_writel(ALL_KNOWN_RX_FILTER, Rx_Filter); */ + zd_writel(0xffffffff, Rx_Filter); + zd_writel(0x08, EncryType); + macp->intrMask = RX_COMPLETE_EN; +} + +void +zd1205_monitor_mode_disable(struct zd1205_private *macp) +{ + struct net_device *dev = macp->device; + + dev->type = ARPHRD_ETHER; + zd_writel(0x00, SnifferOn); + //zd_writel(0x00000000, Rx_Filter); /* will be set for the new mode */ + zd_writel(NO_WEP, EncryType); + macp->intrMask = ZD1205_INT_MASK; + + if (!netif_running(dev)) + netif_start_queue(dev); +} + void zd1205_isolate_driver(struct zd1205_private *macp) @@ -6120,6 +6163,10 @@ struct zd1205_private *macp = dev->priv; zd1205_lock(macp); + + if (macp->cardSetting.BssType == IW_MODE_MONITOR) + zd1205_monitor_mode_disable(macp); + switch(*mode) { case IW_MODE_ADHOC: @@ -6168,6 +6215,12 @@ netif_start_queue(dev); break; + case IW_MODE_MONITOR: + ZD1211DEBUG(0, "Switch to Monitor mode\n"); + macp->cardSetting.BssType = IW_MODE_MONITOR; + zd1205_monitor_mode_enable(macp); + break; + default: ZD1211DEBUG(0, "Switch to PSEUDO_IBSS mode\n"); macp->cardSetting.BssType = PSEUDO_IBSS; @@ -6242,6 +6295,10 @@ case INDEPENDENT_BSS: *mode = IW_MODE_ADHOC; break; + + case IW_MODE_MONITOR: + *mode = IW_MODE_MONITOR; + break; default: *mode = IW_MODE_ADHOC; --- orig/src/zdapi.h +++ mod/src/zdapi.h @@ -210,8 +210,32 @@ #define AP_BSS 0x4 //RxFilter + +/* + * Rx_Filter bits: + * + * 0: Assoc req + * 1: Assoc resp + * 2: Reassoc req + * 3: Reassoc resp + * 4: Probe req + * 5: Probe resp + * 8: Beacon + * 9: ATIM + * 10: Disassoc + * 11: Auth + * 12: Deauth + * 26: PS-Poll + * 27: RTS + * 28: CTS + * 29: ACK + * 30: CF-End + * 31: CF-End + CF-Ack +*/ + #define AP_RX_FILTER 0x0400feff #define STA_RX_FILTER 0x0000ffff +#define ALL_KNOWN_RX_FILTER 0xfc001f3f //pSetting->MacMode #define MIXED_MODE 0x01 * added files