1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27#include "cprecomp.h"
28#include "../hal/hpreg.h"
29
30
31const u8_t zg11bRateTbl[4] = {2, 4, 11, 22};
32const u8_t zg11gRateTbl[8] = {12, 18, 24, 36, 48, 72, 96, 108};
33
34
35const u8_t zgElementOffsetTable[] =
36{
37 4,
38 6,
39 10,
40 6,
41 0,
42 12,
43 0xff,
44 0xff,
45 12,
46 4,
47 0xff,
48 6,
49 0xff,
50 4,
51 0xff,
52 0xff,
53};
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73u16_t zfFindElement(zdev_t* dev, zbuf_t* buf, u8_t eid)
74{
75 u8_t subType;
76 u16_t offset;
77 u16_t bufLen;
78 u16_t elen;
79 u8_t id, HTEid=0;
80 u8_t oui[4] = {0x00, 0x50, 0xf2, 0x01};
81 u8_t oui11n[3] = {0x00,0x90,0x4C};
82 u8_t HTType = 0;
83
84
85 subType = (zmw_rx_buf_readb(dev, buf, 0) >> 4);
86 if ((offset = zgElementOffsetTable[subType]) == 0xff)
87 {
88 zm_assert(0);
89 }
90
91
92 offset += 24;
93
94
95
96 if ((eid == ZM_WLAN_EID_HT_CAPABILITY) ||
97 (eid == ZM_WLAN_EID_EXTENDED_HT_CAPABILITY))
98 {
99 HTEid = eid;
100 eid = ZM_WLAN_EID_WPA_IE;
101 HTType = 1;
102 }
103
104
105 bufLen = zfwBufGetSize(dev, buf);
106
107 while ((offset+2)<bufLen)
108 {
109
110 if ((id = zmw_rx_buf_readb(dev, buf, offset)) == eid)
111 {
112
113 if ((elen = zmw_rx_buf_readb(dev, buf, offset+1))>(bufLen - offset))
114 {
115
116 return 0xffff;
117 }
118
119 if ( elen == 0 && eid != ZM_WLAN_EID_SSID)
120 {
121
122 return 0xffff;
123 }
124
125 if ( eid == ZM_WLAN_EID_WPA_IE )
126 {
127
128 if ( (HTType == 0) && zfRxBufferEqualToStr(dev, buf, oui, offset+2, 4) )
129 {
130 return offset;
131 }
132
133
134
135
136 if ((HTType == 1) && ( zfRxBufferEqualToStr(dev, buf, oui11n, offset+2, 3) ))
137 {
138 if ( zmw_rx_buf_readb(dev, buf, offset+5) == HTEid )
139 {
140 return offset + 5;
141 }
142 }
143
144 }
145 else
146 {
147 return offset;
148 }
149 }
150
151 #if 1
152 elen = zmw_rx_buf_readb(dev, buf, offset+1);
153 #else
154 if ((elen = zmw_rx_buf_readb(dev, buf, offset+1)) == 0)
155 {
156 return 0xffff;
157 }
158 #endif
159
160 offset += (elen+2);
161 }
162 return 0xffff;
163}
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185u16_t zfFindWifiElement(zdev_t* dev, zbuf_t* buf, u8_t type, u8_t subtype)
186{
187 u8_t subType;
188 u16_t offset;
189 u16_t bufLen;
190 u16_t elen;
191 u8_t id;
192 u8_t tmp;
193
194
195 subType = (zmw_rx_buf_readb(dev, buf, 0) >> 4);
196
197 if ((offset = zgElementOffsetTable[subType]) == 0xff)
198 {
199 zm_assert(0);
200 }
201
202
203 offset += 24;
204
205 bufLen = zfwBufGetSize(dev, buf);
206
207 while ((offset+2)<bufLen)
208 {
209
210 if ((id = zmw_rx_buf_readb(dev, buf, offset)) == ZM_WLAN_EID_WIFI_IE)
211 {
212
213 if ((elen = zmw_rx_buf_readb(dev, buf, offset+1))>(bufLen - offset))
214 {
215
216 return 0xffff;
217 }
218
219 if ( elen == 0 )
220 {
221 return 0xffff;
222 }
223
224 if (((tmp = zmw_rx_buf_readb(dev, buf, offset+2)) == 0x00)
225 && ((tmp = zmw_rx_buf_readb(dev, buf, offset+3)) == 0x50)
226 && ((tmp = zmw_rx_buf_readb(dev, buf, offset+4)) == 0xF2)
227 && ((tmp = zmw_rx_buf_readb(dev, buf, offset+5)) == type))
228
229 {
230 if ( subtype != 0xff )
231 {
232 if ( (tmp = zmw_rx_buf_readb(dev, buf, offset+6)) == subtype )
233 {
234 return offset;
235 }
236 }
237 else
238 {
239 return offset;
240 }
241 }
242 }
243
244 if ((elen = zmw_rx_buf_readb(dev, buf, offset+1)) == 0)
245 {
246 return 0xffff;
247 }
248 offset += (elen+2);
249 }
250 return 0xffff;
251}
252
253u16_t zfRemoveElement(zdev_t* dev, u8_t* buf, u16_t size, u8_t eid)
254{
255 u16_t offset = 0;
256 u16_t elen;
257 u8_t HTEid = 0;
258 u8_t oui[4] = {0x00, 0x50, 0xf2, 0x01};
259 u8_t oui11n[3] = {0x00,0x90,0x4C};
260 u8_t HTType = 0;
261
262 if ((eid == ZM_WLAN_EID_HT_CAPABILITY) ||
263 (eid == ZM_WLAN_EID_EXTENDED_HT_CAPABILITY))
264 {
265 HTEid = eid;
266 eid = ZM_WLAN_EID_WPA_IE;
267 HTType = 1;
268 }
269
270 while (offset < size)
271 {
272 elen = *(buf+offset+1);
273
274 if (*(buf+offset) == eid)
275 {
276 if ( eid == ZM_WLAN_EID_WPA_IE )
277 {
278 if ( (HTType == 0)
279 && (*(buf+offset+2) == oui[0])
280 && (*(buf+offset+3) == oui[1])
281 && (*(buf+offset+4) == oui[2])
282 && (*(buf+offset+5) == oui[3]) )
283 {
284 zfMemoryMove(buf+offset, buf+offset+elen+2, size-offset-elen-2);
285 return (size-elen-2);
286 }
287
288 if ( (HTType == 1)
289 && (*(buf+offset+2) == oui11n[0])
290 && (*(buf+offset+3) == oui11n[1])
291 && (*(buf+offset+4) == oui11n[2])
292 && (*(buf+offset+5) == HTEid) )
293 {
294 zfMemoryMove(buf+offset, buf+offset+elen+2, size-offset-elen-2);
295 return (size-elen-2);
296 }
297 }
298 else
299 {
300 zfMemoryMove(buf+offset, buf+offset+elen+2, size-offset-elen-2);
301 return (size-elen-2);
302 }
303 }
304
305 offset += (elen+2);
306 }
307
308 return size;
309}
310
311u16_t zfUpdateElement(zdev_t* dev, u8_t* buf, u16_t size, u8_t* updateeid)
312{
313 u16_t offset = 0;
314 u16_t elen;
315
316 while (offset < size) {
317 elen = *(buf+offset+1);
318
319 if (*(buf+offset) == updateeid[0]) {
320 if (updateeid[1] <= elen) {
321 zfMemoryMove(buf+offset, updateeid, updateeid[1]+2);
322 zfMemoryMove(buf+offset+updateeid[1]+2, buf+offset+elen+2, size-offset-elen-2);
323
324 return size-(elen-updateeid[1]);
325 } else {
326 zfMemoryMove(buf+offset+updateeid[1]+2, buf+offset+elen+2, size-offset-elen-2);
327 zfMemoryMove(buf+offset, updateeid, updateeid[1]+2);
328
329 return size+(updateeid[1]-elen);
330 }
331 }
332
333 offset += (elen+2);
334 }
335
336 return size;
337}
338
339u16_t zfFindSuperGElement(zdev_t* dev, zbuf_t* buf, u8_t type)
340{
341 u8_t subType;
342 u16_t offset;
343 u16_t bufLen;
344 u16_t elen;
345 u8_t id;
346 u8_t super_feature;
347 u8_t ouiSuperG[6] = {0x00,0x03,0x7f,0x01, 0x01, 0x00};
348
349 zmw_get_wlan_dev(dev);
350
351
352 subType = (zmw_rx_buf_readb(dev, buf, 0) >> 4);
353 if ((offset = zgElementOffsetTable[subType]) == 0xff)
354 {
355 zm_assert(0);
356 }
357
358
359 offset += 24;
360
361 bufLen = zfwBufGetSize(dev, buf);
362
363 while ((offset+2)<bufLen)
364 {
365
366 if ((id = zmw_rx_buf_readb(dev, buf, offset)) == ZM_WLAN_EID_VENDOR_PRIVATE)
367 {
368
369 if ((elen = zmw_rx_buf_readb(dev, buf, offset+1))>(bufLen - offset))
370 {
371
372 return 0xffff;
373 }
374
375 if ( elen == 0 )
376 {
377 return 0xffff;
378 }
379
380 if (zfRxBufferEqualToStr(dev, buf, ouiSuperG, offset+2, 6) && ( zmw_rx_buf_readb(dev, buf, offset+1) >= 6))
381 {
382
383 super_feature= zmw_rx_buf_readb(dev, buf, offset+8);
384 if ((super_feature & 0x01) || (super_feature & 0x02) || (super_feature & 0x04))
385 {
386 return offset;
387 }
388 }
389 }
390
391 #if 1
392 elen = zmw_rx_buf_readb(dev, buf, offset+1);
393 #else
394 if ((elen = zmw_rx_buf_readb(dev, buf, offset+1)) == 0)
395 {
396 return 0xffff;
397 }
398 #endif
399
400 offset += (elen+2);
401 }
402 return 0xffff;
403}
404
405u16_t zfFindXRElement(zdev_t* dev, zbuf_t* buf, u8_t type)
406{
407 u8_t subType;
408 u16_t offset;
409 u16_t bufLen;
410 u16_t elen;
411 u8_t id;
412 u8_t ouixr[6] = {0x00,0x03,0x7f,0x03, 0x01, 0x00};
413
414 zmw_get_wlan_dev(dev);
415
416
417 subType = (zmw_rx_buf_readb(dev, buf, 0) >> 4);
418 if ((offset = zgElementOffsetTable[subType]) == 0xff)
419 {
420 zm_assert(0);
421 }
422
423
424 offset += 24;
425
426 bufLen = zfwBufGetSize(dev, buf);
427
428 while ((offset+2)<bufLen)
429 {
430
431 if ((id = zmw_rx_buf_readb(dev, buf, offset)) == ZM_WLAN_EID_VENDOR_PRIVATE)
432 {
433
434 if ((elen = zmw_rx_buf_readb(dev, buf, offset+1))>(bufLen - offset))
435 {
436
437 return 0xffff;
438 }
439
440 if ( elen == 0 )
441 {
442 return 0xffff;
443 }
444
445 if (zfRxBufferEqualToStr(dev, buf, ouixr, offset+2, 6) && ( zmw_rx_buf_readb(dev, buf, offset+1) >= 6))
446 {
447 return offset;
448 }
449 }
450
451 #if 1
452 elen = zmw_rx_buf_readb(dev, buf, offset+1);
453 #else
454 if ((elen = zmw_rx_buf_readb(dev, buf, offset+1)) == 0)
455 {
456 return 0xffff;
457 }
458 #endif
459
460 offset += (elen+2);
461 }
462 return 0xffff;
463}
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484u16_t zfMmAddIeSupportRate(zdev_t* dev, zbuf_t* buf, u16_t offset, u8_t eid, u8_t rateSet)
485{
486 u8_t len = 0;
487 u16_t i;
488
489 zmw_get_wlan_dev(dev);
490
491
492
493
494
495
496
497 if ( rateSet == ZM_RATE_SET_CCK )
498 {
499 for (i=0; i<4; i++)
500 {
501 if ((wd->bRate & (0x1<<i)) == (0x1<<i))
502
503 {
504 zmw_tx_buf_writeb(dev, buf, offset+len+2,
505 zg11bRateTbl[i]+((wd->bRateBasic & (0x1<<i))<<(7-i)));
506 len++;
507 }
508 }
509 }
510 else if ( rateSet == ZM_RATE_SET_OFDM )
511 {
512 for (i=0; i<8; i++)
513 {
514 if ((wd->gRate & (0x1<<i)) == (0x1<<i))
515
516 {
517 zmw_tx_buf_writeb(dev, buf, offset+len+2,
518 zg11gRateTbl[i]+((wd->gRateBasic & (0x1<<i))<<(7-i)));
519 len++;
520 }
521 }
522 }
523
524 if (len > 0)
525 {
526
527 zmw_tx_buf_writeb(dev, buf, offset, eid);
528
529
530 zmw_tx_buf_writeb(dev, buf, offset+1, len);
531
532
533 offset += (2+len);
534 }
535
536 return offset;
537}
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556u16_t zfMmAddIeDs(zdev_t* dev, zbuf_t* buf, u16_t offset)
557{
558 zmw_get_wlan_dev(dev);
559
560
561 zmw_tx_buf_writeb(dev, buf, offset++, ZM_WLAN_EID_DS);
562
563
564 zmw_tx_buf_writeb(dev, buf, offset++, 1);
565
566
567 zmw_tx_buf_writeb(dev, buf, offset++,
568 zfChFreqToNum(wd->frequency, NULL));
569
570 return offset;
571}
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591u16_t zfMmAddIeErp(zdev_t* dev, zbuf_t* buf, u16_t offset)
592{
593 zmw_get_wlan_dev(dev);
594
595
596 zmw_tx_buf_writeb(dev, buf, offset++, ZM_WLAN_EID_ERP);
597
598
599 zmw_tx_buf_writeb(dev, buf, offset++, 1);
600
601
602 zmw_tx_buf_writeb(dev, buf, offset++, wd->erpElement);
603
604 return offset;
605}
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625u16_t zfMmAddIeWpa(zdev_t* dev, zbuf_t* buf, u16_t offset, u16_t apId)
626{
627
628 int i;
629
630 zmw_get_wlan_dev(dev);
631
632
633
634
635
636
637 for(i = 0; i < wd->ap.wpaLen[apId]; i++)
638 {
639
640 zmw_tx_buf_writeb(dev, buf, offset++, wd->ap.wpaIe[apId][i]);
641 }
642
643 return offset;
644}
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663u16_t zfMmAddHTCapability(zdev_t* dev, zbuf_t* buf, u16_t offset)
664{
665 u8_t OUI[3] = {0x0,0x90,0x4C};
666 u16_t i;
667
668 zmw_get_wlan_dev(dev);
669
670
671 zmw_buf_writeb(dev, buf, offset++, ZM_WLAN_EID_WPA_IE);
672
673 if ( wd->wlanMode == ZM_MODE_AP )
674 {
675
676 zmw_buf_writeb(dev, buf, offset++, wd->ap.HTCap.Data.Length + 4);
677
678
679 for (i = 0; i < 3; i++)
680 {
681 zmw_buf_writeb(dev, buf, offset++, OUI[i]);
682 }
683
684
685 zmw_buf_writeb(dev, buf, offset++, wd->ap.HTCap.Data.ElementID);
686
687
688 for (i = 0; i < 26; i++)
689 {
690 zmw_buf_writeb(dev, buf, offset++, wd->ap.HTCap.Byte[i+2]);
691 }
692 }
693 else
694 {
695
696 zmw_buf_writeb(dev, buf, offset++, wd->sta.HTCap.Data.Length + 4);
697
698
699 for (i = 0; i < 3; i++)
700 {
701 zmw_buf_writeb(dev, buf, offset++, OUI[i]);
702 }
703
704
705 zmw_buf_writeb(dev, buf, offset++, wd->sta.HTCap.Data.ElementID);
706
707
708 for (i = 0; i < 26; i++)
709 {
710 zmw_buf_writeb(dev, buf, offset++, wd->sta.HTCap.Byte[i+2]);
711 }
712 }
713
714 return offset;
715}
716
717
718u16_t zfMmAddPreNHTCapability(zdev_t* dev, zbuf_t* buf, u16_t offset)
719{
720
721 u16_t i;
722
723 zmw_get_wlan_dev(dev);
724
725
726 zmw_buf_writeb(dev, buf, offset++, ZM_WLAN_PREN2_EID_HTCAPABILITY);
727
728 if ( wd->wlanMode == ZM_MODE_AP )
729 {
730
731 zmw_buf_writeb(dev, buf, offset++, wd->ap.HTCap.Data.Length);
732
733
734 for (i = 0; i < 26; i++)
735 {
736 zmw_buf_writeb(dev, buf, offset++, wd->ap.HTCap.Byte[i+2]);
737 }
738 }
739 else
740 {
741
742 zmw_buf_writeb(dev, buf, offset++, wd->sta.HTCap.Data.Length);
743
744
745 for (i = 0; i < 26; i++)
746 {
747 zmw_buf_writeb(dev, buf, offset++, wd->sta.HTCap.Byte[i+2]);
748 }
749 }
750
751 return offset;
752}
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771u16_t zfMmAddExtendedHTCapability(zdev_t* dev, zbuf_t* buf, u16_t offset)
772{
773 u8_t OUI[3] = {0x0,0x90,0x4C};
774 u16_t i;
775
776 zmw_get_wlan_dev(dev);
777
778
779 zmw_buf_writeb(dev, buf, offset++, ZM_WLAN_EID_WPA_IE);
780
781 if ( wd->wlanMode == ZM_MODE_AP )
782 {
783
784 zmw_buf_writeb(dev, buf, offset++, wd->ap.ExtHTCap.Data.Length + 4);
785
786
787 for (i = 0; i < 3; i++)
788 {
789 zmw_buf_writeb(dev, buf, offset++, OUI[i]);
790 }
791
792
793 zmw_buf_writeb(dev, buf, offset++, wd->ap.ExtHTCap.Data.ElementID);
794
795
796 for (i = 0; i < 22; i++)
797 {
798 zmw_buf_writeb(dev, buf, offset++, wd->ap.ExtHTCap.Byte[i+2]);
799 }
800 }
801 else
802 {
803
804 zmw_buf_writeb(dev, buf, offset++, wd->sta.ExtHTCap.Data.Length + 4);
805
806
807 for (i = 0; i < 3; i++)
808 {
809 zmw_buf_writeb(dev, buf, offset++, OUI[i]);
810 }
811
812
813 zmw_buf_writeb(dev, buf, offset++, wd->sta.ExtHTCap.Data.ElementID);
814
815
816 for (i = 0; i < 22; i++)
817 {
818 zmw_buf_writeb(dev, buf, offset++, wd->sta.ExtHTCap.Byte[i+2]);
819 }
820 }
821
822 return offset;
823}
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856void zfSendMmFrame(zdev_t* dev, u8_t frameType, u16_t* dst,
857 u32_t p1, u32_t p2, u32_t p3)
858{
859 zbuf_t* buf;
860
861
862 u16_t offset = 0;
863 u16_t hlen = 32;
864 u16_t header[(24+25+1)/2];
865 u16_t vap = 0;
866 u16_t i;
867 u8_t encrypt = 0;
868 u16_t aid;
869
870 zmw_get_wlan_dev(dev);
871 zmw_declare_for_critical_section();
872
873 zm_msg2_mm(ZM_LV_2, "Send mm frame, type=", frameType);
874
875 if ((buf = zfwBufAllocate(dev, 1024)) == NULL)
876 {
877 zm_msg0_mm(ZM_LV_0, "Alloc mm buf Fail!");
878 return;
879 }
880
881
882 offset = hlen;
883
884 switch (frameType)
885 {
886 case ZM_WLAN_FRAME_TYPE_PROBEREQ :
887 offset = zfSendProbeReq(dev, buf, offset, (u8_t) p1);
888 break;
889
890 case ZM_WLAN_FRAME_TYPE_PROBERSP :
891 zm_msg0_mm(ZM_LV_3, "probe rsp");
892
893 zmw_tx_buf_writeh(dev, buf, offset, 0);
894 zmw_tx_buf_writeh(dev, buf, offset+2, 0);
895 zmw_tx_buf_writeh(dev, buf, offset+4, 0);
896 zmw_tx_buf_writeh(dev, buf, offset+6, 0);
897 offset+=8;
898
899
900 zmw_tx_buf_writeh(dev, buf, offset, wd->beaconInterval);
901 offset+=2;
902
903 if (wd->wlanMode == ZM_MODE_AP)
904 {
905 vap = (u16_t) p3;
906
907 zmw_tx_buf_writeh(dev, buf, offset, wd->ap.capab[vap]);
908 offset+=2;
909
910 offset = zfApAddIeSsid(dev, buf, offset, vap);
911 }
912 else
913 {
914
915 zmw_tx_buf_writeb(dev, buf, offset++, wd->sta.capability[0]);
916 zmw_tx_buf_writeb(dev, buf, offset++, wd->sta.capability[1]);
917
918 offset = zfStaAddIeSsid(dev, buf, offset);
919 }
920
921
922 if ( wd->frequency < 3000 )
923 {
924 offset = zfMmAddIeSupportRate(dev, buf, offset,
925 ZM_WLAN_EID_SUPPORT_RATE, ZM_RATE_SET_CCK);
926 }
927 else
928 {
929 offset = zfMmAddIeSupportRate(dev, buf, offset,
930 ZM_WLAN_EID_SUPPORT_RATE, ZM_RATE_SET_OFDM);
931 }
932
933
934 offset = zfMmAddIeDs(dev, buf, offset);
935
936
937 if ( wd->wlanMode == ZM_MODE_IBSS )
938 {
939 offset = zfStaAddIeIbss(dev, buf, offset);
940
941 if (wd->frequency < 3000)
942 {
943 if( wd->wfc.bIbssGMode
944 && (wd->supportMode & (ZM_WIRELESS_MODE_24_54|ZM_WIRELESS_MODE_24_N)) )
945 {
946
947 wd->erpElement = 0;
948 offset = zfMmAddIeErp(dev, buf, offset);
949
950
951
952 offset = zfMmAddIeSupportRate(dev, buf, offset,
953 ZM_WLAN_EID_EXTENDED_RATE, ZM_RATE_SET_OFDM);
954 }
955 }
956 }
957
958
959 if ((wd->wlanMode == ZM_MODE_AP)
960 && (wd->ap.wlanType[vap] != ZM_WLAN_TYPE_PURE_B))
961 {
962
963 offset = zfMmAddIeErp(dev, buf, offset);
964
965
966 if ( wd->frequency < 3000 )
967 {
968 offset = zfMmAddIeSupportRate(dev, buf, offset,
969 ZM_WLAN_EID_EXTENDED_RATE, ZM_RATE_SET_OFDM);
970 }
971 }
972
973
974
975
976
977
978
979
980
981 if (wd->wlanMode == ZM_MODE_AP && wd->ap.wpaSupport[vap] == 1)
982 {
983 offset = zfMmAddIeWpa(dev, buf, offset, vap);
984 }
985 else if ( wd->wlanMode == ZM_MODE_IBSS && wd->sta.authMode == ZM_AUTH_MODE_WPA2PSK)
986 {
987 offset = zfwStaAddIeWpaRsn(dev, buf, offset, ZM_WLAN_FRAME_TYPE_AUTH);
988 }
989
990
991 if (wd->wlanMode == ZM_MODE_AP)
992 {
993 if (wd->ap.qosMode == 1)
994 {
995 offset = zfApAddIeWmePara(dev, buf, offset, vap);
996 }
997 }
998
999 if ( wd->wlanMode != ZM_MODE_IBSS )
1000 {
1001
1002
1003
1004
1005 offset = zfMmAddHTCapability(dev, buf, offset);
1006
1007
1008 offset = zfMmAddExtendedHTCapability(dev, buf, offset);
1009 }
1010
1011 if ( wd->sta.ibssAdditionalIESize )
1012 offset = zfStaAddIbssAdditionalIE(dev, buf, offset);
1013 break;
1014
1015 case ZM_WLAN_FRAME_TYPE_AUTH :
1016 if (p1 == 0x30001)
1017 {
1018 hlen += 4;
1019 offset += 4;
1020 encrypt = 1;
1021 }
1022
1023
1024 zmw_tx_buf_writeh(dev, buf, offset, (u16_t)(p1&0xffff));
1025 offset+=2;
1026
1027
1028 zmw_tx_buf_writeh(dev, buf, offset, (u16_t)(p1>>16));
1029 offset+=2;
1030
1031
1032 zmw_tx_buf_writeh(dev, buf, offset, (u16_t)p2);
1033 offset+=2;
1034
1035 if (wd->wlanMode == ZM_MODE_AP)
1036 {
1037 vap = (u16_t) p3;
1038 }
1039
1040
1041 if (p1 == 0x20001)
1042 {
1043 if (p2 == 0)
1044 {
1045 zmw_buf_writeh(dev, buf, offset, 0x8010);
1046 offset+=2;
1047
1048 for (i=0; i<128; i++)
1049 {
1050 wd->ap.challengeText[i] = (u8_t)zfGetRandomNumber(dev, 0);
1051 }
1052 zfCopyToIntTxBuffer(dev, buf, wd->ap.challengeText, offset, 128);
1053 offset += 128;
1054 }
1055 }
1056 else if (p1 == 0x30001)
1057 {
1058
1059 zfCopyToIntTxBuffer(dev, buf, wd->sta.challengeText, offset, wd->sta.challengeText[1]+2);
1060 offset += (wd->sta.challengeText[1]+2);
1061 }
1062
1063 break;
1064
1065 case ZM_WLAN_FRAME_TYPE_ASOCREQ :
1066 case ZM_WLAN_FRAME_TYPE_REASOCREQ :
1067
1068 zmw_tx_buf_writeb(dev, buf, offset++, wd->sta.capability[0]);
1069 zmw_tx_buf_writeb(dev, buf, offset++, wd->sta.capability[1]);
1070
1071
1072 zmw_tx_buf_writeh(dev, buf, offset, 0x0005);
1073 offset+=2;
1074
1075
1076 if (frameType == ZM_WLAN_FRAME_TYPE_REASOCREQ)
1077 {
1078 zmw_tx_buf_writeh(dev, buf, offset, wd->sta.bssid[0]);
1079 offset+=2;
1080 zmw_tx_buf_writeh(dev, buf, offset, wd->sta.bssid[1]);
1081 offset+=2;
1082 zmw_tx_buf_writeh(dev, buf, offset, wd->sta.bssid[2]);
1083 offset+=2;
1084 }
1085
1086
1087 offset = zfStaAddIeSsid(dev, buf, offset);
1088
1089
1090 if ( wd->sta.currentFrequency < 3000 )
1091 {
1092
1093 offset = zfMmAddIeSupportRate(dev, buf, offset, ZM_WLAN_EID_SUPPORT_RATE, ZM_RATE_SET_CCK);
1094 }
1095 else
1096 {
1097
1098 offset = zfMmAddIeSupportRate(dev, buf, offset, ZM_WLAN_EID_SUPPORT_RATE, ZM_RATE_SET_OFDM);
1099 }
1100
1101 if ((wd->sta.capability[1] & ZM_BIT_0) == 1)
1102 {
1103 offset = zfStaAddIePowerCap(dev, buf, offset);
1104 offset = zfStaAddIeSupportCh(dev, buf, offset);
1105 }
1106
1107 if (wd->sta.currentFrequency < 3000)
1108 {
1109
1110 if (wd->supportMode & (ZM_WIRELESS_MODE_24_54|ZM_WIRELESS_MODE_24_N))
1111 {
1112 offset = zfMmAddIeSupportRate(dev, buf, offset, ZM_WLAN_EID_EXTENDED_RATE, ZM_RATE_SET_OFDM);
1113 }
1114 }
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124 offset = zfwStaAddIeWpaRsn(dev, buf, offset, frameType);
1125
1126#ifdef ZM_ENABLE_CENC
1127
1128
1129 offset = zfStaAddIeCenc(dev, buf, offset);
1130#endif
1131 if (((wd->sta.wmeEnabled & ZM_STA_WME_ENABLE_BIT) != 0)
1132 && ((wd->sta.apWmeCapability & 0x1) != 0))
1133 {
1134 if (((wd->sta.apWmeCapability & 0x80) != 0)
1135 && ((wd->sta.wmeEnabled & ZM_STA_UAPSD_ENABLE_BIT) != 0))
1136 {
1137 offset = zfStaAddIeWmeInfo(dev, buf, offset, wd->sta.wmeQosInfo);
1138 }
1139 else
1140 {
1141 offset = zfStaAddIeWmeInfo(dev, buf, offset, 0);
1142 }
1143 }
1144
1145
1146 if (wd->sta.EnableHT != 0)
1147 {
1148 #ifndef ZM_DISABLE_AMSDU8K_SUPPORT
1149
1150 if (wd->sta.wepStatus == ZM_ENCRYPTION_WEP_DISABLED)
1151 {
1152 wd->sta.HTCap.Data.HtCapInfo |= HTCAP_MaxAMSDULength;
1153 }
1154 else
1155 {
1156 wd->sta.HTCap.Data.HtCapInfo &= (~HTCAP_MaxAMSDULength);
1157 }
1158 #else
1159
1160 wd->sta.HTCap.Data.HtCapInfo &= (~HTCAP_MaxAMSDULength);
1161 #endif
1162
1163
1164 if (wd->BandWidth40 == 1) {
1165 wd->sta.HTCap.Data.HtCapInfo |= HTCAP_SupChannelWidthSet;
1166 }
1167 else {
1168 wd->sta.HTCap.Data.HtCapInfo &= ~HTCAP_SupChannelWidthSet;
1169
1170 }
1171
1172 wd->sta.HTCap.Data.AMPDUParam &= ~HTCAP_MaxRxAMPDU3;
1173 wd->sta.HTCap.Data.AMPDUParam |= HTCAP_MaxRxAMPDU3;
1174 wd->sta.HTCap.Data.MCSSet[1] = 0xFF;
1175 offset = zfMmAddHTCapability(dev, buf, offset);
1176 offset = zfMmAddPreNHTCapability(dev, buf, offset);
1177
1178
1179
1180 }
1181
1182
1183
1184 wd->sta.asocReqFrameBodySize = ((offset - hlen) >
1185 ZM_CACHED_FRAMEBODY_SIZE)?
1186 ZM_CACHED_FRAMEBODY_SIZE:(offset - hlen);
1187 for (i=0; i<wd->sta.asocReqFrameBodySize; i++)
1188 {
1189 wd->sta.asocReqFrameBody[i] = zmw_tx_buf_readb(dev, buf, i + hlen);
1190 }
1191 break;
1192
1193 case ZM_WLAN_FRAME_TYPE_ASOCRSP :
1194 case ZM_WLAN_FRAME_TYPE_REASOCRSP :
1195 vap = (u16_t) p3;
1196
1197
1198 zmw_tx_buf_writeh(dev, buf, offset, wd->ap.capab[vap]);
1199 offset+=2;
1200
1201
1202 zmw_tx_buf_writeh(dev, buf, offset, (u16_t)p1);
1203 offset+=2;
1204
1205
1206 zmw_tx_buf_writeh(dev, buf, offset, (u16_t)(p2|0xc000));
1207 offset+=2;
1208
1209
1210 if ( wd->frequency < 3000 )
1211 {
1212
1213 offset = zfMmAddIeSupportRate(dev, buf, offset, ZM_WLAN_EID_SUPPORT_RATE, ZM_RATE_SET_CCK);
1214
1215
1216 offset = zfMmAddIeSupportRate(dev, buf, offset, ZM_WLAN_EID_EXTENDED_RATE, ZM_RATE_SET_OFDM);
1217 }
1218 else
1219 {
1220
1221 offset = zfMmAddIeSupportRate(dev, buf, offset, ZM_WLAN_EID_SUPPORT_RATE, ZM_RATE_SET_OFDM);
1222 }
1223
1224
1225
1226
1227 if (wd->wlanMode == ZM_MODE_AP)
1228 {
1229
1230 if (wd->ap.qosMode == 1)
1231 {
1232 offset = zfApAddIeWmePara(dev, buf, offset, vap);
1233 }
1234 }
1235
1236
1237
1238 offset = zfMmAddHTCapability(dev, buf, offset);
1239
1240
1241 offset = zfMmAddExtendedHTCapability(dev, buf, offset);
1242 break;
1243
1244 case ZM_WLAN_FRAME_TYPE_ATIM :
1245
1246
1247 offset += 2;
1248 break;
1249
1250 case ZM_WLAN_FRAME_TYPE_QOS_NULL :
1251 zmw_buf_writeh(dev, buf, offset, 0x0010);
1252 offset += 2;
1253 break;
1254
1255 case ZM_WLAN_DATA_FRAME :
1256 break;
1257
1258 case ZM_WLAN_FRAME_TYPE_DISASOC :
1259 case ZM_WLAN_FRAME_TYPE_DEAUTH :
1260 if (wd->wlanMode == ZM_MODE_AP)
1261 {
1262 vap = (u16_t) p3;
1263
1264 if ((aid = zfApFindSta(dev, dst)) != 0xffff)
1265 {
1266 zmw_enter_critical_section(dev);
1267
1268 wd->ap.staTable[aid].valid = 0;
1269
1270 zmw_leave_critical_section(dev);
1271
1272 if (wd->zfcbDisAsocNotify != NULL)
1273 {
1274 wd->zfcbDisAsocNotify(dev, (u8_t*)dst, vap);
1275 }
1276 }
1277 }
1278
1279 zmw_tx_buf_writeh(dev, buf, offset, (u16_t)p1);
1280 offset+=2;
1281 break;
1282 }
1283
1284 zfwBufSetSize(dev, buf, offset);
1285
1286 zm_msg2_mm(ZM_LV_2, "management frame body size=", offset-hlen);
1287
1288
1289 zfTxGenMmHeader(dev, frameType, dst, header, offset-hlen, buf, vap, encrypt);
1290 for (i=0; i<(hlen>>1); i++)
1291 {
1292 zmw_tx_buf_writeh(dev, buf, i*2, header[i]);
1293 }
1294
1295
1296
1297
1298
1299
1300
1301
1302 zm_msg2_mm(ZM_LV_2, "offset=", offset);
1303 zm_msg2_mm(ZM_LV_2, "hlen=", hlen);
1304
1305
1306
1307
1308
1309 #if 0
1310 if ((err = zfHpSend(dev, NULL, 0, NULL, 0, NULL, 0, buf, 0,
1311 ZM_INTERNAL_ALLOC_BUF, 0, 0xff)) != ZM_SUCCESS)
1312 {
1313 goto zlError;
1314 }
1315 #else
1316 zfPutVmmq(dev, buf);
1317 zfPushVtxq(dev);
1318 #endif
1319
1320 return;
1321#if 0
1322zlError:
1323
1324 zfwBufFree(dev, buf, 0);
1325 return;
1326#endif
1327}
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346void zfProcessManagement(zdev_t* dev, zbuf_t* buf, struct zsAdditionInfo* AddInfo)
1347{
1348 u8_t frameType;
1349 u16_t ta[3];
1350 u16_t ra[3];
1351 u16_t vap = 0, index = 0;
1352
1353
1354 zmw_get_wlan_dev(dev);
1355
1356 ra[0] = zmw_rx_buf_readh(dev, buf, 4);
1357 ra[1] = zmw_rx_buf_readh(dev, buf, 6);
1358 ra[2] = zmw_rx_buf_readh(dev, buf, 8);
1359
1360 ta[0] = zmw_rx_buf_readh(dev, buf, 10);
1361 ta[1] = zmw_rx_buf_readh(dev, buf, 12);
1362 ta[2] = zmw_rx_buf_readh(dev, buf, 14);
1363
1364 frameType = zmw_rx_buf_readb(dev, buf, 0);
1365
1366 if (wd->wlanMode == ZM_MODE_AP)
1367 {
1368#if 1
1369 vap = 0;
1370 if ((ra[0] & 0x1) != 1)
1371 {
1372
1373 if ((index = zfApFindSta(dev, ta)) != 0xffff)
1374 {
1375 vap = wd->ap.staTable[index].vap;
1376 }
1377 }
1378 zm_msg2_mm(ZM_LV_2, "vap=", vap);
1379#endif
1380
1381
1382 switch (frameType)
1383 {
1384
1385 case ZM_WLAN_FRAME_TYPE_BEACON :
1386 zfApProcessBeacon(dev, buf);
1387 break;
1388
1389 case ZM_WLAN_FRAME_TYPE_AUTH :
1390 zfApProcessAuth(dev, buf, ta, vap);
1391 break;
1392
1393 case ZM_WLAN_FRAME_TYPE_ASOCREQ :
1394
1395 case ZM_WLAN_FRAME_TYPE_REASOCREQ :
1396 zfApProcessAsocReq(dev, buf, ta, vap);
1397 break;
1398
1399 case ZM_WLAN_FRAME_TYPE_ASOCRSP :
1400
1401 break;
1402
1403 case ZM_WLAN_FRAME_TYPE_DEAUTH :
1404 zfApProcessDeauth(dev, buf, ta, vap);
1405 break;
1406
1407 case ZM_WLAN_FRAME_TYPE_DISASOC :
1408 zfApProcessDisasoc(dev, buf, ta, vap);
1409 break;
1410
1411 case ZM_WLAN_FRAME_TYPE_PROBEREQ :
1412 zfProcessProbeReq(dev, buf, ta);
1413 break;
1414
1415 case ZM_WLAN_FRAME_TYPE_PROBERSP :
1416 zfApProcessProbeRsp(dev, buf, AddInfo);
1417 break;
1418
1419 case ZM_WLAN_FRAME_TYPE_ACTION :
1420 zfApProcessAction(dev, buf);
1421 break;
1422 }
1423 }
1424 else
1425 {
1426
1427 switch (frameType)
1428 {
1429
1430 case ZM_WLAN_FRAME_TYPE_BEACON :
1431
1432 if (((wd->regulationTable.allowChannel[wd->regulationTable.CurChIndex].channelFlags
1433 & ZM_REG_FLAG_CHANNEL_CSA) != 0) && wd->sta.DFSEnable)
1434 {
1435 wd->regulationTable.allowChannel[wd->regulationTable.CurChIndex].channelFlags
1436 &= ~(ZM_REG_FLAG_CHANNEL_CSA & ZM_REG_FLAG_CHANNEL_PASSIVE);
1437 }
1438 zfStaProcessBeacon(dev, buf, AddInfo);
1439 break;
1440
1441 case ZM_WLAN_FRAME_TYPE_AUTH :
1442
1443 zfStaProcessAuth(dev, buf, ta, 0);
1444 break;
1445
1446 case ZM_WLAN_FRAME_TYPE_ASOCREQ :
1447
1448 zfStaProcessAsocReq(dev, buf, ta, 0);
1449 break;
1450
1451 case ZM_WLAN_FRAME_TYPE_ASOCRSP :
1452
1453 case ZM_WLAN_FRAME_TYPE_REASOCRSP :
1454 zfStaProcessAsocRsp(dev, buf);
1455 break;
1456
1457 case ZM_WLAN_FRAME_TYPE_DEAUTH :
1458 zm_debug_msg0("Deauthentication received");
1459 zfStaProcessDeauth(dev, buf);
1460 break;
1461
1462 case ZM_WLAN_FRAME_TYPE_DISASOC :
1463 zm_debug_msg0("Disassociation received");
1464 zfStaProcessDisasoc(dev, buf);
1465 break;
1466
1467 case ZM_WLAN_FRAME_TYPE_PROBEREQ :
1468 zfProcessProbeReq(dev, buf, ta);
1469 break;
1470
1471 case ZM_WLAN_FRAME_TYPE_PROBERSP :
1472
1473 if (((wd->regulationTable.allowChannel[wd->regulationTable.CurChIndex].channelFlags
1474 & ZM_REG_FLAG_CHANNEL_CSA) != 0) && wd->sta.DFSEnable)
1475 {
1476 wd->regulationTable.allowChannel[wd->regulationTable.CurChIndex].channelFlags
1477 &= ~(ZM_REG_FLAG_CHANNEL_CSA & ZM_REG_FLAG_CHANNEL_PASSIVE);
1478 }
1479 zfStaProcessProbeRsp(dev, buf, AddInfo);
1480 break;
1481
1482 case ZM_WLAN_FRAME_TYPE_ATIM:
1483 zfStaProcessAtim(dev, buf);
1484 break;
1485
1486 case ZM_WLAN_FRAME_TYPE_ACTION :
1487 zm_msg0_mm(ZM_LV_2, "ProcessActionMgtFrame");
1488 zfStaProcessAction(dev, buf);
1489 break;
1490 }
1491 }
1492}
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510void zfProcessProbeReq(zdev_t* dev, zbuf_t* buf, u16_t* src)
1511{
1512 u16_t offset;
1513 u8_t len;
1514 u16_t i, j;
1515 u8_t ch;
1516 u16_t sendFlag;
1517
1518 zmw_get_wlan_dev(dev);
1519
1520
1521 if ((wd->wlanMode != ZM_MODE_AP) && (wd->wlanMode != ZM_MODE_IBSS))
1522 {
1523 zm_msg0_mm(ZM_LV_3, "Ignore probe req");
1524 return;
1525 }
1526
1527 if ((wd->wlanMode != ZM_MODE_AP) && (wd->sta.adapterState == ZM_STA_STATE_DISCONNECT))
1528 {
1529 zm_msg0_mm(ZM_LV_3, "Packets dropped due to disconnect state");
1530 return;
1531 }
1532
1533 if ( wd->wlanMode == ZM_MODE_IBSS )
1534 {
1535 zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_PROBERSP, src, 0, 0, 0);
1536
1537 return;
1538 }
1539
1540
1541 if ((offset = zfFindElement(dev, buf, ZM_WLAN_EID_SSID)) == 0xffff)
1542 {
1543 zm_msg0_mm(ZM_LV_3, "probe req SSID not found");
1544 return;
1545 }
1546
1547 len = zmw_rx_buf_readb(dev, buf, offset+1);
1548
1549 for (i=0; i<ZM_MAX_AP_SUPPORT; i++)
1550 {
1551 if ((wd->ap.apBitmap & (1<<i)) != 0)
1552 {
1553 zm_msg1_mm(ZM_LV_3, "len=", len);
1554 sendFlag = 0;
1555
1556 if (len == 0)
1557 {
1558 if (wd->ap.hideSsid[i] == 0)
1559 {
1560 sendFlag = 1;
1561 }
1562 }
1563
1564 else if (wd->ap.ssidLen[i] == len)
1565 {
1566 for (j=0; j<len; j++)
1567 {
1568 if ((ch = zmw_rx_buf_readb(dev, buf, offset+2+j))
1569 != wd->ap.ssid[i][j])
1570 {
1571 break;
1572 }
1573 }
1574 if (j == len)
1575 {
1576 sendFlag = 1;
1577 }
1578 }
1579 if (sendFlag == 1)
1580 {
1581
1582 zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_PROBERSP, src, i, 0, i);
1583 }
1584 }
1585 }
1586}
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605void zfProcessProbeRsp(zdev_t* dev, zbuf_t* buf, struct zsAdditionInfo* AddInfo)
1606{
1607
1608
1609 struct zsWlanProbeRspFrameHeader* pProbeRspHeader;
1610 struct zsBssInfo* pBssInfo;
1611 u8_t pBuf[sizeof(struct zsWlanProbeRspFrameHeader)];
1612 int res;
1613
1614 zmw_get_wlan_dev(dev);
1615
1616 zmw_declare_for_critical_section();
1617
1618 zfCopyFromRxBuffer(dev, buf, pBuf, 0,
1619 sizeof(struct zsWlanProbeRspFrameHeader));
1620 pProbeRspHeader = (struct zsWlanProbeRspFrameHeader*) pBuf;
1621
1622 zmw_enter_critical_section(dev);
1623
1624
1625
1626 pBssInfo = zfStaFindBssInfo(dev, buf, pProbeRspHeader);
1627
1628
1629 if ( pBssInfo == NULL )
1630 {
1631
1632 pBssInfo = zfBssInfoAllocate(dev);
1633 if (pBssInfo != NULL)
1634 {
1635 res = zfStaInitBssInfo(dev, buf, pProbeRspHeader, pBssInfo, AddInfo, 0);
1636
1637 if ( res != 0 )
1638 {
1639 zfBssInfoFree(dev, pBssInfo);
1640 }
1641 else
1642 {
1643 zfBssInfoInsertToList(dev, pBssInfo);
1644 }
1645 }
1646 }
1647 else
1648 {
1649 res = zfStaInitBssInfo(dev, buf, pProbeRspHeader, pBssInfo, AddInfo, 1);
1650 if (res == 2)
1651 {
1652 zfBssInfoRemoveFromList(dev, pBssInfo);
1653 zfBssInfoFree(dev, pBssInfo);
1654 }
1655 else if ( wd->wlanMode == ZM_MODE_IBSS )
1656 {
1657 int idx;
1658
1659
1660 zfStaFindFreeOpposite(dev, (u16_t *)pBssInfo->macaddr, &idx);
1661 }
1662 }
1663
1664 zmw_leave_critical_section(dev);
1665
1666 return;
1667}
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686u16_t zfSendProbeReq(zdev_t* dev, zbuf_t* buf, u16_t offset, u8_t bWithSSID)
1687{
1688 zmw_get_wlan_dev(dev);
1689 zmw_declare_for_critical_section();
1690
1691
1692
1693 if (bWithSSID == 0)
1694 {
1695
1696 zmw_tx_buf_writeb(dev, buf, offset++, ZM_WLAN_EID_SSID);
1697 zmw_tx_buf_writeb(dev, buf, offset++, 0);
1698 }
1699 else
1700 {
1701 zmw_enter_critical_section(dev);
1702 if (wd->ws.probingSsidList[bWithSSID-1].ssidLen == 0)
1703 {
1704 zmw_tx_buf_writeb(dev, buf, offset++, ZM_WLAN_EID_SSID);
1705 zmw_tx_buf_writeb(dev, buf, offset++, 0);
1706 }
1707 else
1708 {
1709 zmw_tx_buf_writeb(dev, buf, offset++, ZM_WLAN_EID_SSID);
1710 zmw_tx_buf_writeb(dev, buf, offset++,
1711 wd->ws.probingSsidList[bWithSSID-1].ssidLen);
1712 zfCopyToIntTxBuffer(dev, buf,
1713 wd->ws.probingSsidList[bWithSSID-1].ssid,
1714 offset,
1715 wd->ws.probingSsidList[bWithSSID-1].ssidLen);
1716 offset += wd->ws.probingSsidList[bWithSSID-1].ssidLen;
1717 }
1718 zmw_leave_critical_section(dev);
1719 }
1720
1721
1722 if ( wd->sta.currentFrequency < 3000 )
1723 {
1724 offset = zfMmAddIeSupportRate(dev, buf, offset,
1725 ZM_WLAN_EID_SUPPORT_RATE, ZM_RATE_SET_CCK);
1726
1727 if (wd->supportMode & (ZM_WIRELESS_MODE_24_54|ZM_WIRELESS_MODE_24_N)) {
1728 if (wd->wlanMode == ZM_MODE_IBSS) {
1729 if (wd->wfc.bIbssGMode) {
1730 offset = zfMmAddIeSupportRate(dev, buf, offset,
1731 ZM_WLAN_EID_EXTENDED_RATE, ZM_RATE_SET_OFDM);
1732 }
1733 } else {
1734 offset = zfMmAddIeSupportRate(dev, buf, offset,
1735 ZM_WLAN_EID_EXTENDED_RATE, ZM_RATE_SET_OFDM);
1736 }
1737 }
1738 }
1739 else
1740 {
1741 offset = zfMmAddIeSupportRate(dev, buf, offset,
1742 ZM_WLAN_EID_SUPPORT_RATE, ZM_RATE_SET_OFDM);
1743 }
1744
1745 return offset;
1746}
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765void zfUpdateDefaultQosParameter(zdev_t* dev, u8_t mode)
1766{
1767 u16_t cwmin[5];
1768 u16_t cwmax[5];
1769 u16_t aifs[5];
1770 u16_t txop[5];
1771
1772
1773
1774 cwmin[0] = 15;
1775 cwmax[0] = 1023;
1776 aifs[0] = 3 * 9 + 10;
1777 txop[0] = 0;
1778
1779 cwmin[1] = 15;
1780 cwmax[1] = 1023;
1781 aifs[1] = 7 * 9 + 10;
1782 txop[1] = 0;
1783
1784 cwmin[2] = 7;
1785 cwmax[2] = 15;
1786 aifs[2] = 2 * 9 + 10;
1787 txop[2] = 94;
1788
1789 cwmin[3] = 3;
1790 cwmax[3] = 7;
1791 aifs[3] = 2 * 9 + 10;
1792 txop[3] = 47;
1793
1794 cwmin[4] = 3;
1795 cwmax[4] = 7;
1796 aifs[4] = 2 * 9 + 10;
1797 txop[4] = 0;
1798
1799
1800 if (mode == 1)
1801 {
1802 cwmax[0] = 63;
1803 aifs[3] = 1 * 9 + 10;
1804 aifs[4] = 1 * 9 + 10;
1805 }
1806 zfHpUpdateQosParameter(dev, cwmin, cwmax, aifs, txop);
1807}
1808
1809u16_t zfFindATHExtCap(zdev_t* dev, zbuf_t* buf, u8_t type, u8_t subtype)
1810{
1811 u8_t subType;
1812 u16_t offset;
1813 u16_t bufLen;
1814 u16_t elen;
1815 u8_t id;
1816 u8_t tmp;
1817
1818
1819 subType = (zmw_rx_buf_readb(dev, buf, 0) >> 4);
1820
1821 if ((offset = zgElementOffsetTable[subType]) == 0xff)
1822 {
1823 zm_assert(0);
1824 }
1825
1826
1827 offset += 24;
1828
1829 bufLen = zfwBufGetSize(dev, buf);
1830
1831
1832 while ((offset+2)<bufLen)
1833 {
1834
1835 if ((id = zmw_rx_buf_readb(dev, buf, offset)) == ZM_WLAN_EID_WIFI_IE)
1836 {
1837
1838 if ((elen = zmw_rx_buf_readb(dev, buf, offset+1))>(bufLen - offset))
1839 {
1840
1841 return 0xffff;
1842 }
1843
1844 if ( elen == 0 )
1845 {
1846 return 0xffff;
1847 }
1848
1849 if (((tmp = zmw_rx_buf_readb(dev, buf, offset+2)) == 0x00)
1850 && ((tmp = zmw_rx_buf_readb(dev, buf, offset+3)) == 0x03)
1851 && ((tmp = zmw_rx_buf_readb(dev, buf, offset+4)) == 0x7f)
1852 && ((tmp = zmw_rx_buf_readb(dev, buf, offset+5)) == type))
1853
1854 {
1855 if ( subtype != 0xff )
1856 {
1857 if ( (tmp = zmw_rx_buf_readb(dev, buf, offset+6)) == subtype )
1858 {
1859 return offset;
1860 }
1861 }
1862 else
1863 {
1864 return offset;
1865 }
1866 }
1867 }
1868
1869
1870 if ((elen = zmw_rx_buf_readb(dev, buf, offset+1)) == 0)
1871 {
1872 return 0xffff;
1873 }
1874 offset += (elen+2);
1875 }
1876 return 0xffff;
1877}
1878
1879u16_t zfFindBrdcmMrvlRlnkExtCap(zdev_t* dev, zbuf_t* buf)
1880{
1881 u8_t subType;
1882 u16_t offset;
1883 u16_t bufLen;
1884 u16_t elen;
1885 u8_t id;
1886 u8_t tmp;
1887
1888
1889 subType = (zmw_rx_buf_readb(dev, buf, 0) >> 4);
1890
1891 if ((offset = zgElementOffsetTable[subType]) == 0xff)
1892 {
1893 zm_assert(0);
1894 }
1895
1896
1897 offset += 24;
1898
1899 bufLen = zfwBufGetSize(dev, buf);
1900
1901
1902 while ((offset+2)<bufLen)
1903 {
1904
1905 if ((id = zmw_rx_buf_readb(dev, buf, offset)) == ZM_WLAN_EID_WIFI_IE)
1906 {
1907
1908 if ((elen = zmw_rx_buf_readb(dev, buf, offset+1))>(bufLen - offset))
1909 {
1910
1911 return 0xffff;
1912 }
1913
1914 if ( elen == 0 )
1915 {
1916 return 0xffff;
1917 }
1918
1919 if (((tmp = zmw_rx_buf_readb(dev, buf, offset+2)) == 0x00)
1920 && ((tmp = zmw_rx_buf_readb(dev, buf, offset+3)) == 0x10)
1921 && ((tmp = zmw_rx_buf_readb(dev, buf, offset+4)) == 0x18))
1922
1923 {
1924 return offset;
1925 }
1926 else if (((tmp = zmw_rx_buf_readb(dev, buf, offset+2)) == 0x00)
1927 && ((tmp = zmw_rx_buf_readb(dev, buf, offset+3)) == 0x50)
1928 && ((tmp = zmw_rx_buf_readb(dev, buf, offset+4)) == 0x43))
1929
1930 {
1931 return offset;
1932 }
1933 }
1934 else if ((id = zmw_rx_buf_readb(dev, buf, offset)) == 0x7F)
1935 {
1936
1937 if ((elen = zmw_rx_buf_readb(dev, buf, offset+1))>(bufLen - offset))
1938 {
1939
1940 return 0xffff;
1941 }
1942
1943 if ( elen == 0 )
1944 {
1945 return 0xffff;
1946 }
1947
1948 if ((tmp = zmw_rx_buf_readb(dev, buf, offset+2)) == 0x01)
1949
1950 {
1951 return offset;
1952 }
1953 }
1954
1955
1956 if ((elen = zmw_rx_buf_readb(dev, buf, offset+1)) == 0)
1957 {
1958 return 0xffff;
1959 }
1960 offset += (elen+2);
1961 }
1962 return 0xffff;
1963}
1964
1965u16_t zfFindMarvelExtCap(zdev_t* dev, zbuf_t* buf)
1966{
1967 u8_t subType;
1968 u16_t offset;
1969 u16_t bufLen;
1970 u16_t elen;
1971 u8_t id;
1972 u8_t tmp;
1973
1974
1975 subType = (zmw_rx_buf_readb(dev, buf, 0) >> 4);
1976
1977 if ((offset = zgElementOffsetTable[subType]) == 0xff)
1978 {
1979 zm_assert(0);
1980 }
1981
1982
1983 offset += 24;
1984
1985 bufLen = zfwBufGetSize(dev, buf);
1986
1987
1988 while ((offset+2)<bufLen)
1989 {
1990
1991 if ((id = zmw_rx_buf_readb(dev, buf, offset)) == ZM_WLAN_EID_WIFI_IE)
1992 {
1993
1994 if ((elen = zmw_rx_buf_readb(dev, buf, offset+1))>(bufLen - offset))
1995 {
1996
1997 return 0xffff;
1998 }
1999
2000 if ( elen == 0 )
2001 {
2002 return 0xffff;
2003 }
2004
2005 if (((tmp = zmw_rx_buf_readb(dev, buf, offset+2)) == 0x00)
2006 && ((tmp = zmw_rx_buf_readb(dev, buf, offset+3)) == 0x50)
2007 && ((tmp = zmw_rx_buf_readb(dev, buf, offset+4)) == 0x43))
2008
2009 {
2010 return offset;
2011 }
2012 }
2013
2014
2015 if ((elen = zmw_rx_buf_readb(dev, buf, offset+1)) == 0)
2016 {
2017 return 0xffff;
2018 }
2019 offset += (elen+2);
2020 }
2021 return 0xffff;
2022}
2023
2024u16_t zfFindBroadcomExtCap(zdev_t* dev, zbuf_t* buf)
2025{
2026 u8_t subType;
2027 u16_t offset;
2028 u16_t bufLen;
2029 u16_t elen;
2030 u8_t id;
2031 u8_t tmp;
2032
2033
2034 subType = (zmw_rx_buf_readb(dev, buf, 0) >> 4);
2035
2036 if ((offset = zgElementOffsetTable[subType]) == 0xff)
2037 {
2038 zm_assert(0);
2039 }
2040
2041
2042 offset += 24;
2043
2044 bufLen = zfwBufGetSize(dev, buf);
2045
2046
2047 while((offset+2) < bufLen)
2048 {
2049
2050 if ((id = zmw_rx_buf_readb(dev, buf, offset)) == ZM_WLAN_EID_WIFI_IE)
2051 {
2052
2053 if ((elen = zmw_rx_buf_readb(dev, buf, offset+1)) > (bufLen - offset))
2054 {
2055
2056 return 0xffff;
2057 }
2058
2059 if (elen == 0)
2060 {
2061 return 0xffff;
2062 }
2063
2064 if ( ((tmp = zmw_rx_buf_readb(dev, buf, offset+2)) == 0x00)
2065 && ((tmp = zmw_rx_buf_readb(dev, buf, offset+3)) == 0x10)
2066 && ((tmp = zmw_rx_buf_readb(dev, buf, offset+4)) == 0x18) )
2067 {
2068 return offset;
2069 }
2070 }
2071
2072
2073 if ((elen = zmw_rx_buf_readb(dev, buf, offset+1)) == 0)
2074 {
2075 return 0xffff;
2076 }
2077
2078 offset += (elen+2);
2079 }
2080
2081 return 0xffff;
2082}
2083
2084u16_t zfFindRlnkExtCap(zdev_t* dev, zbuf_t* buf)
2085{
2086 u8_t subType;
2087 u16_t offset;
2088 u16_t bufLen;
2089 u16_t elen;
2090 u8_t id;
2091 u8_t tmp;
2092
2093
2094 subType = (zmw_rx_buf_readb(dev, buf, 0) >> 4);
2095
2096 if ((offset = zgElementOffsetTable[subType]) == 0xff)
2097 {
2098 zm_assert(0);
2099 }
2100
2101
2102 offset += 24;
2103
2104 bufLen = zfwBufGetSize(dev, buf);
2105
2106
2107 while((offset+2) < bufLen)
2108 {
2109
2110 if ((id = zmw_rx_buf_readb(dev, buf, offset)) == 0x7F)
2111 {
2112
2113 if ((elen = zmw_rx_buf_readb(dev, buf, offset+1)) > (bufLen - offset))
2114 {
2115
2116 return 0xffff;
2117 }
2118
2119 if ( elen == 0 )
2120 {
2121 return 0xffff;
2122 }
2123
2124 if ((tmp = zmw_rx_buf_readb(dev, buf, offset+2)) == 0x01)
2125
2126 {
2127 return offset;
2128 }
2129 }
2130
2131
2132 if ((elen = zmw_rx_buf_readb(dev, buf, offset+1)) == 0)
2133 {
2134 return 0xffff;
2135 }
2136
2137 offset += (elen+2);
2138 }
2139
2140 return 0xffff;
2141}
2142