59 unsigned char *sigdata,
int siglen,
100 u16 frmCtrl, receptionStatus, frmCtrlSubType;
104 u8 isProtocolVerInvalid =
FALSE;
105 u8 isDataFrameSubTypeNoData =
FALSE;
107 #ifdef CSR_WIFI_SECURITY_WAPI_ENABLE
108 static const u8 wapiProtocolIdSNAPHeader[] = {0x88,0xb4};
109 static const u8 wapiProtocolIdSNAPHeaderOffset = 6;
114 #ifdef CSR_WIFI_SECURITY_WAPI_QOSCTRL_MIC_WORKAROUND
118 u8 llcSnapHeaderOffset = 0;
124 isWapiUnicastPkt = (!(destAddr[0] & 0x01)) ?
TRUE :
FALSE;
127 #define CSR_WIFI_MA_PKT_IND_RECEPTION_STATUS_OFFSET sizeof(CSR_SIGNAL_PRIMITIVE_HEADER) + 22
129 *freeBulkData =
FALSE;
148 isDataFrameSubTypeNoData = (((frmCtrlSubType>0x03)&&(frmCtrlSubType<0x08)) || (frmCtrlSubType>0x0B)) ?
TRUE :
FALSE;
150 ((!isDataFrame) || isProtocolVerInvalid || (isDataFrame && isDataFrameSubTypeNoData))) {
154 *freeBulkData =
TRUE;
155 unifi_trace(priv,
UDBG4,
"Discarding this frame and ignoring the MIC failure as this is a garbage/non-data/no data frame\n");
159 #ifdef CSR_WIFI_SECURITY_WAPI_ENABLE
165 #ifdef CSR_WIFI_SECURITY_WAPI_QOSCTRL_MIC_WORKAROUND
168 (priv->isWapiConnection))
172 unifi_trace(priv,
UDBG4,
"check_routing_pkt_data_ind() :: Value of the QoS control field - 0x%04x \n", qosControl);
174 if (qosControl & IEEE802_11_QC_NON_TID_BITS_MASK)
176 unifi_trace(priv,
UDBG4,
"Ignore the MIC failure and pass the MPDU to the stack when any of bits [4-15] is set in the QoS control field\n");
185 *freeBulkData =
FALSE;
196 #ifndef CSR_WIFI_SECURITY_WAPI_SW_ENCRYPTION
197 if ((priv->wapi_multicast_filter == 0) || isWapiUnicastPkt) {
201 if ( ((priv->wapi_multicast_filter == 0) && !isWapiUnicastPkt) ||
202 ((priv->wapi_unicast_filter == 0) && isWapiUnicastPkt) ) {
205 *freeBulkData =
TRUE;
206 unifi_trace(priv,
UDBG4,
"Discarding the contents of the frame with MIC failure \n");
208 if (isWapiUnicastPkt &&
210 #ifndef CSR_WIFI_SECURITY_WAPI_SW_ENCRYPTION
211 (priv->wapi_unicast_filter) ||
213 (priv->wapi_unicast_queued_pkt_filter))) {
222 unifi_trace(priv,
UDBG4,
"Ignoring the MIC failure as either a. CONTROL PORT isn't OPEN or b. Unicast filter is set or c. WAPI AP using old key for buffered pkts\n");
229 unifi_trace(priv,
UDBG6,
"check_routing_pkt_data_ind - MIC FAILURE : interfaceTag %x Src Addr %x:%x:%x:%x:%x:%x\n",
230 interfaceTag, srcAddr[0], srcAddr[1], srcAddr[2], srcAddr[3], srcAddr[4], srcAddr[5]);
231 unifi_trace(priv,
UDBG6,
"check_routing_pkt_data_ind - MIC FAILURE : Dest Addr %x:%x:%x:%x:%x:%x\n",
232 destAddr[0], destAddr[1], destAddr[2], destAddr[3], destAddr[4], destAddr[5]);
233 unifi_trace(priv,
UDBG6,
"check_routing_pkt_data_ind - MIC FAILURE : Control Port State - 0x%.4X \n",
244 *freeBulkData =
TRUE;
251 *freeBulkData =
TRUE;
260 "Mgt" :
"Ctrl/Data");
262 #ifdef CSR_WIFI_SECURITY_WAPI_ENABLE
269 (priv->wapi_unicast_queued_pkt_filter==1)) {
271 unifi_trace(priv,
UDBG6,
"check_routing_pkt_data_ind(): WAPI unicast pkt received when the (wapi_unicast_queued_pkt_filter) is set\n");
274 switch(frmCtrl & IEEE80211_FC_SUBTYPE_MASK) {
286 if (llcSnapHeaderOffset > 0) {
288 unifi_trace(priv,
UDBG6,
"check_routing_pkt_data_ind(): SNAP header found & its offset %d\n",llcSnapHeaderOffset);
289 if (
memcmp((
u8 *)(bulkdata->
d[0].
os_data_ptr+llcSnapHeaderOffset+wapiProtocolIdSNAPHeaderOffset),
290 wapiProtocolIdSNAPHeader,
sizeof(wapiProtocolIdSNAPHeader))) {
292 unifi_trace(priv,
UDBG6,
"check_routing_pkt_data_ind(): This is a data & NOT a WAI protocol packet\n");
294 priv->wapi_unicast_queued_pkt_filter = 0;
295 unifi_trace(priv,
UDBG4,
"check_routing_pkt_data_ind(): WAPI AP has started using the new unicast key, no more MIC failures expected (reset filter)\n");
298 unifi_trace(priv,
UDBG6,
"check_routing_pkt_data_ind(): WAPI - This is a WAI protocol packet\n");
307 *freeBulkData =
TRUE;
313 u8 *pSsid, *pSsidLen;
317 pSsid = pSsidLen + 2;
325 unifi_trace(priv,
UDBG6,
"Received a Legacy AP beacon in P2P mode, drop it\n");
331 *freeBulkData =
FALSE;
334 unifi_error(priv,
"Unhandled frame type %04x\n", frmCtrl);
335 *freeBulkData =
TRUE;
369 unifi_process_receive_event(
void *ospriv,
370 u8 *sigdata,
u32 siglen,
382 "%04x %04x %04x %04x %04x %04x %04x %04x (%d)\n",
402 #define CSR_MA_PACKET_INDICATION_INTERFACETAG_OFFSET 14
411 #ifdef CSR_SUPPORT_SME
418 "Updating sta activity in IBSS interfaceTag %x Src Addr %x:%x:%x:%x:%x:%x\n",
419 interfaceTag, saddr[0], saddr[1], saddr[2], saddr[3], saddr[4], saddr[5]);
421 uf_update_sta_activity(priv, interfaceTag, saddr);
425 pktIndToSme = check_routing_pkt_data_ind(priv, sigdata, bulkdata, &freeBulkData, interfacePriv);
427 unifi_trace(priv,
UDBG6,
"RX: packet entry point to driver from HIP,pkt to SME ?(%s) \n", (pktIndToSme)?
"YES":
"NO");
434 if(sigdata !=
NULL && bulkdata !=
NULL){
435 send_to_client(priv, priv->
sme_cli, receiver_id, sigdata, siglen, bulkdata);
438 unifi_error(priv,
"unifi_receive_event2: sigdata or Bulkdata is NULL \n");
440 #ifdef CSR_NATIVE_LINUX
441 send_to_client(priv, priv->wext_client,
443 sigdata, siglen, bulkdata);
456 send_to_client(priv, priv->
sme_cli, receiver_id, sigdata, siglen, bulkdata);
457 #ifdef CSR_NATIVE_LINUX
458 send_to_client(priv, priv->wext_client,
460 sigdata, siglen, bulkdata);
466 #if (defined(CSR_SUPPORT_SME) && defined(CSR_WIFI_SECURITY_WAPI_ENABLE))
467 #define CSR_MA_PACKET_INDICATION_RECEPTION_STATUS_OFFSET sizeof(CSR_SIGNAL_PRIMITIVE_HEADER) + 22
480 if ((!freeBulkData) &&
483 ((priv->wapi_multicast_filter == 1)
484 #ifdef CSR_WIFI_SECURITY_WAPI_SW_ENCRYPTION
485 || (priv->wapi_unicast_filter == 1)
492 u16 interfaceTag = 0;
495 unifi_trace(priv,
UDBG6,
"Received a WAPI data packet when the Unicast/Multicast filter is set\n");
498 unifi_error(priv,
"Received unknown or corrupted signal (0x%x).\n",
505 isMcastPkt = (destAddr[0] & 0x01) ?
TRUE :
FALSE;
507 "1.MPDU type: (%s), 2.Multicast filter: (%s), 3. Unicast filter: (%s)\n",
508 ((isMcastPkt) ?
"Multiast":
"Unicast"),
509 ((priv->wapi_multicast_filter) ?
"Enabled":
"Disabled"),
510 ((priv->wapi_unicast_filter) ?
"Enabled":
"Disabled"));
512 if (((isMcastPkt) && (priv->wapi_multicast_filter == 1))
513 #ifdef CSR_WIFI_SECURITY_WAPI_SW_ENCRYPTION
514 || ((!isMcastPkt) && (priv->wapi_unicast_filter == 1))
544 unifi_trace(priv,
UDBG6,
"Call the registered clients handler callback func\n");
545 send_to_client(priv, &priv->
ul_clients[client_id],
547 sigdata, siglen, bulkdata);
557 #ifdef UNIFI_SNIFF_ARPHRD
558 case CSR_MA_SNIFFDATA_INDICATION_ID:
580 #ifdef CSR_WIFI_RX_PATH_SPLIT
583 return (((priv->rxSignalBuffer.writePointer + 1)% priv->rxSignalBuffer.size) == (priv->rxSignalBuffer.readPointer));
592 priv->rxSignalBuffer.readPointer,priv->rxSignalBuffer.writePointer);
594 u8 readPointer = priv->rxSignalBuffer.readPointer;
595 while (readPointer != priv->rxSignalBuffer.writePointer)
597 rx_buff_struct_t *
buf = &priv->rxSignalBuffer.rx_buff[readPointer];
599 readPointer,priv->rxSignalBuffer.writePointer);
600 unifi_process_receive_event(priv, buf->bufptr, buf->sig_len, &buf->data_ptrs);
602 if(readPointer >= priv->rxSignalBuffer.size) {
606 priv->rxSignalBuffer.readPointer = readPointer;
650 u8 *sigdata,
u32 siglen,
653 #ifdef CSR_WIFI_RX_PATH_SPLIT
657 rx_buff_struct_t * rx_buff;
661 "%04x %04x %04x %04x %04x %04x %04x %04x (%d)\n",
670 if(signal_buffer_is_full(priv)) {
671 unifi_error(priv,
"TO HOST signal queue FULL dropping the PDU\n");
679 writePointer = priv->rxSignalBuffer.writePointer;
680 rx_buff = &priv->rxSignalBuffer.rx_buff[writePointer];
681 memcpy(rx_buff->bufptr,sigdata,siglen);
682 rx_buff->sig_len = siglen;
683 rx_buff->data_ptrs = *bulkdata;
685 if(writePointer >= priv->rxSignalBuffer.size) {
688 unifi_trace(priv,
UDBG4,
"unifi_receive_event:writePtr = %d\n",priv->rxSignalBuffer.writePointer);
689 priv->rxSignalBuffer.writePointer = writePointer;
691 #ifndef CSR_WIFI_RX_PATH_SPLIT_DONT_USE_WQ
692 queue_work(priv->rx_workqueue, &priv->rx_work_struct);
696 unifi_process_receive_event(ospriv, sigdata, siglen, bulkdata);