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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46#include <linux/types.h>
47#include <linux/etherdevice.h>
48#include <linux/mutex.h>
49#include <linux/semaphore.h>
50#include <linux/version.h>
51#include <linux/vmalloc.h>
52#include "csr_wifi_hip_unifi.h"
53#include "csr_wifi_hip_conversions.h"
54#include "unifi_priv.h"
55#include <net/pkt_sched.h>
56
57
58
59#ifdef CSR_SUPPORT_WEXT
60extern struct iw_handler_def unifi_iw_handler_def;
61#endif
62static void check_ba_frame_age_timeout( unifi_priv_t *priv,
63 netInterface_priv_t *interfacePriv,
64 ba_session_rx_struct *ba_session);
65static void process_ba_frame(unifi_priv_t *priv,
66 netInterface_priv_t *interfacePriv,
67 ba_session_rx_struct *ba_session,
68 frame_desc_struct *frame_desc);
69static void process_ba_complete(unifi_priv_t *priv, netInterface_priv_t *interfacePriv);
70static void process_ma_packet_error_ind(unifi_priv_t *priv, CSR_SIGNAL *signal, bulk_data_param_t *bulkdata);
71static void process_amsdu(unifi_priv_t *priv, CSR_SIGNAL *signal, bulk_data_param_t *bulkdata);
72static int uf_net_open(struct net_device *dev);
73static int uf_net_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
74static int uf_net_stop(struct net_device *dev);
75static struct net_device_stats *uf_net_get_stats(struct net_device *dev);
76static u16 uf_net_select_queue(struct net_device *dev, struct sk_buff *skb);
77static netdev_tx_t uf_net_xmit(struct sk_buff *skb, struct net_device *dev);
78static void uf_set_multicast_list(struct net_device *dev);
79
80
81typedef int (*tx_signal_handler)(unifi_priv_t *priv, struct sk_buff *skb, const struct ethhdr *ehdr, CSR_PRIORITY priority);
82
83#ifdef CONFIG_NET_SCHED
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110struct uf_sched_data
111{
112
113 struct tcf_proto *filter_list;
114
115 struct Qdisc *queues[UNIFI_TRAFFIC_Q_MAX];
116};
117
118struct uf_tx_packet_data {
119
120 unifi_TrafficQueue queue;
121
122 CSR_PRIORITY priority;
123
124 unsigned long host_tag;
125};
126
127#endif
128
129static const struct net_device_ops uf_netdev_ops =
130{
131 .ndo_open = uf_net_open,
132 .ndo_stop = uf_net_stop,
133 .ndo_start_xmit = uf_net_xmit,
134 .ndo_do_ioctl = uf_net_ioctl,
135 .ndo_get_stats = uf_net_get_stats,
136 .ndo_set_rx_mode = uf_set_multicast_list,
137 .ndo_select_queue = uf_net_select_queue,
138};
139
140static u8 oui_rfc1042[P80211_OUI_LEN] = { 0x00, 0x00, 0x00 };
141static u8 oui_8021h[P80211_OUI_LEN] = { 0x00, 0x00, 0xf8 };
142
143
144
145static void netdev_mlme_event_handler(ul_client_t *client,
146 const u8 *sig_packed, int sig_len,
147 const bulk_data_param_t *bulkdata,
148 int dir);
149
150#ifdef CSR_SUPPORT_WEXT
151
152
153
154static struct notifier_block uf_netdev_notifier;
155#endif
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181unifi_priv_t *
182uf_alloc_netdevice(CsrSdioFunction *sdio_dev, int bus_id)
183{
184 struct net_device *dev;
185 unifi_priv_t *priv;
186 netInterface_priv_t *interfacePriv;
187#ifdef CSR_SUPPORT_WEXT
188 int rc;
189#endif
190 unsigned char i;
191
192
193
194
195
196
197
198
199
200 dev = alloc_etherdev_mq(sizeof(unifi_priv_t) + sizeof(netInterface_priv_t), UNIFI_TRAFFIC_Q_MAX);
201
202 if (dev == NULL) {
203 return NULL;
204 }
205
206
207 interfacePriv = (netInterface_priv_t *)netdev_priv(dev);
208 priv = (unifi_priv_t *)(interfacePriv + 1);
209 interfacePriv->privPtr = priv;
210 interfacePriv->InterfaceTag = 0;
211
212
213
214 for(i=0; i<CSR_WIFI_NUM_INTERFACES; i++) {
215 priv->netdev[i] = NULL;
216 priv->interfacePriv[i] = NULL;
217 }
218 priv->netdev[0] = dev;
219 priv->interfacePriv[0] = interfacePriv;
220
221
222 dev->netdev_ops = &uf_netdev_ops;
223
224#ifdef CSR_SUPPORT_WEXT
225 dev->wireless_handlers = &unifi_iw_handler_def;
226#if IW_HANDLER_VERSION < 6
227 dev->get_wireless_stats = unifi_get_wireless_stats;
228#endif
229#endif
230
231
232 dev->needed_headroom = 32;
233
234
235 priv->instance = bus_id;
236
237 priv->sdio = sdio_dev;
238
239 sdio_dev->driverData = (void*)priv;
240
241 priv->init_progress = UNIFI_INIT_NONE;
242
243 priv->prev_queue = 0;
244
245
246
247
248
249
250
251
252 ul_init_clients(priv);
253
254
255
256
257
258 priv->netdev_client = ul_register_client(priv,
259 0,
260 netdev_mlme_event_handler);
261 if (priv->netdev_client == NULL) {
262 unifi_error(priv,
263 "Failed to register a unifi client for background netdev processing\n");
264 free_netdev(priv->netdev[0]);
265 return NULL;
266 }
267 unifi_trace(priv, UDBG2, "Netdev %p client (id:%d s:0x%X) is registered\n",
268 dev, priv->netdev_client->client_id, priv->netdev_client->sender_id);
269
270 priv->sta_wmm_capabilities = 0;
271
272#if (defined(CSR_WIFI_SECURITY_WAPI_ENABLE) && defined(CSR_SUPPORT_SME))
273 priv->wapi_multicast_filter = 0;
274 priv->wapi_unicast_filter = 0;
275 priv->wapi_unicast_queued_pkt_filter = 0;
276#ifdef CSR_WIFI_SECURITY_WAPI_QOSCTRL_MIC_WORKAROUND
277 priv->isWapiConnection = FALSE;
278#endif
279#endif
280
281
282 interfacePriv->queueEnabled[0] = 1;
283 interfacePriv->queueEnabled[1] = 1;
284 interfacePriv->queueEnabled[2] = 1;
285 interfacePriv->queueEnabled[3] = 1;
286
287#ifdef CSR_SUPPORT_SME
288 priv->allPeerDozing = 0;
289#endif
290
291
292
293
294
295
296
297 if (use_5g) {
298 priv->if_index = CSR_INDEX_5G;
299 unifi_info(priv, "Using the 802.11a radio\n");
300 } else {
301 priv->if_index = CSR_INDEX_2G4;
302 }
303
304
305 priv->bh_thread.thread_task = NULL;
306 priv->bh_thread.block_thread = 1;
307 init_waitqueue_head(&priv->bh_thread.wakeup_q);
308 priv->bh_thread.wakeup_flag = 0;
309 sprintf(priv->bh_thread.name, "uf_bh_thread");
310
311
312 interfacePriv->connected = UnifiConnectedUnknown;
313
314#ifdef USE_DRIVER_LOCK
315 sema_init(&priv->lock, 1);
316#endif
317
318 spin_lock_init(&priv->send_signal_lock);
319
320 spin_lock_init(&priv->m4_lock);
321 sema_init(&priv->ba_mutex, 1);
322
323#if (defined(CSR_WIFI_SECURITY_WAPI_ENABLE) && defined(CSR_WIFI_SECURITY_WAPI_SW_ENCRYPTION))
324 spin_lock_init(&priv->wapi_lock);
325#endif
326
327#ifdef CSR_SUPPORT_SME
328 spin_lock_init(&priv->staRecord_lock);
329 spin_lock_init(&priv->tx_q_lock);
330#endif
331
332
333 priv->unifi_workqueue = create_singlethread_workqueue("unifi_workq");
334 if (priv->unifi_workqueue == NULL) {
335
336 ul_deregister_client(priv->netdev_client);
337 free_netdev(priv->netdev[0]);
338 return NULL;
339 }
340
341#ifdef CSR_SUPPORT_SME
342
343 INIT_WORK(&priv->multicast_list_task, uf_multicast_list_wq);
344
345
346 INIT_WORK(&interfacePriv->send_m4_ready_task, uf_send_m4_ready_wq);
347
348#if (defined(CSR_WIFI_SECURITY_WAPI_ENABLE) && defined(CSR_WIFI_SECURITY_WAPI_SW_ENCRYPTION))
349
350 INIT_WORK(&interfacePriv->send_pkt_to_encrypt, uf_send_pkt_to_encrypt);
351#endif
352#endif
353
354 priv->ref_count = 1;
355
356 priv->amp_client = NULL;
357 priv->coredump_mode = 0;
358 priv->ptest_mode = 0;
359 priv->wol_suspend = FALSE;
360 INIT_LIST_HEAD(&interfacePriv->rx_uncontrolled_list);
361 INIT_LIST_HEAD(&interfacePriv->rx_controlled_list);
362 sema_init(&priv->rx_q_sem, 1);
363
364#ifdef CSR_SUPPORT_WEXT
365 interfacePriv->netdev_callback_registered = FALSE;
366 interfacePriv->wait_netdev_change = FALSE;
367
368 if ((rc = register_netdevice_notifier(&uf_netdev_notifier)) == 0) {
369 interfacePriv->netdev_callback_registered = TRUE;
370 }
371 else {
372 unifi_warning(priv, "Failed to register netdevice notifier : %d %p\n", rc, dev);
373 }
374#endif
375
376#ifdef CSR_WIFI_SPLIT_PATCH
377
378 priv->pending_mode_set.common.destination = 0xaaaa;
379#endif
380
381 return priv;
382}
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411u8
412uf_alloc_netdevice_for_other_interfaces(unifi_priv_t *priv, u16 interfaceTag)
413{
414 struct net_device *dev;
415 netInterface_priv_t *interfacePriv;
416
417
418
419
420
421
422
423
424
425 dev = alloc_etherdev_mq(sizeof(netInterface_priv_t), 1);
426 if (dev == NULL) {
427 return FALSE;
428 }
429
430 if (interfaceTag >= CSR_WIFI_NUM_INTERFACES) {
431 unifi_error(priv, "uf_alloc_netdevice_for_other_interfaces bad interfaceTag\n");
432 return FALSE;
433 }
434
435
436 interfacePriv = (netInterface_priv_t *)netdev_priv(dev);
437 interfacePriv->privPtr = priv;
438 interfacePriv->InterfaceTag = interfaceTag;
439 priv->netdev[interfaceTag] = dev;
440 priv->interfacePriv[interfacePriv->InterfaceTag] = interfacePriv;
441
442
443 interfacePriv->connected = UnifiConnectedUnknown;
444 INIT_LIST_HEAD(&interfacePriv->rx_uncontrolled_list);
445 INIT_LIST_HEAD(&interfacePriv->rx_controlled_list);
446
447
448 dev->netdev_ops = &uf_netdev_ops;
449
450#ifdef CSR_SUPPORT_WEXT
451 dev->wireless_handlers = &unifi_iw_handler_def;
452#if IW_HANDLER_VERSION < 6
453 dev->get_wireless_stats = unifi_get_wireless_stats;
454#endif
455#endif
456 return TRUE;
457}
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475int
476uf_free_netdevice(unifi_priv_t *priv)
477{
478 int i;
479 unsigned long flags;
480
481 func_enter();
482
483 unifi_trace(priv, UDBG1, "uf_free_netdevice\n");
484
485 if (!priv) {
486 return -EINVAL;
487 }
488
489
490
491
492 uf_release_firmware_files(priv);
493
494#if (defined CSR_SUPPORT_SME) && (defined CSR_SUPPORT_WEXT)
495 if (priv->connection_config.mlmeAssociateReqInformationElements) {
496 kfree(priv->connection_config.mlmeAssociateReqInformationElements);
497 }
498 priv->connection_config.mlmeAssociateReqInformationElements = NULL;
499 priv->connection_config.mlmeAssociateReqInformationElementsLength = 0;
500
501 if (priv->mib_data.length) {
502 vfree(priv->mib_data.data);
503 }
504 priv->mib_data.data = NULL;
505 priv->mib_data.length = 0;
506
507#endif
508
509
510 spin_lock_irqsave(&priv->m4_lock, flags);
511 for (i = 0; i < CSR_WIFI_NUM_INTERFACES; i++) {
512 netInterface_priv_t *interfacePriv = priv->interfacePriv[i];
513 if (interfacePriv->m4_bulk_data.data_length > 0) {
514 unifi_trace(priv, UDBG5, "uf_free_netdevice: free M4 bulkdata %d\n", i);
515 unifi_net_data_free(priv, &interfacePriv->m4_bulk_data);
516 }
517 }
518 spin_unlock_irqrestore(&priv->m4_lock, flags);
519
520#if (defined(CSR_WIFI_SECURITY_WAPI_ENABLE) && defined(CSR_WIFI_SECURITY_WAPI_SW_ENCRYPTION))
521
522 spin_lock_irqsave(&priv->wapi_lock, flags);
523 for (i = 0; i < CSR_WIFI_NUM_INTERFACES; i++) {
524 netInterface_priv_t *interfacePriv = priv->interfacePriv[i];
525 if (interfacePriv->wapi_unicast_bulk_data.data_length > 0) {
526 unifi_trace(priv, UDBG5, "uf_free_netdevice: free WAPI PKT bulk data %d\n", i);
527 unifi_net_data_free(priv, &interfacePriv->wapi_unicast_bulk_data);
528 }
529 }
530 spin_unlock_irqrestore(&priv->wapi_lock, flags);
531#endif
532
533#ifdef CSR_SUPPORT_WEXT
534
535 unregister_netdevice_notifier(&uf_netdev_notifier);
536#endif
537
538#ifdef CSR_SUPPORT_SME
539
540 cancel_work_sync(&priv->multicast_list_task);
541#endif
542
543 flush_workqueue(priv->unifi_workqueue);
544 destroy_workqueue(priv->unifi_workqueue);
545
546
547
548
549 for (i=CSR_WIFI_NUM_INTERFACES-1; i>=0; i--) {
550
551 if (priv->netdev[i]) {
552 unifi_error(priv, "uf_free_netdevice: netdev %d %p\n", i, priv->netdev[i]);
553 free_netdev(priv->netdev[i]);
554 }
555 }
556
557 func_exit();
558 return 0;
559}
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575static int
576uf_net_open(struct net_device *dev)
577{
578 netInterface_priv_t *interfacePriv = (netInterface_priv_t *)netdev_priv(dev);
579 unifi_priv_t *priv = interfacePriv->privPtr;
580
581 func_enter();
582
583
584 if (priv->init_progress != UNIFI_INIT_COMPLETED) {
585 unifi_warning(priv, "%s: unifi not ready, failing net_open\n", __FUNCTION__);
586 return -EINVAL;
587 }
588
589#if (defined CSR_NATIVE_LINUX) && (defined UNIFI_SNIFF_ARPHRD) && defined(CSR_SUPPORT_WEXT)
590
591
592
593
594
595
596
597 if (priv->wext_conf.mode == IW_MODE_MONITOR) {
598 int err;
599 err = uf_start_sniff(priv);
600 if (err) {
601 return err;
602 }
603 netif_carrier_on(dev);
604 }
605#endif
606
607#ifdef CSR_SUPPORT_WEXT
608 if (interfacePriv->wait_netdev_change) {
609 unifi_trace(priv, UDBG1, "%s: Waiting for NETDEV_CHANGE, assume connected\n",
610 __FUNCTION__);
611 interfacePriv->connected = UnifiConnected;
612 interfacePriv->wait_netdev_change = FALSE;
613 }
614#endif
615
616 netif_tx_start_all_queues(dev);
617
618 func_exit();
619 return 0;
620}
621
622
623static int
624uf_net_stop(struct net_device *dev)
625{
626#if defined(CSR_NATIVE_LINUX) && defined(UNIFI_SNIFF_ARPHRD) && defined(CSR_SUPPORT_WEXT)
627 netInterface_priv_t *interfacePriv = (netInterface_priv_t*)netdev_priv(dev);
628 unifi_priv_t *priv = interfacePriv->privPtr;
629
630 func_enter();
631
632
633 if (priv->wext_conf.mode == IW_MODE_MONITOR) {
634 if (priv->card) {
635 int err;
636 err = unifi_reset_state(priv, dev->dev_addr, 1);
637 if (err) {
638 return err;
639 }
640 }
641 }
642#else
643 func_enter();
644#endif
645
646 netif_tx_stop_all_queues(dev);
647
648 func_exit();
649 return 0;
650}
651
652
653
654static int
655uf_net_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
656{
657 int rc;
658
659 rc = -EOPNOTSUPP;
660
661 return rc;
662}
663
664
665
666static struct net_device_stats *
667uf_net_get_stats(struct net_device *dev)
668{
669 netInterface_priv_t *interfacePriv = (netInterface_priv_t *)netdev_priv(dev);
670
671 return &interfacePriv->stats;
672}
673
674static CSR_PRIORITY uf_get_packet_priority(unifi_priv_t *priv, netInterface_priv_t *interfacePriv, struct sk_buff *skb, const int proto)
675{
676 CSR_PRIORITY priority = CSR_CONTENTION;
677
678 func_enter();
679 priority = (CSR_PRIORITY) (skb->priority >> 5);
680
681 if (priority == CSR_QOS_UP0) {
682
683 unifi_trace(priv, UDBG5, "uf_get_packet_priority: proto = 0x%.4X\n", proto);
684
685 switch (proto) {
686 case 0x0800:
687 case 0x814C:
688 case 0x880C:
689 priority = (CSR_PRIORITY) (skb->data[1 + ETH_HLEN] >> 5);
690 break;
691
692 case 0x8100:
693 priority = (CSR_PRIORITY) (skb->data[0 + ETH_HLEN] >> 5);
694 break;
695
696 case 0x86DD:
697 priority = (CSR_PRIORITY) ((skb->data[0 + ETH_HLEN] & 0x0E) >> 1);
698 break;
699
700 default:
701 priority = CSR_QOS_UP0;
702 break;
703 }
704 }
705
706
707
708 if (interfacePriv->interfaceMode == CSR_WIFI_ROUTER_CTRL_MODE_STA ||
709 interfacePriv->interfaceMode == CSR_WIFI_ROUTER_CTRL_MODE_P2PCLI) {
710 unifi_TrafficQueue queue;
711
712
713
714 queue = unifi_frame_priority_to_queue(priority);
715
716 while (queue > UNIFI_TRAFFIC_Q_BK && !interfacePriv->queueEnabled[queue]) {
717 queue--;
718 priority = unifi_get_default_downgrade_priority(queue);
719 }
720 }
721
722 unifi_trace(priv, UDBG5, "Packet priority = %d\n", priority);
723
724 func_exit();
725 return priority;
726}
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745CSR_PRIORITY
746get_packet_priority(unifi_priv_t *priv, struct sk_buff *skb, const struct ethhdr *ehdr, netInterface_priv_t *interfacePriv)
747{
748 CSR_PRIORITY priority = CSR_CONTENTION;
749 const int proto = ntohs(ehdr->h_proto);
750
751 u8 interfaceMode = interfacePriv->interfaceMode;
752
753 func_enter();
754
755
756 switch(interfaceMode)
757 {
758 case CSR_WIFI_ROUTER_CTRL_MODE_STA:
759 case CSR_WIFI_ROUTER_CTRL_MODE_P2PCLI:
760 unifi_trace(priv, UDBG4, "mode is STA \n");
761 if ((priv->sta_wmm_capabilities & QOS_CAPABILITY_WMM_ENABLED) == 1) {
762 priority = uf_get_packet_priority(priv, interfacePriv, skb, proto);
763 } else {
764 priority = CSR_CONTENTION;
765 }
766 break;
767#ifdef CSR_SUPPORT_SME
768 case CSR_WIFI_ROUTER_CTRL_MODE_AP:
769 case CSR_WIFI_ROUTER_CTRL_MODE_P2PGO:
770 case CSR_WIFI_ROUTER_CTRL_MODE_IBSS:
771 {
772 CsrWifiRouterCtrlStaInfo_t * dstStaInfo =
773 CsrWifiRouterCtrlGetStationRecordFromPeerMacAddress(priv,ehdr->h_dest, interfacePriv->InterfaceTag);
774 unifi_trace(priv, UDBG4, "mode is AP \n");
775 if (!(ehdr->h_dest[0] & 0x01) && dstStaInfo && dstStaInfo->wmmOrQosEnabled) {
776
777 priority = uf_get_packet_priority(priv, interfacePriv, skb, proto);
778 } else {
779
780 unifi_trace(priv, UDBG4, "Destination is not QSTA or BroadCast/Multicast\n");
781 priority = CSR_CONTENTION;
782 }
783 }
784 break;
785#endif
786 default:
787 unifi_trace(priv, UDBG3, " mode unknown in %s func, mode=%x\n", __FUNCTION__, interfaceMode);
788 }
789 unifi_trace(priv, UDBG5, "priority = %x\n", priority);
790
791 func_exit();
792 return priority;
793}
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809static u16
810uf_net_select_queue(struct net_device *dev, struct sk_buff *skb)
811{
812 netInterface_priv_t *interfacePriv = (netInterface_priv_t *)netdev_priv(dev);
813 unifi_priv_t *priv = (unifi_priv_t *)interfacePriv->privPtr;
814 struct ethhdr ehdr;
815 unifi_TrafficQueue queue;
816 int proto;
817 CSR_PRIORITY priority;
818
819 func_enter();
820
821 memcpy(&ehdr, skb->data, ETH_HLEN);
822 proto = ntohs(ehdr.h_proto);
823
824
825 if ((proto != ETH_P_PAE)
826#ifdef CSR_WIFI_SECURITY_WAPI_ENABLE
827 && (proto != ETH_P_WAI)
828#endif
829 ) {
830
831 priority = get_packet_priority(priv, skb, &ehdr, interfacePriv);
832 queue = unifi_frame_priority_to_queue(priority);
833 } else {
834
835 queue = UNIFI_TRAFFIC_Q_EAPOL;
836 }
837
838
839 func_exit();
840 return (u16)queue;
841}
842
843int
844skb_add_llc_snap(struct net_device *dev, struct sk_buff *skb, int proto)
845{
846 llc_snap_hdr_t *snap;
847 netInterface_priv_t *interfacePriv = (netInterface_priv_t *)netdev_priv(dev);
848 unifi_priv_t *priv = interfacePriv->privPtr;
849 int headroom;
850
851
852 headroom = skb_headroom(skb);
853
854
855 if (proto < 0x600) {
856
857
858 unifi_trace(priv, UDBG3, "802.3 len: %d\n", skb->len);
859
860
861 skb_trim(skb, proto);
862 } else if (proto == ETH_P_8021Q) {
863
864
865 u16 vlan_snap = *(u16*)skb->data;
866
867 if (headroom < 14) {
868 unifi_trace(priv, UDBG3, "cant append vlan snap: debug\n");
869 return -1;
870 }
871
872 snap = (llc_snap_hdr_t *)skb_push(skb, 4);
873 snap->dsap = snap->ssap = 0xAA;
874 snap->ctrl = 0x03;
875 memcpy(snap->oui, oui_rfc1042, P80211_OUI_LEN);
876
877
878 snap = (llc_snap_hdr_t *)skb_push(skb, 10);
879 snap->dsap = snap->ssap = 0xAA;
880 snap->ctrl = 0x03;
881 memcpy(snap->oui, oui_rfc1042, P80211_OUI_LEN);
882
883
884 snap->protocol = htons(proto);
885 *(u16*)(snap + 1) = vlan_snap;
886
887 } else
888 {
889
890 unifi_trace(priv, UDBG3, "DIXII len: %d\n", skb->len);
891
892
893 if (headroom < sizeof(llc_snap_hdr_t)) {
894 unifi_trace(priv, UDBG3, "cant append snap: debug\n");
895 return -1;
896 }
897
898 snap = (llc_snap_hdr_t *)skb_push(skb, sizeof(llc_snap_hdr_t));
899 snap->dsap = snap->ssap = 0xAA;
900 snap->ctrl = 0x03;
901
902 if ((proto == ETH_P_AARP) || (proto == ETH_P_IPX)) {
903 memcpy(snap->oui, oui_8021h, P80211_OUI_LEN);
904 } else {
905 memcpy(snap->oui, oui_rfc1042, P80211_OUI_LEN);
906 }
907 snap->protocol = htons(proto);
908 }
909
910 return 0;
911}
912
913#ifdef CSR_SUPPORT_SME
914static int
915_identify_sme_ma_pkt_ind(unifi_priv_t *priv,
916 const s8 *oui, u16 protocol,
917 const CSR_SIGNAL *signal,
918 bulk_data_param_t *bulkdata,
919 const unsigned char *daddr,
920 const unsigned char *saddr)
921{
922 CSR_MA_PACKET_INDICATION *pkt_ind = (CSR_MA_PACKET_INDICATION*)&signal->u.MaPacketIndication;
923 int r;
924 u8 i;
925
926 unifi_trace(priv, UDBG5,
927 "_identify_sme_ma_pkt_ind -->\n");
928 for (i = 0; i < MAX_MA_UNIDATA_IND_FILTERS; i++) {
929 if (priv->sme_unidata_ind_filters[i].in_use) {
930 if (!memcmp(oui, priv->sme_unidata_ind_filters[i].oui, 3) &&
931 (protocol == priv->sme_unidata_ind_filters[i].protocol)) {
932
933
934 if (priv->sme_cli) {
935
936
937
938
939 unifi_trace(priv, UDBG1,
940 "_identify_sme_ma_pkt_ind: handle=%d, encap=%d, proto=%x\n",
941 i, priv->sme_unidata_ind_filters[i].encapsulation,
942 priv->sme_unidata_ind_filters[i].protocol);
943 if (priv->sme_unidata_ind_filters[i].encapsulation == CSR_WIFI_ROUTER_ENCAPSULATION_ETHERNET) {
944 struct sk_buff *skb;
945
946 skb = (struct sk_buff*)bulkdata->d[0].os_net_buf_ptr;
947 skb->len = bulkdata->d[0].data_length;
948
949 unifi_trace(priv, UDBG1,
950 "_identify_sme_ma_pkt_ind: skb_80211_to_ether -->\n");
951 r = skb_80211_to_ether(priv, skb, daddr, saddr,
952 signal, bulkdata);
953 unifi_trace(priv, UDBG1,
954 "_identify_sme_ma_pkt_ind: skb_80211_to_ether <--\n");
955 if (r) {
956 return -EINVAL;
957 }
958
959
960 bulkdata->d[0].os_data_ptr = skb->data;
961 bulkdata->d[0].data_length = skb->len;
962 } else {
963
964 bulkdata->d[0].os_data_ptr -= 2*ETH_ALEN;
965 bulkdata->d[0].data_length += 2*ETH_ALEN;
966 memcpy((void*)bulkdata->d[0].os_data_ptr, daddr, ETH_ALEN);
967 memcpy((void*)bulkdata->d[0].os_data_ptr + ETH_ALEN, saddr, ETH_ALEN);
968 }
969
970 unifi_trace(priv, UDBG1,
971 "_identify_sme_ma_pkt_ind: unifi_sys_ma_pkt_ind -->\n");
972 CsrWifiRouterMaPacketIndSend(priv->sme_unidata_ind_filters[i].appHandle,
973 (pkt_ind->VirtualInterfaceIdentifier & 0xff),
974 i,
975 pkt_ind->ReceptionStatus,
976 bulkdata->d[0].data_length,
977 (u8*)bulkdata->d[0].os_data_ptr,
978 NULL,
979 pkt_ind->Rssi,
980 pkt_ind->Snr,
981 pkt_ind->ReceivedRate);
982
983
984 unifi_trace(priv, UDBG1,
985 "_identify_sme_ma_pkt_ind: unifi_sys_ma_pkt_ind <--\n");
986 }
987
988 return 1;
989 }
990 }
991 }
992
993 return -1;
994}
995#endif
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016int
1017skb_80211_to_ether(unifi_priv_t *priv, struct sk_buff *skb,
1018 const unsigned char *daddr, const unsigned char *saddr,
1019 const CSR_SIGNAL *signal,
1020 bulk_data_param_t *bulkdata)
1021{
1022 unsigned char *payload;
1023 int payload_length;
1024 struct ethhdr *eth;
1025 llc_snap_hdr_t *snap;
1026 int headroom;
1027#define UF_VLAN_LLC_HEADER_SIZE 18
1028 static const u8 vlan_inner_snap[] = { 0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00 };
1029#if defined(CSR_NATIVE_SOFTMAC) && defined(CSR_SUPPORT_SME)
1030 const CSR_MA_PACKET_INDICATION *pkt_ind = &signal->u.MaPacketIndication;
1031#endif
1032
1033 if(skb== NULL || daddr == NULL || saddr == NULL){
1034 unifi_error(priv,"skb_80211_to_ether: PBC fail\n");
1035 return 1;
1036 }
1037
1038 payload = skb->data;
1039 payload_length = skb->len;
1040
1041 snap = (llc_snap_hdr_t *)payload;
1042 eth = (struct ethhdr *)payload;
1043
1044
1045 headroom = skb_headroom(skb);
1046
1047
1048
1049
1050 if ((payload_length >= sizeof(llc_snap_hdr_t)) &&
1051 (snap->dsap == 0xAA) &&
1052 (snap->ssap == 0xAA) &&
1053 (snap->ctrl == 0x03) &&
1054 (snap->oui[0] == 0) &&
1055 (snap->oui[1] == 0) &&
1056 ((snap->oui[2] == 0) || (snap->oui[2] == 0xF8)))
1057 {
1058
1059 if ((snap->oui[2] == 0) &&
1060 ((ntohs(snap->protocol) == ETH_P_AARP) || (ntohs(snap->protocol) == ETH_P_IPX)))
1061 {
1062 u16 len;
1063
1064 unifi_trace(priv, UDBG3, "%s len: %d\n",
1065 (ntohs(snap->protocol) == ETH_P_AARP) ? "ETH_P_AARP" : "ETH_P_IPX",
1066 payload_length);
1067
1068
1069 if (headroom < (2 * ETH_ALEN + 2)) {
1070 unifi_warning(priv, "headroom not available to skb_push ether header\n");
1071 return -1;
1072 }
1073
1074
1075 len = htons(skb->len);
1076 memcpy(skb_push(skb, 2), &len, 2);
1077 memcpy(skb_push(skb, ETH_ALEN), saddr, ETH_ALEN);
1078 memcpy(skb_push(skb, ETH_ALEN), daddr, ETH_ALEN);
1079
1080 return 0;
1081 }
1082
1083 if ((snap->oui[2] == 0) && (ntohs(snap->protocol) == ETH_P_8021Q))
1084 {
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094 u16 vlan_snap;
1095
1096 if (payload_length < UF_VLAN_LLC_HEADER_SIZE) {
1097 unifi_warning(priv, "VLAN SNAP header too short: %d bytes\n", payload_length);
1098 return -1;
1099 }
1100
1101 if (memcmp(payload + 10, vlan_inner_snap, 6)) {
1102 unifi_warning(priv, "VLAN malformatted SNAP header.\n");
1103 return -1;
1104 }
1105
1106 unifi_trace(priv, UDBG3, "VLAN SNAP: %02x-%02x\n", payload[8], payload[9]);
1107 unifi_trace(priv, UDBG3, "VLAN len: %d\n", payload_length);
1108
1109
1110
1111 vlan_snap = *((u16*)(payload + 8));
1112
1113
1114 eth->h_proto = snap->protocol;
1115
1116 memcpy(eth->h_dest, daddr, ETH_ALEN);
1117 memcpy(eth->h_source, saddr, ETH_ALEN);
1118 *(u16*)(eth + 1) = vlan_snap;
1119 return 0;
1120 }
1121
1122
1123 unifi_trace(priv, UDBG3, "SNAP+RFC1042 len: %d\n", payload_length);
1124
1125
1126 skb_pull(skb, sizeof(llc_snap_hdr_t));
1127
1128
1129
1130
1131
1132 eth = (struct ethhdr *)skb_push(skb, ETH_HLEN);
1133 memcpy(eth->h_dest, daddr, ETH_ALEN);
1134 memcpy(eth->h_source, saddr, ETH_ALEN);
1135
1136 eth->h_proto = snap->protocol;
1137 } else {
1138 u16 len;
1139
1140
1141 if (headroom < (2 * ETH_ALEN + 2)) {
1142 unifi_warning(priv, "headroom not available to skb_push ether header\n");
1143 return -1;
1144 }
1145
1146 len = htons(skb->len);
1147 memcpy(skb_push(skb, 2), &len, 2);
1148 memcpy(skb_push(skb, ETH_ALEN), saddr, ETH_ALEN);
1149 memcpy(skb_push(skb, ETH_ALEN), daddr, ETH_ALEN);
1150
1151 return 1;
1152 }
1153
1154 return 0;
1155}
1156
1157
1158static CsrWifiRouterCtrlPortAction verify_port(unifi_priv_t *priv, unsigned char *address, int queue, u16 interfaceTag)
1159{
1160#ifdef CSR_NATIVE_LINUX
1161#ifdef CSR_SUPPORT_WEXT
1162 if (queue == UF_CONTROLLED_PORT_Q) {
1163 return priv->wext_conf.block_controlled_port;
1164 } else {
1165 return CSR_WIFI_ROUTER_CTRL_PORT_ACTION_8021X_PORT_OPEN;
1166 }
1167#else
1168 return CSR_WIFI_ROUTER_CTRL_PORT_ACTION_8021X_PORT_OPEN;
1169#endif
1170#else
1171 return uf_sme_port_state(priv, address, queue, interfaceTag);
1172#endif
1173}
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201int prepare_and_add_macheader(unifi_priv_t *priv, struct sk_buff *skb, struct sk_buff *newSkb,
1202 CSR_PRIORITY priority,
1203 bulk_data_param_t *bulkdata,
1204 u16 interfaceTag,
1205 const u8 *daddr,
1206 const u8 *saddr,
1207 u8 protection)
1208{
1209 u16 fc = 0;
1210 u8 qc = 0;
1211 u8 macHeaderLengthInBytes = MAC_HEADER_SIZE, *bufPtr = NULL;
1212 bulk_data_param_t data_ptrs;
1213 CsrResult csrResult;
1214 int headroom =0;
1215 u8 direction = 0;
1216 netInterface_priv_t *interfacePriv = priv->interfacePriv[interfaceTag];
1217 u8 *addressOne;
1218 u8 bQosNull = false;
1219
1220 if (skb == NULL) {
1221 unifi_error(priv,"prepare_and_add_macheader: Invalid SKB reference\n");
1222 return -1;
1223 }
1224
1225
1226 if (priority != CSR_CONTENTION) {
1227
1228 if (priority == CSR_MANAGEMENT) {
1229 fc |= cpu_to_le16(IEEE802_11_FC_TYPE_DATA);
1230 } else {
1231
1232 macHeaderLengthInBytes += QOS_CONTROL_HEADER_SIZE;
1233
1234 if (skb->len) {
1235
1236 fc |= cpu_to_le16(IEEE802_11_FC_TYPE_QOS_DATA);
1237 } else {
1238 fc |= cpu_to_le16(IEEE802_11_FC_TYPE_QOS_NULL);
1239 bQosNull = true;
1240 }
1241 }
1242 } else {
1243 if(skb->len == 0) {
1244 fc |= cpu_to_le16(IEEE802_11_FC_TYPE_NULL);
1245 } else {
1246 fc |= cpu_to_le16(IEEE802_11_FC_TYPE_DATA);
1247 }
1248 }
1249
1250 switch (interfacePriv->interfaceMode)
1251 {
1252 case CSR_WIFI_ROUTER_CTRL_MODE_STA:
1253 case CSR_WIFI_ROUTER_CTRL_MODE_P2PCLI:
1254 direction = 2;
1255 fc |= cpu_to_le16(IEEE802_11_FC_TO_DS_MASK);
1256 break;
1257 case CSR_WIFI_ROUTER_CTRL_MODE_IBSS:
1258 direction = 0;
1259 break;
1260 case CSR_WIFI_ROUTER_CTRL_MODE_AP:
1261 case CSR_WIFI_ROUTER_CTRL_MODE_P2PGO:
1262 direction = 1;
1263 fc |= cpu_to_le16(IEEE802_11_FC_FROM_DS_MASK);
1264 break;
1265 case CSR_WIFI_ROUTER_CTRL_MODE_AMP:
1266 if (priority == CSR_MANAGEMENT ) {
1267
1268 direction = 2;
1269 fc |= cpu_to_le16(IEEE802_11_FC_TO_DS_MASK);
1270 } else {
1271
1272 direction = 3;
1273 fc |= cpu_to_le16(IEEE802_11_FC_TO_DS_MASK | IEEE802_11_FC_FROM_DS_MASK);
1274 macHeaderLengthInBytes += 6;
1275 }
1276 break;
1277 default:
1278 unifi_warning(priv, "prepare_and_add_macheader: Unknown mode %d\n",
1279 interfacePriv->interfaceMode);
1280 }
1281
1282
1283
1284
1285
1286 if(protection) {
1287 fc |= cpu_to_le16(IEEE802_11_FC_PROTECTED_MASK);
1288 }
1289
1290
1291 headroom = skb_headroom(skb);
1292
1293 if (headroom < macHeaderLengthInBytes) {
1294 unifi_trace(priv, UDBG5,
1295 "prepare_and_add_macheader: Allocate headroom extra %d bytes\n",
1296 macHeaderLengthInBytes);
1297
1298 csrResult = unifi_net_data_malloc(priv, &data_ptrs.d[0], skb->len + macHeaderLengthInBytes);
1299
1300 if (csrResult != CSR_RESULT_SUCCESS) {
1301 unifi_error(priv, " failed to allocate request_data. in %s func\n", __FUNCTION__);
1302 return -1;
1303 }
1304 newSkb = (struct sk_buff *)(data_ptrs.d[0].os_net_buf_ptr);
1305 newSkb->len = skb->len + macHeaderLengthInBytes;
1306
1307 memcpy((void*)data_ptrs.d[0].os_data_ptr + macHeaderLengthInBytes,
1308 skb->data, skb->len);
1309
1310 bulkdata->d[0].os_data_ptr = newSkb->data;
1311 bulkdata->d[0].os_net_buf_ptr = (unsigned char*)newSkb;
1312 bulkdata->d[0].data_length = newSkb->len;
1313
1314 bufPtr = (u8*)data_ptrs.d[0].os_data_ptr;
1315
1316
1317 kfree_skb(skb);
1318 } else {
1319
1320
1321 bufPtr = (u8*)skb_push(skb, macHeaderLengthInBytes);
1322 bulkdata->d[0].os_data_ptr = skb->data;
1323 bulkdata->d[0].os_net_buf_ptr = (unsigned char*)skb;
1324 bulkdata->d[0].data_length = skb->len;
1325 }
1326
1327
1328
1329 memset(bufPtr, 0, macHeaderLengthInBytes);
1330
1331
1332 memcpy(bufPtr, &fc, sizeof(fc));
1333 bufPtr += sizeof(fc);
1334 macHeaderLengthInBytes -= sizeof(fc);
1335
1336
1337 bufPtr += 2;
1338 macHeaderLengthInBytes -= 2;
1339
1340 switch(direction)
1341 {
1342 case 0:
1343
1344
1345 memcpy(bufPtr, daddr, ETH_ALEN);
1346 bufPtr += ETH_ALEN;
1347 macHeaderLengthInBytes -= ETH_ALEN;
1348
1349
1350 memcpy(bufPtr, saddr, ETH_ALEN);
1351 bufPtr += ETH_ALEN;
1352 macHeaderLengthInBytes -= ETH_ALEN;
1353
1354
1355 memcpy(bufPtr, &interfacePriv->bssid, ETH_ALEN);
1356 bufPtr += ETH_ALEN;
1357 macHeaderLengthInBytes -= ETH_ALEN;
1358 break;
1359 case 1:
1360
1361 memcpy(bufPtr, daddr, ETH_ALEN);
1362 bufPtr += ETH_ALEN;
1363 macHeaderLengthInBytes -= ETH_ALEN;
1364
1365 memcpy(bufPtr, &interfacePriv->bssid, ETH_ALEN);
1366 bufPtr += ETH_ALEN;
1367 macHeaderLengthInBytes -= ETH_ALEN;
1368
1369
1370 memcpy(bufPtr, saddr, ETH_ALEN);
1371 bufPtr += ETH_ALEN;
1372 macHeaderLengthInBytes -= ETH_ALEN;
1373 break;
1374 case 2:
1375
1376 memcpy(bufPtr, &interfacePriv->bssid, ETH_ALEN);
1377 bufPtr += ETH_ALEN;
1378 macHeaderLengthInBytes -= ETH_ALEN;
1379
1380
1381 memcpy(bufPtr, saddr, ETH_ALEN);
1382 bufPtr += ETH_ALEN;
1383 macHeaderLengthInBytes -= ETH_ALEN;
1384
1385
1386 memcpy(bufPtr, daddr, ETH_ALEN);
1387 bufPtr += ETH_ALEN;
1388 macHeaderLengthInBytes -= ETH_ALEN;
1389 break;
1390 case 3:
1391 memcpy(bufPtr, &interfacePriv->bssid, ETH_ALEN);
1392 bufPtr += ETH_ALEN;
1393 macHeaderLengthInBytes -= ETH_ALEN;
1394
1395
1396 memcpy(bufPtr, saddr, ETH_ALEN);
1397 bufPtr += ETH_ALEN;
1398 macHeaderLengthInBytes -= ETH_ALEN;
1399
1400
1401 memcpy(bufPtr, daddr, ETH_ALEN);
1402 bufPtr += ETH_ALEN;
1403 macHeaderLengthInBytes -= ETH_ALEN;
1404 break;
1405 default:
1406 unifi_error(priv,"Unknown direction =%d : Not handled now\n",direction);
1407 return -1;
1408 }
1409
1410 bufPtr += 2;
1411 macHeaderLengthInBytes -= 2;
1412
1413 if (3 == direction) {
1414
1415 memcpy(bufPtr, saddr, ETH_ALEN);
1416 bufPtr += ETH_ALEN;
1417 macHeaderLengthInBytes -= ETH_ALEN;
1418 }
1419
1420
1421 if ((priority != CSR_CONTENTION) && (macHeaderLengthInBytes >= QOS_CONTROL_HEADER_SIZE)) {
1422
1423 if (priority > 7) {
1424 unifi_trace(priv, UDBG1, "data packets priority is more than 7, priority = %x\n", priority);
1425 qc |= 7;
1426 } else {
1427 qc |= priority;
1428 }
1429
1430
1431
1432
1433
1434 addressOne = bufPtr- ADDRESS_ONE_OFFSET;
1435
1436 if (addressOne[0] & 0x1) {
1437
1438 qc |= 1 << 5;
1439 }
1440
1441 if(interfacePriv->interfaceMode == CSR_WIFI_ROUTER_CTRL_MODE_STA ||
1442 interfacePriv->interfaceMode == CSR_WIFI_ROUTER_CTRL_MODE_IBSS ||
1443 interfacePriv->interfaceMode == CSR_WIFI_ROUTER_CTRL_MODE_P2PCLI) {
1444
1445 } else {
1446 if(bQosNull) {
1447 qc |= 1 << 4;
1448 }
1449 }
1450
1451
1452 bufPtr[0] = qc;
1453
1454 bufPtr[1] = 0;
1455 macHeaderLengthInBytes -= QOS_CONTROL_HEADER_SIZE;
1456 }
1457 if (macHeaderLengthInBytes) {
1458 unifi_warning(priv, " Mac header not appended properly\n");
1459 return -1;
1460 }
1461 return 0;
1462}
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481static int
1482send_ma_pkt_request(unifi_priv_t *priv, struct sk_buff *skb, const struct ethhdr *ehdr, CSR_PRIORITY priority)
1483{
1484 int r;
1485 u16 i;
1486 u8 eapolStore = FALSE;
1487 struct sk_buff *newSkb = NULL;
1488 bulk_data_param_t bulkdata;
1489 const int proto = ntohs(ehdr->h_proto);
1490 u16 interfaceTag;
1491 CsrWifiMacAddress peerAddress;
1492 CSR_TRANSMISSION_CONTROL transmissionControl = CSR_NO_CONFIRM_REQUIRED;
1493 s8 protection;
1494 netInterface_priv_t *interfacePriv = NULL;
1495 CSR_RATE TransmitRate = (CSR_RATE)0;
1496
1497 unifi_trace(priv, UDBG5, "entering send_ma_pkt_request\n");
1498
1499
1500 for (i = 0; i < CSR_WIFI_NUM_INTERFACES; i++) {
1501 if (!memcmp(priv->netdev[i]->dev_addr, ehdr->h_source, ETH_ALEN)) {
1502 interfaceTag = i;
1503 interfacePriv = priv->interfacePriv[interfaceTag];
1504 break;
1505 }
1506 }
1507
1508 if (interfacePriv == NULL) {
1509
1510 interfaceTag = 0;
1511 interfacePriv = priv->interfacePriv[interfaceTag];
1512 unifi_warning(priv, "Mac address not matching ... debugging needed\n");
1513 interfacePriv->stats.tx_dropped++;
1514 kfree_skb(skb);
1515 return -1;
1516 }
1517
1518
1519 if (skb_add_llc_snap(priv->netdev[interfaceTag], skb, proto) != 0) {
1520
1521 unifi_error(priv, "skb_add_llc_snap failed.\n");
1522 kfree_skb(skb);
1523 return -1;
1524 }
1525
1526 bulkdata.d[0].os_data_ptr = skb->data;
1527 bulkdata.d[0].os_net_buf_ptr = (unsigned char*)skb;
1528 bulkdata.d[0].net_buf_length = bulkdata.d[0].data_length = skb->len;
1529 bulkdata.d[1].os_data_ptr = NULL;
1530 bulkdata.d[1].os_net_buf_ptr = NULL;
1531 bulkdata.d[1].net_buf_length = bulkdata.d[1].data_length = 0;
1532
1533#ifdef CSR_SUPPORT_SME
1534
1535 if ((interfacePriv->interfaceMode != CSR_WIFI_ROUTER_CTRL_MODE_AP) &&
1536 (interfacePriv->interfaceMode != CSR_WIFI_ROUTER_CTRL_MODE_P2PGO)) {
1537 unifi_ta_sample(priv->card, CSR_WIFI_ROUTER_CTRL_PROTOCOL_DIRECTION_TX,
1538 &bulkdata.d[0], ehdr->h_source,
1539 priv->netdev[interfaceTag]->dev_addr,
1540 jiffies_to_msecs(jiffies),
1541 0);
1542 }
1543#endif
1544
1545 if ((proto == ETH_P_PAE)
1546#ifdef CSR_WIFI_SECURITY_WAPI_ENABLE
1547 || (proto == ETH_P_WAI)
1548#endif
1549 )
1550 {
1551
1552 if (0 == uf_verify_m4(priv, bulkdata.d[0].os_data_ptr, bulkdata.d[0].data_length)) {
1553 eapolStore = TRUE;
1554 }
1555 }
1556
1557#ifdef CSR_WIFI_SECURITY_WAPI_ENABLE
1558 if (proto == ETH_P_WAI)
1559 {
1560 protection = 0;
1561 }
1562 else
1563 {
1564#endif
1565#ifdef CSR_SUPPORT_SME
1566 if ((protection = uf_get_protection_bit_from_interfacemode(priv, interfaceTag, ehdr->h_dest)) < 0) {
1567 unifi_warning(priv, "unicast address, but destination not in station record database\n");
1568 unifi_net_data_free(priv, &bulkdata.d[0]);
1569 return -1;
1570 }
1571#else
1572 protection = 0;
1573#endif
1574#ifdef CSR_WIFI_SECURITY_WAPI_ENABLE
1575 }
1576#endif
1577
1578
1579 if (prepare_and_add_macheader(priv, skb, newSkb, priority, &bulkdata, interfaceTag, ehdr->h_dest, ehdr->h_source, protection)) {
1580 unifi_error(priv, "failed to create MAC header\n");
1581 unifi_net_data_free(priv, &bulkdata.d[0]);
1582 return -1;
1583 }
1584
1585
1586
1587
1588
1589 memcpy(peerAddress.a, ((u8 *) bulkdata.d[0].os_data_ptr) + 4, ETH_ALEN);
1590
1591 unifi_trace(priv, UDBG5, "RA[0]=%x, RA[1]=%x, RA[2]=%x, RA[3]=%x, RA[4]=%x, RA[5]=%x\n",
1592 peerAddress.a[0],peerAddress.a[1], peerAddress.a[2], peerAddress.a[3],
1593 peerAddress.a[4],peerAddress.a[5]);
1594
1595
1596 if ((proto == ETH_P_PAE)
1597#ifdef CSR_WIFI_SECURITY_WAPI_ENABLE
1598 || (proto == ETH_P_WAI)
1599#endif
1600 )
1601 {
1602 CSR_SIGNAL signal;
1603 CSR_MA_PACKET_REQUEST *req = &signal.u.MaPacketRequest;
1604
1605
1606 memset(&signal, 0, sizeof(CSR_SIGNAL));
1607
1608
1609 signal.SignalPrimitiveHeader.SignalId = CSR_MA_PACKET_REQUEST_ID;
1610 signal.SignalPrimitiveHeader.ReceiverProcessId = 0;
1611 signal.SignalPrimitiveHeader.SenderProcessId = priv->netdev_client->sender_id;
1612
1613 transmissionControl = req->TransmissionControl = 0;
1614#ifdef CSR_SUPPORT_SME
1615 if (eapolStore)
1616 {
1617 netInterface_priv_t *netpriv = (netInterface_priv_t *)netdev_priv(priv->netdev[interfaceTag]);
1618
1619
1620
1621 req->Priority = priority;
1622 unifi_trace(priv, UDBG3, "Tx Frame with Priority: %x\n", req->Priority);
1623
1624
1625 req->TransmitRate = 0;
1626 req->HostTag = CSR_WIFI_EAPOL_M4_HOST_TAG;
1627
1628 memcpy(req->Ra.x, ((u8 *) bulkdata.d[0].os_data_ptr) + 4, ETH_ALEN);
1629
1630 spin_lock(&priv->m4_lock);
1631
1632 interfacePriv->m4_signal = signal;
1633 interfacePriv->m4_bulk_data.net_buf_length = bulkdata.d[0].net_buf_length;
1634 interfacePriv->m4_bulk_data.data_length = bulkdata.d[0].data_length;
1635 interfacePriv->m4_bulk_data.os_data_ptr = bulkdata.d[0].os_data_ptr;
1636 interfacePriv->m4_bulk_data.os_net_buf_ptr = bulkdata.d[0].os_net_buf_ptr;
1637 spin_unlock(&priv->m4_lock);
1638
1639
1640
1641
1642
1643 queue_work(priv->unifi_workqueue, &netpriv->send_m4_ready_task);
1644
1645 return 0;
1646 }
1647#endif
1648 }
1649
1650#if (defined(CSR_WIFI_SECURITY_WAPI_ENABLE) && defined(CSR_WIFI_SECURITY_WAPI_SW_ENCRYPTION))
1651 if ((CSR_WIFI_ROUTER_CTRL_MODE_STA == interfacePriv->interfaceMode) && \
1652 (priv->wapi_unicast_filter) && \
1653 (proto != ETH_P_PAE) && \
1654 (proto != ETH_P_WAI) && \
1655 (skb->len > 0))
1656 {
1657 CSR_SIGNAL signal;
1658 CSR_MA_PACKET_REQUEST *req = &signal.u.MaPacketRequest;
1659 netInterface_priv_t *netpriv = (netInterface_priv_t *)netdev_priv(priv->netdev[interfaceTag]);
1660
1661 unifi_trace(priv, UDBG4, "send_ma_pkt_request() - WAPI unicast data packet when USKID = 1 \n");
1662
1663
1664 memset(&signal, 0, sizeof(CSR_SIGNAL));
1665
1666 signal.SignalPrimitiveHeader.SignalId = CSR_MA_PACKET_REQUEST_ID;
1667 signal.SignalPrimitiveHeader.ReceiverProcessId = 0;
1668 signal.SignalPrimitiveHeader.SenderProcessId = priv->netdev_client->sender_id;
1669
1670
1671 req->TransmissionControl = 0;
1672 req->Priority = priority;
1673 unifi_trace(priv, UDBG3, "Tx Frame with Priority: %x\n", req->Priority);
1674 req->TransmitRate = (CSR_RATE) 0;
1675 req->HostTag = 0xffffffff;
1676
1677 memcpy(req->Ra.x, ((u8 *) bulkdata.d[0].os_data_ptr) + 4, ETH_ALEN);
1678
1679
1680 spin_lock(&priv->wapi_lock);
1681 interfacePriv->wapi_unicast_ma_pkt_sig = signal;
1682 interfacePriv->wapi_unicast_bulk_data.net_buf_length = bulkdata.d[0].net_buf_length;
1683 interfacePriv->wapi_unicast_bulk_data.data_length = bulkdata.d[0].data_length;
1684 interfacePriv->wapi_unicast_bulk_data.os_data_ptr = bulkdata.d[0].os_data_ptr;
1685 interfacePriv->wapi_unicast_bulk_data.os_net_buf_ptr = bulkdata.d[0].os_net_buf_ptr;
1686 spin_unlock(&priv->wapi_lock);
1687
1688
1689
1690
1691
1692 queue_work(priv->unifi_workqueue, &netpriv->send_pkt_to_encrypt);
1693
1694 return 0;
1695 }
1696#endif
1697
1698 if(priv->cmanrTestMode)
1699 {
1700 TransmitRate = priv->cmanrTestModeTransmitRate;
1701 unifi_trace(priv, UDBG2, "send_ma_pkt_request: cmanrTestModeTransmitRate = %d TransmitRate=%d\n",
1702 priv->cmanrTestModeTransmitRate,
1703 TransmitRate
1704 );
1705 }
1706
1707
1708
1709 r = uf_process_ma_packet_req(priv,
1710 peerAddress.a,
1711 0xffffffff,
1712 interfaceTag,
1713 transmissionControl,
1714 TransmitRate,
1715 priority,
1716 priv->netdev_client->sender_id,
1717 &bulkdata);
1718
1719 if (r) {
1720 unifi_trace(priv, UDBG1, "(HIP validation failure) r = %x\n", r);
1721 unifi_net_data_free(priv, &bulkdata.d[0]);
1722 return -1;
1723 }
1724
1725 unifi_trace(priv, UDBG3, "leaving send_ma_pkt_request, UNITDATA result code = %d\n", r);
1726
1727 return r;
1728}
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751static netdev_tx_t
1752uf_net_xmit(struct sk_buff *skb, struct net_device *dev)
1753{
1754 netInterface_priv_t *interfacePriv = (netInterface_priv_t *)netdev_priv(dev);
1755 unifi_priv_t *priv = interfacePriv->privPtr;
1756 struct ethhdr ehdr;
1757 int proto, port;
1758 int result;
1759 static tx_signal_handler tx_handler;
1760 CSR_PRIORITY priority;
1761 CsrWifiRouterCtrlPortAction port_action;
1762
1763 func_enter();
1764
1765 unifi_trace(priv, UDBG5, "unifi_net_xmit: skb = %x\n", skb);
1766
1767 memcpy(&ehdr, skb->data, ETH_HLEN);
1768 proto = ntohs(ehdr.h_proto);
1769 priority = get_packet_priority(priv, skb, &ehdr, interfacePriv);
1770
1771
1772 tx_handler = send_ma_pkt_request;
1773
1774
1775 if ((proto != ETH_P_PAE)
1776#ifdef CSR_WIFI_SECURITY_WAPI_ENABLE
1777 && (proto != ETH_P_WAI)
1778#endif
1779 ) {
1780 port = UF_CONTROLLED_PORT_Q;
1781 } else {
1782
1783 port = UF_UNCONTROLLED_PORT_Q;
1784 }
1785
1786
1787 port_action = verify_port(priv
1788 , (((CSR_WIFI_ROUTER_CTRL_MODE_STA == interfacePriv->interfaceMode)||(CSR_WIFI_ROUTER_CTRL_MODE_P2PCLI== interfacePriv->interfaceMode))? interfacePriv->bssid.a: ehdr.h_dest)
1789 , port
1790 , interfacePriv->InterfaceTag);
1791
1792 if (port_action == CSR_WIFI_ROUTER_CTRL_PORT_ACTION_8021X_PORT_OPEN) {
1793 unifi_trace(priv, UDBG5,
1794 "uf_net_xmit: %s controlled port open\n",
1795 port ? "" : "un");
1796
1797 skb_pull(skb, ETH_HLEN);
1798 result = tx_handler(priv, skb, &ehdr, priority);
1799 } else {
1800
1801
1802 unifi_trace(priv, UDBG2,
1803 "uf_net_xmit: %s controlled port %s\n",
1804 port ? "" : "un", port_action==CSR_WIFI_ROUTER_CTRL_PORT_ACTION_8021X_PORT_CLOSED_BLOCK ? "blocked" : "closed");
1805 interfacePriv->stats.tx_dropped++;
1806 kfree_skb(skb);
1807
1808 func_exit();
1809 return NETDEV_TX_OK;
1810 }
1811
1812 if (result == NETDEV_TX_OK) {
1813#if (defined(CSR_WIFI_SECURITY_WAPI_ENABLE) && defined(CSR_WIFI_SECURITY_WAPI_SW_ENCRYPTION))
1814
1815 if (!((CSR_WIFI_ROUTER_CTRL_MODE_STA == interfacePriv->interfaceMode) &&
1816 (priv->wapi_unicast_filter == 1)))
1817 {
1818 dev->trans_start = jiffies;
1819
1820
1821
1822 interfacePriv->stats.tx_packets++;
1823
1824 interfacePriv->stats.tx_bytes += skb->len;
1825
1826 }
1827#else
1828 dev->trans_start = jiffies;
1829
1830
1831
1832
1833
1834 interfacePriv->stats.tx_packets++;
1835
1836 interfacePriv->stats.tx_bytes += skb->len;
1837#endif
1838 } else if (result < 0) {
1839
1840
1841
1842
1843
1844 interfacePriv->stats.tx_dropped++;
1845 unifi_trace(priv, UDBG1, "unifi_net_xmit: (Packet Drop), dropped count = %x\n", interfacePriv->stats.tx_dropped);
1846 result = NETDEV_TX_OK;
1847 }
1848
1849
1850
1851 func_exit();
1852 return result;
1853}
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874void
1875unifi_pause_xmit(void *ospriv, unifi_TrafficQueue queue)
1876{
1877 unifi_priv_t *priv = ospriv;
1878 int i;
1879
1880 func_enter();
1881 unifi_trace(priv, UDBG2, "Stopping queue %d\n", queue);
1882
1883 for(i=0;i<CSR_WIFI_NUM_INTERFACES;i++)
1884 {
1885 if (netif_running(priv->netdev[i]))
1886 {
1887 netif_stop_subqueue(priv->netdev[i], (u16)queue);
1888 }
1889 }
1890
1891#ifdef CSR_SUPPORT_SME
1892 if(queue<=3) {
1893 routerStartBuffering(priv,queue);
1894 unifi_trace(priv,UDBG2,"Start buffering %d\n", queue);
1895 } else {
1896 routerStartBuffering(priv,0);
1897 unifi_error(priv, "Start buffering %d defaulting to 0\n", queue);
1898 }
1899#endif
1900 func_exit();
1901
1902}
1903
1904void
1905unifi_restart_xmit(void *ospriv, unifi_TrafficQueue queue)
1906{
1907 unifi_priv_t *priv = ospriv;
1908 int i=0;
1909
1910 func_enter();
1911 unifi_trace(priv, UDBG2, "Waking queue %d\n", queue);
1912
1913 for(i=0;i<CSR_WIFI_NUM_INTERFACES;i++)
1914 {
1915 if (netif_running(priv->netdev[i]))
1916 {
1917 netif_wake_subqueue(priv->netdev[i], (u16)queue);
1918 }
1919 }
1920
1921#ifdef CSR_SUPPORT_SME
1922 if(queue <=3) {
1923 routerStopBuffering(priv,queue);
1924 uf_send_buffered_frames(priv,queue);
1925 } else {
1926 routerStopBuffering(priv,0);
1927 uf_send_buffered_frames(priv,0);
1928 }
1929#endif
1930 func_exit();
1931}
1932
1933
1934static void
1935indicate_rx_skb(unifi_priv_t *priv, u16 ifTag, u8* dst_a, u8* src_a, struct sk_buff *skb, CSR_SIGNAL *signal,
1936 bulk_data_param_t *bulkdata)
1937{
1938 int r, sr = 0;
1939 struct net_device *dev;
1940
1941#ifdef CSR_SUPPORT_SME
1942 llc_snap_hdr_t *snap;
1943
1944 snap = (llc_snap_hdr_t *)skb->data;
1945
1946 sr = _identify_sme_ma_pkt_ind(priv,
1947 snap->oui, ntohs(snap->protocol),
1948 signal,
1949 bulkdata,
1950 dst_a, src_a );
1951#endif
1952
1953
1954
1955
1956
1957
1958 r = skb_80211_to_ether(priv, skb, dst_a, src_a,
1959 signal, bulkdata);
1960 if (r == -1) {
1961
1962 priv->interfacePriv[ifTag]->stats.rx_errors++;
1963 priv->interfacePriv[ifTag]->stats.rx_frame_errors++;
1964 unifi_net_data_free(priv, &bulkdata->d[0]);
1965 unifi_notice(priv, "indicate_rx_skb: Discard unknown frame.\n");
1966 func_exit();
1967 return;
1968 }
1969
1970
1971
1972
1973
1974 if (r == 1 && sr == 1) {
1975 unifi_net_data_free(priv, &bulkdata->d[0]);
1976 unifi_trace(priv, UDBG5, "indicate_rx_skb: Data given to subscription"
1977 "API, not being given to kernel\n");
1978 func_exit();
1979 return;
1980 }
1981
1982 dev = priv->netdev[ifTag];
1983
1984
1985 skb->dev = dev;
1986 skb->protocol = eth_type_trans(skb, dev);
1987 skb->ip_summed = CHECKSUM_UNNECESSARY;
1988
1989
1990 if (skb->len > (dev->mtu + ETH_HLEN)) {
1991
1992
1993 unifi_error(priv, "%s: oversize frame (%d > %d)\n",
1994 dev->name,
1995 skb->len, dev->mtu + ETH_HLEN);
1996
1997
1998 priv->interfacePriv[ifTag]->stats.rx_errors++;
1999 priv->interfacePriv[ifTag]->stats.rx_length_errors++;
2000 unifi_net_data_free(priv, &bulkdata->d[0]);
2001 func_exit();
2002 return;
2003 }
2004
2005
2006 if(priv->cmanrTestMode)
2007 {
2008 const CSR_MA_PACKET_INDICATION *pkt_ind = &signal->u.MaPacketIndication;
2009 priv->cmanrTestModeTransmitRate = pkt_ind->ReceivedRate;
2010 unifi_trace(priv, UDBG2, "indicate_rx_skb: cmanrTestModeTransmitRate=%d\n", priv->cmanrTestModeTransmitRate);
2011 }
2012
2013
2014#ifdef CSR_WIFI_USE_NETIF_RX
2015 netif_rx(skb);
2016#else
2017 netif_rx_ni(skb);
2018#endif
2019
2020 if (dev != NULL) {
2021 dev->last_rx = jiffies;
2022 }
2023
2024
2025 priv->interfacePriv[ifTag]->stats.rx_packets++;
2026 priv->interfacePriv[ifTag]->stats.rx_bytes += bulkdata->d[0].data_length;
2027
2028 func_exit();
2029 return;
2030}
2031
2032void
2033uf_process_rx_pending_queue(unifi_priv_t *priv, int queue,
2034 CsrWifiMacAddress source_address,
2035 int indicate, u16 interfaceTag)
2036{
2037 rx_buffered_packets_t *rx_q_item;
2038 struct list_head *rx_list;
2039 struct list_head *n;
2040 struct list_head *l_h;
2041 static const CsrWifiMacAddress broadcast_address = {{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}};
2042 netInterface_priv_t *interfacePriv = priv->interfacePriv[interfaceTag];
2043
2044 if (interfaceTag >= CSR_WIFI_NUM_INTERFACES) {
2045 unifi_error(priv, "uf_process_rx_pending_queue bad interfaceTag\n");
2046 return;
2047 }
2048
2049 if (queue == UF_CONTROLLED_PORT_Q) {
2050 rx_list = &interfacePriv->rx_controlled_list;
2051 } else {
2052 rx_list = &interfacePriv->rx_uncontrolled_list;
2053 }
2054
2055 down(&priv->rx_q_sem);
2056 list_for_each_safe(l_h, n, rx_list) {
2057 rx_q_item = list_entry(l_h, rx_buffered_packets_t, q);
2058
2059
2060 if (memcmp(broadcast_address.a, source_address.a, ETH_ALEN) &&
2061 memcmp(rx_q_item->sa.a, source_address.a, ETH_ALEN)) {
2062
2063 unifi_trace(priv, UDBG2,
2064 "uf_process_rx_pending_queue: Skipping sa=%02X%02X%02X%02X%02X%02X skb=%p, bulkdata=%p\n",
2065 rx_q_item->sa.a[0], rx_q_item->sa.a[1],
2066 rx_q_item->sa.a[2], rx_q_item->sa.a[3],
2067 rx_q_item->sa.a[4], rx_q_item->sa.a[5],
2068 rx_q_item->skb, &rx_q_item->bulkdata.d[0]);
2069 continue;
2070 }
2071
2072 list_del(l_h);
2073
2074
2075 unifi_trace(priv, UDBG2,
2076 "uf_process_rx_pending_queue: Was Blocked skb=%p, bulkdata=%p\n",
2077 rx_q_item->skb, &rx_q_item->bulkdata);
2078
2079 if (indicate) {
2080 indicate_rx_skb(priv, interfaceTag, rx_q_item->da.a, rx_q_item->sa.a, rx_q_item->skb, &rx_q_item->signal, &rx_q_item->bulkdata);
2081 } else {
2082 interfacePriv->stats.rx_dropped++;
2083 unifi_net_data_free(priv, &rx_q_item->bulkdata.d[0]);
2084 }
2085
2086
2087 kfree(rx_q_item);
2088 }
2089 up(&priv->rx_q_sem);
2090}
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107void
2108uf_resume_data_plane(unifi_priv_t *priv, int queue,
2109 CsrWifiMacAddress peer_address,
2110 u16 interfaceTag)
2111{
2112#ifdef CSR_SUPPORT_WEXT
2113 netInterface_priv_t *interfacePriv = priv->interfacePriv[interfaceTag];
2114#endif
2115
2116 if (interfaceTag >= CSR_WIFI_NUM_INTERFACES) {
2117 unifi_error(priv, "uf_resume_data_plane bad interfaceTag\n");
2118 return;
2119 }
2120
2121 unifi_trace(priv, UDBG2, "Resuming netif\n");
2122
2123
2124
2125
2126
2127
2128#ifdef CSR_SUPPORT_WEXT
2129 if (!interfacePriv->wait_netdev_change)
2130#endif
2131 {
2132#ifdef CONFIG_NET_SCHED
2133 if (netif_running(priv->netdev[interfaceTag])) {
2134 netif_tx_schedule_all(priv->netdev[interfaceTag]);
2135 }
2136#endif
2137 uf_process_rx_pending_queue(priv, queue, peer_address, 1,interfaceTag);
2138 }
2139}
2140
2141
2142void uf_free_pending_rx_packets(unifi_priv_t *priv, int queue, CsrWifiMacAddress peer_address,u16 interfaceTag)
2143{
2144 uf_process_rx_pending_queue(priv, queue, peer_address, 0,interfaceTag);
2145
2146}
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163static void
2164unifi_rx(unifi_priv_t *priv, CSR_SIGNAL *signal, bulk_data_param_t *bulkdata)
2165{
2166 u16 interfaceTag;
2167 bulk_data_desc_t *pData;
2168 const CSR_MA_PACKET_INDICATION *pkt_ind = &signal->u.MaPacketIndication;
2169 struct sk_buff *skb;
2170 CsrWifiRouterCtrlPortAction port_action;
2171 u8 dataFrameType;
2172 int proto;
2173 int queue;
2174
2175 u8 da[ETH_ALEN], sa[ETH_ALEN];
2176 u8 toDs, fromDs, frameType, macHeaderLengthInBytes = MAC_HEADER_SIZE;
2177 u16 frameControl;
2178 netInterface_priv_t *interfacePriv;
2179 struct ethhdr ehdr;
2180
2181 func_enter();
2182
2183 interfaceTag = (pkt_ind->VirtualInterfaceIdentifier & 0xff);
2184 interfacePriv = priv->interfacePriv[interfaceTag];
2185
2186
2187 if (interfaceTag >= CSR_WIFI_NUM_INTERFACES)
2188 {
2189 unifi_error(priv, "%s: MA-PACKET indication with bad interfaceTag %d\n", __FUNCTION__, interfaceTag);
2190 unifi_net_data_free(priv,&bulkdata->d[0]);
2191 func_exit();
2192 return;
2193 }
2194
2195
2196 if (!interfacePriv->netdev_registered)
2197 {
2198 unifi_error(priv, "%s: MA-PACKET indication with unallocated interfaceTag %d\n", __FUNCTION__, interfaceTag);
2199 unifi_net_data_free(priv, &bulkdata->d[0]);
2200 func_exit();
2201 return;
2202 }
2203
2204 if (bulkdata->d[0].data_length == 0) {
2205 unifi_warning(priv, "%s: MA-PACKET indication with zero bulk data\n", __FUNCTION__);
2206 unifi_net_data_free(priv,&bulkdata->d[0]);
2207 func_exit();
2208 return;
2209 }
2210
2211
2212 skb = (struct sk_buff*)bulkdata->d[0].os_net_buf_ptr;
2213 skb->len = bulkdata->d[0].data_length;
2214
2215
2216 toDs = (skb->data[1] & 0x01) ? 1 : 0;
2217 fromDs = (skb->data[1] & 0x02) ? 1 : 0;
2218
2219 memcpy(da,(skb->data+4+toDs*12),ETH_ALEN);
2220 memcpy(sa,(skb->data+10+fromDs*(6+toDs*8)),ETH_ALEN);
2221
2222
2223 pData = &bulkdata->d[0];
2224 frameControl = CSR_GET_UINT16_FROM_LITTLE_ENDIAN(pData->os_data_ptr);
2225 frameType = ((frameControl & 0x000C) >> 2);
2226
2227 dataFrameType =((frameControl & 0x00f0) >> 4);
2228 unifi_trace(priv, UDBG6,
2229 "%s: Receive Data Frame Type %d \n", __FUNCTION__,dataFrameType);
2230
2231 switch(dataFrameType)
2232 {
2233 case QOS_DATA:
2234 case QOS_DATA_NULL:
2235
2236 if (fromDs && toDs)
2237 {
2238
2239 macHeaderLengthInBytes += (QOS_CONTROL_HEADER_SIZE + 6);
2240 }
2241 else
2242 {
2243 macHeaderLengthInBytes += QOS_CONTROL_HEADER_SIZE;
2244 }
2245
2246
2247 if (frameControl & FRAME_CONTROL_ORDER_BIT)
2248 macHeaderLengthInBytes += HT_CONTROL_HEADER_SIZE;
2249 break;
2250 default:
2251 if (fromDs && toDs)
2252 macHeaderLengthInBytes += 6;
2253 }
2254
2255
2256 switch(dataFrameType)
2257 {
2258 case DATA_NULL:
2259 case QOS_DATA_NULL:
2260
2261
2262
2263 proto = 0x0;
2264 break;
2265 default:
2266 {
2267 llc_snap_hdr_t *snap;
2268
2269
2270
2271 snap = (llc_snap_hdr_t *) (skb->data + macHeaderLengthInBytes);
2272
2273
2274 ehdr.h_proto = snap->protocol;
2275 memcpy(ehdr.h_dest, da, ETH_ALEN);
2276 memcpy(ehdr.h_source, sa, ETH_ALEN);
2277 }
2278 proto = ntohs(ehdr.h_proto);
2279 }
2280 unifi_trace(priv, UDBG3, "in unifi_rx protocol from snap header = 0x%x\n", proto);
2281
2282 if ((proto != ETH_P_PAE)
2283#ifdef CSR_WIFI_SECURITY_WAPI_ENABLE
2284 && (proto != ETH_P_WAI)
2285#endif
2286 ) {
2287 queue = UF_CONTROLLED_PORT_Q;
2288 } else {
2289 queue = UF_UNCONTROLLED_PORT_Q;
2290 }
2291
2292 port_action = verify_port(priv, (unsigned char*)sa, queue, interfaceTag);
2293 unifi_trace(priv, UDBG3, "in unifi_rx port action is = 0x%x & queue = %x\n", port_action, queue);
2294
2295#ifdef CSR_SUPPORT_SME
2296
2297 if((interfacePriv->interfaceMode != CSR_WIFI_ROUTER_CTRL_MODE_AP) &&
2298 (interfacePriv->interfaceMode != CSR_WIFI_ROUTER_CTRL_MODE_P2PGO))
2299 {
2300
2301 skb_pull(skb, macHeaderLengthInBytes);
2302 pData->os_data_ptr = skb->data;
2303 pData->data_length -= macHeaderLengthInBytes;
2304
2305 if (pData->data_length) {
2306 unifi_ta_sample(priv->card, CSR_WIFI_ROUTER_CTRL_PROTOCOL_DIRECTION_RX,
2307 &bulkdata->d[0],
2308 sa, priv->netdev[interfaceTag]->dev_addr,
2309 jiffies_to_msecs(jiffies),
2310 pkt_ind->ReceivedRate);
2311 }
2312 } else {
2313
2314
2315 CsrWifiRouterCtrlStaInfo_t * srcStaInfo =
2316 CsrWifiRouterCtrlGetStationRecordFromPeerMacAddress(priv,sa,interfaceTag);
2317
2318
2319
2320
2321 if(srcStaInfo == NULL) {
2322 CsrWifiMacAddress peerMacAddress;
2323
2324 memcpy(peerMacAddress.a,sa,ETH_ALEN);
2325 unifi_trace(priv, UDBG1, "%s: Unexpected frame from peer = %x:%x:%x:%x:%x:%x\n", __FUNCTION__,
2326 sa[0], sa[1],sa[2], sa[3], sa[4],sa[5]);
2327 CsrWifiRouterCtrlUnexpectedFrameIndSend(priv->CSR_WIFI_SME_IFACEQUEUE,0,interfaceTag,peerMacAddress);
2328 unifi_net_data_free(priv, &bulkdata->d[0]);
2329 func_exit();
2330 return;
2331 }
2332
2333
2334 if (port_action != CSR_WIFI_ROUTER_CTRL_PORT_ACTION_8021X_PORT_OPEN) {
2335
2336 CsrWifiMacAddress peerMacAddress;
2337 memcpy(peerMacAddress.a,sa,ETH_ALEN);
2338 unifi_trace(priv, UDBG3, "%s: Port is not open: unexpected frame from peer = %x:%x:%x:%x:%x:%x\n",
2339 __FUNCTION__, sa[0], sa[1],sa[2], sa[3], sa[4],sa[5]);
2340
2341 CsrWifiRouterCtrlUnexpectedFrameIndSend(priv->CSR_WIFI_SME_IFACEQUEUE,0,interfaceTag,peerMacAddress);
2342 interfacePriv->stats.rx_dropped++;
2343 unifi_net_data_free(priv, &bulkdata->d[0]);
2344 unifi_notice(priv, "%s: Dropping packet, proto=0x%04x, %s port\n", __FUNCTION__,
2345 proto, queue ? "Controlled" : "Un-controlled");
2346 func_exit();
2347 return;
2348 }
2349
2350
2351 if((dataFrameType == QOS_DATA_NULL) || (dataFrameType == DATA_NULL)){
2352 unifi_trace(priv, UDBG5, "%s: Null Frame Received and Freed\n", __FUNCTION__);
2353 unifi_net_data_free(priv, &bulkdata->d[0]);
2354 func_exit();
2355 return;
2356 }
2357
2358
2359
2360
2361
2362
2363
2364 if(!(uf_ap_process_data_pdu(priv, skb, &ehdr, srcStaInfo,
2365 signal,
2366 bulkdata,
2367 macHeaderLengthInBytes)))
2368 {
2369 func_exit();
2370 return;
2371 }
2372 unifi_trace(priv, UDBG5, "unifi_rx: no specific AP handling process as normal frame, MAC Header len %d\n",macHeaderLengthInBytes);
2373
2374 skb_pull(skb, macHeaderLengthInBytes);
2375 pData->os_data_ptr = skb->data;
2376 pData->data_length -= macHeaderLengthInBytes;
2377 pData->os_net_buf_ptr = (unsigned char*)skb;
2378 pData->net_buf_length = skb->len;
2379 }
2380#endif
2381
2382
2383
2384
2385
2386 if (pData->data_length == 0) {
2387 if (((frameControl & 0x00f0) >> 4) != QOS_DATA_NULL &&
2388 ((frameControl & 0x00f0) >> 4) != DATA_NULL) {
2389 unifi_trace(priv, UDBG1, "Zero length frame, but not null-data %04x\n", frameControl);
2390 }
2391 unifi_net_data_free(priv, &bulkdata->d[0]);
2392 func_exit();
2393 return;
2394 }
2395
2396 if (port_action == CSR_WIFI_ROUTER_CTRL_PORT_ACTION_8021X_PORT_CLOSED_DISCARD) {
2397
2398 interfacePriv->stats.rx_dropped++;
2399 unifi_net_data_free(priv, &bulkdata->d[0]);
2400 unifi_notice(priv, "%s: Dropping packet, proto=0x%04x, %s port\n",
2401 __FUNCTION__, proto, queue ? "controlled" : "uncontrolled");
2402 func_exit();
2403 return;
2404 } else if ( (port_action == CSR_WIFI_ROUTER_CTRL_PORT_ACTION_8021X_PORT_CLOSED_BLOCK) ||
2405 (interfacePriv->connected != UnifiConnected) ) {
2406
2407
2408 rx_buffered_packets_t *rx_q_item;
2409 struct list_head *rx_list;
2410
2411 rx_q_item = (rx_buffered_packets_t *)kmalloc(sizeof(rx_buffered_packets_t),
2412 GFP_KERNEL);
2413 if (rx_q_item == NULL) {
2414 unifi_error(priv, "%s: Failed to allocate %d bytes for rx packet record\n",
2415 __FUNCTION__, sizeof(rx_buffered_packets_t));
2416 interfacePriv->stats.rx_dropped++;
2417 unifi_net_data_free(priv, &bulkdata->d[0]);
2418 func_exit();
2419 return;
2420 }
2421
2422 INIT_LIST_HEAD(&rx_q_item->q);
2423 rx_q_item->bulkdata = *bulkdata;
2424 rx_q_item->skb = skb;
2425 rx_q_item->signal = *signal;
2426 memcpy(rx_q_item->sa.a, sa, ETH_ALEN);
2427 memcpy(rx_q_item->da.a, da, ETH_ALEN);
2428 unifi_trace(priv, UDBG2, "%s: Blocked skb=%p, bulkdata=%p\n",
2429 __FUNCTION__, rx_q_item->skb, &rx_q_item->bulkdata);
2430
2431 if (queue == UF_CONTROLLED_PORT_Q) {
2432 rx_list = &interfacePriv->rx_controlled_list;
2433 } else {
2434 rx_list = &interfacePriv->rx_uncontrolled_list;
2435 }
2436
2437
2438 down(&priv->rx_q_sem);
2439 list_add_tail(&rx_q_item->q, rx_list);
2440 up(&priv->rx_q_sem);
2441
2442 func_exit();
2443 return;
2444
2445 }
2446
2447 indicate_rx_skb(priv, interfaceTag, da, sa, skb, signal, bulkdata);
2448
2449 func_exit();
2450
2451}
2452
2453static void process_ma_packet_cfm(unifi_priv_t *priv, CSR_SIGNAL *signal, bulk_data_param_t *bulkdata)
2454{
2455 u16 interfaceTag;
2456 const CSR_MA_PACKET_CONFIRM *pkt_cfm = &signal->u.MaPacketConfirm;
2457 netInterface_priv_t *interfacePriv;
2458
2459 func_enter();
2460 interfaceTag = (pkt_cfm->VirtualInterfaceIdentifier & 0xff);
2461 interfacePriv = priv->interfacePriv[interfaceTag];
2462
2463
2464 if (interfaceTag >= CSR_WIFI_NUM_INTERFACES)
2465 {
2466 unifi_error(priv, "%s: MA-PACKET confirm with bad interfaceTag %d\n", __FUNCTION__, interfaceTag);
2467 func_exit();
2468 return;
2469 }
2470#ifdef CSR_SUPPORT_SME
2471 if(interfacePriv->interfaceMode == CSR_WIFI_ROUTER_CTRL_MODE_AP ||
2472 interfacePriv->interfaceMode == CSR_WIFI_ROUTER_CTRL_MODE_P2PGO) {
2473
2474 uf_process_ma_pkt_cfm_for_ap(priv,interfaceTag,pkt_cfm);
2475 } else if (interfacePriv->m4_sent && (pkt_cfm->HostTag == interfacePriv->m4_hostTag)) {
2476
2477 CsrResult result = pkt_cfm->TransmissionStatus == CSR_TX_SUCCESSFUL?CSR_RESULT_SUCCESS:CSR_RESULT_FAILURE;
2478 CsrWifiMacAddress peerMacAddress;
2479 memcpy(peerMacAddress.a, interfacePriv->m4_signal.u.MaPacketRequest.Ra.x, ETH_ALEN);
2480
2481 unifi_trace(priv, UDBG1, "%s: Sending M4 Transmit CFM\n", __FUNCTION__);
2482 CsrWifiRouterCtrlM4TransmittedIndSend(priv->CSR_WIFI_SME_IFACEQUEUE, 0,
2483 interfaceTag,
2484 peerMacAddress,
2485 result);
2486 interfacePriv->m4_sent = FALSE;
2487 interfacePriv->m4_hostTag = 0xffffffff;
2488 }
2489#endif
2490 func_exit();
2491 return;
2492}
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509static void process_ma_packet_ind(unifi_priv_t *priv, CSR_SIGNAL *signal, bulk_data_param_t *bulkdata)
2510{
2511 u16 interfaceTag;
2512 bulk_data_desc_t *pData;
2513 CSR_MA_PACKET_INDICATION *pkt_ind = (CSR_MA_PACKET_INDICATION*)&signal->u.MaPacketIndication;
2514 struct sk_buff *skb;
2515 u16 frameControl;
2516 netInterface_priv_t *interfacePriv;
2517 u8 da[ETH_ALEN], sa[ETH_ALEN];
2518 u8 *bssid = NULL, *ba_addr = NULL;
2519 u8 toDs, fromDs, frameType;
2520 u8 i =0;
2521
2522#ifdef CSR_SUPPORT_SME
2523 u8 dataFrameType = 0;
2524 u8 powerSaveChanged = FALSE;
2525 u8 pmBit = 0;
2526 CsrWifiRouterCtrlStaInfo_t *srcStaInfo = NULL;
2527 u16 qosControl;
2528
2529#endif
2530
2531 func_enter();
2532
2533 interfaceTag = (pkt_ind->VirtualInterfaceIdentifier & 0xff);
2534 interfacePriv = priv->interfacePriv[interfaceTag];
2535
2536
2537
2538 if (interfaceTag >= CSR_WIFI_NUM_INTERFACES)
2539 {
2540 unifi_error(priv, "%s: MA-PACKET indication with bad interfaceTag %d\n", __FUNCTION__, interfaceTag);
2541 unifi_net_data_free(priv,&bulkdata->d[0]);
2542 func_exit();
2543 return;
2544 }
2545
2546
2547 if (!interfacePriv->netdev_registered)
2548 {
2549 unifi_error(priv, "%s: MA-PACKET indication with unallocated interfaceTag %d\n", __FUNCTION__, interfaceTag);
2550 unifi_net_data_free(priv, &bulkdata->d[0]);
2551 func_exit();
2552 return;
2553 }
2554
2555 if (bulkdata->d[0].data_length == 0) {
2556 unifi_warning(priv, "%s: MA-PACKET indication with zero bulk data\n", __FUNCTION__);
2557 unifi_net_data_free(priv,&bulkdata->d[0]);
2558 func_exit();
2559 return;
2560 }
2561
2562
2563
2564 if(pkt_ind->ReceptionStatus != CSR_RX_SUCCESS)
2565 {
2566 unifi_warning(priv, "%s: MA-PACKET indication with status = %d\n",__FUNCTION__, pkt_ind->ReceptionStatus);
2567 unifi_net_data_free(priv,&bulkdata->d[0]);
2568 func_exit();
2569 return;
2570 }
2571
2572
2573 skb = (struct sk_buff*)bulkdata->d[0].os_net_buf_ptr;
2574 skb->len = bulkdata->d[0].data_length;
2575
2576
2577 toDs = (skb->data[1] & 0x01) ? 1 : 0;
2578 fromDs = (skb->data[1] & 0x02) ? 1 : 0;
2579
2580 memcpy(da,(skb->data+4+toDs*12),ETH_ALEN);
2581 memcpy(sa,(skb->data+10+fromDs*(6+toDs*8)),ETH_ALEN);
2582
2583
2584 if (toDs && fromDs)
2585 {
2586 unifi_trace(priv, UDBG6, "4 address frame - don't try to find BSSID\n");
2587 bssid = NULL;
2588 }
2589 else
2590 {
2591 bssid = (u8 *) (skb->data + 4 + 12 - (fromDs * 6) - (toDs * 12));
2592 }
2593
2594 pData = &bulkdata->d[0];
2595 frameControl = CSR_GET_UINT16_FROM_LITTLE_ENDIAN(pData->os_data_ptr);
2596 frameType = ((frameControl & 0x000C) >> 2);
2597
2598 unifi_trace(priv, UDBG3, "Rx Frame Type: %d sn: %d\n",frameType,
2599 (le16_to_cpu(*((u16*)(bulkdata->d[0].os_data_ptr + IEEE802_11_SEQUENCE_CONTROL_OFFSET))) >> 4) & 0xfff);
2600 if(frameType == IEEE802_11_FRAMETYPE_CONTROL){
2601#ifdef CSR_SUPPORT_SME
2602 unifi_trace(priv, UDBG6, "%s: Received Control Frame\n", __FUNCTION__);
2603
2604 if((frameControl & 0x00f0) == 0x00A0){
2605
2606 u8 pmBit = (frameControl & 0x1000)?0x01:0x00;
2607 unifi_trace(priv, UDBG6, "%s: Received PS-POLL Frame\n", __FUNCTION__);
2608
2609 uf_process_ps_poll(priv,sa,da,pmBit,interfaceTag);
2610 }
2611 else {
2612 unifi_warning(priv, "%s: Non PS-POLL control frame is received\n", __FUNCTION__);
2613 }
2614#endif
2615 unifi_net_data_free(priv,&bulkdata->d[0]);
2616 func_exit();
2617 return;
2618 }
2619 if(frameType != IEEE802_11_FRAMETYPE_DATA) {
2620 unifi_warning(priv, "%s: Non control Non Data frame is received\n",__FUNCTION__);
2621 unifi_net_data_free(priv,&bulkdata->d[0]);
2622 func_exit();
2623 return;
2624 }
2625
2626#ifdef CSR_SUPPORT_SME
2627 if((interfacePriv->interfaceMode == CSR_WIFI_ROUTER_CTRL_MODE_AP) ||
2628 (interfacePriv->interfaceMode == CSR_WIFI_ROUTER_CTRL_MODE_P2PGO)){
2629
2630 srcStaInfo = CsrWifiRouterCtrlGetStationRecordFromPeerMacAddress(priv,sa,interfaceTag);
2631
2632 if(srcStaInfo == NULL) {
2633 CsrWifiMacAddress peerMacAddress;
2634
2635 memcpy(peerMacAddress.a,sa,ETH_ALEN);
2636 unifi_trace(priv, UDBG1, "%s: Unexpected frame from peer = %x:%x:%x:%x:%x:%x\n", __FUNCTION__,
2637 sa[0], sa[1],sa[2], sa[3], sa[4],sa[5]);
2638 CsrWifiRouterCtrlUnexpectedFrameIndSend(priv->CSR_WIFI_SME_IFACEQUEUE,0,interfaceTag,peerMacAddress);
2639 unifi_net_data_free(priv, &bulkdata->d[0]);
2640 func_exit();
2641 return;
2642 }
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652 pmBit = (frameControl & 0x1000)?0x01:0x00;
2653 powerSaveChanged = uf_process_pm_bit_for_peer(priv,srcStaInfo,pmBit,interfaceTag);
2654
2655
2656 srcStaInfo->activity_flag = TRUE;
2657
2658
2659
2660
2661 dataFrameType = ((frameControl & 0x00f0) >> 4);
2662
2663 if((powerSaveChanged == FALSE)&&(srcStaInfo->wmmOrQosEnabled == TRUE)&&
2664 (srcStaInfo->currentPeerState == CSR_WIFI_ROUTER_CTRL_PEER_CONNECTED_POWER_SAVE)){
2665
2666 if((dataFrameType == QOS_DATA) || (dataFrameType == QOS_DATA_NULL)){
2667
2668
2669
2670
2671
2672 if((frameControl & IEEE802_11_FC_TO_DS_MASK) && (frameControl & IEEE802_11_FC_FROM_DS_MASK)){
2673 qosControl= CSR_GET_UINT16_FROM_LITTLE_ENDIAN(pData->os_data_ptr + 30);
2674 }
2675 else{
2676 qosControl = CSR_GET_UINT16_FROM_LITTLE_ENDIAN(pData->os_data_ptr + 24);
2677 }
2678 unifi_trace(priv, UDBG5, "%s: Check if U-APSD operations are triggered for qosControl: 0x%x\n",__FUNCTION__,qosControl);
2679 uf_process_wmm_deliver_ac_uapsd(priv,srcStaInfo,qosControl,interfaceTag);
2680 }
2681 }
2682 }
2683
2684#endif
2685
2686 if( ((frameControl & 0x00f0) >> 4) == QOS_DATA) {
2687 u8 *qos_control_ptr = (u8*)bulkdata->d[0].os_data_ptr + (((frameControl & IEEE802_11_FC_TO_DS_MASK) && (frameControl & IEEE802_11_FC_FROM_DS_MASK))?30: 24);
2688 int tID = *qos_control_ptr & IEEE802_11_QC_TID_MASK;
2689 ba_session_rx_struct *ba_session;
2690 u8 ba_session_idx = 0;
2691
2692 if(interfacePriv->interfaceMode == CSR_WIFI_ROUTER_CTRL_MODE_AP ||
2693 interfacePriv->interfaceMode == CSR_WIFI_ROUTER_CTRL_MODE_P2PGO){
2694 ba_addr = sa;
2695 }else{
2696 ba_addr = bssid;
2697 }
2698
2699 down(&priv->ba_mutex);
2700 for (ba_session_idx=0; ba_session_idx < MAX_SUPPORTED_BA_SESSIONS_RX; ba_session_idx++){
2701 ba_session = interfacePriv->ba_session_rx[ba_session_idx];
2702 if (ba_session){
2703 unifi_trace(priv, UDBG6, "found ba_session=0x%x ba_session_idx=%d", ba_session, ba_session_idx);
2704 if ((!memcmp(ba_session->macAddress.a, ba_addr, ETH_ALEN)) && (ba_session->tID == tID)){
2705 frame_desc_struct frame_desc;
2706 frame_desc.bulkdata = *bulkdata;
2707 frame_desc.signal = *signal;
2708 frame_desc.sn = (le16_to_cpu(*((u16*)(bulkdata->d[0].os_data_ptr + IEEE802_11_SEQUENCE_CONTROL_OFFSET))) >> 4) & 0xfff;
2709 frame_desc.active = TRUE;
2710 unifi_trace(priv, UDBG6, "%s: calling process_ba_frame (session=%d)\n", __FUNCTION__, ba_session_idx);
2711 process_ba_frame(priv, interfacePriv, ba_session, &frame_desc);
2712 up(&priv->ba_mutex);
2713 process_ba_complete(priv, interfacePriv);
2714 break;
2715 }
2716 }
2717 }
2718 if (ba_session_idx == MAX_SUPPORTED_BA_SESSIONS_RX){
2719 up(&priv->ba_mutex);
2720 unifi_trace(priv, UDBG6, "%s: calling process_amsdu()", __FUNCTION__);
2721 process_amsdu(priv, signal, bulkdata);
2722 }
2723 } else {
2724 unifi_trace(priv, UDBG6, "calling unifi_rx()");
2725 unifi_rx(priv, signal, bulkdata);
2726 }
2727
2728
2729
2730
2731
2732
2733
2734
2735 down(&priv->ba_mutex);
2736 for (i=0; i < MAX_SUPPORTED_BA_SESSIONS_RX; i++){
2737 ba_session_rx_struct *ba_session;
2738 ba_session = interfacePriv->ba_session_rx[i];
2739 if (ba_session){
2740 check_ba_frame_age_timeout(priv, interfacePriv, ba_session);
2741 }
2742 }
2743 up(&priv->ba_mutex);
2744 process_ba_complete(priv, interfacePriv);
2745
2746 func_exit();
2747}
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765static void
2766uf_set_multicast_list(struct net_device *dev)
2767{
2768 netInterface_priv_t *interfacePriv = (netInterface_priv_t *)netdev_priv(dev);
2769 unifi_priv_t *priv = interfacePriv->privPtr;
2770
2771#ifdef CSR_NATIVE_LINUX
2772 unifi_trace(priv, UDBG3, "uf_set_multicast_list unsupported\n");
2773 return;
2774#else
2775
2776 u8 *mc_list = interfacePriv->mc_list;
2777 struct netdev_hw_addr *mc_addr;
2778 int mc_addr_count;
2779
2780 if (priv->init_progress != UNIFI_INIT_COMPLETED) {
2781 return;
2782 }
2783
2784 mc_addr_count = netdev_mc_count(dev);
2785
2786 unifi_trace(priv, UDBG3,
2787 "uf_set_multicast_list (count=%d)\n", mc_addr_count);
2788
2789
2790
2791 if (mc_addr_count > UNIFI_MAX_MULTICAST_ADDRESSES) {
2792 return;
2793 }
2794
2795
2796 interfacePriv->mc_list_count = mc_addr_count;
2797 netdev_hw_addr_list_for_each(mc_addr, &dev->mc) {
2798 memcpy(mc_list, mc_addr->addr, ETH_ALEN);
2799 mc_list += ETH_ALEN;
2800 }
2801
2802
2803 queue_work(priv->unifi_workqueue, &priv->multicast_list_task);
2804#endif
2805
2806}
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830static void
2831netdev_mlme_event_handler(ul_client_t *pcli, const u8 *sig_packed, int sig_len,
2832 const bulk_data_param_t *bulkdata_o, int dir)
2833{
2834 CSR_SIGNAL signal;
2835 unifi_priv_t *priv = uf_find_instance(pcli->instance);
2836 int id, r;
2837 bulk_data_param_t bulkdata;
2838
2839 func_enter();
2840
2841
2842 if (sig_packed == NULL) {
2843 return;
2844 }
2845
2846
2847
2848
2849
2850 bulkdata = *bulkdata_o;
2851
2852
2853 r = read_unpack_signal(sig_packed, &signal);
2854 if (r) {
2855
2856
2857
2858
2859 unifi_trace(priv, UDBG1,
2860 "Netdev - Received unknown signal 0x%.4X.\n",
2861 CSR_GET_UINT16_FROM_LITTLE_ENDIAN(sig_packed));
2862 return;
2863 }
2864
2865 id = signal.SignalPrimitiveHeader.SignalId;
2866 unifi_trace(priv, UDBG3, "Netdev - Process signal 0x%.4X\n", id);
2867
2868
2869
2870
2871 switch (id) {
2872 case CSR_MA_PACKET_ERROR_INDICATION_ID:
2873 process_ma_packet_error_ind(priv, &signal, &bulkdata);
2874 break;
2875 case CSR_MA_PACKET_INDICATION_ID:
2876 process_ma_packet_ind(priv, &signal, &bulkdata);
2877 break;
2878 case CSR_MA_PACKET_CONFIRM_ID:
2879 process_ma_packet_cfm(priv, &signal, &bulkdata);
2880 break;
2881#ifdef CSR_SUPPORT_SME
2882 case CSR_MLME_SET_TIM_CONFIRM_ID:
2883
2884
2885
2886 uf_handle_tim_cfm(priv, &signal.u.MlmeSetTimConfirm, signal.SignalPrimitiveHeader.ReceiverProcessId);
2887 break;
2888#endif
2889 case CSR_DEBUG_STRING_INDICATION_ID:
2890 debug_string_indication(priv, bulkdata.d[0].os_data_ptr, bulkdata.d[0].data_length);
2891 break;
2892
2893 case CSR_DEBUG_WORD16_INDICATION_ID:
2894 debug_word16_indication(priv, &signal);
2895 break;
2896
2897 case CSR_DEBUG_GENERIC_CONFIRM_ID:
2898 case CSR_DEBUG_GENERIC_INDICATION_ID:
2899 debug_generic_indication(priv, &signal);
2900 break;
2901 default:
2902 break;
2903 }
2904
2905 func_exit();
2906}
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926void uf_net_get_name(struct net_device *dev, char *name, int len)
2927{
2928 *name = '\0';
2929 if (dev) {
2930 strlcpy(name, dev->name, (len > IFNAMSIZ) ? IFNAMSIZ : len);
2931 }
2932
2933}
2934
2935#ifdef CSR_SUPPORT_WEXT
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955static int
2956uf_netdev_event(struct notifier_block *notif, unsigned long event, void* ptr) {
2957 struct net_device *netdev = ptr;
2958 netInterface_priv_t *interfacePriv = (netInterface_priv_t *)netdev_priv(netdev);
2959 unifi_priv_t *priv = NULL;
2960 static const CsrWifiMacAddress broadcast_address = {{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}};
2961
2962
2963
2964
2965 if (uf_find_netdev_priv(interfacePriv) == -1) {
2966 unifi_trace(NULL, UDBG1, "uf_netdev_event: ignore e=%d, ptr=%p, priv=%p %s\n",
2967 event, ptr, interfacePriv, netdev->name);
2968 return 0;
2969 }
2970
2971 switch(event) {
2972 case NETDEV_CHANGE:
2973 priv = interfacePriv->privPtr;
2974 unifi_trace(priv, UDBG1, "NETDEV_CHANGE: %p %s %s waiting for it\n",
2975 ptr,
2976 netdev->name,
2977 interfacePriv->wait_netdev_change ? "" : "not");
2978
2979 if (interfacePriv->wait_netdev_change) {
2980 netif_tx_wake_all_queues(priv->netdev[interfacePriv->InterfaceTag]);
2981 interfacePriv->connected = UnifiConnected;
2982 interfacePriv->wait_netdev_change = FALSE;
2983
2984 uf_process_rx_pending_queue(priv, UF_UNCONTROLLED_PORT_Q, broadcast_address, 1,interfacePriv->InterfaceTag);
2985 uf_process_rx_pending_queue(priv, UF_CONTROLLED_PORT_Q, broadcast_address, 1,interfacePriv->InterfaceTag);
2986 }
2987 break;
2988
2989 default:
2990 break;
2991 }
2992 return 0;
2993}
2994
2995static struct notifier_block uf_netdev_notifier = {
2996 .notifier_call = uf_netdev_event,
2997};
2998#endif
2999
3000
3001static void
3002 process_amsdu(unifi_priv_t *priv, CSR_SIGNAL *signal, bulk_data_param_t *bulkdata)
3003{
3004 u32 offset;
3005 u32 length = bulkdata->d[0].data_length;
3006 u32 subframe_length, subframe_body_length, dot11_hdr_size;
3007 u8 *ptr;
3008 bulk_data_param_t subframe_bulkdata;
3009 u8 *dot11_hdr_ptr = (u8*)bulkdata->d[0].os_data_ptr;
3010 CsrResult csrResult;
3011 u16 frameControl;
3012 u8 *qos_control_ptr;
3013
3014 frameControl = le16_to_cpu(*((u16*)dot11_hdr_ptr));
3015 qos_control_ptr = dot11_hdr_ptr + (((frameControl & IEEE802_11_FC_TO_DS_MASK) && (frameControl & IEEE802_11_FC_FROM_DS_MASK))?30: 24);
3016 if(!(*qos_control_ptr & IEEE802_11_QC_A_MSDU_PRESENT)) {
3017 unifi_trace(priv, UDBG6, "%s: calling unifi_rx()", __FUNCTION__);
3018 unifi_rx(priv, signal, bulkdata);
3019 return;
3020 }
3021 *qos_control_ptr &= ~(IEEE802_11_QC_A_MSDU_PRESENT);
3022
3023 ptr = qos_control_ptr + 2;
3024 offset = dot11_hdr_size = ptr - dot11_hdr_ptr;
3025
3026 while(length > (offset + sizeof(struct ethhdr) + sizeof(llc_snap_hdr_t))) {
3027 subframe_body_length = ntohs(((struct ethhdr*)ptr)->h_proto);
3028 if(subframe_body_length > IEEE802_11_MAX_DATA_LEN) {
3029 unifi_error(priv, "%s: bad subframe_body_length = %d\n", __FUNCTION__, subframe_body_length);
3030 break;
3031 }
3032 subframe_length = sizeof(struct ethhdr) + subframe_body_length;
3033 memset(&subframe_bulkdata, 0, sizeof(bulk_data_param_t));
3034
3035 csrResult = unifi_net_data_malloc(priv, &subframe_bulkdata.d[0], dot11_hdr_size + subframe_body_length);
3036
3037 if (csrResult != CSR_RESULT_SUCCESS) {
3038 unifi_error(priv, "%s: unifi_net_data_malloc failed\n", __FUNCTION__);
3039 break;
3040 }
3041
3042 memcpy((u8*)subframe_bulkdata.d[0].os_data_ptr, dot11_hdr_ptr, dot11_hdr_size);
3043
3044
3045
3046 if ((frameControl & IEEE802_11_FC_TO_DS_MASK) && !(frameControl & IEEE802_11_FC_FROM_DS_MASK)){
3047 memcpy((u8*)subframe_bulkdata.d[0].os_data_ptr + IEEE802_11_ADDR3_OFFSET, ((struct ethhdr*)ptr)->h_dest, ETH_ALEN);
3048 }
3049 else if (!(frameControl & IEEE802_11_FC_TO_DS_MASK) && (frameControl & IEEE802_11_FC_FROM_DS_MASK)){
3050 memcpy((u8*)subframe_bulkdata.d[0].os_data_ptr + IEEE802_11_ADDR3_OFFSET,
3051 ((struct ethhdr*)ptr)->h_source,
3052 ETH_ALEN);
3053 }
3054
3055 memcpy((u8*)subframe_bulkdata.d[0].os_data_ptr + dot11_hdr_size,
3056 ptr + sizeof(struct ethhdr),
3057 subframe_body_length);
3058 unifi_trace(priv, UDBG6, "%s: calling unifi_rx. length = %d subframe_length = %d\n", __FUNCTION__, length, subframe_length);
3059 unifi_rx(priv, signal, &subframe_bulkdata);
3060
3061 subframe_length = (subframe_length + 3)&(~0x3);
3062 ptr += subframe_length;
3063 offset += subframe_length;
3064 }
3065 unifi_net_data_free(priv, &bulkdata->d[0]);
3066}
3067
3068
3069#define SN_TO_INDEX(__ba_session, __sn) (((__sn - __ba_session->start_sn) & 0xFFF) % __ba_session->wind_size)
3070
3071
3072#define ADVANCE_EXPECTED_SN(__ba_session) \
3073{ \
3074 __ba_session->expected_sn++; \
3075 __ba_session->expected_sn &= 0xFFF; \
3076}
3077
3078#define FREE_BUFFER_SLOT(__ba_session, __index) \
3079{ \
3080 __ba_session->occupied_slots--; \
3081 __ba_session->buffer[__index].active = FALSE; \
3082 ADVANCE_EXPECTED_SN(__ba_session); \
3083}
3084
3085static void add_frame_to_ba_complete(unifi_priv_t *priv,
3086 netInterface_priv_t *interfacePriv,
3087 frame_desc_struct *frame_desc)
3088{
3089 interfacePriv->ba_complete[interfacePriv->ba_complete_index] = *frame_desc;
3090 interfacePriv->ba_complete_index++;
3091}
3092
3093
3094static void update_expected_sn(unifi_priv_t *priv,
3095 netInterface_priv_t *interfacePriv,
3096 ba_session_rx_struct *ba_session,
3097 u16 sn)
3098{
3099 int i, j;
3100 u16 gap;
3101
3102 gap = (sn - ba_session->expected_sn) & 0xFFF;
3103 unifi_trace(priv, UDBG6, "%s: proccess the frames up to new_expected_sn = %d gap = %d\n", __FUNCTION__, sn, gap);
3104 for(j = 0; j < gap && j < ba_session->wind_size; j++) {
3105 i = SN_TO_INDEX(ba_session, ba_session->expected_sn);
3106 unifi_trace(priv, UDBG6, "%s: proccess the slot index = %d\n", __FUNCTION__, i);
3107 if(ba_session->buffer[i].active) {
3108 add_frame_to_ba_complete(priv, interfacePriv, &ba_session->buffer[i]);
3109 unifi_trace(priv, UDBG6, "%s: proccess the frame at index = %d expected_sn = %d\n", __FUNCTION__, i, ba_session->expected_sn);
3110 FREE_BUFFER_SLOT(ba_session, i);
3111 } else {
3112 unifi_trace(priv, UDBG6, "%s: empty slot at index = %d\n", __FUNCTION__, i);
3113 ADVANCE_EXPECTED_SN(ba_session);
3114 }
3115 }
3116 ba_session->expected_sn = sn;
3117}
3118
3119
3120static void complete_ready_sequence(unifi_priv_t *priv,
3121 netInterface_priv_t *interfacePriv,
3122 ba_session_rx_struct *ba_session)
3123{
3124 int i;
3125
3126 i = SN_TO_INDEX(ba_session, ba_session->expected_sn);
3127 while (ba_session->buffer[i].active) {
3128 add_frame_to_ba_complete(priv, interfacePriv, &ba_session->buffer[i]);
3129 unifi_trace(priv, UDBG6, "%s: completed stored frame(expected_sn=%d) at i = %d\n", __FUNCTION__, ba_session->expected_sn, i);
3130 FREE_BUFFER_SLOT(ba_session, i);
3131 i = SN_TO_INDEX(ba_session, ba_session->expected_sn);
3132 }
3133}
3134
3135
3136void scroll_ba_window(unifi_priv_t *priv,
3137 netInterface_priv_t *interfacePriv,
3138 ba_session_rx_struct *ba_session,
3139 u16 sn)
3140{
3141 if(((sn - ba_session->expected_sn) & 0xFFF) <= 2048) {
3142 update_expected_sn(priv, interfacePriv, ba_session, sn);
3143 complete_ready_sequence(priv, interfacePriv, ba_session);
3144 }
3145}
3146
3147
3148static int consume_frame_or_get_buffer_index(unifi_priv_t *priv,
3149 netInterface_priv_t *interfacePriv,
3150 ba_session_rx_struct *ba_session,
3151 u16 sn,
3152 frame_desc_struct *frame_desc) {
3153 int i;
3154 u16 sn_temp;
3155
3156 if(((sn - ba_session->expected_sn) & 0xFFF) <= 2048) {
3157
3158
3159 if(!ba_session->trigger_ba_after_ssn){
3160 ba_session->trigger_ba_after_ssn = TRUE;
3161 }
3162
3163 sn_temp = ba_session->expected_sn + ba_session->wind_size;
3164 unifi_trace(priv, UDBG6, "%s: new frame: sn=%d\n", __FUNCTION__, sn);
3165 if(!(((sn - sn_temp) & 0xFFF) > 2048)) {
3166 u16 new_expected_sn;
3167 unifi_trace(priv, UDBG6, "%s: frame is out of window\n", __FUNCTION__);
3168 sn_temp = (sn - ba_session->wind_size) & 0xFFF;
3169 new_expected_sn = (sn_temp + 1) & 0xFFF;
3170 update_expected_sn(priv, interfacePriv, ba_session, new_expected_sn);
3171 }
3172 i = -1;
3173 if (sn == ba_session->expected_sn) {
3174 unifi_trace(priv, UDBG6, "%s: sn = ba_session->expected_sn = %d\n", __FUNCTION__, sn);
3175 ADVANCE_EXPECTED_SN(ba_session);
3176 add_frame_to_ba_complete(priv, interfacePriv, frame_desc);
3177 } else {
3178 i = SN_TO_INDEX(ba_session, sn);
3179 unifi_trace(priv, UDBG6, "%s: sn(%d) != ba_session->expected_sn(%d), i = %d\n", __FUNCTION__, sn, ba_session->expected_sn, i);
3180 if (ba_session->buffer[i].active) {
3181 unifi_trace(priv, UDBG6, "%s: free frame at i = %d\n", __FUNCTION__, i);
3182 i = -1;
3183 unifi_net_data_free(priv, &frame_desc->bulkdata.d[0]);
3184 }
3185 }
3186 } else {
3187 i = -1;
3188 if(!ba_session->trigger_ba_after_ssn){
3189 unifi_trace(priv, UDBG6, "%s: frame before ssn, pass it up: sn=%d\n", __FUNCTION__, sn);
3190 add_frame_to_ba_complete(priv, interfacePriv, frame_desc);
3191 }else{
3192 unifi_trace(priv, UDBG6, "%s: old frame, drop: sn=%d, expected_sn=%d\n", __FUNCTION__, sn, ba_session->expected_sn);
3193 unifi_net_data_free(priv, &frame_desc->bulkdata.d[0]);
3194 }
3195 }
3196 return i;
3197}
3198
3199
3200
3201static void process_ba_frame(unifi_priv_t *priv,
3202 netInterface_priv_t *interfacePriv,
3203 ba_session_rx_struct *ba_session,
3204 frame_desc_struct *frame_desc)
3205{
3206 int i;
3207 u16 sn = frame_desc->sn;
3208
3209 if (ba_session->timeout) {
3210 mod_timer(&ba_session->timer, (jiffies + usecs_to_jiffies((ba_session->timeout) * 1024)));
3211 }
3212 unifi_trace(priv, UDBG6, "%s: got frame(sn=%d)\n", __FUNCTION__, sn);
3213
3214 i = consume_frame_or_get_buffer_index(priv, interfacePriv, ba_session, sn, frame_desc);
3215 if(i >= 0) {
3216 unifi_trace(priv, UDBG6, "%s: store frame(sn=%d) at i = %d\n", __FUNCTION__, sn, i);
3217 ba_session->buffer[i] = *frame_desc;
3218 ba_session->buffer[i].recv_time = CsrTimeGet(NULL);
3219 ba_session->occupied_slots++;
3220 } else {
3221 unifi_trace(priv, UDBG6, "%s: frame consumed - sn = %d\n", __FUNCTION__, sn);
3222 }
3223 complete_ready_sequence(priv, interfacePriv, ba_session);
3224}
3225
3226
3227static void process_ba_complete(unifi_priv_t *priv, netInterface_priv_t *interfacePriv)
3228{
3229 frame_desc_struct *frame_desc;
3230 u8 i;
3231
3232 for(i = 0; i < interfacePriv->ba_complete_index; i++) {
3233 frame_desc = &interfacePriv->ba_complete[i];
3234 unifi_trace(priv, UDBG6, "%s: calling process_amsdu()\n", __FUNCTION__);
3235 process_amsdu(priv, &frame_desc->signal, &frame_desc->bulkdata);
3236 }
3237 interfacePriv->ba_complete_index = 0;
3238
3239}
3240
3241
3242
3243
3244
3245
3246static void check_ba_frame_age_timeout( unifi_priv_t *priv,
3247 netInterface_priv_t *interfacePriv,
3248 ba_session_rx_struct *ba_session)
3249{
3250 CsrTime now;
3251 CsrTime age;
3252 u8 i, j;
3253 u16 sn_temp;
3254
3255
3256
3257
3258 u8 gap=1;
3259
3260 now = CsrTimeGet(NULL);
3261
3262 if (ba_session->occupied_slots)
3263 {
3264
3265
3266
3267
3268
3269 sn_temp = (ba_session->expected_sn + 1) & 0xFFF;
3270
3271 for(j = 0; j < ba_session->wind_size; j++)
3272 {
3273 i = SN_TO_INDEX(ba_session, sn_temp);
3274
3275 if(ba_session->buffer[i].active)
3276 {
3277 unifi_trace(priv, UDBG6, "check age at slot index = %d sn = %d recv_time = %u now = %u\n",
3278 i,
3279 ba_session->buffer[i].sn,
3280 ba_session->buffer[i].recv_time,
3281 now);
3282
3283 if (ba_session->buffer[i].recv_time > now)
3284 {
3285
3286 age = CsrTimeAdd((CsrTime)CsrTimeSub(CSR_SCHED_TIME_MAX, ba_session->buffer[i].recv_time), now);
3287 }
3288 else
3289 {
3290 age = (CsrTime)CsrTimeSub(now, ba_session->buffer[i].recv_time);
3291 }
3292
3293 if (age >= CSR_WIFI_BA_MPDU_FRAME_AGE_TIMEOUT)
3294 {
3295 unifi_trace(priv, UDBG2, "release the frame at index = %d gap = %d expected_sn = %d sn = %d\n",
3296 i,
3297 gap,
3298 ba_session->expected_sn,
3299 ba_session->buffer[i].sn);
3300
3301
3302 while (gap--)
3303 {
3304 ADVANCE_EXPECTED_SN(ba_session);
3305 }
3306 add_frame_to_ba_complete(priv, interfacePriv, &ba_session->buffer[i]);
3307 FREE_BUFFER_SLOT(ba_session, i);
3308 complete_ready_sequence(priv, interfacePriv, ba_session);
3309 }
3310 break;
3311
3312 }
3313 else
3314 {
3315
3316 sn_temp = (sn_temp + 1) & 0xFFF;
3317 gap++;
3318 }
3319 }
3320 }
3321}
3322
3323
3324static void process_ma_packet_error_ind(unifi_priv_t *priv, CSR_SIGNAL *signal, bulk_data_param_t *bulkdata)
3325{
3326 u16 interfaceTag;
3327 const CSR_MA_PACKET_ERROR_INDICATION *pkt_err_ind = &signal->u.MaPacketErrorIndication;
3328 netInterface_priv_t *interfacePriv;
3329 ba_session_rx_struct *ba_session;
3330 u8 ba_session_idx = 0;
3331 CSR_PRIORITY UserPriority;
3332 CSR_SEQUENCE_NUMBER sn;
3333
3334 func_enter();
3335
3336 interfaceTag = (pkt_err_ind->VirtualInterfaceIdentifier & 0xff);
3337
3338
3339
3340 if (interfaceTag >= CSR_WIFI_NUM_INTERFACES)
3341 {
3342 unifi_error(priv, "%s: MaPacketErrorIndication indication with bad interfaceTag %d\n", __FUNCTION__, interfaceTag);
3343 func_exit();
3344 return;
3345 }
3346
3347 interfacePriv = priv->interfacePriv[interfaceTag];
3348 UserPriority = pkt_err_ind->UserPriority;
3349 if(UserPriority > 15) {
3350 unifi_error(priv, "%s: MaPacketErrorIndication indication with bad UserPriority=%d\n", __FUNCTION__, UserPriority);
3351 func_exit();
3352 }
3353 sn = pkt_err_ind->SequenceNumber;
3354
3355 down(&priv->ba_mutex);
3356
3357 for (ba_session_idx=0; ba_session_idx < MAX_SUPPORTED_BA_SESSIONS_RX; ba_session_idx++){
3358 ba_session = interfacePriv->ba_session_rx[ba_session_idx];
3359 if (ba_session){
3360 if ((!memcmp(ba_session->macAddress.a, pkt_err_ind->PeerQstaAddress.x, ETH_ALEN)) && (ba_session->tID == UserPriority)){
3361 if (ba_session->timeout) {
3362 mod_timer(&ba_session->timer, (jiffies + usecs_to_jiffies((ba_session->timeout) * 1024)));
3363 }
3364 scroll_ba_window(priv, interfacePriv, ba_session, sn);
3365 break;
3366 }
3367 }
3368 }
3369
3370 up(&priv->ba_mutex);
3371 process_ba_complete(priv, interfacePriv);
3372 func_exit();
3373}
3374
3375
3376