INT CFG80211_SendMgmtFrame(RTMP_ADAPTER *pAd, VOID *pData, ULONG Data) { if (pData != NULL) { #ifdef CONFIG_AP_SUPPORT struct ieee80211_mgmt *mgmt; #endif /* CONFIG_AP_SUPPORT */ { PCFG80211_CTRL pCfg80211_ctrl = &pAd->cfg80211_ctrl; pCfg80211_ctrl->TxStatusInUsed = TRUE; pCfg80211_ctrl->TxStatusSeq = pAd->Sequence; if (pCfg80211_ctrl->pTxStatusBuf != NULL) { os_free_mem(NULL, pCfg80211_ctrl->pTxStatusBuf); pCfg80211_ctrl->pTxStatusBuf = NULL; } os_alloc_mem(NULL, (UCHAR **)&pCfg80211_ctrl->pTxStatusBuf, Data); if (pCfg80211_ctrl->pTxStatusBuf != NULL) { NdisCopyMemory(pCfg80211_ctrl->pTxStatusBuf, pData, Data); pCfg80211_ctrl->TxStatusBufLen = Data; } else { pCfg80211_ctrl->TxStatusBufLen = 0; MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, ("CFG_TX_STATUS: MEM ALLOC ERROR\n")); return NDIS_STATUS_FAILURE; } CFG80211_CheckActionFrameType(pAd, "TX", pData, Data); #ifdef CONFIG_AP_SUPPORT mgmt = (struct ieee80211_mgmt *)pData; if (ieee80211_is_probe_resp(mgmt->frame_control)) { INT offset = sizeof(HEADER_802_11) + 12; CFG80211_SyncPacketWmmIe(pAd, pData + offset , Data - offset); } #endif /* CONFIG_AP_SUPPORT */ MiniportMMRequest(pAd, 0, pData, Data); } } return 0; }
static INT CFG80211DRV_UpdateApSettingFromBeacon(PRTMP_ADAPTER pAd, UINT mbss_idx, CMD_RTPRIV_IOCTL_80211_BEACON *pBeacon) { PMULTISSID_STRUCT pMbss = &pAd->ApCfg.MBSSID[mbss_idx]; struct wifi_dev *wdev = &pMbss->wdev; const UCHAR *ssid_ie = NULL, *wpa_ie = NULL, *rsn_ie = NULL; const UINT WFA_OUI = 0x0050F2; const UCHAR WMM_OUI_TYPE = 0x2; UCHAR *wmm_ie = NULL; const UCHAR *supp_rates_ie = NULL; const UCHAR *ext_supp_rates_ie = NULL, *ht_cap = NULL, *ht_info = NULL; #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,4,0)) const UCHAR CFG_HT_OP_EID = WLAN_EID_HT_OPERATION; #else const UCHAR CFG_HT_OP_EID = WLAN_EID_HT_INFORMATION; #endif /* LINUX_VERSION_CODE: 3.5.0 */ #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,8,0)) const UCHAR CFG_WPA_EID = WLAN_EID_VENDOR_SPECIFIC; #else const UCHAR CFG_WPA_EID = WLAN_EID_WPA; #endif /* LINUX_VERSION_CODE: 3.8.0 */ ssid_ie = cfg80211_find_ie(WLAN_EID_SSID, pBeacon->beacon_head+36, pBeacon->beacon_head_len-36); supp_rates_ie = cfg80211_find_ie(WLAN_EID_SUPP_RATES, pBeacon->beacon_head+36, pBeacon->beacon_head_len-36); /* if it doesn't find WPA_IE in tail first 30 bytes. treat it as is not found */ wpa_ie = cfg80211_find_ie(CFG_WPA_EID, pBeacon->beacon_tail, pBeacon->beacon_tail_len); rsn_ie = cfg80211_find_ie(WLAN_EID_RSN, pBeacon->beacon_tail, pBeacon->beacon_tail_len); wmm_ie = cfg80211_find_vendor_ie(WFA_OUI, WMM_OUI_TYPE, pBeacon->beacon_tail, pBeacon->beacon_tail_len); ht_cap = cfg80211_find_ie(WLAN_EID_HT_CAPABILITY, pBeacon->beacon_tail, pBeacon->beacon_tail_len); ht_info = cfg80211_find_ie(CFG_HT_OP_EID, pBeacon->beacon_tail, pBeacon->beacon_tail_len); /* SSID */ NdisZeroMemory(pMbss->Ssid, pMbss->SsidLen); if (ssid_ie == NULL) { NdisMoveMemory(pMbss->Ssid, "CFG_Linux_GO", 12); pMbss->SsidLen = 12; DBGPRINT(RT_DEBUG_ERROR,("CFG: SSID Not Found In Packet\n")); } else { pMbss->SsidLen = ssid_ie[1]; NdisCopyMemory(pMbss->Ssid, ssid_ie+2, pMbss->SsidLen); DBGPRINT(RT_DEBUG_TRACE,("CFG : SSID: %s, %d\n", pMbss->Ssid, pMbss->SsidLen)); } #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,4,0)) if (pBeacon->hidden_ssid > 0 && pBeacon->hidden_ssid < 3) { pMbss->bHideSsid = TRUE; } else pMbss->bHideSsid = FALSE; if (pBeacon->hidden_ssid == 1) pMbss->SsidLen = 0; #endif /* LINUX_VERSION_CODE 3.4.0 */ /* WMM EDCA Paramter */ CFG80211_SyncPacketWmmIe(pAd, pBeacon->beacon_tail, pBeacon->beacon_tail_len); /* Security */ CFG80211_ParseBeaconIE(pAd, pMbss, wdev, wpa_ie, rsn_ie); pMbss->CapabilityInfo = CAP_GENERATE(1, 0, (wdev->WepStatus != Ndis802_11EncryptionDisabled), (pAd->CommonCfg.TxPreamble == Rt802_11PreambleLong ? 0 : 1), pAd->CommonCfg.bUseShortSlotTime, /*SpectrumMgmt*/FALSE); /* Disable Driver-Internal Rekey */ pMbss->WPAREKEY.ReKeyInterval = 0; pMbss->WPAREKEY.ReKeyMethod = DISABLE_REKEY; if (pBeacon->interval != 0) { DBGPRINT(RT_DEBUG_TRACE,("CFG_TIM New BI %d\n", pBeacon->interval)); pAd->CommonCfg.BeaconPeriod = pBeacon->interval; } if (pBeacon->dtim_period != 0) { DBGPRINT(RT_DEBUG_TRACE, ("CFG_TIM New DP %d\n", pBeacon->dtim_period)); pAd->ApCfg.DtimPeriod = pBeacon->dtim_period; } }
static INT CFG80211DRV_UpdateApSettingFromBeacon(PRTMP_ADAPTER pAd, UINT mbss_idx, CMD_RTPRIV_IOCTL_80211_BEACON *pBeacon) { BSS_STRUCT *pMbss = &pAd->ApCfg.MBSSID[mbss_idx]; struct wifi_dev *wdev = &pMbss->wdev; const UCHAR *ssid_ie = NULL, *wpa_ie = NULL, *rsn_ie = NULL; // const UINT WFA_OUI = 0x0050F2; // const UCHAR WMM_OUI_TYPE = 0x2; // UCHAR *wmm_ie = NULL; const UCHAR *supp_rates_ie = NULL; const UCHAR *ext_supp_rates_ie = NULL, *ht_cap = NULL, *ht_info = NULL; #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,5,0)) const UCHAR CFG_HT_OP_EID = WLAN_EID_HT_OPERATION; #else const UCHAR CFG_HT_OP_EID = WLAN_EID_HT_INFORMATION; #endif /* LINUX_VERSION_CODE: 3.5.0 */ #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,8,0)) const UCHAR CFG_WPA_EID = WLAN_EID_VENDOR_SPECIFIC; #else const UCHAR CFG_WPA_EID = WLAN_EID_WPA; #endif /* LINUX_VERSION_CODE: 3.8.0 */ ssid_ie = cfg80211_find_ie(WLAN_EID_SSID, pBeacon->beacon_head+36, pBeacon->beacon_head_len-36); supp_rates_ie = cfg80211_find_ie(WLAN_EID_SUPP_RATES, pBeacon->beacon_head+36, pBeacon->beacon_head_len-36); /* if it doesn't find WPA_IE in tail first 30 bytes. treat it as is not found */ wpa_ie = cfg80211_find_ie(CFG_WPA_EID, pBeacon->beacon_tail, pBeacon->beacon_tail_len); rsn_ie = cfg80211_find_ie(WLAN_EID_RSN, pBeacon->beacon_tail, pBeacon->beacon_tail_len);//wpa2 case. ext_supp_rates_ie = cfg80211_find_ie(WLAN_EID_EXT_SUPP_RATES, pBeacon->beacon_tail, pBeacon->beacon_tail_len); ht_cap = cfg80211_find_ie(WLAN_EID_HT_CAPABILITY, pBeacon->beacon_tail, pBeacon->beacon_tail_len); ht_info = cfg80211_find_ie(CFG_HT_OP_EID, pBeacon->beacon_tail, pBeacon->beacon_tail_len); /* SSID */ if (ssid_ie == NULL) { NdisMoveMemory(pMbss->Ssid, "CFG_Linux_GO", 12); pMbss->SsidLen = 12; DBGPRINT(RT_DEBUG_ERROR,("CFG: SSID Not Found In Packet\n")); } else if (pBeacon->ssid_len != 0) { NdisZeroMemory(pMbss->Ssid, pMbss->SsidLen); pMbss->SsidLen = pBeacon->ssid_len; NdisCopyMemory(pMbss->Ssid, ssid_ie+2, pMbss->SsidLen); DBGPRINT(RT_DEBUG_ERROR,("\nCFG : SSID: %s, %d\n", pMbss->Ssid, pMbss->SsidLen)); } #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,4,0)) if (pBeacon->hidden_ssid > 0 && pBeacon->hidden_ssid < 3) { pMbss->bHideSsid = TRUE; if ((pBeacon->ssid_len != 0) && (pBeacon->ssid_len <= MAX_LEN_OF_SSID)) { pMbss->SsidLen = pBeacon->ssid_len; NdisCopyMemory(pMbss->Ssid, pBeacon->ssid, pMbss->SsidLen); DBGPRINT(RT_DEBUG_ERROR,("80211> [Hidden] SSID: %s, %d\n", pMbss->Ssid, pMbss->SsidLen)); } } else pMbss->bHideSsid = FALSE; #endif /* LINUX_VERSION_CODE 3.4.0 */ /* WMM EDCA Paramter */ CFG80211_SyncPacketWmmIe(pAd, pBeacon->beacon_tail, pBeacon->beacon_tail_len); pMbss->RSNIE_Len[0] = 0; pMbss->RSNIE_Len[1] = 0; NdisZeroMemory(pMbss->RSN_IE[0], MAX_LEN_OF_RSNIE); NdisZeroMemory(pMbss->RSN_IE[1], MAX_LEN_OF_RSNIE); DBGPRINT(RT_DEBUG_TRACE,("80211> pBeacon->privacy = %d\n", pBeacon->privacy)); if (pBeacon->privacy) { /* Security */ if (pBeacon->auth_type == NL80211_AUTHTYPE_SHARED_KEY) { /* Shared WEP */ wdev->WepStatus = Ndis802_11WEPEnabled; wdev->AuthMode = Ndis802_11AuthModeShared; } else CFG80211_ParseBeaconIE(pAd, pMbss, wdev, (UCHAR *)wpa_ie, (UCHAR *)rsn_ie); if ((wdev->WepStatus == 0) && (wdev->AuthMode == 0)) { /* WEP Auto */ wdev->WepStatus = Ndis802_11WEPEnabled; wdev->AuthMode = Ndis802_11AuthModeAutoSwitch; } } else { wdev->WepStatus = Ndis802_11EncryptionDisabled; wdev->AuthMode = Ndis802_11AuthModeOpen; } CFG80211_ParseBeaconIE(pAd, pMbss, wdev, (UCHAR *)wpa_ie, (UCHAR *)rsn_ie); pMbss->CapabilityInfo = CAP_GENERATE(1, 0, (wdev->WepStatus != Ndis802_11EncryptionDisabled), (pAd->CommonCfg.TxPreamble == Rt802_11PreambleLong ? 0 : 1), pAd->CommonCfg.bUseShortSlotTime, /*SpectrumMgmt*/FALSE); /* Disable Driver-Internal Rekey */ pMbss->WPAREKEY.ReKeyInterval = 0; pMbss->WPAREKEY.ReKeyMethod = DISABLE_REKEY; if (pBeacon->interval != 0) { MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE,("CFG_TIM New BI %d\n", pBeacon->interval)); pAd->CommonCfg.BeaconPeriod = pBeacon->interval; } if (pBeacon->dtim_period != 0) { MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("CFG_TIM New DP %d\n", pBeacon->dtim_period)); pAd->ApCfg.DtimPeriod = pBeacon->dtim_period; } return TRUE; }