MAC_TABLE_ENTRY *FindWdsEntry( IN PRTMP_ADAPTER pAd, IN UCHAR Wcid, IN PUCHAR pAddr, IN UINT32 PhyMode) { MAC_TABLE_ENTRY *pEntry; // lookup the match wds entry for the incoming packet. pEntry = WdsTableLookupByWcid(pAd, Wcid, pAddr, TRUE); if (pEntry == NULL) pEntry = WdsTableLookup(pAd, pAddr, TRUE); // Only Lazy mode will auto learning, match with FrDs=1 and ToDs=1 if((pEntry == NULL) && (pAd->WdsTab.Mode >= WDS_LAZY_MODE)) { LONG WdsIdx = WdsEntryAlloc(pAd, pAddr); if (WdsIdx >= 0) { // user doesn't specific a phy mode for WDS link. if (pAd->WdsTab.WdsEntry[WdsIdx].PhyMode == 0xff) pAd->WdsTab.WdsEntry[WdsIdx].PhyMode = PhyMode; pEntry = MacTableInsertWDSEntry(pAd, pAddr, (UCHAR)WdsIdx); } else pEntry = NULL; } return pEntry; }
VOID WdsDown(RTMP_ADAPTER *pAd) { int i; for (i=0; i<MAX_WDS_ENTRY; i++) { if(WdsTableLookup(pAd, pAd->WdsTab.WdsEntry[i].PeerWdsAddr, TRUE)) MacTableDeleteWDSEntry(pAd, pAd->WdsTab.WdsEntry[i].MacTabMatchWCID, pAd->WdsTab.WdsEntry[i].PeerWdsAddr); } }
MAC_TABLE_ENTRY *FindWdsEntry( IN RTMP_ADAPTER *pAd, IN UCHAR Wcid, IN UCHAR *pAddr, IN UINT32 PhyMode) { MAC_TABLE_ENTRY *pEntry; RT_802_11_WDS_ENTRY *wds_entry; /* lookup the match wds entry for the incoming packet. */ pEntry = WdsTableLookupByWcid(pAd, Wcid, pAddr, TRUE); if (pEntry == NULL) pEntry = WdsTableLookup(pAd, pAddr, TRUE); /* Only Lazy mode will auto learning, match with FrDs=1 and ToDs=1 */ if((pEntry == NULL) && (pAd->WdsTab.Mode >= WDS_LAZY_MODE)) { INT WdsIdx = WdsEntryAlloc(pAd, pAddr); if (WdsIdx >= 0 && WdsIdx < MAX_WDS_ENTRY) { wds_entry = &pAd->WdsTab.WdsEntry[WdsIdx]; /* user doesn't specific a phy mode for WDS link. */ if (wds_entry->wdev.PhyMode == 0xff) wds_entry->wdev.PhyMode = PhyMode; pEntry = MacTableInsertWDSEntry(pAd, pAddr, (UCHAR)WdsIdx); RTMPSetSupportMCS(pAd, OPMODE_AP, pEntry, pAd->CommonCfg.SupRate, pAd->CommonCfg.SupRateLen, pAd->CommonCfg.ExtRate, pAd->CommonCfg.ExtRateLen, #ifdef DOT11_VHT_AC 0, NULL, #endif /* DOT11_VHT_AC */ &pAd->CommonCfg.HtCapability, sizeof(pAd->CommonCfg.HtCapability)); } else pEntry = NULL; } return pEntry; }
/* ================================================================ Description : because WDS and CLI share the same WCID table in ASIC. WDS entry also insert to pAd->MacTab.content[]. Also fills the pairwise key. Because front MAX_AID_BA entries have direct mapping to BAEntry, which is only used as CLI. So we insert WDS from index MAX_AID_BA. ================================================================ */ MAC_TABLE_ENTRY *MacTableInsertWDSEntry( IN PRTMP_ADAPTER pAd, IN PUCHAR pAddr, UINT WdsTabIdx) { PMAC_TABLE_ENTRY pEntry = NULL; HTTRANSMIT_SETTING HTPhyMode; /* if FULL, return */ if (pAd->MacTab.Size >= MAX_LEN_OF_MAC_TABLE) return NULL; if((pEntry = WdsTableLookup(pAd, pAddr, TRUE)) != NULL) return pEntry; /* allocate one WDS entry */ do { /* allocate one MAC entry */ pEntry = MacTableInsertEntry(pAd, pAddr, (WdsTabIdx + MIN_NET_DEVICE_FOR_WDS), OPMODE_AP, TRUE); if (pEntry) { pEntry->PortSecured = WPA_802_1X_PORT_SECURED; /* specific Max Tx Rate for Wds link. */ NdisZeroMemory(&HTPhyMode, sizeof(HTTRANSMIT_SETTING)); switch (pAd->WdsTab.WdsEntry[WdsTabIdx].PhyMode) { case 0xff: /* user doesn't specific a Mode for WDS link. */ case MODE_OFDM: /* specific OFDM mode. */ HTPhyMode.field.MODE = MODE_OFDM; HTPhyMode.field.MCS = 7; pEntry->RateLen = 8; break; case MODE_CCK: HTPhyMode.field.MODE = MODE_CCK; HTPhyMode.field.MCS = 3; pEntry->RateLen = 4; break; #ifdef DOT11_N_SUPPORT case MODE_HTMIX: HTPhyMode.field.MCS = 7; HTPhyMode.field.ShortGI = pAd->WdsTab.WdsEntry[WdsTabIdx].HTPhyMode.field.ShortGI; HTPhyMode.field.BW = pAd->WdsTab.WdsEntry[WdsTabIdx].HTPhyMode.field.BW; HTPhyMode.field.STBC = pAd->WdsTab.WdsEntry[WdsTabIdx].HTPhyMode.field.STBC; HTPhyMode.field.MODE = MODE_HTMIX; pEntry->RateLen = 12; break; case MODE_HTGREENFIELD: HTPhyMode.field.MCS = 7; HTPhyMode.field.ShortGI = pAd->WdsTab.WdsEntry[WdsTabIdx].HTPhyMode.field.ShortGI; HTPhyMode.field.BW = pAd->WdsTab.WdsEntry[WdsTabIdx].HTPhyMode.field.BW; HTPhyMode.field.STBC = pAd->WdsTab.WdsEntry[WdsTabIdx].HTPhyMode.field.STBC; HTPhyMode.field.MODE = MODE_HTGREENFIELD; pEntry->RateLen = 12; break; #endif /* DOT11_N_SUPPORT */ default: break; } pEntry->MaxHTPhyMode.word = HTPhyMode.word; pEntry->MinHTPhyMode.word = pAd->WdsTab.WdsEntry[WdsTabIdx].MinHTPhyMode.word; pEntry->HTPhyMode.word = pEntry->MaxHTPhyMode.word; #ifdef DOT11_N_SUPPORT if (pAd->WdsTab.WdsEntry[WdsTabIdx].PhyMode >= MODE_HTMIX) { if (pAd->WdsTab.WdsEntry[WdsTabIdx].DesiredTransmitSetting.field.MCS != MCS_AUTO) { DBGPRINT(RT_DEBUG_TRACE, ("IF-wds%d : Desired MCS = %d\n", WdsTabIdx, pAd->WdsTab.WdsEntry[WdsTabIdx].DesiredTransmitSetting.field.MCS)); set_ht_fixed_mcs(pAd, pEntry, pAd->WdsTab.WdsEntry[WdsTabIdx].DesiredTransmitSetting.field.MCS, pAd->WdsTab.WdsEntry[WdsTabIdx].HTPhyMode.field.MCS); } pEntry->MmpsMode = MMPS_ENABLE; NdisMoveMemory(&pEntry->HTCapability, &pAd->CommonCfg.HtCapability, sizeof(HT_CAPABILITY_IE)); if (pAd->CommonCfg.DesiredHtPhy.AmsduEnable && (pAd->CommonCfg.REGBACapability.field.AutoBA == FALSE)) CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_AMSDU_INUSED); if (pEntry->HTCapability.HtCapInfo.ShortGIfor20) CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_SGI20_CAPABLE); if (pEntry->HTCapability.HtCapInfo.ShortGIfor40) CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_SGI40_CAPABLE); if (pEntry->HTCapability.HtCapInfo.TxSTBC) CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_TxSTBC_CAPABLE); if (pEntry->HTCapability.HtCapInfo.RxSTBC) CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_RxSTBC_CAPABLE); if (pEntry->HTCapability.ExtHtCapInfo.PlusHTC) CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_HTC_CAPABLE); if (pAd->CommonCfg.bRdg && pEntry->HTCapability.ExtHtCapInfo.RDGSupport) CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_RDG_CAPABLE); if (pEntry->HTCapability.ExtHtCapInfo.MCSFeedback == 0x03) CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_MCSFEEDBACK_CAPABLE); CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_WMM_CAPABLE); } #endif /* DOT11_N_SUPPORT */ else { NdisZeroMemory(&pEntry->HTCapability, sizeof(HT_CAPABILITY_IE)); } /*if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_TX_RATE_SWITCH_ENABLED)) */ if (pAd->WdsTab.WdsEntry[WdsTabIdx].bAutoTxRateSwitch == FALSE) { pEntry->HTPhyMode.field.MCS = pAd->WdsTab.WdsEntry[WdsTabIdx].DesiredTransmitSetting.field.MCS; pEntry->bAutoTxRateSwitch = FALSE; /* If the legacy mode is set, overwrite the transmit setting of this entry. */ RTMPUpdateLegacyTxSetting((UCHAR)pAd->WdsTab.WdsEntry[WdsTabIdx].DesiredTransmitSetting.field.FixedTxMode, pEntry); } else { pEntry->bAutoTxRateSwitch = TRUE; } pAd->WdsTab.WdsEntry[WdsTabIdx].MacTabMatchWCID = (UCHAR)pEntry->Aid; pEntry->MatchWDSTabIdx = WdsTabIdx; AsicUpdateWdsEncryption(pAd, pEntry->Aid); DBGPRINT(RT_DEBUG_TRACE, ("MacTableInsertWDSEntry - allocate entry #%d, Total= %d\n",WdsTabIdx, pAd->MacTab.Size)); break; } }while(FALSE); return pEntry; }
/* ================================================================ Description : because WDS and CLI share the same WCID table in ASIC. WDS entry also insert to pAd->MacTab.content[]. Also fills the pairwise key. Because front MAX_AID_BA entries have direct mapping to BAEntry, which is only used as CLI. So we insert WDS from index MAX_AID_BA. ================================================================ */ MAC_TABLE_ENTRY *MacTableInsertWDSEntry( IN RTMP_ADAPTER *pAd, IN UCHAR *pAddr, UINT WdsTabIdx) { MAC_TABLE_ENTRY *pEntry = NULL; STA_TR_ENTRY *tr_entry; HTTRANSMIT_SETTING HTPhyMode; RT_802_11_WDS_ENTRY *wds_entry; struct wifi_dev *wdev; /* if FULL, return */ if (pAd->MacTab.Size >= MAX_LEN_OF_MAC_TABLE) return NULL; if((pEntry = WdsTableLookup(pAd, pAddr, TRUE)) != NULL) return pEntry; wds_entry = &pAd->WdsTab.WdsEntry[WdsTabIdx]; wdev = &wds_entry->wdev; /* allocate one WDS entry */ do { /* allocate one MAC entry */ pEntry = MacTableInsertEntry(pAd, pAddr, wdev, ENTRY_WDS, OPMODE_AP, TRUE); if (pEntry) { tr_entry = &pAd->MacTab.tr_entry[pEntry->wcid]; tr_entry->PortSecured = WPA_802_1X_PORT_SECURED; /* specific Max Tx Rate for Wds link. */ NdisZeroMemory(&HTPhyMode, sizeof(HTTRANSMIT_SETTING)); switch (wdev->PhyMode) { case 0xff: /* user doesn't specific a Mode for WDS link. */ case MODE_OFDM: /* specific OFDM mode. */ HTPhyMode.field.MODE = MODE_OFDM; HTPhyMode.field.MCS = 7; pEntry->RateLen = 8; break; case MODE_CCK: HTPhyMode.field.MODE = MODE_CCK; HTPhyMode.field.MCS = 3; pEntry->RateLen = 4; break; #ifdef DOT11_N_SUPPORT case MODE_HTMIX: HTPhyMode.field.MCS = 7; HTPhyMode.field.ShortGI = wdev->HTPhyMode.field.ShortGI; HTPhyMode.field.BW = wdev->HTPhyMode.field.BW; HTPhyMode.field.STBC = wdev->HTPhyMode.field.STBC; HTPhyMode.field.MODE = MODE_HTMIX; pEntry->RateLen = 12; break; case MODE_HTGREENFIELD: HTPhyMode.field.MCS = 7; HTPhyMode.field.ShortGI = wdev->HTPhyMode.field.ShortGI; HTPhyMode.field.BW = wdev->HTPhyMode.field.BW; HTPhyMode.field.STBC = wdev->HTPhyMode.field.STBC; HTPhyMode.field.MODE = MODE_HTGREENFIELD; pEntry->RateLen = 12; break; #endif /* DOT11_N_SUPPORT */ default: break; } pEntry->MaxHTPhyMode.word = HTPhyMode.word; pEntry->MinHTPhyMode.word = wdev->MinHTPhyMode.word; pEntry->HTPhyMode.word = pEntry->MaxHTPhyMode.word; #ifdef DOT11_N_SUPPORT if (wdev->PhyMode >= MODE_HTMIX) { if (wdev->DesiredTransmitSetting.field.MCS != MCS_AUTO) { DBGPRINT(RT_DEBUG_TRACE, ("IF-wds%d : Desired MCS = %d\n", WdsTabIdx, wdev->DesiredTransmitSetting.field.MCS)); set_ht_fixed_mcs(pAd, pEntry, wdev->DesiredTransmitSetting.field.MCS, wdev->HTPhyMode.field.MCS); } pEntry->MmpsMode = MMPS_DISABLE; NdisMoveMemory(&pEntry->HTCapability, &pAd->CommonCfg.HtCapability, sizeof(HT_CAPABILITY_IE)); if (pAd->CommonCfg.DesiredHtPhy.AmsduEnable && (pAd->CommonCfg.REGBACapability.field.AutoBA == FALSE)) CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_AMSDU_INUSED); set_sta_ht_cap(pAd, pEntry, &pEntry->HTCapability); CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_WMM_CAPABLE); } #endif /* DOT11_N_SUPPORT */ else { NdisZeroMemory(&pEntry->HTCapability, sizeof(HT_CAPABILITY_IE)); } // for now, we set this by default! CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_RALINK_CHIPSET); if (wdev->bAutoTxRateSwitch == FALSE) { pEntry->HTPhyMode.field.MCS = wdev->DesiredTransmitSetting.field.MCS; pEntry->bAutoTxRateSwitch = FALSE; /* If the legacy mode is set, overwrite the transmit setting of this entry. */ RTMPUpdateLegacyTxSetting((UCHAR)wdev->DesiredTransmitSetting.field.FixedTxMode, pEntry); } else { // TODO: shiang-MT7603, fix me for this, because we may need to set this only when we have WTBL entry for tx_rate! pEntry->bAutoTxRateSwitch = TRUE; } wds_entry->MacTabMatchWCID = (UCHAR)pEntry->wcid; pEntry->func_tb_idx = WdsTabIdx; pEntry->wdev = wdev; COPY_MAC_ADDR(&wdev->bssid[0], &pEntry->Addr[0]); AsicUpdateWdsEncryption(pAd, pEntry->wcid); DBGPRINT(RT_DEBUG_OFF, ("%s() - allocate entry #%d(link to WCID %d), Total= %d\n", __FUNCTION__, WdsTabIdx, wds_entry->MacTabMatchWCID, pAd->WdsTab.Size)); break; } }while(FALSE); return pEntry; }