46 #include <linux/types.h>
50 #include <linux/version.h>
59 #ifdef CSR_SUPPORT_WEXT
83 #ifdef CONFIG_NET_SCHED
118 struct uf_tx_packet_data {
124 unsigned long host_tag;
131 .ndo_open = uf_net_open,
132 .ndo_stop = uf_net_stop,
133 .ndo_start_xmit = uf_net_xmit,
134 .ndo_do_ioctl = uf_net_ioctl,
135 .ndo_get_stats = uf_net_get_stats,
136 .ndo_set_rx_mode = uf_set_multicast_list,
137 .ndo_select_queue = uf_net_select_queue,
146 const u8 *sig_packed,
int sig_len,
150 #ifdef CSR_SUPPORT_WEXT
187 #ifdef CSR_SUPPORT_WEXT
224 #ifdef CSR_SUPPORT_WEXT
226 #if IW_HANDLER_VERSION < 6
237 priv->
sdio = sdio_dev;
260 netdev_mlme_event_handler);
263 "Failed to register a unifi client for background netdev processing\n");
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;
287 #ifdef CSR_SUPPORT_SME
288 priv->allPeerDozing = 0;
299 unifi_info(priv,
"Using the 802.11a radio\n");
312 interfacePriv->
connected = UnifiConnectedUnknown;
314 #ifdef USE_DRIVER_LOCK
315 sema_init(&priv->lock, 1);
323 #if (defined(CSR_WIFI_SECURITY_WAPI_ENABLE) && defined(CSR_WIFI_SECURITY_WAPI_SW_ENCRYPTION))
327 #ifdef CSR_SUPPORT_SME
341 #ifdef CSR_SUPPORT_SME
348 #if (defined(CSR_WIFI_SECURITY_WAPI_ENABLE) && defined(CSR_WIFI_SECURITY_WAPI_SW_ENCRYPTION))
350 INIT_WORK(&interfacePriv->send_pkt_to_encrypt, uf_send_pkt_to_encrypt);
364 #ifdef CSR_SUPPORT_WEXT
365 interfacePriv->netdev_callback_registered =
FALSE;
366 interfacePriv->wait_netdev_change =
FALSE;
369 interfacePriv->netdev_callback_registered =
TRUE;
372 unifi_warning(priv,
"Failed to register netdevice notifier : %d %p\n", rc, dev);
376 #ifdef CSR_WIFI_SPLIT_PATCH
378 priv->pending_mode_set.common.destination = 0xaaaa;
431 unifi_error(priv,
"uf_alloc_netdevice_for_other_interfaces bad interfaceTag\n");
443 interfacePriv->
connected = UnifiConnectedUnknown;
450 #ifdef CSR_SUPPORT_WEXT
452 #if IW_HANDLER_VERSION < 6
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;
518 spin_unlock_irqrestore(&priv->
m4_lock, flags);
520 #if (defined(CSR_WIFI_SECURITY_WAPI_ENABLE) && defined(CSR_WIFI_SECURITY_WAPI_SW_ENCRYPTION))
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);
530 spin_unlock_irqrestore(&priv->wapi_lock, flags);
533 #ifdef CSR_SUPPORT_WEXT
538 #ifdef CSR_SUPPORT_SME
549 for (i=CSR_WIFI_NUM_INTERFACES-1; i>=0; i--) {
589 #if (defined CSR_NATIVE_LINUX) && (defined UNIFI_SNIFF_ARPHRD) && defined(CSR_SUPPORT_WEXT)
599 err = uf_start_sniff(priv);
607 #ifdef CSR_SUPPORT_WEXT
608 if (interfacePriv->wait_netdev_change) {
609 unifi_trace(priv,
UDBG1,
"%s: Waiting for NETDEV_CHANGE, assume connected\n",
611 interfacePriv->
connected = UnifiConnected;
612 interfacePriv->wait_netdev_change =
FALSE;
616 netif_tx_start_all_queues(dev);
626 #if defined(CSR_NATIVE_LINUX) && defined(UNIFI_SNIFF_ARPHRD) && defined(CSR_SUPPORT_WEXT)
646 netif_tx_stop_all_queues(dev);
671 return &interfacePriv->
stats;
683 unifi_trace(priv,
UDBG5,
"uf_get_packet_priority: proto = 0x%.4X\n", proto);
756 switch(interfaceMode)
762 priority = uf_get_packet_priority(priv, interfacePriv, skb, proto);
767 #ifdef CSR_SUPPORT_SME
773 CsrWifiRouterCtrlGetStationRecordFromPeerMacAddress(priv,ehdr->
h_dest, interfacePriv->
InterfaceTag);
777 priority = uf_get_packet_priority(priv, interfacePriv, skb, proto);
780 unifi_trace(priv,
UDBG4,
"Destination is not QSTA or BroadCast/Multicast\n");
826 #ifdef CSR_WIFI_SECURITY_WAPI_ENABLE
846 llc_snap_hdr_t *
snap;
852 headroom = skb_headroom(skb);
872 snap = (llc_snap_hdr_t *)
skb_push(skb, 4);
873 snap->dsap = snap->ssap = 0xAA;
878 snap = (llc_snap_hdr_t *)
skb_push(skb, 10);
879 snap->dsap = snap->ssap = 0xAA;
884 snap->protocol =
htons(proto);
885 *(
u16*)(snap + 1) = vlan_snap;
893 if (headroom <
sizeof(llc_snap_hdr_t)) {
898 snap = (llc_snap_hdr_t *)
skb_push(skb,
sizeof(llc_snap_hdr_t));
899 snap->dsap = snap->ssap = 0xAA;
907 snap->protocol =
htons(proto);
913 #ifdef CSR_SUPPORT_SME
919 const unsigned char *
daddr,
920 const unsigned char *
saddr)
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)) {
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);
950 "_identify_sme_ma_pkt_ind: skb_80211_to_ether -->\n");
954 "_identify_sme_ma_pkt_ind: skb_80211_to_ether <--\n");
971 "_identify_sme_ma_pkt_ind: unifi_sys_ma_pkt_ind -->\n");
985 "_identify_sme_ma_pkt_ind: unifi_sys_ma_pkt_ind <--\n");
1018 const unsigned char *daddr,
const unsigned char *saddr,
1025 llc_snap_hdr_t *
snap;
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)
1034 unifi_error(priv,
"skb_80211_to_ether: PBC fail\n");
1038 payload = skb->
data;
1039 payload_length = skb->
len;
1041 snap = (llc_snap_hdr_t *)payload;
1042 eth = (
struct ethhdr *)payload;
1045 headroom = skb_headroom(skb);
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)))
1059 if ((snap->oui[2] == 0) &&
1069 if (headroom < (2 *
ETH_ALEN + 2)) {
1070 unifi_warning(priv,
"headroom not available to skb_push ether header\n");
1097 unifi_warning(priv,
"VLAN SNAP header too short: %d bytes\n", payload_length);
1101 if (
memcmp(payload + 10, vlan_inner_snap, 6)) {
1106 unifi_trace(priv,
UDBG3,
"VLAN SNAP: %02x-%02x\n", payload[8], payload[9]);
1111 vlan_snap = *((
u16*)(payload + 8));
1114 eth->
h_proto = snap->protocol;
1118 *(
u16*)(eth + 1) = vlan_snap;
1126 skb_pull(skb,
sizeof(llc_snap_hdr_t));
1136 eth->
h_proto = snap->protocol;
1141 if (headroom < (2 *
ETH_ALEN + 2)) {
1142 unifi_warning(priv,
"headroom not available to skb_push ether header\n");
1160 #ifdef CSR_NATIVE_LINUX
1161 #ifdef CSR_SUPPORT_WEXT
1163 return priv->wext_conf.block_controlled_port;
1218 u8 bQosNull =
false;
1221 unifi_error(priv,
"prepare_and_add_macheader: Invalid SKB reference\n");
1274 macHeaderLengthInBytes += 6;
1278 unifi_warning(priv,
"prepare_and_add_macheader: Unknown mode %d\n",
1291 headroom = skb_headroom(skb);
1293 if (headroom < macHeaderLengthInBytes) {
1295 "prepare_and_add_macheader: Allocate headroom extra %d bytes\n",
1296 macHeaderLengthInBytes);
1305 newSkb->
len = skb->
len + macHeaderLengthInBytes;
1321 bufPtr = (
u8*)
skb_push(skb, macHeaderLengthInBytes);
1329 memset(bufPtr, 0, macHeaderLengthInBytes);
1332 memcpy(bufPtr, &fc,
sizeof(fc));
1333 bufPtr +=
sizeof(
fc);
1334 macHeaderLengthInBytes -=
sizeof(
fc);
1338 macHeaderLengthInBytes -= 2;
1347 macHeaderLengthInBytes -=
ETH_ALEN;
1352 macHeaderLengthInBytes -=
ETH_ALEN;
1357 macHeaderLengthInBytes -=
ETH_ALEN;
1363 macHeaderLengthInBytes -=
ETH_ALEN;
1367 macHeaderLengthInBytes -=
ETH_ALEN;
1372 macHeaderLengthInBytes -=
ETH_ALEN;
1378 macHeaderLengthInBytes -=
ETH_ALEN;
1383 macHeaderLengthInBytes -=
ETH_ALEN;
1388 macHeaderLengthInBytes -=
ETH_ALEN;
1393 macHeaderLengthInBytes -=
ETH_ALEN;
1398 macHeaderLengthInBytes -=
ETH_ALEN;
1403 macHeaderLengthInBytes -=
ETH_ALEN;
1406 unifi_error(priv,
"Unknown direction =%d : Not handled now\n",direction);
1411 macHeaderLengthInBytes -= 2;
1413 if (3 == direction) {
1417 macHeaderLengthInBytes -=
ETH_ALEN;
1424 unifi_trace(priv,
UDBG1,
"data packets priority is more than 7, priority = %x\n", priority);
1436 if (addressOne[0] & 0x1) {
1457 if (macHeaderLengthInBytes) {
1508 if (interfacePriv ==
NULL) {
1512 unifi_warning(priv,
"Mac address not matching ... debugging needed\n");
1513 interfacePriv->
stats.tx_dropped++;
1533 #ifdef CSR_SUPPORT_SME
1539 priv->
netdev[interfaceTag]->dev_addr,
1546 #ifdef CSR_WIFI_SECURITY_WAPI_ENABLE
1557 #ifdef CSR_WIFI_SECURITY_WAPI_ENABLE
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");
1574 #ifdef CSR_WIFI_SECURITY_WAPI_ENABLE
1580 unifi_error(priv,
"failed to create MAC header\n");
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]);
1597 #ifdef CSR_WIFI_SECURITY_WAPI_ENABLE
1614 #ifdef CSR_SUPPORT_SME
1650 #if (defined(CSR_WIFI_SECURITY_WAPI_ENABLE) && defined(CSR_WIFI_SECURITY_WAPI_SW_ENCRYPTION))
1652 (priv->wapi_unicast_filter) && \
1661 unifi_trace(priv,
UDBG4,
"send_ma_pkt_request() - WAPI unicast data packet when USKID = 1 \n");
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);
1701 unifi_trace(priv,
UDBG2,
"send_ma_pkt_request: cmanrTestModeTransmitRate = %d TransmitRate=%d\n",
1713 transmissionControl,
1725 unifi_trace(priv,
UDBG3,
"leaving send_ma_pkt_request, UNITDATA result code = %d\n", r);
1772 tx_handler = send_ma_pkt_request;
1776 #ifdef CSR_WIFI_SECURITY_WAPI_ENABLE
1787 port_action = verify_port(priv
1794 "uf_net_xmit: %s controlled port open\n",
1798 result = tx_handler(priv, skb, &ehdr, priority);
1803 "uf_net_xmit: %s controlled port %s\n",
1805 interfacePriv->
stats.tx_dropped++;
1813 #if (defined(CSR_WIFI_SECURITY_WAPI_ENABLE) && defined(CSR_WIFI_SECURITY_WAPI_SW_ENCRYPTION))
1816 (priv->wapi_unicast_filter == 1)))
1822 interfacePriv->
stats.tx_packets++;
1824 interfacePriv->
stats.tx_bytes += skb->
len;
1834 interfacePriv->
stats.tx_packets++;
1836 interfacePriv->
stats.tx_bytes += skb->
len;
1838 }
else if (result < 0) {
1844 interfacePriv->
stats.tx_dropped++;
1845 unifi_trace(priv,
UDBG1,
"unifi_net_xmit: (Packet Drop), dropped count = %x\n", interfacePriv->
stats.tx_dropped);
1885 if (netif_running(priv->
netdev[i]))
1887 netif_stop_subqueue(priv->
netdev[i], (
u16)queue);
1891 #ifdef CSR_SUPPORT_SME
1893 routerStartBuffering(priv,queue);
1896 routerStartBuffering(priv,0);
1897 unifi_error(priv,
"Start buffering %d defaulting to 0\n", queue);
1915 if (netif_running(priv->
netdev[i]))
1917 netif_wake_subqueue(priv->
netdev[i], (
u16)queue);
1921 #ifdef CSR_SUPPORT_SME
1923 routerStopBuffering(priv,queue);
1924 uf_send_buffered_frames(priv,queue);
1926 routerStopBuffering(priv,0);
1927 uf_send_buffered_frames(priv,0);
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),
1965 unifi_notice(priv,
"indicate_rx_skb: Discard unknown frame.\n");
1974 if (r == 1 && sr == 1) {
1977 "API, not being given to kernel\n");
1982 dev = priv->
netdev[ifTag];
1993 unifi_error(priv,
"%s: oversize frame (%d > %d)\n",
2014 #ifdef CSR_WIFI_USE_NETIF_RX
2026 priv->
interfacePriv[ifTag]->stats.rx_bytes += bulkdata->d[0].data_length;
2035 int indicate,
u16 interfaceTag)
2041 static const CsrWifiMacAddress broadcast_address = {{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}};
2044 if (interfaceTag >= CSR_WIFI_NUM_INTERFACES) {
2045 unifi_error(priv,
"uf_process_rx_pending_queue bad interfaceTag\n");
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],
2076 "uf_process_rx_pending_queue: Was Blocked skb=%p, bulkdata=%p\n",
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);
2082 interfacePriv->
stats.rx_dropped++;
2112 #ifdef CSR_SUPPORT_WEXT
2116 if (interfaceTag >= CSR_WIFI_NUM_INTERFACES) {
2117 unifi_error(priv,
"uf_resume_data_plane bad interfaceTag\n");
2128 #ifdef CSR_SUPPORT_WEXT
2129 if (!interfacePriv->wait_netdev_change)
2132 #ifdef CONFIG_NET_SCHED
2133 if (netif_running(priv->
netdev[interfaceTag])) {
2134 netif_tx_schedule_all(priv->
netdev[interfaceTag]);
2187 if (interfaceTag >= CSR_WIFI_NUM_INTERFACES)
2216 toDs = (skb->
data[1] & 0x01) ? 1 : 0;
2217 fromDs = (skb->
data[1] & 0x02) ? 1 : 0;
2223 pData = &bulkdata->
d[0];
2225 frameType = ((frameControl & 0x000C) >> 2);
2227 dataFrameType =((frameControl & 0x00f0) >> 4);
2229 "%s: Receive Data Frame Type %d \n",
__FUNCTION__,dataFrameType);
2231 switch(dataFrameType)
2252 macHeaderLengthInBytes += 6;
2256 switch(dataFrameType)
2267 llc_snap_hdr_t *
snap;
2271 snap = (llc_snap_hdr_t *) (skb->
data + macHeaderLengthInBytes);
2274 ehdr.
h_proto = snap->protocol;
2280 unifi_trace(priv,
UDBG3,
"in unifi_rx protocol from snap header = 0x%x\n", proto);
2283 #ifdef CSR_WIFI_SECURITY_WAPI_ENABLE
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
2301 skb_pull(skb, macHeaderLengthInBytes);
2308 sa, priv->
netdev[interfaceTag]->dev_addr,
2316 CsrWifiRouterCtrlGetStationRecordFromPeerMacAddress(priv,sa,interfaceTag);
2321 if(srcStaInfo ==
NULL) {
2326 sa[0], sa[1],sa[2], sa[3], sa[4],sa[5]);
2338 unifi_trace(priv,
UDBG3,
"%s: Port is not open: unexpected frame from peer = %x:%x:%x:%x:%x:%x\n",
2342 interfacePriv->
stats.rx_dropped++;
2345 proto, queue ?
"Controlled" :
"Un-controlled");
2364 if(!(uf_ap_process_data_pdu(priv, skb, &ehdr, srcStaInfo,
2367 macHeaderLengthInBytes)))
2372 unifi_trace(priv,
UDBG5,
"unifi_rx: no specific AP handling process as normal frame, MAC Header len %d\n",macHeaderLengthInBytes);
2374 skb_pull(skb, macHeaderLengthInBytes);
2388 ((frameControl & 0x00f0) >> 4) !=
DATA_NULL) {
2389 unifi_trace(priv,
UDBG1,
"Zero length frame, but not null-data %04x\n", frameControl);
2398 interfacePriv->
stats.rx_dropped++;
2400 unifi_notice(priv,
"%s: Dropping packet, proto=0x%04x, %s port\n",
2401 __FUNCTION__, proto, queue ?
"controlled" :
"uncontrolled");
2405 (interfacePriv->
connected != UnifiConnected) ) {
2413 if (rx_q_item ==
NULL) {
2414 unifi_error(priv,
"%s: Failed to allocate %d bytes for rx packet record\n",
2416 interfacePriv->
stats.rx_dropped++;
2422 INIT_LIST_HEAD(&rx_q_item->
q);
2425 rx_q_item->
signal = *signal;
2447 indicate_rx_skb(priv, interfaceTag, da, sa, skb, signal, bulkdata);
2464 if (interfaceTag >= CSR_WIFI_NUM_INTERFACES)
2470 #ifdef CSR_SUPPORT_SME
2474 uf_process_ma_pkt_cfm_for_ap(priv,interfaceTag,pkt_cfm);
2519 u8 toDs, fromDs, frameType;
2522 #ifdef CSR_SUPPORT_SME
2523 u8 dataFrameType = 0;
2538 if (interfaceTag >= CSR_WIFI_NUM_INTERFACES)
2577 toDs = (skb->
data[1] & 0x01) ? 1 : 0;
2578 fromDs = (skb->
data[1] & 0x02) ? 1 : 0;
2581 memcpy(sa,(skb->
data+10+fromDs*(6+toDs*8)),ETH_ALEN);
2591 bssid = (
u8 *) (skb->
data + 4 + 12 - (fromDs * 6) - (toDs * 12));
2594 pData = &bulkdata->
d[0];
2596 frameType = ((frameControl & 0x000C) >> 2);
2601 #ifdef CSR_SUPPORT_SME
2604 if((frameControl & 0x00f0) == 0x00A0){
2606 u8 pmBit = (frameControl & 0x1000)?0x01:0x00;
2609 uf_process_ps_poll(priv,sa,da,pmBit,interfaceTag);
2626 #ifdef CSR_SUPPORT_SME
2630 srcStaInfo = CsrWifiRouterCtrlGetStationRecordFromPeerMacAddress(priv,sa,interfaceTag);
2632 if(srcStaInfo ==
NULL) {
2635 memcpy(peerMacAddress.
a,sa,ETH_ALEN);
2637 sa[0], sa[1],sa[2], sa[3], sa[4],sa[5]);
2652 pmBit = (frameControl & 0x1000)?0x01:0x00;
2653 powerSaveChanged = uf_process_pm_bit_for_peer(priv,srcStaInfo,pmBit,interfaceTag);
2656 srcStaInfo->activity_flag =
TRUE;
2661 dataFrameType = ((frameControl & 0x00f0) >> 4);
2679 uf_process_wmm_deliver_ac_uapsd(priv,srcStaInfo,qosControl,interfaceTag);
2686 if( ((frameControl & 0x00f0) >> 4) ==
QOS_DATA) {
2690 u8 ba_session_idx = 0;
2703 unifi_trace(priv,
UDBG6,
"found ba_session=0x%x ba_session_idx=%d", ba_session, ba_session_idx);
2707 frame_desc.
signal = *signal;
2711 process_ba_frame(priv, interfacePriv, ba_session, &frame_desc);
2713 process_ba_complete(priv, interfacePriv);
2718 if (ba_session_idx == MAX_SUPPORTED_BA_SESSIONS_RX){
2721 process_amsdu(priv, signal, bulkdata);
2725 unifi_rx(priv, signal, bulkdata);
2740 check_ba_frame_age_timeout(priv, interfacePriv, ba_session);
2744 process_ba_complete(priv, interfacePriv);
2766 uf_set_multicast_list(
struct net_device *dev)
2771 #ifdef CSR_NATIVE_LINUX
2787 "uf_set_multicast_list (count=%d)\n", mc_addr_count);
2831 netdev_mlme_event_handler(
ul_client_t *pcli,
const u8 *sig_packed,
int sig_len,
2842 if (sig_packed ==
NULL) {
2850 bulkdata = *bulkdata_o;
2860 "Netdev - Received unknown signal 0x%.4X.\n",
2873 process_ma_packet_error_ind(priv, &signal, &bulkdata);
2876 process_ma_packet_ind(priv, &signal, &bulkdata);
2879 process_ma_packet_cfm(priv, &signal, &bulkdata);
2881 #ifdef CSR_SUPPORT_SME
2935 #ifdef CSR_SUPPORT_WEXT
2960 static const CsrWifiMacAddress broadcast_address = {{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}};
2967 event, ptr, interfacePriv, netdev->
name);
2973 priv = interfacePriv->
privPtr;
2977 interfacePriv->wait_netdev_change ?
"" :
"not");
2979 if (interfacePriv->wait_netdev_change) {
2981 interfacePriv->
connected = UnifiConnected;
2982 interfacePriv->wait_netdev_change =
FALSE;
3006 u32 subframe_length, subframe_body_length, dot11_hdr_size;
3012 u8 *qos_control_ptr;
3015 qos_control_ptr = dot11_hdr_ptr + (((frameControl &
IEEE802_11_FC_TO_DS_MASK) && (frameControl & IEEE802_11_FC_FROM_DS_MASK))?30: 24);
3018 unifi_rx(priv, signal, bulkdata);
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))) {
3032 subframe_length =
sizeof(
struct ethhdr) + subframe_body_length;
3046 if ((frameControl & IEEE802_11_FC_TO_DS_MASK) && !(frameControl & IEEE802_11_FC_FROM_DS_MASK)){
3049 else if (!(frameControl & IEEE802_11_FC_TO_DS_MASK) && (frameControl & IEEE802_11_FC_FROM_DS_MASK)){
3051 ((
struct ethhdr*)ptr)->h_source,
3056 ptr +
sizeof(
struct ethhdr),
3057 subframe_body_length);
3059 unifi_rx(priv, signal, &subframe_bulkdata);
3061 subframe_length = (subframe_length + 3)&(~0x3);
3062 ptr += subframe_length;
3063 offset += subframe_length;
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,
3104 for(j = 0; j < gap && j < ba_session->
wind_size; j++) {
3108 add_frame_to_ba_complete(priv, interfacePriv, &ba_session->
buffer[i]);
3120 static void complete_ready_sequence(
unifi_priv_t *priv,
3128 add_frame_to_ba_complete(priv, interfacePriv, &ba_session->
buffer[i]);
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,
3156 if(((sn - ba_session->
expected_sn) & 0xFFF) <= 2048) {
3165 if(!(((sn - sn_temp) & 0xFFF) > 2048)) {
3166 u16 new_expected_sn;
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);
3176 add_frame_to_ba_complete(priv, interfacePriv, frame_desc);
3190 add_frame_to_ba_complete(priv, interfacePriv, frame_desc);
3207 u16 sn = frame_desc->
sn;
3214 i = consume_frame_or_get_buffer_index(priv, interfacePriv, ba_session, sn, frame_desc);
3217 ba_session->
buffer[
i] = *frame_desc;
3223 complete_ready_sequence(priv, interfacePriv, ba_session);
3246 static void check_ba_frame_age_timeout(
unifi_priv_t *priv,
3271 for(j = 0; j < ba_session->
wind_size; j++)
3277 unifi_trace(priv,
UDBG6,
"check age at slot index = %d sn = %d recv_time = %u now = %u\n",
3295 unifi_trace(priv,
UDBG2,
"release the frame at index = %d gap = %d expected_sn = %d sn = %d\n",
3306 add_frame_to_ba_complete(priv, interfacePriv, &ba_session->
buffer[i]);
3308 complete_ready_sequence(priv, interfacePriv, ba_session);
3316 sn_temp = (sn_temp + 1) & 0xFFF;
3330 u8 ba_session_idx = 0;
3340 if (interfaceTag >= CSR_WIFI_NUM_INTERFACES)
3342 unifi_error(priv,
"%s: MaPacketErrorIndication indication with bad interfaceTag %d\n",
__FUNCTION__, interfaceTag);
3349 if(UserPriority > 15) {
3350 unifi_error(priv,
"%s: MaPacketErrorIndication indication with bad UserPriority=%d\n",
__FUNCTION__, UserPriority);
3371 process_ba_complete(priv, interfacePriv);