static void wlan_node_timeout(void *arg) { struct ieee80211_node_table *nt = (struct ieee80211_node_table *)arg; bss_t *bss, *nextBss; A_UINT8 myBssid[IEEE80211_ADDR_LEN]; wmi_get_current_bssid(nt->nt_wmip, myBssid); IEEE80211_NODE_LOCK(nt); bss = nt->nt_node_first; while (bss != NULL) { nextBss = bss->ni_list_next; if ((A_MEMCMP(myBssid, bss->ni_macaddr, sizeof(myBssid)) != 0) && (bss->ni_tstamp <= A_MS_TICKGET())) { /* * free up all but the current bss - if set */ wlan_node_reclaim(nt, bss); } bss = nextBss; } IEEE80211_NODE_UNLOCK(nt); A_TIMEOUT_MS(&nt->nt_inact_timer, WLAN_NODE_INACT_TIMEOUT_MSEC, 0); }
USAPI void _StartStopInterruptPolling(UART_DEVICE *pUartDevice, A_BOOL Start) { if (Start) { if (!pUartDevice->TimerQueued) { pUartDevice->TimerQueued = TRUE; A_TIMEOUT_MS(&pUartDevice->PollingTimer,pUartDevice->PollTimeoutMS,0); } } else { if (pUartDevice->TimerQueued) { pUartDevice->TimerQueued = FALSE; A_UNTIMEOUT(&pUartDevice->PollingTimer); } } }
/* * Node table support. */ void wlan_node_table_init(void *wmip, struct ieee80211_node_table *nt) { int i; WLAN_DEBUG_PRINTF(ATH_LOG_INF,"node table = 0x%x\n", (A_UINT32)nt); IEEE80211_NODE_LOCK_INIT(nt); nt->nt_node_first = nt->nt_node_last = NULL; for(i = 0; i < IEEE80211_NODE_HASHSIZE; i++) { nt->nt_hash[i] = NULL; } A_INIT_TIMER(&nt->nt_inact_timer, wlan_node_timeout, nt); A_TIMEOUT_MS(&nt->nt_inact_timer, WLAN_NODE_INACT_TIMEOUT_MSEC, 0); nt->nt_wmip = wmip; }
void wlan_setup_node(struct ieee80211_node_table *nt, bss_t *ni, const A_UINT8 *macaddr) { int hash; A_UINT32 timeoutValue = 0; A_MEMCPY(ni->ni_macaddr, macaddr, IEEE80211_ADDR_LEN); hash = IEEE80211_NODE_HASH (macaddr); ieee80211_node_initref (ni); /* mark referenced */ timeoutValue = nt->nt_nodeAge; //ni->ni_tstamp = A_GET_MS (0); //-builder:nodeage ni->ni_tstamp = A_GET_MS(timeoutValue); //+builder:nodeage ni->ni_actcnt = WLAN_NODE_INACT_CNT; IEEE80211_NODE_LOCK_BH(nt); /* Insert at the end of the node list */ ni->ni_list_next = NULL; ni->ni_list_prev = nt->nt_node_last; if(nt->nt_node_last != NULL) { nt->nt_node_last->ni_list_next = ni; } nt->nt_node_last = ni; if(nt->nt_node_first == NULL) { nt->nt_node_first = ni; } /* Insert into the hash list i.e. the bucket */ if((ni->ni_hash_next = nt->nt_hash[hash]) != NULL) { nt->nt_hash[hash]->ni_hash_prev = ni; } ni->ni_hash_prev = NULL; nt->nt_hash[hash] = ni; if (!nt->isTimerArmed) { A_TIMEOUT_MS(&nt->nt_inact_timer, timeoutValue, 0); nt->isTimerArmed = TRUE; } IEEE80211_NODE_UNLOCK_BH(nt); }
void CAR6KMini::WMIMicErrEvent( A_UINT8 keyid, A_BOOL isMcast) { if (m_networkType == AP_NETWORK) { car6k_ap_mic_event (keyid, isMcast); return; } struct ar6kAuthIndication { NDIS_802_11_STATUS_INDICATION ind; NDIS_802_11_AUTHENTICATION_REQUEST req; } ar6kAuthEvent; ar6kAuthEvent.ind.StatusType = Ndis802_11StatusType_Authentication; if (isMcast) { ar6kAuthEvent.req.Flags = NDIS_802_11_AUTH_REQUEST_GROUP_ERROR; } else { ar6kAuthEvent.req.Flags = NDIS_802_11_AUTH_REQUEST_PAIRWISE_ERROR; } memcpy(&ar6kAuthEvent.req.Bssid[0], m_PeerBSSID, ETHERNET_MAC_ADDRESS_LENGTH); ar6kAuthEvent.req.Length = sizeof(NDIS_802_11_AUTHENTICATION_REQUEST); m_MicErrorCount++; if(m_MicErrorCount >= MAX_MIC_ERRORS) { m_CounterMeasureOn = TRUE; A_UNTIMEOUT (&m_CounterMeasureEnterTimer); } else { A_TIMEOUT_MS(&m_CounterMeasureEnterTimer, MIC_ERROR_TIMEOUT_MSEC, 0); } NdisMIndicateStatus(m_MiniportAdapterHandle, NDIS_STATUS_MEDIA_SPECIFIC_INDICATION, &ar6kAuthEvent, sizeof(ar6kAuthEvent)); NdisMIndicateStatusComplete(m_MiniportAdapterHandle); return; }
static void wlan_node_timeout (A_ATH_TIMER arg) { struct ieee80211_node_table *nt = (struct ieee80211_node_table *)arg; bss_t *bss, *nextBss; A_UINT8 myBssid[IEEE80211_ADDR_LEN], reArmTimer = FALSE; A_UINT32 timeoutValue = 0; timeoutValue = nt->nt_nodeAge; wmi_get_current_bssid(nt->nt_wmip, myBssid); bss = nt->nt_node_first; while (bss != NULL) { nextBss = bss->ni_list_next; if (A_MEMCMP(myBssid, bss->ni_macaddr, sizeof(myBssid)) != 0) { if (bss->ni_tstamp <= A_GET_MS(0)) { /* * free up all but the current bss - if set */ wlan_node_reclaim(nt, bss); } else { /* * Re-arm timer, only when we have a bss other than * current bss AND it is not aged-out. */ reArmTimer = TRUE; } } bss = nextBss; } if (reArmTimer) A_TIMEOUT_MS (&nt->nt_inact_timer, timeoutValue, 0); nt->isTimerArmed = reArmTimer; }
LOCAL void schedule_console_idle_recv_timer(void) { A_UNTIMEOUT(&Console_info->recv_idle_timer); A_TIMEOUT_MS(&Console_info->recv_idle_timer,Console_info->config.idle_timeout_ms,FALSE); }
static void wlan_node_timeout(A_ATH_TIMER arg) { struct ieee80211_node_table *nt = (struct ieee80211_node_table *)arg; bss_t *bss, *nextBss; A_UINT8 myBssid[IEEE80211_ADDR_LEN], reArmTimer = FALSE; A_UINT32 timeoutValue = 0; timeoutValue = nt->nt_nodeAge; wmi_get_current_bssid(nt->nt_wmip, myBssid); bss = nt->nt_node_first; while (bss != NULL) { nextBss = bss->ni_list_next; if (A_MEMCMP(myBssid, bss->ni_macaddr, sizeof(myBssid)) != 0) { if (bss->ni_tstamp <= A_GET_MS(0)) { PBYTE pIE; char a[128]; A_UINT32 length, ch, freq; //wchar_t b[128] = {0}; pIE = bss->ni_cie.ie_ssid; length = pIE[1]; memcpy( a, &pIE[2], length ); a[length] = '\0'; //MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, a, 32, b, 64 ); freq = bss->ni_cie.ie_chan; if (freq == 2484) ch = 14; else if (freq < 2484) ch = (freq - 2407) / 5; else if (freq < 5000) ch = 15 + ((freq - 2512) / 20); else ch = (freq - 5000) / 5; RETAIL_DEBUG_PRINTF(debugBssInfo, (TEXT("builder:ar6k2: remove bss info, SSID = %S, RSSI = %d, CHANNEL = %d\r\n"), a, bss->ni_rssi, ch)); RETAIL_DEBUG_PRINTF(debugBssInfo, (TEXT("builder:ar6k2: BSSID = %02x:%02x:%02x:%02x:%02x:%02x \r\n") , bss->ni_macaddr[0], bss->ni_macaddr[1], bss->ni_macaddr[2], bss->ni_macaddr[3], bss->ni_macaddr[4], bss->ni_macaddr[5])); logPrintf( (debugFileLog && debugBssInfo), "builder:ar6k2: remove bss info, SSID = %s, RSSI = %d, CHANNEL = %d\r\n", a, bss->ni_rssi, ch); logPrintf( (debugFileLog && debugBssInfo), "builder:ar6k2: BSSID = %02x:%02x:%02x:%02x:%02x:%02x \r\n", bss->ni_macaddr[0], bss->ni_macaddr[1], bss->ni_macaddr[2], bss->ni_macaddr[3], bss->ni_macaddr[4], bss->ni_macaddr[5]); /* * free up all but the current bss - if set */ wlan_node_reclaim(nt, bss); } else { /* * Re-arm timer, only when we have a bss other than * current bss AND it is not aged-out. */ reArmTimer = TRUE; } } bss = nextBss; } if(reArmTimer) A_TIMEOUT_MS(&nt->nt_inact_timer, timeoutValue, 0); nt->isTimerArmed = reArmTimer; }
void CAR6KMini::rssiScanTimeout() { static int reScanCounter=255; A_UINT16 fgenable, bkenable; // Return if WMI is not ready yet if (!m_WMIReady) return; if (!m_Connected) return; //get stats from target if (ar6000_get_target_stats() != A_OK) return; if (m_Config.bkScanEnable) { bkenable = (A_UINT16)m_Config.bkScanPeriod; } else { bkenable = 0xFFFF; } if (m_Config.fgScanEnable) { fgenable = 0; } else { fgenable = 0xFFFF; } //Post the RSSI value relative to the Standard Noise floor value. if (RSSI_TO_NDIS(m_RSSI) >= -60) { m_RSSIlevel = 0; reScanCounter = 10; A_TIMEOUT_MS(&m_rssiScanTimer, 1000, 0); } else if ((RSSI_TO_NDIS(m_RSSI) >= -65) && (RSSI_TO_NDIS(m_RSSI) < -60)) { reScanCounter = 10; A_TIMEOUT_MS(&m_rssiScanTimer, 1000, 0); } else if ((RSSI_TO_NDIS(m_RSSI) >= -70) && (RSSI_TO_NDIS(m_RSSI) < -65)) { reScanCounter = 10; if ((1 != m_RSSIlevel) && (2 != m_RSSIlevel)) { m_RSSIlevel = 1; wmi_bssfilter_cmd ((struct wmi_t *)m_pWMI, PROBED_SSID_FILTER, 0); wmi_scanparams_cmd((wmi_t *)m_pWMI,fgenable,0,bkenable, 0,0,20,WMI_SHORTSCANRATIO_DEFAULT, 0, 0, 0); wmi_startscan_cmd((wmi_t *)m_pWMI,WMI_LONG_SCAN,TRUE,FALSE,0,100,0,NULL); } A_TIMEOUT_MS(&m_rssiScanTimer, 1000, 0); } else if ((RSSI_TO_NDIS(m_RSSI) >= -75) && (RSSI_TO_NDIS(m_RSSI) < -70)) { reScanCounter = 10; if ((2 != m_RSSIlevel) && (3 != m_RSSIlevel)) { m_RSSIlevel = 2; wmi_startscan_cmd((wmi_t *)m_pWMI,WMI_SHORT_SCAN,TRUE,FALSE,0,100,0,NULL); } A_TIMEOUT_MS(&m_rssiScanTimer, 500, 0); } else if ((RSSI_TO_NDIS(m_RSSI) >= -80) && (RSSI_TO_NDIS(m_RSSI) < -75)) { reScanCounter = 10; if ((3 != m_RSSIlevel) && (4 != m_RSSIlevel)) { m_RSSIlevel = 3; wmi_bssfilter_cmd ((struct wmi_t *)m_pWMI, PROBED_SSID_FILTER, 0); wmi_scanparams_cmd((wmi_t *)m_pWMI,fgenable,0,bkenable, 0,0,20,WMI_SHORTSCANRATIO_DEFAULT, 0, 0, 0); wmi_startscan_cmd((wmi_t *)m_pWMI,WMI_LONG_SCAN,TRUE,FALSE,0,100,0,NULL); } A_TIMEOUT_MS(&m_rssiScanTimer, 400, 0); } else if ((RSSI_TO_NDIS(m_RSSI) >= -85) && (RSSI_TO_NDIS(m_RSSI) < -80)) { if ((4 != m_RSSIlevel) && (5 != m_RSSIlevel)) { reScanCounter = 7; m_RSSIlevel = 4; wmi_startscan_cmd((wmi_t *)m_pWMI,WMI_SHORT_SCAN,TRUE,FALSE,0,100,0,NULL); } if ((0 == reScanCounter) && (4 == m_RSSIlevel)) { reScanCounter = 7; if (m_roamTblEntryCount > 1) { wmi_startscan_cmd((wmi_t *)m_pWMI,WMI_SHORT_SCAN,TRUE,FALSE,0,100,0,NULL); } } reScanCounter--; A_TIMEOUT_MS(&m_rssiScanTimer, 400, 0); } else if (RSSI_TO_NDIS(m_RSSI) < -85) { if (5 != m_RSSIlevel) { m_RSSIlevel = 5; reScanCounter = 10; wmi_bssfilter_cmd ((struct wmi_t *)m_pWMI, PROBED_SSID_FILTER, 0); wmi_scanparams_cmd((wmi_t *)m_pWMI,fgenable,0,bkenable, 0,0,20,WMI_SHORTSCANRATIO_DEFAULT, 0, 0, 0); wmi_startscan_cmd((wmi_t *)m_pWMI,WMI_LONG_SCAN,TRUE,FALSE,0,100,0,NULL); } if ((0 == reScanCounter) && (5 == m_RSSIlevel)) { reScanCounter = 6; if (m_roamTblEntryCount > 1) { wmi_startscan_cmd((wmi_t *)m_pWMI,WMI_SHORT_SCAN,TRUE,FALSE,0,100,0,NULL); } } reScanCounter--; A_TIMEOUT_MS(&m_rssiScanTimer, 400, 0); } else { A_TIMEOUT_MS(&m_rssiScanTimer, 1000, 0); } wmi_get_roam_tbl_cmd((wmi_t *)m_pWMI); }
void CAR6KMini::WMIDisconnectIndication(A_UINT8 reason) { #ifdef NO_BCAST_PROBE_IN_CONNECT wmi_probedSsid_cmd((struct wmi_t *)m_pWMI, 0, ANY_SSID_FLAG, 0,NULL); #endif do { // // Ignore pyxis specific reason during IEEE Mode // if (m_Connected) { if (reason == NO_NETWORK_AVAIL) { // remove the current associated bssid node wmi_free_node ((wmi_t *)m_pWMI, m_PeerBSSID); // // In case any other same SSID nodes are present // remove it, since those nodes also not available now // IterateNodeAndRemoveSSID (&m_SSID); SendWMIDisconnectCommand (); } // Flush any pending NDIS packets FlushNdisPacketTransmitQueue(); #ifdef OS_ROAM_MANAGEMENT if (FALSE == m_osRoamControl) { #endif m_RSSIlevel = 0; if (m_Config.hostAssistedRoaming) { A_UNTIMEOUT(&m_rssiScanTimer); } NdisMIndicateStatus(m_MiniportAdapterHandle, NDIS_STATUS_MEDIA_DISCONNECT, 0, 0); NdisMIndicateStatusComplete(m_MiniportAdapterHandle); #ifdef OS_ROAM_MANAGEMENT } else { A_UNTIMEOUT(&m_disconnectIndicationTimer); A_TIMEOUT_MS(&m_disconnectIndicationTimer, m_Config.discTimeout*1000, 0); } #endif // // Reset Chanel and BSSID info // m_Connected = FALSE; m_ChannelHint = 0; m_ConnectedChannel = 0; memset (m_PeerBSSID, 0, ETHERNET_MAC_ADDRESS_LENGTH); } if (m_bIsSwitchAPtoSTA) { m_bIsSwitchAPtoSTA = FALSE; NdisMIndicateStatus(m_MiniportAdapterHandle, NDIS_STATUS_MEDIA_DISCONNECT, 0, 0); NdisMIndicateStatusComplete(m_MiniportAdapterHandle); // configTargetParams(); m_WantToBeConnected = TRUE; } { // // no need to send WMIConnect when target reply disconnect // reason other than DISCONNECT_CMD // if (DISCONNECT_CMD == reason) { m_ConnectInProgress = FALSE; if (m_WantToBeConnected) { SendWMIConnectCommand (&m_SSID); } } } } while (FALSE); NdisSetEvent (&m_SuspendEvent); }
void CAR6KMini::WMIConnectIndication( IN USHORT Channel, IN PBYTE PeerBSSID, IN USHORT listenInterval, IN BYTE assocReqLen, IN BYTE assocRespLen, IN PBYTE assocInfo, IN BYTE beaconIeLen, IN USHORT beaconInterval, NETWORK_TYPE networkType) { BYTE len = 0; int i = 0; PBYTE pAssocReq; PBYTE pAssocReqEnd; PBYTE pBeaconIE; BYTE byKeyType = 0; #ifdef OS_ROAM_MANAGEMENT A_UNTIMEOUT(&m_disconnectIndicationTimer); #endif #ifdef NO_BCAST_PROBE_IN_CONNECT wmi_probedSsid_cmd((struct wmi_t *)m_pWMI, 0, ANY_SSID_FLAG, 0,NULL); #endif memcpy(m_PeerBSSID, PeerBSSID, ETHERNET_MAC_ADDRESS_LENGTH); m_ConnectedChannel = Channel; m_ConnectInProgress = FALSE; m_AssocReqLen = assocReqLen; m_AssocRespLen = assocRespLen; m_BeaconIeLen = beaconIeLen; m_BeaconInterval = beaconInterval; m_WantToBeConnected = FALSE; if (m_pAssocInfo != NULL) { A_FREE(m_pAssocInfo); } m_pAssocInfo = (PBYTE)A_MALLOC(m_AssocReqLen + m_AssocRespLen + m_BeaconIeLen); if (m_pAssocInfo) { memcpy(m_pAssocInfo, assocInfo, m_AssocReqLen + m_AssocRespLen + m_BeaconIeLen); //Get network type in use if (m_ConnectedChannel >= 2412 && m_ConnectedChannel <= 2484) { PBYTE pAssocRsp = m_pAssocInfo + m_BeaconIeLen + m_AssocReqLen; PBYTE pAssocRspEnd = pAssocRsp + m_AssocRespLen; m_NetworkTypeInUse = Ndis802_11DS; //Skip capability, status code and assoc. ID pAssocRsp += 6; if ((pAssocRsp + 2) < pAssocRspEnd && IEEE80211_ELEMID_RATES == pAssocRsp[0]) { pAssocRsp += (pAssocRsp[1] + 2); if ((pAssocRsp + 2) < pAssocRspEnd && IEEE80211_ELEMID_XRATES == pAssocRsp[0]) { m_NetworkTypeInUse = Ndis802_11OFDM24; } } } else { m_NetworkTypeInUse = Ndis802_11OFDM5; } // Update the group wise crypto type from the ie info #define RSN_MULTICAST_CIPHER_OFFSET 7 #define WPA_MULTICAST_CIPHER_OFFSET 11 pBeaconIE = m_pAssocInfo; if (m_BeaconIeLen) { if ((m_AuthenticationMode == Ndis802_11AuthModeWPA2) || (m_AuthenticationMode == Ndis802_11AuthModeWPA2PSK)) { if (m_BeaconIeLen <= RSN_MULTICAST_CIPHER_OFFSET) { // Default to AES if cipher suite not present m_GrpwiseCryptoType = AES_CRYPT; } else { byKeyType = *(pBeaconIE + RSN_MULTICAST_CIPHER_OFFSET); switch (byKeyType) { case RSN_CSE_WEP40: case RSN_CSE_WEP104: m_GrpwiseCryptoType = WEP_CRYPT; break; case RSN_CSE_TKIP: m_GrpwiseCryptoType = TKIP_CRYPT; break; case RSN_CSE_CCMP: m_GrpwiseCryptoType = AES_CRYPT; break; } } } else if ((m_AuthenticationMode == Ndis802_11AuthModeWPA) || (m_AuthenticationMode == Ndis802_11AuthModeWPAPSK)) { if (m_BeaconIeLen <= WPA_MULTICAST_CIPHER_OFFSET) { // Default to TKIP if cipher suite not present m_GrpwiseCryptoType = TKIP_CRYPT; } else { byKeyType = *(pBeaconIE + WPA_MULTICAST_CIPHER_OFFSET); switch (byKeyType) { case WPA_CSE_WEP40: case WPA_CSE_WEP104: m_GrpwiseCryptoType = WEP_CRYPT; break; case WPA_CSE_TKIP: m_GrpwiseCryptoType = TKIP_CRYPT; break; case WPA_CSE_CCMP: m_GrpwiseCryptoType = AES_CRYPT; break; } } } } // Get supported basic rates pAssocReq = m_pAssocInfo + m_BeaconIeLen; pAssocReqEnd = pAssocReq + m_AssocReqLen; // skip capability and listen interval pAssocReq += 4; if (((pAssocReq + 2) < pAssocReqEnd) && (IEEE80211_ELEMID_SSID == pAssocReq[0])) { // Skip SSID pAssocReq += (pAssocReq[1] + 2); if ((pAssocReq + 2) < pAssocReqEnd && IEEE80211_ELEMID_RATES == pAssocReq[0] && (pAssocReq + pAssocReq[1] + 2) <= pAssocReqEnd) { // Get rates memset (m_pSupportedRates, 0, sizeof(NDIS_802_11_RATES)); memcpy(m_pSupportedRates, &pAssocReq[2], (pAssocReq[1] < sizeof(NDIS_802_11_RATES)) ? pAssocReq[1] : sizeof(NDIS_802_11_RATES)); } } } #ifdef OS_ROAM_MANAGEMENT m_RateInfo.TxDataFrames = 0; m_RateInfo.RxDataFrames = 0; #endif // Indicate MEDIA_CONNECT to Ndis ConnectIndicationPostProc (); if (networkType == INFRA_NETWORK){ m_Connected = TRUE; m_ConnectInProgress = FALSE; NdisMIndicateStatus (m_MiniportAdapterHandle, NDIS_STATUS_MEDIA_CONNECT, 0, 0); NdisMIndicateStatusComplete (m_MiniportAdapterHandle); }else{ m_Connected = FALSE; } m_RSSIlevel = 0; if (m_Config.hostAssistedRoaming) { A_UNTIMEOUT(&m_rssiScanTimer); A_TIMEOUT_MS(&m_rssiScanTimer, 1000, 0); } return; }