/* ========================================================================== Description: MLME PROBE req state machine procedure ========================================================================== */ static VOID ApCliMlmeProbeReqAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { BOOLEAN Cancelled; APCLI_MLME_JOIN_REQ_STRUCT *Info = (APCLI_MLME_JOIN_REQ_STRUCT *)(Elem->Msg); USHORT ifIndex = (USHORT)(Elem->Priv); PULONG pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].SyncCurrState; PAPCLI_STRUCT pApCliEntry = NULL; DBGPRINT(RT_DEBUG_TRACE, ("ApCli SYNC - ApCliMlmeProbeReqAction(Ssid %s), ifIndex = %d\n", Info->Ssid, ifIndex)); if (ifIndex >= MAX_APCLI_NUM) return; pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex]; /* reset all the timers */ RTMPCancelTimer(&(pApCliEntry->ApCliMlmeAux.ProbeTimer), &Cancelled); pApCliEntry->ApCliMlmeAux.Rssi = -9999; #ifdef APCLI_CONNECTION_TRIAL if (pApCliEntry->TrialCh ==0) #endif pApCliEntry->ApCliMlmeAux.Channel = pAd->CommonCfg.Channel; #ifdef APCLI_CONNECTION_TRIAL else pApCliEntry->ApCliMlmeAux.Channel = pApCliEntry->TrialCh; #endif pApCliEntry->ApCliMlmeAux.SupRateLen = pAd->CommonCfg.SupRateLen; NdisMoveMemory(pApCliEntry->ApCliMlmeAux.SupRate, pAd->CommonCfg.SupRate, pAd->CommonCfg.SupRateLen); /* Prepare the default value for extended rate */ pApCliEntry->ApCliMlmeAux.ExtRateLen = pAd->CommonCfg.ExtRateLen; NdisMoveMemory(pApCliEntry->ApCliMlmeAux.ExtRate, pAd->CommonCfg.ExtRate, pAd->CommonCfg.ExtRateLen); RTMPSetTimer(&(pApCliEntry->ApCliMlmeAux.ProbeTimer), PROBE_TIMEOUT); #ifdef APCLI_CONNECTION_TRIAL NdisZeroMemory(pAd->ApCfg.ApCliTab[ifIndex].ApCliMlmeAux.Bssid, MAC_ADDR_LEN); NdisZeroMemory(pAd->ApCfg.ApCliTab[ifIndex].ApCliMlmeAux.Ssid, MAX_LEN_OF_SSID); NdisCopyMemory(pAd->ApCfg.ApCliTab[ifIndex].ApCliMlmeAux.Bssid, pAd->ApCfg.ApCliTab[ifIndex].CfgApCliBssid, MAC_ADDR_LEN); NdisCopyMemory(pAd->ApCfg.ApCliTab[ifIndex].ApCliMlmeAux.Ssid, pAd->ApCfg.ApCliTab[ifIndex].CfgSsid, pAd->ApCfg.ApCliTab[ifIndex].CfgSsidLen); #endif ApCliEnqueueProbeRequest(pAd, Info->SsidLen, (PCHAR) Info->Ssid, ifIndex); DBGPRINT(RT_DEBUG_TRACE, ("ApCli SYNC - Start Probe the SSID %s on channel =%d\n", pApCliEntry->ApCliMlmeAux.Ssid, pApCliEntry->ApCliMlmeAux.Channel)); *pCurrState = APCLI_JOIN_WAIT_PROBE_RSP; return; }
BOOLEAN CFG80211DRV_OpsScanSetSpecifyChannel( VOID *pAdOrg, VOID *pData, UINT8 dataLen) { PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdOrg; PCFG80211_CTRL cfg80211_ctrl = &pAd->cfg80211_ctrl; UINT32 *pChanList = (UINT32 *) pData; if (pChanList != NULL) { if (cfg80211_ctrl->pCfg80211ChanList != NULL) os_free_mem(NULL, cfg80211_ctrl->pCfg80211ChanList); os_alloc_mem(NULL, (UCHAR **)&cfg80211_ctrl->pCfg80211ChanList, sizeof(UINT32 *) * dataLen); if (cfg80211_ctrl->pCfg80211ChanList != NULL) { NdisCopyMemory(cfg80211_ctrl->pCfg80211ChanList, pChanList, sizeof(UINT32 *) * dataLen); cfg80211_ctrl->Cfg80211ChanListLen = dataLen; cfg80211_ctrl->Cfg80211CurChanIndex = 0 ; /* Start from index 0 */ return NDIS_STATUS_SUCCESS; } else { return NDIS_STATUS_FAILURE; } } return NDIS_STATUS_FAILURE; }
VOID RTMPRepeaterReconnectionCheck( IN PRTMP_ADAPTER pAd) { #ifdef APCLI_AUTO_CONNECT_SUPPORT INT i; PCHAR pApCliSsid, pApCliCfgSsid; UCHAR CfgSsidLen; NDIS_802_11_SSID Ssid; if (pAd->ApCfg.bMACRepeaterEn && pAd->ApCfg.MACRepeaterOuiMode == 2 && pAd->ApCfg.ApCliAutoConnectRunning == FALSE) { for (i = 0; i < MAX_APCLI_NUM; i++) { pApCliSsid = pAd->ApCfg.ApCliTab[i].Ssid; pApCliCfgSsid = pAd->ApCfg.ApCliTab[i].CfgSsid; CfgSsidLen = pAd->ApCfg.ApCliTab[i].CfgSsidLen; if ((pAd->ApCfg.ApCliTab[i].CtrlCurrState < APCLI_CTRL_AUTH || !NdisEqualMemory(pApCliSsid, pApCliCfgSsid, CfgSsidLen)) && pAd->ApCfg.ApCliTab[i].CfgSsidLen > 0 && pAd->Mlme.OneSecPeriodicRound % 23 == 0) { DBGPRINT(RT_DEBUG_TRACE, (" %s(): Scan channels for AP (%s)\n", __FUNCTION__, pApCliCfgSsid)); pAd->ApCfg.ApCliAutoConnectRunning = TRUE; Ssid.SsidLength = CfgSsidLen; NdisCopyMemory(Ssid.Ssid, pApCliCfgSsid, CfgSsidLen); ApSiteSurvey(pAd, &Ssid, SCAN_ACTIVE, FALSE); } } } #endif /* APCLI_AUTO_CONNECT_SUPPORT */ }
static BOOLEAN D_CheckConnectionReq( PRTMP_ADAPTER pAd, PUCHAR pSrcAddr, UINT8 FrameType, PCHAR Rssi) { PBND_STRG_CLI_TABLE table = P_BND_STRG_TABLE; BNDSTRG_MSG msg; UINT32 frame_type_to_frame_check_flags[] = { \ fBND_STRG_FRM_CHK_PRB_REQ, 0, fBND_STRG_FRM_CHK_ASS_REQ, fBND_STRG_FRM_CHK_ATH_REQ}; UINT32 frame_check_flags = 0; /* Send to daemon */ NdisCopyMemory(msg.Rssi, Rssi, 3); msg.Action= CONNECTION_REQ; msg.Band = table->Band; msg.FrameType = FrameType; COPY_MAC_ADDR(msg.Addr, pSrcAddr); D_BndStrgSendMsg(pAd, &msg); if (FrameType < (sizeof(frame_type_to_frame_check_flags)/sizeof(UINT32))) frame_check_flags = frame_type_to_frame_check_flags[FrameType]; else {/* invalid frame type */} if (table->bEnabled == TRUE && frame_check_flags & table->AlgCtrl.FrameCheck) { PBND_STRG_CLI_ENTRY entry = NULL; if (table->Ops) entry = table->Ops->TableLookup(table, pSrcAddr); if (entry/* || table->Band == BAND_5G*/) return TRUE; else { #ifdef BND_STRG_QA BND_STRG_PRINTQAMSG(table, pSrcAddr, (RED("%s: check %s request failed. client's (%02x:%02x:%02x:%02x:%02x:%02x)" " request is ignored. \n"), (table->Band == BAND_24G ? "2.4G" : "5G"), FrameType == 0 ? ("probe") : (FrameType == 3 ? "auth" : "unknow"), PRINT_MAC(pSrcAddr))); #endif return FALSE; } } return TRUE; }
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; }
VOID CFG80211_setApAssocRspExtraIe(VOID *pAdOrg, UCHAR *assocresp_ies, UINT32 assocresp_ies_len) { PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdOrg; PUCHAR pAssocRespBuf = (PUCHAR)pAd->ApCfg.MBSSID[MAIN_MBSSID].AssocRespExtraIe; //PUCHAR UpdatePos; DBGPRINT(RT_DEBUG_TRACE, ("%s: IE len = %d\n", __FUNCTION__, assocresp_ies_len)); if (assocresp_ies_len > sizeof(pAd->ApCfg.MBSSID[MAIN_MBSSID].AssocRespExtraIe)) { DBGPRINT(RT_DEBUG_ERROR, ("%s: AssocResp buf size not enough\n", __FUNCTION__)); return; } NdisCopyMemory(pAssocRespBuf, assocresp_ies, assocresp_ies_len); pAd->ApCfg.MBSSID[MAIN_MBSSID].AssocRespExtraIeLen = assocresp_ies_len; }
VOID RTMPRepeaterReconnectionCheck( IN PRTMP_ADAPTER pAd) { #ifdef APCLI_AUTO_CONNECT_SUPPORT INT i; PCHAR pApCliSsid, pApCliCfgSsid; UCHAR CfgSsidLen; NDIS_802_11_SSID Ssid; USHORT SiteSurveyPeriod; if ((pAd->ApCfg.ApCliAutoConnectRunning == FALSE) #ifdef AP_PARTIAL_SCAN_SUPPORT && (pAd->ApCfg.bPartialScanning == FALSE) #endif /* AP_PARTIAL_SCAN_SUPPORT */ ) { for (i = 0; i < MAX_APCLI_NUM; i++) { if (!APCLI_IF_UP_CHECK(pAd, i) || (pAd->ApCfg.ApCliTab[i].Enable == FALSE)) continue; pApCliSsid = pAd->ApCfg.ApCliTab[i].Ssid; pApCliCfgSsid = pAd->ApCfg.ApCliTab[i].CfgSsid; CfgSsidLen = pAd->ApCfg.ApCliTab[i].CfgSsidLen; SiteSurveyPeriod = pAd->ApCfg.ApCliTab[i].ApCliSiteSurveyPeriod; if ((pAd->ApCfg.ApCliTab[i].CtrlCurrState < APCLI_CTRL_AUTH || !NdisEqualMemory(pApCliSsid, pApCliCfgSsid, CfgSsidLen)) && (pAd->ApCfg.ApCliTab[i].CfgSsidLen > 0) && (pAd->Mlme.OneSecPeriodicRound % SiteSurveyPeriod == 0)) { DBGPRINT(RT_DEBUG_TRACE, (" %s(): Scan channels for AP (%s)\n", __FUNCTION__, pApCliCfgSsid)); pAd->ApCfg.ApCliAutoConnectRunning = TRUE; #ifdef AP_PARTIAL_SCAN_SUPPORT pAd->ApCfg.bPartialScanning = TRUE; #endif /* AP_PARTIAL_SCAN_SUPPORT */ Ssid.SsidLength = CfgSsidLen; NdisCopyMemory(Ssid.Ssid, pApCliCfgSsid, CfgSsidLen); ApSiteSurvey(pAd, &Ssid, SCAN_ACTIVE, FALSE); } } } #endif /* APCLI_AUTO_CONNECT_SUPPORT */ }
void RTMP_CFG80211_AddVifEntry(void *pAdSrc, PNET_DEV pNewNetDev, UINT32 DevType) { PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdSrc; PCFG80211_VIF_DEV pNewVifDev; pNewVifDev = os_alloc_mem(sizeof(CFG80211_VIF_DEV)); if (pNewVifDev) { NdisZeroMemory(pNewVifDev, sizeof(CFG80211_VIF_DEV)); pNewVifDev->pNext = NULL; pNewVifDev->net_dev = pNewNetDev; pNewVifDev->devType = DevType; NdisZeroMemory(pNewVifDev->CUR_MAC, MAC_ADDR_LEN); NdisCopyMemory(pNewVifDev->CUR_MAC, pNewNetDev->dev_addr, MAC_ADDR_LEN); insertTailList(&pAd->cfg80211_ctrl.Cfg80211VifDevSet.vifDevList, (PLIST_ENTRY)pNewVifDev); DBGPRINT(RT_DEBUG_TRACE, ("Add CFG80211 VIF Device, Type: %d.\n", pNewVifDev->devType)); } }
BOOLEAN CFG80211DRV_OpsScanExtraIesSet( VOID *pAdOrg) { #ifdef CONFIG_STA_SUPPORT PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdOrg; CFG80211_CB *pCfg80211_CB = pAd->pCfg80211_CB; UINT ie_len = 0; PCFG80211_CTRL cfg80211_ctrl = &pAd->cfg80211_ctrl; if (pCfg80211_CB->pCfg80211_ScanReq) ie_len = pCfg80211_CB->pCfg80211_ScanReq->ie_len; CFG80211DBG(DBG_LVL_TRACE, ("80211> CFG80211DRV_OpsExtraIesSet ==> %d\n", ie_len)); CFG80211DBG(DBG_LVL_TRACE, ("80211> is_wpa_supplicant_up ==> %d\n", pAd->StaCfg.wpa_supplicant_info.WpaSupplicantUP)); if (ie_len == 0) return FALSE; /* Reset the ExtraIe and Len */ if (cfg80211_ctrl->pExtraIe) { os_free_mem(NULL, cfg80211_ctrl->pExtraIe); cfg80211_ctrl->pExtraIe = NULL; } cfg80211_ctrl->ExtraIeLen = 0; os_alloc_mem(pAd, (UCHAR **)&(cfg80211_ctrl->pExtraIe), ie_len); if (cfg80211_ctrl->pExtraIe) { NdisCopyMemory(cfg80211_ctrl->pExtraIe, pCfg80211_CB->pCfg80211_ScanReq->ie, ie_len); cfg80211_ctrl->ExtraIeLen = ie_len; hex_dump("CFG8021_SCAN_EXTRAIE", cfg80211_ctrl->pExtraIe, cfg80211_ctrl->ExtraIeLen); } else { CFG80211DBG(DBG_LVL_ERROR, ("80211> CFG80211DRV_OpsExtraIesSet ==> allocate fail. \n")); return FALSE; } #endif /* CONFIG_STA_SUPPORT */ return TRUE; }
static INT D_CheckConnectionReq( PRTMP_ADAPTER pAd, PUCHAR pSrcAddr, UINT8 FrameType, PCHAR Rssi, BOOLEAN *bAuthCheck) { PBND_STRG_CLI_TABLE table = P_BND_STRG_TABLE; BNDSTRG_MSG msg; /* Send to daemon */ NdisCopyMemory(msg.Rssi, Rssi, 3); msg.Action= CONNECTION_REQ; msg.Band = table->Band; msg.FrameType = FrameType; msg.bAuthCheck = bAuthCheck ? 1:0; COPY_MAC_ADDR(msg.Addr, pSrcAddr); D_BndStrgSendMsg(pAd, &msg); if (bAuthCheck) { PBND_STRG_CLI_TABLE table = P_BND_STRG_TABLE; PBND_STRG_CLI_ENTRY entry = NULL; if (table->Ops) entry = table->Ops->TableLookup(table, pSrcAddr); if (entry || table->Band == BAND_5G) *bAuthCheck = TRUE; #ifdef BND_STRG_QA else { *bAuthCheck = FALSE; BND_STRG_PRINTQAMSG(table, pSrcAddr, (RED("check 2.4G connection failed. client (%02x:%02x:%02x:%02x:%02x:%02x)" " is not allowed to connect 2.4G.\n"), PRINT_MAC(pSrcAddr))); } #endif } return TRUE; }
VOID RTMP_CFG80211_AddVifEntry(VOID *pAdSrc, PNET_DEV pNewNetDev, UINT32 DevType) { PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdSrc; PCFG80211_VIF_DEV pNewVifDev = NULL; os_alloc_mem(NULL, (UCHAR **)&pNewVifDev, sizeof(CFG80211_VIF_DEV)); if (pNewVifDev) { NdisZeroMemory(pNewVifDev, sizeof(CFG80211_VIF_DEV)); pNewVifDev->pNext = NULL; pNewVifDev->net_dev = pNewNetDev; pNewVifDev->devType = DevType; NdisZeroMemory(pNewVifDev->CUR_MAC, MAC_ADDR_LEN); NdisCopyMemory(pNewVifDev->CUR_MAC, pNewNetDev->dev_addr, MAC_ADDR_LEN); insertTailList(&pAd->cfg80211_ctrl.Cfg80211VifDevSet.vifDevList, (PLIST_ENTRY)pNewVifDev); DBGPRINT(RT_DEBUG_TRACE, ("Add CFG80211 VIF Device, Type: %d.\n", pNewVifDev->devType)); } else { DBGPRINT(RT_DEBUG_ERROR, ("Error in alloc mem in New CFG80211 VIF Function.\n")); } }
/* Defined in IEEE 802.11AC Appeared in Beacon, (Re)AssocResp, ProbResp frames */ INT build_vht_op_ie(RTMP_ADAPTER *pAd, UCHAR *buf) { VHT_OP_IE vht_op; #ifdef RT_BIG_ENDIAN UINT16 tmp; #endif /* RT_BIG_ENDIAN */ NdisZeroMemory((UCHAR *)&vht_op, sizeof(VHT_OP_IE)); vht_op.vht_op_info.ch_width = (pAd->CommonCfg.vht_bw == VHT_BW_80 ? 1: 0); switch (vht_op.vht_op_info.ch_width) { case 0: vht_op.vht_op_info.center_freq_1 = 0; vht_op.vht_op_info.center_freq_2 = 0; break; case 1: case 2: vht_op.vht_op_info.center_freq_1 = pAd->CommonCfg.vht_cent_ch; vht_op.vht_op_info.center_freq_2 = 0; break; case 3: vht_op.vht_op_info.center_freq_1 = pAd->CommonCfg.vht_cent_ch; vht_op.vht_op_info.center_freq_2 = pAd->CommonCfg.vht_cent_ch2; break; } vht_op.basic_mcs_set.mcs_ss1 = 3; vht_op.basic_mcs_set.mcs_ss2 = 3; vht_op.basic_mcs_set.mcs_ss3 = 3; vht_op.basic_mcs_set.mcs_ss4 = 3; vht_op.basic_mcs_set.mcs_ss5 = 3; vht_op.basic_mcs_set.mcs_ss6 = 3; vht_op.basic_mcs_set.mcs_ss7 = 3; vht_op.basic_mcs_set.mcs_ss8 = 3; switch (pAd->CommonCfg.RxStream) { case 2: vht_op.basic_mcs_set.mcs_ss2 = VHT_MCS_CAP_7; case 1: #ifdef MT76x0 if (IS_MT76x0(pAd)) { /* MT7650E2 support VHT_MCS8 & VHT_MCS9. */ vht_op.basic_mcs_set.mcs_ss1 = VHT_MCS_CAP_9; } else #endif /* MT76x0 */ vht_op.basic_mcs_set.mcs_ss1 = VHT_MCS_CAP_7; break; } #ifdef RT_BIG_ENDIAN //SWAP16((UINT16)vht_op.basic_mcs_set); NdisCopyMemory(&tmp,&vht_op.basic_mcs_set, 2); tmp=SWAP16(tmp); NdisCopyMemory(&vht_op.basic_mcs_set,&tmp, 2); #endif /* RT_BIG_ENDIAN */ NdisMoveMemory((UCHAR *)buf, (UCHAR *)&vht_op, sizeof(VHT_OP_IE)); return sizeof(VHT_OP_IE); }
/* ========================================================================== Description: MLME PROBE req state machine procedure ========================================================================== */ static VOID ApCliMlmeProbeReqAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { BOOLEAN Cancelled; APCLI_MLME_JOIN_REQ_STRUCT *Info = (APCLI_MLME_JOIN_REQ_STRUCT *)(Elem->Msg); USHORT ifIndex = (USHORT)(Elem->Priv); PULONG pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].SyncCurrState; APCLI_STRUCT *pApCliEntry = NULL; DBGPRINT(RT_DEBUG_TRACE, ("ApCli SYNC - ApCliMlmeProbeReqAction(Ssid %s)\n", Info->Ssid)); if (ifIndex >= MAX_APCLI_NUM) return; pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex]; /* reset all the timers */ RTMPCancelTimer(&(pApCliEntry->MlmeAux.ProbeTimer), &Cancelled); pApCliEntry->MlmeAux.Rssi = -9999; ULONG bss_idx = BSS_NOT_FOUND; bss_idx = BssSsidTableSearchBySSID(&pAd->ScanTab, (PCHAR)Info->Ssid, Info->SsidLen); if (bss_idx == BSS_NOT_FOUND) { #ifdef APCLI_CONNECTION_TRIAL if (pApCliEntry->TrialCh ==0) pApCliEntry->MlmeAux.Channel = pAd->CommonCfg.Channel; else pApCliEntry->MlmeAux.Channel = pApCliEntry->TrialCh; #else pApCliEntry->MlmeAux.Channel = pAd->CommonCfg.Channel; #endif /* APCLI_CONNECTION_TRIAL */ } else { #ifdef APCLI_CONNECTION_TRIAL if (pApCliEntry->TrialCh ==0) pApCliEntry->MlmeAux.Channel = pAd->CommonCfg.Channel; else pApCliEntry->MlmeAux.Channel = pApCliEntry->TrialCh; #else DBGPRINT(RT_DEBUG_TRACE, ("%s, Found %s in scanTable , goto channel %d\n", __FUNCTION__, pAd->ScanTab.BssEntry[bss_idx].Ssid, pAd->ScanTab.BssEntry[bss_idx].Channel)); pApCliEntry->MlmeAux.Channel = pAd->ScanTab.BssEntry[bss_idx].Channel; #endif /* APCLI_CONNECTION_TRIAL */ } #ifdef RT_CFG80211_P2P_CONCURRENT_DEVICE pApCliEntry->MlmeAux.SupRateLen = pAd->cfg80211_ctrl.P2pSupRateLen; NdisMoveMemory(pApCliEntry->MlmeAux.SupRate, pAd->cfg80211_ctrl.P2pSupRate, pAd->cfg80211_ctrl.P2pSupRateLen); pApCliEntry->MlmeAux.ExtRateLen = pAd->cfg80211_ctrl.P2pExtRateLen; NdisMoveMemory(pApCliEntry->MlmeAux.ExtRate, pAd->cfg80211_ctrl.P2pExtRate, pAd->cfg80211_ctrl.P2pExtRateLen); #else pApCliEntry->MlmeAux.SupRateLen = pAd->CommonCfg.SupRateLen; NdisMoveMemory(pApCliEntry->MlmeAux.SupRate, pAd->CommonCfg.SupRate, pAd->CommonCfg.SupRateLen); /* Prepare the default value for extended rate */ pApCliEntry->MlmeAux.ExtRateLen = pAd->CommonCfg.ExtRateLen; NdisMoveMemory(pApCliEntry->MlmeAux.ExtRate, pAd->CommonCfg.ExtRate, pAd->CommonCfg.ExtRateLen); #endif /* RT_CFG80211_P2P_CONCURRENT_DEVICE */ RTMPSetTimer(&(pApCliEntry->MlmeAux.ProbeTimer), PROBE_TIMEOUT); #ifdef APCLI_CONNECTION_TRIAL NdisZeroMemory(pAd->ApCfg.ApCliTab[ifIndex].MlmeAux.Bssid, MAC_ADDR_LEN); NdisZeroMemory(pAd->ApCfg.ApCliTab[ifIndex].MlmeAux.Ssid, MAX_LEN_OF_SSID); NdisCopyMemory(pAd->ApCfg.ApCliTab[ifIndex].MlmeAux.Bssid, pAd->ApCfg.ApCliTab[ifIndex].CfgApCliBssid, MAC_ADDR_LEN); NdisCopyMemory(pAd->ApCfg.ApCliTab[ifIndex].MlmeAux.Ssid, pAd->ApCfg.ApCliTab[ifIndex].CfgSsid, pAd->ApCfg.ApCliTab[ifIndex].CfgSsidLen); #endif /* APCLI_CONNECTION_TRIAL */ ApCliEnqueueProbeRequest(pAd, Info->SsidLen, (PCHAR) Info->Ssid, ifIndex); DBGPRINT(RT_DEBUG_TRACE, ("ApCli SYNC - Start Probe the SSID %s on channel =%d\n", pApCliEntry->MlmeAux.Ssid, pApCliEntry->MlmeAux.Channel)); *pCurrState = APCLI_JOIN_WAIT_PROBE_RSP; return; }
/* ========================================================================== Description: peer sends assoc rsp back Parameters: Elme - MLME message containing the received frame ========================================================================== */ static VOID ApCliPeerAssocRspAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { BOOLEAN Cancelled; USHORT CapabilityInfo, Status, Aid; UCHAR SupRate[MAX_LEN_OF_SUPPORTED_RATES], SupRateLen; UCHAR ExtRate[MAX_LEN_OF_SUPPORTED_RATES], ExtRateLen; UCHAR Addr2[MAC_ADDR_LEN]; EDCA_PARM EdcaParm; UCHAR CkipFlag; APCLI_CTRL_MSG_STRUCT ApCliCtrlMsg; HT_CAPABILITY_IE HtCapability; ADD_HT_INFO_IE AddHtInfo; /* AP might use this additional ht info IE */ UCHAR HtCapabilityLen; UCHAR AddHtInfoLen; UCHAR NewExtChannelOffset = 0xff; USHORT ifIndex = (USHORT)(Elem->Priv); ULONG *pCurrState = NULL; #ifdef DOT11_VHT_AC PAPCLI_STRUCT pApCliEntry = NULL; #endif /* DOT11_VHT_AC */ #ifdef MAC_REPEATER_SUPPORT UCHAR CliIdx = 0xFF; #endif /* MAC_REPEATER_SUPPORT */ IE_LISTS *ie_list = NULL; if ((ifIndex >= MAX_APCLI_NUM) #ifdef MAC_REPEATER_SUPPORT && (ifIndex < 64) #endif /* MAC_REPEATER_SUPPORT */ ) return; #ifdef MAC_REPEATER_SUPPORT if (ifIndex >= 64) { CliIdx = ((ifIndex - 64) % 16); ifIndex = ((ifIndex - 64) / 16); pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].RepeaterCli[CliIdx].AssocCurrState; } else #endif /* MAC_REPEATER_SUPPORT */ pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].AssocCurrState; #ifdef DOT11_VHT_AC pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex]; #endif /* DOT11_VHT_AC */ os_alloc_mem(pAd, (UCHAR **)&ie_list, sizeof(IE_LISTS)); if (ie_list == NULL) { DBGPRINT(RT_DEBUG_OFF, ("%s():mem alloc failed!\n", __FUNCTION__)); return; } NdisZeroMemory((UCHAR *)ie_list, sizeof(IE_LISTS)); if (ApCliPeerAssocRspSanity(pAd, Elem->Msg, Elem->MsgLen, Addr2, &CapabilityInfo, &Status, &Aid, SupRate, &SupRateLen, ExtRate, &ExtRateLen, &HtCapability, &AddHtInfo, &HtCapabilityLen,&AddHtInfoLen,&NewExtChannelOffset, &EdcaParm, &CkipFlag, ie_list)) { /* The frame is for me ? */ if(MAC_ADDR_EQUAL(Addr2, pAd->ApCfg.ApCliTab[ifIndex].MlmeAux.Bssid)) { DBGPRINT(RT_DEBUG_TRACE, ("APCLI_ASSOC - receive ASSOC_RSP to me (status=%d)\n", Status)); #if defined(RT_CFG80211_P2P_CONCURRENT_DEVICE) || defined(CFG80211_MULTI_STA) /* Store the AssocRsp Frame to wpa_supplicant via CFG80211 */ NdisZeroMemory(pAd->ApCfg.ApCliTab[ifIndex].ResVarIEs, MAX_VIE_LEN); pAd->ApCfg.ApCliTab[ifIndex].ResVarIELen = 0; PFRAME_802_11 pFrame = (PFRAME_802_11) (Elem->Msg); pAd->ApCfg.ApCliTab[ifIndex].ResVarIELen = Elem->MsgLen - 6 - sizeof (HEADER_802_11); NdisCopyMemory(pAd->ApCfg.ApCliTab[ifIndex].ResVarIEs, &pFrame->Octet[6], pAd->ApCfg.ApCliTab[ifIndex].ResVarIELen); #endif /* RT_CFG80211_P2P_CONCURRENT_DEVICE || CFG80211_MULTI_STA */ #ifdef MAC_REPEATER_SUPPORT if (CliIdx != 0xFF) RTMPCancelTimer(&pAd->ApCfg.ApCliTab[ifIndex].RepeaterCli[CliIdx].ApCliAssocTimer, &Cancelled); else #endif /* MAC_REPEATER_SUPPORT */ RTMPCancelTimer(&pAd->ApCfg.ApCliTab[ifIndex].MlmeAux.ApCliAssocTimer, &Cancelled); if(Status == MLME_SUCCESS) { /* go to procedure listed on page 376 */ #ifdef MAC_REPEATER_SUPPORT if (CliIdx == 0xFF) #endif /* MAC_REPEATER_SUPPORT */ { ApCliAssocPostProc(pAd, Addr2, CapabilityInfo, ifIndex, SupRate, SupRateLen, ExtRate, ExtRateLen, &EdcaParm, &HtCapability, HtCapabilityLen, &AddHtInfo); #ifdef DOT11_VHT_AC RTMPZeroMemory(&pApCliEntry->MlmeAux.vht_cap, sizeof(VHT_CAP_IE)); RTMPZeroMemory(&pApCliEntry->MlmeAux.vht_op, sizeof(VHT_OP_IE)); pApCliEntry->MlmeAux.vht_cap_len = 0; pApCliEntry->MlmeAux.vht_op_len = 0; if (WMODE_CAP_AC(pAd->CommonCfg.PhyMode) && ie_list->vht_cap_len && ie_list->vht_op_len) { DBGPRINT(RT_DEBUG_TRACE, ("There is vht le at Assoc Rsp ifIndex=%d vht_cap_len=%d\n", ifIndex,ie_list->vht_cap_len)); NdisMoveMemory(&pApCliEntry->MlmeAux.vht_cap, &(ie_list->vht_cap), ie_list->vht_cap_len); pApCliEntry->MlmeAux.vht_cap_len = ie_list->vht_cap_len; NdisMoveMemory(&pApCliEntry->MlmeAux.vht_op, &(ie_list->vht_op), ie_list->vht_op_len); pApCliEntry->MlmeAux.vht_op_len = ie_list->vht_op_len; } #endif /* DOT11_VHT_AC */ } ApCliCtrlMsg.Status = MLME_SUCCESS; #ifdef MAC_REPEATER_SUPPORT ApCliCtrlMsg.BssIdx = ifIndex; ApCliCtrlMsg.CliIdx = CliIdx; ifIndex = (USHORT)(Elem->Priv); #endif /* MAC_REPEATER_SUPPORT */ MlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_ASSOC_RSP, sizeof(APCLI_CTRL_MSG_STRUCT), &ApCliCtrlMsg, ifIndex); } else { ApCliCtrlMsg.Status = Status; MlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_ASSOC_RSP, sizeof(APCLI_CTRL_MSG_STRUCT), &ApCliCtrlMsg, ifIndex); } *pCurrState = APCLI_ASSOC_IDLE; } } else { DBGPRINT(RT_DEBUG_TRACE, ("APCLI_ASSOC - ApCliPeerAssocRspAction() sanity check fail\n")); } if (ie_list) os_free_mem(pAd, ie_list); return; }
VOID RTMP_CFG80211_VirtualIF_Init( IN VOID *pAdSrc, IN CHAR *pDevName, IN UINT32 DevType) { PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdSrc; RTMP_OS_NETDEV_OP_HOOK netDevHook, *pNetDevOps; PNET_DEV new_dev_p; #ifdef RT_CFG80211_P2P_SUPPORT APCLI_STRUCT *pApCliEntry; #endif /* RT_CFG80211_P2P_SUPPORT */ struct wifi_dev *wdev; CHAR preIfName[12]; UINT devNameLen = strlen(pDevName); UINT preIfIndex = pDevName[devNameLen-1] - 48; CFG80211_CB *p80211CB = pAd->pCfg80211_CB; struct wireless_dev *pWdev; UINT32 MC_RowID = 0, IoctlIF = 0, Inf = INT_P2P; memset(preIfName, 0, sizeof(preIfName)); NdisCopyMemory(preIfName, pDevName, devNameLen-1); pNetDevOps=&netDevHook; DBGPRINT(RT_DEBUG_TRACE, ("%s ---> (%s, %s, %d)\n", __FUNCTION__, pDevName, preIfName, preIfIndex)); /* init operation functions and flags */ NdisZeroMemory(&netDevHook, sizeof(netDevHook)); netDevHook.open = CFG80211_VirtualIF_Open; /* device opem hook point */ netDevHook.stop = CFG80211_VirtualIF_Close; /* device close hook point */ netDevHook.xmit = CFG80211_VirtualIF_PacketSend; /* hard transmit hook point */ netDevHook.ioctl = CFG80211_VirtualIF_Ioctl; /* ioctl hook point */ #if WIRELESS_EXT >= 12 //netDevHook.iw_handler = (void *)&rt28xx_ap_iw_handler_def; #endif /* WIRELESS_EXT >= 12 */ new_dev_p = RtmpOSNetDevCreate(MC_RowID, &IoctlIF, Inf, preIfIndex, sizeof(PRTMP_ADAPTER), preIfName); if (new_dev_p == NULL) { /* allocation fail, exit */ DBGPRINT(RT_DEBUG_ERROR, ("Allocate network device fail (CFG80211)...\n")); return; } else { DBGPRINT(RT_DEBUG_TRACE, ("Register CFG80211 I/F (%s)\n", RTMP_OS_NETDEV_GET_DEVNAME(new_dev_p))); } new_dev_p->destructor = free_netdev; RTMP_OS_NETDEV_SET_PRIV(new_dev_p, pAd); pNetDevOps->needProtcted = TRUE; NdisMoveMemory(&pNetDevOps->devAddr[0], &pAd->CurrentAddress[0], MAC_ADDR_LEN); //CFG_TODO /* Bit1 of MAC address Byte0 is local administration bit and should be set to 1 in extended multiple BSSIDs' Bit3~ of MAC address Byte0 is extended multiple BSSID index. */ if (pAd->chipCap.MBSSIDMode == MBSSID_MODE1) pNetDevOps->devAddr[0] += 2; /* NEW BSSID */ else { #ifdef P2P_ODD_MAC_ADJUST if (pNetDevOps->devAddr[5] & 0x01 == 0x01) pNetDevOps->devAddr[5] -= 1; else #endif /* P2P_ODD_MAC_ADJUST */ pNetDevOps->devAddr[5] += FIRST_MBSSID; } switch (DevType) { case RT_CMD_80211_IFTYPE_MONITOR: DBGPRINT(RT_DEBUG_ERROR, ("CFG80211 I/F Monitor Type\n")); //RTMP_OS_NETDEV_SET_TYPE_MONITOR(new_dev_p); break; #ifdef RT_CFG80211_P2P_SUPPORT case RT_CMD_80211_IFTYPE_P2P_CLIENT: pApCliEntry = &pAd->ApCfg.ApCliTab[MAIN_MBSSID]; wdev = &pApCliEntry->wdev; wdev->wdev_type = WDEV_TYPE_STA; wdev->func_dev = pApCliEntry; wdev->sys_handle = (void *)pAd; wdev->if_dev = new_dev_p; wdev->tx_pkt_allowed = ApCliAllowToSendPacket; RTMP_OS_NETDEV_SET_PRIV(new_dev_p, pAd); RTMP_OS_NETDEV_SET_WDEV(new_dev_p, wdev); if (rtmp_wdev_idx_reg(pAd, wdev) < 0) { DBGPRINT(RT_DEBUG_ERROR, ("%s: Assign wdev idx for %s failed, free net device!\n", __FUNCTION__,RTMP_OS_NETDEV_GET_DEVNAME(new_dev_p))); RtmpOSNetDevFree(new_dev_p); break; } /* init MAC address of virtual network interface */ COPY_MAC_ADDR(wdev->if_addr, pNetDevOps->devAddr); break; case RT_CMD_80211_IFTYPE_P2P_GO: pNetDevOps->priv_flags = INT_P2P; pAd->ApCfg.MBSSID[MAIN_MBSSID].MSSIDDev = NULL; /* The Behivaor in SetBeacon Ops */ //pAd->ApCfg.MBSSID[MAIN_MBSSID].MSSIDDev = new_dev_p; pAd->cfg80211_ctrl.isCfgInApMode = RT_CMD_80211_IFTYPE_AP; COPY_MAC_ADDR(pAd->ApCfg.MBSSID[MAIN_MBSSID].wdev.if_addr, pNetDevOps->devAddr); COPY_MAC_ADDR(pAd->ApCfg.MBSSID[MAIN_MBSSID].wdev.bssid, pNetDevOps->devAddr); break; #endif /* RT_CFG80211_P2P_SUPPORT */ default: DBGPRINT(RT_DEBUG_ERROR, ("Unknown CFG80211 I/F Type (%d)\n", DevType)); } //CFG_TODO : should be move to VIF_CHG if ((DevType == RT_CMD_80211_IFTYPE_P2P_CLIENT) || (DevType == RT_CMD_80211_IFTYPE_P2P_GO)) { COPY_MAC_ADDR(pAd->cfg80211_ctrl.P2PCurrentAddress, pNetDevOps->devAddr); } pWdev = kzalloc(sizeof(*pWdev), GFP_KERNEL); new_dev_p->ieee80211_ptr = pWdev; pWdev->wiphy = p80211CB->pCfg80211_Wdev->wiphy; SET_NETDEV_DEV(new_dev_p, wiphy_dev(pWdev->wiphy)); pWdev->netdev = new_dev_p; pWdev->iftype = DevType; RtmpOSNetDevAttach(pAd->OpMode, new_dev_p, pNetDevOps); AsicSetBssid(pAd, pAd->CurrentAddress); /* Record the pNetDevice to Cfg80211VifDevList */ RTMP_CFG80211_AddVifEntry(pAd, new_dev_p, DevType); DBGPRINT(RT_DEBUG_TRACE, ("%s <---\n", __FUNCTION__)); }
/* Defined in IEEE 802.11AC Appeared in Beacon, (Re)AssocReq, (Re)AssocResp, ProbReq/Resp frames */ INT build_vht_cap_ie(RTMP_ADAPTER *pAd, UCHAR *buf) { VHT_CAP_IE vht_cap_ie; #ifdef RT_BIG_ENDIAN UINT32 tmp_1; UINT64 tmp_2; #endif /*RT_BIG_ENDIAN*/ NdisZeroMemory((UCHAR *)&vht_cap_ie, sizeof(VHT_CAP_IE)); vht_cap_ie.vht_cap.max_mpdu_len = 0; // TODO: Ask Jerry about hardware limitation. vht_cap_ie.vht_cap.ch_width = 0; /* not support 160 or 80 + 80 MHz */ vht_cap_ie.vht_cap.sgi_80M = pAd->CommonCfg.vht_sgi_80; vht_cap_ie.vht_cap.htc_vht_cap = 1; vht_cap_ie.vht_cap.max_ampdu_exp = 3; // TODO: Ask Jerry about the hardware limitation, currently set as 64K vht_cap_ie.vht_cap.tx_stbc = 0; vht_cap_ie.vht_cap.rx_stbc = 0; if (pAd->CommonCfg.vht_stbc) { if (pAd->CommonCfg.TxStream >= 2) vht_cap_ie.vht_cap.tx_stbc = 1; else vht_cap_ie.vht_cap.tx_stbc = 0; if (pAd->CommonCfg.RxStream >= 1) vht_cap_ie.vht_cap.rx_stbc = 1; // TODO: is it depends on the number of our antennas? else vht_cap_ie.vht_cap.rx_stbc = 0; } vht_cap_ie.vht_cap.tx_ant_consistency = 1; vht_cap_ie.vht_cap.rx_ant_consistency = 1; vht_cap_ie.mcs_set.rx_mcs_map.mcs_ss1 = VHT_MCS_CAP_NA; vht_cap_ie.mcs_set.rx_mcs_map.mcs_ss2 = VHT_MCS_CAP_NA; vht_cap_ie.mcs_set.rx_mcs_map.mcs_ss3 = VHT_MCS_CAP_NA; vht_cap_ie.mcs_set.rx_mcs_map.mcs_ss4 = VHT_MCS_CAP_NA; vht_cap_ie.mcs_set.rx_mcs_map.mcs_ss5 = VHT_MCS_CAP_NA; vht_cap_ie.mcs_set.rx_mcs_map.mcs_ss6 = VHT_MCS_CAP_NA; vht_cap_ie.mcs_set.rx_mcs_map.mcs_ss7 = VHT_MCS_CAP_NA; vht_cap_ie.mcs_set.rx_mcs_map.mcs_ss8 = VHT_MCS_CAP_NA; vht_cap_ie.mcs_set.tx_mcs_map.mcs_ss1 = VHT_MCS_CAP_NA; vht_cap_ie.mcs_set.tx_mcs_map.mcs_ss2 = VHT_MCS_CAP_NA; vht_cap_ie.mcs_set.tx_mcs_map.mcs_ss3 = VHT_MCS_CAP_NA; vht_cap_ie.mcs_set.tx_mcs_map.mcs_ss4 = VHT_MCS_CAP_NA; vht_cap_ie.mcs_set.tx_mcs_map.mcs_ss5 = VHT_MCS_CAP_NA; vht_cap_ie.mcs_set.tx_mcs_map.mcs_ss6 = VHT_MCS_CAP_NA; vht_cap_ie.mcs_set.tx_mcs_map.mcs_ss7 = VHT_MCS_CAP_NA; vht_cap_ie.mcs_set.tx_mcs_map.mcs_ss8 = VHT_MCS_CAP_NA; switch (pAd->CommonCfg.RxStream) { case 1: vht_cap_ie.mcs_set.rx_high_rate = 292; #ifdef MT76x0 if (IS_MT76x0(pAd)) { /* MT7650E2 support VHT_MCS8 & VHT_MCS9. */ vht_cap_ie.mcs_set.rx_mcs_map.mcs_ss1 = VHT_MCS_CAP_9; } else #endif /* MT76x0 */ vht_cap_ie.mcs_set.rx_mcs_map.mcs_ss1 = VHT_MCS_CAP_7; break; case 2: vht_cap_ie.mcs_set.rx_high_rate = 585; vht_cap_ie.mcs_set.rx_mcs_map.mcs_ss1 = VHT_MCS_CAP_7; vht_cap_ie.mcs_set.rx_mcs_map.mcs_ss2 = VHT_MCS_CAP_7; break; default: vht_cap_ie.mcs_set.rx_high_rate = 0; break; } switch (pAd->CommonCfg.TxStream) { case 1: vht_cap_ie.mcs_set.tx_high_rate = 292; #ifdef MT76x0 if (IS_MT76x0(pAd)) { /* MT7650E2 support VHT_MCS8 & VHT_MCS9. */ vht_cap_ie.mcs_set.tx_mcs_map.mcs_ss1 = VHT_MCS_CAP_9; } else #endif /* MT76x0 */ vht_cap_ie.mcs_set.tx_mcs_map.mcs_ss1 = VHT_MCS_CAP_7; break; case 2: vht_cap_ie.mcs_set.tx_high_rate = 585; vht_cap_ie.mcs_set.tx_mcs_map.mcs_ss1 = VHT_MCS_CAP_7; vht_cap_ie.mcs_set.tx_mcs_map.mcs_ss2 = VHT_MCS_CAP_7; break; default: vht_cap_ie.mcs_set.tx_high_rate = 0; break; } #ifdef RT_BIG_ENDIAN NdisCopyMemory(&tmp_1,&vht_cap_ie.vht_cap, 4); tmp_1 = SWAP32(tmp_1); NdisCopyMemory(&vht_cap_ie.vht_cap,&tmp_1, 4); NdisCopyMemory(&tmp_2,&vht_cap_ie.mcs_set, 8); tmp_2=SWAP64(tmp_2); NdisCopyMemory(&vht_cap_ie.mcs_set,&tmp_2, 8); //hex_dump("&vht_cap_ie", &vht_cap_ie, sizeof(VHT_CAP_IE)); //SWAP32((UINT32)vht_cap_ie.vht_cap); //SWAP32((UINT32)vht_cap_ie.mcs_set); #endif /* RT_BIG_ENDIAN */ NdisMoveMemory(buf, (UCHAR *)&vht_cap_ie, sizeof(VHT_CAP_IE)); return sizeof(VHT_CAP_IE); }
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; } }
/* Defined in IEEE 802.11AC Appeared in Beacon, (Re)AssocResp, ProbResp frames */ INT build_vht_op_ie(RTMP_ADAPTER *pAd, UCHAR *buf) { VHT_OP_IE vht_op; UCHAR cent_ch; #ifdef RT_BIG_ENDIAN UINT16 tmp; #endif NdisZeroMemory((UCHAR *)&vht_op, sizeof(VHT_OP_IE)); vht_op.vht_op_info.ch_width = (pAd->CommonCfg.vht_bw == VHT_BW_80 ? 1: 0); #ifdef CONFIG_AP_SUPPORT if (pAd->CommonCfg.Channel > 14 && (pAd->CommonCfg.bIEEE80211H == 1) && (pAd->Dot11_H.RDMode == RD_SWITCHING_MODE)) cent_ch = vht_cent_ch_freq(pAd, pAd->Dot11_H.org_ch); else #endif /* CONFIG_AP_SUPPORT */ cent_ch = vht_cent_ch_freq(pAd, pAd->CommonCfg.Channel); switch (vht_op.vht_op_info.ch_width) { case 0: vht_op.vht_op_info.center_freq_1 = 0; vht_op.vht_op_info.center_freq_2 = 0; break; case 1: case 2: vht_op.vht_op_info.center_freq_1 = cent_ch; vht_op.vht_op_info.center_freq_2 = 0; break; case 3: vht_op.vht_op_info.center_freq_1 = cent_ch; vht_op.vht_op_info.center_freq_2 = pAd->CommonCfg.vht_cent_ch2; break; } vht_op.basic_mcs_set.mcs_ss1 = VHT_MCS_CAP_NA; vht_op.basic_mcs_set.mcs_ss2 = VHT_MCS_CAP_NA; vht_op.basic_mcs_set.mcs_ss3 = VHT_MCS_CAP_NA; vht_op.basic_mcs_set.mcs_ss4 = VHT_MCS_CAP_NA; vht_op.basic_mcs_set.mcs_ss5 = VHT_MCS_CAP_NA; vht_op.basic_mcs_set.mcs_ss6 = VHT_MCS_CAP_NA; vht_op.basic_mcs_set.mcs_ss7 = VHT_MCS_CAP_NA; vht_op.basic_mcs_set.mcs_ss8 = VHT_MCS_CAP_NA; switch (pAd->CommonCfg.RxStream) { case 2: #ifdef MT76x2 if (IS_MT76x2(pAd)) { vht_op.basic_mcs_set.mcs_ss2 = (((pAd->CommonCfg.vht_bw == VHT_BW_2040) && (pAd->CommonCfg.RegTransmitSetting.field.BW == BW_20)) ? VHT_MCS_CAP_8 : VHT_MCS_CAP_9); } else #endif /* MT76x2 */ vht_op.basic_mcs_set.mcs_ss2 = VHT_MCS_CAP_7; case 1: #if defined(MT76x0) || defined(MT76x2) if (IS_MT76x0(pAd) || IS_MT76x2(pAd)) vht_op.basic_mcs_set.mcs_ss1 = (((pAd->CommonCfg.vht_bw == VHT_BW_2040) && (pAd->CommonCfg.RegTransmitSetting.field.BW == BW_20)) ? VHT_MCS_CAP_8 : VHT_MCS_CAP_9); else #endif vht_op.basic_mcs_set.mcs_ss1 = VHT_MCS_CAP_7; break; } #ifdef RT_BIG_ENDIAN //SWAP16((UINT16)vht_op.basic_mcs_set); NdisCopyMemory(&tmp,&vht_op.basic_mcs_set, 2); tmp = SWAP16(tmp); NdisCopyMemory(&vht_op.basic_mcs_set,&tmp, 2); #endif /* RT_BIG_ENDIAN */ NdisMoveMemory((UCHAR *)buf, (UCHAR *)&vht_op, sizeof(VHT_OP_IE)); return sizeof(VHT_OP_IE); }
VOID RTMPInsertRepeaterEntry( IN PRTMP_ADAPTER pAd, IN UCHAR apidx, IN PUCHAR pAddr) { INT CliIdx, idx; UCHAR HashIdx; BOOLEAN Cancelled; UCHAR tempMAC[MAC_ADDR_LEN]; APCLI_CTRL_MSG_STRUCT ApCliCtrlMsg; PREPEATER_CLIENT_ENTRY pReptCliEntry = NULL, pCurrEntry = NULL; PREPEATER_CLIENT_ENTRY_MAP pReptCliMap; UCHAR SPEC_ADDR[6][3] = {{0x02, 0x0F, 0xB5}, {0x02, 0x09, 0x5B}, {0x02, 0x14, 0x6C}, {0x02, 0x18, 0x4D}, {0x02, 0x1B, 0x2F}, {0x02, 0x1E, 0x2A}}; MAC_TABLE_ENTRY *pMacEntry = NULL; DBGPRINT(RT_DEBUG_TRACE, (" %s.\n", __FUNCTION__)); pMacEntry = MacTableLookup(pAd, pAddr); if (pMacEntry && IS_ENTRY_CLIENT(pMacEntry)) { if (pMacEntry->PortSecured == WPA_802_1X_PORT_NOT_SECURED) { DBGPRINT(RT_DEBUG_ERROR, (" wireless client is not ready !!!\n")); return; } } NdisAcquireSpinLock(&pAd->ApCfg.ReptCliEntryLock); if (pAd->ApCfg.RepeaterCliSize >= MAX_EXT_MAC_ADDR_SIZE) { DBGPRINT(RT_DEBUG_ERROR, (" Repeater Client Full !!!\n")); NdisReleaseSpinLock(&pAd->ApCfg.ReptCliEntryLock); return ; } for (CliIdx = 0; CliIdx < MAX_EXT_MAC_ADDR_SIZE; CliIdx++) { pReptCliEntry = &pAd->ApCfg.ApCliTab[apidx].RepeaterCli[CliIdx]; if ((pReptCliEntry->CliEnable) && (MAC_ADDR_EQUAL(pReptCliEntry->OriginalAddress, pAddr) || MAC_ADDR_EQUAL(pReptCliEntry->CurrentAddress, pAddr))) { DBGPRINT(RT_DEBUG_ERROR, ("\n receive mac :%02x:%02x:%02x:%02x:%02x:%02x !!!\n", pAddr[0], pAddr[1], pAddr[2], pAddr[3], pAddr[4], pAddr[5])); DBGPRINT(RT_DEBUG_ERROR, (" duplicate Insert !!!\n")); NdisReleaseSpinLock(&pAd->ApCfg.ReptCliEntryLock); return ; } if (pReptCliEntry->CliEnable == FALSE) break; } if (CliIdx >= MAX_EXT_MAC_ADDR_SIZE) { DBGPRINT(RT_DEBUG_ERROR, (" Repeater Client Full !!!\n")); NdisReleaseSpinLock(&pAd->ApCfg.ReptCliEntryLock); return ; } pReptCliEntry = &pAd->ApCfg.ApCliTab[apidx].RepeaterCli[CliIdx]; pReptCliMap = &pAd->ApCfg.ApCliTab[apidx].RepeaterCliMap[CliIdx]; /* ENTRY PREEMPTION: initialize the entry */ RTMPCancelTimer(&pReptCliEntry->ApCliAuthTimer, &Cancelled); RTMPCancelTimer(&pReptCliEntry->ApCliAssocTimer, &Cancelled); pReptCliEntry->CtrlCurrState = APCLI_CTRL_DISCONNECTED; pReptCliEntry->AuthCurrState = APCLI_AUTH_REQ_IDLE; pReptCliEntry->AssocCurrState = APCLI_ASSOC_IDLE; pReptCliEntry->CliConnectState = 0; pReptCliEntry->CliValid = FALSE; pReptCliEntry->bEthCli = FALSE; pReptCliEntry->MacTabWCID = 0xFF; pReptCliEntry->AuthReqCnt = 0; pReptCliEntry->AssocReqCnt = 0; pReptCliEntry->CliTriggerTime = 0; pReptCliEntry->pNext = NULL; pReptCliMap->pReptCliEntry = pReptCliEntry; pReptCliMap->pNext = NULL; COPY_MAC_ADDR(pReptCliEntry->OriginalAddress, pAddr); COPY_MAC_ADDR(tempMAC, pAddr); #ifdef SMART_MESH NdisZeroMemory(pAd->vMacAddrPrefix,sizeof(pAd->vMacAddrPrefix)); #endif /* SMART_MESH */ if (pAd->ApCfg.MACRepeaterOuiMode == 1) { DBGPRINT(RT_DEBUG_ERROR, (" todo !!!\n")); } else if (pAd->ApCfg.MACRepeaterOuiMode == 2) { INT IdxToUse; for (idx = 0; idx < 6; idx++) { if (RTMPEqualMemory(SPEC_ADDR[idx], pAddr, 3)) break; } /* If there is a matched one, use the next one; otherwise, use the first one. */ if (idx >= 0 && idx < 5) IdxToUse = idx + 1; else IdxToUse = 0; NdisCopyMemory(tempMAC, SPEC_ADDR[IdxToUse], 3); #ifdef SMART_MESH INT vMacIdx; if (IdxToUse >= 0 && IdxToUse < 5) vMacIdx = IdxToUse + 1; else vMacIdx = 0; NdisCopyMemory(pAd->vMacAddrPrefix, SPEC_ADDR[vMacIdx], sizeof(pAd->vMacAddrPrefix)); #endif /* SMART_MESH */ } else { NdisCopyMemory(tempMAC, pAd->ApCfg.ApCliTab[apidx].wdev.if_addr, 3); } COPY_MAC_ADDR(pReptCliEntry->CurrentAddress, tempMAC); pReptCliEntry->CliEnable = TRUE; pReptCliEntry->CliConnectState = 1; pReptCliEntry->pNext = NULL; NdisGetSystemUpTime(&pReptCliEntry->CliTriggerTime); RTMPInsertRepeaterAsicEntry(pAd, CliIdx, tempMAC); HashIdx = MAC_ADDR_HASH_INDEX(tempMAC); if (pAd->ApCfg.ReptCliHash[HashIdx] == NULL) { pAd->ApCfg.ReptCliHash[HashIdx] = pReptCliEntry; } else { pCurrEntry = pAd->ApCfg.ReptCliHash[HashIdx]; while (pCurrEntry->pNext != NULL) pCurrEntry = pCurrEntry->pNext; pCurrEntry->pNext = pReptCliEntry; } HashIdx = MAC_ADDR_HASH_INDEX(pReptCliEntry->OriginalAddress); if (pAd->ApCfg.ReptMapHash[HashIdx] == NULL) pAd->ApCfg.ReptMapHash[HashIdx] = pReptCliMap; else { PREPEATER_CLIENT_ENTRY_MAP pCurrMapEntry; pCurrMapEntry = pAd->ApCfg.ReptMapHash[HashIdx]; while (pCurrMapEntry->pNext != NULL) pCurrMapEntry = pCurrMapEntry->pNext; pCurrMapEntry->pNext = pReptCliMap; } pAd->ApCfg.RepeaterCliSize++; NdisReleaseSpinLock(&pAd->ApCfg.ReptCliEntryLock); NdisZeroMemory(&ApCliCtrlMsg, sizeof(APCLI_CTRL_MSG_STRUCT)); ApCliCtrlMsg.Status = MLME_SUCCESS; COPY_MAC_ADDR(&ApCliCtrlMsg.SrcAddr[0], tempMAC); ApCliCtrlMsg.BssIdx = apidx; ApCliCtrlMsg.CliIdx = CliIdx; MlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_MT2_AUTH_REQ, sizeof(APCLI_CTRL_MSG_STRUCT), &ApCliCtrlMsg, apidx); }
VOID MBSS_Init( IN PRTMP_ADAPTER pAd, IN RTMP_OS_NETDEV_OP_HOOK *pNetDevOps) { #define MBSS_MAX_DEV_NUM 32 PNET_DEV pDevNew; INT32 IdBss, MaxNumBss; int status; RTMP_OS_NETDEV_OP_HOOK netDevHook; /* sanity check to avoid redundant virtual interfaces are created */ if (pAd->FlgMbssInit != FALSE) return; /* init */ MaxNumBss = pAd->ApCfg.BssidNum; if (MaxNumBss > MAX_MBSSID_NUM(pAd)) MaxNumBss = MAX_MBSSID_NUM(pAd); /* first IdBss must not be 0 (BSS0), must be 1 (BSS1) */ for(IdBss=FIRST_MBSSID; IdBss<MAX_MBSSID_NUM(pAd); IdBss++) pAd->ApCfg.MBSSID[IdBss].MSSIDDev = NULL; /* create virtual network interface */ for(IdBss=FIRST_MBSSID; IdBss<MaxNumBss; IdBss++) { UINT32 MC_RowID = 0, IoctlIF = 0; #ifdef MULTIPLE_CARD_SUPPORT MC_RowID = pAd->MC_RowID; #endif /* MULTIPLE_CARD_SUPPORT */ #ifdef HOSTAPD_SUPPORT IoctlIF = pAd->IoctlIF; #endif /* HOSTAPD_SUPPORT */ pDevNew = RtmpOSNetDevCreate(MC_RowID, &IoctlIF, INT_MBSSID, IdBss, sizeof(PRTMP_ADAPTER), INF_MBSSID_DEV_NAME); #ifdef HOSTAPD_SUPPORT pAd->IoctlIF = IoctlIF; #endif /* HOSTAPD_SUPPORT */ if (pDevNew == NULL) { /* allocation fail, exit */ pAd->ApCfg.BssidNum = IdBss; /* re-assign new MBSS number */ DBGPRINT(RT_DEBUG_ERROR, ("Allocate network device fail (MBSS)...\n")); break; } else { DBGPRINT(RT_DEBUG_TRACE, ("Register MBSSID IF (%s)\n", RTMP_OS_NETDEV_GET_DEVNAME(pDevNew))); } RTMP_OS_NETDEV_SET_PRIV(pDevNew, pAd); /* init operation functions and flags */ NdisCopyMemory(&netDevHook, pNetDevOps, sizeof(netDevHook)); netDevHook.priv_flags = INT_MBSSID; /* We are virtual interface */ netDevHook.needProtcted = TRUE; /* Init MAC address of virtual network interface */ NdisMoveMemory(&netDevHook.devAddr[0], &pAd->ApCfg.MBSSID[IdBss].Bssid[0], MAC_ADDR_LEN); /* backup our virtual network interface */ pAd->ApCfg.MBSSID[IdBss].MSSIDDev = pDevNew; /* register this device to OS */ status = RtmpOSNetDevAttach(pAd->OpMode, pDevNew, &netDevHook); } pAd->FlgMbssInit = TRUE; }
/* ======================================================================== Routine Description: Initialize Multi-BSS function. Arguments: pAd points to our adapter pDevMain points to the main BSS network interface Return Value: None Note: 1. Only create and initialize virtual network interfaces. 2. No main network interface here. 3. If you down ra0 and modify the BssNum of RT2860AP.dat/RT2870AP.dat, it will not work! You must rmmod rt2860ap.ko and lsmod rt2860ap.ko again. ======================================================================== */ VOID MBSS_Init(RTMP_ADAPTER *pAd, RTMP_OS_NETDEV_OP_HOOK *pNetDevOps) { #define MBSS_MAX_DEV_NUM 32 PNET_DEV pDevNew; INT32 IdBss, MaxNumBss; INT status; RTMP_OS_NETDEV_OP_HOOK netDevHook; /* sanity check to avoid redundant virtual interfaces are created */ if (pAd->FlgMbssInit != FALSE) return; MaxNumBss = pAd->ApCfg.BssidNum; if (MaxNumBss > MAX_MBSSID_NUM(pAd)) MaxNumBss = MAX_MBSSID_NUM(pAd); /* first IdBss must not be 0 (BSS0), must be 1 (BSS1) */ for(IdBss=FIRST_MBSSID; IdBss<MAX_MBSSID_NUM(pAd); IdBss++) pAd->ApCfg.MBSSID[IdBss].wdev.if_dev = NULL; /* create virtual network interface */ for(IdBss=FIRST_MBSSID; IdBss<MaxNumBss; IdBss++) { struct wifi_dev *wdev; UINT32 MC_RowID = 0, IoctlIF = 0; char *dev_name; #ifdef MULTIPLE_CARD_SUPPORT MC_RowID = pAd->MC_RowID; #endif /* MULTIPLE_CARD_SUPPORT */ #ifdef HOSTAPD_SUPPORT IoctlIF = pAd->IoctlIF; #endif /* HOSTAPD_SUPPORT */ dev_name = get_dev_name_prefix(pAd, INT_MBSSID); pDevNew = RtmpOSNetDevCreate(MC_RowID, &IoctlIF, INT_MBSSID, IdBss, sizeof(struct mt_dev_priv), dev_name); #ifdef HOSTAPD_SUPPORT pAd->IoctlIF = IoctlIF; #endif /* HOSTAPD_SUPPORT */ if (pDevNew == NULL) { pAd->ApCfg.BssidNum = IdBss; /* re-assign new MBSS number */ break; } else { DBGPRINT(RT_DEBUG_TRACE, ("Register MBSSID IF (%s)\n", RTMP_OS_NETDEV_GET_DEVNAME(pDevNew))); } wdev = &pAd->ApCfg.MBSSID[IdBss].wdev; wdev->wdev_type = WDEV_TYPE_AP; wdev->func_dev = &pAd->ApCfg.MBSSID[IdBss]; wdev->sys_handle = (void *)pAd; wdev->if_dev = pDevNew; if (rtmp_wdev_idx_reg(pAd, wdev) < 0) { DBGPRINT(RT_DEBUG_ERROR, ("Assign wdev idx for %s failed, free net device!\n", RTMP_OS_NETDEV_GET_DEVNAME(pDevNew))); RtmpOSNetDevFree(pDevNew); break; } wdev->tx_pkt_allowed = ApAllowToSendPacket; RTMP_OS_NETDEV_SET_PRIV(pDevNew, pAd); RTMP_OS_NETDEV_SET_WDEV(pDevNew, wdev); /* init operation functions and flags */ NdisCopyMemory(&netDevHook, pNetDevOps, sizeof(netDevHook)); netDevHook.priv_flags = INT_MBSSID; netDevHook.needProtcted = TRUE; netDevHook.wdev = wdev; /* Init MAC address of virtual network interface */ NdisMoveMemory(&netDevHook.devAddr[0], &wdev->bssid[0], MAC_ADDR_LEN); /* register this device to OS */ status = RtmpOSNetDevAttach(pAd->OpMode, pDevNew, &netDevHook); } pAd->FlgMbssInit = TRUE; }
/* ======================================================================== Routine Description: Test command. Arguments: pAd - WLAN control block pointer pArgvIn - the data flow information Return Value: 0 - OK others - FAIL ======================================================================== */ INT TDLS_Ioctl( IN PRTMP_ADAPTER pAd, IN PSTRING pArgvIn) { CHAR BufCmd[3] = { 0, 0, 0 }; CHAR *pArgv, *pParam; UINT32 Command; INT32 Argc; /* init */ pArgv = (CHAR *)pArgvIn; /* get command type */ /* command format is iwpriv ra0 set tdls=[cmd id]_[arg1]_......_[argn] */ NdisCopyMemory(BufCmd, pArgv, 2); Command = simple_strtol((PSTRING)BufCmd, 0, 10); pArgv += 2; /* skip command field */ /* get Argc number */ Argc = 0; pParam = pArgv; while(1) { if (*pParam == '_') Argc ++; /* End of if */ if ((*pParam == 0x00) || (Argc > 20)) break; /* End of if */ pParam++; } /* End of while */ pArgv++; /* skip _ points to arg1 */ /* handle the command */ switch(Command) { case TDLS_UAPSD_PEER_SHOW: /* display peer uapsd info */ DBGPRINT(RT_DEBUG_TRACE, ("tdls_cmd> display peer UAPSD information\n")); TDLS_UAPSD_CmdPeerInfoDisplay(pAd, Argc, pArgv); break; case TDLS_UAPSD_SELF_SHOW: /* display self uapsd info */ DBGPRINT(RT_DEBUG_TRACE, ("tdls_cmd> display self UAPSD information\n")); TDLS_UAPSD_CmdSelfInfoDisplay(pAd, Argc, pArgv); break; case TDLS_UAPSD_CONFIG: /* tdls uapsd configure */ DBGPRINT(RT_DEBUG_TRACE, ("tdls_cmd> configure our UAPSD\n")); TDLS_UAPSD_CmdConfigure(pAd, Argc, pArgv); break; #ifdef TDLS_UAPSD_DEBUG case TDLS_UAPSD_SIM_SETUP_REQ: /* tdls setup request */ DBGPRINT(RT_DEBUG_TRACE, ("tdls_cmd> simulate to send a setup request\n")); TDLS_UAPSD_CmdSimSetupReqSend(pAd, Argc, pArgv); break; case TDLS_UAPSD_SIM_TRAFFIC_RSP_RCV: /* tdls traffic response */ DBGPRINT(RT_DEBUG_TRACE, ("tdls_cmd> simulate to receive a traffic response\n")); TDLS_UAPSD_CmdSimTrafficRspRcv(pAd, Argc, pArgv); break; case TDLS_UAPSD_SIM_TRAFFIC_IND_RCV: /* tdls traffic indication */ DBGPRINT(RT_DEBUG_TRACE, ("tdls_cmd> simulate to receive a traffic indication\n")); TDLS_UAPSD_CmdSimTrafficIndRcv(pAd, Argc, pArgv); break; case TDLS_UAPSD_SIM_PEER_PS: /* tdls peer power save */ DBGPRINT(RT_DEBUG_TRACE, ("tdls_cmd> simulate to change the peer power save\n")); TDLS_UAPSD_CmdSimPeerPowerSaveChg(pAd, Argc, pArgv); break; case TDLS_UAPSD_SIM_PS: /* tdls power save */ DBGPRINT(RT_DEBUG_TRACE, ("tdls_cmd> simulate to change our power save\n")); TDLS_UAPSD_CmdSimSelfPowerSaveChg(pAd, Argc, pArgv); break; case TDLS_UAPSD_SIM_TRAFFIC_RSP_SND: /* tdls traffic response */ DBGPRINT(RT_DEBUG_TRACE, ("tdls_cmd> simulate to send traffic response\n")); TDLS_UAPSD_CmdSimTrafficRspSnd(pAd, Argc, pArgv); break; case TDLS_UAPSD_SIM_BEACON_LOST: /* tdls beacon lost */ DBGPRINT(RT_DEBUG_TRACE, ("tdls_cmd> simulate the beacon lost case\n")); pAd->Mlme.ChannelQuality = 0; if (pAd->StaCfg.bAutoConnectByBssid) pAd->StaCfg.bAutoConnectByBssid = FALSE; pAd->MlmeAux.CurrReqIsFromNdis = FALSE; /* Lost AP, send disconnect & link down event*/ LinkDown(pAd, FALSE); break; #endif /* TDLS_UAPSD_DEBUG */ default: /* error command type */ DBGPRINT(RT_DEBUG_ERROR, ("tdls_cmd> ERROR! No such command!\n")); return -EINVAL; /* input error */ } /* End of switch */ return 0; /* ok */ }
VOID CFG80211_UpdateBeacon( VOID *pAdOrg, UCHAR *beacon_head_buf, UINT32 beacon_head_len, UCHAR *beacon_tail_buf, UINT32 beacon_tail_len, BOOLEAN isAllUpdate) { PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdOrg; PCFG80211_CTRL pCfg80211_ctrl = &pAd->cfg80211_ctrl; HTTRANSMIT_SETTING BeaconTransmit; /* MGMT frame PHY rate setting when operatin at Ht rate. */ PUCHAR pBeaconFrame = (PUCHAR)pAd->ApCfg.MBSSID[MAIN_MBSSID].BeaconBuf; TXWI_STRUC *pTxWI = &pAd->BeaconTxWI; UCHAR New_Tim_Len; UINT32 beacon_len; /* Invoke From CFG80211 OPS For setting Beacon buffer */ if (isAllUpdate) { /* 1. Update the Before TIM IE */ NdisCopyMemory(pBeaconFrame, beacon_head_buf, beacon_head_len); /* 2. Update the TIM IE */ pAd->ApCfg.MBSSID[MAIN_MBSSID].TimIELocationInBeacon = beacon_head_len; /* 3. Store the Tail Part For appending later */ if (pCfg80211_ctrl->beacon_tail_buf != NULL) os_free_mem(NULL, pCfg80211_ctrl->beacon_tail_buf); os_alloc_mem(NULL, (UCHAR **)&pCfg80211_ctrl->beacon_tail_buf, beacon_tail_len); if (pCfg80211_ctrl->beacon_tail_buf != NULL) { NdisCopyMemory(pCfg80211_ctrl->beacon_tail_buf, beacon_tail_buf, beacon_tail_len); pCfg80211_ctrl->beacon_tail_len = beacon_tail_len; } else { pCfg80211_ctrl->beacon_tail_len = 0; DBGPRINT(RT_DEBUG_ERROR, ("CFG80211 Beacon: MEM ALLOC ERROR\n")); } return; } else /* Invoke From Beacon Timer */ { if (pAd->ApCfg.DtimCount == 0) pAd->ApCfg.DtimCount = pAd->ApCfg.DtimPeriod - 1; else pAd->ApCfg.DtimCount -= 1; } /* 4. Update the TIM IE */ New_Tim_Len = CFG80211DRV_UpdateTimIE(pAd, MAIN_MBSSID, pBeaconFrame, pAd->ApCfg.MBSSID[MAIN_MBSSID].TimIELocationInBeacon); /* 5. Update the AFTER TIM IE */ if (pCfg80211_ctrl->beacon_tail_buf != NULL) { NdisCopyMemory(pAd->ApCfg.MBSSID[MAIN_MBSSID].BeaconBuf + pAd->ApCfg.MBSSID[MAIN_MBSSID].TimIELocationInBeacon + New_Tim_Len, pCfg80211_ctrl->beacon_tail_buf, pCfg80211_ctrl->beacon_tail_len); beacon_len = pAd->ApCfg.MBSSID[MAIN_MBSSID].TimIELocationInBeacon + pCfg80211_ctrl->beacon_tail_len + New_Tim_Len; } else { DBGPRINT(RT_DEBUG_ERROR, ("BEACON ====> CFG80211_UpdateBeacon OOPS\n")); return; } BeaconTransmit.word = 0; #ifdef RT_CFG80211_P2P_SUPPORT /* Should be Find the P2P IE Then Set Basic Rate to 6M */ if (RTMP_CFG80211_VIF_P2P_GO_ON(pAd)) BeaconTransmit.field.MODE = MODE_OFDM; /* Use 6Mbps */ else #endif BeaconTransmit.field.MODE = MODE_CCK; BeaconTransmit.field.MCS = MCS_RATE_6; //YF RTMPWriteTxWI(pAd, (UCHAR *)pTxWI, FALSE, FALSE, TRUE, FALSE, FALSE, TRUE, 0, BSS0Mcast_WCID, beacon_len, PID_MGMT, 0, 0, IFS_HTTXOP, &BeaconTransmit); updateAllBeacon(pAd, MAIN_MBSSID, beacon_len); }
/* REF: ap_connect.c ApMakeBssBeacon */ BOOLEAN CFG80211DRV_OpsBeaconSet( VOID *pAdOrg, VOID *pData, BOOLEAN isAdd) { CFG80211DBG(RT_DEBUG_TRACE, ("80211> CFG80211DRV_OpsBeaconSet ==> %d\n", isAdd)); PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdOrg; CMD_RTPRIV_IOCTL_80211_BEACON *pBeacon; PTXWI_STRUC pTxWI = &pAd->BeaconTxWI; HTTRANSMIT_SETTING BeaconTransmit; /* MGMT frame PHY rate setting when operatin at Ht rate. */ BCN_TIME_CFG_STRUC csr9; UCHAR *ptr; UINT i; UINT32 longValue; UINT8 TXWISize = pAd->chipCap.TXWISize; UINT32 rx_filter_flag; BOOLEAN TxPreamble, SpectrumMgmt = FALSE; BOOLEAN bWmmCapable = FALSE; UCHAR BBPR1 = 0, BBPR3 = 0; INT idx; ULONG offset; CFG80211DBG(RT_DEBUG_TRACE, ("80211> CFG80211DRV_OpsBeaconSet ==> \n")); pBeacon = (CMD_RTPRIV_IOCTL_80211_BEACON *)pData; #ifdef WFD_SUPPORT if (pAd->StaCfg.WfdCfg.bSuppInsertWfdIe) { ULONG TmpLen, WfdIeBitmap; ptr = pBeacon->beacon + pBeacon->beacon_len; WfdIeBitmap = (0x1 << SUBID_WFD_DEVICE_INFO) | (0x1 << SUBID_WFD_ASSOCIATED_BSSID) | (0x1 << SUBID_WFD_COUPLED_SINK_INFO); WfdMakeWfdIE(pAd, WfdIeBitmap, ptr, &TmpLen); pBeacon->beacon_len += TmpLen; } #endif /* WFD_SUPPORT */ if (isAdd) { rx_filter_flag = APNORMAL; RTMP_IO_WRITE32(pAd, RX_FILTR_CFG, rx_filter_flag); /* enable RX of DMA block */ pAd->ApCfg.BssidNum = 1; pAd->MacTab.MsduLifeTime = 20; /* default 5 seconds */ pAd->ApCfg.MBSSID[MAIN_MBSSID].bBcnSntReq = TRUE; #ifdef INF_AMAZON_SE printk("YF DEBUG: INF_AMAZON_SE\n"); for (i = 0; i < NUM_OF_TX_RING; i++) { pAd->BulkOutDataSizeLimit[i]=24576; } #endif /* INF_AMAZON_SE */ AsicDisableSync(pAd); if (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED) { if (pAd->CommonCfg.Channel > 14) pAd->ApCfg.MBSSID[MAIN_MBSSID].PhyMode = PHY_11AN_MIXED; else pAd->ApCfg.MBSSID[MAIN_MBSSID].PhyMode = PHY_11BGN_MIXED; } else { if (pAd->CommonCfg.Channel > 14) pAd->ApCfg.MBSSID[MAIN_MBSSID].PhyMode = PHY_11A; else pAd->ApCfg.MBSSID[MAIN_MBSSID].PhyMode = PHY_11BG_MIXED; } TxPreamble = (pAd->CommonCfg.TxPreamble == Rt802_11PreambleLong ? 0 : 1); } PMULTISSID_STRUCT pMbss = &pAd->ApCfg.MBSSID[MAIN_MBSSID]; const UCHAR *ssid_ie = NULL; #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,33)) ssid_ie = cfg80211_find_ie(WLAN_EID_SSID, pBeacon->beacon+36, pBeacon->beacon_len-36); #endif NdisZeroMemory(pMbss->Ssid, pMbss->SsidLen); if (ssid_ie == NULL) { printk("YF Debug: SSID Not Found In Packet\n"); NdisMoveMemory(pMbss->Ssid, "P2P_Linux_AP", 12); pMbss->SsidLen = 12; } else { pMbss->SsidLen = ssid_ie[1]; NdisCopyMemory(pMbss->Ssid, ssid_ie+2, pMbss->SsidLen); printk("YF Debug: SSID: %s, %d\n", pMbss->Ssid, pMbss->SsidLen); } if (isAdd) { //if (pMbss->bWmmCapable) //{ bWmmCapable = FALSE; pMbss->bWmmCapable = FALSE; //} pMbss->MSSIDDev = pAd->net_dev; COPY_MAC_ADDR(pMbss->Bssid, pAd->CurrentAddress); printk("AP BSSID %02x:%02x:%02x:%02x:%02x:%02x\n", PRINT_MAC(pAd->CurrentAddress)); /* GO always use WPA2PSK / AES */ pMbss->AuthMode = Ndis802_11AuthModeWPA2PSK; pMbss->WepStatus = Ndis802_11Encryption3Enabled; pMbss->WscSecurityMode = WPA2PSKAES; pMbss->GroupKeyWepStatus = pMbss->WepStatus; pMbss->CapabilityInfo = CAP_GENERATE(1, 0, (pMbss->WepStatus != Ndis802_11EncryptionDisabled), TxPreamble, pAd->CommonCfg.bUseShortSlotTime, SpectrumMgmt); RTMPMakeRSNIE(pAd, Ndis802_11AuthModeWPA2PSK, Ndis802_11Encryption3Enabled, MAIN_MBSSID); #ifdef DOT11_N_SUPPORT RTMPSetPhyMode(pAd, pAd->CommonCfg.PhyMode); SetCommonHT(pAd); if ((pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED) && (pAd->Antenna.field.TxPath == 2)) { RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R1, &BBPR1); BBPR1 &= (~0x18); BBPR1 |= 0x10; RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R1, BBPR1); } else #endif /* DOT11_N_SUPPORT */ { RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R1, &BBPR1); BBPR1 &= (~0x18); RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R1, BBPR1); } /* Receiver Antenna selection, write to BBP R3(bit4:3) */ RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &BBPR3); BBPR3 &= (~0x18); if(pAd->Antenna.field.RxPath == 3) { BBPR3 |= (0x10); } else if(pAd->Antenna.field.RxPath == 2) { BBPR3 |= (0x8); } else if(pAd->Antenna.field.RxPath == 1) { BBPR3 |= (0x0); } RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, BBPR3); if(!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED)) { if ((pAd->CommonCfg.PhyMode > PHY_11G) || bWmmCapable) { /* EDCA parameters used for AP's own transmission */ pAd->CommonCfg.APEdcaParm.bValid = TRUE; pAd->CommonCfg.APEdcaParm.Aifsn[0] = 3; pAd->CommonCfg.APEdcaParm.Aifsn[1] = 7; pAd->CommonCfg.APEdcaParm.Aifsn[2] = 1; pAd->CommonCfg.APEdcaParm.Aifsn[3] = 1; pAd->CommonCfg.APEdcaParm.Cwmin[0] = 4; pAd->CommonCfg.APEdcaParm.Cwmin[1] = 4; pAd->CommonCfg.APEdcaParm.Cwmin[2] = 3; pAd->CommonCfg.APEdcaParm.Cwmin[3] = 2; pAd->CommonCfg.APEdcaParm.Cwmax[0] = 6; pAd->CommonCfg.APEdcaParm.Cwmax[1] = 10; pAd->CommonCfg.APEdcaParm.Cwmax[2] = 4; pAd->CommonCfg.APEdcaParm.Cwmax[3] = 3; pAd->CommonCfg.APEdcaParm.Txop[0] = 0; pAd->CommonCfg.APEdcaParm.Txop[1] = 0; pAd->CommonCfg.APEdcaParm.Txop[2] = 94; /*96; */ pAd->CommonCfg.APEdcaParm.Txop[3] = 47; /*48; */ AsicSetEdcaParm(pAd, &pAd->CommonCfg.APEdcaParm); /* EDCA parameters to be annouced in outgoing BEACON, used by WMM STA */ pAd->ApCfg.BssEdcaParm.bValid = TRUE; pAd->ApCfg.BssEdcaParm.Aifsn[0] = 3; pAd->ApCfg.BssEdcaParm.Aifsn[1] = 7; pAd->ApCfg.BssEdcaParm.Aifsn[2] = 2; pAd->ApCfg.BssEdcaParm.Aifsn[3] = 2; pAd->ApCfg.BssEdcaParm.Cwmin[0] = 4; pAd->ApCfg.BssEdcaParm.Cwmin[1] = 4; pAd->ApCfg.BssEdcaParm.Cwmin[2] = 3; pAd->ApCfg.BssEdcaParm.Cwmin[3] = 2; pAd->ApCfg.BssEdcaParm.Cwmax[0] = 10; pAd->ApCfg.BssEdcaParm.Cwmax[1] = 10; pAd->ApCfg.BssEdcaParm.Cwmax[2] = 4; pAd->ApCfg.BssEdcaParm.Cwmax[3] = 3; pAd->ApCfg.BssEdcaParm.Txop[0] = 0; pAd->ApCfg.BssEdcaParm.Txop[1] = 0; pAd->ApCfg.BssEdcaParm.Txop[2] = 94; /*96; */ pAd->ApCfg.BssEdcaParm.Txop[3] = 47; /*48; */ } else { AsicSetEdcaParm(pAd, NULL); } } #ifdef DOT11_N_SUPPORT if (pAd->CommonCfg.PhyMode < PHY_11ABGN_MIXED) { /* Patch UI */ pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth = BW_20; } /* init */ if (pAd->CommonCfg.bRdg) { RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_RDG_ACTIVE); AsicEnableRDG(pAd); } else { RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_RDG_ACTIVE); AsicDisableRDG(pAd); } #endif /* DOT11_N_SUPPORT */ //AsicSetBssid(pAd, pAd->CurrentAddress); AsicSetMcastWC(pAd); /* In AP mode, First WCID Table in ASIC will never be used. To prevent it's 0xff-ff-ff-ff-ff-ff, Write 0 here. */ /* p.s ASIC use all 0xff as termination of WCID table search. */ RTMP_IO_WRITE32(pAd, MAC_WCID_BASE, 0x00); RTMP_IO_WRITE32(pAd, MAC_WCID_BASE+4, 0x0); /* reset WCID table */ for (idx=2; idx<255; idx++) { offset = MAC_WCID_BASE + (idx * HW_WCID_ENTRY_SIZE); RTMP_IO_WRITE32(pAd, offset, 0x0); RTMP_IO_WRITE32(pAd, offset+4, 0x0); } pAd->MacTab.Content[0].Addr[0] = 0x01; pAd->MacTab.Content[0].HTPhyMode.field.MODE = MODE_OFDM; pAd->MacTab.Content[0].HTPhyMode.field.MCS = 3; AsicBBPAdjust(pAd); //MlmeSetTxPreamble(pAd, (USHORT)pAd->CommonCfg.TxPreamble); { ULONG Addr4; UINT32 regValue; PUCHAR pP2PBssid = &pAd->CurrentAddress[0]; Addr4 = (ULONG)(pP2PBssid[0]) | (ULONG)(pP2PBssid[1] << 8) | (ULONG)(pP2PBssid[2] << 16) | (ULONG)(pP2PBssid[3] << 24); RTMP_IO_WRITE32(pAd, MAC_BSSID_DW0, Addr4); Addr4 = 0; Addr4 = (ULONG)(pP2PBssid[4]) | (ULONG)(pP2PBssid[5] << 8); RTMP_IO_WRITE32(pAd, MAC_BSSID_DW1, Addr4); RTMP_IO_READ32(pAd, MAC_BSSID_DW1, ®Value); regValue &= 0x0000FFFF; regValue |= (1 << 16); if (pAd->chipCap.MBSSIDMode == MBSSID_MODE1) regValue |= (1 << 21); RTMP_IO_WRITE32(pAd, MAC_BSSID_DW1, regValue); } #ifdef RTMP_MAC_USB printk("YF DEBUG: RTUSBBssBeaconInit\n"); RTUSBBssBeaconInit(pAd); #endif /* RTMP_MAC_USB */ } UCHAR apcliIdx, apidx = MAIN_MBSSID; //pAd->ApCfg.MBSSID[MAIN_MBSSID].PhyMode = PHY_11BGN_MIXED; printk("YF DEBUG: Beacon Len %d\n", pBeacon->beacon_len); printk("YF DEBUG: Beacon Interval %d\n", pBeacon->interval); BeaconTransmit.word = 0; RTMPWriteTxWI(pAd, pTxWI, FALSE, FALSE, TRUE, FALSE, FALSE, TRUE, 0, BSS0Mcast_WCID, pBeacon->beacon_len, PID_MGMT, 0, 0,IFS_HTTXOP, FALSE, &BeaconTransmit); ptr = (PUCHAR)&pAd->BeaconTxWI; #ifdef RT_BIG_ENDIAN RTMPWIEndianChange(ptr, TYPE_TXWI); #endif for (i=0; i<TXWISize; i+=4) /* 16-byte TXWI field */ { longValue = *ptr + (*(ptr+1)<<8) + (*(ptr+2)<<16) + (*(ptr+3)<<24); RTMP_IO_WRITE32(pAd, pAd->BeaconOffset[0] + i, longValue); ptr += 4; } /* update BEACON frame content. start right after the 16-byte TXWI field. */ ptr = pBeacon->beacon; #ifdef RT_BIG_ENDIAN RTMPFrameEndianChange(pAd, ptr, DIR_WRITE, FALSE); #endif for (i= 0; i< pBeacon->beacon_len; i+=4) { longValue = *ptr + (*(ptr+1)<<8) + (*(ptr+2)<<16) + (*(ptr+3)<<24); RTMP_IO_WRITE32(pAd, pAd->BeaconOffset[0] + TXWISize + i, longValue); ptr += 4; } if (isAdd) { /* Enable Bss Sync*/ RTMP_IO_READ32(pAd, BCN_TIME_CFG, &csr9.word); csr9.field.BeaconInterval = (pBeacon->interval) << 4; /* ASIC register in units of 1/16 TU*/ csr9.field.bTsfTicking = 1; csr9.field.TsfSyncMode = 3; csr9.field.bTBTTEnable = 1; csr9.field.bBeaconGen = 1; RTMP_IO_WRITE32(pAd, BCN_TIME_CFG, csr9.word); pAd->P2pCfg.bSentProbeRSP = TRUE; #ifdef RTMP_MAC_USB /* * Support multiple BulkIn IRP, * the value on pAd->CommonCfg.NumOfBulkInIRP may be large than 1. */ UCHAR num_idx; for(num_idx=0; num_idx < pAd->CommonCfg.NumOfBulkInIRP; num_idx++) { RTUSBBulkReceive(pAd); printk("RTUSBBulkReceive!\n" ); } #endif /* RTMP_MAC_USB */ } #ifdef WFD_SUPPORT pAd->StaCfg.WfdCfg.bSuppGoOn = TRUE; #endif /* WFD_SUPPORT */ return TRUE; }
BOOLEAN CFG80211DRV_ApKeyAdd( VOID *pAdOrg, VOID *pData) { #ifdef CONFIG_AP_SUPPORT PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdOrg; CMD_RTPRIV_IOCTL_80211_KEY *pKeyInfo; MAC_TABLE_ENTRY *pEntry; PMULTISSID_STRUCT pMbss = &pAd->ApCfg.MBSSID[MAIN_MBSSID]; struct wifi_dev *pWdev = &pMbss->wdev; UINT8 Wcid; #ifdef RT_CFG80211_SUPPORT UINT apidx = MAIN_MBSSID; #endif /*RT_CFG80211_P2P_SUPPORT*/ DBGPRINT(RT_DEBUG_TRACE,("%s =====> \n", __FUNCTION__)); pKeyInfo = (CMD_RTPRIV_IOCTL_80211_KEY *)pData; if (pKeyInfo->KeyType == RT_CMD_80211_KEY_WEP40 || pKeyInfo->KeyType == RT_CMD_80211_KEY_WEP104) { pWdev->WepStatus = Ndis802_11WEPEnabled; { UCHAR CipherAlg; CIPHER_KEY *pSharedKey; POS_COOKIE pObj; pObj = (POS_COOKIE) pAd->OS_Cookie; pSharedKey = &pAd->SharedKey[apidx][pKeyInfo->KeyId]; NdisMoveMemory(pSharedKey->Key, pKeyInfo->KeyBuf, pKeyInfo->KeyLen); if (pKeyInfo->KeyType == RT_CMD_80211_KEY_WEP40) pAd->SharedKey[apidx][pKeyInfo->KeyId].CipherAlg = CIPHER_WEP64; else pAd->SharedKey[apidx][pKeyInfo->KeyId].CipherAlg = CIPHER_WEP128; AsicAddSharedKeyEntry(pAd, apidx, pKeyInfo->KeyId, pSharedKey); } } else if(pKeyInfo->KeyType == RT_CMD_80211_KEY_WPA) { if (pKeyInfo->cipher == Ndis802_11AESEnable) { /* AES */ //pWdev->WepStatus = Ndis802_11Encryption3Enabled; //pWdev->GroupKeyWepStatus = Ndis802_11Encryption3Enabled; #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) if (pKeyInfo->bPairwise == FALSE ) #else if (pKeyInfo->KeyId > 0) #endif /* LINUX_VERSION_CODE 2.6.37 */ { if (pWdev->GroupKeyWepStatus == Ndis802_11Encryption3Enabled) { DBGPRINT(RT_DEBUG_TRACE, ("CFG: Set AES Security Set. (GROUP) %d\n", pKeyInfo->KeyLen)); pAd->SharedKey[MAIN_MBSSID][pKeyInfo->KeyId].KeyLen= LEN_TK; NdisMoveMemory(pAd->SharedKey[MAIN_MBSSID][pKeyInfo->KeyId].Key, pKeyInfo->KeyBuf, pKeyInfo->KeyLen); pAd->SharedKey[MAIN_MBSSID][pKeyInfo->KeyId].CipherAlg = CIPHER_AES; AsicAddSharedKeyEntry(pAd, MAIN_MBSSID, pKeyInfo->KeyId, &pAd->SharedKey[MAIN_MBSSID][pKeyInfo->KeyId]); GET_GroupKey_WCID(pAd, Wcid, MAIN_MBSSID); RTMPSetWcidSecurityInfo(pAd, MAIN_MBSSID, (UINT8)(pKeyInfo->KeyId), pAd->SharedKey[MAIN_MBSSID][pKeyInfo->KeyId].CipherAlg, Wcid, SHAREDKEYTABLE); } } else { if (pKeyInfo->MAC) pEntry = MacTableLookup(pAd, pKeyInfo->MAC); if(pEntry) { DBGPRINT(RT_DEBUG_TRACE, ("CFG: Set AES Security Set. (PAIRWISE) %d\n", pKeyInfo->KeyLen)); pEntry->PairwiseKey.KeyLen = LEN_TK; NdisCopyMemory(&pEntry->PTK[OFFSET_OF_PTK_TK], pKeyInfo->KeyBuf, OFFSET_OF_PTK_TK); NdisMoveMemory(pEntry->PairwiseKey.Key, &pEntry->PTK[OFFSET_OF_PTK_TK], pKeyInfo->KeyLen); pEntry->PairwiseKey.CipherAlg = CIPHER_AES; AsicAddPairwiseKeyEntry(pAd, (UCHAR)pEntry->Aid, &pEntry->PairwiseKey); RTMPSetWcidSecurityInfo(pAd, pEntry->apidx, (UINT8)(pKeyInfo->KeyId & 0x0fff), pEntry->PairwiseKey.CipherAlg, pEntry->Aid, PAIRWISEKEYTABLE); } else { DBGPRINT(RT_DEBUG_ERROR,("CFG: Set AES Security Set. (PAIRWISE) But pEntry NULL\n")); } } }else if (pKeyInfo->cipher == Ndis802_11TKIPEnable) { /* TKIP */ //pWdev->WepStatus = Ndis802_11Encryption2Enabled; //pWdev->GroupKeyWepStatus = Ndis802_11Encryption2Enabled; #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) if (pKeyInfo->bPairwise == FALSE ) #else if (pKeyInfo->KeyId > 0) #endif /* LINUX_VERSION_CODE 2.6.37 */ { if (pWdev->GroupKeyWepStatus == Ndis802_11Encryption2Enabled) { DBGPRINT(RT_DEBUG_TRACE, ("CFG: Set TKIP Security Set. (GROUP) %d\n", pKeyInfo->KeyLen)); pAd->SharedKey[MAIN_MBSSID][pKeyInfo->KeyId].KeyLen= LEN_TK; NdisMoveMemory(pAd->SharedKey[MAIN_MBSSID][pKeyInfo->KeyId].Key, pKeyInfo->KeyBuf, pKeyInfo->KeyLen); pAd->SharedKey[MAIN_MBSSID][pKeyInfo->KeyId].CipherAlg = CIPHER_TKIP; AsicAddSharedKeyEntry(pAd, MAIN_MBSSID, pKeyInfo->KeyId, &pAd->SharedKey[MAIN_MBSSID][pKeyInfo->KeyId]); GET_GroupKey_WCID(pAd, Wcid, MAIN_MBSSID); RTMPSetWcidSecurityInfo(pAd, MAIN_MBSSID, (UINT8)(pKeyInfo->KeyId), pAd->SharedKey[MAIN_MBSSID][pKeyInfo->KeyId].CipherAlg, Wcid, SHAREDKEYTABLE); } } else { if (pKeyInfo->MAC) pEntry = MacTableLookup(pAd, pKeyInfo->MAC); if(pEntry) { DBGPRINT(RT_DEBUG_TRACE, ("CFG: Set TKIP Security Set. (PAIRWISE) %d\n", pKeyInfo->KeyLen)); pEntry->PairwiseKey.KeyLen = LEN_TK; NdisCopyMemory(&pEntry->PTK[OFFSET_OF_PTK_TK], pKeyInfo->KeyBuf, OFFSET_OF_PTK_TK); NdisMoveMemory(pEntry->PairwiseKey.Key, &pEntry->PTK[OFFSET_OF_PTK_TK], pKeyInfo->KeyLen); pEntry->PairwiseKey.CipherAlg = CIPHER_TKIP; AsicAddPairwiseKeyEntry(pAd, (UCHAR)pEntry->Aid, &pEntry->PairwiseKey); RTMPSetWcidSecurityInfo(pAd, pEntry->apidx, (UINT8)(pKeyInfo->KeyId & 0x0fff), pEntry->PairwiseKey.CipherAlg, pEntry->Aid, PAIRWISEKEYTABLE); } else { DBGPRINT(RT_DEBUG_ERROR,("CFG: Set TKIP Security Set. (PAIRWISE) But pEntry NULL\n")); } } } } #endif /* CONFIG_AP_SUPPORT */ return TRUE; }
BOOLEAN CFG80211DRV_ApKeyAdd( VOID *pAdOrg, VOID *pData) { #ifdef CONFIG_AP_SUPPORT PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdOrg; CMD_RTPRIV_IOCTL_80211_KEY *pKeyInfo; MAC_TABLE_ENTRY *pEntry=NULL; UINT Wcid = 0; #ifdef RT_CFG80211_P2P_SUPPORT UINT apidx = CFG_GO_BSSID_IDX; #else UINT apidx = MAIN_MBSSID; #endif /*RT_CFG80211_P2P_SUPPORT*/ BSS_STRUCT *pMbss = &pAd->ApCfg.MBSSID[apidx]; struct wifi_dev *pWdev = &pMbss->wdev; DBGPRINT(RT_DEBUG_TRACE,("%s =====> \n", __FUNCTION__)); pKeyInfo = (CMD_RTPRIV_IOCTL_80211_KEY *)pData; if (pKeyInfo->KeyType == RT_CMD_80211_KEY_WEP40 || pKeyInfo->KeyType == RT_CMD_80211_KEY_WEP104) { pWdev->WepStatus = Ndis802_11WEPEnabled; { //UCHAR CipherAlg; CIPHER_KEY *pSharedKey; POS_COOKIE pObj; pObj = (POS_COOKIE) pAd->OS_Cookie; pSharedKey = &pAd->SharedKey[apidx][pKeyInfo->KeyId]; pSharedKey->KeyLen = pKeyInfo->KeyLen; NdisMoveMemory(pSharedKey->Key, pKeyInfo->KeyBuf, pKeyInfo->KeyLen); if (pKeyInfo->KeyType == RT_CMD_80211_KEY_WEP40) pAd->SharedKey[apidx][pKeyInfo->KeyId].CipherAlg = CIPHER_WEP64; else pAd->SharedKey[apidx][pKeyInfo->KeyId].CipherAlg = CIPHER_WEP128; AsicAddSharedKeyEntry(pAd, apidx, pKeyInfo->KeyId, pSharedKey); } } else if(pKeyInfo->KeyType == RT_CMD_80211_KEY_WPA) { if (pKeyInfo->cipher == Ndis802_11AESEnable) { /* AES */ #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) if (pKeyInfo->bPairwise == FALSE ) #else if (pKeyInfo->KeyId > 0) #endif /* LINUX_VERSION_CODE 2.6.37 */ { if (pWdev->GroupKeyWepStatus == Ndis802_11Encryption3Enabled) { DBGPRINT(RT_DEBUG_TRACE, ("CFG: Set AES Security Set. (GROUP) %d\n", pKeyInfo->KeyLen)); pAd->SharedKey[apidx][pKeyInfo->KeyId].KeyLen= LEN_TK; NdisMoveMemory(pAd->SharedKey[apidx][pKeyInfo->KeyId].Key, pKeyInfo->KeyBuf, pKeyInfo->KeyLen); pAd->SharedKey[apidx][pKeyInfo->KeyId].CipherAlg = CIPHER_AES; AsicAddSharedKeyEntry(pAd, apidx, pKeyInfo->KeyId, &pAd->SharedKey[apidx][pKeyInfo->KeyId]); GET_GroupKey_WCID(pAd, Wcid, apidx); RTMPSetWcidSecurityInfo(pAd, apidx, (UINT8)(pKeyInfo->KeyId), pAd->SharedKey[apidx][pKeyInfo->KeyId].CipherAlg, Wcid, SHAREDKEYTABLE); #ifdef MT_MAC if (pAd->chipCap.hif_type == HIF_MT) CmdProcAddRemoveKey(pAd, 0, apidx, pKeyInfo->KeyId, Wcid, SHAREDKEYTABLE, &pAd->SharedKey[apidx][pKeyInfo->KeyId], BROADCAST_ADDR); #endif /* MT_MAC */ } } else { if (pKeyInfo->MAC) pEntry = MacTableLookup(pAd, pKeyInfo->MAC); if(pEntry) { DBGPRINT(RT_DEBUG_TRACE, ("CFG: Set AES Security Set. (PAIRWISE) %d\n", pKeyInfo->KeyLen)); pEntry->PairwiseKey.KeyLen = LEN_TK; NdisCopyMemory(&pEntry->PTK[OFFSET_OF_PTK_TK], pKeyInfo->KeyBuf, OFFSET_OF_PTK_TK); NdisMoveMemory(pEntry->PairwiseKey.Key, &pEntry->PTK[OFFSET_OF_PTK_TK], pKeyInfo->KeyLen); pEntry->PairwiseKey.CipherAlg = CIPHER_AES; AsicAddPairwiseKeyEntry(pAd, (UCHAR)pEntry->Aid, &pEntry->PairwiseKey); RTMPSetWcidSecurityInfo(pAd, pEntry->func_tb_idx, (UINT8)(pKeyInfo->KeyId & 0x0fff), pEntry->PairwiseKey.CipherAlg, pEntry->Aid, PAIRWISEKEYTABLE); #ifdef MT_MAC if (pAd->chipCap.hif_type == HIF_MT) CmdProcAddRemoveKey(pAd, 0, apidx, pKeyInfo->KeyId, pEntry->wcid, PAIRWISEKEYTABLE, &pEntry->PairwiseKey, pEntry->Addr); #endif /* MT_MAC */ #ifdef RT_CFG80211_P2P_MULTI_CHAN_SUPPORT MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, ("%s: InfraCh=%d, pWdev->channel=%d\n", __FUNCTION__, pAd->MlmeAux.InfraChannel, pWdev->channel)); if (INFRA_ON(pAd) && ( ((pAd->StaCfg.wdev.bw == pWdev->bw) && (pAd->StaCfg.wdev.channel != pWdev->channel )) ||!((pAd->StaCfg.wdev.bw == pWdev->bw) && ((pAd->StaCfg.wdev.channel == pWdev->channel))))) { /*wait 1 s DHCP for P2P CLI */ OS_WAIT(1000); DBGPRINT(RT_DEBUG_TRACE, ("OS WAIT 1000 FOR DHCP\n")); // pAd->MCC_GOConnect_Protect = FALSE; // pAd->MCC_GOConnect_Count = 0; Start_MCC(pAd); MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, ("infra => GO test\n")); } else if((pAd->StaCfg.wdev.bw != pWdev->bw) && ((pAd->StaCfg.wdev.channel == pWdev->channel))) { MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, ("start bw != && SCC\n")); pAd->Mlme.bStartScc = TRUE; } /*after p2p cli connect , neet to change to default configure*/ //DBGPRINT(RT_DEBUG_TRACE, ("iversontest pWdev->bw %d \n",pWdev->bw)); if (pWdev->bw == 0) { pAd->CommonCfg.RegTransmitSetting.field.EXTCHA = EXTCHA_BELOW; pAd->CommonCfg.RegTransmitSetting.field.BW = BW_40; pAd->CommonCfg.HT_Disable = 0; SetCommonHT(pAd); } #endif /* RT_CFG80211_P2P_MULTI_CHAN_SUPPORT */ } else { DBGPRINT(RT_DEBUG_ERROR,("CFG: Set AES Security Set. (PAIRWISE) But pEntry NULL\n")); } } }else if (pKeyInfo->cipher == Ndis802_11TKIPEnable){ /* TKIP */ #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) if (pKeyInfo->bPairwise == FALSE ) #else if (pKeyInfo->KeyId > 0) #endif /* LINUX_VERSION_CODE 2.6.37 */ { if (pWdev->GroupKeyWepStatus == Ndis802_11Encryption2Enabled) { DBGPRINT(RT_DEBUG_TRACE, ("CFG: Set TKIP Security Set. (GROUP) %d\n", pKeyInfo->KeyLen)); pAd->SharedKey[apidx][pKeyInfo->KeyId].KeyLen= LEN_TK; NdisMoveMemory(pAd->SharedKey[apidx][pKeyInfo->KeyId].Key, pKeyInfo->KeyBuf, pKeyInfo->KeyLen); pAd->SharedKey[apidx][pKeyInfo->KeyId].CipherAlg = CIPHER_TKIP; AsicAddSharedKeyEntry(pAd, apidx, pKeyInfo->KeyId, &pAd->SharedKey[apidx][pKeyInfo->KeyId]); GET_GroupKey_WCID(pAd, Wcid, apidx); RTMPSetWcidSecurityInfo(pAd, apidx, (UINT8)(pKeyInfo->KeyId), pAd->SharedKey[apidx][pKeyInfo->KeyId].CipherAlg, Wcid, SHAREDKEYTABLE); #ifdef MT_MAC if (pAd->chipCap.hif_type == HIF_MT) CmdProcAddRemoveKey(pAd, 0, apidx, pKeyInfo->KeyId, Wcid, SHAREDKEYTABLE, &pAd->SharedKey[apidx][pKeyInfo->KeyId], BROADCAST_ADDR); #endif /* MT_MAC */ } } else { if (pKeyInfo->MAC) pEntry = MacTableLookup(pAd, pKeyInfo->MAC); if(pEntry) { DBGPRINT(RT_DEBUG_TRACE, ("CFG: Set TKIP Security Set. (PAIRWISE) %d\n", pKeyInfo->KeyLen)); pEntry->PairwiseKey.KeyLen = LEN_TK; NdisCopyMemory(&pEntry->PTK[OFFSET_OF_PTK_TK], pKeyInfo->KeyBuf, OFFSET_OF_PTK_TK); NdisMoveMemory(pEntry->PairwiseKey.Key, &pEntry->PTK[OFFSET_OF_PTK_TK], pKeyInfo->KeyLen); pEntry->PairwiseKey.CipherAlg = CIPHER_TKIP; AsicAddPairwiseKeyEntry(pAd, (UCHAR)pEntry->Aid, &pEntry->PairwiseKey); RTMPSetWcidSecurityInfo(pAd, pEntry->func_tb_idx, (UINT8)(pKeyInfo->KeyId & 0x0fff), pEntry->PairwiseKey.CipherAlg, pEntry->Aid, PAIRWISEKEYTABLE); #ifdef MT_MAC if (pAd->chipCap.hif_type == HIF_MT) CmdProcAddRemoveKey(pAd, 0, apidx, pKeyInfo->KeyId, pEntry->wcid, PAIRWISEKEYTABLE, &pEntry->PairwiseKey, pEntry->Addr); #endif /* MT_MAC */ } else { DBGPRINT(RT_DEBUG_ERROR,("CFG: Set TKIP Security Set. (PAIRWISE) But pEntry NULL\n")); } } } } #endif /* CONFIG_AP_SUPPORT */ return TRUE; }
/* Defined in IEEE 802.11AC Appeared in Beacon, (Re)AssocReq, (Re)AssocResp, ProbReq/Resp frames */ INT build_vht_cap_ie(RTMP_ADAPTER *pAd, UCHAR *buf) { VHT_CAP_IE vht_cap_ie; INT rx_nss, tx_nss, mcs_cap; #ifdef RT_BIG_ENDIAN UINT32 tmp_1; UINT64 tmp_2; #endif /*RT_BIG_ENDIAN*/ NdisZeroMemory((UCHAR *)&vht_cap_ie, sizeof(VHT_CAP_IE)); vht_cap_ie.vht_cap.max_mpdu_len = 0; // TODO: Ask Jerry about hardware limitation. vht_cap_ie.vht_cap.ch_width = 0; /* not support 160 or 80 + 80 MHz */ if (pAd->CommonCfg.vht_ldpc && (pAd->chipCap.phy_caps & fPHY_CAP_LDPC)) vht_cap_ie.vht_cap.rx_ldpc = 1; else vht_cap_ie.vht_cap.rx_ldpc = 0; vht_cap_ie.vht_cap.sgi_80M = pAd->CommonCfg.vht_sgi_80; vht_cap_ie.vht_cap.htc_vht_cap = 1; vht_cap_ie.vht_cap.max_ampdu_exp = 3; // TODO: Ask Jerry about the hardware limitation, currently set as 64K vht_cap_ie.vht_cap.tx_stbc = 0; vht_cap_ie.vht_cap.rx_stbc = 0; if (pAd->CommonCfg.vht_stbc) { if (pAd->CommonCfg.TxStream >= 2) vht_cap_ie.vht_cap.tx_stbc = 1; else vht_cap_ie.vht_cap.tx_stbc = 0; if (pAd->CommonCfg.RxStream >= 1) vht_cap_ie.vht_cap.rx_stbc = 1; // TODO: is it depends on the number of our antennas? else vht_cap_ie.vht_cap.rx_stbc = 0; } vht_cap_ie.vht_cap.tx_ant_consistency = 1; vht_cap_ie.vht_cap.rx_ant_consistency = 1; vht_cap_ie.mcs_set.rx_mcs_map.mcs_ss1 = VHT_MCS_CAP_NA; vht_cap_ie.mcs_set.rx_mcs_map.mcs_ss2 = VHT_MCS_CAP_NA; vht_cap_ie.mcs_set.rx_mcs_map.mcs_ss3 = VHT_MCS_CAP_NA; vht_cap_ie.mcs_set.rx_mcs_map.mcs_ss4 = VHT_MCS_CAP_NA; vht_cap_ie.mcs_set.rx_mcs_map.mcs_ss5 = VHT_MCS_CAP_NA; vht_cap_ie.mcs_set.rx_mcs_map.mcs_ss6 = VHT_MCS_CAP_NA; vht_cap_ie.mcs_set.rx_mcs_map.mcs_ss7 = VHT_MCS_CAP_NA; vht_cap_ie.mcs_set.rx_mcs_map.mcs_ss8 = VHT_MCS_CAP_NA; vht_cap_ie.mcs_set.tx_mcs_map.mcs_ss1 = VHT_MCS_CAP_NA; vht_cap_ie.mcs_set.tx_mcs_map.mcs_ss2 = VHT_MCS_CAP_NA; vht_cap_ie.mcs_set.tx_mcs_map.mcs_ss3 = VHT_MCS_CAP_NA; vht_cap_ie.mcs_set.tx_mcs_map.mcs_ss4 = VHT_MCS_CAP_NA; vht_cap_ie.mcs_set.tx_mcs_map.mcs_ss5 = VHT_MCS_CAP_NA; vht_cap_ie.mcs_set.tx_mcs_map.mcs_ss6 = VHT_MCS_CAP_NA; vht_cap_ie.mcs_set.tx_mcs_map.mcs_ss7 = VHT_MCS_CAP_NA; vht_cap_ie.mcs_set.tx_mcs_map.mcs_ss8 = VHT_MCS_CAP_NA; mcs_cap = pAd->chipCap.max_vht_mcs; rx_nss = pAd->CommonCfg.RxStream; tx_nss = pAd->CommonCfg.TxStream; #ifdef WFA_VHT_PF if ((pAd->CommonCfg.vht_nss_cap > 0) && (pAd->CommonCfg.vht_nss_cap < pAd->CommonCfg.RxStream)) rx_nss = pAd->CommonCfg.vht_nss_cap; if ((pAd->CommonCfg.vht_nss_cap > 0) && (pAd->CommonCfg.vht_nss_cap < pAd->CommonCfg.TxStream)) tx_nss = pAd->CommonCfg.vht_nss_cap; if (pAd->CommonCfg.vht_mcs_cap <pAd->chipCap.max_vht_mcs) mcs_cap = pAd->CommonCfg.vht_mcs_cap; #endif /* WFA_VHT_PF */ switch (rx_nss) { case 1: vht_cap_ie.mcs_set.rx_high_rate = 292; vht_cap_ie.mcs_set.rx_mcs_map.mcs_ss1 = mcs_cap; break; case 2: if (mcs_cap == VHT_MCS_CAP_9) vht_cap_ie.mcs_set.rx_high_rate = 780; else vht_cap_ie.mcs_set.rx_high_rate = 585; vht_cap_ie.mcs_set.rx_mcs_map.mcs_ss1 = mcs_cap; vht_cap_ie.mcs_set.rx_mcs_map.mcs_ss2 = mcs_cap; break; default: vht_cap_ie.mcs_set.rx_high_rate = 0; break; } switch (tx_nss) { case 1: vht_cap_ie.mcs_set.tx_high_rate = 292; vht_cap_ie.mcs_set.tx_mcs_map.mcs_ss1 = mcs_cap; break; case 2: if (mcs_cap == VHT_MCS_CAP_9) vht_cap_ie.mcs_set.tx_high_rate = 780; else vht_cap_ie.mcs_set.tx_high_rate = 585; vht_cap_ie.mcs_set.tx_mcs_map.mcs_ss1 = mcs_cap; vht_cap_ie.mcs_set.tx_mcs_map.mcs_ss2 = mcs_cap; break; default: vht_cap_ie.mcs_set.tx_high_rate = 0; break; } #ifdef RT_BIG_ENDIAN NdisCopyMemory(&tmp_1,&vht_cap_ie.vht_cap, 4); tmp_1 = SWAP32(tmp_1); NdisCopyMemory(&vht_cap_ie.vht_cap,&tmp_1, 4); NdisCopyMemory(&tmp_2,&vht_cap_ie.mcs_set, 8); tmp_2 = SWAP64(tmp_2); NdisCopyMemory(&vht_cap_ie.mcs_set,&tmp_2, 8); //hex_dump("&vht_cap_ie", &vht_cap_ie, sizeof(VHT_CAP_IE)); //SWAP32((UINT32)vht_cap_ie.vht_cap); //SWAP32((UINT32)vht_cap_ie.mcs_set); #endif /* RT_BIG_ENDIAN */ #ifdef VHT_TXBF_SUPPORT if ((pAd->chipCap.FlgHwTxBfCap) && (pAd->BeaconSndDimensionFlag == 0)) { vht_cap_ie.vht_cap.num_snd_dimension = pAd->CommonCfg.vht_cap_ie.vht_cap.num_snd_dimension; vht_cap_ie.vht_cap.cmp_st_num_bfer= pAd->CommonCfg.vht_cap_ie.vht_cap.cmp_st_num_bfer; vht_cap_ie.vht_cap.bfee_cap_su=pAd->CommonCfg.vht_cap_ie.vht_cap.bfee_cap_su; vht_cap_ie.vht_cap.bfer_cap_su=pAd->CommonCfg.vht_cap_ie.vht_cap.bfer_cap_su; } pAd->BeaconSndDimensionFlag =0; #endif NdisMoveMemory(buf, (UCHAR *)&vht_cap_ie, sizeof(VHT_CAP_IE)); return sizeof(VHT_CAP_IE); }
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; }
VOID AsicGetTxPowerOffset(RTMP_ADAPTER *pAd, ULONG *TxPwr) { CONFIGURATION_OF_TX_POWER_CONTROL_OVER_MAC CfgOfTxPwrCtrlOverMAC; DBGPRINT(RT_DEBUG_INFO, ("-->AsicGetTxPowerOffset\n")); NdisZeroMemory(&CfgOfTxPwrCtrlOverMAC, sizeof(CfgOfTxPwrCtrlOverMAC)); CfgOfTxPwrCtrlOverMAC.NumOfEntries = 5; /* MAC 0x1314, 0x1318, 0x131C, 0x1320 and 1324 */ #ifdef DOT11_VHT_AC if (pAd->CommonCfg.BBPCurrentBW == BW_80 && pAd->CommonCfg.Channel > 14) { CfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[0].MACRegisterOffset = TX_PWR_CFG_0; CfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[0].RegisterValue = pAd->Tx80MPwrCfgABand[0]; CfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[1].MACRegisterOffset = TX_PWR_CFG_1; CfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[1].RegisterValue = pAd->Tx80MPwrCfgABand[1]; CfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[2].MACRegisterOffset = TX_PWR_CFG_2; CfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[2].RegisterValue = pAd->Tx80MPwrCfgABand[2]; CfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[3].MACRegisterOffset = TX_PWR_CFG_3; CfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[3].RegisterValue = pAd->Tx80MPwrCfgABand[3]; CfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[4].MACRegisterOffset = TX_PWR_CFG_4; CfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[4].RegisterValue = pAd->Tx80MPwrCfgABand[4]; } else #endif /* DOT11_VHT_AC */ if (pAd->CommonCfg.BBPCurrentBW == BW_40) { if (pAd->CommonCfg.CentralChannel > 14) { CfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[0].MACRegisterOffset = TX_PWR_CFG_0; CfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[0].RegisterValue = pAd->Tx40MPwrCfgABand[0]; CfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[1].MACRegisterOffset = TX_PWR_CFG_1; CfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[1].RegisterValue = pAd->Tx40MPwrCfgABand[1]; CfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[2].MACRegisterOffset = TX_PWR_CFG_2; CfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[2].RegisterValue = pAd->Tx40MPwrCfgABand[2]; CfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[3].MACRegisterOffset = TX_PWR_CFG_3; CfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[3].RegisterValue = pAd->Tx40MPwrCfgABand[3]; CfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[4].MACRegisterOffset = TX_PWR_CFG_4; CfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[4].RegisterValue = pAd->Tx40MPwrCfgABand[4]; } else { CfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[0].MACRegisterOffset = TX_PWR_CFG_0; CfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[0].RegisterValue = pAd->Tx40MPwrCfgGBand[0]; CfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[1].MACRegisterOffset = TX_PWR_CFG_1; CfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[1].RegisterValue = pAd->Tx40MPwrCfgGBand[1]; CfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[2].MACRegisterOffset = TX_PWR_CFG_2; CfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[2].RegisterValue = pAd->Tx40MPwrCfgGBand[2]; CfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[3].MACRegisterOffset = TX_PWR_CFG_3; CfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[3].RegisterValue = pAd->Tx40MPwrCfgGBand[3]; CfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[4].MACRegisterOffset = TX_PWR_CFG_4; CfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[4].RegisterValue = pAd->Tx40MPwrCfgGBand[4]; } } else { if (pAd->CommonCfg.CentralChannel > 14) { CfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[0].MACRegisterOffset = TX_PWR_CFG_0; CfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[0].RegisterValue = pAd->Tx20MPwrCfgABand[0]; CfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[1].MACRegisterOffset = TX_PWR_CFG_1; CfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[1].RegisterValue = pAd->Tx20MPwrCfgABand[1]; CfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[2].MACRegisterOffset = TX_PWR_CFG_2; CfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[2].RegisterValue = pAd->Tx20MPwrCfgABand[2]; CfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[3].MACRegisterOffset = TX_PWR_CFG_3; CfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[3].RegisterValue = pAd->Tx20MPwrCfgABand[3]; CfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[4].MACRegisterOffset = TX_PWR_CFG_4; CfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[4].RegisterValue = pAd->Tx20MPwrCfgABand[4]; } else { CfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[0].MACRegisterOffset = TX_PWR_CFG_0; CfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[0].RegisterValue = pAd->Tx20MPwrCfgGBand[0]; CfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[1].MACRegisterOffset = TX_PWR_CFG_1; CfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[1].RegisterValue = pAd->Tx20MPwrCfgGBand[1]; CfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[2].MACRegisterOffset = TX_PWR_CFG_2; CfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[2].RegisterValue = pAd->Tx20MPwrCfgGBand[2]; CfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[3].MACRegisterOffset = TX_PWR_CFG_3; CfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[3].RegisterValue = pAd->Tx20MPwrCfgGBand[3]; CfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[4].MACRegisterOffset = TX_PWR_CFG_4; CfgOfTxPwrCtrlOverMAC.TxPwrCtrlOverMAC[4].RegisterValue = pAd->Tx20MPwrCfgGBand[4]; } } NdisCopyMemory(TxPwr, (UCHAR *)&CfgOfTxPwrCtrlOverMAC, sizeof(CfgOfTxPwrCtrlOverMAC)); DBGPRINT(RT_DEBUG_INFO, ("<--AsicGetTxPowerOffset\n")); }
VOID CFG80211_UpdateBeacon( VOID *pAdOrg, UCHAR *beacon_head_buf, UINT32 beacon_head_len, UCHAR *beacon_tail_buf, UINT32 beacon_tail_len, BOOLEAN isAllUpdate) { PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdOrg; PCFG80211_CTRL pCfg80211_ctrl = &pAd->cfg80211_ctrl; HTTRANSMIT_SETTING BeaconTransmit; /* MGMT frame PHY rate setting when operatin at Ht rate. */ PUCHAR pBeaconFrame; UCHAR *tmac_info, New_Tim_Len = 0; UINT32 beacon_len = 0; BSS_STRUCT *pMbss; struct wifi_dev *wdev; COMMON_CONFIG *pComCfg; #ifdef RT_CFG80211_P2P_SUPPORT UINT apidx = CFG_GO_BSSID_IDX; #else UINT apidx = MAIN_MBSSID; #endif /*RT_CFG80211_P2P_SUPPORT*/ #ifdef RT_CFG80211_P2P_MULTI_CHAN_SUPPORT ULONG Value; ULONG TimeTillTbtt; ULONG temp; INT bufferoffset =0; USHORT bufferoffset2 =0; CHAR temp_buf[512]={0}; CHAR P2POUIBYTE[4] = {0x50, 0x6f, 0x9a, 0x9}; INT temp_len; INT P2P_IE=4; USHORT p2p_ie_len; UCHAR Count; ULONG StartTime; #endif /* RT_CFG80211_P2P_MULTI_CHAN_SUPPORT */ UCHAR tx_hw_hdr_len = pAd->chipCap.tx_hw_hdr_len; UINT8 TXWISize = pAd->chipCap.TXWISize; pComCfg = &pAd->CommonCfg; pMbss = &pAd->ApCfg.MBSSID[apidx]; wdev = &pMbss->wdev; if (!pMbss || !pMbss->bcn_buf.BeaconPkt) { DBGPRINT(RT_DEBUG_ERROR, ("CFG80211 Beacon: BCN BUF NULL return!!\n")); return; } tmac_info = (UCHAR *)GET_OS_PKT_DATAPTR(pMbss->bcn_buf.BeaconPkt); #ifdef MT_MAC if (pAd->chipCap.hif_type == HIF_MT) { pBeaconFrame = (UCHAR *)(tmac_info + tx_hw_hdr_len); } else #endif /* MT_MAC */ { pBeaconFrame = (UCHAR *)(tmac_info + TXWISize); } if (isAllUpdate) /* Invoke From CFG80211 OPS For setting Beacon buffer */ { /* 1. Update the Buf before TIM IE */ NdisCopyMemory(pBeaconFrame, beacon_head_buf, beacon_head_len); /* 2. Update the Location of TIM IE */ pAd->ApCfg.MBSSID[apidx].TimIELocationInBeacon = beacon_head_len; /* 3. Store the Tail Part For appending later */ if (pCfg80211_ctrl->beacon_tail_buf != NULL) os_free_mem(NULL, pCfg80211_ctrl->beacon_tail_buf); os_alloc_mem(NULL, (UCHAR **)&pCfg80211_ctrl->beacon_tail_buf, beacon_tail_len); if (pCfg80211_ctrl->beacon_tail_buf != NULL) { NdisCopyMemory(pCfg80211_ctrl->beacon_tail_buf, beacon_tail_buf, beacon_tail_len); pCfg80211_ctrl->beacon_tail_len = beacon_tail_len; } else { pCfg80211_ctrl->beacon_tail_len = 0; DBGPRINT(RT_DEBUG_ERROR, ("CFG80211 Beacon: MEM ALLOC ERROR\n")); } DBGPRINT(RT_DEBUG_ERROR, ("%s: %d isAllUpdate return!\n",__FUNCTION__, __LINE__)); return; } else /* Invoke From Beacon Timer */ { if (pAd->ApCfg.DtimCount == 0) pAd->ApCfg.DtimCount = pAd->ApCfg.DtimPeriod - 1; else pAd->ApCfg.DtimCount -= 1; #ifdef RT_CFG80211_P2P_MULTI_CHAN_SUPPORT /* 3 mode: 1. infra scan 7 channel ( Duration(30+3) *7 interval (+120) * count 1 ), 2. p2p find 3 channel (Duration (65 ) *3 interval (+130)) * count 2 > 120 sec 3. mcc tw channel switch (Duration ) (Infra time ) interval (+ GO time ) count 3 mcc enabel always; */ if (pAd->cfg80211_ctrl.GONoASchedule.Count > 0) { if (pAd->cfg80211_ctrl.GONoASchedule.Count != 200 ) pAd->cfg80211_ctrl.GONoASchedule.Count --; NdisMoveMemory(temp_buf, pCfg80211_ctrl->beacon_tail_buf, pCfg80211_ctrl->beacon_tail_len); bufferoffset = rtstrstr2(temp_buf, P2POUIBYTE,pCfg80211_ctrl->beacon_tail_len,P2P_IE); while (bufferoffset2 <= (pCfg80211_ctrl->beacon_tail_len -bufferoffset -4 -bufferoffset2 -3)) { if ( (pCfg80211_ctrl->beacon_tail_buf)[bufferoffset+4+bufferoffset2] == 12) { break; } else { bufferoffset2 = pCfg80211_ctrl->beacon_tail_buf[bufferoffset + 4 +1+bufferoffset2]+bufferoffset2; bufferoffset2 = bufferoffset2+3; } } NdisCopyMemory(&pCfg80211_ctrl->beacon_tail_buf[bufferoffset+4+bufferoffset2+5] , &pAd->cfg80211_ctrl.GONoASchedule.Count, 1); NdisCopyMemory(&pCfg80211_ctrl->beacon_tail_buf[bufferoffset+4+bufferoffset2+6], &pAd->cfg80211_ctrl.GONoASchedule.Duration, 4); NdisCopyMemory(&pCfg80211_ctrl->beacon_tail_buf[bufferoffset+4+bufferoffset2+10], &pAd->cfg80211_ctrl.GONoASchedule.Interval, 4); NdisCopyMemory(&pCfg80211_ctrl->beacon_tail_buf[bufferoffset+4+bufferoffset2+14], &pAd->cfg80211_ctrl.GONoASchedule.StartTime, 4); } #endif /* RT_CFG80211_P2P_MULTI_CHAN_SUPPORT */ } #ifdef MT_MAC if (pAd->chipCap.hif_type == HIF_MT) { //printk("bcnBuf State =====> %d \n", pMbss->bcn_buf.bcn_state); BOOLEAN is_pretbtt_int = FALSE; #ifdef RTMP_PCI_SUPPORT USHORT FreeNum = GET_BCNRING_FREENO(pAd); if (FreeNum < 0) { DBGPRINT(RT_DEBUG_ERROR, ("%s()=>BSS0:BcnRing FreeNum is not enough!\n", __FUNCTION__)); return; } #endif /* RTMP_PCI_SUPPORT */ if (pMbss->bcn_buf.bcn_state != BCN_TX_IDLE) { DBGPRINT(RT_DEBUG_ERROR, ("%s()=>BSS0:BcnPkt not idle(%d)!\n", __FUNCTION__, pMbss->bcn_buf.bcn_state)); APCheckBcnQHandler(pAd, apidx, &is_pretbtt_int); if (is_pretbtt_int == FALSE) { DBGPRINT(RT_DEBUG_ERROR, ("==============> pretbtt_int not init \n")); return; } } } #endif /* MT_MAC */ /* 4. Update the TIM IE */ New_Tim_Len = CFG80211DRV_UpdateTimIE(pAd, apidx, pBeaconFrame, pAd->ApCfg.MBSSID[apidx].TimIELocationInBeacon); /* 5. Update the Buffer AFTER TIM IE */ if (pCfg80211_ctrl->beacon_tail_buf != NULL) { NdisCopyMemory(pBeaconFrame + pAd->ApCfg.MBSSID[apidx].TimIELocationInBeacon + New_Tim_Len, pCfg80211_ctrl->beacon_tail_buf, pCfg80211_ctrl->beacon_tail_len); beacon_len = pAd->ApCfg.MBSSID[apidx].TimIELocationInBeacon + pCfg80211_ctrl->beacon_tail_len + New_Tim_Len; } else { DBGPRINT(RT_DEBUG_ERROR, ("BEACON ====> CFG80211_UpdateBeacon OOPS\n")); return; } BeaconTransmit.word = 0; /* Should be Find the P2P IE Then Set Basic Rate to 6M */ #ifdef RT_CFG80211_P2P_SUPPORT if (RTMP_CFG80211_VIF_P2P_GO_ON(pAd)) BeaconTransmit.field.MODE = MODE_OFDM; /* Use 6Mbps */ else #endif /*RT_CFG80211_P2P_SUPPORT*/ BeaconTransmit.field.MODE = MODE_CCK; BeaconTransmit.field.MCS = MCS_RATE_6; write_tmac_info_beacon(pAd, apidx, tmac_info, &BeaconTransmit, beacon_len); /* CFG_TODO */ RT28xx_UpdateBeaconToAsic(pAd, apidx, beacon_len, pAd->ApCfg.MBSSID[apidx].TimIELocationInBeacon); }