Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
netdev.c
Go to the documentation of this file.
1 /*
2  * ---------------------------------------------------------------------------
3  * FILE: netdev.c
4  *
5  * PURPOSE:
6  * This file provides the upper edge interface to the linux netdevice
7  * and wireless extensions.
8  * It is part of the porting exercise.
9  *
10  * Copyright (C) 2005-2010 by Cambridge Silicon Radio Ltd.
11  *
12  * Refer to LICENSE.txt included with this source code for details on
13  * the license terms.
14  *
15  * ---------------------------------------------------------------------------
16  */
17 
18 /*
19  * Porting Notes:
20  * This file implements the data plane of the UniFi linux driver.
21  *
22  * All the Tx packets are passed to the HIP core lib, using the
23  * unifi_send_signal() API. For EAPOL packets use the MLME-EAPOL.req
24  * signal, for all other use the MLME-UNITDATA.req. The unifi_send_signal()
25  * expects the wire-formatted (packed) signal. For convenience, in the OS
26  * layer we only use the native (unpacked) signal structures. The HIP core lib
27  * provides the write_pack() helper function to convert to the packed signal.
28  * The packet is stored in the bulk data of the signal. We do not need to
29  * allocate new memory to store the packet, because unifi_net_data_malloc()
30  * is implemented to return a skb, which is the format of packet in Linux.
31  * The HIP core lib frees the bulk data buffers, so we do not need to do
32  * this in the OS layer.
33  *
34  * All the Rx packets are MLME-UNITDATA.ind signals, passed by the HIP core lib
35  * in unifi_receive_event(). We do not need to allocate an skb and copy the
36  * received packet because the HIP core lib has stored in memory allocated by
37  * unifi_net_data_malloc(). Also, we can perform the 802.11 to Ethernet
38  * translation in-place because we allocate the extra memory allocated in
39  * unifi_net_data_malloc().
40  *
41  * If possible, the porting exercise should appropriately implement
42  * unifi_net_data_malloc() and unifi_net_data_free() to save copies between
43  * network and driver buffers.
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"
54 #include "unifi_priv.h"
55 #include <net/pkt_sched.h>
56 
57 
58 /* Wext handler is suported only if CSR_SUPPORT_WEXT is defined */
59 #ifdef CSR_SUPPORT_WEXT
61 #endif /* CSR_SUPPORT_WEXT */
62 static void check_ba_frame_age_timeout( unifi_priv_t *priv,
63  netInterface_priv_t *interfacePriv,
64  ba_session_rx_struct *ba_session);
65 static 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);
69 static void process_ba_complete(unifi_priv_t *priv, netInterface_priv_t *interfacePriv);
70 static void process_ma_packet_error_ind(unifi_priv_t *priv, CSR_SIGNAL *signal, bulk_data_param_t *bulkdata);
71 static void process_amsdu(unifi_priv_t *priv, CSR_SIGNAL *signal, bulk_data_param_t *bulkdata);
72 static int uf_net_open(struct net_device *dev);
73 static int uf_net_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
74 static int uf_net_stop(struct net_device *dev);
75 static struct net_device_stats *uf_net_get_stats(struct net_device *dev);
76 static u16 uf_net_select_queue(struct net_device *dev, struct sk_buff *skb);
77 static netdev_tx_t uf_net_xmit(struct sk_buff *skb, struct net_device *dev);
78 static void uf_set_multicast_list(struct net_device *dev);
79 
80 
81 typedef 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  * Queueing Discipline Interface
86  * Only used if kernel is configured with CONFIG_NET_SCHED
87  */
88 
89 /*
90  * The driver uses the qdisc interface to buffer and control all
91  * outgoing traffic. We create a root qdisc, register our qdisc operations
92  * and later we create two subsiduary pfifo queues for the uncontrolled
93  * and controlled ports.
94  *
95  * The network stack delivers all outgoing packets in our enqueue handler.
96  * There, we classify the packet and decide whether to store it or drop it
97  * (if the controlled port state is set to "discard").
98  * If the packet is enqueued, the network stack call our dequeue handler.
99  * There, we decide whether we can send the packet, delay it or drop it
100  * (the controlled port configuration might have changed meanwhile).
101  * If a packet is dequeued, then the network stack calls our hard_start_xmit
102  * handler where finally we send the packet.
103  *
104  * If the hard_start_xmit handler fails to send the packet, we return
105  * NETDEV_TX_BUSY and the network stack call our requeue handler where
106  * we put the packet back in the same queue in came from.
107  *
108  */
109 
110 struct uf_sched_data
111 {
112  /* Traffic Classifier TBD */
113  struct tcf_proto *filter_list;
114  /* Our two queues */
115  struct Qdisc *queues[UNIFI_TRAFFIC_Q_MAX];
116 };
117 
118 struct uf_tx_packet_data {
119  /* Queue the packet is stored in */
121  /* QoS Priority determined when enqueing packet */
123  /* Debug */
124  unsigned long host_tag;
125 };
126 
127 #endif /* CONFIG_NET_SCHED */
128 
129 static 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, /* called by /proc/net/dev */
136  .ndo_set_rx_mode = uf_set_multicast_list,
137  .ndo_select_queue = uf_net_select_queue,
138 };
139 
140 static u8 oui_rfc1042[P80211_OUI_LEN] = { 0x00, 0x00, 0x00 };
141 static u8 oui_8021h[P80211_OUI_LEN] = { 0x00, 0x00, 0xf8 };
142 
143 
144 /* Callback for event logging to blocking clients */
145 static 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 /* Declare netdev_notifier block which will contain the state change
152  * handler callback function
153  */
154 static struct notifier_block uf_netdev_notifier;
155 #endif
156 
157 /*
158  * ---------------------------------------------------------------------------
159  * uf_alloc_netdevice
160  *
161  * Allocate memory for the net_device and device private structs
162  * for this interface.
163  * Fill in the fields, but don't register the interface yet.
164  * We need to configure the UniFi first.
165  *
166  * Arguments:
167  * sdio_dev Pointer to SDIO context handle to use for all
168  * SDIO ops.
169  * bus_id A small number indicating the SDIO card position on the
170  * bus. Typically this is the slot number, e.g. 0, 1 etc.
171  * Valid values are 0 to MAX_UNIFI_DEVS-1.
172  *
173  * Returns:
174  * Pointer to device private struct.
175  *
176  * Notes:
177  * The net_device and device private structs are allocated together
178  * and should be freed by freeing the net_device pointer.
179  * ---------------------------------------------------------------------------
180  */
181 unifi_priv_t *
182 uf_alloc_netdevice(CsrSdioFunction *sdio_dev, int bus_id)
183 {
184  struct net_device *dev;
186  netInterface_priv_t *interfacePriv;
187 #ifdef CSR_SUPPORT_WEXT
188  int rc;
189 #endif
190  unsigned char i; /* loop index */
191 
192  /*
193  * Allocate netdevice struct, assign name template and
194  * setup as an ethernet device.
195  * The net_device and private structs are zeroed. Ether_setup() then
196  * sets up ethernet handlers and values.
197  * The RedHat 9 redhat-config-network tool doesn't recognise wlan* devices,
198  * so use "eth*" (like other wireless extns drivers).
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  /* Set up back pointer from priv to netdev */
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  /* Initialize all supported netdev interface to be NULL */
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  /* Setup / override net_device fields */
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 /* IW_HANDLER_VERSION */
229 #endif /* CSR_SUPPORT_WEXT */
230 
231  /* This gives us enough headroom to add the 802.11 header */
232  dev->needed_headroom = 32;
233 
234  /* Use bus_id as instance number */
235  priv->instance = bus_id;
236  /* Store SDIO pointer to pass in the core */
237  priv->sdio = sdio_dev;
238 
239  sdio_dev->driverData = (void*)priv;
240  /* Consider UniFi to be uninitialised */
242 
243  priv->prev_queue = 0;
244 
245  /*
246  * Initialise the clients structure array.
247  * We do not need protection around ul_init_clients() because
248  * the character device can not be used until uf_alloc_netdevice()
249  * returns and Unifi_instances[bus_id]=priv is set, since unifi_open()
250  * will return -ENODEV.
251  */
252  ul_init_clients(priv);
253 
254  /*
255  * Register a new ul client to send the multicast list signals.
256  * Note: priv->instance must be set before calling this.
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  /* Enable all queues by default */
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  * Initialise the OS private struct.
292  */
293  /*
294  * Instead of deciding in advance to use 11bg or 11a, we could do a more
295  * clever scan on both radios.
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  /* Initialise bh thread structure */
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  /* reset the connected state for the interface */
312  interfacePriv->connected = UnifiConnectedUnknown; /* -1 unknown, 0 no, 1 yes */
313 
314 #ifdef USE_DRIVER_LOCK
315  sema_init(&priv->lock, 1);
316 #endif /* USE_DRIVER_LOCK */
317 
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  /* Create the Traffic Analysis workqueue */
333  priv->unifi_workqueue = create_singlethread_workqueue("unifi_workq");
334  if (priv->unifi_workqueue == NULL) {
335  /* Deregister priv->netdev_client */
337  free_netdev(priv->netdev[0]);
338  return NULL;
339  }
340 
341 #ifdef CSR_SUPPORT_SME
342  /* Create the Multicast Addresses list work structure */
343  INIT_WORK(&priv->multicast_list_task, uf_multicast_list_wq);
344 
345  /* Create m4 buffering work structure */
347 
348 #if (defined(CSR_WIFI_SECURITY_WAPI_ENABLE) && defined(CSR_WIFI_SECURITY_WAPI_SW_ENCRYPTION))
349  /* Create work structure to buffer the WAPI data packets to be sent to SME for encryption */
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  /* Register callback for netdevice state changes */
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 /* CSR_SUPPORT_WEXT */
375 
376 #ifdef CSR_WIFI_SPLIT_PATCH
377  /* set it to some invalid value */
378  priv->pending_mode_set.common.destination = 0xaaaa;
379 #endif
380 
381  return priv;
382 } /* uf_alloc_netdevice() */
383 
384 /*
385  *---------------------------------------------------------------------------
386  * uf_alloc_netdevice_for_other_interfaces
387  *
388  * Allocate memory for the net_device and device private structs
389  * for this interface.
390  * Fill in the fields, but don't register the interface yet.
391  * We need to configure the UniFi first.
392  *
393  * Arguments:
394  * interfaceTag Interface number.
395  * sdio_dev Pointer to SDIO context handle to use for all
396  * SDIO ops.
397  * bus_id A small number indicating the SDIO card position on the
398  * bus. Typically this is the slot number, e.g. 0, 1 etc.
399  * Valid values are 0 to MAX_UNIFI_DEVS-1.
400  *
401  * Returns:
402  * Pointer to device private struct.
403  *
404  * Notes:
405  * The device private structure contains the interfaceTag and pointer to the unifi_priv
406  * structure created allocated by net_device od interface0.
407  * The net_device and device private structs are allocated together
408  * and should be freed by freeing the net_device pointer.
409  * ---------------------------------------------------------------------------
410  */
411 u8
413 {
414  struct net_device *dev;
415  netInterface_priv_t *interfacePriv;
416 
417  /*
418  * Allocate netdevice struct, assign name template and
419  * setup as an ethernet device.
420  * The net_device and private structs are zeroed. Ether_setup() then
421  * sets up ethernet handlers and values.
422  * The RedHat 9 redhat-config-network tool doesn't recognise wlan* devices,
423  * so use "eth*" (like other wireless extns drivers).
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  /* Set up back pointer from priv to netdev */
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  /* reset the connected state for the interface */
443  interfacePriv->connected = UnifiConnectedUnknown; /* -1 unknown, 0 no, 1 yes */
444  INIT_LIST_HEAD(&interfacePriv->rx_uncontrolled_list);
445  INIT_LIST_HEAD(&interfacePriv->rx_controlled_list);
446 
447  /* Setup / override net_device fields */
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 /* IW_HANDLER_VERSION */
455 #endif /* CSR_SUPPORT_WEXT */
456  return TRUE;
457 } /* uf_alloc_netdevice() */
458 
459 
460 
461 /*
462  * ---------------------------------------------------------------------------
463  * uf_free_netdevice
464  *
465  * Unregister the network device and free the memory allocated for it.
466  * NB This includes the memory for the priv struct.
467  *
468  * Arguments:
469  * priv Device private pointer.
470  *
471  * Returns:
472  * None.
473  * ---------------------------------------------------------------------------
474  */
475 int
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  * Free any buffers used for holding firmware
491  */
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 /* CSR_SUPPORT_SME && CSR_SUPPORT_WEXT*/
508 
509  /* Free any bulkdata buffers allocated for M4 caching */
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  /* Free any bulkdata buffers allocated for M4 caching */
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  /* Unregister callback for netdevice state changes */
535  unregister_netdevice_notifier(&uf_netdev_notifier);
536 #endif /* CSR_SUPPORT_WEXT */
537 
538 #ifdef CSR_SUPPORT_SME
539  /* Cancel work items and destroy the workqueue */
540  cancel_work_sync(&priv->multicast_list_task);
541 #endif
542 /* Destroy the workqueues. */
545 
546  /* Free up netdev in reverse order: priv is allocated with netdev[0].
547  * So, netdev[0] should be freed after all other netdevs are freed up
548  */
549  for (i=CSR_WIFI_NUM_INTERFACES-1; i>=0; i--) {
550  /*Free the netdev struct and priv, which are all one lump*/
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 } /* uf_free_netdevice() */
560 
561 
562 /*
563  * ---------------------------------------------------------------------------
564  * uf_net_open
565  *
566  * Called when userland does "ifconfig wlan0 up".
567  *
568  * Arguments:
569  * dev Device pointer.
570  *
571  * Returns:
572  * None.
573  * ---------------------------------------------------------------------------
574  */
575 static int
576 uf_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  /* If we haven't finished UniFi initialisation, we can't start */
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  * To sniff, the user must do "iwconfig mode monitor", which sets
592  * priv->wext_conf.mode to IW_MODE_MONITOR.
593  * Then he/she must do "ifconfig ethn up", which calls this fn.
594  * There is no point in starting the sniff with SNIFFJOIN until
595  * this point.
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 } /* uf_net_open() */
621 
622 
623 static int
624 uf_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  /* Stop sniffing if in Monitor mode */
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 } /* uf_net_stop() */
651 
652 
653 /* This is called after the WE handlers */
654 static int
655 uf_net_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
656 {
657  int rc;
658 
659  rc = -EOPNOTSUPP;
660 
661  return rc;
662 } /* uf_net_ioctl() */
663 
664 
665 
666 static struct net_device_stats *
667 uf_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 } /* uf_net_get_stats() */
673 
674 static CSR_PRIORITY uf_get_packet_priority(unifi_priv_t *priv, netInterface_priv_t *interfacePriv, struct sk_buff *skb, const int proto)
675 {
677 
678  func_enter();
679  priority = (CSR_PRIORITY) (skb->priority >> 5);
680 
681  if (priority == CSR_QOS_UP0) { /* 0 */
682 
683  unifi_trace(priv, UDBG5, "uf_get_packet_priority: proto = 0x%.4X\n", proto);
684 
685  switch (proto) {
686  case 0x0800: /* IPv4 */
687  case 0x814C: /* SNMP */
688  case 0x880C: /* GSMP */
689  priority = (CSR_PRIORITY) (skb->data[1 + ETH_HLEN] >> 5);
690  break;
691 
692  case 0x8100: /* VLAN */
693  priority = (CSR_PRIORITY) (skb->data[0 + ETH_HLEN] >> 5);
694  break;
695 
696  case 0x86DD: /* IPv6 */
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  /* Check if we are allowed to transmit on this AC. Because of ACM we may have to downgrade to a lower
707  * priority */
708  if (interfacePriv->interfaceMode == CSR_WIFI_ROUTER_CTRL_MODE_STA ||
711 
712  /* Keep trying lower priorities until we find a queue
713  * Priority to queue mapping is 1,2 - BK, 0,3 - BE, 4,5 - VI, 6,7 - VO */
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  * get_packet_priority
733  *
734  * Arguments:
735  * priv private data area of functional driver
736  * skb socket buffer
737  * ehdr ethernet header to fetch protocol
738  * interfacePriv For accessing station record database
739  *
740  *
741  * Returns:
742  * CSR_PRIORITY.
743  * ---------------------------------------------------------------------------
744  */
746 get_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  /* Priority Mapping for all the Modes */
756  switch(interfaceMode)
757  {
760  unifi_trace(priv, UDBG4, "mode is STA \n");
762  priority = uf_get_packet_priority(priv, interfacePriv, skb, proto);
763  } else {
764  priority = CSR_CONTENTION;
765  }
766  break;
767 #ifdef CSR_SUPPORT_SME
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  /* If packet is not Broadcast/multicast */
777  priority = uf_get_packet_priority(priv, interfacePriv, skb, proto);
778  } else {
779  /* Since packet destination is not QSTA, set priority to CSR_CONTENTION */
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  * uf_net_select_queue
798  *
799  * Called by the kernel to select which queue to put the packet in
800  *
801  * Arguments:
802  * dev Device pointer
803  * skb Packet
804  *
805  * Returns:
806  * Queue index
807  * ---------------------------------------------------------------------------
808  */
809 static u16
810 uf_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;
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  /* 802.1x - apply controlled/uncontrolled port rules */
825  if ((proto != ETH_P_PAE)
826 #ifdef CSR_WIFI_SECURITY_WAPI_ENABLE
827  && (proto != ETH_P_WAI)
828 #endif
829  ) {
830  /* queues 0 - 3 */
831  priority = get_packet_priority(priv, skb, &ehdr, interfacePriv);
833  } else {
834  /* queue 4 */
836  }
837 
838 
839  func_exit();
840  return (u16)queue;
841 } /* uf_net_select_queue() */
842 
843 int
844 skb_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  /* get the headroom available in skb */
852  headroom = skb_headroom(skb);
853  /* step 1: classify ether frame, DIX or 802.3? */
854 
855  if (proto < 0x600) {
856  /* codes <= 1500 reserved for 802.3 lengths */
857  /* it's 802.3, pass ether payload unchanged, */
858  unifi_trace(priv, UDBG3, "802.3 len: %d\n", skb->len);
859 
860  /* leave off any PAD octets. */
861  skb_trim(skb, proto);
862  } else if (proto == ETH_P_8021Q) {
863 
864  /* Store the VLAN SNAP (should be 87-65). */
865  u16 vlan_snap = *(u16*)skb->data;
866  /* check for headroom availability before skb_push 14 = (4 + 10) */
867  if (headroom < 14) {
868  unifi_trace(priv, UDBG3, "cant append vlan snap: debug\n");
869  return -1;
870  }
871  /* Add AA-AA-03-00-00-00 */
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  /* Add AA-AA-03-00-00-00 */
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  /* Add the VLAN specific information */
884  snap->protocol = htons(proto);
885  *(u16*)(snap + 1) = vlan_snap;
886 
887  } else
888  {
889  /* it's DIXII, time for some conversion */
890  unifi_trace(priv, UDBG3, "DIXII len: %d\n", skb->len);
891 
892  /* check for headroom availability before skb_push */
893  if (headroom < sizeof(llc_snap_hdr_t)) {
894  unifi_trace(priv, UDBG3, "cant append snap: debug\n");
895  return -1;
896  }
897  /* tack on SNAP */
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  /* Use the appropriate OUI. */
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 } /* skb_add_llc_snap() */
912 
913 #ifdef CSR_SUPPORT_SME
914 static 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 {
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  /* Send to client */
934  if (priv->sme_cli) {
935  /*
936  * Pass the packet to the SME, using unifi_sys_ma_unitdata_ind().
937  * The frame needs to be converted according to the encapsulation.
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  /* The translation is performed on skb... */
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  /* ... but we indicate buffer and length */
960  bulkdata->d[0].os_data_ptr = skb->data;
961  bulkdata->d[0].data_length = skb->len;
962  } else {
963  /* Add the MAC addresses before the SNAP */
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 /* CSR_SUPPORT_SME */
996 
997 /*
998  * ---------------------------------------------------------------------------
999  * skb_80211_to_ether
1000  *
1001  * Make sure the received frame is in Ethernet (802.3) form.
1002  * De-encapsulates SNAP if necessary, adds a ethernet header.
1003  * The source buffer should not contain an 802.11 MAC header
1004  *
1005  * Arguments:
1006  * payload Pointer to packet data received from UniFi.
1007  * payload_length Number of bytes of data received from UniFi.
1008  * daddr Destination MAC address.
1009  * saddr Source MAC address.
1010  *
1011  * Returns:
1012  * 0 on success, -1 if the packet is bad and should be dropped,
1013  * 1 if the packet was forwarded to the SME or AMP client.
1014  * ---------------------------------------------------------------------------
1015  */
1016 int
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  /* get the skb headroom size */
1045  headroom = skb_headroom(skb);
1046 
1047  /*
1048  * Test for the various encodings
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  /* AppleTalk AARP (2) or IPX SNAP */
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  /* check for headroom availability before skb_push */
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  /* Add 802.3 header and leave full payload */
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  /* VLAN-tagged IP */
1083  if ((snap->oui[2] == 0) && (ntohs(snap->protocol) == ETH_P_8021Q))
1084  {
1085  /*
1086  * The translation doesn't change the packet length, so is done in-place.
1087  *
1088  * Example header (from Std 802.11-2007 Annex M):
1089  * AA-AA-03-00-00-00-81-00-87-65-AA-AA-03-00-00-00-08-06
1090  * -------SNAP-------p1-p1-ll-ll-------SNAP--------p2-p2
1091  * dd-dd-dd-dd-dd-dd-aa-aa-aa-aa-aa-aa-p1-p1-ll-ll-p2-p2
1092  * dd-dd-dd-dd-dd-dd-aa-aa-aa-aa-aa-aa-81-00-87-65-08-06
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  /* Create the 802.3 header */
1110 
1111  vlan_snap = *((u16*)(payload + 8));
1112 
1113  /* Create LLC header without byte-swapping */
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  /* it's a SNAP + RFC1042 frame */
1123  unifi_trace(priv, UDBG3, "SNAP+RFC1042 len: %d\n", payload_length);
1124 
1125  /* chop SNAP+llc header from skb. */
1126  skb_pull(skb, sizeof(llc_snap_hdr_t));
1127 
1128  /* Since skb_pull called above to chop snap+llc, no need to check for headroom
1129  * availability before skb_push
1130  */
1131  /* create 802.3 header at beginning of skb. */
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  /* Copy protocol field without byte-swapping */
1136  eth->h_proto = snap->protocol;
1137  } else {
1138  u16 len;
1139 
1140  /* check for headroom availability before skb_push */
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  /* Add 802.3 header and leave full payload */
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 } /* skb_80211_to_ether() */
1156 
1157 
1158 static 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 {
1166  }
1167 #else
1168  return CSR_WIFI_ROUTER_CTRL_PORT_ACTION_8021X_PORT_OPEN; /* default to open for softmac dev */
1169 #endif
1170 #else
1171  return uf_sme_port_state(priv, address, queue, interfaceTag);
1172 #endif
1173 }
1174 
1175 /*
1176  * ---------------------------------------------------------------------------
1177  * prepare_and_add_macheader
1178  *
1179  *
1180  * These functions adds mac header for packet from netdev
1181  * to UniFi for transmission.
1182  * EAP protocol packets are also appended with Mac header &
1183  * sent using send_ma_pkt_request().
1184  *
1185  * Arguments:
1186  * priv Pointer to device private context struct
1187  * skb Socket buffer containing data packet to transmit
1188  * newSkb Socket buffer containing data packet + Mac header if no sufficient headroom in skb
1189  * serviceClass to append QOS control header in Mac header
1190  * bulkdata if newSkb allocated then bulkdata updated to send to unifi
1191  * interfaceTag the interfaceID on which activity going on
1192  * daddr destination address
1193  * saddr source address
1194  * protection protection bit set in framce control of mac header
1195  *
1196  * Returns:
1197  * Zero on success or error code.
1198  * ---------------------------------------------------------------------------
1199  */
1200 
1201 int 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  /* add a MAC header refer: 7.1.3.1 Frame Control field in P802.11REVmb.book */
1226  if (priority != CSR_CONTENTION) {
1227  /* EAPOL packets don't go as QOS_DATA */
1228  if (priority == CSR_MANAGEMENT) {
1230  } else {
1231  /* Qos Control Field */
1232  macHeaderLengthInBytes += QOS_CONTROL_HEADER_SIZE;
1233 
1234  if (skb->len) {
1235 
1237  } else {
1239  bQosNull = true;
1240  }
1241  }
1242  } else {
1243  if(skb->len == 0) {
1245  } else {
1247  }
1248  }
1249 
1250  switch (interfacePriv->interfaceMode)
1251  {
1254  direction = 2;
1256  break;
1258  direction = 0;
1259  break;
1262  direction = 1;
1264  break;
1266  if (priority == CSR_MANAGEMENT ) {
1267 
1268  direction = 2;
1270  } else {
1271  /* Data frames have to use WDS 4 address frames */
1272  direction = 3;
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  /* If Sta is QOS & HTC is supported then need to set 'order' bit */
1284  /* We don't support HT Control for now */
1285 
1286  if(protection) {
1288  }
1289 
1290  /* check the skb headroom before pushing mac header */
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  /* The old skb will not be used again */
1317  kfree_skb(skb);
1318  } else {
1319 
1320  /* headroom has sufficient size, so will get proper pointer */
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  /* Frame the actual MAC header */
1328 
1329  memset(bufPtr, 0, macHeaderLengthInBytes);
1330 
1331  /* copy frameControl field */
1332  memcpy(bufPtr, &fc, sizeof(fc));
1333  bufPtr += sizeof(fc);
1334  macHeaderLengthInBytes -= sizeof(fc);
1335 
1336  /* Duration/ID field which is 2 bytes */
1337  bufPtr += 2;
1338  macHeaderLengthInBytes -= 2;
1339 
1340  switch(direction)
1341  {
1342  case 0:
1343  /* Its an Ad-Hoc no need to route it through AP */
1344  /* Address1: MAC address of the destination from eth header */
1345  memcpy(bufPtr, daddr, ETH_ALEN);
1346  bufPtr += ETH_ALEN;
1347  macHeaderLengthInBytes -= ETH_ALEN;
1348 
1349  /* Address2: MAC address of the source */
1350  memcpy(bufPtr, saddr, ETH_ALEN);
1351  bufPtr += ETH_ALEN;
1352  macHeaderLengthInBytes -= ETH_ALEN;
1353 
1354  /* Address3: the BSSID (locally generated in AdHoc (creators Bssid)) */
1355  memcpy(bufPtr, &interfacePriv->bssid, ETH_ALEN);
1356  bufPtr += ETH_ALEN;
1357  macHeaderLengthInBytes -= ETH_ALEN;
1358  break;
1359  case 1:
1360  /* Address1: MAC address of the actual destination */
1361  memcpy(bufPtr, daddr, ETH_ALEN);
1362  bufPtr += ETH_ALEN;
1363  macHeaderLengthInBytes -= ETH_ALEN;
1364  /* Address2: The MAC address of the AP */
1365  memcpy(bufPtr, &interfacePriv->bssid, ETH_ALEN);
1366  bufPtr += ETH_ALEN;
1367  macHeaderLengthInBytes -= ETH_ALEN;
1368 
1369  /* Address3: MAC address of the source from eth header */
1370  memcpy(bufPtr, saddr, ETH_ALEN);
1371  bufPtr += ETH_ALEN;
1372  macHeaderLengthInBytes -= ETH_ALEN;
1373  break;
1374  case 2:
1375  /* Address1: To AP is the MAC address of the AP to which its associated */
1376  memcpy(bufPtr, &interfacePriv->bssid, ETH_ALEN);
1377  bufPtr += ETH_ALEN;
1378  macHeaderLengthInBytes -= ETH_ALEN;
1379 
1380  /* Address2: MAC address of the source from eth header */
1381  memcpy(bufPtr, saddr, ETH_ALEN);
1382  bufPtr += ETH_ALEN;
1383  macHeaderLengthInBytes -= ETH_ALEN;
1384 
1385  /* Address3: MAC address of the actual destination on the distribution system */
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  /* Address2: MAC address of the source from eth header */
1396  memcpy(bufPtr, saddr, ETH_ALEN);
1397  bufPtr += ETH_ALEN;
1398  macHeaderLengthInBytes -= ETH_ALEN;
1399 
1400  /* Address3: MAC address of the actual destination on the distribution system */
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  /* 2 bytes of frame control field, appended by firmware */
1410  bufPtr += 2;
1411  macHeaderLengthInBytes -= 2;
1412 
1413  if (3 == direction) {
1414  /* Address4: MAC address of the source */
1415  memcpy(bufPtr, saddr, ETH_ALEN);
1416  bufPtr += ETH_ALEN;
1417  macHeaderLengthInBytes -= ETH_ALEN;
1418  }
1419 
1420  /* IF Qos Data or Qos Null Data then set QosControl field */
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  /*assigning address1
1430  * Address1 offset taken fromm bufPtr(currently bufPtr pointing to Qos contorl) variable in reverse direction
1431  * Address4 don't exit
1432  */
1433 
1434  addressOne = bufPtr- ADDRESS_ONE_OFFSET;
1435 
1436  if (addressOne[0] & 0x1) {
1437  /* multicast/broadcast frames, no acknowledgement needed */
1438  qc |= 1 << 5;
1439  }
1440  /* non-AP mode only for now */
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  /* In case of STA and IBSS case eosp and txop limit is 0. */
1445  } else {
1446  if(bQosNull) {
1447  qc |= 1 << 4;
1448  }
1449  }
1450 
1451  /* append Qos control field to mac header */
1452  bufPtr[0] = qc;
1453  /* txop limit is 0 */
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  * send_ma_pkt_request
1467  *
1468  * These functions send a data packet to UniFi for transmission.
1469  * EAP protocol packets are also sent as send_ma_pkt_request().
1470  *
1471  * Arguments:
1472  * priv Pointer to device private context struct
1473  * skb Socket buffer containing data packet to transmit
1474  * ehdr Pointer to Ethernet header within skb.
1475  *
1476  * Returns:
1477  * Zero on success or error code.
1478  * ---------------------------------------------------------------------------
1479  */
1480 
1481 static int
1482 send_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  /* Get the interface Tag by means of source Mac address */
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  /* No match found - error */
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  /* Add a SNAP header if necessary */
1519  if (skb_add_llc_snap(priv->netdev[interfaceTag], skb, proto) != 0) {
1520  /* convert failed */
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  /* Notify the TA module for the Tx frame for non AP/P2PGO mode*/
1535  if ((interfacePriv->interfaceMode != CSR_WIFI_ROUTER_CTRL_MODE_AP) &&
1536  (interfacePriv->interfaceMode != CSR_WIFI_ROUTER_CTRL_MODE_P2PGO)) {
1538  &bulkdata.d[0], ehdr->h_source,
1539  priv->netdev[interfaceTag]->dev_addr,
1540  jiffies_to_msecs(jiffies),
1541  0); /* rate is unknown on tx */
1542  }
1543 #endif /* CSR_SUPPORT_SME */
1544 
1545  if ((proto == ETH_P_PAE)
1546 #ifdef CSR_WIFI_SECURITY_WAPI_ENABLE
1547  || (proto == ETH_P_WAI)
1548 #endif
1549  )
1550  {
1551  /* check for m4 detection */
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; /*WAI packets always sent unencrypted*/
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  /* append Mac header for Eapol as well as data packet */
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  /* RA adrress must contain the immediate destination MAC address that is similiar to
1586  * the Address 1 field of 802.11 Mac header here 4 is: (sizeof(framecontrol) + sizeof (durationID))
1587  * which is address 1 field
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;
1604 
1605  /* initialize signal to zero */
1606  memset(&signal, 0, sizeof(CSR_SIGNAL));
1607 
1608  /* Frame MA_PACKET request */
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  /* Fill the MA-PACKET.req */
1620 
1621  req->Priority = priority;
1622  unifi_trace(priv, UDBG3, "Tx Frame with Priority: %x\n", req->Priority);
1623 
1624  /* rate selected by firmware */
1625  req->TransmitRate = 0;
1627  /* RA address matching with address 1 of Mac header */
1628  memcpy(req->Ra.x, ((u8 *) bulkdata.d[0].os_data_ptr) + 4, ETH_ALEN);
1629 
1630  spin_lock(&priv->m4_lock);
1631  /* Store the M4-PACKET.req for later */
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  /* Signal the workqueue to call CsrWifiRouterCtrlM4ReadyToSendIndSend().
1640  * It cannot be called directly from the tx path because it
1641  * does a non-atomic kmalloc via the framework's CsrPmemAlloc().
1642  */
1643  queue_work(priv->unifi_workqueue, &netpriv->send_m4_ready_task);
1644 
1645  return 0;
1646  }
1647 #endif
1648  }/*EAPOL or WAI packet*/
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  /* initialize signal to zero */
1664  memset(&signal, 0, sizeof(CSR_SIGNAL));
1665  /* Frame MA_PACKET request */
1669 
1670  /* Fill the MA-PACKET.req */
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; /* rate selected by firmware */
1675  req->HostTag = 0xffffffff; /* Ask for a new HostTag */
1676  /* RA address matching with address 1 of Mac header */
1677  memcpy(req->Ra.x, ((u8 *) bulkdata.d[0].os_data_ptr) + 4, ETH_ALEN);
1678 
1679  /* Store the M4-PACKET.req for later */
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  /* Signal the workqueue to call CsrWifiRouterCtrlWapiUnicastTxEncryptIndSend().
1689  * It cannot be called directly from the tx path because it
1690  * does a non-atomic kmalloc via the framework's CsrPmemAlloc().
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",
1703  TransmitRate
1704  );
1705  }
1706 
1707  /* Send UniFi msg */
1708  /* Here hostTag is been sent as 0xffffffff, its been appended properly while framing MA-Packet request in pdu_processing.c file */
1709  r = uf_process_ma_packet_req(priv,
1710  peerAddress.a,
1711  0xffffffff, /* Ask for a new HostTag */
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 } /* send_ma_pkt_request() */
1729 
1730 /*
1731  * ---------------------------------------------------------------------------
1732  * uf_net_xmit
1733  *
1734  * This function is called by the higher level stack to transmit an
1735  * ethernet packet.
1736  *
1737  * Arguments:
1738  * skb Ethernet packet to send.
1739  * dev Pointer to the linux net device.
1740  *
1741  * Returns:
1742  * 0 on success (packet was consumed, not necessarily transmitted)
1743  * 1 if packet was requeued
1744  * -1 on error
1745  *
1746  *
1747  * Notes:
1748  * The controlled port is handled in the qdisc dequeue handler.
1749  * ---------------------------------------------------------------------------
1750  */
1751 static netdev_tx_t
1752 uf_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;
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  /* All frames are sent as MA-PACKET.req (EAPOL also) */
1772  tx_handler = send_ma_pkt_request;
1773 
1774  /* 802.1x - apply controlled/uncontrolled port rules */
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  /* queue 4 */
1783  port = UF_UNCONTROLLED_PORT_Q;
1784  }
1785 
1786  /* Uncontrolled port rules apply */
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 
1793  unifi_trace(priv, UDBG5,
1794  "uf_net_xmit: %s controlled port open\n",
1795  port ? "" : "un");
1796  /* Remove the ethernet header */
1797  skb_pull(skb, ETH_HLEN);
1798  result = tx_handler(priv, skb, &ehdr, priority);
1799  } else {
1800 
1801  /* Discard the packet if necessary */
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  /* Don't update the tx stats when the pkt is to be sent for sw encryption*/
1815  if (!((CSR_WIFI_ROUTER_CTRL_MODE_STA == interfacePriv->interfaceMode) &&
1816  (priv->wapi_unicast_filter == 1)))
1817  {
1818  dev->trans_start = jiffies;
1819  /* Should really count tx stats in the UNITDATA.status signal but
1820  * that doesn't have the length.
1821  */
1822  interfacePriv->stats.tx_packets++;
1823  /* count only the packet payload */
1824  interfacePriv->stats.tx_bytes += skb->len;
1825 
1826  }
1827 #else
1828  dev->trans_start = jiffies;
1829 
1830  /*
1831  * Should really count tx stats in the UNITDATA.status signal but
1832  * that doesn't have the length.
1833  */
1834  interfacePriv->stats.tx_packets++;
1835  /* count only the packet payload */
1836  interfacePriv->stats.tx_bytes += skb->len;
1837 #endif
1838  } else if (result < 0) {
1839 
1840  /* Failed to send: fh queue was full, and the skb was discarded.
1841  * Return OK to indicate that the buffer was consumed, to stop the
1842  * kernel re-transmitting the freed buffer.
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  /* The skb will have been freed by send_XXX_request() */
1850 
1851  func_exit();
1852  return result;
1853 } /* uf_net_xmit() */
1854 
1855 /*
1856  * ---------------------------------------------------------------------------
1857  * unifi_pause_xmit
1858  * unifi_restart_xmit
1859  *
1860  * These functions are called from the UniFi core to control the flow
1861  * of packets from the upper layers.
1862  * unifi_pause_xmit() is called when the internal queue is full and
1863  * should take action to stop unifi_ma_unitdata() being called.
1864  * When the queue has drained, unifi_restart_xmit() will be called to
1865  * re-enable the flow of packets for transmission.
1866  *
1867  * Arguments:
1868  * ospriv OS private context pointer.
1869  *
1870  * Returns:
1871  * unifi_pause_xmit() is called from interrupt context.
1872  * ---------------------------------------------------------------------------
1873  */
1874 void
1876 {
1877  unifi_priv_t *priv = ospriv;
1878  int i; /* used as a loop counter */
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 } /* unifi_pause_xmit() */
1903 
1904 void
1906 {
1907  unifi_priv_t *priv = ospriv;
1908  int i=0; /* used as a loop counter */
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 } /* unifi_restart_xmit() */
1932 
1933 
1934 static void
1935 indicate_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  * Decapsulate any SNAP header and
1955  * prepend an ethernet header so that the skb manipulation and ARP
1956  * stuff works.
1957  */
1958  r = skb_80211_to_ether(priv, skb, dst_a, src_a,
1959  signal, bulkdata);
1960  if (r == -1) {
1961  /* Drop the packet and return */
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  /* Handle the case where packet is sent up through the subscription
1971  * API but should not be given to the network stack (AMP PAL case)
1972  * LLC header is different from WiFi and the packet has been subscribed for
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  /* Now we look like a regular ethernet frame */
1984  /* Fill in SKB meta data */
1985  skb->dev = dev;
1986  skb->protocol = eth_type_trans(skb, dev);
1988 
1989  /* Test for an overlength frame */
1990  if (skb->len > (dev->mtu + ETH_HLEN)) {
1991  /* A bogus length ethfrm has been encap'd. */
1992  /* Is someone trying an oflow attack? */
1993  unifi_error(priv, "%s: oversize frame (%d > %d)\n",
1994  dev->name,
1995  skb->len, dev->mtu + ETH_HLEN);
1996 
1997  /* Drop the packet and return */
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  /* Pass SKB up the stack */
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  /* Bump rx stats */
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 
2032 void
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  /* Validate against the source address */
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  /* It is our resposibility to free the Rx structure object. */
2087  kfree(rx_q_item);
2088  }
2089  up(&priv->rx_q_sem);
2090 }
2091 
2092 /*
2093  * ---------------------------------------------------------------------------
2094  * uf_resume_data_plane
2095  *
2096  * Is called when the (un)controlled port is set to open,
2097  * to notify the network stack to schedule for transmission
2098  * any packets queued in the qdisk while port was closed and
2099  * indicated to the stack any packets buffered in the Rx queues.
2100  *
2101  * Arguments:
2102  * priv Pointer to device private struct
2103  *
2104  * Returns:
2105  * ---------------------------------------------------------------------------
2106  */
2107 void
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  * If we are waiting for the net device to enter the up state, don't
2125  * process the rx queue yet as it will be done by the callback when
2126  * the device is ready.
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 } /* uf_resume_data_plane() */
2140 
2141 
2142 void 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 } /* uf_free_pending_rx_packets() */
2147 
2148 
2149 /*
2150  * ---------------------------------------------------------------------------
2151  * unifi_rx
2152  *
2153  * Reformat a UniFi data received packet into a p80211 packet and
2154  * pass it up the protocol stack.
2155  *
2156  * Arguments:
2157  * None.
2158  *
2159  * Returns:
2160  * None.
2161  * ---------------------------------------------------------------------------
2162  */
2163 static void
2164 unifi_rx(unifi_priv_t *priv, CSR_SIGNAL *signal, bulk_data_param_t *bulkdata)
2165 {
2166  u16 interfaceTag;
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  /* Sanity check that the VIF refers to a sensible interface */
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  /* Sanity check that the VIF refers to an allocated netdev */
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  /* Point to the addresses */
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);/* Address1 or 3 */
2220  memcpy(sa,(skb->data+10+fromDs*(6+toDs*8)),ETH_ALEN); /* Address2, 3 or 4 */
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  /* If both are set then the Address4 exists (only for AP) */
2236  if (fromDs && toDs)
2237  {
2238  /* 6 is the size of Address4 field */
2239  macHeaderLengthInBytes += (QOS_CONTROL_HEADER_SIZE + 6);
2240  }
2241  else
2242  {
2243  macHeaderLengthInBytes += QOS_CONTROL_HEADER_SIZE;
2244  }
2245 
2246  /* If order bit set then HT control field is the part of MAC header */
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  /* Prepare the ethernet header from snap header of skb data */
2256  switch(dataFrameType)
2257  {
2258  case DATA_NULL:
2259  case QOS_DATA_NULL:
2260  /* This is for only queue info fetching, EAPOL wont come as
2261  * null data so the proto is initialized as zero
2262  */
2263  proto = 0x0;
2264  break;
2265  default:
2266  {
2267  llc_snap_hdr_t *snap;
2268  /* Fetch a snap header to find protocol (for IPV4/IPV6 packets
2269  * the snap header fetching offset is same)
2270  */
2271  snap = (llc_snap_hdr_t *) (skb->data + macHeaderLengthInBytes);
2272 
2273  /* prepare the ethernet header from the snap header & addresses */
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  /* Notify the TA module for the Rx frame for non P2PGO and AP cases*/
2297  if((interfacePriv->interfaceMode != CSR_WIFI_ROUTER_CTRL_MODE_AP) &&
2298  (interfacePriv->interfaceMode != CSR_WIFI_ROUTER_CTRL_MODE_P2PGO))
2299  {
2300  /* Remove MAC header of length(macHeaderLengthInBytes) before sampling */
2301  skb_pull(skb, macHeaderLengthInBytes);
2302  pData->os_data_ptr = skb->data;
2303  pData->data_length -= macHeaderLengthInBytes;
2304 
2305  if (pData->data_length) {
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  /* AP/P2PGO specific handling here */
2315  CsrWifiRouterCtrlStaInfo_t * srcStaInfo =
2316  CsrWifiRouterCtrlGetStationRecordFromPeerMacAddress(priv,sa,interfaceTag);
2317 
2318  /* Defensive check only; Source address is already checked in
2319  process_ma_packet_ind and we should have a valid source address here */
2320 
2321  if(srcStaInfo == NULL) {
2322  CsrWifiMacAddress peerMacAddress;
2323  /* Unknown data PDU */
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  /* For AP GO mode, don't store the PDUs */
2335  /* Drop the packet and return */
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  /* Qos NULL/Data NULL are freed here and not processed further */
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  /* Now we have done with MAC header so proceed with the real data part*/
2359  /* This function takes care of appropriate routing for AP/P2PGO case*/
2360  /* the function hadnles following things
2361  2. Routing the PDU to appropriate location
2362  3. Error case handling
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  /* Remove the MAC header for subsequent conversion */
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 /* CSR_SUPPORT_SME */
2381 
2382 
2383  /* Now that the MAC header is removed, null-data frames have zero length
2384  * and can be dropped
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 
2397  /* Drop the packet and return */
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  /* Buffer the packet into the Rx queues */
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",
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  /* Add to tail of packets queue */
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 } /* unifi_rx() */
2452 
2453 static 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  /* Sanity check that the VIF refers to a sensible interface */
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  /* Check if this is a confirm for EAPOL M4 frame and we need to send transmistted ind*/
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  * unifi_rx
2498  *
2499  * Reformat a UniFi data received packet into a p80211 packet and
2500  * pass it up the protocol stack.
2501  *
2502  * Arguments:
2503  * None.
2504  *
2505  * Returns:
2506  * None.
2507  * ---------------------------------------------------------------------------
2508  */
2509 static void process_ma_packet_ind(unifi_priv_t *priv, CSR_SIGNAL *signal, bulk_data_param_t *bulkdata)
2510 {
2511  u16 interfaceTag;
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  /* Sanity check that the VIF refers to a sensible interface */
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  /* Sanity check that the VIF refers to an allocated netdev */
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  /* For monitor mode we need to pass this indication to the registered application
2562  handle this seperately*/
2563  /* MIC failure is already taken care of so no need to send the PDUs which are not successfully received in non-monitor mode*/
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  /* Point to the addresses */
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);/* Address1 or 3 */
2581  memcpy(sa,(skb->data+10+fromDs*(6+toDs*8)),ETH_ALEN); /* Address2, 3 or 4 */
2582 
2583  /* Find the BSSID, which will be used to match the BA session */
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  /* This is a PS-POLL request */
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  /* Unknown data PDU */
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  verify power management bit here so as to ensure host and unifi are always
2646  in sync with power management status of peer.
2647 
2648  If we do it later, it may so happen we have stored the frame in BA re-ordering
2649  buffer and hence host and unifi are out of sync for power management status
2650  */
2651 
2652  pmBit = (frameControl & 0x1000)?0x01:0x00;
2653  powerSaveChanged = uf_process_pm_bit_for_peer(priv,srcStaInfo,pmBit,interfaceTag);
2654 
2655  /* Update station last activity time */
2656  srcStaInfo->activity_flag = TRUE;
2657 
2658  /* For Qos Frame if PM bit is toggled to indicate the change in power save state then it shall not be
2659  considered as Trigger Frame. Enter only if WMM STA and peer is in Power save */
2660 
2661  dataFrameType = ((frameControl & 0x00f0) >> 4);
2662 
2663  if((powerSaveChanged == FALSE)&&(srcStaInfo->wmmOrQosEnabled == TRUE)&&
2665 
2666  if((dataFrameType == QOS_DATA) || (dataFrameType == QOS_DATA_NULL)){
2667 
2668  /*
2669  * QoS control field is offset from frame control by 2 (frame control)
2670  * + 2 (duration/ID) + 2 (sequence control) + 3*ETH_ALEN or 4*ETH_ALEN
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; /* using ls octet of qos control */
2689  ba_session_rx_struct *ba_session;
2690  u8 ba_session_idx = 0;
2691  /* Get the BA originator address */
2692  if(interfacePriv->interfaceMode == CSR_WIFI_ROUTER_CTRL_MODE_AP ||
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  /* check if the frames in reorder buffer has aged, the check
2729  * is done after receive processing so that if the missing frame
2730  * has arrived in this receive process, then it is handled cleanly.
2731  *
2732  * And also this code here takes care that timeout check is made for all
2733  * the receive indications
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  * uf_set_multicast_list
2751  *
2752  * This function is called by the higher level stack to set
2753  * a list of multicast rx addresses.
2754  *
2755  * Arguments:
2756  * dev Network Device pointer.
2757  *
2758  * Returns:
2759  * None.
2760  *
2761  * Notes:
2762  * ---------------------------------------------------------------------------
2763  */
2764 
2765 static void
2766 uf_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  /* Not enough space? */
2791  if (mc_addr_count > UNIFI_MAX_MULTICAST_ADDRESSES) {
2792  return;
2793  }
2794 
2795  /* Store the list to be processed by the work item. */
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  /* Send a message to the workqueue */
2803  queue_work(priv->unifi_workqueue, &priv->multicast_list_task);
2804 #endif
2805 
2806 } /* uf_set_multicast_list() */
2807 
2808 /*
2809  * ---------------------------------------------------------------------------
2810  * netdev_mlme_event_handler
2811  *
2812  * Callback function to be used as the udi_event_callback when registering
2813  * as a netdev client.
2814  * To use it, a client specifies this function as the udi_event_callback
2815  * to ul_register_client(). The signal dispatcher in
2816  * unifi_receive_event() will call this function to deliver a signal.
2817  *
2818  * Arguments:
2819  * pcli Pointer to the client instance.
2820  * signal Pointer to the received signal.
2821  * signal_len Size of the signal structure in bytes.
2822  * bulkdata Pointer to structure containing any associated bulk data.
2823  * dir Direction of the signal. Zero means from host,
2824  * non-zero means to host.
2825  *
2826  * Returns:
2827  * None.
2828  * ---------------------------------------------------------------------------
2829  */
2830 static void
2831 netdev_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  /* Just a sanity check */
2842  if (sig_packed == NULL) {
2843  return;
2844  }
2845 
2846  /*
2847  * This copy is to silence a compiler warning about discarding the
2848  * const qualifier.
2849  */
2850  bulkdata = *bulkdata_o;
2851 
2852  /* Get the unpacked signal */
2853  r = read_unpack_signal(sig_packed, &signal);
2854  if (r) {
2855  /*
2856  * The CSR_MLME_CONNECTED_INDICATION_ID has a receiverID=0 so will
2857  * fall through this case. It is safe to ignore this signal.
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  * Take the appropriate action for the signal.
2870  */
2871  switch (id) {
2873  process_ma_packet_error_ind(priv, &signal, &bulkdata);
2874  break;
2876  process_ma_packet_ind(priv, &signal, &bulkdata);
2877  break;
2879  process_ma_packet_cfm(priv, &signal, &bulkdata);
2880  break;
2881 #ifdef CSR_SUPPORT_SME
2883  /* Handle TIM confirms from FW & set the station record's TIM state appropriately,
2884  * In case of failures, tries with max_retransmit limit
2885  */
2887  break;
2888 #endif
2890  debug_string_indication(priv, bulkdata.d[0].os_data_ptr, bulkdata.d[0].data_length);
2891  break;
2892 
2894  debug_word16_indication(priv, &signal);
2895  break;
2896 
2899  debug_generic_indication(priv, &signal);
2900  break;
2901  default:
2902  break;
2903  }
2904 
2905  func_exit();
2906 } /* netdev_mlme_event_handler() */
2907 
2908 
2909 /*
2910  * ---------------------------------------------------------------------------
2911  * uf_net_get_name
2912  *
2913  * Retrieve the name (e.g. eth1) associated with this network device
2914  *
2915  * Arguments:
2916  * dev Pointer to the network device.
2917  * name Buffer to write name
2918  * len Size of buffer in bytes
2919  *
2920  * Returns:
2921  * None
2922  *
2923  * Notes:
2924  * ---------------------------------------------------------------------------
2925  */
2926 void 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 } /* uf_net_get_name */
2934 
2935 #ifdef CSR_SUPPORT_WEXT
2936 
2937 /*
2938  * ---------------------------------------------------------------------------
2939  * uf_netdev_event
2940  *
2941  * Callback function to handle netdev state changes
2942  *
2943  * Arguments:
2944  * notif Pointer to a notifier_block.
2945  * event Event prompting notification
2946  * ptr net_device pointer
2947  *
2948  * Returns:
2949  * None
2950  *
2951  * Notes:
2952  * The event handler is global, and may occur on non-UniFi netdevs.
2953  * ---------------------------------------------------------------------------
2954  */
2955 static int
2956 uf_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  /* Check that the event is for a UniFi netdev. If it's not, the netdev_priv
2963  * structure is not safe to use.
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  /* Note: passing the broadcast address here will allow anyone to attempt to join our adhoc network */
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 
2995 static struct notifier_block uf_netdev_notifier = {
2996  .notifier_call = uf_netdev_event,
2997 };
2998 #endif /* CSR_SUPPORT_WEXT */
2999 
3000 
3001 static 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  /* When to DS=0 and from DS=0, address 3 will already have BSSID so no need to re-program */
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 
3085 static 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 
3094 static 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 
3120 static 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 
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 
3148 static 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  /* once we are in BA window, set the flag for BA trigger */
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 
3201 static 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 
3227 static 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 /* Check if the frames in BA reoder buffer has aged and
3243  * if so release the frames to upper processes and move
3244  * the window
3245  */
3246 static 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  /* gap is started at 1 because we have buffered frames and
3256  * hence a minimum gap of 1 exists
3257  */
3258  u8 gap=1;
3259 
3260  now = CsrTimeGet(NULL);
3261 
3262  if (ba_session->occupied_slots)
3263  {
3264  /* expected sequence has not arrived so start searching from next
3265  * sequence number until a frame is available and determine the gap.
3266  * Check if the frame available has timedout, if so advance the
3267  * expected sequence number and release the frames
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  /* timer wrap */
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 
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  /* if it has timedout don't wait for missing frames, move the window */
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  /* advance temp sequence number and frame gap */
3316  sn_temp = (sn_temp + 1) & 0xFFF;
3317  gap++;
3318  }
3319  }
3320  }
3321 }
3322 
3323 
3324 static 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;
3333 
3334  func_enter();
3335 
3336  interfaceTag = (pkt_err_ind->VirtualInterfaceIdentifier & 0xff);
3337 
3338 
3339  /* Sanity check that the VIF refers to a sensible interface */
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  /* To find the right ba_session loop through the BA sessions, compare MAC address and tID */
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