Contents of /trunk/zydas/patches/zd1211-driver-r32-monitor-mode.patch
Parent Directory | Revision Log
Revision 153 -
(show annotations)
(download)
Tue May 8 20:52:56 2007 UTC (17 years, 4 months ago) by niro
File size: 12097 byte(s)
Tue May 8 20:52:56 2007 UTC (17 years, 4 months ago) by niro
File size: 12097 byte(s)
-import
1 | * finding or making jordens@debian.org--zd1211/zd1211--integration--0--patch-1 |
2 | * finding or making jordens@debian.org--zd1211/zd1211--integration--0--patch-2 |
3 | * computing changeset |
4 | A/ {arch}/zd1211/zd1211--monitor-mode |
5 | A/ {arch}/zd1211/zd1211--monitor-mode/zd1211--monitor-mode--0 |
6 | A/ {arch}/zd1211/zd1211--monitor-mode/zd1211--monitor-mode--0/jordens@debian.org--zd1211 |
7 | A/ {arch}/zd1211/zd1211--monitor-mode/zd1211--monitor-mode--0/jordens@debian.org--zd1211/patch-log |
8 | A {arch}/zd1211/zd1211--integration/zd1211--integration--0/jordens@debian.org--zd1211/patch-log/patch-2 |
9 | A {arch}/zd1211/zd1211--monitor-mode/zd1211--monitor-mode--0/jordens@debian.org--zd1211/patch-log/base-0 |
10 | A {arch}/zd1211/zd1211--monitor-mode/zd1211--monitor-mode--0/jordens@debian.org--zd1211/patch-log/patch-1 |
11 | M src/zd1205.c |
12 | M src/zdapi.h |
13 | * changeset report |
14 | * modified files |
15 | |
16 | --- orig/src/zd1205.c |
17 | +++ mod/src/zd1205.c |
18 | @@ -2526,6 +2526,7 @@ |
19 | u8 rx_offset = macp->rxOffset; |
20 | |
21 | u8 FrameEndInd; |
22 | + u8 BaseFrmType = 0; |
23 | |
24 | |
25 | // Extension Info |
26 | @@ -2537,14 +2538,13 @@ |
27 | /* DA Index | SA Index | Rx Decrypt Type | Rx Status */ |
28 | /*****************************************************/ |
29 | |
30 | - // Accept Data/Management frame only. |
31 | wla_hdr = (plcp_wla_Header_t *)&rfd->RxBuffer[macp->rxOffset]; |
32 | + BaseFrmType = BaseFrameType(wla_hdr); |
33 | frame_len = (le32_to_cpu(rfd->ActualCount) & 0x3fff) - rx_offset; |
34 | |
35 | frame_len -= macp->rxOffset; |
36 | len1 = frame_len + macp->rxOffset; |
37 | len = frame_len + macp->rxOffset - EXTRA_INFO_LEN; |
38 | - PlcpRate = wla_hdr->PlcpHdr[0]; |
39 | |
40 | if (frame_len == 0) |
41 | { |
42 | @@ -2570,9 +2570,13 @@ |
43 | { |
44 | macp->ErrToHostFrmCnt++; |
45 | return FALSE; |
46 | - } |
47 | |
48 | - if (bWepBit(wla_hdr)) |
49 | + } else if (FrameEndInd & (BIT_1 | BIT_2 | BIT_4 | BIT_6)) |
50 | + { |
51 | + return false; |
52 | + } |
53 | + |
54 | + if ((BaseFrmType == DATA) && bWepBit(wla_hdr)) |
55 | { |
56 | //if (macp->cardSetting.EncryMode == ENCRY_TKIP) |
57 | // min_length = 48; |
58 | @@ -2605,86 +2609,94 @@ |
59 | return false; |
60 | } |
61 | |
62 | - // Check if the SwRfd->frame_len matched the length derived from PLCP. |
63 | - bOfdmFrm = (FrameEndInd & BIT_0); |
64 | + if ((BaseFrmType == DATA) || (BaseFrmType == MANAGEMENT)) |
65 | + { |
66 | + // Check if the SwRfd->frame_len matched the length derived from PLCP. |
67 | + bOfdmFrm = (FrameEndInd & BIT_0); |
68 | + |
69 | + PlcpRate = wla_hdr->PlcpHdr[0]; |
70 | |
71 | - if (bOfdmFrm) |
72 | - { |
73 | - // it's OFDM |
74 | - macp->rxOFDMDataFrame++; |
75 | + if (bOfdmFrm) |
76 | + { |
77 | + // it's OFDM |
78 | + macp->rxOFDMDataFrame++; |
79 | #ifdef HOST_IF_USB |
80 | |
81 | - macp->PHYFreOFDMframe = 1; |
82 | + macp->PHYFreOFDMframe = 1; |
83 | #endif |
84 | |
85 | - switch(PlcpRate & 0xF) { |
86 | - case 0x0B: //6M |
87 | + switch(PlcpRate & 0xF) { |
88 | + case 0x0B: //6M |
89 | |
90 | - macp->rxInfo.rate = RATE_6M; |
91 | - break; |
92 | + macp->rxInfo.rate = RATE_6M; |
93 | + break; |
94 | |
95 | - case 0x0F: //9M |
96 | - macp->rxInfo.rate = RATE_9M; |
97 | - break; |
98 | + case 0x0F: //9M |
99 | + macp->rxInfo.rate = RATE_9M; |
100 | + break; |
101 | |
102 | |
103 | - case 0x0A: //12M |
104 | - macp->rxInfo.rate = RATE_12M; |
105 | + case 0x0A: //12M |
106 | + macp->rxInfo.rate = RATE_12M; |
107 | |
108 | - break; |
109 | + break; |
110 | |
111 | - case 0x0E: //18M |
112 | - macp->rxInfo.rate = RATE_18M; |
113 | - break; |
114 | + case 0x0E: //18M |
115 | + macp->rxInfo.rate = RATE_18M; |
116 | + break; |
117 | |
118 | |
119 | - case 0x09: //24M |
120 | - macp->rxInfo.rate = RATE_24M; |
121 | - break; |
122 | + case 0x09: //24M |
123 | + macp->rxInfo.rate = RATE_24M; |
124 | + break; |
125 | |
126 | - case 0x0D: //36M |
127 | - macp->rxInfo.rate = RATE_36M; |
128 | - break; |
129 | + case 0x0D: //36M |
130 | + macp->rxInfo.rate = RATE_36M; |
131 | + break; |
132 | |
133 | - case 0x08: //48M |
134 | - macp->rxInfo.rate = RATE_48M; |
135 | - break; |
136 | + case 0x08: //48M |
137 | + macp->rxInfo.rate = RATE_48M; |
138 | + break; |
139 | |
140 | - case 0x0C: //54M |
141 | - macp->rxInfo.rate = RATE_54M; |
142 | - break; |
143 | + case 0x0C: //54M |
144 | + macp->rxInfo.rate = RATE_54M; |
145 | + break; |
146 | |
147 | - default: |
148 | - break; |
149 | - } |
150 | + default: |
151 | + break; |
152 | + } |
153 | |
154 | - } else |
155 | - { |
156 | - // it's CCK |
157 | - macp->rx11bDataFrame++; |
158 | - // the value from PHY is in scale from Max is 0 and Min is 0xb5 |
159 | - switch(PlcpRate) { |
160 | - case 0x0A: |
161 | + } else |
162 | + { |
163 | + // it's CCK |
164 | + macp->rx11bDataFrame++; |
165 | + // the value from PHY is in scale from Max is 0 and Min is 0xb5 |
166 | + switch(PlcpRate) { |
167 | + case 0x0A: |
168 | |
169 | - macp->rxInfo.rate = RATE_1M; |
170 | - break; |
171 | + macp->rxInfo.rate = RATE_1M; |
172 | + break; |
173 | |
174 | - case 0x14: |
175 | - macp->rxInfo.rate = RATE_2M; |
176 | - break; |
177 | + case 0x14: |
178 | + macp->rxInfo.rate = RATE_2M; |
179 | + break; |
180 | |
181 | - case 0x37: |
182 | - macp->rxInfo.rate = RATE_5M; |
183 | - break; |
184 | + case 0x37: |
185 | + macp->rxInfo.rate = RATE_5M; |
186 | + break; |
187 | |
188 | - case 0x6E: |
189 | - macp->rxInfo.rate = RATE_11M; |
190 | - break; |
191 | + case 0x6E: |
192 | + macp->rxInfo.rate = RATE_11M; |
193 | + break; |
194 | |
195 | - default: |
196 | - break; |
197 | - } |
198 | - } |
199 | + default: |
200 | + break; |
201 | + } |
202 | + } |
203 | + } else |
204 | + { |
205 | + macp->rxInfo.rate = RATE_1M; |
206 | + } |
207 | |
208 | |
209 | macp->rxSignalQuality = rfd->RxBuffer[len]; |
210 | @@ -3398,8 +3410,33 @@ |
211 | if (SubFrameType(wla_hdr) != BEACON) { |
212 | macp->bFrmRxed1 = 1; |
213 | } |
214 | + |
215 | + if (zd1205_validate_frame(macp, rfd) == false) { |
216 | + //int i; |
217 | + //int frame_len=(le32_to_cpu(rfd->ActualCount)&0x3fff)-macp->rxOffset; |
218 | + ZD1211DEBUG(4, "zd1211: invalid frame\n"); |
219 | + //plcp_wla_Header_t *wla_hdrb; |
220 | + //printk("zd1211: invalid frame\n"); |
221 | + //printk("\nAddr1: "); |
222 | + //for(i=0;i<6;i++) |
223 | + // printk("%02x ", wla_hdr->Address1[i]); |
224 | + //printk("\nAddr2: "); |
225 | + //for(i=0;i<6;i++) |
226 | + // printk("%02x ", wla_hdr->Address2[i]); |
227 | + //printk("\nAddr3: "); |
228 | + //for(i=0;i<6;i++) |
229 | + // printk("%02x ", wla_hdr->Address3[i]); |
230 | + //printk("\nDuration:%d",*(u16 *)wla_hdr->Duration); |
231 | + //printk("\nFrmCtl:%d",*(u16 *)wla_hdr->FrameCtrl); |
232 | + //printk("\nLength:%d\n",frame_len); |
233 | + |
234 | + |
235 | + macp->invalid_frame_good_crc ++; |
236 | + zd1205_add_skb_to_end(macp, rx_struct); |
237 | + continue; |
238 | + } |
239 | |
240 | - if (!macp->sniffer_on) { |
241 | + if ((!macp->sniffer_on) && (BssType != IW_MODE_MONITOR)) { |
242 | BaseFrmType = BaseFrameType(wla_hdr); |
243 | |
244 | if ((BaseFrmType == DATA) || (BaseFrmType == MANAGEMENT)) { //Data or Management Frames |
245 | @@ -3412,31 +3449,6 @@ |
246 | data_sz + macp->rfd_size, PCI_DMA_FROMDEVICE); |
247 | #endif |
248 | |
249 | - if (zd1205_validate_frame(macp, rfd) == false) { |
250 | - //int i; |
251 | - //int frame_len=(le32_to_cpu(rfd->ActualCount)&0x3fff)-macp->rxOffset; |
252 | - ZD1211DEBUG(4, "zd1211: invalid frame\n"); |
253 | - //plcp_wla_Header_t *wla_hdrb; |
254 | - //printk("zd1211: invalid frame\n"); |
255 | - //printk("\nAddr1: "); |
256 | - //for(i=0;i<6;i++) |
257 | - // printk("%02x ", wla_hdr->Address1[i]); |
258 | - //printk("\nAddr2: "); |
259 | - //for(i=0;i<6;i++) |
260 | - // printk("%02x ", wla_hdr->Address2[i]); |
261 | - //printk("\nAddr3: "); |
262 | - //for(i=0;i<6;i++) |
263 | - // printk("%02x ", wla_hdr->Address3[i]); |
264 | - //printk("\nDuration:%d",*(u16 *)wla_hdr->Duration); |
265 | - //printk("\nFrmCtl:%d",*(u16 *)wla_hdr->FrameCtrl); |
266 | - //printk("\nLength:%d\n",frame_len); |
267 | - |
268 | - |
269 | - macp->invalid_frame_good_crc ++; |
270 | - zd1205_add_skb_to_end(macp, rx_struct); |
271 | - continue; |
272 | - } |
273 | - |
274 | seq = getSeq(wla_hdr); |
275 | frag = getFrag(wla_hdr); |
276 | pTa = getTA(wla_hdr); |
277 | @@ -3767,7 +3779,7 @@ |
278 | |
279 | defrag_comp: |
280 | rfd_cnt++; |
281 | - if (!macp->sniffer_on) { |
282 | + if ((!macp->sniffer_on) && (BssType != IW_MODE_MONITOR)) { |
283 | if (BaseFrmType == DATA) |
284 | macp->TotalRxDataFrmBytes += (hdrLen+bodyLen); |
285 | |
286 | @@ -3796,7 +3808,7 @@ |
287 | skb_put(skb, data_sz - PLCP_HEADER); |
288 | skb->mac.raw = skb->data; |
289 | skb->pkt_type = PACKET_OTHERHOST; |
290 | - skb->protocol = htons(ETH_P_802_2); |
291 | + skb->protocol = __constant_htons(ETH_P_802_2); |
292 | skb->dev = dev; |
293 | skb->ip_summed = CHECKSUM_NONE; |
294 | netif_rx(skb); |
295 | @@ -4431,6 +4443,37 @@ |
296 | } |
297 | |
298 | |
299 | +void |
300 | +zd1205_monitor_mode_enable(struct zd1205_private *macp) |
301 | +{ |
302 | + struct net_device *dev = macp->device; |
303 | + |
304 | + if (netif_running(dev)) |
305 | + netif_stop_queue(dev); |
306 | + |
307 | + dev->type = ARPHRD_IEEE80211; |
308 | + zd_writel(0x01, SnifferOn); |
309 | + /* zd_writel(ALL_KNOWN_RX_FILTER, Rx_Filter); */ |
310 | + zd_writel(0xffffffff, Rx_Filter); |
311 | + zd_writel(0x08, EncryType); |
312 | + macp->intrMask = RX_COMPLETE_EN; |
313 | +} |
314 | + |
315 | +void |
316 | +zd1205_monitor_mode_disable(struct zd1205_private *macp) |
317 | +{ |
318 | + struct net_device *dev = macp->device; |
319 | + |
320 | + dev->type = ARPHRD_ETHER; |
321 | + zd_writel(0x00, SnifferOn); |
322 | + //zd_writel(0x00000000, Rx_Filter); /* will be set for the new mode */ |
323 | + zd_writel(NO_WEP, EncryType); |
324 | + macp->intrMask = ZD1205_INT_MASK; |
325 | + |
326 | + if (!netif_running(dev)) |
327 | + netif_start_queue(dev); |
328 | +} |
329 | + |
330 | |
331 | void |
332 | zd1205_isolate_driver(struct zd1205_private *macp) |
333 | @@ -6120,6 +6163,10 @@ |
334 | struct zd1205_private *macp = dev->priv; |
335 | |
336 | zd1205_lock(macp); |
337 | + |
338 | + if (macp->cardSetting.BssType == IW_MODE_MONITOR) |
339 | + zd1205_monitor_mode_disable(macp); |
340 | + |
341 | switch(*mode) |
342 | { |
343 | case IW_MODE_ADHOC: |
344 | @@ -6168,6 +6215,12 @@ |
345 | netif_start_queue(dev); |
346 | break; |
347 | |
348 | + case IW_MODE_MONITOR: |
349 | + ZD1211DEBUG(0, "Switch to Monitor mode\n"); |
350 | + macp->cardSetting.BssType = IW_MODE_MONITOR; |
351 | + zd1205_monitor_mode_enable(macp); |
352 | + break; |
353 | + |
354 | default: |
355 | ZD1211DEBUG(0, "Switch to PSEUDO_IBSS mode\n"); |
356 | macp->cardSetting.BssType = PSEUDO_IBSS; |
357 | @@ -6242,6 +6295,10 @@ |
358 | case INDEPENDENT_BSS: |
359 | *mode = IW_MODE_ADHOC; |
360 | break; |
361 | + |
362 | + case IW_MODE_MONITOR: |
363 | + *mode = IW_MODE_MONITOR; |
364 | + break; |
365 | |
366 | default: |
367 | *mode = IW_MODE_ADHOC; |
368 | |
369 | |
370 | --- orig/src/zdapi.h |
371 | +++ mod/src/zdapi.h |
372 | @@ -210,8 +210,32 @@ |
373 | #define AP_BSS 0x4 |
374 | |
375 | //RxFilter |
376 | + |
377 | +/* |
378 | + * Rx_Filter bits: |
379 | + * |
380 | + * 0: Assoc req |
381 | + * 1: Assoc resp |
382 | + * 2: Reassoc req |
383 | + * 3: Reassoc resp |
384 | + * 4: Probe req |
385 | + * 5: Probe resp |
386 | + * 8: Beacon |
387 | + * 9: ATIM |
388 | + * 10: Disassoc |
389 | + * 11: Auth |
390 | + * 12: Deauth |
391 | + * 26: PS-Poll |
392 | + * 27: RTS |
393 | + * 28: CTS |
394 | + * 29: ACK |
395 | + * 30: CF-End |
396 | + * 31: CF-End + CF-Ack |
397 | +*/ |
398 | + |
399 | #define AP_RX_FILTER 0x0400feff |
400 | #define STA_RX_FILTER 0x0000ffff |
401 | +#define ALL_KNOWN_RX_FILTER 0xfc001f3f |
402 | |
403 | //pSetting->MacMode |
404 | #define MIXED_MODE 0x01 |
405 | |
406 | |
407 | |
408 | * added files |
409 | |
410 |
Properties
Name | Value |
---|---|
svn:executable | * |