2 ** $Id: //Department/DaVinci/BRANCHES/MT662X_593X_WIFI_DRIVER_V2_3/common/wlan_bow.c#1 $
6 \brief This file contains the 802.11 PAL commands processing routines for
7 MediaTek Inc. 802.11 Wireless LAN Adapters.
10 /******************************************************************************
11 * Copyright (c) 2007 MediaTek Inc.
13 * All rights reserved. Copying, compilation, modification, distribution
14 * or any other use whatsoever of this material is strictly prohibited
15 * except in accordance with a Software License Agreement with
17 *******************************************************************************
20 /******************************************************************************
23 * BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND
24 * AGREES THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK
25 * SOFTWARE") RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE
26 * PROVIDED TO BUYER ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY
27 * DISCLAIMS ANY AND ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT
28 * LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
29 * PARTICULAR PURPOSE OR NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE
30 * ANY WARRANTY WHATSOEVER WITH RESPECT TO THE SOFTWARE OF ANY THIRD PARTY
31 * WHICH MAY BE USED BY, INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK
32 * SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY
33 * WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE
34 * FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S SPECIFICATION OR TO
35 * CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
37 * BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
38 * LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL
39 * BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT
40 * ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY
41 * BUYER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
43 * THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
44 * WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT
45 * OF LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING
46 * THEREOF AND RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN
47 * FRANCISCO, CA, UNDER THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE
49 *******************************************************************************
57 * Sync CFG80211 modification from branch 2,2.
59 * 01 16 2012 chinghwa.yu
60 * [WCXRP00000065] Update BoW design and settings
61 * Support BOW for 5GHz band.
63 * 01 09 2012 chinghwa.yu
64 * [WCXRP00000065] Update BoW design and settings
65 * [ALPS00110632] [Rose][LCA42][Cross Feature][Bluetooth]The "KE" pops up after the device reboots automatically.(once)
67 * Fix bow link disconnected event dereference.
71 * Change the function prototype of rlmDomainGetChnlList()
74 * [WCXRP00000735] [MT6620 Wi-Fi][BoW][FW/Driver] Protect BoW connection establishment
75 * Improve BoW connection establishment speed.
78 * [WCXRP00000798] [MT6620 Wi-Fi][Firmware] Follow-ups for WAPI frequency offset workaround in firmware SCN module
79 * change parameter name from PeerAddr to BSSID
87 * Add BoW Rate Limitation.
90 * [WCXRP00000798] [MT6620 Wi-Fi][Firmware] Follow-ups for WAPI frequency offset workaround in firmware SCN module
91 * 1. specify target's BSSID when requesting channel privilege.
92 * 2. pass BSSID information to firmware domain
96 * Add BoW 11N support.
99 * [WCXRP00000681] [MT5931][Firmware] HIF code size reduction
100 * aware more compile options.
102 * 05 25 2011 terry.wu
103 * [WCXRP00000735] [MT6620 Wi-Fi][BoW][FW/Driver] Protect BoW connection establishment
104 * Add BoW Cancel Scan Request and Turn On deactive network function.
106 * 05 23 2011 terry.wu
107 * [WCXRP00000735] [MT6620 Wi-Fi][BoW][FW/Driver] Protect BoW connection establishment
108 * Add some BoW error handling.
110 * 05 22 2011 terry.wu
111 * [WCXRP00000735] [MT6620 Wi-Fi][BoW][FW/Driver] Protect BoW connection establishment
114 * 05 22 2011 terry.wu
115 * [WCXRP00000735] [MT6620 Wi-Fi][BoW][FW/Driver] Protect BoW connection establishment
116 * Only reply probe response to its peer or mached SSID for BoW AP.
118 * 05 22 2011 terry.wu
119 * [WCXRP00000735] [MT6620 Wi-Fi][BoW][FW/Driver] Protect BoW connection establishment
120 * Add BoW SAA retry and disable disconnect event when AAA fail .
122 * 05 21 2011 terry.wu
123 * [WCXRP00000735] [MT6620 Wi-Fi][BoW][FW/Driver] Protect BoW connection establishment
124 * Protect BoW connection establishment.
126 * 05 17 2011 terry.wu
127 * [WCXRP00000730] [MT6620 Wi-Fi][BoW] Send deauth while disconnecting
128 * Send deauth while disconnecting BoW link.
130 * 05 17 2011 terry.wu
131 * [WCXRP00000707] [MT6620 Wi-Fi][Driver] Fix BoW Multiple Physical Link connect/disconnect issue
132 * Fix wrong StaRec state of BoW .
134 * 05 06 2011 terry.wu
135 * [WCXRP00000707] [MT6620 Wi-Fi][Driver] Fix BoW Multiple Physical Link connect/disconnect issue
136 * Fix BoW Multiple Physical Link connect/disconnect issue.
138 * 05 03 2011 chinghwa.yu
139 * [WCXRP00000065] Update BoW design and settings
140 * Use kalMemAlloc to allocate event buffer for kalIndicateBOWEvent.
142 * 04 15 2011 chinghwa.yu
143 * [WCXRP00000065] Update BoW design and settings
144 * Fix prAssocRspSwRfb casting.
146 * 04 15 2011 chinghwa.yu
147 * [WCXRP00000065] Update BoW design and settings
148 * Add BOW short range mode.
150 * 04 12 2011 chinghwa.yu
151 * [WCXRP00000065] Update BoW design and settings
152 * Add WMM IE for BOW initiator data.
154 * 04 10 2011 chinghwa.yu
155 * [WCXRP00000065] Update BoW design and settings
156 * Change Link disconnection event procedure for hotspot and change skb length check to 1514 bytes.
158 * 04 09 2011 chinghwa.yu
159 * [WCXRP00000065] Update BoW design and settings
160 * Change Link connection event procedure and change skb length check to 1512 bytes.
162 * 03 28 2011 chinghwa.yu
163 * [WCXRP00000065] Update BoW design and settings
164 * Simplify link disconnected routine, remove link disconnected other routine.
166 * 03 27 2011 chinghwa.yu
167 * [WCXRP00000065] Update BoW design and settings
168 * Support multiple physical link.
170 * 03 27 2011 chinghwa.yu
171 * [WCXRP00000065] Update BoW design and settings
172 * Add new feature - multiple physical link support.
175 * [WCXRP00000486] [MT6620 Wi-Fi][BOW] Fixed the bow send frame but not encrypted issue
176 * fixed the BOW packet sending without encrypted issue.
178 * 02 21 2011 chinghwa.yu
179 * [WCXRP00000065] Update BoW design and settings
180 * Fix BOW link disconnection bug.
182 * 02 16 2011 chinghwa.yu
183 * [WCXRP00000065] Update BoW design and settings
184 * Add bowNotifyAllLinkDisconnected interface and change channel grant procedure for bow starting.
186 * 02 11 2011 chinghwa.yu
187 * [WCXRP00000065] Update BoW design and settings
188 * Update BOW channel granted function.
190 * 02 10 2011 chinghwa.yu
191 * [WCXRP00000065] Update BoW design and settings
192 * Fix kernel API change issue.
193 * Before ALPS 2.2 (2.2 included), kfifo_alloc() is
194 * struct kfifo *kfifo_alloc(unsigned int size, gfp_t gfp_mask, spinlock_t *lock);
195 * After ALPS 2.3, kfifo_alloc() is changed to
196 * int kfifo_alloc(struct kfifo *fifo, unsigned int size, gfp_t gfp_mask);
199 * [WCXRP00000430] [MT6620 Wi-Fi][Firmware][Driver] Create V1.2 branch for MT6620E1 and MT6620E3
200 * create V1.2 driver branch based on label MT6620_WIFI_DRIVER_V1_2_110209_1031
201 * with BOW and P2P enabled as default
203 * 02 08 2011 chinghwa.yu
204 * [WCXRP00000065] Update BoW design and settings
205 * Replace kfifo_get and kfifo_put with kfifo_out and kfifo_in.
206 * Update BOW get MAC status, remove returning event for AIS network type.
208 * 01 26 2011 cm.chang
209 * [WCXRP00000395] [MT6620 Wi-Fi][Driver][FW] Search STA_REC with additional net type index argument
212 * 01 11 2011 chinghwa.yu
213 * [WCXRP00000065] Update BoW design and settings
214 * Update BOW Activity Report structure and bug fix.
216 * 01 10 2011 chinghwa.yu
217 * [WCXRP00000065] Update BoW design and settings
218 * Update BOW to support multiple physical link.
220 * 12 08 2010 chinghwa.yu
221 * [WCXRP00000065] Update BoW design and settings
222 * Support concurrent networks.
224 * 12 07 2010 cm.chang
225 * [WCXRP00000239] MT6620 Wi-Fi][Driver][FW] Merge concurrent branch back to maintrunk
226 * 1. BSSINFO include RLM parameter
227 * 2. free all sta records when network is disconnected
229 * 11 11 2010 chinghwa.yu
230 * [WCXRP00000065] Update BoW design and settings
231 * Fix BoW timer assert issue.
233 * 10 18 2010 chinghwa.yu
234 * [WCXRP00000110] [MT6620 Wi-Fi] [Driver] Fix BoW Connected event size
235 * Fix for event returnning Band.
237 * 10 18 2010 chinghwa.yu
238 * [WCXRP00000110] [MT6620 Wi-Fi] [Driver] Fix BoW Connected event size
239 * Fix wrong BoW event size.
242 * [WCXRP00000077] [MT6620 Wi-Fi][Driver][FW] Eliminate use of ENUM_NETWORK_TYPE_T and replaced by ENUM_NETWORK_TYPE_INDEX_T only
243 * remove ENUM_NETWORK_TYPE_T definitions
245 * 09 27 2010 chinghwa.yu
246 * [WCXRP00000063] Update BCM CoEx design and settings[WCXRP00000065] Update BoW design and settings
247 * Update BCM/BoW design and settings.
249 * 09 16 2010 chinghwa.yu
251 * Fix bowResponderScanDone error when prBssDesc is NULL.
253 * 09 14 2010 chinghwa.yu
255 * Add bowRunEventAAAComplete.
259 * indicate correct AIS network information for PAL.
261 * 09 03 2010 kevin.huang
263 * Refine #include sequence and solve recursive/nested #include issue
265 * 08 24 2010 cm.chang
267 * Support RLM initail channel of Ad-hoc, P2P and BOW
269 * 08 24 2010 chinghwa.yu
271 * Initialize nicActivateNetwork(prAdapter as soon as bow is starting..
273 * 08 24 2010 chinghwa.yu
275 * Update BOW for the 1st time.
279 * revise constant definitions to be matched with implementation (original cmd-event definition is deprecated)
283 * 1) BoW wrapper: use definitions instead of hard-coded constant for error code
284 * 2) AIS-FSM: eliminate use of desired RF parameters, use prTargetBssDesc instead
285 * 3) add handling for RX_PKT_DESTINATION_HOST_WITH_FORWARD for GO-broadcast frames
289 * sync. bluetooth-over-Wi-Fi interface to driver interface document v0.2.6.
293 * [WPD00003833] [MT6620 and MT5931] Driver migration - move to new repository.
296 * [WPD00003833][MT6620 and MT5931] Driver migration
297 * add API in que_mgt to retrieve sta-rec index for security frames.
300 * [WPD00003833][MT6620 and MT5931] Driver migration
301 * 802.1x and bluetooth-over-Wi-Fi security frames are now delievered to firmware via command path instead of data path.
304 * [WPD00003833][MT6620 and MT5931] Driver migration
305 * 1) migrate assoc.c.
306 * 2) add ucTxSeqNum for tracking frames which needs TX-DONE awareness
307 * 3) add configuration options for CNM_MEM and RSN modules
308 * 4) add data path for management frames
309 * 5) eliminate rPacketInfo of MSDU_INFO_T
311 * 06 06 2010 kevin.huang
312 * [WPD00003832][MT6620 5931] Create driver base
313 * [MT6620 5931] Create driver base
316 * [WPD00003831][MT6620 Wi-Fi] Add framework for Wi-Fi Direct support
317 * 1) add timeout handler mechanism for pending command packets
318 * 2) add p2p add/removal key
321 * [WPD00001943]Create WiFi test driver framework on WinXP
322 * add NULL OID implementation for WOL-related OIDs.
325 * [WPD00003823][MT6620 Wi-Fi] Add Bluetooth-over-Wi-Fi support
326 * 1) all BT physical handles shares the same RSSI/Link Quality.
327 * 2) simplify BT command composing
330 * [WPD00003823][MT6620 Wi-Fi] Add Bluetooth-over-Wi-Fi support
331 * change prefix for data structure used to communicate with 802.11 PAL
332 * to avoid ambiguous naming with firmware interface
335 * [WPD00003823][MT6620 Wi-Fi] Add Bluetooth-over-Wi-Fi support
336 * add multiple physical link support
339 * [WPD00001943]Create WiFi test driver framework on WinXP
340 * information buffer for query oid/ioctl is now buffered in prCmdInfo
341 * instead of glue-layer variable to improve multiple oid/ioctl capability
344 * [WPD00003823][MT6620 Wi-Fi] Add Bluetooth-over-Wi-Fi support
345 * add framework for BT-over-Wi-Fi support.
346 * * 1) prPendingCmdInfo is replaced by queue for multiple handler capability
347 * * 2) command sequence number is now increased atomically
348 * * 3) private data could be hold and taken use for other purpose
352 /******************************************************************************
353 * C O M P I L E R F L A G S
354 *******************************************************************************
357 /******************************************************************************
358 * E X T E R N A L R E F E R E N C E S
359 *******************************************************************************
363 #if CFG_ENABLE_BT_OVER_WIFI
366 extern UINT_32 g_arBowRevPalPacketTime[32];
370 /******************************************************************************
372 *******************************************************************************
375 /******************************************************************************
377 *******************************************************************************
380 /******************************************************************************
381 * P U B L I C D A T A
382 *******************************************************************************
385 static UINT_32 g_u4LinkCount = 0;
386 static UINT_32 g_u4Beaconing = 0;
387 static BOW_TABLE_T arBowTable[CFG_BOW_PHYSICAL_LINK_NUM];
389 /******************************************************************************
390 * P R I V A T E D A T A
391 *******************************************************************************
394 const BOW_CMD_T arBowCmdTable[] = {
395 {BOW_CMD_ID_GET_MAC_STATUS, bowCmdGetMacStatus},
396 {BOW_CMD_ID_SETUP_CONNECTION, bowCmdSetupConnection},
397 {BOW_CMD_ID_DESTROY_CONNECTION, bowCmdDestroyConnection},
398 {BOW_CMD_ID_SET_PTK, bowCmdSetPTK},
399 {BOW_CMD_ID_READ_RSSI, bowCmdReadRSSI},
400 {BOW_CMD_ID_READ_LINK_QUALITY, bowCmdReadLinkQuality},
401 {BOW_CMD_ID_SHORT_RANGE_MODE, bowCmdShortRangeMode},
402 {BOW_CMD_ID_GET_CHANNEL_LIST, bowCmdGetChannelList},
405 /******************************************************************************
407 *******************************************************************************
410 /******************************************************************************
411 * F U N C T I O N D E C L A R A T I O N S
412 *******************************************************************************
415 /******************************************************************************
417 *******************************************************************************
420 /*----------------------------------------------------------------------------*/
422 * \brief command packet generation utility
424 * \param[in] prAdapter Pointer to the Adapter structure.
425 * \param[in] ucCID Command ID
426 * \param[in] fgSetQuery Set or Query
427 * \param[in] fgNeedResp Need for response
428 * \param[in] pfCmdDoneHandler Function pointer when command is done
429 * \param[in] u4SetQueryInfoLen The length of the set/query buffer
430 * \param[in] pucInfoBuffer Pointer to set/query buffer
433 * \retval WLAN_STATUS_PENDING
434 * \retval WLAN_STATUS_FAILURE
436 /*----------------------------------------------------------------------------*/
438 wlanoidSendSetQueryBowCmd (
439 IN P_ADAPTER_T prAdapter,
441 IN BOOLEAN fgSetQuery,
442 IN BOOLEAN fgNeedResp,
443 IN PFN_CMD_DONE_HANDLER pfCmdDoneHandler,
444 IN PFN_CMD_TIMEOUT_HANDLER pfCmdTimeoutHandler,
445 IN UINT_32 u4SetQueryInfoLen,
446 IN PUINT_8 pucInfoBuffer,
447 IN UINT_8 ucSeqNumber
450 P_GLUE_INFO_T prGlueInfo;
451 P_CMD_INFO_T prCmdInfo;
452 P_WIFI_CMD_T prWifiCmd;
457 prGlueInfo = prAdapter->prGlueInfo;
460 DBGLOG(REQ, TRACE, ("Command ID = 0x%08X\n", ucCID));
462 prCmdInfo = cmdBufAllocateCmdInfo(prAdapter, (CMD_HDR_SIZE + u4SetQueryInfoLen));
465 DBGLOG(INIT, ERROR, ("Allocate CMD_INFO_T ==> FAILED.\n"));
466 return WLAN_STATUS_FAILURE;
469 // increase command sequence number
470 ucCmdSeqNum = nicIncreaseCmdSeqNum(prAdapter);
471 DBGLOG(REQ, TRACE, ("ucCmdSeqNum =%d\n", ucCmdSeqNum));
473 // Setup common CMD Info Packet
474 prCmdInfo->eCmdType = COMMAND_TYPE_NETWORK_IOCTL;
475 prCmdInfo->eNetworkType = NETWORK_TYPE_BOW_INDEX;
476 prCmdInfo->u2InfoBufLen = (UINT_16)(CMD_HDR_SIZE + u4SetQueryInfoLen);
477 prCmdInfo->pfCmdDoneHandler = pfCmdDoneHandler;
478 prCmdInfo->pfCmdTimeoutHandler = pfCmdTimeoutHandler;
479 prCmdInfo->fgIsOid = FALSE;
480 prCmdInfo->ucCID = ucCID;
481 prCmdInfo->fgSetQuery = fgSetQuery;
482 prCmdInfo->fgNeedResp = fgNeedResp;
483 prCmdInfo->fgDriverDomainMCR = FALSE;
484 prCmdInfo->ucCmdSeqNum = ucCmdSeqNum;
485 prCmdInfo->u4SetInfoLen = u4SetQueryInfoLen;
486 prCmdInfo->pvInformationBuffer = NULL;
487 prCmdInfo->u4InformationBufferLength = 0;
488 prCmdInfo->u4PrivateData = (UINT_32) ucSeqNumber;
490 // Setup WIFI_CMD_T (no payload)
491 prWifiCmd = (P_WIFI_CMD_T)(prCmdInfo->pucInfoBuffer);
492 prWifiCmd->u2TxByteCount_UserPriority = prCmdInfo->u2InfoBufLen;
493 prWifiCmd->ucCID = prCmdInfo->ucCID;
494 prWifiCmd->ucSetQuery = prCmdInfo->fgSetQuery;
495 prWifiCmd->ucSeqNum = prCmdInfo->ucCmdSeqNum;
497 if(u4SetQueryInfoLen > 0 && pucInfoBuffer != NULL) {
498 kalMemCopy(prWifiCmd->aucBuffer, pucInfoBuffer, u4SetQueryInfoLen);
501 // insert into prCmdQueue
502 kalEnqueueCommand(prGlueInfo, (P_QUE_ENTRY_T)prCmdInfo);
504 // wakeup txServiceThread later
505 GLUE_SET_EVENT(prGlueInfo);
506 return WLAN_STATUS_PENDING;
509 /*----------------------------------------------------------------------------*/
511 * \brief This routine is called to dispatch command coming from 802.11 PAL
513 * \param[in] prAdapter Pointer to the Adapter structure.
514 * \param[in] prCmd Pointer to the buffer that holds the command
516 * \retval WLAN_STATUS_SUCCESS
517 * \retval WLAN_STATUS_INVALID_LENGTH
519 /*----------------------------------------------------------------------------*/
521 wlanbowHandleCommand(
522 IN P_ADAPTER_T prAdapter,
523 IN P_AMPC_COMMAND prCmd
526 WLAN_STATUS retval = WLAN_STATUS_FAILURE;
531 for (i = 0; i < sizeof(arBowCmdTable) / sizeof(BOW_CMD_T); i++) {
532 if ((arBowCmdTable[i].uCmdID == prCmd->rHeader.ucCommandId) &&
533 arBowCmdTable[i].pfCmdHandle) {
534 retval = arBowCmdTable[i].pfCmdHandle(prAdapter, prCmd);
543 /*----------------------------------------------------------------------------*/
545 * \brief This is command handler for BOW_CMD_ID_GET_MAC_STATUS
546 * coming from 802.11 PAL
548 * \param[in] prAdapter Pointer to the Adapter structure.
549 * \param[in] prCmd Pointer to the buffer that holds the command
551 * \retval WLAN_STATUS_SUCCESS
552 * \retval WLAN_STATUS_INVALID_LENGTH
554 /*----------------------------------------------------------------------------*/
557 IN P_ADAPTER_T prAdapter,
558 IN P_AMPC_COMMAND prCmd
561 P_AMPC_EVENT prEvent;
562 P_BOW_MAC_STATUS prMacStatus;
564 UINT_8 ucPrimaryChannel;
566 ENUM_CHNL_EXT_T eBssSCO;
567 UINT_8 ucNumOfChannel = 0;//MAX_BOW_NUMBER_OF_CHANNEL;
569 RF_CHANNEL_INFO_T aucChannelList[MAX_BOW_NUMBER_OF_CHANNEL];
573 //3 <1> If LinkCount != 0 -> OK (optional)
576 eBssSCO = CHNL_EXT_SCN;
579 prEvent = (P_AMPC_EVENT) kalMemAlloc((sizeof(AMPC_EVENT) + sizeof(BOW_MAC_STATUS)), VIR_MEM_TYPE);
581 prEvent->rHeader.ucEventId = BOW_EVENT_ID_MAC_STATUS;
582 prEvent->rHeader.ucSeqNumber = prCmd->rHeader.ucSeqNumber;
583 prEvent->rHeader.u2PayloadLength = sizeof(BOW_MAC_STATUS);
586 prMacStatus = (P_BOW_MAC_STATUS)(prEvent->aucPayload);
587 kalMemZero(prMacStatus, sizeof(BOW_MAC_STATUS));
589 //3 <2> Call CNM to decide if BOW available.
590 if (cnmBowIsPermitted(prAdapter))
592 prMacStatus->ucAvailability = TRUE;
596 prMacStatus->ucAvailability = FALSE;
599 memcpy(prMacStatus->aucMacAddr, prAdapter->rWifiVar.aucDeviceAddress, PARAM_MAC_ADDR_LEN);
601 if (cnmPreferredChannel(prAdapter, &eBand, &ucPrimaryChannel, &eBssSCO))
604 DBGLOG(BOW, EVENT, ("bowCmdGetMacStatus, Get preferred channel.\n"));
607 prMacStatus->ucNumOfChannel = 1;
608 prMacStatus->arChannelList[0].ucChannelBand = eBand;
609 prMacStatus->arChannelList[0].ucChannelNum = ucPrimaryChannel;
614 DBGLOG(BOW, EVENT, ("bowCmdGetMacStatus, Get channel list. Current number of channel, %d.\n", ucNumOfChannel));
617 rlmDomainGetChnlList(prAdapter, BAND_2G4, MAX_BOW_NUMBER_OF_CHANNEL_2G4, &ucNumOfChannel, aucChannelList);
619 if (ucNumOfChannel > 0) {
620 for (idx = 0; idx < ucNumOfChannel/*MAX_BOW_NUMBER_OF_CHANNEL_2G4*/; idx++)
622 prMacStatus->arChannelList[idx].ucChannelBand = aucChannelList[idx].eBand;
623 prMacStatus->arChannelList[idx].ucChannelNum = aucChannelList[idx].ucChannelNum;
626 prMacStatus->ucNumOfChannel = ucNumOfChannel;
629 rlmDomainGetChnlList(prAdapter, BAND_5G, MAX_BOW_NUMBER_OF_CHANNEL_5G, &ucNumOfChannel, aucChannelList);
631 if (ucNumOfChannel > 0) {
632 for (idx = 0; idx < ucNumOfChannel/*MAX_BOW_NUMBER_OF_CHANNEL_5G*/; idx++)
634 prMacStatus->arChannelList[prMacStatus->ucNumOfChannel + idx].ucChannelBand = aucChannelList[idx].eBand;
635 prMacStatus->arChannelList[prMacStatus->ucNumOfChannel + idx].ucChannelNum = aucChannelList[idx].ucChannelNum;
638 prMacStatus->ucNumOfChannel = prMacStatus->ucNumOfChannel + ucNumOfChannel;
644 DBGLOG(BOW, EVENT, ("ucNumOfChannel, eBand, aucChannelList, %x, %x, %x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x.\n",
646 aucChannelList[0].eBand,
647 aucChannelList[0].ucChannelNum,
648 aucChannelList[1].ucChannelNum,
649 aucChannelList[2].ucChannelNum,
650 aucChannelList[3].ucChannelNum,
651 aucChannelList[4].ucChannelNum,
652 aucChannelList[5].ucChannelNum,
653 aucChannelList[6].ucChannelNum,
654 aucChannelList[7].ucChannelNum,
655 aucChannelList[8].ucChannelNum,
656 aucChannelList[9].ucChannelNum,
657 aucChannelList[10].ucChannelNum,
658 aucChannelList[11].ucChannelNum,
659 aucChannelList[12].ucChannelNum,
660 aucChannelList[13].ucChannelNum,
661 aucChannelList[14].ucChannelNum,
662 aucChannelList[15].ucChannelNum,
663 aucChannelList[16].ucChannelNum,
664 aucChannelList[17].ucChannelNum));
666 DBGLOG(BOW, EVENT, ("prMacStatus->ucNumOfChannel, eBand, prMacStatus->arChannelList, %x, %x, %x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x.\n",
667 prMacStatus->ucNumOfChannel,
668 prMacStatus->arChannelList[0].ucChannelBand,
669 prMacStatus->arChannelList[0].ucChannelNum,
670 prMacStatus->arChannelList[1].ucChannelNum,
671 prMacStatus->arChannelList[2].ucChannelNum,
672 prMacStatus->arChannelList[3].ucChannelNum,
673 prMacStatus->arChannelList[4].ucChannelNum,
674 prMacStatus->arChannelList[5].ucChannelNum,
675 prMacStatus->arChannelList[6].ucChannelNum,
676 prMacStatus->arChannelList[7].ucChannelNum,
677 prMacStatus->arChannelList[8].ucChannelNum,
678 prMacStatus->arChannelList[9].ucChannelNum,
679 prMacStatus->arChannelList[10].ucChannelNum,
680 prMacStatus->arChannelList[11].ucChannelNum,
681 prMacStatus->arChannelList[12].ucChannelNum,
682 prMacStatus->arChannelList[13].ucChannelNum,
683 prMacStatus->arChannelList[14].ucChannelNum,
684 prMacStatus->arChannelList[15].ucChannelNum,
685 prMacStatus->arChannelList[16].ucChannelNum,
686 prMacStatus->arChannelList[17].ucChannelNum));
688 DBGLOG(BOW, EVENT, ("prMacStatus->ucNumOfChannel, %x.\n", prMacStatus->ucNumOfChannel));
689 DBGLOG(BOW, EVENT, ("prMacStatus->arChannelList[0].ucChannelBand, %x.\n", prMacStatus->arChannelList[0].ucChannelBand));
690 DBGLOG(BOW, EVENT, ("prMacStatus->arChannelList[0].ucChannelNum, %x.\n", prMacStatus->arChannelList[0].ucChannelNum));
691 DBGLOG(BOW, EVENT, ("prMacStatus->ucAvailability, %x.\n", prMacStatus->ucAvailability));
692 DBGLOG(BOW, EVENT, ("prMacStatus->aucMacAddr, %x:%x:%x:%x:%x:%x.\n",
693 prMacStatus->aucMacAddr[0],
694 prMacStatus->aucMacAddr[1],
695 prMacStatus->aucMacAddr[2],
696 prMacStatus->aucMacAddr[3],
697 prMacStatus->aucMacAddr[4],
698 prMacStatus->aucMacAddr[5]));
701 kalIndicateBOWEvent(prAdapter->prGlueInfo, prEvent);
703 kalMemFree(prEvent, VIR_MEM_TYPE, (sizeof(AMPC_EVENT) + sizeof(BOW_MAC_STATUS)));
705 return WLAN_STATUS_SUCCESS;
709 /*----------------------------------------------------------------------------*/
711 * \brief This is command handler for BOW_CMD_ID_SETUP_CONNECTION
712 * coming from 802.11 PAL
714 * \param[in] prAdapter Pointer to the Adapter structure.
715 * \param[in] prCmd Pointer to the buffer that holds the command
717 * \retval WLAN_STATUS_SUCCESS
718 * \retval WLAN_STATUS_INVALID_LENGTH
720 /*----------------------------------------------------------------------------*/
722 bowCmdSetupConnection(
723 IN P_ADAPTER_T prAdapter,
724 IN P_AMPC_COMMAND prCmd
727 P_BOW_SETUP_CONNECTION prBowSetupConnection;
728 CMD_BT_OVER_WIFI rCmdBtOverWifi;
729 P_BOW_FSM_INFO_T prBowFsmInfo;
730 BOW_TABLE_T rBowTable;
732 UINT_8 ucBowTableIdx = 0;
736 prBowFsmInfo = &(prAdapter->rWifiVar.rBowFsmInfo);
737 prBowSetupConnection = (P_BOW_SETUP_CONNECTION) &(prCmd->aucPayload[0]);
739 // parameter size check
740 if(prCmd->rHeader.u2PayloadLength != sizeof(BOW_SETUP_CONNECTION))
742 wlanbowCmdEventSetStatus(prAdapter, prCmd, BOWCMD_STATUS_INVALID);
743 return WLAN_STATUS_INVALID_LENGTH;
746 //3 <1> If ucLinkCount >= 4 -> Fail.
747 if (g_u4LinkCount >= CFG_BOW_PHYSICAL_LINK_NUM)
749 wlanbowCmdEventSetStatus(prAdapter, prCmd, BOWCMD_STATUS_UNACCEPTED);
750 return WLAN_STATUS_NOT_ACCEPTED;
753 //3 <2> Call CNM, check if BOW is available.
754 if (!cnmBowIsPermitted(prAdapter))
756 wlanbowCmdEventSetStatus(prAdapter, prCmd, BOWCMD_STATUS_UNACCEPTED);
757 return WLAN_STATUS_NOT_ACCEPTED;
760 //3 <3> Lookup BOW Table, if Peer MAC address exist and valid -> Fail.
761 if (bowCheckBowTableIfVaild(prAdapter, prBowSetupConnection->aucPeerAddress))
763 wlanbowCmdEventSetStatus(prAdapter, prCmd, BOWCMD_STATUS_UNACCEPTED);
764 return WLAN_STATUS_NOT_ACCEPTED;
767 if(EQUAL_MAC_ADDR(prBowSetupConnection->aucPeerAddress, prAdapter->rWifiVar.aucDeviceAddress))
769 wlanbowCmdEventSetStatus(prAdapter, prCmd, BOWCMD_STATUS_INVALID);
770 return WLAN_STATUS_NOT_ACCEPTED;
774 // fill CMD_BT_OVER_WIFI
775 rCmdBtOverWifi.ucAction = BOW_SETUP_CMD;
776 rCmdBtOverWifi.ucChannelNum = prBowSetupConnection->ucChannelNum;
777 COPY_MAC_ADDR(rCmdBtOverWifi.rPeerAddr, prBowSetupConnection->aucPeerAddress);
778 rCmdBtOverWifi.u2BeaconInterval = prBowSetupConnection->u2BeaconInterval;
779 rCmdBtOverWifi.ucTimeoutDiscovery = prBowSetupConnection->ucTimeoutDiscovery;
780 rCmdBtOverWifi.ucTimeoutInactivity = prBowSetupConnection->ucTimeoutInactivity;
781 rCmdBtOverWifi.ucRole = prBowSetupConnection->ucRole;
782 rCmdBtOverWifi.PAL_Capabilities = prBowSetupConnection->ucPAL_Capabilities;
783 rCmdBtOverWifi.cMaxTxPower = prBowSetupConnection->cMaxTxPower;
785 if (prBowSetupConnection->ucChannelNum > 14) {
786 rCmdBtOverWifi.ucChannelBand = BAND_5G;
789 rCmdBtOverWifi.ucChannelBand = BAND_2G4;
792 COPY_MAC_ADDR(prBowFsmInfo->aucPeerAddress, prBowSetupConnection->aucPeerAddress);
794 #if CFG_BOW_PHYSICAL_LINK_NUM > 1
795 /*Channel check for supporting multiple physical link*/
796 if(g_u4LinkCount > 0) {
797 if (prBowSetupConnection->ucChannelNum != prBowFsmInfo->ucPrimaryChannel) {
798 wlanbowCmdEventSetStatus(prAdapter, prCmd, BOWCMD_STATUS_UNACCEPTED);
799 return WLAN_STATUS_NOT_ACCEPTED;
804 prBowFsmInfo->ucPrimaryChannel = prBowSetupConnection->ucChannelNum;
805 prBowFsmInfo->eBand = rCmdBtOverWifi.ucChannelBand;
806 prBowFsmInfo->u2BeaconInterval = prBowSetupConnection->u2BeaconInterval;
807 prBowFsmInfo->ucRole = prBowSetupConnection->ucRole;
809 if (prBowSetupConnection->ucPAL_Capabilities > 0)
811 prBowFsmInfo->fgSupportQoS = TRUE;
815 DBGLOG(BOW, EVENT, ("bowCmdSetupConnection.\n"));
816 DBGLOG(BOW, EVENT, ("rCmdBtOverWifi Channel Number - 0x%x.\n", rCmdBtOverWifi.ucChannelNum));
817 DBGLOG(BOW, EVENT, ("rCmdBtOverWifi Peer address - %x:%x:%x:%x:%x:%x.\n", rCmdBtOverWifi.rPeerAddr[0],
818 rCmdBtOverWifi.rPeerAddr[1],
819 rCmdBtOverWifi.rPeerAddr[2],
820 rCmdBtOverWifi.rPeerAddr[3],
821 rCmdBtOverWifi.rPeerAddr[4],
822 rCmdBtOverWifi.rPeerAddr[5]));
823 DBGLOG(BOW, EVENT, ("rCmdBtOverWifi Beacon interval - 0x%x.\n", rCmdBtOverWifi.u2BeaconInterval));
824 DBGLOG(BOW, EVENT, ("rCmdBtOverWifi Timeout activity - 0x%x.\n", rCmdBtOverWifi.ucTimeoutDiscovery));
825 DBGLOG(BOW, EVENT, ("rCmdBtOverWifi Timeout inactivity - 0x%x.\n", rCmdBtOverWifi.ucTimeoutInactivity));
826 DBGLOG(BOW, EVENT, ("rCmdBtOverWifi Role - 0x%x.\n", rCmdBtOverWifi.ucRole));
827 DBGLOG(BOW, EVENT, ("rCmdBtOverWifi PAL capability - 0x%x.\n", rCmdBtOverWifi.PAL_Capabilities));
828 DBGLOG(BOW, EVENT, ("rCmdBtOverWifi Max Tx power - 0x%x.\n", rCmdBtOverWifi.cMaxTxPower));
831 //3 <4> Get a free BOW entry, mark as Valid, fill in Peer MAC address, LinkCount += 1, state == Starting.
832 if (!bowGetBowTableFreeEntry(prAdapter, &ucBowTableIdx))
834 wlanbowCmdEventSetStatus(prAdapter, prCmd, BOWCMD_STATUS_UNACCEPTED);
835 return WLAN_STATUS_NOT_ACCEPTED;
838 prBowFsmInfo->prTargetBssDesc = NULL;
840 COPY_MAC_ADDR(rBowTable.aucPeerAddress, prBowSetupConnection->aucPeerAddress);
841 //owTable.eState = BOW_DEVICE_STATE_ACQUIRING_CHANNEL;
842 rBowTable.fgIsValid = TRUE;
843 rBowTable.ucAcquireID = prBowFsmInfo->ucSeqNumOfChReq;
844 //rBowTable.ucRole = prBowSetupConnection->ucRole;
845 //rBowTable.ucChannelNum = prBowSetupConnection->ucChannelNum;
846 bowSetBowTableContent(prAdapter, ucBowTableIdx, &rBowTable);
848 kalSetBowRole(prAdapter->prGlueInfo, rCmdBtOverWifi.ucRole, prBowSetupConnection->aucPeerAddress);
850 GLUE_INC_REF_CNT(g_u4LinkCount);
853 DBGLOG(BOW, EVENT, ("bowStarting, g_u4LinkCount, %x.\n", g_u4LinkCount));
856 if (g_u4LinkCount == 1)
859 DBGLOG(BOW, EVENT, ("bowStarting, cnmTimerInitTimer.\n"));
860 DBGLOG(BOW, EVENT, ("prBowFsmInfo->u2BeaconInterval, %d.\n", prBowFsmInfo->u2BeaconInterval));
862 cnmTimerInitTimer(prAdapter,
863 &prBowFsmInfo->rStartingBeaconTimer,
864 (PFN_MGMT_TIMEOUT_FUNC)bowSendBeacon,
867 cnmTimerInitTimer(prAdapter,
868 &prBowFsmInfo->rChGrantedTimer,
869 (PFN_MGMT_TIMEOUT_FUNC)bowChGrantedTimeout,
872 //Reset Global Variable
876 DBGLOG(BOW, EVENT, ("bowCmdSetupConnection, g_u4LinkCount, %x.\n", g_u4LinkCount));
877 DBGLOG(BOW, EVENT, ("kalInitBowDevice, bow0\n"));
879 #if CFG_BOW_SEPARATE_DATA_PATH
880 kalInitBowDevice(prAdapter->prGlueInfo, BOWDEVNAME);
883 /*Active BoW Network*/
884 SET_NET_ACTIVE(prAdapter, NETWORK_TYPE_BOW_INDEX);
885 SET_NET_PWR_STATE_ACTIVE(prAdapter, NETWORK_TYPE_BOW_INDEX);
886 nicActivateNetwork(prAdapter, NETWORK_TYPE_BOW_INDEX);
890 if(rCmdBtOverWifi.ucRole == BOW_INITIATOR) {
891 bowSetBowTableState(prAdapter, prBowSetupConnection->aucPeerAddress, BOW_DEVICE_STATE_ACQUIRING_CHANNEL);
892 bowRequestCh(prAdapter);
894 bowSetBowTableState(prAdapter, prBowSetupConnection->aucPeerAddress, BOW_DEVICE_STATE_SCANNING);
895 bowResponderScan(prAdapter);
898 wlanbowCmdEventSetStatus(prAdapter, prCmd, BOWCMD_STATUS_SUCCESS);
900 return WLAN_STATUS_SUCCESS;
904 /*----------------------------------------------------------------------------*/
906 * \brief This is command handler for BOW_CMD_ID_DESTROY_CONNECTION
907 * coming from 802.11 PAL
909 * \param[in] prAdapter Pointer to the Adapter structure.
910 * \param[in] prCmd Pointer to the buffer that holds the command
912 * \retval WLAN_STATUS_SUCCESS
913 * \retval WLAN_STATUS_INVALID_LENGTH
915 /*----------------------------------------------------------------------------*/
917 bowCmdDestroyConnection(
918 IN P_ADAPTER_T prAdapter,
919 IN P_AMPC_COMMAND prCmd
922 P_BOW_DESTROY_CONNECTION prBowDestroyConnection;
923 CMD_BT_OVER_WIFI rCmdBtOverWifi;
924 P_BOW_FSM_INFO_T prBowFsmInfo;
931 prBowFsmInfo = &(prAdapter->rWifiVar.rBowFsmInfo);
933 //3 <1> If LinkCount == 0 ->Fail (Optional)
934 if (g_u4LinkCount == 0)
936 wlanbowCmdEventSetStatus(prAdapter, prCmd, BOWCMD_STATUS_UNACCEPTED);
937 return WLAN_STATUS_NOT_ACCEPTED;
940 // parameter size check
941 if(prCmd->rHeader.u2PayloadLength != sizeof(BOW_DESTROY_CONNECTION))
943 wlanbowCmdEventSetStatus(prAdapter, prCmd, BOWCMD_STATUS_UNACCEPTED);
944 return WLAN_STATUS_INVALID_LENGTH;
947 //3 <2> Lookup BOW table, check if is not exist (Valid and Peer MAC address) -> Fail
948 prBowDestroyConnection = (P_BOW_DESTROY_CONNECTION) &(prCmd->aucPayload[0]);
950 if (!bowCheckBowTableIfVaild(prAdapter, prBowDestroyConnection->aucPeerAddress))
953 DBGLOG(BOW, EVENT, ("bowCmdDestroyConnection, bowCheckIfVaild, not accepted.\n"));
955 return WLAN_STATUS_NOT_ACCEPTED;
959 DBGLOG(BOW, EVENT, ("bowCmdDestroyConnection, destroy Peer address - %x:%x:%x:%x:%x:%x.\n", prBowDestroyConnection->aucPeerAddress[0],
960 prBowDestroyConnection->aucPeerAddress[1],
961 prBowDestroyConnection->aucPeerAddress[2],
962 prBowDestroyConnection->aucPeerAddress[3],
963 prBowDestroyConnection->aucPeerAddress[4],
964 prBowDestroyConnection->aucPeerAddress[5]));
967 // fill CMD_BT_OVER_WIFI
968 rCmdBtOverWifi.ucAction = 2;
969 COPY_MAC_ADDR(rCmdBtOverWifi.rPeerAddr, prBowDestroyConnection->aucPeerAddress);
970 COPY_MAC_ADDR(prBowFsmInfo->aucPeerAddress, prBowDestroyConnection->aucPeerAddress);
972 DBGLOG(BOW, EVENT, ("bowCmdDestroyConnection, rCmdBtOverWifi.rPeerAddr - %x:%x:%x:%x:%x:%x.\n", rCmdBtOverWifi.rPeerAddr[0],
973 rCmdBtOverWifi.rPeerAddr[1],
974 rCmdBtOverWifi.rPeerAddr[2],
975 rCmdBtOverWifi.rPeerAddr[3],
976 rCmdBtOverWifi.rPeerAddr[4],
977 rCmdBtOverWifi.rPeerAddr[5]));
981 for (ucIdx = 0; ucIdx < 11; ucIdx++)
983 DBGLOG(BOW, EVENT, ("BoW receiving PAL packet delta time vs packet number -- %d ms vs %x.\n", ucIdx, g_arBowRevPalPacketTime[ucIdx]));
987 wlanbowCmdEventSetStatus(prAdapter, prCmd, BOWCMD_STATUS_SUCCESS);
989 return wlanoidSendSetQueryBowCmd(prAdapter,
990 CMD_ID_CMD_BT_OVER_WIFI,
993 wlanbowCmdEventLinkDisconnected,
994 wlanbowCmdTimeoutHandler,
995 sizeof(CMD_BT_OVER_WIFI),
996 (PUINT_8) &rCmdBtOverWifi,
997 prCmd->rHeader.ucSeqNumber
1002 /*----------------------------------------------------------------------------*/
1004 * \brief This is command handler for BOW_CMD_ID_SET_PTK
1005 * coming from 802.11 PAL
1007 * \param[in] prAdapter Pointer to the Adapter structure.
1008 * \param[in] prCmd Pointer to the buffer that holds the command
1010 * \retval WLAN_STATUS_SUCCESS
1011 * \retval WLAN_STATUS_INVALID_LENGTH
1013 /*----------------------------------------------------------------------------*/
1016 IN P_ADAPTER_T prAdapter,
1017 IN P_AMPC_COMMAND prCmd
1020 P_BOW_SET_PTK prBowSetPTK;
1021 CMD_802_11_KEY rCmdKey;
1025 // parameter size check
1026 if(prCmd->rHeader.u2PayloadLength != sizeof(BOW_SET_PTK)) {
1027 return WLAN_STATUS_INVALID_LENGTH;
1030 prBowSetPTK = (P_BOW_SET_PTK) &(prCmd->aucPayload[0]);
1033 DBGLOG(BOW, EVENT, ("prBowSetPTK->aucPeerAddress, %x:%x:%x:%x:%x:%x.\n",
1034 prBowSetPTK->aucPeerAddress[0],
1035 prBowSetPTK->aucPeerAddress[1],
1036 prBowSetPTK->aucPeerAddress[2],
1037 prBowSetPTK->aucPeerAddress[3],
1038 prBowSetPTK->aucPeerAddress[4],
1039 prBowSetPTK->aucPeerAddress[5]));
1041 DBGLOG(BOW, EVENT, ("rCmdKey.ucIsAuthenticator, %x.\n", kalGetBowRole(prAdapter->prGlueInfo, prBowSetPTK->aucPeerAddress)));
1044 if (!bowCheckBowTableIfVaild(prAdapter, prBowSetPTK->aucPeerAddress))
1046 wlanbowCmdEventSetStatus(prAdapter, prCmd, BOWCMD_STATUS_UNACCEPTED);
1048 return WLAN_STATUS_NOT_ACCEPTED;
1051 if (bowGetBowTableState(prAdapter, prBowSetPTK->aucPeerAddress) != BOW_DEVICE_STATE_CONNECTED)
1053 wlanbowCmdEventSetStatus(prAdapter, prCmd, BOWCMD_STATUS_FAILURE);
1055 return WLAN_STATUS_NOT_ACCEPTED;
1058 // fill CMD_802_11_KEY
1059 rCmdKey.ucAddRemove = 1; // add
1060 rCmdKey.ucTxKey = 1;
1061 rCmdKey.ucKeyType = 1;
1062 rCmdKey.ucIsAuthenticator = kalGetBowRole(prAdapter->prGlueInfo, prBowSetPTK->aucPeerAddress);
1063 COPY_MAC_ADDR(rCmdKey.aucPeerAddr, prBowSetPTK->aucPeerAddress);
1064 rCmdKey.ucNetType = NETWORK_TYPE_BOW_INDEX; // BT Over Wi-Fi
1065 rCmdKey.ucAlgorithmId = CIPHER_SUITE_CCMP; // AES
1066 rCmdKey.ucKeyId = 0;
1067 rCmdKey.ucKeyLen = 16; // AES = 128bit
1068 kalMemCopy(rCmdKey.aucKeyMaterial, prBowSetPTK->aucTemporalKey, 16);
1071 DBGLOG(BOW, EVENT, ("prBowSetPTK->aucTemporalKey, %x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x.\n",
1072 prBowSetPTK->aucTemporalKey[0],
1073 prBowSetPTK->aucTemporalKey[1],
1074 prBowSetPTK->aucTemporalKey[2],
1075 prBowSetPTK->aucTemporalKey[3],
1076 prBowSetPTK->aucTemporalKey[4],
1077 prBowSetPTK->aucTemporalKey[5],
1078 prBowSetPTK->aucTemporalKey[6],
1079 prBowSetPTK->aucTemporalKey[7],
1080 prBowSetPTK->aucTemporalKey[8],
1081 prBowSetPTK->aucTemporalKey[9],
1082 prBowSetPTK->aucTemporalKey[10],
1083 prBowSetPTK->aucTemporalKey[11],
1084 prBowSetPTK->aucTemporalKey[12],
1085 prBowSetPTK->aucTemporalKey[13],
1086 prBowSetPTK->aucTemporalKey[14],
1087 prBowSetPTK->aucTemporalKey[15]));
1089 DBGLOG(BOW, EVENT, ("rCmdKey.aucKeyMaterial, %x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x.\n",
1090 rCmdKey.aucKeyMaterial[0],
1091 rCmdKey.aucKeyMaterial[1],
1092 rCmdKey.aucKeyMaterial[2],
1093 rCmdKey.aucKeyMaterial[3],
1094 rCmdKey.aucKeyMaterial[4],
1095 rCmdKey.aucKeyMaterial[5],
1096 rCmdKey.aucKeyMaterial[6],
1097 rCmdKey.aucKeyMaterial[7],
1098 rCmdKey.aucKeyMaterial[8],
1099 rCmdKey.aucKeyMaterial[9],
1100 rCmdKey.aucKeyMaterial[10],
1101 rCmdKey.aucKeyMaterial[11],
1102 rCmdKey.aucKeyMaterial[12],
1103 rCmdKey.aucKeyMaterial[13],
1104 rCmdKey.aucKeyMaterial[14],
1105 rCmdKey.aucKeyMaterial[15]));
1108 return wlanoidSendSetQueryBowCmd(prAdapter,
1109 CMD_ID_ADD_REMOVE_KEY,
1112 wlanbowCmdEventSetCommon,
1113 wlanbowCmdTimeoutHandler,
1114 sizeof(CMD_802_11_KEY),
1116 prCmd->rHeader.ucSeqNumber
1121 /*----------------------------------------------------------------------------*/
1123 * \brief This is command handler for BOW_CMD_ID_READ_RSSI
1124 * coming from 802.11 PAL
1126 * \param[in] prAdapter Pointer to the Adapter structure.
1127 * \param[in] prCmd Pointer to the buffer that holds the command
1129 * \retval WLAN_STATUS_SUCCESS
1130 * \retval WLAN_STATUS_INVALID_LENGTH
1132 /*----------------------------------------------------------------------------*/
1135 IN P_ADAPTER_T prAdapter,
1136 IN P_AMPC_COMMAND prCmd
1139 P_BOW_READ_RSSI prBowReadRSSI;
1143 // parameter size check
1144 if(prCmd->rHeader.u2PayloadLength != sizeof(BOW_READ_RSSI)) {
1145 return WLAN_STATUS_INVALID_LENGTH;
1148 prBowReadRSSI = (P_BOW_READ_RSSI) &(prCmd->aucPayload[0]);
1150 return wlanoidSendSetQueryBowCmd(prAdapter,
1151 CMD_ID_GET_LINK_QUALITY,
1154 wlanbowCmdEventReadRssi,
1155 wlanbowCmdTimeoutHandler,
1158 prCmd->rHeader.ucSeqNumber
1162 /*----------------------------------------------------------------------------*/
1164 * \brief This is command handler for BOW_CMD_ID_READ_LINK_QUALITY
1165 * coming from 802.11 PAL
1167 * \param[in] prAdapter Pointer to the Adapter structure.
1168 * \param[in] prCmd Pointer to the buffer that holds the command
1170 * \retval WLAN_STATUS_SUCCESS
1171 * \retval WLAN_STATUS_INVALID_LENGTH
1173 /*----------------------------------------------------------------------------*/
1175 bowCmdReadLinkQuality(
1176 IN P_ADAPTER_T prAdapter,
1177 IN P_AMPC_COMMAND prCmd
1180 P_BOW_READ_LINK_QUALITY prBowReadLinkQuality;
1184 // parameter size check
1185 if(prCmd->rHeader.u2PayloadLength != sizeof(P_BOW_READ_LINK_QUALITY)) {
1186 return WLAN_STATUS_INVALID_LENGTH;
1189 prBowReadLinkQuality = (P_BOW_READ_LINK_QUALITY) &(prCmd->aucPayload[0]);
1191 return wlanoidSendSetQueryBowCmd(prAdapter,
1192 CMD_ID_GET_LINK_QUALITY,
1195 wlanbowCmdEventReadLinkQuality,
1196 wlanbowCmdTimeoutHandler,
1199 prCmd->rHeader.ucSeqNumber
1204 /*----------------------------------------------------------------------------*/
1206 * \brief This is command handler for BOW_CMD_ID_SHORT_RANGE_MODE
1207 * coming from 802.11 PAL
1209 * \param[in] prAdapter Pointer to the Adapter structure.
1210 * \param[in] prCmd Pointer to the buffer that holds the command
1212 * \retval WLAN_STATUS_SUCCESS
1213 * \retval WLAN_STATUS_INVALID_LENGTH
1215 /*----------------------------------------------------------------------------*/
1217 bowCmdShortRangeMode(
1218 IN P_ADAPTER_T prAdapter,
1219 IN P_AMPC_COMMAND prCmd
1222 P_BOW_SHORT_RANGE_MODE prBowShortRangeMode;
1223 CMD_TX_PWR_T rTxPwrParam;
1228 DBGLOG(BOW, EVENT, ("bowCmdShortRangeMode.\n"));
1231 prBowShortRangeMode = (P_BOW_SHORT_RANGE_MODE) &(prCmd->aucPayload[0]);
1233 // parameter size check
1234 if(prCmd->rHeader.u2PayloadLength != sizeof(BOW_SHORT_RANGE_MODE)) {
1235 wlanbowCmdEventSetStatus(prAdapter, prCmd, BOWCMD_STATUS_UNACCEPTED);
1236 return WLAN_STATUS_INVALID_LENGTH;
1239 if (!bowCheckBowTableIfVaild(prAdapter, prBowShortRangeMode->aucPeerAddress))
1241 wlanbowCmdEventSetStatus(prAdapter, prCmd, BOWCMD_STATUS_UNACCEPTED);
1242 return WLAN_STATUS_NOT_ACCEPTED;
1245 if (bowGetBowTableState(prAdapter, prBowShortRangeMode->aucPeerAddress) != BOW_DEVICE_STATE_CONNECTED)
1247 wlanbowCmdEventSetStatus(prAdapter, prCmd, BOWCMD_STATUS_FAILURE);
1248 return WLAN_STATUS_NOT_ACCEPTED;
1253 DBGLOG(BOW, EVENT, ("prBowShortRangeMode->aucPeerAddress, %x:%x:%x:%x:%x:%x.\n",
1254 prBowShortRangeMode->aucPeerAddress[0],
1255 prBowShortRangeMode->aucPeerAddress[1],
1256 prBowShortRangeMode->aucPeerAddress[2],
1257 prBowShortRangeMode->aucPeerAddress[3],
1258 prBowShortRangeMode->aucPeerAddress[4],
1259 prBowShortRangeMode->aucPeerAddress[5]));
1262 rTxPwrParam.cTxPwr2G4Cck = (prBowShortRangeMode->cTxPower << 1);
1264 rTxPwrParam.cTxPwr2G4OFDM_BPSK = (prBowShortRangeMode->cTxPower << 1);
1265 rTxPwrParam.cTxPwr2G4OFDM_QPSK = (prBowShortRangeMode->cTxPower << 1);
1266 rTxPwrParam.cTxPwr2G4OFDM_16QAM = (prBowShortRangeMode->cTxPower << 1);
1268 rTxPwrParam.cTxPwr2G4OFDM_48Mbps = (prBowShortRangeMode->cTxPower << 1);
1269 rTxPwrParam.cTxPwr2G4OFDM_54Mbps = (prBowShortRangeMode->cTxPower << 1);
1271 rTxPwrParam.cTxPwr2G4HT20_BPSK = (prBowShortRangeMode->cTxPower << 1);
1272 rTxPwrParam.cTxPwr2G4HT20_QPSK = (prBowShortRangeMode->cTxPower << 1);
1273 rTxPwrParam.cTxPwr2G4HT20_16QAM = (prBowShortRangeMode->cTxPower << 1);
1274 rTxPwrParam.cTxPwr2G4HT20_MCS5 = (prBowShortRangeMode->cTxPower << 1);
1275 rTxPwrParam.cTxPwr2G4HT20_MCS6 = (prBowShortRangeMode->cTxPower << 1);
1276 rTxPwrParam.cTxPwr2G4HT20_MCS7 = (prBowShortRangeMode->cTxPower << 1);
1278 rTxPwrParam.cTxPwr2G4HT40_BPSK = (prBowShortRangeMode->cTxPower << 1);
1279 rTxPwrParam.cTxPwr2G4HT40_QPSK = (prBowShortRangeMode->cTxPower << 1);
1280 rTxPwrParam.cTxPwr2G4HT40_16QAM = (prBowShortRangeMode->cTxPower << 1);
1281 rTxPwrParam.cTxPwr2G4HT40_MCS5 = (prBowShortRangeMode->cTxPower << 1);
1282 rTxPwrParam.cTxPwr2G4HT40_MCS6 = (prBowShortRangeMode->cTxPower << 1);
1283 rTxPwrParam.cTxPwr2G4HT40_MCS7 = (prBowShortRangeMode->cTxPower << 1);
1285 rTxPwrParam.cTxPwr5GOFDM_BPSK = (prBowShortRangeMode->cTxPower << 1);
1286 rTxPwrParam.cTxPwr5GOFDM_QPSK = (prBowShortRangeMode->cTxPower << 1);
1287 rTxPwrParam.cTxPwr5GOFDM_16QAM = (prBowShortRangeMode->cTxPower << 1);
1288 rTxPwrParam.cTxPwr5GOFDM_48Mbps = (prBowShortRangeMode->cTxPower << 1);
1289 rTxPwrParam.cTxPwr5GOFDM_54Mbps = (prBowShortRangeMode->cTxPower << 1);
1291 rTxPwrParam.cTxPwr5GHT20_BPSK = (prBowShortRangeMode->cTxPower << 1);
1292 rTxPwrParam.cTxPwr5GHT20_QPSK = (prBowShortRangeMode->cTxPower << 1);
1293 rTxPwrParam.cTxPwr5GHT20_16QAM = (prBowShortRangeMode->cTxPower << 1);
1294 rTxPwrParam.cTxPwr5GHT20_MCS5 = (prBowShortRangeMode->cTxPower << 1);
1295 rTxPwrParam.cTxPwr5GHT20_MCS6 = (prBowShortRangeMode->cTxPower << 1);
1296 rTxPwrParam.cTxPwr5GHT20_MCS7 = (prBowShortRangeMode->cTxPower << 1);
1297 rTxPwrParam.cTxPwr5GHT40_BPSK = (prBowShortRangeMode->cTxPower << 1);
1298 rTxPwrParam.cTxPwr5GHT40_QPSK = (prBowShortRangeMode->cTxPower << 1);
1299 rTxPwrParam.cTxPwr5GHT40_16QAM = (prBowShortRangeMode->cTxPower << 1);
1300 rTxPwrParam.cTxPwr5GHT40_MCS5 = (prBowShortRangeMode->cTxPower << 1);
1301 rTxPwrParam.cTxPwr5GHT40_MCS6 = (prBowShortRangeMode->cTxPower << 1);
1302 rTxPwrParam.cTxPwr5GHT40_MCS7 = (prBowShortRangeMode->cTxPower << 1);
1304 if (nicUpdateTxPower(prAdapter, &rTxPwrParam) == WLAN_STATUS_SUCCESS)
1307 DBGLOG(BOW, EVENT, ("bowCmdShortRangeMode, %x.\n", WLAN_STATUS_SUCCESS));
1309 wlanbowCmdEventSetStatus(prAdapter, prCmd, BOWCMD_STATUS_SUCCESS);
1310 return WLAN_STATUS_SUCCESS;
1314 wlanbowCmdEventSetStatus(prAdapter, prCmd, BOWCMD_STATUS_FAILURE);
1315 return WLAN_STATUS_FAILURE;
1321 /*----------------------------------------------------------------------------*/
1323 * \brief This is command handler for BOW_CMD_ID_GET_CHANNEL_LIST
1324 * coming from 802.11 PAL
1326 * \param[in] prAdapter Pointer to the Adapter structure.
1327 * \param[in] prCmd Pointer to the buffer that holds the command
1329 * \retval WLAN_STATUS_SUCCESS
1330 * \retval WLAN_STATUS_INVALID_LENGTH
1332 /*----------------------------------------------------------------------------*/
1334 bowCmdGetChannelList(
1335 IN P_ADAPTER_T prAdapter,
1336 IN P_AMPC_COMMAND prCmd
1341 // not supported yet
1342 return WLAN_STATUS_FAILURE;
1347 /*----------------------------------------------------------------------------*/
1349 * \brief This is generic command done handler
1351 * \param[in] prAdapter Pointer to the Adapter structure.
1352 * \param[in] prCmdInfo Pointer to the buffer that holds the command info
1353 * \param[in] pucEventBuf Pointer to the set buffer OR event buffer
1357 /*----------------------------------------------------------------------------*/
1359 wlanbowCmdEventSetStatus(
1360 IN P_ADAPTER_T prAdapter,
1361 IN P_AMPC_COMMAND prCmd,
1362 IN UINT_8 ucEventBuf
1365 P_AMPC_EVENT prEvent;
1366 P_BOW_COMMAND_STATUS prBowCmdStatus;
1370 // fill event header
1371 prEvent = (P_AMPC_EVENT) kalMemAlloc((sizeof(AMPC_EVENT) + sizeof(BOW_COMMAND_STATUS)), VIR_MEM_TYPE);
1372 prEvent->rHeader.ucEventId = BOW_EVENT_ID_COMMAND_STATUS;
1373 prEvent->rHeader.ucSeqNumber = prCmd->rHeader.ucSeqNumber;
1374 prEvent->rHeader.u2PayloadLength = sizeof(BOW_COMMAND_STATUS);
1377 prBowCmdStatus = (P_BOW_COMMAND_STATUS)(prEvent->aucPayload);
1378 kalMemZero(prBowCmdStatus, sizeof(BOW_COMMAND_STATUS));
1380 prBowCmdStatus->ucStatus = ucEventBuf;
1382 kalIndicateBOWEvent(prAdapter->prGlueInfo, prEvent);
1384 kalMemFree(prEvent, VIR_MEM_TYPE, (sizeof(AMPC_EVENT) + sizeof(BOW_COMMAND_STATUS)));
1388 /*----------------------------------------------------------------------------*/
1390 * \brief This is generic command done handler
1392 * \param[in] prAdapter Pointer to the Adapter structure.
1393 * \param[in] prCmdInfo Pointer to the buffer that holds the command info
1394 * \param[in] pucEventBuf Pointer to the set buffer OR event buffer
1398 /*----------------------------------------------------------------------------*/
1400 wlanbowCmdEventSetCommon(
1401 IN P_ADAPTER_T prAdapter,
1402 IN P_CMD_INFO_T prCmdInfo,
1403 IN PUINT_8 pucEventBuf
1406 P_AMPC_EVENT prEvent;
1407 P_BOW_COMMAND_STATUS prBowCmdStatus;
1411 // fill event header
1412 prEvent = (P_AMPC_EVENT) kalMemAlloc((sizeof(AMPC_EVENT) + sizeof(BOW_COMMAND_STATUS)), VIR_MEM_TYPE);
1413 prEvent->rHeader.ucEventId = BOW_EVENT_ID_COMMAND_STATUS;
1414 prEvent->rHeader.ucSeqNumber = (UINT_8) prCmdInfo->u4PrivateData;
1415 prEvent->rHeader.u2PayloadLength = sizeof(BOW_COMMAND_STATUS);
1418 prBowCmdStatus = (P_BOW_COMMAND_STATUS)(prEvent->aucPayload);
1419 kalMemZero(prBowCmdStatus, sizeof(BOW_COMMAND_STATUS));
1421 prBowCmdStatus->ucStatus = BOWCMD_STATUS_SUCCESS;
1423 kalIndicateBOWEvent(prAdapter->prGlueInfo, prEvent);
1425 kalMemFree(prEvent, VIR_MEM_TYPE, (sizeof(AMPC_EVENT) + sizeof(BOW_COMMAND_STATUS)));
1429 /*----------------------------------------------------------------------------*/
1431 * \brief command done handler for CMD_ID_CMD_BT_OVER_WIFI
1433 * \param[in] prAdapter Pointer to the Adapter structure.
1434 * \param[in] prCmdInfo Pointer to the buffer that holds the command info
1435 * \param[in] pucEventBuf Pointer to the set buffer OR event buffer
1439 /*----------------------------------------------------------------------------*/
1441 wlanbowCmdEventLinkConnected(
1442 IN P_ADAPTER_T prAdapter,
1443 IN P_CMD_INFO_T prCmdInfo,
1444 IN PUINT_8 pucEventBuf
1447 P_AMPC_EVENT prEvent;
1448 P_BOW_LINK_CONNECTED prBowLinkConnected;
1449 P_BOW_FSM_INFO_T prBowFsmInfo;
1450 P_BSS_INFO_T prBssInfo;
1454 prBowFsmInfo = &(prAdapter->rWifiVar.rBowFsmInfo);
1455 prBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_BOW_INDEX]);
1457 // fill event header
1458 prEvent = (P_AMPC_EVENT) kalMemAlloc((sizeof(AMPC_EVENT) + sizeof(BOW_LINK_CONNECTED)), VIR_MEM_TYPE);
1459 prEvent->rHeader.ucEventId = BOW_EVENT_ID_LINK_CONNECTED;
1460 prEvent->rHeader.ucSeqNumber = (UINT_8) prCmdInfo->u4PrivateData;
1461 prEvent->rHeader.u2PayloadLength = sizeof(BOW_LINK_CONNECTED);
1464 prBowLinkConnected = (P_BOW_LINK_CONNECTED)(prEvent->aucPayload);
1465 kalMemZero(prBowLinkConnected, sizeof(BOW_LINK_CONNECTED));
1466 prBowLinkConnected->rChannel.ucChannelNum = prBssInfo->ucPrimaryChannel;
1467 prBowLinkConnected->rChannel.ucChannelBand = prBssInfo->eBand;
1468 COPY_MAC_ADDR(prBowLinkConnected->aucPeerAddress, prBowFsmInfo->aucPeerAddress);
1471 DBGLOG(BOW, EVENT, ("prEvent->rHeader.ucEventId, 0x%x\n", prEvent->rHeader.ucEventId));
1472 DBGLOG(BOW, EVENT, ("prEvent->rHeader.ucSeqNumber, 0x%x\n", prEvent->rHeader.ucSeqNumber));
1473 DBGLOG(BOW, EVENT, ("prEvent->rHeader.u2PayloadLength, 0x%x\n", prEvent->rHeader.u2PayloadLength));
1474 DBGLOG(BOW, EVENT, ("prBowLinkConnected->rChannel.ucChannelNum, 0x%x\n", prBowLinkConnected->rChannel.ucChannelNum));
1475 DBGLOG(BOW, EVENT, ("prBowLinkConnected->rChannel.ucChannelBand, 0x%x\n", prBowLinkConnected->rChannel.ucChannelBand));
1476 DBGLOG(BOW, EVENT, ("wlanbowCmdEventLinkConnected, prBowFsmInfo->aucPeerAddress, %x:%x:%x:%x:%x:%x.\n",
1477 prBowFsmInfo->aucPeerAddress[0],
1478 prBowFsmInfo->aucPeerAddress[1],
1479 prBowFsmInfo->aucPeerAddress[2],
1480 prBowFsmInfo->aucPeerAddress[3],
1481 prBowFsmInfo->aucPeerAddress[4],
1482 prBowFsmInfo->aucPeerAddress[5]));
1483 DBGLOG(BOW, EVENT, ("wlanbowCmdEventLinkConnected, prBowLinkConnected->aucPeerAddress, %x:%x:%x:%x:%x:%x.\n",
1484 prBowLinkConnected->aucPeerAddress[0],
1485 prBowLinkConnected->aucPeerAddress[1],
1486 prBowLinkConnected->aucPeerAddress[2],
1487 prBowLinkConnected->aucPeerAddress[3],
1488 prBowLinkConnected->aucPeerAddress[4],
1489 prBowLinkConnected->aucPeerAddress[5]));
1490 DBGLOG(BOW, EVENT, ("wlanbowCmdEventLinkConnected, g_u4LinkCount, %x.\n", g_u4LinkCount));
1493 /*Indicate Event to PAL*/
1494 kalIndicateBOWEvent(prAdapter->prGlueInfo, prEvent);
1495 kalMemFree(prEvent, VIR_MEM_TYPE, (sizeof(AMPC_EVENT) + sizeof(BOW_LINK_CONNECTED)));
1497 /*Release channel if granted*/
1498 if(prBowFsmInfo->fgIsChannelGranted) {
1499 cnmTimerStopTimer(prAdapter, &prBowFsmInfo->rChGrantedTimer);
1500 //bowReleaseCh(prAdapter);
1501 /*Requested, not granted yet*/
1502 } else if(prBowFsmInfo->fgIsChannelRequested) {
1503 prBowFsmInfo->fgIsChannelRequested = FALSE;
1506 /* set to connected status*/
1507 bowSetBowTableState(prAdapter, prBowFsmInfo->aucPeerAddress, BOW_DEVICE_STATE_CONNECTED);
1512 /*----------------------------------------------------------------------------*/
1514 * \brief command done handler for CMD_ID_CMD_BT_OVER_WIFI
1516 * \param[in] prAdapter Pointer to the Adapter structure.
1517 * \param[in] prCmdInfo Pointer to the buffer that holds the command info
1518 * \param[in] pucEventBuf Pointer to the set buffer OR event buffer
1522 /*----------------------------------------------------------------------------*/
1524 wlanbowCmdEventLinkDisconnected(
1525 IN P_ADAPTER_T prAdapter,
1526 IN P_CMD_INFO_T prCmdInfo,
1527 IN PUINT_8 pucEventBuf
1530 P_AMPC_EVENT prEvent;
1531 P_BOW_LINK_DISCONNECTED prBowLinkDisconnected;
1532 P_BOW_FSM_INFO_T prBowFsmInfo;
1533 BOW_TABLE_T rBowTable;
1534 UINT_8 ucBowTableIdx;
1535 ENUM_BOW_DEVICE_STATE eFsmState;
1536 BOOL fgSendDeauth = FALSE;
1540 prBowFsmInfo = &(prAdapter->rWifiVar.rBowFsmInfo);
1541 eFsmState = bowGetBowTableState(prAdapter, prBowFsmInfo->aucPeerAddress);
1543 if(eFsmState == BOW_DEVICE_STATE_DISCONNECTED) {
1548 else if(eFsmState == BOW_DEVICE_STATE_SCANNING &&
1549 !(prBowFsmInfo->fgIsChannelRequested)) {
1550 bowResponderCancelScan(prAdapter, FALSE);
1551 bowSetBowTableState(prAdapter, prBowFsmInfo->aucPeerAddress, BOW_DEVICE_STATE_DISCONNECTING);
1555 // fill event header
1556 prEvent = (P_AMPC_EVENT) kalMemAlloc((sizeof(AMPC_EVENT) + sizeof(BOW_LINK_DISCONNECTED)), VIR_MEM_TYPE);
1557 prEvent->rHeader.ucEventId = BOW_EVENT_ID_LINK_DISCONNECTED;
1558 if ((prCmdInfo->u4PrivateData))
1560 prEvent->rHeader.ucSeqNumber = (UINT_8) prCmdInfo->u4PrivateData;
1564 prEvent->rHeader.ucSeqNumber = 0;
1567 prEvent->rHeader.u2PayloadLength = sizeof(BOW_LINK_DISCONNECTED);
1570 prBowLinkDisconnected = (P_BOW_LINK_DISCONNECTED)(prEvent->aucPayload);
1571 kalMemZero(prBowLinkDisconnected, sizeof(BOW_LINK_DISCONNECTED));
1572 prBowLinkDisconnected->ucReason = 0x0;
1573 COPY_MAC_ADDR(prBowLinkDisconnected->aucPeerAddress, prBowFsmInfo->aucPeerAddress);
1576 DBGLOG(BOW, EVENT, ("prEvent->rHeader.ucEventId, 0x%x\n", prEvent->rHeader.ucEventId));
1577 DBGLOG(BOW, EVENT, ("prEvent->rHeader.ucSeqNumber, 0x%x\n", prEvent->rHeader.ucSeqNumber));
1578 DBGLOG(BOW, EVENT, ("prEvent->rHeader.u2PayloadLength, 0x%x\n", prEvent->rHeader.u2PayloadLength));
1580 DBGLOG(BOW, EVENT, ("wlanbowCmdEventLinkDisconnected, prBowFsmInfo->aucPeerAddress, %x:%x:%x:%x:%x:%x.\n",
1581 prBowFsmInfo->aucPeerAddress[0],
1582 prBowFsmInfo->aucPeerAddress[1],
1583 prBowFsmInfo->aucPeerAddress[2],
1584 prBowFsmInfo->aucPeerAddress[3],
1585 prBowFsmInfo->aucPeerAddress[4],
1586 prBowFsmInfo->aucPeerAddress[5]));
1588 DBGLOG(BOW, EVENT, ("wlanbowCmdEventLinkDisconnected, prBowLinkDisconnected->aucPeerAddress, %x:%x:%x:%x:%x:%x.\n",
1589 prBowLinkDisconnected->aucPeerAddress[0],
1590 prBowLinkDisconnected->aucPeerAddress[1],
1591 prBowLinkDisconnected->aucPeerAddress[2],
1592 prBowLinkDisconnected->aucPeerAddress[3],
1593 prBowLinkDisconnected->aucPeerAddress[4],
1594 prBowLinkDisconnected->aucPeerAddress[5]));
1596 DBGLOG(BOW, EVENT, ("wlanbowCmdEventLinkDisconnected, g_u4LinkCount, %x.\n", g_u4LinkCount));
1599 /*Indicate BoW event to PAL*/
1601 kalIndicateBOWEvent(prAdapter->prGlueInfo, prEvent);
1602 kalMemFree(prEvent, VIR_MEM_TYPE, (sizeof(AMPC_EVENT) + sizeof(BOW_LINK_DISCONNECTED)));
1605 // set to disconnected status
1606 prBowFsmInfo->prTargetStaRec = cnmGetStaRecByAddress(prAdapter, NETWORK_TYPE_BOW_INDEX, prBowLinkDisconnected->aucPeerAddress);
1608 /*Release channel if granted*/
1609 if(prBowFsmInfo->fgIsChannelGranted) {
1610 cnmTimerStopTimer(prAdapter, &prBowFsmInfo->rChGrantedTimer);
1611 bowReleaseCh(prAdapter);
1612 /*Requested, not granted yet*/
1613 } else if(prBowFsmInfo->fgIsChannelRequested) {
1614 prBowFsmInfo->fgIsChannelRequested = FALSE;
1615 //bowReleaseCh(prAdapter);
1619 /*Send Deauth to connected peer*/
1620 if (eFsmState == BOW_DEVICE_STATE_CONNECTED &&
1621 (prBowFsmInfo->prTargetStaRec->ucStaState == STA_STATE_3))
1623 fgSendDeauth = TRUE;
1625 DBGLOG(BOW, EVENT, ("wlanbowCmdEventLinkDisconnected, bowGetBowTableState, %x.\n", bowGetBowTableState(prAdapter, prBowLinkDisconnected->aucPeerAddress)));
1627 authSendDeauthFrame(prAdapter,
1628 prBowFsmInfo->prTargetStaRec,
1630 REASON_CODE_DEAUTH_LEAVING_BSS,
1631 (PFN_TX_DONE_HANDLER)bowDisconnectLink);
1636 //3 <3>Stop this link; flush Tx; send deAuthentication -> abort. SAA, AAA. need to check BOW table state == Connected.
1637 if (prAdapter->prGlueInfo->i4TxPendingFrameNum > 0) {
1638 kalFlushPendingTxPackets(prAdapter->prGlueInfo);
1641 /* flush pending security frames */
1642 if (prAdapter->prGlueInfo->i4TxPendingSecurityFrameNum > 0) {
1643 kalClearSecurityFrames(prAdapter->prGlueInfo);
1647 /*Update BoW table*/
1648 bowGetBowTableEntryByPeerAddress(prAdapter, prBowLinkDisconnected->aucPeerAddress, &ucBowTableIdx);
1649 rBowTable.fgIsValid = FALSE;
1650 rBowTable.eState = BOW_DEVICE_STATE_DISCONNECTED;
1651 bowSetBowTableContent(prAdapter, ucBowTableIdx, &rBowTable);
1653 /*Indicate BoW event to PAL*/
1654 kalIndicateBOWEvent(prAdapter->prGlueInfo, prEvent);
1655 kalMemFree(prEvent, VIR_MEM_TYPE, (sizeof(AMPC_EVENT) + sizeof(BOW_LINK_DISCONNECTED)));
1657 /*Decrease link count*/
1658 GLUE_DEC_REF_CNT(g_u4LinkCount);
1660 /*If no need to send deauth, DO disconnect now*/
1661 /*If need to send deauth, DO disconnect at deauth Tx done*/
1663 bowDisconnectLink(prAdapter, NULL, TX_RESULT_SUCCESS);
1668 /*----------------------------------------------------------------------------*/
1670 * \brief command done handler for CMD_ID_CMD_BT_OVER_WIFI
1672 * \param[in] prAdapter Pointer to the Adapter structure.
1673 * \param[in] prCmdInfo Pointer to the buffer that holds the command info
1674 * \param[in] pucEventBuf Pointer to the set buffer OR event buffer
1678 /*----------------------------------------------------------------------------*/
1680 wlanbowCmdEventSetSetupConnection (
1681 IN P_ADAPTER_T prAdapter,
1682 IN P_CMD_INFO_T prCmdInfo,
1683 IN PUINT_8 pucEventBuf
1686 P_AMPC_EVENT prEvent;
1687 P_BOW_COMMAND_STATUS prBowCmdStatus;
1688 P_WIFI_CMD_T prWifiCmd;
1689 P_CMD_BT_OVER_WIFI prCmdBtOverWifi;
1690 P_BOW_FSM_INFO_T prBowFsmInfo;
1694 prBowFsmInfo = &(prAdapter->rWifiVar.rBowFsmInfo);
1696 // restore original command for rPeerAddr
1697 prWifiCmd = (P_WIFI_CMD_T)(prCmdInfo->pucInfoBuffer);
1698 prCmdBtOverWifi = (P_CMD_BT_OVER_WIFI)(prWifiCmd->aucBuffer);
1700 // fill event header
1701 prEvent = (P_AMPC_EVENT) kalMemAlloc((sizeof(AMPC_EVENT) + sizeof(BOW_COMMAND_STATUS)), VIR_MEM_TYPE);
1702 prEvent->rHeader.ucEventId = BOW_EVENT_ID_COMMAND_STATUS;
1703 prEvent->rHeader.ucSeqNumber = (UINT_8) prCmdInfo->u4PrivateData;
1704 prEvent->rHeader.u2PayloadLength = sizeof(BOW_COMMAND_STATUS);
1707 prBowCmdStatus = (P_BOW_COMMAND_STATUS)(prEvent->aucPayload);
1708 kalMemZero(prBowCmdStatus, sizeof(BOW_COMMAND_STATUS));
1709 prBowCmdStatus->ucStatus = BOWCMD_STATUS_SUCCESS;
1711 /*Indicate BoW event to PAL*/
1712 kalIndicateBOWEvent(prAdapter->prGlueInfo, prEvent);
1713 kalMemFree(prEvent, VIR_MEM_TYPE, (sizeof(AMPC_EVENT) + sizeof(BOW_COMMAND_STATUS)));
1715 // set to starting status
1716 kalSetBowState(prAdapter->prGlueInfo,
1717 BOW_DEVICE_STATE_STARTING,
1718 prCmdBtOverWifi->rPeerAddr);
1721 /*----------------------------------------------------------------------------*/
1723 * \brief This is the command done handler for BOW_CMD_ID_READ_LINK_QUALITY
1725 * \param[in] prAdapter Pointer to the Adapter structure.
1726 * \param[in] prCmdInfo Pointer to the buffer that holds the command info
1727 * \param[in] pucEventBuf Pointer to the set buffer OR event buffer
1731 /*----------------------------------------------------------------------------*/
1733 wlanbowCmdEventReadLinkQuality (
1734 IN P_ADAPTER_T prAdapter,
1735 IN P_CMD_INFO_T prCmdInfo,
1736 IN PUINT_8 pucEventBuf
1739 P_EVENT_LINK_QUALITY prLinkQuality;
1740 P_AMPC_EVENT prEvent;
1741 P_BOW_LINK_QUALITY prBowLinkQuality;
1745 prLinkQuality = (P_EVENT_LINK_QUALITY)pucEventBuf;
1747 // fill event header
1748 prEvent = (P_AMPC_EVENT) kalMemAlloc((sizeof(AMPC_EVENT) + sizeof(BOW_LINK_QUALITY)), VIR_MEM_TYPE);
1749 prEvent->rHeader.ucEventId = BOW_EVENT_ID_LINK_QUALITY;
1750 prEvent->rHeader.ucSeqNumber = (UINT_8) prCmdInfo->u4PrivateData;
1751 prEvent->rHeader.u2PayloadLength = sizeof(BOW_LINK_QUALITY);
1754 prBowLinkQuality = (P_BOW_LINK_QUALITY)(prEvent->aucPayload);
1755 kalMemZero(prBowLinkQuality, sizeof(BOW_LINK_QUALITY));
1756 prBowLinkQuality->ucLinkQuality = (UINT_8)prLinkQuality->cLinkQuality;
1758 kalIndicateBOWEvent(prAdapter->prGlueInfo, prEvent);
1760 kalMemFree(prEvent, VIR_MEM_TYPE, (sizeof(AMPC_EVENT) + sizeof(BOW_LINK_QUALITY)));
1764 /*----------------------------------------------------------------------------*/
1766 * \brief This is the command done handler for BOW_CMD_ID_READ_RSSI
1768 * \param[in] prAdapter Pointer to the Adapter structure.
1769 * \param[in] prCmdInfo Pointer to the buffer that holds the command info
1770 * \param[in] pucEventBuf Pointer to the set buffer OR event buffer
1774 /*----------------------------------------------------------------------------*/
1776 wlanbowCmdEventReadRssi (
1777 IN P_ADAPTER_T prAdapter,
1778 IN P_CMD_INFO_T prCmdInfo,
1779 IN PUINT_8 pucEventBuf
1782 P_EVENT_LINK_QUALITY prLinkQuality;
1783 P_AMPC_EVENT prEvent;
1784 P_BOW_RSSI prBowRssi;
1788 prLinkQuality = (P_EVENT_LINK_QUALITY)pucEventBuf;
1790 // fill event header
1791 prEvent = (P_AMPC_EVENT) kalMemAlloc((sizeof(AMPC_EVENT) + sizeof(BOW_LINK_QUALITY)), VIR_MEM_TYPE);
1792 prEvent->rHeader.ucEventId = BOW_EVENT_ID_RSSI;
1793 prEvent->rHeader.ucSeqNumber = (UINT_8) prCmdInfo->u4PrivateData;
1794 prEvent->rHeader.u2PayloadLength = sizeof(BOW_RSSI);
1797 prBowRssi = (P_BOW_RSSI)(prEvent->aucPayload);
1798 kalMemZero(prBowRssi, sizeof(BOW_RSSI));
1799 prBowRssi->cRssi = (INT_8) prLinkQuality->cRssi;
1801 kalIndicateBOWEvent(prAdapter->prGlueInfo, prEvent);
1803 kalMemFree(prEvent, VIR_MEM_TYPE, (sizeof(AMPC_EVENT) + sizeof(BOW_LINK_QUALITY)));
1808 /*----------------------------------------------------------------------------*/
1810 * \brief This is the default command timeout handler
1812 * \param[in] prAdapter Pointer to the Adapter structure.
1813 * \param[in] prCmdInfo Pointer to the buffer that holds the command info
1817 /*----------------------------------------------------------------------------*/
1819 wlanbowCmdTimeoutHandler (
1820 IN P_ADAPTER_T prAdapter,
1821 IN P_CMD_INFO_T prCmdInfo
1824 P_AMPC_EVENT prEvent;
1825 P_BOW_COMMAND_STATUS prBowCmdStatus;
1829 // fill event header
1830 prEvent = (P_AMPC_EVENT) kalMemAlloc((sizeof(AMPC_EVENT) + sizeof(BOW_COMMAND_STATUS)), VIR_MEM_TYPE);
1831 prEvent->rHeader.ucEventId = BOW_EVENT_ID_COMMAND_STATUS;
1832 prEvent->rHeader.ucSeqNumber = (UINT_8) prCmdInfo->u4PrivateData;
1833 prEvent->rHeader.u2PayloadLength = sizeof(BOW_COMMAND_STATUS);
1836 prBowCmdStatus = (P_BOW_COMMAND_STATUS)(prEvent->aucPayload);
1837 kalMemZero(prBowCmdStatus, sizeof(BOW_COMMAND_STATUS));
1839 prBowCmdStatus->ucStatus = BOWCMD_STATUS_TIMEOUT; // timeout
1841 kalIndicateBOWEvent(prAdapter->prGlueInfo, prEvent);
1843 kalMemFree(prEvent, VIR_MEM_TYPE, (sizeof(AMPC_EVENT) + sizeof(BOW_COMMAND_STATUS)));
1851 IN P_ADAPTER_T prAdapter
1854 P_BOW_FSM_INFO_T prBowFsmInfo;
1855 P_BSS_INFO_T prBowBssInfo;
1859 prBowFsmInfo = &(prAdapter->rWifiVar.rBowFsmInfo);
1860 prBowBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_BOW_INDEX]);
1863 DBGLOG(BOW, EVENT, ("bowStoping.\n"));
1864 DBGLOG(BOW, EVENT, ("bowStoping, SSID %s.\n", prBowBssInfo->aucSSID));
1865 DBGLOG(BOW, EVENT, ("bowStoping, prBowBssInfo->aucBSSID, %x:%x:%x:%x:%x:%x.\n",
1866 prBowBssInfo->aucBSSID[0],
1867 prBowBssInfo->aucBSSID[1],
1868 prBowBssInfo->aucBSSID[2],
1869 prBowBssInfo->aucBSSID[3],
1870 prBowBssInfo->aucBSSID[4],
1871 prBowBssInfo->aucBSSID[5]));
1872 DBGLOG(BOW, EVENT, ("bowStoping, prBssInfo->aucOwnMacAddr, %x:%x:%x:%x:%x:%x.\n",
1873 prBowBssInfo->aucOwnMacAddr[0],
1874 prBowBssInfo->aucOwnMacAddr[1],
1875 prBowBssInfo->aucOwnMacAddr[2],
1876 prBowBssInfo->aucOwnMacAddr[3],
1877 prBowBssInfo->aucOwnMacAddr[4],
1878 prBowBssInfo->aucOwnMacAddr[5]));
1879 DBGLOG(BOW, EVENT, ("bowStoping, prAdapter->rWifiVar.aucDeviceAddress, %x:%x:%x:%x:%x:%x.\n",
1880 prAdapter->rWifiVar.aucDeviceAddress[0],
1881 prAdapter->rWifiVar.aucDeviceAddress[1],
1882 prAdapter->rWifiVar.aucDeviceAddress[2],
1883 prAdapter->rWifiVar.aucDeviceAddress[3],
1884 prAdapter->rWifiVar.aucDeviceAddress[4],
1885 prAdapter->rWifiVar.aucDeviceAddress[5]));
1886 DBGLOG(BOW, EVENT, ("bowStopping, g_u4LinkCount, %x.\n", g_u4LinkCount));
1887 DBGLOG(BOW, EVENT, ("prBowFsmInfo->aucPeerAddress, %x:%x:%x:%x:%x:%x.\n", prBowFsmInfo->aucPeerAddress[0],
1888 prBowFsmInfo->aucPeerAddress[1],
1889 prBowFsmInfo->aucPeerAddress[2],
1890 prBowFsmInfo->aucPeerAddress[3],
1891 prBowFsmInfo->aucPeerAddress[4],
1892 prBowFsmInfo->aucPeerAddress[5]));
1893 kalPrint("BoW Stoping,[%d,%d]\n", g_u4LinkCount, g_u4Beaconing);
1896 if (g_u4LinkCount == 0)
1899 GLUE_DEC_REF_CNT(g_u4Beaconing);
1901 /*Deactive BoW network*/
1902 //prBowBssInfo->fgIsNetActive = FALSE;
1903 //prBowBssInfo->fgIsBeaconActivated = FALSE;
1904 nicPmIndicateBssAbort(prAdapter, NETWORK_TYPE_BOW_INDEX);
1905 bowChangeMediaState(prAdapter, PARAM_MEDIA_STATE_DISCONNECTED);
1906 nicUpdateBss(prAdapter, NETWORK_TYPE_BOW_INDEX);
1907 /*temp solution for FW hal_pwr_mgt.c#3037 ASSERT*/
1908 nicDeactivateNetwork(prAdapter, NETWORK_TYPE_BOW_INDEX);
1909 SET_NET_PWR_STATE_IDLE(prAdapter, NETWORK_TYPE_BOW_INDEX);
1910 UNSET_NET_ACTIVE(prAdapter, NETWORK_TYPE_BOW_INDEX);
1920 IN P_ADAPTER_T prAdapter
1923 P_BOW_FSM_INFO_T prBowFsmInfo;
1924 P_BSS_INFO_T prBssInfo;
1928 prBowFsmInfo = &(prAdapter->rWifiVar.rBowFsmInfo);
1930 if (g_u4LinkCount == 1)
1933 DBGLOG(BOW, EVENT, ("BoW Starting.\n"));
1934 DBGLOG(BOW, EVENT, ("BoW channel granted.\n"));
1938 /*Active BoW Network*/
1939 SET_NET_ACTIVE(prAdapter, NETWORK_TYPE_BOW_INDEX);
1940 SET_NET_PWR_STATE_ACTIVE(prAdapter, NETWORK_TYPE_BOW_INDEX);
1941 nicActivateNetwork(prAdapter, NETWORK_TYPE_BOW_INDEX);
1944 //3 <1> Update BSS_INFO_T per Network Basis
1945 //4 <1.1> Setup Operation Mode
1946 prBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_BOW_INDEX]);
1947 prBssInfo->ucNetTypeIndex = NETWORK_TYPE_BOW_INDEX;
1948 prBssInfo->eCurrentOPMode = OP_MODE_BOW;
1950 //4 <1.2> Setup SSID
1951 COPY_MAC_ADDR(prBssInfo->aucOwnMacAddr, prAdapter->rWifiVar.aucDeviceAddress);
1952 COPY_MAC_ADDR(prBssInfo->aucBSSID, prAdapter->rWifiVar.aucDeviceAddress);
1953 prBssInfo->ucSSIDLen = BOW_SSID_LEN;
1954 bowAssignSsid(prBssInfo->aucSSID, prBssInfo->aucOwnMacAddr);
1957 DBGLOG(BOW, EVENT, ("SSID %s.\n", prBssInfo->aucSSID));
1958 DBGLOG(BOW, EVENT, ("prBssInfo->aucBSSID, %x:%x:%x:%x:%x:%x.\n",
1959 prBssInfo->aucBSSID[0],
1960 prBssInfo->aucBSSID[1],
1961 prBssInfo->aucBSSID[2],
1962 prBssInfo->aucBSSID[3],
1963 prBssInfo->aucBSSID[4],
1964 prBssInfo->aucBSSID[5]));
1965 DBGLOG(BOW, EVENT, ("prBssInfo->aucOwnMacAddr, %x:%x:%x:%x:%x:%x.\n",
1966 prBssInfo->aucOwnMacAddr[0],
1967 prBssInfo->aucOwnMacAddr[1],
1968 prBssInfo->aucOwnMacAddr[2],
1969 prBssInfo->aucOwnMacAddr[3],
1970 prBssInfo->aucOwnMacAddr[4],
1971 prBssInfo->aucOwnMacAddr[5]));
1972 DBGLOG(BOW, EVENT, ("prAdapter->rWifiVar.aucDeviceAddress, %x:%x:%x:%x:%x:%x.\n",
1973 prAdapter->rWifiVar.aucDeviceAddress[0],
1974 prAdapter->rWifiVar.aucDeviceAddress[1],
1975 prAdapter->rWifiVar.aucDeviceAddress[2],
1976 prAdapter->rWifiVar.aucDeviceAddress[3],
1977 prAdapter->rWifiVar.aucDeviceAddress[4],
1978 prAdapter->rWifiVar.aucDeviceAddress[5]));
1981 //4 <1.3> Clear current AP's STA_RECORD_T and current AID
1982 prBssInfo->prStaRecOfAP = (P_STA_RECORD_T)NULL;
1983 prBssInfo->u2AssocId = 0;
1985 //4 <1.4> Setup Channel, Band and Phy Attributes
1986 prBssInfo->ucPrimaryChannel = prBowFsmInfo->ucPrimaryChannel;
1987 if (prBowFsmInfo->eBand == BAND_2G4)
1989 prBssInfo->eBand = BAND_2G4;
1993 prBssInfo->eBand = BAND_5G;
1996 #if CFG_BOW_SUPPORT_11N
1997 prBssInfo->ucPhyTypeSet = prAdapter->rWifiVar.ucAvailablePhyTypeSet & PHY_TYPE_SET_802_11BGN; /* Depend on eBand */
1998 prBssInfo->ucConfigAdHocAPMode = AP_MODE_MIXED_11BG; /* Depend on eCurrentOPMode and ucPhyTypeSet */
2000 prBssInfo->ucNonHTBasicPhyType = (UINT_8)
2001 rNonHTApModeAttributes[prBssInfo->ucConfigAdHocAPMode].ePhyTypeIndex;
2002 prBssInfo->u2BSSBasicRateSet =
2003 rNonHTApModeAttributes[prBssInfo->ucConfigAdHocAPMode].u2BSSBasicRateSet;
2005 prBssInfo->u2OperationalRateSet =
2006 rNonHTPhyAttributes[prBssInfo->ucNonHTBasicPhyType].u2SupportedRateSet;
2008 rateGetDataRatesFromRateSet(prBssInfo->u2OperationalRateSet,
2009 prBssInfo->u2BSSBasicRateSet,
2010 prBssInfo->aucAllSupportedRates,
2011 &prBssInfo->ucAllSupportedRatesLen);
2014 if (prBssInfo->eBand == BAND_2G4)
2016 prBssInfo->ucPhyTypeSet = PHY_TYPE_SET_802_11BG; /* Depend on eBand */
2017 prBssInfo->ucConfigAdHocAPMode = AP_MODE_MIXED_11BG; /* Depend on eCurrentOPMode and ucPhyTypeSet */
2019 prBssInfo->u2BSSBasicRateSet = BASIC_RATE_SET_ERP; //RATE_SET_ERP;
2020 prBssInfo->u2OperationalRateSet = RATE_SET_ERP;
2021 prBssInfo->ucNonHTBasicPhyType = PHY_TYPE_ERP_INDEX;
2025 //prBssInfo->ucPhyTypeSet = PHY_TYPE_SET_802_11BG; /* Depend on eBand */
2026 //prBssInfo->ucConfigAdHocAPMode = AP_MODE_MIXED_11BG; /* Depend on eCurrentOPMode and ucPhyTypeSet */
2027 prBssInfo->ucPhyTypeSet = PHY_TYPE_SET_802_11A; /* Depend on eBand */
2028 prBssInfo->ucConfigAdHocAPMode = AP_MODE_11A; /* Depend on eCurrentOPMode and ucPhyTypeSet */
2030 //prBssInfo->u2BSSBasicRateSet = BASIC_RATE_SET_ERP; //RATE_SET_ERP;
2031 //prBssInfo->u2OperationalRateSet = RATE_SET_ERP;
2033 prBssInfo->u2BSSBasicRateSet = BASIC_RATE_SET_OFDM; //RATE_SET_ERP;
2034 prBssInfo->u2OperationalRateSet = RATE_SET_OFDM;
2035 prBssInfo->ucNonHTBasicPhyType = PHY_TYPE_OFDM_INDEX;
2040 prBssInfo->fgErpProtectMode = FALSE;
2042 //4 <1.5> Setup MIB for current BSS
2043 prBssInfo->u2BeaconInterval = prBowFsmInfo->u2BeaconInterval;
2044 prBssInfo->ucDTIMPeriod = DOT11_DTIM_PERIOD_DEFAULT;
2045 prBssInfo->u2ATIMWindow = 0;
2046 prBssInfo->ucBeaconTimeoutCount = 0;
2047 if (prBowFsmInfo->fgSupportQoS)
2049 prAdapter->rWifiVar.fgSupportQoS = TRUE;
2050 prBssInfo->fgIsQBSS = TRUE;
2054 //3 <2> Update BSS_INFO_T common part
2056 bssInitForAP(prAdapter, prBssInfo, TRUE);
2057 nicQmUpdateWmmParms(prAdapter, NETWORK_TYPE_BOW_INDEX);
2058 #endif /* CFG_SUPPORT_AAA */
2059 prBssInfo->fgIsNetActive = TRUE;
2060 prBssInfo->fgIsBeaconActivated = TRUE;
2064 //4 <2> Initiate BSS_INFO_T - common part
2065 BOW_BSS_INFO_INIT(prAdapter, NETWORK_TYPE_BOW_INDEX);
2067 DBGLOG(BOW, EVENT, ("prBowFsmInfo->aucPeerAddress, %x:%x:%x:%x:%x:%x.\n", prBowFsmInfo->aucPeerAddress[0],
2068 prBowFsmInfo->aucPeerAddress[1],
2069 prBowFsmInfo->aucPeerAddress[2],
2070 prBowFsmInfo->aucPeerAddress[3],
2071 prBowFsmInfo->aucPeerAddress[4],
2072 prBowFsmInfo->aucPeerAddress[5]));
2075 //4 <3.1> use command packets to inform firmware
2076 rlmBssInitForAPandIbss(prAdapter, prBssInfo);
2077 nicUpdateBss(prAdapter, NETWORK_TYPE_BOW_INDEX);
2079 //4 <3.2> Update AdHoc PM parameter
2080 nicPmIndicateBssCreated(prAdapter, NETWORK_TYPE_BOW_INDEX);
2082 //4 <3.1> Reset HW TSF Update Mode and Beacon Mode
2084 //4 <3.2> Setup BSSID
2085 // TODO: rxmSetRxFilterBSSID0
2086 // rxmSetRxFilterBSSID0(prBssInfo->ucHwBssidId, prBssInfo->aucBSSID);
2088 //4 <3.3> Setup RX Filter to accept Probe Request
2089 // TODO: f get/set RX filter.
2094 if (halMacRxGetRxFilters(&u4RxFilter)== HAL_STATUS_SUCCESS) {
2096 u4RxFilter &= ~BIT(RXFILTER_DROP_PROBE_REQ);
2098 halMacRxSetRxFilters(u4RxFilter);
2104 /*Update BoW Table*/
2105 bowSetBowTableState(prAdapter, prBowFsmInfo->aucPeerAddress, BOW_DEVICE_STATE_STARTING);
2108 kalPrint("BoW Starting,[%d,%d]\n", g_u4LinkCount, g_u4Beaconing);
2109 DBGLOG(BOW, EVENT, ("bowStarting, g_u4LinkCount, %x.\n", g_u4LinkCount));
2113 if (g_u4Beaconing < 1)
2115 GLUE_INC_REF_CNT(g_u4Beaconing);
2116 bssSendBeaconProbeResponse(prAdapter, NETWORK_TYPE_BOW_INDEX, NULL, 0);
2117 cnmTimerStartTimer(prAdapter, &prBowFsmInfo->rStartingBeaconTimer, prBowFsmInfo->u2BeaconInterval);
2121 /*Responder: Start to scan Initiator*/
2122 if (prBowFsmInfo->ucRole == BOW_RESPONDER)
2125 DBGLOG(BOW, EVENT, ("bowStarting responder, start scan result searching.\n"));
2127 cnmTimerStopTimer(prAdapter, &prBowFsmInfo->rChGrantedTimer);
2128 bowReleaseCh(prAdapter);
2129 bowResponderScan(prAdapter);
2131 /*Initiator: Request channel, wait for responder*/
2133 //bowRequestCh(prAdapter);
2142 IN PUINT_8 puOwnMacAddr
2146 UINT_8 aucSSID[]=BOW_WILDCARD_SSID;
2148 kalMemCopy(pucSsid, aucSSID, BOW_WILDCARD_SSID_LEN);
2150 for (i = 0; i < 6; i++)
2152 pucSsid[(3 * i) + 3] = 0x2D;
2153 if ((*(puOwnMacAddr + i) >> 4) < 0xA)
2155 *(pucSsid + (3 * i) + 4) = (*(puOwnMacAddr + i) >> 4) + 0x30;
2159 *(pucSsid + (3 * i) + 4) = (*(puOwnMacAddr + i) >> 4) + 0x57;
2162 if ((*(puOwnMacAddr + i) & 0x0F) < 0xA)
2164 pucSsid[(3 * i) + 5] = (*(puOwnMacAddr + i) & 0x0F) + 0x30;
2168 pucSsid[(3 * i) + 5] = (*(puOwnMacAddr + i) & 0x0F) + 0x57;
2176 /*----------------------------------------------------------------------------*/
2178 * @brief This function will validate the Rx Probe Request Frame and then return
2179 * result to BSS to indicate if need to send the corresponding Probe Response
2180 * Frame if the specified conditions were matched.
2182 * @param[in] prAdapter Pointer to the Adapter structure.
2183 * @param[in] prSwRfb Pointer to SW RFB data structure.
2184 * @param[out] pu4ControlFlags Control flags for replying the Probe Response
2186 * @retval TRUE Reply the Probe Response
2187 * @retval FALSE Don't reply the Probe Response
2189 /*----------------------------------------------------------------------------*/
2191 bowValidateProbeReq(
2192 IN P_ADAPTER_T prAdapter,
2193 IN P_SW_RFB_T prSwRfb,
2194 OUT PUINT_32 pu4ControlFlags
2197 P_WLAN_MAC_MGMT_HEADER_T prMgtHdr;
2198 P_BOW_FSM_INFO_T prBowFsmInfo;
2199 P_BSS_INFO_T prBssInfo;
2200 P_IE_SSID_T prIeSsid = (P_IE_SSID_T)NULL;
2203 UINT_16 u2Offset = 0;
2204 BOOLEAN fgReplyProbeResp = FALSE;
2207 ASSERT(pu4ControlFlags);
2209 prBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_BOW_INDEX]);
2210 prBowFsmInfo = &(prAdapter->rWifiVar.rBowFsmInfo);
2214 DBGLOG(BOW, EVENT, ("bowValidateProbeReq.\n"));
2217 //4 <1> Parse Probe Req IE and Get IE ptr (SSID, Supported Rate IE, ...)
2218 prMgtHdr = (P_WLAN_MAC_MGMT_HEADER_T)prSwRfb->pvHeader;
2220 u2IELength = prSwRfb->u2PacketLen - prSwRfb->u2HeaderLen;
2221 pucIE = (PUINT_8)((UINT_32)prSwRfb->pvHeader + prSwRfb->u2HeaderLen);
2223 IE_FOR_EACH(pucIE, u2IELength, u2Offset) {
2224 if (ELEM_ID_SSID == IE_ID(pucIE)) {
2226 (IE_LEN(pucIE) <= ELEM_MAX_LEN_SSID)) {
2227 prIeSsid = (P_IE_SSID_T)pucIE;
2231 } /* end of IE_FOR_EACH */
2233 IE_FOR_EACH(pucIE, u2IELength, u2Offset) {
2234 if (ELEM_ID_SSID == IE_ID(pucIE)) {
2236 (IE_LEN(pucIE) <= ELEM_MAX_LEN_SSID)) {
2237 prIeSsid = (P_IE_SSID_T)pucIE;
2241 } /* end of IE_FOR_EACH */
2243 //4 <2> Check network conditions
2244 /*If BoW AP is beaconing*/
2245 if (prBssInfo->eCurrentOPMode == OP_MODE_BOW &&
2246 g_u4Beaconing > 0) {
2248 /*Check the probe requset sender is our peer*/
2249 if(bowCheckBowTableIfVaild(prAdapter, prMgtHdr->aucSrcAddr)) {
2250 fgReplyProbeResp = TRUE;
2252 /*Check the probe request target SSID is our SSID*/
2253 else if ((prIeSsid) &&
2254 EQUAL_SSID(prBssInfo->aucSSID, prBssInfo->ucSSIDLen,
2255 prIeSsid->aucSSID, prIeSsid->ucLength)) {
2256 fgReplyProbeResp = TRUE;
2259 fgReplyProbeResp = FALSE;
2263 return fgReplyProbeResp;
2268 /*----------------------------------------------------------------------------*/
2270 * @brief This function will indicate an Event of "Media Disconnect" to HOST
2272 * @param[in] u4Param Unused timer parameter
2276 /*----------------------------------------------------------------------------*/
2279 IN P_ADAPTER_T prAdapter,
2283 P_BOW_FSM_INFO_T prBowFsmInfo;
2285 prBowFsmInfo = &(prAdapter->rWifiVar.rBowFsmInfo);
2287 if ((g_u4Beaconing != 0) && (g_u4LinkCount > 0) && (g_u4LinkCount < CFG_BOW_PHYSICAL_LINK_NUM))
2290 bssSendBeaconProbeResponse(prAdapter, NETWORK_TYPE_BOW_INDEX, NULL, 0);
2291 cnmTimerStartTimer(prAdapter, &prBowFsmInfo->rStartingBeaconTimer, prBowFsmInfo->u2BeaconInterval);
2295 kalPrint("BoW Send Beacon,[%d,%d]\n", g_u4LinkCount, g_u4Beaconing);
2301 /*----------------------------------------------------------------------------*/
2303 * @brief This function will indicate an Event of "Media Disconnect" to HOST
2305 * @param[in] u4Param Unused timer parameter
2309 /*----------------------------------------------------------------------------*/
2312 IN P_ADAPTER_T prAdapter
2315 P_BOW_FSM_INFO_T prBowFsmInfo;
2316 P_MSG_SCN_SCAN_REQ prScanReqMsg;
2317 P_BSS_INFO_T prBssInfo;
2321 prBowFsmInfo = &(prAdapter->rWifiVar.rBowFsmInfo);
2322 prBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_BOW_INDEX]);
2325 DBGLOG(BOW, EVENT, ("bowResponderScan.\n"));
2326 kalPrint("BOW SCAN [REQ:%d]\n", prBowFsmInfo->ucSeqNumOfScanReq+1);
2329 prScanReqMsg = (P_MSG_SCN_SCAN_REQ)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_SCN_SCAN_REQ));
2333 ASSERT(0); // Can't trigger SCAN FSM
2337 /*Fill scan message*/
2338 prScanReqMsg->rMsgHdr.eMsgId = MID_BOW_SCN_SCAN_REQ;
2339 prScanReqMsg->ucSeqNum = ++prBowFsmInfo->ucSeqNumOfScanReq;
2340 prScanReqMsg->ucNetTypeIndex = (UINT_8)NETWORK_TYPE_BOW_INDEX;
2341 prScanReqMsg->eScanType = SCAN_TYPE_ACTIVE_SCAN;
2342 prScanReqMsg->ucSSIDType = SCAN_REQ_SSID_SPECIFIED;
2343 prScanReqMsg->ucSSIDLength = BOW_SSID_LEN;
2344 bowAssignSsid(prScanReqMsg->aucSSID, prBowFsmInfo->aucPeerAddress);
2345 prScanReqMsg->ucChannelListNum = 1;
2347 if (prBowFsmInfo->eBand == BAND_2G4)
2349 prScanReqMsg->eScanChannel = SCAN_CHANNEL_SPECIFIED;
2350 prScanReqMsg->arChnlInfoList[0].eBand = BAND_2G4;
2354 prScanReqMsg->eScanChannel = SCAN_CHANNEL_5G;
2355 prScanReqMsg->arChnlInfoList[0].eBand = BAND_5G;
2358 prScanReqMsg->arChnlInfoList[0].ucChannelNum = prBowFsmInfo->ucPrimaryChannel;
2359 prScanReqMsg->u2IELen = 0;
2361 /*Send scan message*/
2362 mboxSendMsg(prAdapter, MBOX_ID_0, (P_MSG_HDR_T) prScanReqMsg, MSG_SEND_METHOD_BUF);
2364 /*Change state to SCANNING*/
2365 bowSetBowTableState(prAdapter, prBowFsmInfo->aucPeerAddress, BOW_DEVICE_STATE_SCANNING);
2367 //prBowFsmInfo->fgTryScan = FALSE; /* Will enable background sleep for infrastructure */
2373 /*----------------------------------------------------------------------------*/
2381 /*----------------------------------------------------------------------------*/
2383 bowResponderScanDone(
2384 IN P_ADAPTER_T prAdapter,
2385 IN P_MSG_HDR_T prMsgHdr
2388 P_MSG_SCN_SCAN_DONE prScanDoneMsg;
2389 P_BOW_FSM_INFO_T prBowFsmInfo;
2390 P_BSS_DESC_T prBssDesc;
2391 UINT_8 ucSeqNumOfCompMsg;
2392 P_CONNECTION_SETTINGS_T prConnSettings;
2393 ENUM_BOW_DEVICE_STATE eFsmState;
2394 ENUM_SCAN_STATUS eScanStatus;
2399 prBowFsmInfo = &(prAdapter->rWifiVar.rBowFsmInfo);
2400 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
2401 prScanDoneMsg = (P_MSG_SCN_SCAN_DONE) prMsgHdr;
2402 eFsmState = bowGetBowTableState(prAdapter, prBowFsmInfo->aucPeerAddress);
2404 ASSERT(prScanDoneMsg->ucNetTypeIndex == NETWORK_TYPE_BOW_INDEX);
2406 ucSeqNumOfCompMsg = prScanDoneMsg->ucSeqNum;
2407 eScanStatus = prScanDoneMsg->eScanStatus;
2409 cnmMemFree(prAdapter, prMsgHdr);
2412 DBGLOG(BOW, EVENT, ("bowResponderScanDone.\n"));
2413 kalPrint("BOW SCAN [DONE:%d]\n", ucSeqNumOfCompMsg);
2416 if( eScanStatus == SCAN_STATUS_CANCELLED) {
2418 kalPrint("BOW SCAN [CANCELLED:%d]\n", ucSeqNumOfCompMsg);
2420 if(eFsmState == BOW_DEVICE_STATE_DISCONNECTING) {
2421 wlanoidSendSetQueryBowCmd(prAdapter,
2422 CMD_ID_CMD_BT_OVER_WIFI,
2425 wlanbowCmdEventLinkDisconnected,
2426 wlanbowCmdTimeoutHandler,
2434 else if(eFsmState == BOW_DEVICE_STATE_DISCONNECTED) {
2435 //bowDisconnectLink(prAdapter, NULL, TX_RESULT_SUCCESS);
2438 else if (ucSeqNumOfCompMsg != prBowFsmInfo->ucSeqNumOfScanReq)
2440 DBGLOG(BOW, EVENT, ("Sequence no. of BOW Responder scan done is not matched.\n"));
2445 prConnSettings->fgIsScanReqIssued = FALSE;
2446 prBssDesc = scanSearchBssDescByBssid(prAdapter, prBowFsmInfo->aucPeerAddress);
2448 DBGLOG(BOW, EVENT, ("End scan result searching.\n"));
2451 /*Initiator is FOUND*/
2452 if (prBssDesc != NULL)// (prBssDesc->aucBSSID != NULL))
2455 DBGLOG(BOW, EVENT, ("Search Bow Peer address - %x:%x:%x:%x:%x:%x.\n", prBssDesc->aucBSSID[0],
2456 prBssDesc->aucBSSID[1],
2457 prBssDesc->aucBSSID[2],
2458 prBssDesc->aucBSSID[3],
2459 prBssDesc->aucBSSID[4],
2460 prBssDesc->aucBSSID[5]));
2461 DBGLOG(BOW, EVENT, ("Starting to join initiator.\n"));
2463 /*Set target BssDesc*/
2464 prBowFsmInfo->prTargetBssDesc = prBssDesc;
2465 /*Request channel to do JOIN*/
2466 bowSetBowTableState(prAdapter, prBowFsmInfo->aucPeerAddress, BOW_DEVICE_STATE_ACQUIRING_CHANNEL);
2467 bowRequestCh(prAdapter);
2469 /*Initiator is NOT FOUND*/
2472 /*Scan again, until PAL timeout*/
2473 bowResponderScan(prAdapter);
2475 wlanoidSendSetQueryBowCmd(prAdapter,
2476 CMD_ID_CMD_BT_OVER_WIFI,
2479 wlanbowCmdEventLinkDisconnected,
2480 wlanbowCmdTimeoutHandler,
2493 /*----------------------------------------------------------------------------*/
2495 * @brief Function for cancelling scan request. There is another option to extend channel privilige
2496 * for another purpose.
2498 * @param fgIsChannelExtention - Keep the channel previlege, but can cancel scan timer.
2502 /*----------------------------------------------------------------------------*/
2504 bowResponderCancelScan (
2505 IN P_ADAPTER_T prAdapter,
2506 IN BOOLEAN fgIsChannelExtention
2510 P_MSG_SCN_SCAN_CANCEL prScanCancel = (P_MSG_SCN_SCAN_CANCEL)NULL;
2511 P_BOW_FSM_INFO_T prBowFsmInfo = (P_BOW_FSM_INFO_T)NULL;
2513 DEBUGFUNC("bowResponderCancelScan()");
2518 prBowFsmInfo = &(prAdapter->rWifiVar.rBowFsmInfo);
2522 kalPrint("BOW SCAN [CANCEL:%d]\n", prBowFsmInfo->ucSeqNumOfScanReq);
2524 /* There is a channel privilege on hand. */
2526 DBGLOG(P2P, TRACE, ("BOW Cancel Scan\n"));
2528 prScanCancel = (P_MSG_SCN_SCAN_CANCEL)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_SCN_SCAN_CANCEL));
2529 if (!prScanCancel) {
2530 /* Buffer not enough, can not cancel scan request. */
2531 DBGLOG(P2P, TRACE, ("Buffer not enough, can not cancel scan.\n"));
2536 prScanCancel->rMsgHdr.eMsgId = MID_BOW_SCN_SCAN_CANCEL;
2537 prScanCancel->ucNetTypeIndex = NETWORK_TYPE_BOW_INDEX;
2538 prScanCancel->ucSeqNum = prBowFsmInfo->ucSeqNumOfScanReq;
2539 #if CFG_ENABLE_WIFI_DIRECT
2540 prScanCancel->fgIsChannelExt = fgIsChannelExtention;
2542 mboxSendMsg(prAdapter,
2544 (P_MSG_HDR_T)prScanCancel,
2545 MSG_SEND_METHOD_BUF);
2551 } /* bowResponderCancelScan */
2554 /*----------------------------------------------------------------------------*/
2556 * @brief Initialization of JOIN STATE
2558 * @param[in] prBssDesc The pointer of BSS_DESC_T which is the BSS we will try to join with.
2562 /*----------------------------------------------------------------------------*/
2565 IN P_ADAPTER_T prAdapter,
2566 IN P_BSS_DESC_T prBssDesc
2569 P_BOW_FSM_INFO_T prBowFsmInfo;
2570 P_BSS_INFO_T prBssInfo;
2571 P_CONNECTION_SETTINGS_T prConnSettings;
2572 P_STA_RECORD_T prStaRec;
2573 P_MSG_JOIN_REQ_T prJoinReqMsg;
2578 DBGLOG(BOW, EVENT, ("Starting bowResponderJoin.\n"));
2580 prBowFsmInfo = &(prAdapter->rWifiVar.rBowFsmInfo);
2581 prBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_BOW_INDEX]);
2582 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
2584 //4 <1> We are going to connect to this BSS.
2585 prBssDesc->fgIsConnecting = TRUE;
2586 bowSetBowTableState(prAdapter, prBowFsmInfo->aucPeerAddress, BOW_DEVICE_STATE_CONNECTING);
2588 //4 <2> Setup corresponding STA_RECORD_T
2589 /*Support First JOIN and retry*/
2590 prStaRec = bssCreateStaRecFromBssDesc(
2593 NETWORK_TYPE_BOW_INDEX,
2596 prBowFsmInfo->prTargetStaRec = prStaRec;
2598 //4 <3> Update ucAvailableAuthTypes which we can choice during SAA
2599 prStaRec->fgIsReAssoc = FALSE;
2600 prBowFsmInfo->ucAvailableAuthTypes = (UINT_8)AUTH_TYPE_OPEN_SYSTEM;
2601 prStaRec->ucTxAuthAssocRetryLimit = TX_AUTH_ASSOCI_RETRY_LIMIT;
2604 //4 <4> Use an appropriate Authentication Algorithm Number among the ucAvailableAuthTypes
2605 if (prBowFsmInfo->ucAvailableAuthTypes &
2606 (UINT_8)AUTH_TYPE_OPEN_SYSTEM) {
2608 DBGLOG(BOW, LOUD, ("JOIN INIT: Try to do Authentication with AuthType == OPEN_SYSTEM.\n"));
2609 prBowFsmInfo->ucAvailableAuthTypes &=
2610 ~(UINT_8)AUTH_TYPE_OPEN_SYSTEM;
2612 prStaRec->ucAuthAlgNum = (UINT_8)AUTH_ALGORITHM_NUM_OPEN_SYSTEM;
2618 //4 <4.1> sync. to firmware domain
2619 cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_1);
2621 //4 <5> Overwrite Connection Setting for eConnectionPolicy
2622 if (prBssDesc->ucSSIDLen) {
2623 COPY_SSID(prConnSettings->aucSSID,
2624 prConnSettings->ucSSIDLen,
2626 prBssDesc->ucSSIDLen);
2628 DBGLOG(BOW, EVENT, ("bowResponderJoin, SSID %s.\n", prBssDesc->aucSSID));
2629 DBGLOG(BOW, EVENT, ("bowResponderJoin, SSID %s.\n", prConnSettings->aucSSID));
2633 //4 <6> Send a Msg to trigger SAA to start JOIN process.
2634 prJoinReqMsg = (P_MSG_JOIN_REQ_T)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_JOIN_REQ_T));
2635 if (!prJoinReqMsg) {
2637 ASSERT(0); // Can't trigger SAA FSM
2641 prJoinReqMsg->rMsgHdr.eMsgId = MID_BOW_SAA_FSM_START;
2642 prJoinReqMsg->ucSeqNum = ++prBowFsmInfo->ucSeqNumOfReqMsg;
2643 prJoinReqMsg->prStaRec = prStaRec;
2645 prBssInfo->prStaRecOfAP = prStaRec;
2648 DBGLOG(BOW, EVENT, ("prStaRec->eStaType, %x.\n", prStaRec->eStaType));
2649 printk("BoW trigger SAA ["MACSTR"]\n", MAC2STR(prStaRec->aucMacAddr));
2652 mboxSendMsg(prAdapter,
2654 (P_MSG_HDR_T) prJoinReqMsg,
2655 MSG_SEND_METHOD_BUF);
2661 /*----------------------------------------------------------------------------*/
2663 * @brief This function will handle the Join Complete Event from SAA FSM for BOW FSM
2665 * @param[in] prMsgHdr Message of Join Complete of SAA FSM.
2669 /*----------------------------------------------------------------------------*/
2671 bowFsmRunEventJoinComplete(
2672 IN P_ADAPTER_T prAdapter,
2673 IN P_MSG_HDR_T prMsgHdr
2676 P_MSG_JOIN_COMP_T prJoinCompMsg;
2677 P_BOW_FSM_INFO_T prBowFsmInfo;
2678 P_STA_RECORD_T prStaRec;
2679 P_SW_RFB_T prAssocRspSwRfb;
2680 P_BSS_INFO_T prBssInfo;
2681 P_WLAN_ASSOC_RSP_FRAME_T prAssocRspFrame = (P_WLAN_ASSOC_RSP_FRAME_T) NULL;
2684 P_BSS_INFO_T prBowBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_BOW_INDEX]);
2689 prBowFsmInfo = &(prAdapter->rWifiVar.rBowFsmInfo);
2690 prJoinCompMsg = (P_MSG_JOIN_COMP_T)prMsgHdr;
2691 prStaRec = prJoinCompMsg->prStaRec;
2694 DBGLOG(BOW, EVENT, ("Start bowfsmRunEventJoinComplete.\n"));
2695 DBGLOG(BOW, EVENT, ("bowfsmRunEventJoinComplete ptr check\n"));
2696 DBGLOG(BOW, EVENT, ("prMsgHdr %x\n", prMsgHdr));
2697 DBGLOG(BOW, EVENT, ("prAdapter %x\n", prAdapter));
2698 DBGLOG(BOW, EVENT, ("prBowFsmInfo %x\n", prBowFsmInfo));
2699 DBGLOG(BOW, EVENT, ("prStaRec %x\n", prStaRec));
2703 ASSERT(prBowFsmInfo);
2706 if (prJoinCompMsg->ucSeqNum == prBowFsmInfo->ucSeqNumOfReqMsg) {
2707 COPY_MAC_ADDR(prBowFsmInfo->aucPeerAddress, prStaRec->aucMacAddr);
2709 //4 <1> JOIN was successful
2710 if (prJoinCompMsg->rJoinStatus == WLAN_STATUS_SUCCESS) {
2711 prAssocRspSwRfb = prJoinCompMsg->prSwRfb;
2712 prAssocRspFrame = (P_WLAN_ASSOC_RSP_FRAME_T) prAssocRspSwRfb->pvHeader;
2713 prBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_BOW_INDEX]);
2715 u2IELength = (UINT_16) ((prAssocRspSwRfb->u2PacketLen - prAssocRspSwRfb->u2HeaderLen) -
2716 (OFFSET_OF(WLAN_ASSOC_RSP_FRAME_T, aucInfoElem[0]) - WLAN_MAC_MGMT_HEADER_LEN));
2717 pucIE = prAssocRspFrame->aucInfoElem;
2719 prStaRec->eStaType = STA_TYPE_BOW_AP;
2720 prStaRec->u2DesiredNonHTRateSet &= prBowBssInfo->u2OperationalRateSet;
2721 prStaRec->ucDesiredPhyTypeSet = prStaRec->ucPhyTypeSet & prBowBssInfo->ucPhyTypeSet;
2722 #if CFG_BOW_RATE_LIMITATION
2723 //4 <1.2>Update Rate Set
2724 /*Limit Rate Set to 24M, 48M, 54M */
2725 prStaRec->u2DesiredNonHTRateSet &= (RATE_SET_BIT_24M |
2728 /*If peer cannot support the above rate set, fix on the avaliable highest rate*/
2729 if(prStaRec->u2DesiredNonHTRateSet == 0) {
2730 UINT_8 ucHighestRateIndex;
2731 if (rateGetHighestRateIndexFromRateSet(prBowBssInfo->u2OperationalRateSet, &ucHighestRateIndex)) {
2732 prStaRec->u2DesiredNonHTRateSet = BIT(ucHighestRateIndex);
2737 //4 <1.1> Change FW's Media State immediately.
2738 bowChangeMediaState(prAdapter, PARAM_MEDIA_STATE_CONNECTED);
2740 mqmProcessAssocRsp(prAdapter, prAssocRspSwRfb, pucIE, u2IELength);
2742 //4 <1.2> Update HT information and set channel
2743 /* Record HT related parameters in rStaRec and rBssInfo
2744 * Note: it shall be called before nicUpdateBss()
2746 #if CFG_BOW_SUPPORT_11N
2747 rlmProcessAssocRsp(prAdapter, prAssocRspSwRfb, pucIE, u2IELength);
2750 //4 <1.3> Update BSS_INFO_T
2751 nicUpdateBss(prAdapter, NETWORK_TYPE_BOW_INDEX);
2753 DBGLOG(BOW, EVENT, ("Finish bowUpdateBssInfoForJOIN.\n"));
2755 //4 <1.4> Activate current AP's STA_RECORD_T in Driver.
2756 cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_3);
2759 DBGLOG(BOW, EVENT, ("bowFsmRunEventJoinComplete, qmActivateStaRec.\n"));
2762 //4 <1.7> Set the Next State of BOW FSM
2763 wlanoidSendSetQueryBowCmd(prAdapter,
2764 CMD_ID_CMD_BT_OVER_WIFI,
2767 wlanbowCmdEventLinkConnected,
2768 wlanbowCmdTimeoutHandler,
2774 //4 <2> JOIN was not successful
2778 bowResponderJoin(prAdapter, prBowFsmInfo->prTargetBssDesc);
2780 wlanoidSendSetQueryBowCmd(prAdapter,
2781 CMD_ID_CMD_BT_OVER_WIFI,
2784 wlanbowCmdEventLinkDisconnected,
2785 wlanbowCmdTimeoutHandler,
2792 DBGLOG(BOW, EVENT, ("Start bowfsmRunEventJoinComplete -- Join failed.\n"));
2793 printk("BoW trigger SAA REJOIN\n");
2798 cnmMemFree(prAdapter, prMsgHdr);
2803 /*----------------------------------------------------------------------------*/
2805 * @brief This function will indicate the Media State to HOST
2807 * @param[in] eConnectionState Current Media State
2808 * @param[in] fgDelayIndication Set TRUE for postponing the Disconnect Indication.
2812 /*----------------------------------------------------------------------------*/
2814 bowIndicationOfMediaStateToHost (
2815 IN P_ADAPTER_T prAdapter,
2816 IN ENUM_PARAM_MEDIA_STATE_T eConnectionState,
2817 IN BOOLEAN fgDelayIndication
2820 EVENT_CONNECTION_STATUS rEventConnStatus;
2821 P_CONNECTION_SETTINGS_T prConnSettings;
2822 P_BSS_INFO_T prBssInfo;
2823 P_BOW_FSM_INFO_T prBowFsmInfo;
2826 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
2827 prBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_BOW_INDEX]);
2828 prBowFsmInfo = &(prAdapter->rWifiVar.rBowFsmInfo);
2830 // NOTE(Kevin): Move following line to bowChangeMediaState() macro per CM's request.
2831 //prBowBssInfo->eConnectionState = eConnectionState;
2833 /* For indicating the Disconnect Event only if current media state is
2834 * disconnected and we didn't do indication yet.
2836 if (prBssInfo->eConnectionState == PARAM_MEDIA_STATE_DISCONNECTED) {
2837 if (prBssInfo->eConnectionStateIndicated == eConnectionState) {
2842 if (!fgDelayIndication) {
2843 //4 <0> Cancel Delay Timer
2844 cnmTimerStopTimer(prAdapter, &prBowFsmInfo->rIndicationOfDisconnectTimer);
2846 //4 <1> Fill EVENT_CONNECTION_STATUS
2847 rEventConnStatus.ucMediaStatus = (UINT_8)eConnectionState;
2849 if (eConnectionState == PARAM_MEDIA_STATE_CONNECTED) {
2850 rEventConnStatus.ucReasonOfDisconnect = DISCONNECT_REASON_CODE_RESERVED;
2852 if (prBssInfo->eCurrentOPMode == OP_MODE_BOW) {
2853 rEventConnStatus.ucInfraMode = (UINT_8)NET_TYPE_INFRA;
2854 rEventConnStatus.u2AID = prBssInfo->u2AssocId;
2855 rEventConnStatus.u2ATIMWindow = 0;
2857 else if (prBssInfo->eCurrentOPMode == OP_MODE_IBSS) {
2858 rEventConnStatus.ucInfraMode = (UINT_8)NET_TYPE_IBSS;
2859 rEventConnStatus.u2AID = 0;
2860 rEventConnStatus.u2ATIMWindow = prBssInfo->u2ATIMWindow;
2866 COPY_SSID(rEventConnStatus.aucSsid,
2867 rEventConnStatus.ucSsidLen,
2868 prConnSettings->aucSSID,
2869 prConnSettings->ucSSIDLen);
2871 COPY_MAC_ADDR(rEventConnStatus.aucBssid, prBssInfo->aucBSSID);
2873 rEventConnStatus.u2BeaconPeriod = prBssInfo->u2BeaconInterval;
2874 rEventConnStatus.u4FreqInKHz = nicChannelNum2Freq(prBssInfo->ucPrimaryChannel);
2876 switch (prBssInfo->ucNonHTBasicPhyType) {
2877 case PHY_TYPE_HR_DSSS_INDEX:
2878 rEventConnStatus.ucNetworkType = (UINT_8)PARAM_NETWORK_TYPE_DS;
2881 case PHY_TYPE_ERP_INDEX:
2882 rEventConnStatus.ucNetworkType = (UINT_8)PARAM_NETWORK_TYPE_OFDM24;
2885 case PHY_TYPE_OFDM_INDEX:
2886 rEventConnStatus.ucNetworkType = (UINT_8)PARAM_NETWORK_TYPE_OFDM5;
2891 rEventConnStatus.ucNetworkType = (UINT_8)PARAM_NETWORK_TYPE_DS;
2896 #if CFG_PRIVACY_MIGRATION
2897 /* Clear the pmkid cache while media disconnect */
2898 secClearPmkid(prAdapter);
2901 rEventConnStatus.ucReasonOfDisconnect = prBssInfo->ucReasonOfDisconnect;
2906 nicMediaStateChange(prAdapter, NETWORK_TYPE_BOW_INDEX, &rEventConnStatus);
2907 prBssInfo->eConnectionStateIndicated = eConnectionState;
2910 /* NOTE: Only delay the Indication of Disconnect Event */
2911 ASSERT(eConnectionState == PARAM_MEDIA_STATE_DISCONNECTED);
2913 DBGLOG(BOW, INFO, ("Postpone the indication of Disconnect for %d seconds\n",
2914 prConnSettings->ucDelayTimeOfDisconnectEvent));
2916 cnmTimerStartTimer(prAdapter,
2917 &prBowFsmInfo->rIndicationOfDisconnectTimer,
2918 SEC_TO_MSEC(prConnSettings->ucDelayTimeOfDisconnectEvent));
2925 /*----------------------------------------------------------------------------*/
2927 * @brief This function will indiate the Event of Tx Fail of AAA Module.
2929 * @param[in] prAdapter Pointer to the Adapter structure.
2930 * @param[in] prStaRec Pointer to the STA_RECORD_T
2934 /*----------------------------------------------------------------------------*/
2936 bowRunEventAAATxFail (
2937 IN P_ADAPTER_T prAdapter,
2938 IN P_STA_RECORD_T prStaRec
2941 P_BSS_INFO_T prBssInfo;
2947 DBGLOG(BOW, EVENT, ("bowRunEventAAATxFail , bssRemoveStaRecFromClientList.\n"));
2948 printk("BoW AAA TxFail, target state %d\n", prStaRec->ucStaState+1);
2951 prBssInfo = &(prAdapter->rWifiVar.arBssInfo[prStaRec->ucNetTypeIndex]);
2952 bssRemoveStaRecFromClientList(prAdapter, prBssInfo, prStaRec);
2958 /*----------------------------------------------------------------------------*/
2960 * @brief This function will indiate the Event of Successful Completion of AAA Module.
2962 * @param[in] prAdapter Pointer to the Adapter structure.
2963 * @param[in] prStaRec Pointer to the STA_RECORD_T
2967 /*----------------------------------------------------------------------------*/
2969 bowRunEventAAAComplete (
2970 IN P_ADAPTER_T prAdapter,
2971 IN P_STA_RECORD_T prStaRec
2974 P_BOW_FSM_INFO_T prBowFsmInfo;
2978 prBowFsmInfo = &(prAdapter->rWifiVar.rBowFsmInfo);
2981 DBGLOG(BOW, EVENT, ("bowRunEventAAAComplete, cnmStaRecChangeState, STA_STATE_3.\n"));
2982 printk("BoW AAA complete ["MACSTR"]\n", MAC2STR(prStaRec->aucMacAddr));
2985 /*Update BssInfo to connected*/
2986 bowChangeMediaState(prAdapter, PARAM_MEDIA_STATE_CONNECTED);
2987 nicUpdateBss(prAdapter, NETWORK_TYPE_BOW_INDEX);
2989 /*Update StaRec to State3*/
2990 cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_3);
2993 wlanoidSendSetQueryBowCmd(prAdapter,
2994 CMD_ID_CMD_BT_OVER_WIFI,
2997 wlanbowCmdEventLinkConnected,
2998 wlanbowCmdTimeoutHandler,
3004 return WLAN_STATUS_SUCCESS;
3007 /*----------------------------------------------------------------------------*/
3009 * @brief This function will handle RxDeauth
3011 * @param[in] prAdapter Pointer to the Adapter structure.
3012 * @param[in] prStaRec Pointer to the STA_RECORD_T
3016 /*----------------------------------------------------------------------------*/
3019 bowRunEventRxDeAuth (
3020 IN P_ADAPTER_T prAdapter,
3021 IN P_STA_RECORD_T prStaRec,
3022 IN P_SW_RFB_T prSwRfb
3025 P_BSS_INFO_T prBowBssInfo;
3026 P_BOW_FSM_INFO_T prBowFsmInfo;
3027 ENUM_BOW_DEVICE_STATE eFsmState;
3031 prBowFsmInfo = &(prAdapter->rWifiVar.rBowFsmInfo);
3032 prBowBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_BOW_INDEX]);
3034 if(!IS_STA_IN_BOW(prStaRec)) {
3035 return WLAN_STATUS_NOT_ACCEPTED;
3038 eFsmState = bowGetBowTableState(prAdapter, prStaRec->aucMacAddr);
3040 if(eFsmState == BOW_DEVICE_STATE_DISCONNECTED) {
3042 return WLAN_STATUS_NOT_ACCEPTED;
3045 if (prStaRec->ucStaState > STA_STATE_1) {
3047 if (STA_STATE_3 == prStaRec->ucStaState) {
3048 //P_MSG_AIS_ABORT_T prAisAbortMsg;
3050 /* NOTE(Kevin): Change state immediately to avoid starvation of
3051 * MSG buffer because of too many deauth frames before changing
3054 cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_1);
3057 COPY_MAC_ADDR(prBowFsmInfo->aucPeerAddress, prStaRec->aucMacAddr);
3059 wlanoidSendSetQueryBowCmd(prAdapter,
3060 CMD_ID_CMD_BT_OVER_WIFI,
3063 wlanbowCmdEventLinkDisconnected,
3064 wlanbowCmdTimeoutHandler,
3070 return WLAN_STATUS_SUCCESS;
3073 return WLAN_STATUS_NOT_ACCEPTED;
3077 /*----------------------------------------------------------------------------*/
3079 * \brief This function handle BoW Link disconnect.
3081 * \param[in] pMsduInfo Pointer to the Msdu Info
3082 * \param[in] rStatus The Tx done status
3086 * \note after receive deauth frame, callback function call this
3088 /*----------------------------------------------------------------------------*/
3091 IN P_ADAPTER_T prAdapter,
3092 IN P_MSDU_INFO_T prMsduInfo,
3093 IN ENUM_TX_RESULT_CODE_T rTxDoneStatus
3096 P_BOW_FSM_INFO_T prBowFsmInfo;
3097 P_STA_RECORD_T prStaRec;
3101 prBowFsmInfo = &(prAdapter->rWifiVar.rBowFsmInfo);
3103 /*Free target StaRec*/
3105 prStaRec = cnmGetStaRecByIndex(prAdapter, prMsduInfo->ucStaRecIndex);
3108 prStaRec = prBowFsmInfo->prTargetStaRec;
3112 //cnmStaRecFree(prAdapter, prStaRec, TRUE);
3113 cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_1);
3115 kalPrint("bowDisconnectLink\n");
3116 /*No one connected*/
3117 if (g_u4LinkCount == 0 && g_u4Beaconing != 0)
3119 cnmTimerStopTimer(prAdapter, &prBowFsmInfo->rStartingBeaconTimer);
3120 bowStopping(prAdapter);
3121 kalPrint("bowStopping\n");
3122 /*Restore TxPower from Short range mode*/
3123 #if CFG_SUPPORT_NVRAM && 0
3124 wlanLoadManufactureData(prAdapter, kalGetConfiguration(prAdapter->prGlueInfo));
3126 /*Uninit BoW Interface*/
3127 #if CFG_BOW_SEPARATE_DATA_PATH
3128 kalUninitBowDevice(prAdapter->prGlueInfo);
3134 /*----------------------------------------------------------------------------*/
3136 * @brief This function will validate the Rx Assoc Req Frame and then return
3137 * the status code to AAA to indicate if need to perform following actions
3138 * when the specified conditions were matched.
3140 * @param[in] prAdapter Pointer to the Adapter structure.
3141 * @param[in] prSwRfb Pointer to SW RFB data structure.
3142 * @param[out] pu2StatusCode The Status Code of Validation Result
3144 * @retval TRUE Reply the Assoc Resp
3145 * @retval FALSE Don't reply the Assoc Resp
3147 /*----------------------------------------------------------------------------*/
3149 bowValidateAssocReq (
3150 IN P_ADAPTER_T prAdapter,
3151 IN P_SW_RFB_T prSwRfb,
3152 OUT PUINT_16 pu2StatusCode
3155 BOOLEAN fgReplyAssocResp = FALSE;
3156 P_BSS_INFO_T prBowBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_BOW_INDEX]);
3157 P_STA_RECORD_T prStaRec = (P_STA_RECORD_T)NULL;
3158 P_BOW_FSM_INFO_T prBowFsmInfo;
3159 P_WLAN_ASSOC_REQ_FRAME_T prAssocReqFrame = (P_WLAN_ASSOC_REQ_FRAME_T)NULL;
3160 OS_SYSTIME rCurrentTime;
3161 static OS_SYSTIME rLastRejectAssocTime = 0;
3165 prBowFsmInfo = &(prAdapter->rWifiVar.rBowFsmInfo);
3166 prAssocReqFrame = (P_WLAN_ASSOC_REQ_FRAME_T) prSwRfb->pvHeader;
3167 *pu2StatusCode = STATUS_CODE_REQ_DECLINED;
3170 DBGLOG(BOW, EVENT, ("bowValidateAssocReq, prBowFsmInfo->aucPeerAddress, %x:%x:%x:%x:%x:%x.\n",
3171 prBowFsmInfo->aucPeerAddress[0],
3172 prBowFsmInfo->aucPeerAddress[1],
3173 prBowFsmInfo->aucPeerAddress[2],
3174 prBowFsmInfo->aucPeerAddress[3],
3175 prBowFsmInfo->aucPeerAddress[4],
3176 prBowFsmInfo->aucPeerAddress[5]));
3177 DBGLOG(BOW, EVENT, ("bowValidateAssocReq, prAssocReqFrame->aucSrcAddr, %x:%x:%x:%x:%x:%x.\n",
3178 prAssocReqFrame->aucSrcAddr[0],
3179 prAssocReqFrame->aucSrcAddr[1],
3180 prAssocReqFrame->aucSrcAddr[2],
3181 prAssocReqFrame->aucSrcAddr[3],
3182 prAssocReqFrame->aucSrcAddr[4],
3183 prAssocReqFrame->aucSrcAddr[5]));
3187 while(EQUAL_MAC_ADDR(prAssocReqFrame->aucSrcAddr, prBowFsmInfo->aucPeerAddress)) {
3189 DBGLOG(BOW, EVENT, ("bowValidateAssocReq, return wlanbowCmdEventLinkConnected.\n"));
3192 prStaRec = cnmGetStaRecByAddress(prAdapter,
3193 (UINT_8) NETWORK_TYPE_BOW_INDEX,
3194 prAssocReqFrame->aucSrcAddr);
3195 prStaRec->eStaType = STA_TYPE_BOW_CLIENT;
3196 prStaRec->u2DesiredNonHTRateSet &= prBowBssInfo->u2OperationalRateSet;
3197 prStaRec->ucDesiredPhyTypeSet = prStaRec->ucPhyTypeSet & prBowBssInfo->ucPhyTypeSet;
3199 #if CFG_BOW_RATE_LIMITATION
3200 /*Limit Rate Set to 24M, 48M, 54M */
3201 prStaRec->u2DesiredNonHTRateSet &= (RATE_SET_BIT_24M |
3204 /*If peer cannot support the above rate set, fix on the avaliable highest rate*/
3205 if(prStaRec->u2DesiredNonHTRateSet == 0) {
3206 UINT_8 ucHighestRateIndex;
3207 if (rateGetHighestRateIndexFromRateSet(prBowBssInfo->u2OperationalRateSet, &ucHighestRateIndex)) {
3208 prStaRec->u2DesiredNonHTRateSet = BIT(ucHighestRateIndex);
3210 /*If no avaliable rate is found, DECLINE the association*/
3211 *pu2StatusCode = STATUS_CODE_ASSOC_DENIED_RATE_NOT_SUPPORTED;
3216 prStaRec->ucNetTypeIndex = NETWORK_TYPE_BOW_INDEX;
3218 /*Undpate BssInfo to FW*/
3219 bowChangeMediaState(prAdapter, PARAM_MEDIA_STATE_CONNECTED);
3220 nicUpdateBss(prAdapter, NETWORK_TYPE_BOW_INDEX);
3222 /*reply successful*/
3223 *pu2StatusCode = STATUS_CODE_SUCCESSFUL;
3224 fgReplyAssocResp = TRUE;
3229 if(*pu2StatusCode != STATUS_CODE_SUCCESSFUL) {
3230 /*Reply Assoc with reject every 5s*/
3231 rCurrentTime = kalGetTimeTick();
3232 if(CHECK_FOR_TIMEOUT(rCurrentTime, rLastRejectAssocTime, MSEC_TO_SYSTIME(5000)) ||
3233 rLastRejectAssocTime == 0
3235 fgReplyAssocResp = TRUE;
3236 rLastRejectAssocTime = rCurrentTime;
3240 return fgReplyAssocResp;
3244 /*----------------------------------------------------------------------------*/
3246 * @brief This function will validate the Rx Auth Frame and then return
3247 * the status code to AAA to indicate if need to perform following actions
3248 * when the specified conditions were matched.
3250 * @param[in] prAdapter Pointer to the Adapter structure.
3251 * @param[in] prSwRfb Pointer to SW RFB data structure.
3252 * @param[in] pprStaRec Pointer to pointer of STA_RECORD_T structure.
3253 * @param[out] pu2StatusCode The Status Code of Validation Result
3255 * @retval TRUE Reply the Auth
3256 * @retval FALSE Don't reply the Auth
3258 /*----------------------------------------------------------------------------*/
3261 IN P_ADAPTER_T prAdapter,
3262 IN P_SW_RFB_T prSwRfb,
3263 IN PP_STA_RECORD_T pprStaRec,
3264 OUT PUINT_16 pu2StatusCode
3267 BOOLEAN fgReplyAuth = FALSE;
3268 P_BSS_INFO_T prBowBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_BOW_INDEX]);
3269 P_STA_RECORD_T prStaRec = (P_STA_RECORD_T)NULL;
3270 P_BOW_FSM_INFO_T prBowFsmInfo;
3271 P_WLAN_AUTH_FRAME_T prAuthFrame = (P_WLAN_AUTH_FRAME_T)NULL;
3272 OS_SYSTIME rCurrentTime;
3273 static OS_SYSTIME rLastRejectAuthTime = 0;
3275 /* TODO(Kevin): Call BoW functions to check ..
3276 1. Check we are BoW now.
3277 2. Check we can accept connection from thsi peer
3278 3. Check Black List here.
3281 prBowFsmInfo = &(prAdapter->rWifiVar.rBowFsmInfo);
3282 prAuthFrame = (P_WLAN_AUTH_FRAME_T) prSwRfb->pvHeader;
3285 DBGLOG(BOW, EVENT, ("bowValidateAuth, prBowFsmInfo->aucPeerAddress, %x:%x:%x:%x:%x:%x.\n",
3286 prBowFsmInfo->aucPeerAddress[0],
3287 prBowFsmInfo->aucPeerAddress[1],
3288 prBowFsmInfo->aucPeerAddress[2],
3289 prBowFsmInfo->aucPeerAddress[3],
3290 prBowFsmInfo->aucPeerAddress[4],
3291 prBowFsmInfo->aucPeerAddress[5]));
3292 DBGLOG(BOW, EVENT, ("bowValidateAuth, prAuthFrame->aucSrcAddr, %x:%x:%x:%x:%x:%x.\n",
3293 prAuthFrame->aucSrcAddr[0],
3294 prAuthFrame->aucSrcAddr[1],
3295 prAuthFrame->aucSrcAddr[2],
3296 prAuthFrame->aucSrcAddr[3],
3297 prAuthFrame->aucSrcAddr[4],
3298 prAuthFrame->aucSrcAddr[5]));
3301 prStaRec = cnmGetStaRecByAddress(prAdapter,
3302 (UINT_8) NETWORK_TYPE_BOW_INDEX,
3303 prAuthFrame->aucSrcAddr);
3306 DBGLOG(BOW, EVENT, ("bowValidateAuth, cnmStaRecAlloc.\n"));
3308 prStaRec = cnmStaRecAlloc(prAdapter,
3309 (UINT_8) NETWORK_TYPE_BOW_INDEX);
3311 /* TODO(Kevin): Error handling of allocation of STA_RECORD_T for
3312 * exhausted case and do removal of unused STA_RECORD_T.
3315 COPY_MAC_ADDR(prStaRec->aucMacAddr, prAuthFrame->aucSrcAddr);
3316 prSwRfb->ucStaRecIdx = prStaRec->ucIndex;
3317 prBowBssInfo->prStaRecOfAP = prStaRec;
3319 /* NOTE(Kevin): Better to change state here, not at TX Done */
3320 cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_1);
3322 DBGLOG(BOW, EVENT, ("bowValidateAuth, cnmStaRecChangeState.\n"));
3327 prSwRfb->ucStaRecIdx = prStaRec->ucIndex;
3329 DBGLOG(BOW, EVENT, ("bowValidateAuth, prStaRec->ucIndex, %x.\n", prStaRec->ucIndex));
3331 bssRemoveStaRecFromClientList(prAdapter, prBowBssInfo, prStaRec);
3334 if (EQUAL_MAC_ADDR(prAuthFrame->aucSrcAddr, prBowFsmInfo->aucPeerAddress)) {
3336 prStaRec->eStaType = STA_TYPE_BOW_CLIENT;
3337 prStaRec->ucNetTypeIndex = NETWORK_TYPE_BOW_INDEX;
3339 DBGLOG(BOW, EVENT, ("bowValidateAuth, prStaRec->eStaType, %x.\n", prStaRec->eStaType));
3340 DBGLOG(BOW, EVENT, ("bowValidateAuth, prStaRec->ucNetTypeIndex, %x.\n", prStaRec->ucNetTypeIndex));
3342 /* Update Station Record - Status/Reason Code */
3343 prStaRec->u2StatusCode = STATUS_CODE_SUCCESSFUL;
3344 prStaRec->ucJoinFailureCount = 0;
3345 *pprStaRec = prStaRec;
3346 *pu2StatusCode = STATUS_CODE_SUCCESSFUL;
3350 cnmStaRecFree(prAdapter, prStaRec, FALSE);
3351 *pu2StatusCode = STATUS_CODE_REQ_DECLINED;
3353 /*Reply auth with reject every 5s*/
3354 rCurrentTime = kalGetTimeTick();
3355 if(CHECK_FOR_TIMEOUT(rCurrentTime, rLastRejectAuthTime, MSEC_TO_SYSTIME(5000)) ||
3356 rLastRejectAuthTime == 0
3359 rLastRejectAuthTime = rCurrentTime;
3364 DBGLOG(BOW, EVENT, ("bowValidateAuth, fgReplyAuth, %x.\n", fgReplyAuth));
3370 /*----------------------------------------------------------------------------*/
3372 * \brief This function is invoked when CNM granted channel privilege
3374 * \param[in] prAdapter Pointer of ADAPTER_T
3378 /*----------------------------------------------------------------------------*/
3380 bowRunEventChGrant (
3381 IN P_ADAPTER_T prAdapter,
3382 IN P_MSG_HDR_T prMsgHdr
3385 P_BSS_INFO_T prBowBssInfo;
3386 P_BOW_FSM_INFO_T prBowFsmInfo;
3387 P_MSG_CH_GRANT_T prMsgChGrant;
3389 UINT_32 u4GrantInterval;
3390 ENUM_BOW_DEVICE_STATE eFsmState;
3395 prBowBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_BOW_INDEX]);
3396 prBowFsmInfo = &(prAdapter->rWifiVar.rBowFsmInfo);
3397 prMsgChGrant = (P_MSG_CH_GRANT_T)prMsgHdr;
3398 ucTokenID = prMsgChGrant->ucTokenID;
3399 u4GrantInterval = prMsgChGrant->u4GrantInterval;
3401 /* 1. free message */
3402 cnmMemFree(prAdapter, prMsgHdr);
3403 prBowFsmInfo->fgIsChannelGranted = TRUE;
3406 DBGLOG(BOW, EVENT, ("Entering bowRunEventChGrant.\n"));
3409 eFsmState = bowGetBowTableState(prAdapter, prBowFsmInfo->aucPeerAddress);
3412 if((!prBowFsmInfo->fgIsChannelRequested) ||
3413 (prBowFsmInfo->ucSeqNumOfChReq != ucTokenID) ||
3414 (eFsmState == BOW_DEVICE_STATE_DISCONNECTED) ||
3415 (eFsmState == BOW_DEVICE_STATE_DISCONNECTING)){
3417 printk("BoW Channel [GIVE UP:%d]\n", ucTokenID);
3418 printk("[Requested:%d][ucSeqNumOfChReq:%d][eFsmState:%d]\n",
3419 prBowFsmInfo->fgIsChannelRequested, prBowFsmInfo->ucSeqNumOfChReq, eFsmState);
3421 bowReleaseCh(prAdapter);
3425 /* 2. channel privilege has been approved */
3426 prBowFsmInfo->u4ChGrantedInterval = u4GrantInterval;
3429 cnmTimerStartTimer(prAdapter,
3430 &prBowFsmInfo->rChGrantedTimer,
3431 prBowFsmInfo->u4ChGrantedInterval - BOW_JOIN_CH_GRANT_THRESHOLD);
3433 cnmTimerStartTimer(prAdapter,
3434 &prBowFsmInfo->rChGrantedTimer,
3435 BOW_JOIN_CH_REQUEST_INTERVAL - BOW_JOIN_CH_GRANT_THRESHOLD);
3438 /* 3.2 set local variable to indicate join timer is ticking */
3439 prBowFsmInfo->fgIsInfraChannelFinished = FALSE;
3442 printk("BoW Channel [GRANTED:%d].\n", ucTokenID);
3445 if(eFsmState == BOW_DEVICE_STATE_ACQUIRING_CHANNEL) {
3446 bowStarting(prAdapter);
3447 bowReleaseCh(prAdapter);
3448 if(prBowFsmInfo->ucRole == BOW_RESPONDER) {
3449 bowResponderJoin(prAdapter, prBowFsmInfo->prTargetBssDesc);
3454 nicUpdateBss(prAdapter, NETWORK_TYPE_BOW_INDEX);
3455 bowReleaseCh(prAdapter);
3459 } /* end of aisFsmRunEventChGrant() */
3462 /*----------------------------------------------------------------------------*/
3464 * \brief This function is to inform CNM for channel privilege requesting
3467 * \param[in] prAdapter Pointer of ADAPTER_T
3471 /*----------------------------------------------------------------------------*/
3474 IN P_ADAPTER_T prAdapter
3477 P_BOW_FSM_INFO_T prBowFsmInfo;
3478 P_MSG_CH_REQ_T prMsgChReq;
3482 prBowFsmInfo = &(prAdapter->rWifiVar.rBowFsmInfo);
3484 if (prBowFsmInfo->fgIsChannelGranted == FALSE)
3488 printk("BoW channel [REQUEST:%d], %d, %d.\n", prBowFsmInfo->ucSeqNumOfChReq+1, prBowFsmInfo->ucPrimaryChannel, prBowFsmInfo->eBand);
3490 prMsgChReq = (P_MSG_CH_REQ_T)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_CH_REQ_T));
3493 ASSERT(0); // Can't indicate CNM for channel acquiring
3497 prMsgChReq->rMsgHdr.eMsgId = MID_MNY_CNM_CH_REQ;
3498 prMsgChReq->ucNetTypeIndex = NETWORK_TYPE_BOW_INDEX;
3499 prMsgChReq->ucTokenID = ++prBowFsmInfo->ucSeqNumOfChReq;
3500 prMsgChReq->eReqType = CH_REQ_TYPE_JOIN;
3502 prMsgChReq->u4MaxInterval = BOW_JOIN_CH_REQUEST_INTERVAL;
3504 prMsgChReq->u4MaxInterval = 1;
3506 prMsgChReq->ucPrimaryChannel = prBowFsmInfo->ucPrimaryChannel; //prBowFsmInfo->prTargetBssDesc->ucChannelNum;
3507 prMsgChReq->eRfSco = CHNL_EXT_SCN; //prBowFsmInfo->prTargetBssDesc->eSco;
3508 prMsgChReq->eRfBand = prBowFsmInfo->eBand; //prBowFsmInfo->prTargetBssDesc->eBand;
3509 COPY_MAC_ADDR(prMsgChReq->aucBSSID, prBowFsmInfo->aucPeerAddress);
3512 prBowFsmInfo->fgIsChannelRequested = TRUE;
3514 mboxSendMsg(prAdapter,
3516 (P_MSG_HDR_T) prMsgChReq,
3517 MSG_SEND_METHOD_BUF);
3522 /*----------------------------------------------------------------------------*/
3524 * \brief This function is to inform BOW that channel privilege is granted
3527 * \param[in] prAdapter Pointer of ADAPTER_T
3531 /*----------------------------------------------------------------------------*/
3534 IN P_ADAPTER_T prAdapter
3537 P_BOW_FSM_INFO_T prBowFsmInfo;
3538 P_MSG_CH_ABORT_T prMsgChAbort;
3542 prBowFsmInfo = &(prAdapter->rWifiVar.rBowFsmInfo);
3544 if(prBowFsmInfo->fgIsChannelGranted != FALSE || prBowFsmInfo->fgIsChannelRequested != FALSE)
3547 printk("BoW channel [RELEASE:%d] %d, %d.\n", prBowFsmInfo->ucSeqNumOfChReq, prBowFsmInfo->ucPrimaryChannel, prBowFsmInfo->eBand);
3550 prBowFsmInfo->fgIsChannelRequested = FALSE;
3551 prBowFsmInfo->fgIsChannelGranted = FALSE;
3553 /* 1. return channel privilege to CNM immediately */
3554 prMsgChAbort = (P_MSG_CH_ABORT_T)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_CH_ABORT_T));
3555 if (!prMsgChAbort) {
3556 ASSERT(0); // Can't release Channel to CNM
3560 prMsgChAbort->rMsgHdr.eMsgId = MID_MNY_CNM_CH_ABORT;
3561 prMsgChAbort->ucNetTypeIndex = NETWORK_TYPE_BOW_INDEX;
3562 prMsgChAbort->ucTokenID = prBowFsmInfo->ucSeqNumOfChReq;
3564 mboxSendMsg(prAdapter,
3566 (P_MSG_HDR_T) prMsgChAbort,
3567 MSG_SEND_METHOD_BUF);
3571 } /* end of aisFsmReleaseCh() */
3574 /*----------------------------------------------------------------------------*/
3576 * @brief This function will indicate an Event of "Media Disconnect" to HOST
3578 * @param[in] u4Param Unused timer parameter
3582 /*----------------------------------------------------------------------------*/
3584 bowChGrantedTimeout(
3585 IN P_ADAPTER_T prAdapter,
3589 P_BOW_FSM_INFO_T prBowFsmInfo;
3590 ENUM_BOW_DEVICE_STATE eFsmState;
3594 prBowFsmInfo = &(prAdapter->rWifiVar.rBowFsmInfo);
3597 printk("BoW Channel [TIMEOUT]\n");
3600 //bowReleaseCh(prAdapter);
3601 eFsmState = bowGetBowTableState(prAdapter, prBowFsmInfo->aucPeerAddress);
3603 /*If connecting is not completed, request CH again*/
3604 if((eFsmState == BOW_DEVICE_STATE_CONNECTING) ||
3605 (eFsmState == BOW_DEVICE_STATE_STARTING))
3607 bowRequestCh(prAdapter);
3614 bowNotifyAllLinkDisconnected (
3615 IN P_ADAPTER_T prAdapter
3618 UINT_8 ucBowTableIdx = 0;
3619 CMD_INFO_T rCmdInfo;
3623 kalMemZero(&rCmdInfo, sizeof(CMD_INFO_T));
3625 while (ucBowTableIdx < CFG_BOW_PHYSICAL_LINK_NUM)
3627 if (arBowTable[ucBowTableIdx].fgIsValid)
3629 COPY_MAC_ADDR(prAdapter->rWifiVar.rBowFsmInfo.aucPeerAddress, arBowTable[ucBowTableIdx].aucPeerAddress);
3632 DBGLOG(BOW, EVENT, ("bowNotifyAllLinkDisconnected, arBowTable[%x].aucPeerAddress, %x:%x:%x:%x:%x:%x.\n", ucBowTableIdx,
3633 arBowTable[ucBowTableIdx].aucPeerAddress[0],
3634 arBowTable[ucBowTableIdx].aucPeerAddress[1],
3635 arBowTable[ucBowTableIdx].aucPeerAddress[2],
3636 arBowTable[ucBowTableIdx].aucPeerAddress[3],
3637 arBowTable[ucBowTableIdx].aucPeerAddress[4],
3638 arBowTable[ucBowTableIdx].aucPeerAddress[5]));
3639 DBGLOG(BOW, EVENT, ("bowNotifyAllLinkDisconnected, arBowTable[%x].fgIsValid, %x.\n", ucBowTableIdx, arBowTable[ucBowTableIdx].fgIsValid));
3642 wlanoidSendSetQueryBowCmd(prAdapter,
3643 CMD_ID_CMD_BT_OVER_WIFI,
3646 wlanbowCmdEventLinkDisconnected,
3647 wlanbowCmdTimeoutHandler,
3653 wlanbowCmdEventLinkDisconnected(prAdapter, &rCmdInfo, NULL);
3664 /*----------------------------------------------------------------------------*/
3666 * \brief to retrieve Bluetooth-over-Wi-Fi state from glue layer
3672 * ENUM_BOW_DEVICE_STATE
3674 /*----------------------------------------------------------------------------*/
3677 bowCheckBowTableIfVaild(
3678 IN P_ADAPTER_T prAdapter,
3679 IN UINT_8 aucPeerAddress[6]
3684 KAL_SPIN_LOCK_DECLARATION();
3685 KAL_ACQUIRE_SPIN_LOCK(prAdapter, SPIN_LOCK_BOW_TABLE);
3687 for(idx = 0 ; idx < CFG_BOW_PHYSICAL_LINK_NUM ; idx++)
3689 if( arBowTable[idx].fgIsValid &&
3690 EQUAL_MAC_ADDR(arBowTable[idx].aucPeerAddress, aucPeerAddress))
3694 DBGLOG(BOW, EVENT, ("kalCheckBowifVaild, aucPeerAddress %x, %x:%x:%x:%x:%x:%x.\n", idx,
3700 aucPeerAddress[5]));
3702 DBGLOG(BOW, EVENT, ("kalCheckBowifVaild, arBowTable[idx].aucPeerAddress %x, %x:%x:%x:%x:%x:%x.\n", idx,
3703 arBowTable[idx].aucPeerAddress[0],
3704 arBowTable[idx].aucPeerAddress[1],
3705 arBowTable[idx].aucPeerAddress[2],
3706 arBowTable[idx].aucPeerAddress[3],
3707 arBowTable[idx].aucPeerAddress[4],
3708 arBowTable[idx].aucPeerAddress[5]));
3710 DBGLOG(BOW, EVENT, ("kalCheckBowifVaild, arBowTable[idx].fgIsValid, %x, %x.\n", idx, arBowTable[idx].fgIsValid));
3713 KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_BOW_TABLE);
3718 KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_BOW_TABLE);
3723 bowGetBowTableContent(
3724 IN P_ADAPTER_T prAdapter,
3725 IN UINT_8 ucBowTableIdx,
3726 OUT P_BOW_TABLE_T prBowTable
3729 KAL_SPIN_LOCK_DECLARATION();
3730 KAL_ACQUIRE_SPIN_LOCK(prAdapter, SPIN_LOCK_BOW_TABLE);
3732 if (arBowTable[ucBowTableIdx].fgIsValid)
3736 DBGLOG(BOW, EVENT, ("bowGetBowTableContent, arBowTable[idx].fgIsValid, %x, %x.\n", ucBowTableIdx, arBowTable[ucBowTableIdx].fgIsValid));
3737 printk("GET State [%d]\n", arBowTable[ucBowTableIdx].eState);
3739 prBowTable = &(arBowTable[ucBowTableIdx]);
3740 KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_BOW_TABLE);
3745 KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_BOW_TABLE);
3752 bowSetBowTableContent(
3753 IN P_ADAPTER_T prAdapter,
3754 IN UINT_8 ucBowTableIdx,
3755 IN P_BOW_TABLE_T prBowTable
3758 KAL_SPIN_LOCK_DECLARATION();
3759 KAL_ACQUIRE_SPIN_LOCK(prAdapter, SPIN_LOCK_BOW_TABLE);
3761 COPY_MAC_ADDR(arBowTable[ucBowTableIdx].aucPeerAddress, prBowTable->aucPeerAddress);
3762 arBowTable[ucBowTableIdx].eState = prBowTable->eState;
3763 arBowTable[ucBowTableIdx].fgIsValid = prBowTable->fgIsValid;
3764 arBowTable[ucBowTableIdx].ucAcquireID = prBowTable->ucAcquireID;
3766 KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_BOW_TABLE);
3768 kalSetBowState(prAdapter->prGlueInfo, prBowTable->eState, prBowTable->aucPeerAddress);
3769 //kalSetBowRole(prAdapter->prGlueInfo, prBowTable->ucRole, prBowTable->aucPeerAddress);
3772 printk("SET State [%d]\n", arBowTable[ucBowTableIdx].eState);
3773 DBGLOG(BOW, EVENT, ("kalCheckBowifVaild, arBowTable[ucBowTableIdx].fgIsValid, %x, %x.\n", ucBowTableIdx, arBowTable[ucBowTableIdx].fgIsValid));
3782 bowGetBowTableEntryByPeerAddress(
3783 IN P_ADAPTER_T prAdapter,
3784 IN UINT_8 aucPeerAddress[6],
3785 OUT PUINT_8 pucBowTableIdx
3790 KAL_SPIN_LOCK_DECLARATION();
3791 KAL_ACQUIRE_SPIN_LOCK(prAdapter, SPIN_LOCK_BOW_TABLE);
3793 for(idx = 0 ; idx < CFG_BOW_PHYSICAL_LINK_NUM ; idx++)
3795 if( arBowTable[idx].fgIsValid &&
3796 EQUAL_MAC_ADDR(arBowTable[idx].aucPeerAddress, aucPeerAddress))
3800 DBGLOG(BOW, EVENT, ("kalCheckBowifVaild, aucPeerAddress %x, %x:%x:%x:%x:%x:%x.\n", idx,
3806 aucPeerAddress[5]));
3807 DBGLOG(BOW, EVENT, ("kalCheckBowifVaild, arBowTable[idx].aucPeerAddress %x, %x:%x:%x:%x:%x:%x.\n", idx,
3808 arBowTable[idx].aucPeerAddress[0],
3809 arBowTable[idx].aucPeerAddress[1],
3810 arBowTable[idx].aucPeerAddress[2],
3811 arBowTable[idx].aucPeerAddress[3],
3812 arBowTable[idx].aucPeerAddress[4],
3813 arBowTable[idx].aucPeerAddress[5]));
3814 DBGLOG(BOW, EVENT, ("kalCheckBowifVaild, arBowTable[idx].fgIsValid, %x, %x.\n", idx, arBowTable[idx].fgIsValid));
3816 KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_BOW_TABLE);
3818 *pucBowTableIdx = idx;
3824 KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_BOW_TABLE);
3831 bowGetBowTableFreeEntry(
3832 IN P_ADAPTER_T prAdapter,
3833 OUT PUINT_8 pucBowTableIdx
3838 KAL_SPIN_LOCK_DECLARATION();
3839 KAL_ACQUIRE_SPIN_LOCK(prAdapter, SPIN_LOCK_BOW_TABLE);
3841 for(idx = 0 ; idx < CFG_BOW_PHYSICAL_LINK_NUM ; idx++)
3843 if(!arBowTable[idx].fgIsValid)
3846 DBGLOG(BOW, EVENT, ("bowGetBowTableFreeEntry, arBowTable[idx].fgIsValid, %x, %x.\n", idx, arBowTable[idx].fgIsValid));
3848 *pucBowTableIdx = idx;
3849 arBowTable[idx].fgIsValid = TRUE;
3851 KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_BOW_TABLE);
3857 KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_BOW_TABLE);
3863 ENUM_BOW_DEVICE_STATE
3864 bowGetBowTableState(
3865 IN P_ADAPTER_T prAdapter,
3866 IN UINT_8 aucPeerAddress[6]
3871 KAL_SPIN_LOCK_DECLARATION();
3872 KAL_ACQUIRE_SPIN_LOCK(prAdapter, SPIN_LOCK_BOW_TABLE);
3874 for(idx = 0 ; idx < CFG_BOW_PHYSICAL_LINK_NUM ; idx++)
3876 if( arBowTable[idx].fgIsValid &&
3877 EQUAL_MAC_ADDR(arBowTable[idx].aucPeerAddress, aucPeerAddress))
3880 DBGLOG(BOW, EVENT, ("bowGetState, aucPeerAddress %x, %x:%x:%x:%x:%x:%x.\n", idx,
3886 aucPeerAddress[5]));
3887 DBGLOG(BOW, EVENT, ("bowGetState, arBowTable[idx].aucPeerAddress %x, %x:%x:%x:%x:%x:%x.\n", idx,
3888 arBowTable[idx].aucPeerAddress[0],
3889 arBowTable[idx].aucPeerAddress[1],
3890 arBowTable[idx].aucPeerAddress[2],
3891 arBowTable[idx].aucPeerAddress[3],
3892 arBowTable[idx].aucPeerAddress[4],
3893 arBowTable[idx].aucPeerAddress[5]));
3894 DBGLOG(BOW, EVENT, ("bowGetState, arBowTable[idx].fgIsValid, %x, %x.\n", idx, arBowTable[idx].fgIsValid));
3895 DBGLOG(BOW, EVENT, ("bowGetState, arBowTable[idx].eState;, %x, %x.\n", idx, arBowTable[idx].eState));
3896 printk("GET State [%d]\n", arBowTable[idx].eState);
3899 KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_BOW_TABLE);
3901 return arBowTable[idx].eState;
3905 KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_BOW_TABLE);
3907 return BOW_DEVICE_STATE_DISCONNECTED;
3912 bowSetBowTableState(
3913 IN P_ADAPTER_T prAdapter,
3914 IN UINT_8 aucPeerAddress[6],
3915 IN ENUM_BOW_DEVICE_STATE eState
3918 UINT_8 ucBowTableIdx;
3920 if(bowGetBowTableEntryByPeerAddress(prAdapter, aucPeerAddress, &ucBowTableIdx)) {
3921 KAL_SPIN_LOCK_DECLARATION();
3922 KAL_ACQUIRE_SPIN_LOCK(prAdapter, SPIN_LOCK_BOW_TABLE);
3924 arBowTable[ucBowTableIdx].eState = eState;
3926 printk("SET State [%d]\n", eState);
3928 KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_BOW_TABLE);
3930 kalSetBowState(prAdapter->prGlueInfo, eState, aucPeerAddress);