staging: csr: Remove unneeded UF_NETIF_TX_* macros
[linux-2.6.git] / drivers / staging / csr / netdev.c
blob9a52ab408e1ae2768bbba8e456ec740787767b60
1 /*
2 * ---------------------------------------------------------------------------
3 * FILE: netdev.c
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.
10 * Copyright (C) 2005-2010 by Cambridge Silicon Radio Ltd.
12 * Refer to LICENSE.txt included with this source code for details on
13 * the license terms.
15 * ---------------------------------------------------------------------------
19 * Porting Notes:
20 * This file implements the data plane of the UniFi linux driver.
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.
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().
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.
46 #include <linux/types.h>
47 #include <linux/etherdevice.h>
48 #include <linux/mutex.h>
49 #include <linux/semaphore.h>
50 #include <linux/version.h>
51 #include <linux/vmalloc.h>
52 #include "csr_wifi_hip_unifi.h"
53 #include "csr_wifi_hip_conversions.h"
54 #include "unifi_priv.h"
55 #include <net/pkt_sched.h>
58 /* Wext handler is suported only if CSR_SUPPORT_WEXT is defined */
59 #ifdef CSR_SUPPORT_WEXT
60 extern struct iw_handler_def unifi_iw_handler_def;
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);
81 typedef int (*tx_signal_handler)(unifi_priv_t *priv, struct sk_buff *skb, const struct ethhdr *ehdr, CSR_PRIORITY priority);
83 #ifdef CONFIG_NET_SCHED
85 * Queueing Discipline Interface
86 * Only used if kernel is configured with CONFIG_NET_SCHED
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.
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.
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.
110 struct uf_sched_data
112 /* Traffic Classifier TBD */
113 struct tcf_proto *filter_list;
114 /* Our two queues */
115 struct Qdisc *queues[UNIFI_TRAFFIC_Q_MAX];
118 struct uf_tx_packet_data {
119 /* Queue the packet is stored in */
120 unifi_TrafficQueue queue;
121 /* QoS Priority determined when enqueing packet */
122 CSR_PRIORITY priority;
123 /* Debug */
124 unsigned long host_tag;
127 #endif /* CONFIG_NET_SCHED */
129 static const struct net_device_ops uf_netdev_ops =
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,
140 static u8 oui_rfc1042[P80211_OUI_LEN] = { 0x00, 0x00, 0x00 };
141 static u8 oui_8021h[P80211_OUI_LEN] = { 0x00, 0x00, 0xf8 };
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);
150 #ifdef CSR_SUPPORT_WEXT
151 /* Declare netdev_notifier block which will contain the state change
152 * handler callback function
154 static struct notifier_block uf_netdev_notifier;
155 #endif
158 * ---------------------------------------------------------------------------
159 * uf_alloc_netdevice
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.
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.
173 * Returns:
174 * Pointer to device private struct.
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 * ---------------------------------------------------------------------------
181 unifi_priv_t *
182 uf_alloc_netdevice(CsrSdioFunction *sdio_dev, int bus_id)
184 struct net_device *dev;
185 unifi_priv_t *priv;
186 netInterface_priv_t *interfacePriv;
187 #ifdef CSR_SUPPORT_WEXT
188 int rc;
189 #endif
190 unsigned char i; /* loop index */
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).
200 dev = alloc_etherdev_mq(sizeof(unifi_priv_t) + sizeof(netInterface_priv_t), UNIFI_TRAFFIC_Q_MAX);
202 if (dev == NULL) {
203 return NULL;
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;
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;
218 priv->netdev[0] = dev;
219 priv->interfacePriv[0] = interfacePriv;
221 /* Setup / override net_device fields */
222 dev->netdev_ops = &uf_netdev_ops;
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 */
231 /* This gives us enough headroom to add the 802.11 header */
232 dev->needed_headroom = 32;
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;
239 sdio_dev->driverData = (void*)priv;
240 /* Consider UniFi to be uninitialised */
241 priv->init_progress = UNIFI_INIT_NONE;
243 priv->prev_queue = 0;
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.
252 ul_init_clients(priv);
255 * Register a new ul client to send the multicast list signals.
256 * Note: priv->instance must be set before calling this.
258 priv->netdev_client = ul_register_client(priv,
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;
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);
270 priv->sta_wmm_capabilities = 0;
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
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;
287 #ifdef CSR_SUPPORT_SME
288 priv->allPeerDozing = 0;
289 #endif
291 * Initialise the OS private struct.
294 * Instead of deciding in advance to use 11bg or 11a, we could do a more
295 * clever scan on both radios.
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;
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");
311 /* reset the connected state for the interface */
312 interfacePriv->connected = UnifiConnectedUnknown; /* -1 unknown, 0 no, 1 yes */
314 #ifdef USE_DRIVER_LOCK
315 sema_init(&priv->lock, 1);
316 #endif /* USE_DRIVER_LOCK */
318 spin_lock_init(&priv->send_signal_lock);
320 spin_lock_init(&priv->m4_lock);
321 sema_init(&priv->ba_mutex, 1);
323 #if (defined(CSR_WIFI_SECURITY_WAPI_ENABLE) && defined(CSR_WIFI_SECURITY_WAPI_SW_ENCRYPTION))
324 spin_lock_init(&priv->wapi_lock);
325 #endif
327 #ifdef CSR_SUPPORT_SME
328 spin_lock_init(&priv->staRecord_lock);
329 spin_lock_init(&priv->tx_q_lock);
330 #endif
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 */
336 ul_deregister_client(priv->netdev_client);
337 free_netdev(priv->netdev[0]);
338 return NULL;
341 #ifdef CSR_SUPPORT_SME
342 /* Create the Multicast Addresses list work structure */
343 INIT_WORK(&priv->multicast_list_task, uf_multicast_list_wq);
345 /* Create m4 buffering work structure */
346 INIT_WORK(&interfacePriv->send_m4_ready_task, uf_send_m4_ready_wq);
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
354 priv->ref_count = 1;
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);
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;
371 else {
372 unifi_warning(priv, "Failed to register netdevice notifier : %d %p\n", rc, dev);
374 #endif /* CSR_SUPPORT_WEXT */
376 #ifdef CSR_WIFI_SPLIT_PATCH
377 /* set it to some invalid value */
378 priv->pending_mode_set.common.destination = 0xaaaa;
379 #endif
381 return priv;
382 } /* uf_alloc_netdevice() */
385 *---------------------------------------------------------------------------
386 * uf_alloc_netdevice_for_other_interfaces
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.
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.
401 * Returns:
402 * Pointer to device private struct.
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 * ---------------------------------------------------------------------------
412 uf_alloc_netdevice_for_other_interfaces(unifi_priv_t *priv, u16 interfaceTag)
414 struct net_device *dev;
415 netInterface_priv_t *interfacePriv;
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).
425 dev = alloc_etherdev_mq(sizeof(netInterface_priv_t), 1);
426 if (dev == NULL) {
427 return FALSE;
430 if (interfaceTag >= CSR_WIFI_NUM_INTERFACES) {
431 unifi_error(priv, "uf_alloc_netdevice_for_other_interfaces bad interfaceTag\n");
432 return FALSE;
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;
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);
447 /* Setup / override net_device fields */
448 dev->netdev_ops = &uf_netdev_ops;
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() */
462 * ---------------------------------------------------------------------------
463 * uf_free_netdevice
465 * Unregister the network device and free the memory allocated for it.
466 * NB This includes the memory for the priv struct.
468 * Arguments:
469 * priv Device private pointer.
471 * Returns:
472 * None.
473 * ---------------------------------------------------------------------------
476 uf_free_netdevice(unifi_priv_t *priv)
478 int i;
479 unsigned long flags;
481 func_enter();
483 unifi_trace(priv, UDBG1, "uf_free_netdevice\n");
485 if (!priv) {
486 return -EINVAL;
490 * Free any buffers used for holding firmware
492 uf_release_firmware_files(priv);
494 #if (defined CSR_SUPPORT_SME) && (defined CSR_SUPPORT_WEXT)
495 if (priv->connection_config.mlmeAssociateReqInformationElements) {
496 kfree(priv->connection_config.mlmeAssociateReqInformationElements);
498 priv->connection_config.mlmeAssociateReqInformationElements = NULL;
499 priv->connection_config.mlmeAssociateReqInformationElementsLength = 0;
501 if (priv->mib_data.length) {
502 vfree(priv->mib_data.data);
504 priv->mib_data.data = NULL;
505 priv->mib_data.length = 0;
507 #endif /* CSR_SUPPORT_SME && CSR_SUPPORT_WEXT*/
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);
518 spin_unlock_irqrestore(&priv->m4_lock, flags);
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);
530 spin_unlock_irqrestore(&priv->wapi_lock, flags);
531 #endif
533 #ifdef CSR_SUPPORT_WEXT
534 /* Unregister callback for netdevice state changes */
535 unregister_netdevice_notifier(&uf_netdev_notifier);
536 #endif /* CSR_SUPPORT_WEXT */
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. */
543 flush_workqueue(priv->unifi_workqueue);
544 destroy_workqueue(priv->unifi_workqueue);
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
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]);
557 func_exit();
558 return 0;
559 } /* uf_free_netdevice() */
563 * ---------------------------------------------------------------------------
564 * uf_net_open
566 * Called when userland does "ifconfig wlan0 up".
568 * Arguments:
569 * dev Device pointer.
571 * Returns:
572 * None.
573 * ---------------------------------------------------------------------------
575 static int
576 uf_net_open(struct net_device *dev)
578 netInterface_priv_t *interfacePriv = (netInterface_priv_t *)netdev_priv(dev);
579 unifi_priv_t *priv = interfacePriv->privPtr;
581 func_enter();
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;
589 #if (defined CSR_NATIVE_LINUX) && (defined UNIFI_SNIFF_ARPHRD) && defined(CSR_SUPPORT_WEXT)
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.
597 if (priv->wext_conf.mode == IW_MODE_MONITOR) {
598 int err;
599 err = uf_start_sniff(priv);
600 if (err) {
601 return err;
603 netif_carrier_on(dev);
605 #endif
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;
614 #endif
616 netif_tx_start_all_queues(dev);
618 func_exit();
619 return 0;
620 } /* uf_net_open() */
623 static int
624 uf_net_stop(struct net_device *dev)
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;
630 func_enter();
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;
642 #else
643 func_enter();
644 #endif
646 netif_tx_stop_all_queues(dev);
648 func_exit();
649 return 0;
650 } /* uf_net_stop() */
653 /* This is called after the WE handlers */
654 static int
655 uf_net_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
657 int rc;
659 rc = -EOPNOTSUPP;
661 return rc;
662 } /* uf_net_ioctl() */
666 static struct net_device_stats *
667 uf_net_get_stats(struct net_device *dev)
669 netInterface_priv_t *interfacePriv = (netInterface_priv_t *)netdev_priv(dev);
671 return &interfacePriv->stats;
672 } /* uf_net_get_stats() */
674 static CSR_PRIORITY uf_get_packet_priority(unifi_priv_t *priv, netInterface_priv_t *interfacePriv, struct sk_buff *skb, const int proto)
676 CSR_PRIORITY priority = CSR_CONTENTION;
678 func_enter();
679 priority = (CSR_PRIORITY) (skb->priority >> 5);
681 if (priority == CSR_QOS_UP0) { /* 0 */
683 unifi_trace(priv, UDBG5, "uf_get_packet_priority: proto = 0x%.4X\n", proto);
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;
692 case 0x8100: /* VLAN */
693 priority = (CSR_PRIORITY) (skb->data[0 + ETH_HLEN] >> 5);
694 break;
696 case 0x86DD: /* IPv6 */
697 priority = (CSR_PRIORITY) ((skb->data[0 + ETH_HLEN] & 0x0E) >> 1);
698 break;
700 default:
701 priority = CSR_QOS_UP0;
702 break;
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 ||
709 interfacePriv->interfaceMode == CSR_WIFI_ROUTER_CTRL_MODE_P2PCLI) {
710 unifi_TrafficQueue queue;
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);
716 while (queue > UNIFI_TRAFFIC_Q_BK && !interfacePriv->queueEnabled[queue]) {
717 queue--;
718 priority = unifi_get_default_downgrade_priority(queue);
722 unifi_trace(priv, UDBG5, "Packet priority = %d\n", priority);
724 func_exit();
725 return priority;
731 * ---------------------------------------------------------------------------
732 * get_packet_priority
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
741 * Returns:
742 * CSR_PRIORITY.
743 * ---------------------------------------------------------------------------
745 CSR_PRIORITY
746 get_packet_priority(unifi_priv_t *priv, struct sk_buff *skb, const struct ethhdr *ehdr, netInterface_priv_t *interfacePriv)
748 CSR_PRIORITY priority = CSR_CONTENTION;
749 const int proto = ntohs(ehdr->h_proto);
751 u8 interfaceMode = interfacePriv->interfaceMode;
753 func_enter();
755 /* Priority Mapping for all the Modes */
756 switch(interfaceMode)
758 case CSR_WIFI_ROUTER_CTRL_MODE_STA:
759 case CSR_WIFI_ROUTER_CTRL_MODE_P2PCLI:
760 unifi_trace(priv, UDBG4, "mode is STA \n");
761 if ((priv->sta_wmm_capabilities & QOS_CAPABILITY_WMM_ENABLED) == 1) {
762 priority = uf_get_packet_priority(priv, interfacePriv, skb, proto);
763 } else {
764 priority = CSR_CONTENTION;
766 break;
767 #ifdef CSR_SUPPORT_SME
768 case CSR_WIFI_ROUTER_CTRL_MODE_AP:
769 case CSR_WIFI_ROUTER_CTRL_MODE_P2PGO:
770 case CSR_WIFI_ROUTER_CTRL_MODE_IBSS:
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;
784 break;
785 #endif
786 default:
787 unifi_trace(priv, UDBG3, " mode unknown in %s func, mode=%x\n", __FUNCTION__, interfaceMode);
789 unifi_trace(priv, UDBG5, "priority = %x\n", priority);
791 func_exit();
792 return priority;
796 * ---------------------------------------------------------------------------
797 * uf_net_select_queue
799 * Called by the kernel to select which queue to put the packet in
801 * Arguments:
802 * dev Device pointer
803 * skb Packet
805 * Returns:
806 * Queue index
807 * ---------------------------------------------------------------------------
809 static u16
810 uf_net_select_queue(struct net_device *dev, struct sk_buff *skb)
812 netInterface_priv_t *interfacePriv = (netInterface_priv_t *)netdev_priv(dev);
813 unifi_priv_t *priv = (unifi_priv_t *)interfacePriv->privPtr;
814 struct ethhdr ehdr;
815 unifi_TrafficQueue queue;
816 int proto;
817 CSR_PRIORITY priority;
819 func_enter();
821 memcpy(&ehdr, skb->data, ETH_HLEN);
822 proto = ntohs(ehdr.h_proto);
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
830 /* queues 0 - 3 */
831 priority = get_packet_priority(priv, skb, &ehdr, interfacePriv);
832 queue = unifi_frame_priority_to_queue(priority);
833 } else {
834 /* queue 4 */
835 queue = UNIFI_TRAFFIC_Q_EAPOL;
839 func_exit();
840 return (u16)queue;
841 } /* uf_net_select_queue() */
844 skb_add_llc_snap(struct net_device *dev, struct sk_buff *skb, int proto)
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;
851 /* get the headroom available in skb */
852 headroom = skb_headroom(skb);
853 /* step 1: classify ether frame, DIX or 802.3? */
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);
860 /* leave off any PAD octets. */
861 skb_trim(skb, proto);
862 } else if (proto == ETH_P_8021Q) {
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;
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);
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);
883 /* Add the VLAN specific information */
884 snap->protocol = htons(proto);
885 *(u16*)(snap + 1) = vlan_snap;
887 } else
889 /* it's DIXII, time for some conversion */
890 unifi_trace(priv, UDBG3, "DIXII len: %d\n", skb->len);
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;
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);
907 snap->protocol = htons(proto);
910 return 0;
911 } /* skb_add_llc_snap() */
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)
922 CSR_MA_PACKET_INDICATION *pkt_ind = (CSR_MA_PACKET_INDICATION*)&signal->u.MaPacketIndication;
923 int r;
924 u8 i;
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)) {
933 /* Send to client */
934 if (priv->sme_cli) {
936 * Pass the packet to the SME, using unifi_sys_ma_unitdata_ind().
937 * The frame needs to be converted according to the encapsulation.
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;
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;
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);
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),
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);
984 unifi_trace(priv, UDBG1,
985 "_identify_sme_ma_pkt_ind: unifi_sys_ma_pkt_ind <--\n");
988 return 1;
993 return -1;
995 #endif /* CSR_SUPPORT_SME */
998 * ---------------------------------------------------------------------------
999 * skb_80211_to_ether
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
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.
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 * ---------------------------------------------------------------------------
1017 skb_80211_to_ether(unifi_priv_t *priv, struct sk_buff *skb,
1018 const unsigned char *daddr, const unsigned char *saddr,
1019 const CSR_SIGNAL *signal,
1020 bulk_data_param_t *bulkdata)
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
1033 if(skb== NULL || daddr == NULL || saddr == NULL){
1034 unifi_error(priv,"skb_80211_to_ether: PBC fail\n");
1035 return 1;
1038 payload = skb->data;
1039 payload_length = skb->len;
1041 snap = (llc_snap_hdr_t *)payload;
1042 eth = (struct ethhdr *)payload;
1044 /* get the skb headroom size */
1045 headroom = skb_headroom(skb);
1048 * Test for the various encodings
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)))
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)))
1062 u16 len;
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);
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;
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);
1080 return 0;
1082 /* VLAN-tagged IP */
1083 if ((snap->oui[2] == 0) && (ntohs(snap->protocol) == ETH_P_8021Q))
1086 * The translation doesn't change the packet length, so is done in-place.
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
1094 u16 vlan_snap;
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;
1101 if (memcmp(payload + 10, vlan_inner_snap, 6)) {
1102 unifi_warning(priv, "VLAN malformatted SNAP header.\n");
1103 return -1;
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);
1109 /* Create the 802.3 header */
1111 vlan_snap = *((u16*)(payload + 8));
1113 /* Create LLC header without byte-swapping */
1114 eth->h_proto = snap->protocol;
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;
1122 /* it's a SNAP + RFC1042 frame */
1123 unifi_trace(priv, UDBG3, "SNAP+RFC1042 len: %d\n", payload_length);
1125 /* chop SNAP+llc header from skb. */
1126 skb_pull(skb, sizeof(llc_snap_hdr_t));
1128 /* Since skb_pull called above to chop snap+llc, no need to check for headroom
1129 * availability before skb_push
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;
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;
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);
1151 return 1;
1154 return 0;
1155 } /* skb_80211_to_ether() */
1158 static CsrWifiRouterCtrlPortAction verify_port(unifi_priv_t *priv, unsigned char *address, int queue, u16 interfaceTag)
1160 #ifdef CSR_NATIVE_LINUX
1161 #ifdef CSR_SUPPORT_WEXT
1162 if (queue == UF_CONTROLLED_PORT_Q) {
1163 return priv->wext_conf.block_controlled_port;
1164 } else {
1165 return CSR_WIFI_ROUTER_CTRL_PORT_ACTION_8021X_PORT_OPEN;
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
1176 * ---------------------------------------------------------------------------
1177 * prepare_and_add_macheader
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().
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
1196 * Returns:
1197 * Zero on success or error code.
1198 * ---------------------------------------------------------------------------
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)
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;
1220 if (skb == NULL) {
1221 unifi_error(priv,"prepare_and_add_macheader: Invalid SKB reference\n");
1222 return -1;
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) {
1229 fc |= cpu_to_le16(IEEE802_11_FC_TYPE_DATA);
1230 } else {
1231 /* Qos Control Field */
1232 macHeaderLengthInBytes += QOS_CONTROL_HEADER_SIZE;
1234 if (skb->len) {
1236 fc |= cpu_to_le16(IEEE802_11_FC_TYPE_QOS_DATA);
1237 } else {
1238 fc |= cpu_to_le16(IEEE802_11_FC_TYPE_QOS_NULL);
1239 bQosNull = true;
1242 } else {
1243 if(skb->len == 0) {
1244 fc |= cpu_to_le16(IEEE802_11_FC_TYPE_NULL);
1245 } else {
1246 fc |= cpu_to_le16(IEEE802_11_FC_TYPE_DATA);
1250 switch (interfacePriv->interfaceMode)
1252 case CSR_WIFI_ROUTER_CTRL_MODE_STA:
1253 case CSR_WIFI_ROUTER_CTRL_MODE_P2PCLI:
1254 direction = 2;
1255 fc |= cpu_to_le16(IEEE802_11_FC_TO_DS_MASK);
1256 break;
1257 case CSR_WIFI_ROUTER_CTRL_MODE_IBSS:
1258 direction = 0;
1259 break;
1260 case CSR_WIFI_ROUTER_CTRL_MODE_AP:
1261 case CSR_WIFI_ROUTER_CTRL_MODE_P2PGO:
1262 direction = 1;
1263 fc |= cpu_to_le16(IEEE802_11_FC_FROM_DS_MASK);
1264 break;
1265 case CSR_WIFI_ROUTER_CTRL_MODE_AMP:
1266 if (priority == CSR_MANAGEMENT ) {
1268 direction = 2;
1269 fc |= cpu_to_le16(IEEE802_11_FC_TO_DS_MASK);
1270 } else {
1271 /* Data frames have to use WDS 4 address frames */
1272 direction = 3;
1273 fc |= cpu_to_le16(IEEE802_11_FC_TO_DS_MASK | IEEE802_11_FC_FROM_DS_MASK);
1274 macHeaderLengthInBytes += 6;
1276 break;
1277 default:
1278 unifi_warning(priv, "prepare_and_add_macheader: Unknown mode %d\n",
1279 interfacePriv->interfaceMode);
1283 /* If Sta is QOS & HTC is supported then need to set 'order' bit */
1284 /* We don't support HT Control for now */
1286 if(protection) {
1287 fc |= cpu_to_le16(IEEE802_11_FC_PROTECTED_MASK);
1290 /* check the skb headroom before pushing mac header */
1291 headroom = skb_headroom(skb);
1293 if (headroom < macHeaderLengthInBytes) {
1294 unifi_trace(priv, UDBG5,
1295 "prepare_and_add_macheader: Allocate headroom extra %d bytes\n",
1296 macHeaderLengthInBytes);
1298 csrResult = unifi_net_data_malloc(priv, &data_ptrs.d[0], skb->len + macHeaderLengthInBytes);
1300 if (csrResult != CSR_RESULT_SUCCESS) {
1301 unifi_error(priv, " failed to allocate request_data. in %s func\n", __FUNCTION__);
1302 return -1;
1304 newSkb = (struct sk_buff *)(data_ptrs.d[0].os_net_buf_ptr);
1305 newSkb->len = skb->len + macHeaderLengthInBytes;
1307 memcpy((void*)data_ptrs.d[0].os_data_ptr + macHeaderLengthInBytes,
1308 skb->data, skb->len);
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;
1314 bufPtr = (u8*)data_ptrs.d[0].os_data_ptr;
1316 /* The old skb will not be used again */
1317 kfree_skb(skb);
1318 } else {
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;
1327 /* Frame the actual MAC header */
1329 memset(bufPtr, 0, macHeaderLengthInBytes);
1331 /* copy frameControl field */
1332 memcpy(bufPtr, &fc, sizeof(fc));
1333 bufPtr += sizeof(fc);
1334 macHeaderLengthInBytes -= sizeof(fc);
1336 /* Duration/ID field which is 2 bytes */
1337 bufPtr += 2;
1338 macHeaderLengthInBytes -= 2;
1340 switch(direction)
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;
1349 /* Address2: MAC address of the source */
1350 memcpy(bufPtr, saddr, ETH_ALEN);
1351 bufPtr += ETH_ALEN;
1352 macHeaderLengthInBytes -= ETH_ALEN;
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;
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;
1380 /* Address2: MAC address of the source from eth header */
1381 memcpy(bufPtr, saddr, ETH_ALEN);
1382 bufPtr += ETH_ALEN;
1383 macHeaderLengthInBytes -= ETH_ALEN;
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;
1395 /* Address2: MAC address of the source from eth header */
1396 memcpy(bufPtr, saddr, ETH_ALEN);
1397 bufPtr += ETH_ALEN;
1398 macHeaderLengthInBytes -= ETH_ALEN;
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;
1409 /* 2 bytes of frame control field, appended by firmware */
1410 bufPtr += 2;
1411 macHeaderLengthInBytes -= 2;
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;
1420 /* IF Qos Data or Qos Null Data then set QosControl field */
1421 if ((priority != CSR_CONTENTION) && (macHeaderLengthInBytes >= QOS_CONTROL_HEADER_SIZE)) {
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;
1429 /*assigning address1
1430 * Address1 offset taken fromm bufPtr(currently bufPtr pointing to Qos contorl) variable in reverse direction
1431 * Address4 don't exit
1434 addressOne = bufPtr- ADDRESS_ONE_OFFSET;
1436 if (addressOne[0] & 0x1) {
1437 /* multicast/broadcast frames, no acknowledgement needed */
1438 qc |= 1 << 5;
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;
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;
1457 if (macHeaderLengthInBytes) {
1458 unifi_warning(priv, " Mac header not appended properly\n");
1459 return -1;
1461 return 0;
1465 * ---------------------------------------------------------------------------
1466 * send_ma_pkt_request
1468 * These functions send a data packet to UniFi for transmission.
1469 * EAP protocol packets are also sent as send_ma_pkt_request().
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.
1476 * Returns:
1477 * Zero on success or error code.
1478 * ---------------------------------------------------------------------------
1481 static int
1482 send_ma_pkt_request(unifi_priv_t *priv, struct sk_buff *skb, const struct ethhdr *ehdr, CSR_PRIORITY priority)
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;
1497 unifi_trace(priv, UDBG5, "entering send_ma_pkt_request\n");
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;
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;
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;
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;
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)) {
1537 unifi_ta_sample(priv->card, CSR_WIFI_ROUTER_CTRL_PROTOCOL_DIRECTION_TX,
1538 &bulkdata.d[0], ehdr->h_source,
1539 priv->netdev[interfaceTag]->dev_addr,
1540 jiffies_to_msecs(jiffies),
1541 0); /* rate is unknown on tx */
1543 #endif /* CSR_SUPPORT_SME */
1545 if ((proto == ETH_P_PAE)
1546 #ifdef CSR_WIFI_SECURITY_WAPI_ENABLE
1547 || (proto == ETH_P_WAI)
1548 #endif
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;
1557 #ifdef CSR_WIFI_SECURITY_WAPI_ENABLE
1558 if (proto == ETH_P_WAI)
1560 protection = 0; /*WAI packets always sent unencrypted*/
1562 else
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;
1571 #else
1572 protection = 0;
1573 #endif
1574 #ifdef CSR_WIFI_SECURITY_WAPI_ENABLE
1576 #endif
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;
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
1589 memcpy(peerAddress.a, ((u8 *) bulkdata.d[0].os_data_ptr) + 4, ETH_ALEN);
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]);
1596 if ((proto == ETH_P_PAE)
1597 #ifdef CSR_WIFI_SECURITY_WAPI_ENABLE
1598 || (proto == ETH_P_WAI)
1599 #endif
1602 CSR_SIGNAL signal;
1603 CSR_MA_PACKET_REQUEST *req = &signal.u.MaPacketRequest;
1605 /* initialize signal to zero */
1606 memset(&signal, 0, sizeof(CSR_SIGNAL));
1608 /* Frame MA_PACKET request */
1609 signal.SignalPrimitiveHeader.SignalId = CSR_MA_PACKET_REQUEST_ID;
1610 signal.SignalPrimitiveHeader.ReceiverProcessId = 0;
1611 signal.SignalPrimitiveHeader.SenderProcessId = priv->netdev_client->sender_id;
1613 transmissionControl = req->TransmissionControl = 0;
1614 #ifdef CSR_SUPPORT_SME
1615 if (eapolStore)
1617 netInterface_priv_t *netpriv = (netInterface_priv_t *)netdev_priv(priv->netdev[interfaceTag]);
1619 /* Fill the MA-PACKET.req */
1621 req->Priority = priority;
1622 unifi_trace(priv, UDBG3, "Tx Frame with Priority: %x\n", req->Priority);
1624 /* rate selected by firmware */
1625 req->TransmitRate = 0;
1626 req->HostTag = CSR_WIFI_EAPOL_M4_HOST_TAG;
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);
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);
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().
1643 queue_work(priv->unifi_workqueue, &netpriv->send_m4_ready_task);
1645 return 0;
1647 #endif
1648 }/*EAPOL or WAI packet*/
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))
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]);
1661 unifi_trace(priv, UDBG4, "send_ma_pkt_request() - WAPI unicast data packet when USKID = 1 \n");
1663 /* initialize signal to zero */
1664 memset(&signal, 0, sizeof(CSR_SIGNAL));
1665 /* Frame MA_PACKET request */
1666 signal.SignalPrimitiveHeader.SignalId = CSR_MA_PACKET_REQUEST_ID;
1667 signal.SignalPrimitiveHeader.ReceiverProcessId = 0;
1668 signal.SignalPrimitiveHeader.SenderProcessId = priv->netdev_client->sender_id;
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);
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);
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().
1692 queue_work(priv->unifi_workqueue, &netpriv->send_pkt_to_encrypt);
1694 return 0;
1696 #endif
1698 if(priv->cmanrTestMode)
1700 TransmitRate = priv->cmanrTestModeTransmitRate;
1701 unifi_trace(priv, UDBG2, "send_ma_pkt_request: cmanrTestModeTransmitRate = %d TransmitRate=%d\n",
1702 priv->cmanrTestModeTransmitRate,
1703 TransmitRate
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);
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;
1725 unifi_trace(priv, UDBG3, "leaving send_ma_pkt_request, UNITDATA result code = %d\n", r);
1727 return r;
1728 } /* send_ma_pkt_request() */
1731 * ---------------------------------------------------------------------------
1732 * uf_net_xmit
1734 * This function is called by the higher level stack to transmit an
1735 * ethernet packet.
1737 * Arguments:
1738 * skb Ethernet packet to send.
1739 * dev Pointer to the linux net device.
1741 * Returns:
1742 * 0 on success (packet was consumed, not necessarily transmitted)
1743 * 1 if packet was requeued
1744 * -1 on error
1747 * Notes:
1748 * The controlled port is handled in the qdisc dequeue handler.
1749 * ---------------------------------------------------------------------------
1751 static netdev_tx_t
1752 uf_net_xmit(struct sk_buff *skb, struct net_device *dev)
1754 netInterface_priv_t *interfacePriv = (netInterface_priv_t *)netdev_priv(dev);
1755 unifi_priv_t *priv = interfacePriv->privPtr;
1756 struct ethhdr ehdr;
1757 int proto, port;
1758 int result;
1759 static tx_signal_handler tx_handler;
1760 CSR_PRIORITY priority;
1761 CsrWifiRouterCtrlPortAction port_action;
1763 func_enter();
1765 unifi_trace(priv, UDBG5, "unifi_net_xmit: skb = %x\n", skb);
1767 memcpy(&ehdr, skb->data, ETH_HLEN);
1768 proto = ntohs(ehdr.h_proto);
1769 priority = get_packet_priority(priv, skb, &ehdr, interfacePriv);
1771 /* All frames are sent as MA-PACKET.req (EAPOL also) */
1772 tx_handler = send_ma_pkt_request;
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
1780 port = UF_CONTROLLED_PORT_Q;
1781 } else {
1782 /* queue 4 */
1783 port = UF_UNCONTROLLED_PORT_Q;
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);
1792 if (port_action == CSR_WIFI_ROUTER_CTRL_PORT_ACTION_8021X_PORT_OPEN) {
1793 unifi_trace(priv, UDBG5,
1794 "uf_net_xmit: %s controlled port open\n",
1795 port ? "" : "un");
1796 /* Remove the ethernet header */
1797 skb_pull(skb, ETH_HLEN);
1798 result = tx_handler(priv, skb, &ehdr, priority);
1799 } else {
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);
1808 func_exit();
1809 return NETDEV_TX_OK;
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)))
1818 dev->trans_start = jiffies;
1819 /* Should really count tx stats in the UNITDATA.status signal but
1820 * that doesn't have the length.
1822 interfacePriv->stats.tx_packets++;
1823 /* count only the packet payload */
1824 interfacePriv->stats.tx_bytes += skb->len;
1827 #else
1828 dev->trans_start = jiffies;
1831 * Should really count tx stats in the UNITDATA.status signal but
1832 * that doesn't have the length.
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) {
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.
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;
1849 /* The skb will have been freed by send_XXX_request() */
1851 func_exit();
1852 return result;
1853 } /* uf_net_xmit() */
1856 * ---------------------------------------------------------------------------
1857 * unifi_pause_xmit
1858 * unifi_restart_xmit
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.
1867 * Arguments:
1868 * ospriv OS private context pointer.
1870 * Returns:
1871 * unifi_pause_xmit() is called from interrupt context.
1872 * ---------------------------------------------------------------------------
1874 void
1875 unifi_pause_xmit(void *ospriv, unifi_TrafficQueue queue)
1877 unifi_priv_t *priv = ospriv;
1878 int i; /* used as a loop counter */
1880 func_enter();
1881 unifi_trace(priv, UDBG2, "Stopping queue %d\n", queue);
1883 for(i=0;i<CSR_WIFI_NUM_INTERFACES;i++)
1885 if (netif_running(priv->netdev[i]))
1887 netif_stop_subqueue(priv->netdev[i], (u16)queue);
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);
1899 #endif
1900 func_exit();
1902 } /* unifi_pause_xmit() */
1904 void
1905 unifi_restart_xmit(void *ospriv, unifi_TrafficQueue queue)
1907 unifi_priv_t *priv = ospriv;
1908 int i=0; /* used as a loop counter */
1910 func_enter();
1911 unifi_trace(priv, UDBG2, "Waking queue %d\n", queue);
1913 for(i=0;i<CSR_WIFI_NUM_INTERFACES;i++)
1915 if (netif_running(priv->netdev[i]))
1917 netif_wake_subqueue(priv->netdev[i], (u16)queue);
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);
1929 #endif
1930 func_exit();
1931 } /* unifi_restart_xmit() */
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)
1938 int r, sr = 0;
1939 struct net_device *dev;
1941 #ifdef CSR_SUPPORT_SME
1942 llc_snap_hdr_t *snap;
1944 snap = (llc_snap_hdr_t *)skb->data;
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
1954 * Decapsulate any SNAP header and
1955 * prepend an ethernet header so that the skb manipulation and ARP
1956 * stuff works.
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;
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
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;
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);
1987 skb->ip_summed = CHECKSUM_UNNECESSARY;
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);
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;
2006 if(priv->cmanrTestMode)
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);
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
2020 if (dev != NULL) {
2021 dev->last_rx = jiffies;
2024 /* Bump rx stats */
2025 priv->interfacePriv[ifTag]->stats.rx_packets++;
2026 priv->interfacePriv[ifTag]->stats.rx_bytes += bulkdata->d[0].data_length;
2028 func_exit();
2029 return;
2032 void
2033 uf_process_rx_pending_queue(unifi_priv_t *priv, int queue,
2034 CsrWifiMacAddress source_address,
2035 int indicate, u16 interfaceTag)
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];
2044 if (interfaceTag >= CSR_WIFI_NUM_INTERFACES) {
2045 unifi_error(priv, "uf_process_rx_pending_queue bad interfaceTag\n");
2046 return;
2049 if (queue == UF_CONTROLLED_PORT_Q) {
2050 rx_list = &interfacePriv->rx_controlled_list;
2051 } else {
2052 rx_list = &interfacePriv->rx_uncontrolled_list;
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);
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)) {
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;
2072 list_del(l_h);
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);
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]);
2086 /* It is our resposibility to free the Rx structure object. */
2087 kfree(rx_q_item);
2089 up(&priv->rx_q_sem);
2093 * ---------------------------------------------------------------------------
2094 * uf_resume_data_plane
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.
2101 * Arguments:
2102 * priv Pointer to device private struct
2104 * Returns:
2105 * ---------------------------------------------------------------------------
2107 void
2108 uf_resume_data_plane(unifi_priv_t *priv, int queue,
2109 CsrWifiMacAddress peer_address,
2110 u16 interfaceTag)
2112 #ifdef CSR_SUPPORT_WEXT
2113 netInterface_priv_t *interfacePriv = priv->interfacePriv[interfaceTag];
2114 #endif
2116 if (interfaceTag >= CSR_WIFI_NUM_INTERFACES) {
2117 unifi_error(priv, "uf_resume_data_plane bad interfaceTag\n");
2118 return;
2121 unifi_trace(priv, UDBG2, "Resuming netif\n");
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.
2128 #ifdef CSR_SUPPORT_WEXT
2129 if (!interfacePriv->wait_netdev_change)
2130 #endif
2132 #ifdef CONFIG_NET_SCHED
2133 if (netif_running(priv->netdev[interfaceTag])) {
2134 netif_tx_schedule_all(priv->netdev[interfaceTag]);
2136 #endif
2137 uf_process_rx_pending_queue(priv, queue, peer_address, 1,interfaceTag);
2139 } /* uf_resume_data_plane() */
2142 void uf_free_pending_rx_packets(unifi_priv_t *priv, int queue, CsrWifiMacAddress peer_address,u16 interfaceTag)
2144 uf_process_rx_pending_queue(priv, queue, peer_address, 0,interfaceTag);
2146 } /* uf_free_pending_rx_packets() */
2150 * ---------------------------------------------------------------------------
2151 * unifi_rx
2153 * Reformat a UniFi data received packet into a p80211 packet and
2154 * pass it up the protocol stack.
2156 * Arguments:
2157 * None.
2159 * Returns:
2160 * None.
2161 * ---------------------------------------------------------------------------
2163 static void
2164 unifi_rx(unifi_priv_t *priv, CSR_SIGNAL *signal, bulk_data_param_t *bulkdata)
2166 u16 interfaceTag;
2167 bulk_data_desc_t *pData;
2168 const CSR_MA_PACKET_INDICATION *pkt_ind = &signal->u.MaPacketIndication;
2169 struct sk_buff *skb;
2170 CsrWifiRouterCtrlPortAction port_action;
2171 u8 dataFrameType;
2172 int proto;
2173 int queue;
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;
2181 func_enter();
2183 interfaceTag = (pkt_ind->VirtualInterfaceIdentifier & 0xff);
2184 interfacePriv = priv->interfacePriv[interfaceTag];
2186 /* Sanity check that the VIF refers to a sensible interface */
2187 if (interfaceTag >= CSR_WIFI_NUM_INTERFACES)
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;
2195 /* Sanity check that the VIF refers to an allocated netdev */
2196 if (!interfacePriv->netdev_registered)
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;
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;
2212 skb = (struct sk_buff*)bulkdata->d[0].os_net_buf_ptr;
2213 skb->len = bulkdata->d[0].data_length;
2215 /* Point to the addresses */
2216 toDs = (skb->data[1] & 0x01) ? 1 : 0;
2217 fromDs = (skb->data[1] & 0x02) ? 1 : 0;
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 */
2223 pData = &bulkdata->d[0];
2224 frameControl = CSR_GET_UINT16_FROM_LITTLE_ENDIAN(pData->os_data_ptr);
2225 frameType = ((frameControl & 0x000C) >> 2);
2227 dataFrameType =((frameControl & 0x00f0) >> 4);
2228 unifi_trace(priv, UDBG6,
2229 "%s: Receive Data Frame Type %d \n", __FUNCTION__,dataFrameType);
2231 switch(dataFrameType)
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)
2238 /* 6 is the size of Address4 field */
2239 macHeaderLengthInBytes += (QOS_CONTROL_HEADER_SIZE + 6);
2241 else
2243 macHeaderLengthInBytes += QOS_CONTROL_HEADER_SIZE;
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;
2255 /* Prepare the ethernet header from snap header of skb data */
2256 switch(dataFrameType)
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
2263 proto = 0x0;
2264 break;
2265 default:
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)
2271 snap = (llc_snap_hdr_t *) (skb->data + macHeaderLengthInBytes);
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);
2278 proto = ntohs(ehdr.h_proto);
2280 unifi_trace(priv, UDBG3, "in unifi_rx protocol from snap header = 0x%x\n", proto);
2282 if ((proto != ETH_P_PAE)
2283 #ifdef CSR_WIFI_SECURITY_WAPI_ENABLE
2284 && (proto != ETH_P_WAI)
2285 #endif
2287 queue = UF_CONTROLLED_PORT_Q;
2288 } else {
2289 queue = UF_UNCONTROLLED_PORT_Q;
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);
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))
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;
2305 if (pData->data_length) {
2306 unifi_ta_sample(priv->card, CSR_WIFI_ROUTER_CTRL_PROTOCOL_DIRECTION_RX,
2307 &bulkdata->d[0],
2308 sa, priv->netdev[interfaceTag]->dev_addr,
2309 jiffies_to_msecs(jiffies),
2310 pkt_ind->ReceivedRate);
2312 } else {
2314 /* AP/P2PGO specific handling here */
2315 CsrWifiRouterCtrlStaInfo_t * srcStaInfo =
2316 CsrWifiRouterCtrlGetStationRecordFromPeerMacAddress(priv,sa,interfaceTag);
2318 /* Defensive check only; Source address is already checked in
2319 process_ma_packet_ind and we should have a valid source address here */
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;
2333 /* For AP GO mode, don't store the PDUs */
2334 if (port_action != CSR_WIFI_ROUTER_CTRL_PORT_ACTION_8021X_PORT_OPEN) {
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]);
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;
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;
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
2364 if(!(uf_ap_process_data_pdu(priv, skb, &ehdr, srcStaInfo,
2365 signal,
2366 bulkdata,
2367 macHeaderLengthInBytes)))
2369 func_exit();
2370 return;
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;
2380 #endif /* CSR_SUPPORT_SME */
2383 /* Now that the MAC header is removed, null-data frames have zero length
2384 * and can be dropped
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);
2391 unifi_net_data_free(priv, &bulkdata->d[0]);
2392 func_exit();
2393 return;
2396 if (port_action == CSR_WIFI_ROUTER_CTRL_PORT_ACTION_8021X_PORT_CLOSED_DISCARD) {
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) ) {
2407 /* Buffer the packet into the Rx queues */
2408 rx_buffered_packets_t *rx_q_item;
2409 struct list_head *rx_list;
2411 rx_q_item = (rx_buffered_packets_t *)kmalloc(sizeof(rx_buffered_packets_t),
2412 GFP_KERNEL);
2413 if (rx_q_item == NULL) {
2414 unifi_error(priv, "%s: Failed to allocate %d bytes for rx packet record\n",
2415 __FUNCTION__, sizeof(rx_buffered_packets_t));
2416 interfacePriv->stats.rx_dropped++;
2417 unifi_net_data_free(priv, &bulkdata->d[0]);
2418 func_exit();
2419 return;
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);
2431 if (queue == UF_CONTROLLED_PORT_Q) {
2432 rx_list = &interfacePriv->rx_controlled_list;
2433 } else {
2434 rx_list = &interfacePriv->rx_uncontrolled_list;
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);
2442 func_exit();
2443 return;
2447 indicate_rx_skb(priv, interfaceTag, da, sa, skb, signal, bulkdata);
2449 func_exit();
2451 } /* unifi_rx() */
2453 static void process_ma_packet_cfm(unifi_priv_t *priv, CSR_SIGNAL *signal, bulk_data_param_t *bulkdata)
2455 u16 interfaceTag;
2456 const CSR_MA_PACKET_CONFIRM *pkt_cfm = &signal->u.MaPacketConfirm;
2457 netInterface_priv_t *interfacePriv;
2459 func_enter();
2460 interfaceTag = (pkt_cfm->VirtualInterfaceIdentifier & 0xff);
2461 interfacePriv = priv->interfacePriv[interfaceTag];
2463 /* Sanity check that the VIF refers to a sensible interface */
2464 if (interfaceTag >= CSR_WIFI_NUM_INTERFACES)
2466 unifi_error(priv, "%s: MA-PACKET confirm with bad interfaceTag %d\n", __FUNCTION__, interfaceTag);
2467 func_exit();
2468 return;
2470 #ifdef CSR_SUPPORT_SME
2471 if(interfacePriv->interfaceMode == CSR_WIFI_ROUTER_CTRL_MODE_AP ||
2472 interfacePriv->interfaceMode == CSR_WIFI_ROUTER_CTRL_MODE_P2PGO) {
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*/
2477 CsrResult result = pkt_cfm->TransmissionStatus == CSR_TX_SUCCESSFUL?CSR_RESULT_SUCCESS:CSR_RESULT_FAILURE;
2478 CsrWifiMacAddress peerMacAddress;
2479 memcpy(peerMacAddress.a, interfacePriv->m4_signal.u.MaPacketRequest.Ra.x, ETH_ALEN);
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;
2489 #endif
2490 func_exit();
2491 return;
2496 * ---------------------------------------------------------------------------
2497 * unifi_rx
2499 * Reformat a UniFi data received packet into a p80211 packet and
2500 * pass it up the protocol stack.
2502 * Arguments:
2503 * None.
2505 * Returns:
2506 * None.
2507 * ---------------------------------------------------------------------------
2509 static void process_ma_packet_ind(unifi_priv_t *priv, CSR_SIGNAL *signal, bulk_data_param_t *bulkdata)
2511 u16 interfaceTag;
2512 bulk_data_desc_t *pData;
2513 CSR_MA_PACKET_INDICATION *pkt_ind = (CSR_MA_PACKET_INDICATION*)&signal->u.MaPacketIndication;
2514 struct sk_buff *skb;
2515 u16 frameControl;
2516 netInterface_priv_t *interfacePriv;
2517 u8 da[ETH_ALEN], sa[ETH_ALEN];
2518 u8 *bssid = NULL, *ba_addr = NULL;
2519 u8 toDs, fromDs, frameType;
2520 u8 i =0;
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;
2529 #endif
2531 func_enter();
2533 interfaceTag = (pkt_ind->VirtualInterfaceIdentifier & 0xff);
2534 interfacePriv = priv->interfacePriv[interfaceTag];
2537 /* Sanity check that the VIF refers to a sensible interface */
2538 if (interfaceTag >= CSR_WIFI_NUM_INTERFACES)
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;
2546 /* Sanity check that the VIF refers to an allocated netdev */
2547 if (!interfacePriv->netdev_registered)
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;
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;
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)
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;
2573 skb = (struct sk_buff*)bulkdata->d[0].os_net_buf_ptr;
2574 skb->len = bulkdata->d[0].data_length;
2576 /* Point to the addresses */
2577 toDs = (skb->data[1] & 0x01) ? 1 : 0;
2578 fromDs = (skb->data[1] & 0x02) ? 1 : 0;
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 */
2583 /* Find the BSSID, which will be used to match the BA session */
2584 if (toDs && fromDs)
2586 unifi_trace(priv, UDBG6, "4 address frame - don't try to find BSSID\n");
2587 bssid = NULL;
2589 else
2591 bssid = (u8 *) (skb->data + 4 + 12 - (fromDs * 6) - (toDs * 12));
2594 pData = &bulkdata->d[0];
2595 frameControl = CSR_GET_UINT16_FROM_LITTLE_ENDIAN(pData->os_data_ptr);
2596 frameType = ((frameControl & 0x000C) >> 2);
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__);
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__);
2609 uf_process_ps_poll(priv,sa,da,pmBit,interfaceTag);
2611 else {
2612 unifi_warning(priv, "%s: Non PS-POLL control frame is received\n", __FUNCTION__);
2614 #endif
2615 unifi_net_data_free(priv,&bulkdata->d[0]);
2616 func_exit();
2617 return;
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;
2626 #ifdef CSR_SUPPORT_SME
2627 if((interfacePriv->interfaceMode == CSR_WIFI_ROUTER_CTRL_MODE_AP) ||
2628 (interfacePriv->interfaceMode == CSR_WIFI_ROUTER_CTRL_MODE_P2PGO)){
2630 srcStaInfo = CsrWifiRouterCtrlGetStationRecordFromPeerMacAddress(priv,sa,interfaceTag);
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;
2645 verify power management bit here so as to ensure host and unifi are always
2646 in sync with power management status of peer.
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
2652 pmBit = (frameControl & 0x1000)?0x01:0x00;
2653 powerSaveChanged = uf_process_pm_bit_for_peer(priv,srcStaInfo,pmBit,interfaceTag);
2655 /* Update station last activity time */
2656 srcStaInfo->activity_flag = TRUE;
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 */
2661 dataFrameType = ((frameControl & 0x00f0) >> 4);
2663 if((powerSaveChanged == FALSE)&&(srcStaInfo->wmmOrQosEnabled == TRUE)&&
2664 (srcStaInfo->currentPeerState == CSR_WIFI_ROUTER_CTRL_PEER_CONNECTED_POWER_SAVE)){
2666 if((dataFrameType == QOS_DATA) || (dataFrameType == QOS_DATA_NULL)){
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
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);
2675 else{
2676 qosControl = CSR_GET_UINT16_FROM_LITTLE_ENDIAN(pData->os_data_ptr + 24);
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);
2684 #endif
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 ||
2693 interfacePriv->interfaceMode == CSR_WIFI_ROUTER_CTRL_MODE_P2PGO){
2694 ba_addr = sa;
2695 }else{
2696 ba_addr = bssid;
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;
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);
2723 } else {
2724 unifi_trace(priv, UDBG6, "calling unifi_rx()");
2725 unifi_rx(priv, signal, bulkdata);
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.
2732 * And also this code here takes care that timeout check is made for all
2733 * the receive indications
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);
2743 up(&priv->ba_mutex);
2744 process_ba_complete(priv, interfacePriv);
2746 func_exit();
2749 * ---------------------------------------------------------------------------
2750 * uf_set_multicast_list
2752 * This function is called by the higher level stack to set
2753 * a list of multicast rx addresses.
2755 * Arguments:
2756 * dev Network Device pointer.
2758 * Returns:
2759 * None.
2761 * Notes:
2762 * ---------------------------------------------------------------------------
2765 static void
2766 uf_set_multicast_list(struct net_device *dev)
2768 netInterface_priv_t *interfacePriv = (netInterface_priv_t *)netdev_priv(dev);
2769 unifi_priv_t *priv = interfacePriv->privPtr;
2771 #ifdef CSR_NATIVE_LINUX
2772 unifi_trace(priv, UDBG3, "uf_set_multicast_list unsupported\n");
2773 return;
2774 #else
2776 u8 *mc_list = interfacePriv->mc_list;
2777 struct netdev_hw_addr *mc_addr;
2778 int mc_addr_count;
2780 if (priv->init_progress != UNIFI_INIT_COMPLETED) {
2781 return;
2784 mc_addr_count = netdev_mc_count(dev);
2786 unifi_trace(priv, UDBG3,
2787 "uf_set_multicast_list (count=%d)\n", mc_addr_count);
2790 /* Not enough space? */
2791 if (mc_addr_count > UNIFI_MAX_MULTICAST_ADDRESSES) {
2792 return;
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;
2802 /* Send a message to the workqueue */
2803 queue_work(priv->unifi_workqueue, &priv->multicast_list_task);
2804 #endif
2806 } /* uf_set_multicast_list() */
2809 * ---------------------------------------------------------------------------
2810 * netdev_mlme_event_handler
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.
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.
2826 * Returns:
2827 * None.
2828 * ---------------------------------------------------------------------------
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)
2834 CSR_SIGNAL signal;
2835 unifi_priv_t *priv = uf_find_instance(pcli->instance);
2836 int id, r;
2837 bulk_data_param_t bulkdata;
2839 func_enter();
2841 /* Just a sanity check */
2842 if (sig_packed == NULL) {
2843 return;
2847 * This copy is to silence a compiler warning about discarding the
2848 * const qualifier.
2850 bulkdata = *bulkdata_o;
2852 /* Get the unpacked signal */
2853 r = read_unpack_signal(sig_packed, &signal);
2854 if (r) {
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.
2859 unifi_trace(priv, UDBG1,
2860 "Netdev - Received unknown signal 0x%.4X.\n",
2861 CSR_GET_UINT16_FROM_LITTLE_ENDIAN(sig_packed));
2862 return;
2865 id = signal.SignalPrimitiveHeader.SignalId;
2866 unifi_trace(priv, UDBG3, "Netdev - Process signal 0x%.4X\n", id);
2869 * Take the appropriate action for the signal.
2871 switch (id) {
2872 case CSR_MA_PACKET_ERROR_INDICATION_ID:
2873 process_ma_packet_error_ind(priv, &signal, &bulkdata);
2874 break;
2875 case CSR_MA_PACKET_INDICATION_ID:
2876 process_ma_packet_ind(priv, &signal, &bulkdata);
2877 break;
2878 case CSR_MA_PACKET_CONFIRM_ID:
2879 process_ma_packet_cfm(priv, &signal, &bulkdata);
2880 break;
2881 #ifdef CSR_SUPPORT_SME
2882 case CSR_MLME_SET_TIM_CONFIRM_ID:
2883 /* Handle TIM confirms from FW & set the station record's TIM state appropriately,
2884 * In case of failures, tries with max_retransmit limit
2886 uf_handle_tim_cfm(priv, &signal.u.MlmeSetTimConfirm, signal.SignalPrimitiveHeader.ReceiverProcessId);
2887 break;
2888 #endif
2889 case CSR_DEBUG_STRING_INDICATION_ID:
2890 debug_string_indication(priv, bulkdata.d[0].os_data_ptr, bulkdata.d[0].data_length);
2891 break;
2893 case CSR_DEBUG_WORD16_INDICATION_ID:
2894 debug_word16_indication(priv, &signal);
2895 break;
2897 case CSR_DEBUG_GENERIC_CONFIRM_ID:
2898 case CSR_DEBUG_GENERIC_INDICATION_ID:
2899 debug_generic_indication(priv, &signal);
2900 break;
2901 default:
2902 break;
2905 func_exit();
2906 } /* netdev_mlme_event_handler() */
2910 * ---------------------------------------------------------------------------
2911 * uf_net_get_name
2913 * Retrieve the name (e.g. eth1) associated with this network device
2915 * Arguments:
2916 * dev Pointer to the network device.
2917 * name Buffer to write name
2918 * len Size of buffer in bytes
2920 * Returns:
2921 * None
2923 * Notes:
2924 * ---------------------------------------------------------------------------
2926 void uf_net_get_name(struct net_device *dev, char *name, int len)
2928 *name = '\0';
2929 if (dev) {
2930 strlcpy(name, dev->name, (len > IFNAMSIZ) ? IFNAMSIZ : len);
2933 } /* uf_net_get_name */
2935 #ifdef CSR_SUPPORT_WEXT
2938 * ---------------------------------------------------------------------------
2939 * uf_netdev_event
2941 * Callback function to handle netdev state changes
2943 * Arguments:
2944 * notif Pointer to a notifier_block.
2945 * event Event prompting notification
2946 * ptr net_device pointer
2948 * Returns:
2949 * None
2951 * Notes:
2952 * The event handler is global, and may occur on non-UniFi netdevs.
2953 * ---------------------------------------------------------------------------
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}};
2962 /* Check that the event is for a UniFi netdev. If it's not, the netdev_priv
2963 * structure is not safe to use.
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;
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");
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);
2987 break;
2989 default:
2990 break;
2992 return 0;
2995 static struct notifier_block uf_netdev_notifier = {
2996 .notifier_call = uf_netdev_event,
2998 #endif /* CSR_SUPPORT_WEXT */
3001 static void
3002 process_amsdu(unifi_priv_t *priv, CSR_SIGNAL *signal, bulk_data_param_t *bulkdata)
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;
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;
3021 *qos_control_ptr &= ~(IEEE802_11_QC_A_MSDU_PRESENT);
3023 ptr = qos_control_ptr + 2;
3024 offset = dot11_hdr_size = ptr - dot11_hdr_ptr;
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;
3032 subframe_length = sizeof(struct ethhdr) + subframe_body_length;
3033 memset(&subframe_bulkdata, 0, sizeof(bulk_data_param_t));
3035 csrResult = unifi_net_data_malloc(priv, &subframe_bulkdata.d[0], dot11_hdr_size + subframe_body_length);
3037 if (csrResult != CSR_RESULT_SUCCESS) {
3038 unifi_error(priv, "%s: unifi_net_data_malloc failed\n", __FUNCTION__);
3039 break;
3042 memcpy((u8*)subframe_bulkdata.d[0].os_data_ptr, dot11_hdr_ptr, dot11_hdr_size);
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);
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);
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);
3061 subframe_length = (subframe_length + 3)&(~0x3);
3062 ptr += subframe_length;
3063 offset += subframe_length;
3065 unifi_net_data_free(priv, &bulkdata->d[0]);
3069 #define SN_TO_INDEX(__ba_session, __sn) (((__sn - __ba_session->start_sn) & 0xFFF) % __ba_session->wind_size)
3072 #define ADVANCE_EXPECTED_SN(__ba_session) \
3074 __ba_session->expected_sn++; \
3075 __ba_session->expected_sn &= 0xFFF; \
3078 #define FREE_BUFFER_SLOT(__ba_session, __index) \
3080 __ba_session->occupied_slots--; \
3081 __ba_session->buffer[__index].active = FALSE; \
3082 ADVANCE_EXPECTED_SN(__ba_session); \
3085 static void add_frame_to_ba_complete(unifi_priv_t *priv,
3086 netInterface_priv_t *interfacePriv,
3087 frame_desc_struct *frame_desc)
3089 interfacePriv->ba_complete[interfacePriv->ba_complete_index] = *frame_desc;
3090 interfacePriv->ba_complete_index++;
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)
3099 int i, j;
3100 u16 gap;
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);
3116 ba_session->expected_sn = sn;
3120 static void complete_ready_sequence(unifi_priv_t *priv,
3121 netInterface_priv_t *interfacePriv,
3122 ba_session_rx_struct *ba_session)
3124 int i;
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);
3136 void scroll_ba_window(unifi_priv_t *priv,
3137 netInterface_priv_t *interfacePriv,
3138 ba_session_rx_struct *ba_session,
3139 u16 sn)
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);
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;
3156 if(((sn - ba_session->expected_sn) & 0xFFF) <= 2048) {
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;
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);
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]);
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]);
3196 return i;
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)
3206 int i;
3207 u16 sn = frame_desc->sn;
3209 if (ba_session->timeout) {
3210 mod_timer(&ba_session->timer, (jiffies + usecs_to_jiffies((ba_session->timeout) * 1024)));
3212 unifi_trace(priv, UDBG6, "%s: got frame(sn=%d)\n", __FUNCTION__, sn);
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);
3223 complete_ready_sequence(priv, interfacePriv, ba_session);
3227 static void process_ba_complete(unifi_priv_t *priv, netInterface_priv_t *interfacePriv)
3229 frame_desc_struct *frame_desc;
3230 u8 i;
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);
3237 interfacePriv->ba_complete_index = 0;
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
3246 static void check_ba_frame_age_timeout( unifi_priv_t *priv,
3247 netInterface_priv_t *interfacePriv,
3248 ba_session_rx_struct *ba_session)
3250 CsrTime now;
3251 CsrTime age;
3252 u8 i, j;
3253 u16 sn_temp;
3255 /* gap is started at 1 because we have buffered frames and
3256 * hence a minimum gap of 1 exists
3258 u8 gap=1;
3260 now = CsrTimeGet(NULL);
3262 if (ba_session->occupied_slots)
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
3269 sn_temp = (ba_session->expected_sn + 1) & 0xFFF;
3271 for(j = 0; j < ba_session->wind_size; j++)
3273 i = SN_TO_INDEX(ba_session, sn_temp);
3275 if(ba_session->buffer[i].active)
3277 unifi_trace(priv, UDBG6, "check age at slot index = %d sn = %d recv_time = %u now = %u\n",
3279 ba_session->buffer[i].sn,
3280 ba_session->buffer[i].recv_time,
3281 now);
3283 if (ba_session->buffer[i].recv_time > now)
3285 /* timer wrap */
3286 age = CsrTimeAdd((CsrTime)CsrTimeSub(CSR_SCHED_TIME_MAX, ba_session->buffer[i].recv_time), now);
3288 else
3290 age = (CsrTime)CsrTimeSub(now, ba_session->buffer[i].recv_time);
3293 if (age >= CSR_WIFI_BA_MPDU_FRAME_AGE_TIMEOUT)
3295 unifi_trace(priv, UDBG2, "release the frame at index = %d gap = %d expected_sn = %d sn = %d\n",
3297 gap,
3298 ba_session->expected_sn,
3299 ba_session->buffer[i].sn);
3301 /* if it has timedout don't wait for missing frames, move the window */
3302 while (gap--)
3304 ADVANCE_EXPECTED_SN(ba_session);
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);
3310 break;
3313 else
3315 /* advance temp sequence number and frame gap */
3316 sn_temp = (sn_temp + 1) & 0xFFF;
3317 gap++;
3324 static void process_ma_packet_error_ind(unifi_priv_t *priv, CSR_SIGNAL *signal, bulk_data_param_t *bulkdata)
3326 u16 interfaceTag;
3327 const CSR_MA_PACKET_ERROR_INDICATION *pkt_err_ind = &signal->u.MaPacketErrorIndication;
3328 netInterface_priv_t *interfacePriv;
3329 ba_session_rx_struct *ba_session;
3330 u8 ba_session_idx = 0;
3331 CSR_PRIORITY UserPriority;
3332 CSR_SEQUENCE_NUMBER sn;
3334 func_enter();
3336 interfaceTag = (pkt_err_ind->VirtualInterfaceIdentifier & 0xff);
3339 /* Sanity check that the VIF refers to a sensible interface */
3340 if (interfaceTag >= CSR_WIFI_NUM_INTERFACES)
3342 unifi_error(priv, "%s: MaPacketErrorIndication indication with bad interfaceTag %d\n", __FUNCTION__, interfaceTag);
3343 func_exit();
3344 return;
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();
3353 sn = pkt_err_ind->SequenceNumber;
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)));
3364 scroll_ba_window(priv, interfacePriv, ba_session, sn);
3365 break;
3370 up(&priv->ba_mutex);
3371 process_ba_complete(priv, interfacePriv);
3372 func_exit();