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#include <linux/module.h>
27#include <linux/if_arp.h>
28#include <linux/uaccess.h>
29
30#include "usbdrv.h"
31
32#define ZD_IOCTL_WPA (SIOCDEVPRIVATE + 1)
33#define ZD_IOCTL_PARAM (SIOCDEVPRIVATE + 2)
34#define ZD_IOCTL_GETWPAIE (SIOCDEVPRIVATE + 3)
35#ifdef ZM_ENABLE_CENC
36#define ZM_IOCTL_CENC (SIOCDEVPRIVATE + 4)
37#endif
38#define ZD_PARAM_ROAMING 0x0001
39#define ZD_PARAM_PRIVACY 0x0002
40#define ZD_PARAM_WPA 0x0003
41#define ZD_PARAM_COUNTERMEASURES 0x0004
42#define ZD_PARAM_DROPUNENCRYPTED 0x0005
43#define ZD_PARAM_AUTH_ALGS 0x0006
44#define ZD_PARAM_WPS_FILTER 0x0007
45
46#ifdef ZM_ENABLE_CENC
47#define P80211_PACKET_CENCFLAG 0x0001
48#endif
49#define P80211_PACKET_SETKEY 0x0003
50
51#define ZD_CMD_SET_ENCRYPT_KEY 0x0001
52#define ZD_CMD_SET_MLME 0x0002
53#define ZD_CMD_SCAN_REQ 0x0003
54#define ZD_CMD_SET_GENERIC_ELEMENT 0x0004
55#define ZD_CMD_GET_TSC 0x0005
56
57#define ZD_CRYPT_ALG_NAME_LEN 16
58#define ZD_MAX_KEY_SIZE 32
59#define ZD_MAX_GENERIC_SIZE 64
60
61#include <net/iw_handler.h>
62
63extern u16_t zfLnxGetVapId(zdev_t *dev);
64
65static const u32_t channel_frequency_11A[] =
66{
67
68 36, 5180,
69 40, 5200,
70 44, 5220,
71 48, 5240,
72 52, 5260,
73 56, 5280,
74 60, 5300,
75 64, 5320,
76 100, 5500,
77 104, 5520,
78 108, 5540,
79 112, 5560,
80 116, 5580,
81 120, 5600,
82 124, 5620,
83 128, 5640,
84 132, 5660,
85 136, 5680,
86 140, 5700,
87
88 184, 4920,
89 188, 4940,
90 192, 4960,
91 196, 4980,
92 8, 5040,
93 12, 5060,
94 16, 5080,
95 34, 5170,
96 38, 5190,
97 42, 5210,
98 46, 5230,
99
100 149, 5745,
101 153, 5765,
102 157, 5785,
103 161, 5805,
104 165, 5825
105
106};
107
108int usbdrv_freq2chan(u32_t freq)
109{
110
111 if (freq > 2400 && freq < 3000) {
112 return ((freq-2412)/5) + 1;
113 } else {
114 u16_t ii;
115 u16_t num_chan = sizeof(channel_frequency_11A)/sizeof(u32_t);
116
117 for (ii = 1; ii < num_chan; ii += 2) {
118 if (channel_frequency_11A[ii] == freq)
119 return channel_frequency_11A[ii-1];
120 }
121 }
122
123 return 0;
124}
125
126int usbdrv_chan2freq(int chan)
127{
128 int freq;
129
130
131 if (chan > 165 || chan <= 0)
132 return -1;
133
134
135 if (chan >= 1 && chan <= 13) {
136 freq = (2412 + (chan - 1) * 5);
137 return freq;
138 } else if (chan >= 36 && chan <= 165) {
139 u16_t ii;
140 u16_t num_chan = sizeof(channel_frequency_11A)/sizeof(u32_t);
141
142 for (ii = 0; ii < num_chan; ii += 2) {
143 if (channel_frequency_11A[ii] == chan)
144 return channel_frequency_11A[ii+1];
145 }
146
147
148 if (ii == num_chan)
149 return -1;
150 }
151
152
153 return -1;
154}
155
156int usbdrv_ioctl_setessid(struct net_device *dev, struct iw_point *erq)
157{
158 #ifdef ZM_HOSTAPD_SUPPORT
159
160 char essidbuf[IW_ESSID_MAX_SIZE+1];
161 int i;
162
163 if (!netif_running(dev))
164 return -EINVAL;
165
166 memset(essidbuf, 0, sizeof(essidbuf));
167
168 printk(KERN_ERR "usbdrv_ioctl_setessid\n");
169
170
171 if (erq->flags) {
172 if (erq->length > (IW_ESSID_MAX_SIZE+1))
173 return -E2BIG;
174
175 if (copy_from_user(essidbuf, erq->pointer, erq->length))
176 return -EFAULT;
177 }
178
179
180
181
182 printk(KERN_ERR "essidbuf: ");
183
184 for (i = 0; i < erq->length; i++)
185 printk(KERN_ERR "%02x ", essidbuf[i]);
186
187 printk(KERN_ERR "\n");
188
189 essidbuf[erq->length] = '\0';
190
191
192
193
194 zfiWlanSetSSID(dev, essidbuf, erq->length);
195 #if 0
196 printk(KERN_ERR "macp->wd.ws.ssid: ");
197
198 for (i = 0; i < macp->wd.ws.ssidLen; i++)
199 printk(KERN_ERR "%02x ", macp->wd.ws.ssid[i]);
200
201 printk(KERN_ERR "\n");
202 #endif
203
204 zfiWlanDisable(dev, 0);
205 zfiWlanEnable(dev);
206
207 #endif
208
209 return 0;
210}
211
212int usbdrv_ioctl_getessid(struct net_device *dev, struct iw_point *erq)
213{
214
215 u8_t essidbuf[IW_ESSID_MAX_SIZE+1];
216 u8_t len;
217 u8_t i;
218
219
220
221
222 zfiWlanQuerySSID(dev, essidbuf, &len);
223
224 essidbuf[len] = 0;
225
226 printk(KERN_ERR "ESSID: ");
227
228 for (i = 0; i < len; i++)
229 printk(KERN_ERR "%c", essidbuf[i]);
230
231 printk(KERN_ERR "\n");
232
233 erq->flags = 1;
234 erq->length = strlen(essidbuf) + 1;
235
236 if (erq->pointer) {
237 if (copy_to_user(erq->pointer, essidbuf, erq->length))
238 return -EFAULT;
239 }
240
241 return 0;
242}
243
244int usbdrv_ioctl_setrts(struct net_device *dev, struct iw_param *rrq)
245{
246 return 0;
247}
248
249
250
251
252
253u32 encode_ie(void *buf, u32 bufsize, const u8 *ie, u32 ielen,
254 const u8 *leader, u32 leader_len)
255{
256 u8 *p;
257 u32 i;
258
259 if (bufsize < leader_len)
260 return 0;
261 p = buf;
262 memcpy(p, leader, leader_len);
263 bufsize -= leader_len;
264 p += leader_len;
265 for (i = 0; i < ielen && bufsize > 2; i++)
266 p += sprintf(p, "%02x", ie[i]);
267 return (i == ielen ? p - (u8 *)buf:0);
268}
269
270
271
272
273
274char *usbdrv_translate_scan(struct net_device *dev,
275 struct iw_request_info *info, char *current_ev,
276 char *end_buf, struct zsBssInfo *list)
277{
278 struct iw_event iwe;
279 u16_t capabilities;
280 char *current_val;
281 char *last_ev;
282 int i;
283 char buf[64*2 + 30];
284
285 last_ev = current_ev;
286
287
288 iwe.cmd = SIOCGIWAP;
289 iwe.u.ap_addr.sa_family = ARPHRD_ETHER;
290 memcpy(iwe.u.ap_addr.sa_data, list->bssid, ETH_ALEN);
291 current_ev = iwe_stream_add_event(info, current_ev,
292 end_buf, &iwe, IW_EV_ADDR_LEN);
293
294
295 if (last_ev == current_ev)
296 return end_buf;
297
298 last_ev = current_ev;
299
300
301
302
303 iwe.u.data.length = list->ssid[1];
304 if (iwe.u.data.length > 32)
305 iwe.u.data.length = 32;
306 iwe.cmd = SIOCGIWESSID;
307 iwe.u.data.flags = 1;
308 current_ev = iwe_stream_add_point(info, current_ev,
309 end_buf, &iwe, &list->ssid[2]);
310
311
312 if (last_ev == current_ev)
313 return end_buf;
314
315 last_ev = current_ev;
316
317
318 iwe.cmd = SIOCGIWMODE;
319 capabilities = (list->capability[1] << 8) + list->capability[0];
320 if (capabilities & (0x01 | 0x02)) {
321 if (capabilities & 0x01)
322 iwe.u.mode = IW_MODE_MASTER;
323 else
324 iwe.u.mode = IW_MODE_ADHOC;
325 current_ev = iwe_stream_add_event(info, current_ev,
326 end_buf, &iwe, IW_EV_UINT_LEN);
327 }
328
329
330 if (last_ev == current_ev)
331 return end_buf;
332
333 last_ev = current_ev;
334
335
336 iwe.cmd = SIOCGIWFREQ;
337 iwe.u.freq.m = list->channel;
338
339 if (iwe.u.freq.m > 14) {
340 if ((184 <= iwe.u.freq.m) && (iwe.u.freq.m <= 196))
341 iwe.u.freq.m = 4000 + iwe.u.freq.m * 5;
342 else
343 iwe.u.freq.m = 5000 + iwe.u.freq.m * 5;
344 } else {
345 if (iwe.u.freq.m == 14)
346 iwe.u.freq.m = 2484;
347 else
348 iwe.u.freq.m = 2412 + (iwe.u.freq.m - 1) * 5;
349 }
350 iwe.u.freq.e = 6;
351 current_ev = iwe_stream_add_event(info, current_ev,
352 end_buf, &iwe, IW_EV_FREQ_LEN);
353
354
355 if (last_ev == current_ev)
356 return end_buf;
357
358 last_ev = current_ev;
359
360
361 iwe.cmd = IWEVQUAL;
362 iwe.u.qual.updated = IW_QUAL_QUAL_UPDATED | IW_QUAL_LEVEL_UPDATED
363 | IW_QUAL_NOISE_UPDATED;
364 iwe.u.qual.level = list->signalStrength;
365 iwe.u.qual.noise = 0;
366 iwe.u.qual.qual = list->signalQuality;
367 current_ev = iwe_stream_add_event(info, current_ev,
368 end_buf, &iwe, IW_EV_QUAL_LEN);
369
370
371 if (last_ev == current_ev)
372 return end_buf;
373
374 last_ev = current_ev;
375
376
377
378 iwe.cmd = SIOCGIWENCODE;
379 if (capabilities & 0x10)
380 iwe.u.data.flags = IW_ENCODE_ENABLED | IW_ENCODE_NOKEY;
381 else
382 iwe.u.data.flags = IW_ENCODE_DISABLED;
383
384 iwe.u.data.length = 0;
385 current_ev = iwe_stream_add_point(info, current_ev,
386 end_buf, &iwe, list->ssid);
387
388
389 if (last_ev == current_ev)
390 return end_buf;
391
392 last_ev = current_ev;
393
394
395
396
397 current_val = current_ev + IW_EV_LCP_LEN;
398
399 iwe.cmd = SIOCGIWRATE;
400
401 iwe.u.bitrate.fixed = iwe.u.bitrate.disabled = 0;
402
403 for (i = 0 ; i < list->supportedRates[1] ; i++) {
404
405 iwe.u.bitrate.value = ((list->supportedRates[i+2] & 0x7f)
406 * 500000);
407
408 current_val = iwe_stream_add_value(info, current_ev,
409 current_val, end_buf, &iwe, IW_EV_PARAM_LEN);
410
411
412 if (last_ev == current_val)
413 return end_buf;
414
415 last_ev = current_val;
416 }
417
418 for (i = 0 ; i < list->extSupportedRates[1] ; i++) {
419
420 iwe.u.bitrate.value = ((list->extSupportedRates[i+2] & 0x7f)
421 * 500000);
422
423 current_val = iwe_stream_add_value(info, current_ev,
424 current_val, end_buf, &iwe, IW_EV_PARAM_LEN);
425
426
427 if (last_ev == current_val)
428 return end_buf;
429
430 last_ev = current_ev;
431 }
432
433
434 if ((current_val - current_ev) > IW_EV_LCP_LEN)
435 current_ev = current_val;
436 #define IEEE80211_ELEMID_RSN 0x30
437 memset(&iwe, 0, sizeof(iwe));
438 iwe.cmd = IWEVCUSTOM;
439 snprintf(buf, sizeof(buf), "bcn_int=%d", (list->beaconInterval[1] << 8)
440 + list->beaconInterval[0]);
441 iwe.u.data.length = strlen(buf);
442 current_ev = iwe_stream_add_point(info, current_ev,
443 end_buf, &iwe, buf);
444
445
446 if (last_ev == current_ev)
447 return end_buf;
448
449 last_ev = current_ev;
450
451 if (list->wpaIe[1] != 0) {
452 static const char rsn_leader[] = "rsn_ie=";
453 static const char wpa_leader[] = "wpa_ie=";
454
455 memset(&iwe, 0, sizeof(iwe));
456 iwe.cmd = IWEVCUSTOM;
457 if (list->wpaIe[0] == IEEE80211_ELEMID_RSN)
458 iwe.u.data.length = encode_ie(buf, sizeof(buf),
459 list->wpaIe, list->wpaIe[1]+2,
460 rsn_leader, sizeof(rsn_leader)-1);
461 else
462 iwe.u.data.length = encode_ie(buf, sizeof(buf),
463 list->wpaIe, list->wpaIe[1]+2,
464 wpa_leader, sizeof(wpa_leader)-1);
465
466 if (iwe.u.data.length != 0)
467 current_ev = iwe_stream_add_point(info, current_ev,
468 end_buf, &iwe, buf);
469
470
471 if (last_ev == current_ev)
472 return end_buf;
473
474 last_ev = current_ev;
475 }
476
477 if (list->rsnIe[1] != 0) {
478 static const char rsn_leader[] = "rsn_ie=";
479 memset(&iwe, 0, sizeof(iwe));
480 iwe.cmd = IWEVCUSTOM;
481
482 if (list->rsnIe[0] == IEEE80211_ELEMID_RSN) {
483 iwe.u.data.length = encode_ie(buf, sizeof(buf),
484 list->rsnIe, list->rsnIe[1]+2,
485 rsn_leader, sizeof(rsn_leader)-1);
486 if (iwe.u.data.length != 0)
487 current_ev = iwe_stream_add_point(info,
488 current_ev, end_buf, &iwe, buf);
489
490
491 if (last_ev == current_ev)
492 return end_buf;
493
494 last_ev = current_ev;
495 }
496 }
497
498
499
500 return current_ev;
501}
502
503int usbdrvwext_giwname(struct net_device *dev,
504 struct iw_request_info *info,
505 union iwreq_data *wrq, char *extra)
506{
507
508
509 strcpy(wrq->name, "IEEE 802.11-MIMO");
510
511 return 0;
512}
513
514int usbdrvwext_siwfreq(struct net_device *dev,
515 struct iw_request_info *info,
516 struct iw_freq *freq, char *extra)
517{
518 u32_t FreqKHz;
519 struct usbdrv_private *macp = dev->ml_priv;
520
521 if (!netif_running(dev))
522 return -EINVAL;
523
524 if (freq->e > 1)
525 return -EINVAL;
526
527 if (freq->e == 1) {
528 FreqKHz = (freq->m / 100000);
529
530 if (FreqKHz > 4000000) {
531 if (FreqKHz > 5825000)
532 FreqKHz = 5825000;
533 else if (FreqKHz < 4920000)
534 FreqKHz = 4920000;
535 else if (FreqKHz < 5000000)
536 FreqKHz = (((FreqKHz - 4000000) / 5000) * 5000)
537 + 4000000;
538 else
539 FreqKHz = (((FreqKHz - 5000000) / 5000) * 5000)
540 + 5000000;
541 } else {
542 if (FreqKHz > 2484000)
543 FreqKHz = 2484000;
544 else if (FreqKHz < 2412000)
545 FreqKHz = 2412000;
546 else
547 FreqKHz = (((FreqKHz - 2412000) / 5000) * 5000)
548 + 2412000;
549 }
550 } else {
551 FreqKHz = usbdrv_chan2freq(freq->m);
552
553 if (FreqKHz != -1)
554 FreqKHz *= 1000;
555 else
556 FreqKHz = 2412000;
557 }
558
559
560
561
562 if (macp->DeviceOpened == 1) {
563 zfiWlanSetFrequency(dev, FreqKHz, 0);
564
565
566 zfiWlanDisable(dev, 0);
567 zfiWlanEnable(dev);
568
569
570 }
571
572 return 0;
573}
574
575int usbdrvwext_giwfreq(struct net_device *dev,
576 struct iw_request_info *info,
577 struct iw_freq *freq, char *extra)
578{
579 struct usbdrv_private *macp = dev->ml_priv;
580
581 if (macp->DeviceOpened != 1)
582 return 0;
583
584 freq->m = zfiWlanQueryFrequency(dev);
585 freq->e = 3;
586
587 return 0;
588}
589
590int usbdrvwext_siwmode(struct net_device *dev,
591 struct iw_request_info *info,
592 union iwreq_data *wrq, char *extra)
593{
594 struct usbdrv_private *macp = dev->ml_priv;
595 u8_t WlanMode;
596
597 if (!netif_running(dev))
598 return -EINVAL;
599
600 if (macp->DeviceOpened != 1)
601 return 0;
602
603 switch (wrq->mode) {
604 case IW_MODE_MASTER:
605 WlanMode = ZM_MODE_AP;
606 break;
607 case IW_MODE_INFRA:
608 WlanMode = ZM_MODE_INFRASTRUCTURE;
609 break;
610 case IW_MODE_ADHOC:
611 WlanMode = ZM_MODE_IBSS;
612 break;
613 default:
614 WlanMode = ZM_MODE_IBSS;
615 break;
616 }
617
618 zfiWlanSetWlanMode(dev, WlanMode);
619 zfiWlanDisable(dev, 1);
620 zfiWlanEnable(dev);
621
622 return 0;
623}
624
625int usbdrvwext_giwmode(struct net_device *dev,
626 struct iw_request_info *info,
627 __u32 *mode, char *extra)
628{
629 unsigned long irqFlag;
630 struct usbdrv_private *macp = dev->ml_priv;
631
632 if (!netif_running(dev))
633 return -EINVAL;
634
635 if (macp->DeviceOpened != 1)
636 return 0;
637
638 spin_lock_irqsave(&macp->cs_lock, irqFlag);
639
640 switch (zfiWlanQueryWlanMode(dev)) {
641 case ZM_MODE_AP:
642 *mode = IW_MODE_MASTER;
643 break;
644 case ZM_MODE_INFRASTRUCTURE:
645 *mode = IW_MODE_INFRA;
646 break;
647 case ZM_MODE_IBSS:
648 *mode = IW_MODE_ADHOC;
649 break;
650 default:
651 *mode = IW_MODE_ADHOC;
652 break;
653 }
654
655 spin_unlock_irqrestore(&macp->cs_lock, irqFlag);
656
657 return 0;
658}
659
660int usbdrvwext_siwsens(struct net_device *dev,
661 struct iw_request_info *info,
662 struct iw_param *sens, char *extra)
663{
664 return 0;
665}
666
667int usbdrvwext_giwsens(struct net_device *dev,
668 struct iw_request_info *info,
669 struct iw_param *sens, char *extra)
670{
671 sens->value = 0;
672 sens->fixed = 1;
673
674 return 0;
675}
676
677int usbdrvwext_giwrange(struct net_device *dev,
678 struct iw_request_info *info,
679 struct iw_point *data, char *extra)
680{
681 struct iw_range *range = (struct iw_range *) extra;
682 int i, val;
683
684 u16_t channels[60];
685 u16_t channel_num;
686
687 if (!netif_running(dev))
688 return -EINVAL;
689
690 range->txpower_capa = IW_TXPOW_DBM;
691
692
693 range->we_version_compiled = WIRELESS_EXT;
694 range->we_version_source = 13;
695
696 range->retry_capa = IW_RETRY_LIMIT;
697 range->retry_flags = IW_RETRY_LIMIT;
698 range->min_retry = 0;
699 range->max_retry = 255;
700
701 channel_num = zfiWlanQueryAllowChannels(dev, channels);
702
703
704
705
706 if (channel_num > IW_MAX_FREQUENCIES)
707 channel_num = IW_MAX_FREQUENCIES;
708
709 val = 0;
710
711 for (i = 0; i < channel_num; i++) {
712 range->freq[val].i = usbdrv_freq2chan(channels[i]);
713 range->freq[val].m = channels[i];
714 range->freq[val].e = 6;
715 val++;
716 }
717
718 range->num_channels = channel_num;
719 range->num_frequency = channel_num;
720
721 #if 0
722 range->num_channels = 14;
723
724
725 val = 0;
726
727 for (i = 1; i <= 14; i++) {
728 range->freq[val].i = i;
729 if (i == 14)
730 range->freq[val].m = 2484000;
731 else
732 range->freq[val].m = (2412+(i-1)*5)*1000;
733 range->freq[val].e = 3;
734 val++;
735 }
736
737 num_band_a = (IW_MAX_FREQUENCIES - val);
738
739 for (i = 0; i < num_band_a; i++) {
740 range->freq[val].i = channel_frequency_11A[2 * i];
741 range->freq[val].m = channel_frequency_11A[2 * i + 1] * 1000;
742 range->freq[val].e = 3;
743 val++;
744 }
745
746
747
748
749 range->num_frequency = val;
750 #endif
751
752
753 range->max_qual.qual = 100;
754 range->max_qual.level = 154;
755 range->max_qual.noise = 154;
756 range->sensitivity = 3;
757
758
759 range->min_rts = 0;
760 range->max_rts = 2347;
761 range->min_frag = 256;
762 range->max_frag = 2346;
763 range->max_encoding_tokens = 4 ;
764 range->num_encoding_sizes = 2;
765
766 range->encoding_size[0] = 5;
767 range->encoding_size[1] = 13;
768
769
770 range->num_bitrates = 0;
771
772
773
774
775
776 range->throughput = 300000000;
777
778 return 0;
779}
780
781int usbdrvwext_siwap(struct net_device *dev, struct iw_request_info *info,
782 struct sockaddr *MacAddr, char *extra)
783{
784 struct usbdrv_private *macp = dev->ml_priv;
785
786 if (!netif_running(dev))
787 return -EINVAL;
788
789 if (zfiWlanQueryWlanMode(dev) == ZM_MODE_AP) {
790
791 zfiWlanSetMacAddress(dev, (u16_t *)&MacAddr->sa_data[0]);
792 } else {
793
794 zfiWlanSetBssid(dev, &MacAddr->sa_data[0]);
795 }
796
797 if (macp->DeviceOpened == 1) {
798
799
800 zfiWlanDisable(dev, 0);
801 zfiWlanEnable(dev);
802
803
804 }
805
806 return 0;
807}
808
809int usbdrvwext_giwap(struct net_device *dev,
810 struct iw_request_info *info,
811 struct sockaddr *MacAddr, char *extra)
812{
813 struct usbdrv_private *macp = dev->ml_priv;
814
815 if (macp->DeviceOpened != 1)
816 return 0;
817
818 if (zfiWlanQueryWlanMode(dev) == ZM_MODE_AP) {
819
820 zfiWlanQueryMacAddress(dev, &MacAddr->sa_data[0]);
821 } else {
822
823 if (macp->adapterState == ZM_STATUS_MEDIA_CONNECT) {
824 zfiWlanQueryBssid(dev, &MacAddr->sa_data[0]);
825 } else {
826 u8_t zero_addr[6] = { 0x00, 0x00, 0x00, 0x00,
827 0x00, 0x00 };
828 memcpy(&MacAddr->sa_data[0], zero_addr,
829 sizeof(zero_addr));
830 }
831 }
832
833 return 0;
834}
835
836int usbdrvwext_iwaplist(struct net_device *dev,
837 struct iw_request_info *info,
838 struct iw_point *data, char *extra)
839{
840
841 return 0;
842
843}
844
845int usbdrvwext_siwscan(struct net_device *dev, struct iw_request_info *info,
846 struct iw_point *data, char *extra)
847{
848 struct usbdrv_private *macp = dev->ml_priv;
849
850 if (macp->DeviceOpened != 1)
851 return 0;
852
853 printk(KERN_WARNING "CWY - usbdrvwext_siwscan\n");
854
855 zfiWlanScan(dev);
856
857 return 0;
858}
859
860int usbdrvwext_giwscan(struct net_device *dev,
861 struct iw_request_info *info,
862 struct iw_point *data, char *extra)
863{
864 struct usbdrv_private *macp = dev->ml_priv;
865
866 char *current_ev = extra;
867 char *end_buf;
868 int i;
869
870 struct zsBssListV1 *pBssList = kmalloc(sizeof(struct zsBssListV1),
871 GFP_KERNEL);
872
873
874
875 if (macp->DeviceOpened != 1)
876 return 0;
877
878 if (data->length == 0)
879 end_buf = extra + IW_SCAN_MAX_DATA;
880 else
881 end_buf = extra + data->length;
882
883 printk(KERN_WARNING "giwscan - Report Scan Results\n");
884
885
886
887
888
889
890 zfiWlanQueryBssListV1(dev, pBssList);
891
892
893
894 printk(KERN_WARNING "giwscan - pBssList->bssCount : %d\n",
895 pBssList->bssCount);
896
897
898 for (i = 0; i < pBssList->bssCount; i++) {
899
900
901
902
903 current_ev = usbdrv_translate_scan(dev, info, current_ev,
904 end_buf, &pBssList->bssInfo[i]);
905
906 if (current_ev == end_buf) {
907 kfree(pBssList);
908 data->length = current_ev - extra;
909 return -E2BIG;
910 }
911 }
912
913
914 data->length = (current_ev - extra);
915 data->flags = 0;
916
917 kfree(pBssList);
918
919 return 0;
920}
921
922int usbdrvwext_siwessid(struct net_device *dev,
923 struct iw_request_info *info,
924 struct iw_point *essid, char *extra)
925{
926 char EssidBuf[IW_ESSID_MAX_SIZE + 1];
927 struct usbdrv_private *macp = dev->ml_priv;
928
929 if (!netif_running(dev))
930 return -EINVAL;
931
932 if (essid->flags == 1) {
933 if (essid->length > (IW_ESSID_MAX_SIZE + 1))
934 return -E2BIG;
935
936 if (copy_from_user(&EssidBuf, essid->pointer, essid->length))
937 return -EFAULT;
938
939 EssidBuf[essid->length] = '\0';
940
941
942
943 if (macp->DeviceOpened == 1) {
944 zfiWlanSetSSID(dev, EssidBuf, strlen(EssidBuf));
945 zfiWlanSetFrequency(dev, zfiWlanQueryFrequency(dev),
946 FALSE);
947 zfiWlanSetEncryMode(dev, zfiWlanQueryEncryMode(dev));
948
949
950 zfiWlanDisable(dev, 0);
951 zfiWlanEnable(dev);
952
953
954 }
955 }
956
957 return 0;
958}
959
960int usbdrvwext_giwessid(struct net_device *dev,
961 struct iw_request_info *info,
962 struct iw_point *essid, char *extra)
963{
964 struct usbdrv_private *macp = dev->ml_priv;
965 u8_t EssidLen;
966 char EssidBuf[IW_ESSID_MAX_SIZE + 1];
967 int ssid_len;
968
969 if (!netif_running(dev))
970 return -EINVAL;
971
972 if (macp->DeviceOpened != 1)
973 return 0;
974
975 zfiWlanQuerySSID(dev, &EssidBuf[0], &EssidLen);
976
977
978 ssid_len = (int)EssidLen;
979
980
981 if (ssid_len > IW_ESSID_MAX_SIZE)
982 ssid_len = IW_ESSID_MAX_SIZE;
983
984 EssidBuf[ssid_len] = '\0';
985
986 essid->flags = 1;
987 essid->length = strlen(EssidBuf);
988
989 memcpy(extra, EssidBuf, essid->length);
990
991
992
993
994
995
996
997
998
999 return 0;
1000}
1001
1002int usbdrvwext_siwnickn(struct net_device *dev,
1003 struct iw_request_info *info,
1004 struct iw_point *data, char *nickname)
1005{
1006
1007 return 0;
1008}
1009
1010int usbdrvwext_giwnickn(struct net_device *dev,
1011 struct iw_request_info *info,
1012 struct iw_point *data, char *nickname)
1013{
1014 struct usbdrv_private *macp = dev->ml_priv;
1015 u8_t EssidLen;
1016 char EssidBuf[IW_ESSID_MAX_SIZE + 1];
1017
1018 if (macp->DeviceOpened != 1)
1019 return 0;
1020
1021 zfiWlanQuerySSID(dev, &EssidBuf[0], &EssidLen);
1022 EssidBuf[EssidLen] = 0;
1023
1024 data->flags = 1;
1025 data->length = strlen(EssidBuf);
1026
1027 memcpy(nickname, EssidBuf, data->length);
1028
1029 return 0;
1030}
1031
1032int usbdrvwext_siwrate(struct net_device *dev,
1033 struct iw_request_info *info,
1034 struct iw_param *frq, char *extra)
1035{
1036 struct usbdrv_private *macp = dev->ml_priv;
1037
1038 u16_t zcIndextoRateBG[16] = {1000, 2000, 5500, 11000, 0, 0, 0, 0,
1039 48000, 24000, 12000, 6000, 54000, 36000, 18000, 9000};
1040 u16_t zcRateToMCS[] = {0xff, 0, 1, 2, 3, 0xb, 0xf, 0xa, 0xe, 0x9, 0xd,
1041 0x8, 0xc};
1042 u8_t i, RateIndex = 4;
1043 u16_t RateKbps;
1044
1045
1046
1047
1048 RateKbps = frq->value / 1000;
1049
1050 for (i = 0; i < 16; i++) {
1051 if (RateKbps == zcIndextoRateBG[i])
1052 RateIndex = i;
1053 }
1054
1055 if (zcIndextoRateBG[RateIndex] == 0)
1056 RateIndex = 0xff;
1057
1058 for (i = 0; i < 13; i++)
1059 if (RateIndex == zcRateToMCS[i])
1060 break;
1061
1062 if (RateKbps == 65000) {
1063 RateIndex = 20;
1064 printk(KERN_WARNING "RateIndex : %d\n", RateIndex);
1065 }
1066
1067 if (macp->DeviceOpened == 1) {
1068 zfiWlanSetTxRate(dev, i);
1069
1070
1071 }
1072
1073 return 0;
1074}
1075
1076int usbdrvwext_giwrate(struct net_device *dev,
1077 struct iw_request_info *info,
1078 struct iw_param *frq, char *extra)
1079{
1080 struct usbdrv_private *macp = dev->ml_priv;
1081
1082 if (!netif_running(dev))
1083 return -EINVAL;
1084
1085 if (macp->DeviceOpened != 1)
1086 return 0;
1087
1088 frq->fixed = 0;
1089 frq->disabled = 0;
1090 frq->value = zfiWlanQueryRxRate(dev) * 1000;
1091
1092 return 0;
1093}
1094
1095int usbdrvwext_siwrts(struct net_device *dev,
1096 struct iw_request_info *info,
1097 struct iw_param *rts, char *extra)
1098{
1099 struct usbdrv_private *macp = dev->ml_priv;
1100 int val = rts->value;
1101
1102 if (macp->DeviceOpened != 1)
1103 return 0;
1104
1105 if (rts->disabled)
1106 val = 2347;
1107
1108 if ((val < 0) || (val > 2347))
1109 return -EINVAL;
1110
1111 zfiWlanSetRtsThreshold(dev, val);
1112
1113 return 0;
1114}
1115
1116int usbdrvwext_giwrts(struct net_device *dev,
1117 struct iw_request_info *info,
1118 struct iw_param *rts, char *extra)
1119{
1120 struct usbdrv_private *macp = dev->ml_priv;
1121
1122 if (!netif_running(dev))
1123 return -EINVAL;
1124
1125 if (macp->DeviceOpened != 1)
1126 return 0;
1127
1128 rts->value = zfiWlanQueryRtsThreshold(dev);
1129 rts->disabled = (rts->value >= 2347);
1130 rts->fixed = 1;
1131
1132 return 0;
1133}
1134
1135int usbdrvwext_siwfrag(struct net_device *dev,
1136 struct iw_request_info *info,
1137 struct iw_param *frag, char *extra)
1138{
1139 struct usbdrv_private *macp = dev->ml_priv;
1140 u16_t fragThreshold;
1141
1142 if (macp->DeviceOpened != 1)
1143 return 0;
1144
1145 if (frag->disabled)
1146 fragThreshold = 0;
1147 else
1148 fragThreshold = frag->value;
1149
1150 zfiWlanSetFragThreshold(dev, fragThreshold);
1151
1152 return 0;
1153}
1154
1155int usbdrvwext_giwfrag(struct net_device *dev,
1156 struct iw_request_info *info,
1157 struct iw_param *frag, char *extra)
1158{
1159 struct usbdrv_private *macp = dev->ml_priv;
1160 u16 val;
1161 unsigned long irqFlag;
1162
1163 if (!netif_running(dev))
1164 return -EINVAL;
1165
1166 if (macp->DeviceOpened != 1)
1167 return 0;
1168
1169 spin_lock_irqsave(&macp->cs_lock, irqFlag);
1170
1171 val = zfiWlanQueryFragThreshold(dev);
1172
1173 frag->value = val;
1174
1175 frag->disabled = (val >= 2346);
1176 frag->fixed = 1;
1177
1178 spin_unlock_irqrestore(&macp->cs_lock, irqFlag);
1179
1180 return 0;
1181}
1182
1183int usbdrvwext_siwtxpow(struct net_device *dev,
1184 struct iw_request_info *info,
1185 struct iw_param *rrq, char *extra)
1186{
1187
1188 return 0;
1189}
1190
1191int usbdrvwext_giwtxpow(struct net_device *dev,
1192 struct iw_request_info *info,
1193 struct iw_param *rrq, char *extra)
1194{
1195
1196 return 0;
1197}
1198
1199int usbdrvwext_siwretry(struct net_device *dev,
1200 struct iw_request_info *info,
1201 struct iw_param *rrq, char *extra)
1202{
1203
1204 return 0;
1205}
1206
1207int usbdrvwext_giwretry(struct net_device *dev,
1208 struct iw_request_info *info,
1209 struct iw_param *rrq, char *extra)
1210{
1211
1212 return 0;
1213}
1214
1215int usbdrvwext_siwencode(struct net_device *dev,
1216 struct iw_request_info *info,
1217 struct iw_point *erq, char *key)
1218{
1219 struct zsKeyInfo keyInfo;
1220 int i;
1221 int WepState = ZM_ENCRYPTION_WEP_DISABLED;
1222 struct usbdrv_private *macp = dev->ml_priv;
1223
1224 if (!netif_running(dev))
1225 return -EINVAL;
1226
1227 if ((erq->flags & IW_ENCODE_DISABLED) == 0) {
1228 keyInfo.key = key;
1229 keyInfo.keyLength = erq->length;
1230 keyInfo.keyIndex = (erq->flags & IW_ENCODE_INDEX) - 1;
1231 if (keyInfo.keyIndex >= 4)
1232 keyInfo.keyIndex = 0;
1233 keyInfo.flag = ZM_KEY_FLAG_DEFAULT_KEY;
1234
1235 zfiWlanSetKey(dev, keyInfo);
1236 WepState = ZM_ENCRYPTION_WEP_ENABLED;
1237 } else {
1238 for (i = 1; i < 4; i++)
1239 zfiWlanRemoveKey(dev, 0, i);
1240 WepState = ZM_ENCRYPTION_WEP_DISABLED;
1241
1242 }
1243
1244 if (macp->DeviceOpened == 1) {
1245 zfiWlanSetWepStatus(dev, WepState);
1246 zfiWlanSetFrequency(dev, zfiWlanQueryFrequency(dev), FALSE);
1247
1248
1249
1250 zfiWlanDisable(dev, 0);
1251 zfiWlanEnable(dev);
1252
1253
1254 }
1255
1256 return 0;
1257}
1258
1259int usbdrvwext_giwencode(struct net_device *dev,
1260 struct iw_request_info *info,
1261 struct iw_point *erq, char *key)
1262{
1263 struct usbdrv_private *macp = dev->ml_priv;
1264 u8_t EncryptionMode;
1265 u8_t keyLen = 0;
1266
1267 if (macp->DeviceOpened != 1)
1268 return 0;
1269
1270 EncryptionMode = zfiWlanQueryEncryMode(dev);
1271
1272 if (EncryptionMode)
1273 erq->flags = IW_ENCODE_ENABLED;
1274 else
1275 erq->flags = IW_ENCODE_DISABLED;
1276
1277
1278 erq->flags |= IW_ENCODE_NOKEY;
1279 memset(key, 0, 16);
1280
1281
1282 switch (EncryptionMode) {
1283 case ZM_WEP64:
1284 keyLen = 5;
1285 break;
1286 case ZM_WEP128:
1287 keyLen = 13;
1288 break;
1289 case ZM_WEP256:
1290 keyLen = 29;
1291 break;
1292 case ZM_AES:
1293 keyLen = 16;
1294 break;
1295 case ZM_TKIP:
1296 keyLen = 32;
1297 break;
1298 #ifdef ZM_ENABLE_CENC
1299 case ZM_CENC:
1300
1301 keyLen = 32;
1302 break;
1303 #endif
1304 case ZM_NO_WEP:
1305 keyLen = 0;
1306 break;
1307 default:
1308 keyLen = 0;
1309 printk(KERN_ERR "Unknown EncryMode\n");
1310 break;
1311 }
1312 erq->length = keyLen;
1313
1314 return 0;
1315}
1316
1317int usbdrvwext_siwpower(struct net_device *dev,
1318 struct iw_request_info *info,
1319 struct iw_param *frq, char *extra)
1320{
1321 struct usbdrv_private *macp = dev->ml_priv;
1322 u8_t PSMode;
1323
1324 if (macp->DeviceOpened != 1)
1325 return 0;
1326
1327 if (frq->disabled)
1328 PSMode = ZM_STA_PS_NONE;
1329 else
1330 PSMode = ZM_STA_PS_MAX;
1331
1332 zfiWlanSetPowerSaveMode(dev, PSMode);
1333
1334 return 0;
1335}
1336
1337int usbdrvwext_giwpower(struct net_device *dev,
1338 struct iw_request_info *info,
1339 struct iw_param *frq, char *extra)
1340{
1341 unsigned long irqFlag;
1342 struct usbdrv_private *macp = dev->ml_priv;
1343
1344 if (macp->DeviceOpened != 1)
1345 return 0;
1346
1347 spin_lock_irqsave(&macp->cs_lock, irqFlag);
1348
1349 if (zfiWlanQueryPowerSaveMode(dev) == ZM_STA_PS_NONE)
1350 frq->disabled = 1;
1351 else
1352 frq->disabled = 0;
1353
1354 spin_unlock_irqrestore(&macp->cs_lock, irqFlag);
1355
1356 return 0;
1357}
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865int usbdrvwext_setmode(struct net_device *dev, struct iw_request_info *info,
1866 void *w, char *extra)
1867{
1868 return 0;
1869}
1870
1871int usbdrvwext_getmode(struct net_device *dev, struct iw_request_info *info,
1872 void *w, char *extra)
1873{
1874
1875 struct iw_point *wri = (struct iw_point *)extra;
1876 char mode[8];
1877
1878 strcpy(mode, "11g");
1879 return copy_to_user(wri->pointer, mode, 6) ? -EFAULT : 0;
1880}
1881
1882int zfLnxPrivateIoctl(struct net_device *dev, struct zdap_ioctl* zdreq)
1883{
1884
1885 u16_t cmd;
1886
1887 u32_t *p;
1888 u32_t i;
1889
1890 cmd = zdreq->cmd;
1891 switch (cmd) {
1892 case ZM_IOCTL_REG_READ:
1893 zfiDbgReadReg(dev, zdreq->addr);
1894 break;
1895 case ZM_IOCTL_REG_WRITE:
1896 zfiDbgWriteReg(dev, zdreq->addr, zdreq->value);
1897 break;
1898 case ZM_IOCTL_MEM_READ:
1899 p = (u32_t *) bus_to_virt(zdreq->addr);
1900 printk(KERN_WARNING
1901 "usbdrv: read memory addr: 0x%08x value:"
1902 " 0x%08x\n", zdreq->addr, *p);
1903 break;
1904 case ZM_IOCTL_MEM_WRITE:
1905 p = (u32_t *) bus_to_virt(zdreq->addr);
1906 *p = zdreq->value;
1907 printk(KERN_WARNING
1908 "usbdrv : write value : 0x%08x to memory addr :"
1909 " 0x%08x\n", zdreq->value, zdreq->addr);
1910 break;
1911 case ZM_IOCTL_TALLY:
1912 zfiWlanShowTally(dev);
1913 if (zdreq->addr)
1914 zfiWlanResetTally(dev);
1915 break;
1916 case ZM_IOCTL_TEST:
1917 printk(KERN_WARNING
1918 "ZM_IOCTL_TEST:len=%d\n", zdreq->addr);
1919
1920
1921 printk(KERN_WARNING "IOCTL TEST\n");
1922 #if 1
1923
1924 for (i = 0; i < zdreq->addr; i++) {
1925 if ((i&0x7) == 0)
1926 printk(KERN_WARNING "\n");
1927 printk(KERN_WARNING "%02X ",
1928 (unsigned char)zdreq->data[i]);
1929 }
1930 printk(KERN_WARNING "\n");
1931 #endif
1932
1933
1934 #if 0
1935 struct sk_buff *s;
1936
1937
1938 s = alloc_skb(2000, GFP_ATOMIC);
1939
1940
1941 for (i = 0; i < zdreq->addr; i++)
1942 s->data[i] = zdreq->data[i];
1943 s->len = zdreq->addr;
1944
1945
1946 zfiRecv80211(dev, s, NULL);
1947 #endif
1948 break;
1949
1950 case ZM_IOCTL_FRAG:
1951 zfiWlanSetFragThreshold(dev, zdreq->addr);
1952 break;
1953 case ZM_IOCTL_RTS:
1954 zfiWlanSetRtsThreshold(dev, zdreq->addr);
1955 break;
1956 case ZM_IOCTL_SCAN:
1957 zfiWlanScan(dev);
1958 break;
1959 case ZM_IOCTL_KEY: {
1960 u8_t key[29];
1961 struct zsKeyInfo keyInfo;
1962 u32_t i;
1963
1964 for (i = 0; i < 29; i++)
1965 key[i] = 0;
1966
1967 for (i = 0; i < zdreq->addr; i++)
1968 key[i] = zdreq->data[i];
1969
1970 printk(KERN_WARNING
1971 "key len=%d, key=%02x%02x%02x%02x%02x...\n",
1972 zdreq->addr, key[0], key[1], key[2], key[3], key[4]);
1973
1974 keyInfo.keyLength = zdreq->addr;
1975 keyInfo.keyIndex = 0;
1976 keyInfo.flag = 0;
1977 keyInfo.key = key;
1978 zfiWlanSetKey(dev, keyInfo);
1979 }
1980 break;
1981 case ZM_IOCTL_RATE:
1982 zfiWlanSetTxRate(dev, zdreq->addr);
1983 break;
1984 case ZM_IOCTL_ENCRYPTION_MODE:
1985 zfiWlanSetEncryMode(dev, zdreq->addr);
1986
1987 zfiWlanDisable(dev, 0);
1988 zfiWlanEnable(dev);
1989 break;
1990
1991 case ZM_IOCTL_SIGNAL_STRENGTH: {
1992 u8_t buffer[2];
1993 zfiWlanQuerySignalInfo(dev, &buffer[0]);
1994 printk(KERN_WARNING
1995 "Current Signal Strength : %02d\n", buffer[0]);
1996 }
1997 break;
1998
1999 case ZM_IOCTL_SIGNAL_QUALITY: {
2000 u8_t buffer[2];
2001 zfiWlanQuerySignalInfo(dev, &buffer[0]);
2002 printk(KERN_WARNING
2003 "Current Signal Quality : %02d\n", buffer[1]);
2004 }
2005 break;
2006 case ZM_IOCTL_SET_PIBSS_MODE:
2007 if (zdreq->addr == 1)
2008 zfiWlanSetWlanMode(dev, ZM_MODE_PSEUDO);
2009 else
2010 zfiWlanSetWlanMode(dev, ZM_MODE_INFRASTRUCTURE);
2011
2012 zfiWlanDisable(dev, 0);
2013 zfiWlanEnable(dev);
2014 break;
2015
2016 default:
2017 printk(KERN_ERR "usbdrv: error command = %x\n", cmd);
2018 break;
2019 }
2020
2021 return 0;
2022}
2023
2024int usbdrv_wpa_ioctl(struct net_device *dev, struct athr_wlan_param *zdparm)
2025{
2026 int ret = 0;
2027 u8_t bc_addr[6] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
2028 u8_t mac_addr[80];
2029 struct zsKeyInfo keyInfo;
2030 struct usbdrv_private *macp = dev->ml_priv;
2031 u16_t vapId = 0;
2032 int ii;
2033
2034
2035
2036 switch (zdparm->cmd) {
2037 case ZD_CMD_SET_ENCRYPT_KEY:
2038
2039 keyInfo.keyLength = zdparm->u.crypt.key_len;
2040 keyInfo.keyIndex = zdparm->u.crypt.idx;
2041 if (zfiWlanQueryWlanMode(dev) == ZM_MODE_AP) {
2042
2043 keyInfo.flag = ZM_KEY_FLAG_AUTHENTICATOR;
2044 } else
2045 keyInfo.flag = 0;
2046 keyInfo.key = zdparm->u.crypt.key;
2047 keyInfo.initIv = zdparm->u.crypt.seq;
2048 keyInfo.macAddr = (u16_t *)zdparm->sta_addr;
2049
2050
2051 if (memcmp(zdparm->sta_addr, bc_addr, sizeof(bc_addr)) == 0)
2052 keyInfo.flag |= ZM_KEY_FLAG_GK;
2053 else
2054 keyInfo.flag |= ZM_KEY_FLAG_PK;
2055
2056 if (!strcmp(zdparm->u.crypt.alg, "NONE")) {
2057
2058
2059
2060 keyInfo.keyLength = 0;
2061
2062
2063 if (zdparm->sta_addr[0] & 1) {
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074 } else {
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084 }
2085
2086 printk(KERN_ERR "Set Encryption Type NONE\n");
2087 return ret;
2088 } else if (!strcmp(zdparm->u.crypt.alg, "TKIP")) {
2089 zfiWlanSetEncryMode(dev, ZM_TKIP);
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110 } else if (!strcmp(zdparm->u.crypt.alg, "CCMP")) {
2111 zfiWlanSetEncryMode(dev, ZM_AES);
2112
2113
2114
2115
2116
2117
2118
2119 } else if (!strcmp(zdparm->u.crypt.alg, "WEP")) {
2120 if (keyInfo.keyLength == 5) {
2121
2122 zfiWlanSetEncryMode(dev, ZM_WEP64);
2123
2124
2125 } else if (keyInfo.keyLength == 13) {
2126
2127 zfiWlanSetEncryMode(dev, ZM_WEP128);
2128
2129
2130 } else {
2131 zfiWlanSetEncryMode(dev, ZM_WEP256);
2132 }
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151 }
2152
2153
2154
2155 if (keyInfo.keyLength > 0) {
2156 printk(KERN_WARNING
2157 "Otus: Key Context:\n");
2158 for (ii = 0; ii < keyInfo.keyLength; ) {
2159 printk(KERN_WARNING
2160 "0x%02x ", keyInfo.key[ii]);
2161 if ((++ii % 16) == 0)
2162 printk(KERN_WARNING "\n");
2163 }
2164 printk(KERN_WARNING "\n");
2165 }
2166
2167
2168
2169
2170 vapId = zfLnxGetVapId(dev);
2171 if (vapId == 0xffff)
2172 keyInfo.vapId = 0;
2173 else
2174 keyInfo.vapId = vapId + 1;
2175 keyInfo.vapAddr[0] = keyInfo.macAddr[0];
2176 keyInfo.vapAddr[1] = keyInfo.macAddr[1];
2177 keyInfo.vapAddr[2] = keyInfo.macAddr[2];
2178
2179 zfiWlanSetKey(dev, keyInfo);
2180
2181
2182
2183 break;
2184 case ZD_CMD_SET_MLME:
2185 printk(KERN_ERR "usbdrv_wpa_ioctl: ZD_CMD_SET_MLME\n");
2186
2187
2188 sprintf(mac_addr, "%02x:%02x:%02x:%02x:%02x:%02x",
2189 zdparm->sta_addr[0], zdparm->sta_addr[1],
2190 zdparm->sta_addr[2], zdparm->sta_addr[3],
2191 zdparm->sta_addr[4], zdparm->sta_addr[5]);
2192
2193 switch (zdparm->u.mlme.cmd) {
2194 case MLME_STA_DEAUTH:
2195 printk(KERN_WARNING
2196 " -------Call zfiWlanDeauth, reason:%d\n",
2197 zdparm->u.mlme.reason_code);
2198 if (zfiWlanDeauth(dev, (u16_t *) zdparm->sta_addr,
2199 zdparm->u.mlme.reason_code) != 0)
2200 printk(KERN_ERR "Can't deauthencate STA: %s\n",
2201 mac_addr);
2202 else
2203 printk(KERN_ERR "Deauthenticate STA: %s"
2204 "with reason code: %d\n",
2205 mac_addr, zdparm->u.mlme.reason_code);
2206 break;
2207 case MLME_STA_DISASSOC:
2208 printk(KERN_WARNING
2209 " -------Call zfiWlanDeauth, reason:%d\n",
2210 zdparm->u.mlme.reason_code);
2211 if (zfiWlanDeauth(dev, (u16_t *) zdparm->sta_addr,
2212 zdparm->u.mlme.reason_code) != 0)
2213 printk(KERN_ERR "Can't disassociate STA: %s\n",
2214 mac_addr);
2215 else
2216 printk(KERN_ERR "Disassociate STA: %s"
2217 "with reason code: %d\n",
2218 mac_addr, zdparm->u.mlme.reason_code);
2219 break;
2220 default:
2221 printk(KERN_ERR "MLME command: 0x%04x not support\n",
2222 zdparm->u.mlme.cmd);
2223 break;
2224 }
2225
2226 break;
2227 case ZD_CMD_SCAN_REQ:
2228 printk(KERN_ERR "usbdrv_wpa_ioctl: ZD_CMD_SCAN_REQ\n");
2229 break;
2230 case ZD_CMD_SET_GENERIC_ELEMENT:
2231 printk(KERN_ERR "usbdrv_wpa_ioctl:"
2232 " ZD_CMD_SET_GENERIC_ELEMENT\n");
2233
2234
2235
2236
2237
2238 printk(KERN_ERR "wpaie Length : % d\n",
2239 zdparm->u.generic_elem.len);
2240 if (zfiWlanQueryWlanMode(dev) == ZM_MODE_AP) {
2241
2242 zfiWlanSetWpaIe(dev, zdparm->u.generic_elem.data,
2243 zdparm->u.generic_elem.len);
2244 } else {
2245 macp->supLen = zdparm->u.generic_elem.len;
2246 memcpy(macp->supIe, zdparm->u.generic_elem.data,
2247 zdparm->u.generic_elem.len);
2248 }
2249 zfiWlanSetWpaSupport(dev, 1);
2250
2251
2252
2253 u8_t len = zdparm->u.generic_elem.len;
2254 u8_t *wpaie = (u8_t *)zdparm->u.generic_elem.data;
2255
2256 printk(KERN_ERR "wd->ap.wpaLen : % d\n", len);
2257
2258
2259 for(ii = 0; ii < len;) {
2260 printk(KERN_ERR "0x%02x ", wpaie[ii]);
2261
2262 if((++ii % 16) == 0)
2263 printk(KERN_ERR "\n");
2264 }
2265 printk(KERN_ERR "\n");
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275 break;
2276
2277
2278 case ZD_CMD_GET_TSC:
2279 printk(KERN_ERR "usbdrv_wpa_ioctl : ZD_CMD_GET_TSC\n");
2280 break;
2281
2282
2283 default:
2284 printk(KERN_ERR "usbdrv_wpa_ioctl default : 0x%04x\n",
2285 zdparm->cmd);
2286 ret = -EINVAL;
2287 break;
2288 }
2289
2290 return ret;
2291}
2292
2293#ifdef ZM_ENABLE_CENC
2294int usbdrv_cenc_ioctl(struct net_device *dev, struct zydas_cenc_param *zdparm)
2295{
2296
2297 struct zsKeyInfo keyInfo;
2298 u16_t apId;
2299 u8_t bc_addr[6] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
2300 int ret = 0;
2301 int ii;
2302
2303
2304 apId = zfLnxGetVapId(dev);
2305
2306 if (apId == 0xffff) {
2307 apId = 0;
2308 } else {
2309 apId = apId + 1;
2310 }
2311
2312 switch (zdparm->cmd) {
2313 case ZM_CMD_CENC_SETCENC:
2314 printk(KERN_ERR "ZM_CMD_CENC_SETCENC\n");
2315 printk(KERN_ERR "length : % d\n", zdparm->len);
2316 printk(KERN_ERR "policy : % d\n", zdparm->u.info.cenc_policy);
2317 break;
2318 case ZM_CMD_CENC_SETKEY:
2319
2320 printk(KERN_ERR "ZM_CMD_CENC_SETKEY\n");
2321
2322 printk(KERN_ERR "MAC address = ");
2323 for (ii = 0; ii < 6; ii++) {
2324 printk(KERN_ERR "0x%02x ",
2325 zdparm->u.crypt.sta_addr[ii]);
2326 }
2327 printk(KERN_ERR "\n");
2328
2329 printk(KERN_ERR "Key Index : % d\n", zdparm->u.crypt.keyid);
2330 printk(KERN_ERR "Encryption key = ");
2331 for (ii = 0; ii < 16; ii++) {
2332 printk(KERN_ERR "0x%02x ", zdparm->u.crypt.key[ii]);
2333 }
2334 printk(KERN_ERR "\n");
2335
2336 printk(KERN_ERR "MIC key = ");
2337 for(ii = 16; ii < ZM_CENC_KEY_SIZE; ii++) {
2338 printk(KERN_ERR "0x%02x ", zdparm->u.crypt.key[ii]);
2339 }
2340 printk(KERN_ERR "\n");
2341
2342
2343 keyInfo.keyLength = ZM_CENC_KEY_SIZE;
2344 keyInfo.keyIndex = zdparm->u.crypt.keyid;
2345 keyInfo.flag = ZM_KEY_FLAG_AUTHENTICATOR | ZM_KEY_FLAG_CENC;
2346 keyInfo.key = zdparm->u.crypt.key;
2347 keyInfo.macAddr = (u16_t *)zdparm->u.crypt.sta_addr;
2348
2349
2350 if (memcmp(zdparm->u.crypt.sta_addr, bc_addr,
2351 sizeof(bc_addr)) == 0) {
2352 keyInfo.flag |= ZM_KEY_FLAG_GK;
2353 keyInfo.vapId = apId;
2354 memcpy(keyInfo.vapAddr, dev->dev_addr, ETH_ALEN);
2355 } else {
2356 keyInfo.flag |= ZM_KEY_FLAG_PK;
2357 }
2358
2359 zfiWlanSetKey(dev, keyInfo);
2360
2361 break;
2362 case ZM_CMD_CENC_REKEY:
2363
2364 printk(KERN_ERR "ZM_CMD_CENC_REKEY\n");
2365 break;
2366 default:
2367 ret = -EOPNOTSUPP;
2368 break;
2369 }
2370
2371
2372
2373
2374 return ret;
2375}
2376#endif
2377
2378int usbdrv_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
2379{
2380
2381
2382 struct zdap_ioctl zdreq;
2383 struct iwreq *wrq = (struct iwreq *)ifr;
2384 struct athr_wlan_param zdparm;
2385 struct usbdrv_private *macp = dev->ml_priv;
2386
2387 int err = 0, val = 0;
2388 int changed = 0;
2389
2390
2391
2392 if (!netif_running(dev))
2393 return -EINVAL;
2394
2395 switch (cmd) {
2396 case SIOCGIWNAME:
2397 strcpy(wrq->u.name, "IEEE 802.11-DS");
2398 break;
2399 case SIOCGIWAP:
2400 err = usbdrvwext_giwap(dev, NULL, &wrq->u.ap_addr, NULL);
2401 break;
2402 case SIOCSIWAP:
2403 err = usbdrvwext_siwap(dev, NULL, &wrq->u.ap_addr, NULL);
2404 break;
2405 case SIOCGIWMODE:
2406 err = usbdrvwext_giwmode(dev, NULL, &wrq->u.mode, NULL);
2407 break;
2408 case SIOCSIWESSID:
2409 printk(KERN_ERR "CWY - usbdrvwext_siwessid\n");
2410
2411 err = usbdrvwext_siwessid(dev, NULL, &wrq->u.essid, NULL);
2412
2413 if (!err)
2414 changed = 1;
2415 break;
2416 case SIOCGIWESSID:
2417 err = usbdrvwext_giwessid(dev, NULL, &wrq->u.essid, NULL);
2418 break;
2419 case SIOCSIWRTS:
2420 err = usbdrv_ioctl_setrts(dev, &wrq->u.rts);
2421 if (! err)
2422 changed = 1;
2423 break;
2424
2425 case SIOCIWFIRSTPRIV + 0x2: {
2426
2427 if (!capable(CAP_NET_ADMIN)) {
2428 err = -EPERM;
2429 break;
2430 }
2431 val = *((int *) wrq->u.name);
2432 if ((val < 0) || (val > 2)) {
2433 err = -EINVAL;
2434 break;
2435 } else {
2436 zfiWlanSetAuthenticationMode(dev, val);
2437
2438 if (macp->DeviceOpened == 1) {
2439 zfiWlanDisable(dev, 0);
2440 zfiWlanEnable(dev);
2441 }
2442
2443 err = 0;
2444 changed = 1;
2445 }
2446 }
2447 break;
2448
2449 case SIOCIWFIRSTPRIV + 0x3: {
2450 int AuthMode = ZM_AUTH_MODE_OPEN;
2451
2452
2453
2454 if (wrq->u.data.pointer) {
2455 wrq->u.data.flags = 1;
2456
2457 AuthMode = zfiWlanQueryAuthenticationMode(dev, 0);
2458 if (AuthMode == ZM_AUTH_MODE_OPEN) {
2459 wrq->u.data.length = 12;
2460
2461 if (copy_to_user(wrq->u.data.pointer,
2462 "open system", 12)) {
2463 return -EFAULT;
2464 }
2465 } else if (AuthMode == ZM_AUTH_MODE_SHARED_KEY) {
2466 wrq->u.data.length = 11;
2467
2468 if (copy_to_user(wrq->u.data.pointer,
2469 "shared key", 11)) {
2470 return -EFAULT;
2471 }
2472 } else if (AuthMode == ZM_AUTH_MODE_AUTO) {
2473 wrq->u.data.length = 10;
2474
2475 if (copy_to_user(wrq->u.data.pointer,
2476 "auto mode", 10)) {
2477 return -EFAULT;
2478 }
2479 } else {
2480 return -EFAULT;
2481 }
2482 }
2483 }
2484 break;
2485
2486 case ZDAPIOCTL:
2487 if (copy_from_user(&zdreq, ifr->ifr_data, sizeof(zdreq))) {
2488 printk(KERN_ERR "usbdrv : copy_from_user error\n");
2489 return -EFAULT;
2490 }
2491
2492
2493
2494
2495
2496
2497 zfLnxPrivateIoctl(dev, &zdreq);
2498
2499 err = 0;
2500 break;
2501 case ZD_IOCTL_WPA:
2502 if (copy_from_user(&zdparm, ifr->ifr_data,
2503 sizeof(struct athr_wlan_param))) {
2504 printk(KERN_ERR "usbdrv : copy_from_user error\n");
2505 return -EFAULT;
2506 }
2507
2508 usbdrv_wpa_ioctl(dev, &zdparm);
2509 err = 0;
2510 break;
2511 case ZD_IOCTL_PARAM: {
2512 int *p;
2513 int op;
2514 int arg;
2515
2516
2517
2518
2519 p = (int *)wrq->u.name;
2520 op = *p++;
2521 arg = *p;
2522
2523 if (op == ZD_PARAM_ROAMING) {
2524 printk(KERN_ERR
2525 "*************ZD_PARAM_ROAMING : % d\n", arg);
2526
2527 }
2528 if (op == ZD_PARAM_PRIVACY) {
2529 printk(KERN_ERR "ZD_IOCTL_PRIVACY : ");
2530
2531
2532 if (arg) {
2533
2534
2535 printk(KERN_ERR "enable\n");
2536
2537 } else {
2538
2539
2540 printk(KERN_ERR "disable\n");
2541 }
2542
2543 }
2544 if (op == ZD_PARAM_WPA) {
2545
2546 printk(KERN_ERR "ZD_PARAM_WPA : ");
2547
2548 if (arg) {
2549 printk(KERN_ERR "enable\n");
2550
2551 if (zfiWlanQueryWlanMode(dev) != ZM_MODE_AP) {
2552 printk(KERN_ERR "Station Mode\n");
2553
2554
2555
2556
2557
2558
2559 if ((macp->supIe[21] == 0x50) &&
2560 (macp->supIe[22] == 0xf2) &&
2561 (macp->supIe[23] == 0x2)) {
2562 printk(KERN_ERR
2563 "wd->sta.authMode = ZM_AUTH_MODE_WPAPSK\n");
2564
2565
2566 zfiWlanSetAuthenticationMode(dev,
2567 ZM_AUTH_MODE_WPAPSK);
2568 } else if ((macp->supIe[21] == 0x50) &&
2569 (macp->supIe[22] == 0xf2) &&
2570 (macp->supIe[23] == 0x1)) {
2571 printk(KERN_ERR
2572 "wd->sta.authMode = ZM_AUTH_MODE_WPA\n");
2573
2574
2575 zfiWlanSetAuthenticationMode(dev,
2576 ZM_AUTH_MODE_WPA);
2577 } else if ((macp->supIe[17] == 0xf) &&
2578 (macp->supIe[18] == 0xac) &&
2579 (macp->supIe[19] == 0x2))
2580 {
2581 printk(KERN_ERR
2582 "wd->sta.authMode = ZM_AUTH_MODE_WPA2PSK\n");
2583
2584
2585 zfiWlanSetAuthenticationMode(dev,
2586 ZM_AUTH_MODE_WPA2PSK);
2587 } else if ((macp->supIe[17] == 0xf) &&
2588 (macp->supIe[18] == 0xac) &&
2589 (macp->supIe[19] == 0x1))
2590 {
2591 printk(KERN_ERR
2592 "wd->sta.authMode = ZM_AUTH_MODE_WPA2\n");
2593
2594
2595 zfiWlanSetAuthenticationMode(dev,
2596 ZM_AUTH_MODE_WPA2);
2597 }
2598
2599 if ((macp->supIe[21] == 0x50) ||
2600 (macp->supIe[22] == 0xf2)) {
2601 if (macp->supIe[11] == 0x2) {
2602 printk(KERN_ERR
2603 "wd->sta.wepStatus = ZM_ENCRYPTION_TKIP\n");
2604
2605
2606 zfiWlanSetWepStatus(dev, ZM_ENCRYPTION_TKIP);
2607 } else {
2608 printk(KERN_ERR
2609 "wd->sta.wepStatus = ZM_ENCRYPTION_AES\n");
2610
2611
2612 zfiWlanSetWepStatus(dev, ZM_ENCRYPTION_AES);
2613 }
2614 }
2615
2616 if ((macp->supIe[17] == 0xf) ||
2617 (macp->supIe[18] == 0xac)) {
2618 if (macp->supIe[13] == 0x2) {
2619 printk(KERN_ERR
2620 "wd->sta.wepStatus = ZM_ENCRYPTION_TKIP\n");
2621
2622
2623 zfiWlanSetWepStatus(dev, ZM_ENCRYPTION_TKIP);
2624 } else {
2625 printk(KERN_ERR
2626 "wd->sta.wepStatus = ZM_ENCRYPTION_AES\n");
2627
2628
2629 zfiWlanSetWepStatus(dev, ZM_ENCRYPTION_AES);
2630 }
2631 }
2632 }
2633 zfiWlanSetWpaSupport(dev, 1);
2634 } else {
2635
2636 printk(KERN_ERR "disable\n");
2637
2638 zfiWlanSetWpaSupport(dev, 0);
2639 zfiWlanSetAuthenticationMode(dev, ZM_AUTH_MODE_OPEN);
2640 zfiWlanSetWepStatus(dev, ZM_ENCRYPTION_WEP_DISABLED);
2641
2642
2643
2644
2645
2646 }
2647 }
2648
2649 if (op == ZD_PARAM_COUNTERMEASURES) {
2650 printk(KERN_ERR
2651 "****************ZD_PARAM_COUNTERMEASURES : ");
2652
2653 if(arg) {
2654
2655 printk(KERN_ERR "enable\n");
2656 } else {
2657
2658 printk(KERN_ERR "disable\n");
2659 }
2660 }
2661 if (op == ZD_PARAM_DROPUNENCRYPTED) {
2662 printk(KERN_ERR "ZD_PARAM_DROPUNENCRYPTED : ");
2663
2664 if(arg) {
2665 printk(KERN_ERR "enable\n");
2666 } else {
2667 printk(KERN_ERR "disable\n");
2668 }
2669 }
2670 if (op == ZD_PARAM_AUTH_ALGS) {
2671 printk(KERN_ERR "ZD_PARAM_AUTH_ALGS : ");
2672
2673 if (arg == 0) {
2674 printk(KERN_ERR "OPEN_SYSTEM\n");
2675 } else {
2676 printk(KERN_ERR "SHARED_KEY\n");
2677 }
2678 }
2679 if (op == ZD_PARAM_WPS_FILTER) {
2680 printk(KERN_ERR "ZD_PARAM_WPS_FILTER : ");
2681
2682 if (arg) {
2683
2684 macp->forwardMgmt = 1;
2685 printk(KERN_ERR "enable\n");
2686 } else {
2687
2688 macp->forwardMgmt = 0;
2689 printk(KERN_ERR "disable\n");
2690 }
2691 }
2692 }
2693 err = 0;
2694 break;
2695 case ZD_IOCTL_GETWPAIE: {
2696 struct ieee80211req_wpaie req_wpaie;
2697 u16_t apId, i, j;
2698
2699
2700 apId = zfLnxGetVapId(dev);
2701
2702 if (apId == 0xffff) {
2703 apId = 0;
2704 } else {
2705 apId = apId + 1;
2706 }
2707
2708 if (copy_from_user(&req_wpaie, ifr->ifr_data,
2709 sizeof(struct ieee80211req_wpaie))) {
2710 printk(KERN_ERR "usbdrv : copy_from_user error\n");
2711 return -EFAULT;
2712 }
2713
2714 for (i = 0; i < ZM_OAL_MAX_STA_SUPPORT; i++) {
2715 for (j = 0; j < IEEE80211_ADDR_LEN; j++) {
2716 if (macp->stawpaie[i].wpa_macaddr[j] !=
2717 req_wpaie.wpa_macaddr[j])
2718 break;
2719 }
2720 if (j == 6)
2721 break;
2722 }
2723
2724 if (i < ZM_OAL_MAX_STA_SUPPORT) {
2725
2726 memcpy(req_wpaie.wpa_ie, macp->stawpaie[i].wpa_ie,
2727 IEEE80211_MAX_IE_SIZE);
2728 }
2729
2730 if (copy_to_user(wrq->u.data.pointer, &req_wpaie,
2731 sizeof(struct ieee80211req_wpaie))) {
2732 return -EFAULT;
2733 }
2734 }
2735
2736 err = 0;
2737 break;
2738 #ifdef ZM_ENABLE_CENC
2739 case ZM_IOCTL_CENC:
2740 if (copy_from_user(&macp->zd_wpa_req, ifr->ifr_data,
2741 sizeof(struct athr_wlan_param))) {
2742 printk(KERN_ERR "usbdrv : copy_from_user error\n");
2743 return -EFAULT;
2744 }
2745
2746 usbdrv_cenc_ioctl(dev,
2747 (struct zydas_cenc_param *)&macp->zd_wpa_req);
2748 err = 0;
2749 break;
2750 #endif
2751 default:
2752 err = -EOPNOTSUPP;
2753 break;
2754 }
2755
2756 return err;
2757}
2758