mt-wifi: bump to 5.0.4.0

This commit is contained in:
AmadeusGhost 2020-06-25 19:00:23 +08:00 committed by CN_SZTL
parent 41150dfc35
commit cdc7152d2d
No known key found for this signature in database
GPG Key ID: 6850B6345C862176
325 changed files with 100858 additions and 52221 deletions

View File

@ -6,8 +6,8 @@ PKG_MAINTAINER:=Hua Shao <nossiac@163.com>
LUCI_TITLE:=LuCI support for mt wifi driver
LUCI_DEPENDS:=@TARGET_ramips +kmod-mt_wifi
LUCI_PKGARCH:=all
PKG_VERSION:=2
PKG_RELEASE:=1
PKG_VERSION:=1
PKG_RELEASE:=8
define Package/luci-app-mtwifi/conffiles
/etc/wireless/mt7615/

View File

@ -8,7 +8,9 @@ include $(INCLUDE_DIR)/kernel.mk
PKG_NAME:=mt_wifi
P4REV:=8
PKG_VERSION:=5.0.2.0
PKG_VERSION:=5.0.4.0
PKG_MAINTAINER:=MeIsReallyBa <https://github.com/MeIsReallyBa/mt7615-dbdc-linux5.4>
PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/$(PKG_NAME)
PKG_KCONFIG:= \
@ -180,7 +182,7 @@ TAR_CMD=$(HOST_TAR) -C $(1)/ $(TAR_OPTIONS)
define KernelPackage/mt_wifi
CATEGORY:=Kernel modules
TITLE:=MTK wifi AP driver
DEPENDS:=@LINUX_4_14 +TARGET_ramips_mt7621_DEVICE_phicomm_k2p:wifi-l1profile
DEPENDS:=@TARGET_ramips
ifneq ($(CONFIG_MTK_WHNAT_SUPPORT), )
FILES:=$(PKG_BUILD_DIR)/mt_wifi_ap/mt_wifi.ko \
$(PKG_BUILD_DIR)/mt_wifi/embedded/tools/plug_in/whnat/mt_whnat.ko
@ -201,7 +203,7 @@ define Build/Compile
$(MAKE) -C "$(LINUX_DIR)" V=1 \
CROSS_COMPILE="$(TARGET_CROSS)" \
ARCH="$(LINUX_KARCH)" \
SUBDIRS="$(PKG_BUILD_DIR)/mt_wifi_ap" \
M="$(PKG_BUILD_DIR)/mt_wifi_ap" \
$(foreach c, $(PKG_KCONFIG),$(if $(CONFIG_MTK_$c),CONFIG_$(c)=$(CONFIG_MTK_$(c)))) \
modules
endef
@ -212,6 +214,7 @@ define KernelPackage/mt_wifi/install
$(INSTALL_DIR) $(1)/etc/wireless/mt7615/
$(INSTALL_DIR) $(1)/etc_ro/Wireless/RT2860AP/
ifneq ($(CONFIG_MTK_DBDC_MODE), )
$(INSTALL_BIN) ./files/l1profile.dat.dbdc $(1)/etc/wireless/l1profile.dat
$(INSTALL_BIN) ./files/mt7615.1.2G.dat $(1)/etc/wireless/mt7615/
$(INSTALL_BIN) ./files/mt7615.1.5G.dat $(1)/etc/wireless/mt7615/
else

View File

@ -47,8 +47,6 @@ endchoice
choice
prompt "Choose Second WiFi Interface"
config MTK_SECOND_IF_NONE
bool "None"
config MTK_SECOND_IF_MT7615E
bool "MT7615E"
@ -56,6 +54,9 @@ choice
select MTK_CHIP_MT7615E
select MTK_MULTI_INF_SUPPORT
config MTK_SECOND_IF_NONE
bool "None"
endchoice
choice

View File

@ -0,0 +1,12 @@
Default
INDEX0=MT7615
INDEX0_profile_path=/etc/wireless/mt7615/mt7615.1.2G.dat;/etc/wireless/mt7615/mt7615.1.5G.dat
INDEX0_EEPROM_offset=0x0
INDEX0_EEPROM_size=0x4000
INDEX0_EEPROM_name=e2p
INDEX0_main_ifname=rax0;ra0
INDEX0_ext_ifname=rax;ra
INDEX0_wds_ifname=wdsx;wds
INDEX0_apcli_ifname=apclix;apcli
INDEX0_single_sku_path=/etc_ro/Wireless/SingleSKU_mt7615e-sku.dat
INDEX0_bf_sku_path=/etc_ro/Wireless/SingleSKU_mt7615e-sku-bf.dat

View File

@ -117,7 +117,7 @@ FtSupport=0
GreenAP=1
G_BAND_256QAM=1
HideSSID=0
HT_AMSDU=0
HT_AMSDU=1
HT_AutoBA=1
HT_BADecline=0
HT_BAWinSize=64

View File

@ -83,7 +83,7 @@ BW_Priority=
BW_Root=0
CalCacheApply=0
CarrierDetect=0
Channel=36
Channel=44
ChannelGrp=
CountryCode=US
CountryRegion=5
@ -117,7 +117,7 @@ FtSupport=0
GreenAP=1
G_BAND_256QAM=1
HideSSID=0
HT_AMSDU=0
HT_AMSDU=1
HT_AutoBA=1
HT_BADecline=0
HT_BAWinSize=64
@ -271,7 +271,7 @@ session_timeout_interval=0
ShortSlot=1
SKUenable=0
SSID=
SSID1=OpenWrt
SSID1=OpenWrt_5G
SSID10=
SSID11=
SSID12=

View File

@ -108,6 +108,7 @@ EthConvertMode=dongle
EtherTrafficBand=0
Ethifname=
ETxBfEnCond=1
ITxBfEnCond=1
FineAGC=0
FixedTxMode=
ForceRoamSupport=
@ -117,7 +118,7 @@ FtSupport=0
GreenAP=1
G_BAND_256QAM=1
HideSSID=0
HT_AMSDU=0
HT_AMSDU=1
HT_AutoBA=1
HT_BADecline=0
HT_BAWinSize=64

View File

@ -108,6 +108,7 @@ EthConvertMode=dongle
EtherTrafficBand=0
Ethifname=
ETxBfEnCond=1
ITxBfEnCond=1
FineAGC=0
FixedTxMode=
ForceRoamSupport=
@ -117,7 +118,7 @@ FtSupport=0
GreenAP=1
G_BAND_256QAM=1
HideSSID=0
HT_AMSDU=0
HT_AMSDU=1
HT_AutoBA=1
HT_BADecline=0
HT_BAWinSize=64

View File

@ -1,19 +0,0 @@
diff -urN a/mt_wifi/mt_wifi/embedded/common/cmm_info.c b/mt_wifi/mt_wifi/embedded/common/cmm_info.c
--- a/mt_wifi/embedded/common/cmm_info.c 2018-11-01 10:03:25.663408611 +0000
+++ b/mt_wifi/embedded/common/cmm_info.c 2018-11-01 10:09:14.991395503 +0000
@@ -3200,6 +3200,15 @@
else
need_send = FALSE;
}
+#if 1
+ /* [2018.11.01 hepark] To fill 5G information */
+ else if (!strcmp(wrq->ifr_ifrn.ifrn_name, "rai0")) {
+ if (!memcmp(pEntry->wdev->if_dev->name, "rax", 3))
+ need_send = FALSE;
+ else
+ need_send = TRUE;
+ }
+#endif
}
if (IS_ENTRY_CLIENT(pEntry) && (pEntry->Sst == SST_ASSOC) && (need_send == TRUE)) {
pDst = &pMacTab->Entry[pMacTab->Num];

View File

@ -1,167 +0,0 @@
diff -urN a/mt_wifi/embedded/common/ee_flash.c b/mt_wifi/embedded/common/ee_flash.c
--- a/mt_wifi/embedded/common/ee_flash.c 2018-04-30 15:57:54.000000000 +0800
+++ b/mt_wifi/embedded/common/ee_flash.c 2019-01-14 21:28:38.163721571 +0800
@@ -111,8 +111,8 @@
int mt_mtd_write_nm_wifi(char *name, loff_t to, size_t len, const u_char *buf);
int mt_mtd_read_nm_wifi(char *name, loff_t from, size_t len, u_char *buf);
-#define flash_read(_ctrl, _ptr, _offset, _len) mt_mtd_read_nm_wifi("Factory", _offset, (size_t)_len, _ptr)
-#define flash_write(_ctrl, _ptr, _offset, _len) mt_mtd_write_nm_wifi("Factory", _offset, (size_t)_len, _ptr)
+#define flash_read(_ctrl, _ptr, _offset, _len) mt_mtd_read_nm_wifi("factory", _offset&0xFFFF, (size_t)_len, _ptr)
+#define flash_write(_ctrl, _ptr, _offset, _len) mt_mtd_write_nm_wifi("factory", _offset&0xFFFF, (size_t)_len, _ptr)
#else
/*
@@ -122,8 +122,8 @@
extern int ra_mtd_write_nm(char *name, loff_t to, size_t len, const u_char *buf);
extern int ra_mtd_read_nm(char *name, loff_t from, size_t len, u_char *buf);
-#define flash_read(_ctrl, _ptr, _offset, _len) ra_mtd_read_nm("Factory", _offset, (size_t)_len, _ptr)
-#define flash_write(_ctrl, _ptr, _offset, _len) ra_mtd_write_nm("Factory", _offset, (size_t)_len, _ptr)
+#define flash_read(_ctrl, _ptr, _offset, _len) ra_mtd_read_nm("factory", _offset&0xFFFF, (size_t)_len, _ptr)
+#define flash_write(_ctrl, _ptr, _offset, _len) ra_mtd_write_nm("factory", _offset&0xFFFF, (size_t)_len, _ptr)
#endif /*CONFIG_WIFI_MTD*/
#endif /*RA_MTD_RW_BY_NUM*/
diff -urN a/mt_wifi/embedded/common/eeprom.c b/mt_wifi/embedded/common/eeprom.c
--- a/mt_wifi/embedded/common/eeprom.c 2018-04-30 15:57:54.000000000 +0800
+++ b/mt_wifi/embedded/common/eeprom.c 2019-04-19 17:05:48.336239756 +0800
@@ -646,7 +646,7 @@
efuse_probe(pAd);
#endif /* RTMP_EFUSE_SUPPORT */
- /* rtmp_eeprom_of_platform(pAd); //for MT7615, only use E2pAccessMode parameter to get eeprom type */
+ rtmp_eeprom_of_platform(pAd); //for MT7615, only use E2pAccessMode parameter to get eeprom type */
if (forceMode != E2P_NONE && forceMode < NUM_OF_E2P_MODE) {
e2p_type = forceMode;
diff -urN a/mt_wifi/os/linux/mt_wifi_mtd.c b/mt_wifi/os/linux/mt_wifi_mtd.c
--- a/mt_wifi/os/linux/mt_wifi_mtd.c 1970-01-01 08:00:00.000000000 +0800
+++ b/mt_wifi/os/linux/mt_wifi_mtd.c 2019-01-06 17:17:32.771446000 +0800
@@ -0,0 +1,113 @@
+/*
+ ***************************************************************************
+ * MediaTek Inc.
+ *
+ * All rights reserved. source code is an unpublished work and the
+ * use of a copyright notice does not imply otherwise. This source code
+ * contains confidential trade secret material of MediaTek. Any attemp
+ * or participation in deciphering, decoding, reverse engineering or in any
+ * way altering the source code is stricitly prohibited, unless the prior
+ * written consent of MediaTek, Inc. is obtained.
+ ***************************************************************************
+ Module Name:
+ mt_wifi_mtd.c
+
+*/
+
+#include <linux/version.h>
+#include <linux/module.h>
+#include <linux/types.h>
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/err.h>
+#include <linux/slab.h>
+#include <asm/io.h>
+#include <linux/mtd/mtd.h>
+#include <linux/mtd/map.h>
+#include <linux/mtd/concat.h>
+#include <linux/mtd/partitions.h>
+#if defined (CONFIG_MIPS)
+#include <asm/addrspace.h>
+#endif
+
+int mt_mtd_write_nm_wifi(char *name, loff_t to, size_t len, const u_char *buf)
+{
+ int ret = -1;
+ size_t rdlen, wrlen;
+ struct mtd_info *mtd;
+ struct erase_info ei;
+ u_char *bak = NULL;
+
+ mtd = get_mtd_device_nm(name);
+ if (IS_ERR(mtd))
+ return -1;
+
+ if (len > mtd->erasesize) {
+ put_mtd_device(mtd);
+ return -E2BIG;
+ }
+
+ bak = kmalloc(mtd->erasesize, GFP_KERNEL);
+ if (bak == NULL) {
+ put_mtd_device(mtd);
+ return -ENOMEM;
+ }
+
+ ret = mtd_read(mtd, 0, mtd->erasesize, &rdlen, bak);
+
+ if (ret != 0) {
+ put_mtd_device(mtd);
+ kfree(bak);
+ return ret;
+ }
+
+ if (rdlen != mtd->erasesize)
+ printk("warning: ra_mtd_write: rdlen is not equal to erasesize\n");
+
+ memcpy(bak + to, buf, len);
+
+ ei.mtd = mtd;
+ ei.callback = NULL;
+ ei.addr = 0;
+ ei.len = mtd->erasesize;
+ ei.priv = 0;
+
+ ret = mtd_erase(mtd, &ei);
+
+ if (ret != 0) {
+ put_mtd_device(mtd);
+ kfree(bak);
+ return ret;
+ }
+
+ ret = mtd_write(mtd, 0, mtd->erasesize, &wrlen, bak);
+
+
+
+ put_mtd_device(mtd);
+ kfree(bak);
+ return ret;
+}
+EXPORT_SYMBOL(mt_mtd_write_nm_wifi);
+
+
+int mt_mtd_read_nm_wifi(char *name, loff_t from, size_t len, u_char *buf)
+{
+ int ret;
+ size_t rdlen;
+ struct mtd_info *mtd;
+
+ mtd = get_mtd_device_nm(name);
+ if (IS_ERR(mtd))
+ return -1;
+
+ ret = mtd_read(mtd, from, len, &rdlen, buf);
+
+ if (rdlen != len)
+ printk("warning: ra_mtd_read_nm: rdlen is not equal to len\n");
+
+ put_mtd_device(mtd);
+
+ return ret;
+}
+EXPORT_SYMBOL(mt_mtd_read_nm_wifi);
diff -urN a/mt_wifi_ap/Makefile b/mt_wifi_ap/Makefile
--- a/mt_wifi_ap/Makefile 2018-04-30 15:57:57.000000000 +0800
+++ b/mt_wifi_ap/Makefile 2019-04-20 21:16:22.510780934 +0800
@@ -678,7 +678,8 @@
os_objs := $(SRC_DIR)/os/linux/rt_proc.o\
$(SRC_DIR)/os/linux/rt_linux.o\
$(SRC_DIR)/os/linux/rt_profile.o\
- $(SRC_DIR)/os/linux/rt_main_dev.o
+ $(SRC_DIR)/os/linux/rt_main_dev.o\
+ $(SRC_DIR)/os/linux/mt_wifi_mtd.o
ifeq ($(CONFIG_WLAN_HOOK),y)
EXTRA_CFLAGS +=-DRTMP_WLAN_HOOK_SUPPORT

View File

@ -1499,22 +1499,29 @@ INT32 SetATEAutoAlc(RTMP_ADAPTER *pAd, RTMP_STRING *Arg)
INT32 SetATEIpg(RTMP_ADAPTER *pAd, RTMP_STRING *Arg)
{
INT32 ret = 0;
UINT32 value;
struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl);
struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp;
INT32 ret = 0;
UINT32 ipg = 0;
/* Sanity check for input parameter */
if (Arg == NULL) {
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR,
("%s: No parameters!!\n", __func__));
goto err0;
}
MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF,
("%s: IPG = %s\n", __func__, Arg));
value = simple_strtol(Arg, 0, 10);
ATECtrl->ipg_param.ipg = value;
ret = ATEOp->SetIPG(pAd);
ipg = simple_strtol(Arg, 0, 10);
ret = ATEOp->SetIPG(pAd, ipg);
if (!ret)
return TRUE;
else
return FALSE;
err0:
return FALSE;
}
@ -5218,7 +5225,6 @@ INT32 ATEInit(RTMP_ADAPTER *pAd)
ATECtrl->bQAEnabled = FALSE;
ATECtrl->bQATxStart = FALSE;
ATECtrl->bQARxStart = FALSE;
ATECtrl->TxDoneCount = 0;
ATECtrl->duty_cycle = 0;
ATECtrl->tx_time_param.pkt_tx_time_en = FALSE;
ATECtrl->tx_time_param.pkt_tx_time = 0;
@ -5235,6 +5241,7 @@ INT32 ATEInit(RTMP_ADAPTER *pAd)
ATECtrl->wdev_idx = 0;
ATECtrl->wmm_idx = 0; /* Need to modify after j mode implement done */
#ifdef DBDC_MODE
ATECtrl->band_ext[0].Mode = ATE_STOP;
ATECtrl->band_ext[0].wdev_idx = 1;
ATECtrl->band_ext[0].wmm_idx = 1;
#endif /* DBDC_MODE */
@ -5474,8 +5481,10 @@ INT32 SetATE(
#endif
#ifdef PRE_CAL_MT7622_SUPPORT
else if (!strcmp(Arg, "TXDPD7622") && (mode & ATE_START)) {
if (IS_MT7622(pAd)) {
Ret = ATEOp->TxDPDTest7622(pAd, "0");
Ret = 0;
}
}
#endif /*PRE_CAL_MT7622_SUPPORT*/
#ifdef PRE_CAL_TRX_SET1_SUPPORT
@ -5521,6 +5530,23 @@ INT32 SetATE(
Ret = 0;
}
#endif /* PRE_CAL_TRX_SET2_SUPPORT */
#if defined(CAL_BIN_FILE_SUPPORT) && defined(MT7615)
else if ((strcmp(Arg, "PATRIM") > 0) && (mode & ATE_START)) {
if (IS_MT7615(pAd)) {
INT32 i;
UINT32 Data[4] = {0};
RTMP_STRING *value = NULL;
for (i = 0, value = rstrtok(Arg + 7, "-"); value; value = rstrtok(NULL, "-"), i++) {
Data[i] = simple_strtol(value, 0, 16);
MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF,
("\x1b[32m%s: WF%d = 0x%08x \x1b[m\n", __func__, i, Data[i]));
}
Ret = ATEOp->PATrim(pAd, &Data[0]);
Ret = 0;
}
}
#endif /* CAL_BIN_FILE_SUPPORT */
else {
MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF,
("%s: do nothing(param = (%s), mode = (%d))\n",
@ -5565,6 +5591,7 @@ INT32 SetATEChannel(
}
TESTMODE_SET_PARAM(ATECtrl, control_band_idx, Channel, param[0]);
TESTMODE_SET_PARAM(ATECtrl, control_band_idx, Ch_Band, param[1]);
#ifdef DOT11_VHT_AC
TESTMODE_SET_PARAM(ATECtrl, control_band_idx, Channel_2nd, param[3]);
#endif
@ -5618,7 +5645,7 @@ INT32 set_ate_channel_ext(PRTMP_ADAPTER pAd, RTMP_STRING *arg)
} else
return ret;
if ((param.band_idx == 0) || (param.band_idx > TESTMODE_BAND_NUM)) {
if ((param.band_idx == 0) || (param.band_idx >= TESTMODE_BAND_NUM)) {
ret = NDIS_STATUS_INVALID_DATA;
goto err0;
}
@ -5732,7 +5759,7 @@ INT32 set_ate_start_tx_ext(PRTMP_ADAPTER pAd, RTMP_STRING *arg)
INT32 ret = 0;
INT32 len = 0;
UINT32 band_idx = 0;
UINT32 Channel = 0, Ch_Band = 0, SysBw = 0, PktBw = 0;
UINT32 Channel = 0, Ch_Band = 0, SysBw = 0, PktBw = 0, ipg = 0;
INT i = 0;
CHAR *value;
UINT32 data[ATE_START_TX_EXT_PARAM_CNT] = {0};
@ -5790,6 +5817,7 @@ INT32 set_ate_start_tx_ext(PRTMP_ADAPTER pAd, RTMP_STRING *arg)
Ch_Band = TESTMODE_GET_PARAM(ate_ctrl, band_idx, Ch_Band);
PktBw = TESTMODE_GET_PARAM(ate_ctrl, band_idx, PerPktBW);
SysBw = TESTMODE_GET_PARAM(ate_ctrl, band_idx, BW);
ipg = TESTMODE_GET_PARAM(ate_ctrl, band_idx, ipg_param.ipg);
if (param.rate == 32 && PktBw != BAND_WIDTH_40 && SysBw != BAND_WIDTH_40) {
ret = -1;
@ -5804,7 +5832,7 @@ INT32 set_ate_start_tx_ext(PRTMP_ADAPTER pAd, RTMP_STRING *arg)
TxPower.Dbdc_idx = band_idx;
TxPower.Band_idx = Ch_Band;
ret = ate_ops->SetTxPower0(pAd, TxPower);
ret = ate_ops->SetIPG(pAd);
ret = ate_ops->SetIPG(pAd, ipg);
ret = ate_ops->StartTx(pAd);
if (ret == 0)

View File

@ -213,7 +213,7 @@ struct _ATE_OPERATION {
INT32 (*SetDutyCycle)(struct _RTMP_ADAPTER *pAd, UINT32 value);
INT32 (*SetPktTxTime)(struct _RTMP_ADAPTER *pAd, UINT32 value);
INT32 (*SampleRssi)(struct _RTMP_ADAPTER *pAd, struct _RX_BLK *pRxBlk);
INT32 (*SetIPG)(struct _RTMP_ADAPTER *pAd);
INT32 (*SetIPG)(struct _RTMP_ADAPTER *pAd, UINT32 value);
INT32 (*SetSlotTime)(struct _RTMP_ADAPTER *pAd, UINT32 SlotTime, UINT32 SifsTime);
INT32 (*SetAIFS)(struct _RTMP_ADAPTER *pAd, CHAR Value);
INT32 (*SetPowerDropLevel)(struct _RTMP_ADAPTER *pAd, UINT32 PowerDropLevel);
@ -239,8 +239,11 @@ struct _ATE_OPERATION {
INT32 (*TxDPDTest)(struct _RTMP_ADAPTER *pAd, RTMP_STRING *arg);
#endif /* PRE_CAL_TRX_SET1_SUPPORT */
#ifdef PRE_CAL_TRX_SET2_SUPPORT
INT32 (*PreCalTest)(struct _RTMP_ADAPTER *pAd, UINT8 CalId, UINT32 ChGrpId);
INT32 (*PreCalTest)(struct _RTMP_ADAPTER *pAd, UINT8 CalId, UINT32 ChGrpId);
#endif /* PRE_CAL_TRX_SET2_SUPPORT */
#if defined(CAL_BIN_FILE_SUPPORT) && defined(MT7615)
INT32 (*PATrim)(struct _RTMP_ADAPTER *pAd, PUINT32 pData);
#endif /* CAL_BIN_FILE_SUPPORT */
#if defined(TXBF_SUPPORT) && defined(MT_MAC)
INT32 (*SetATETxSoundingProc)(struct _RTMP_ADAPTER *pAd, UCHAR SoundingMode);
INT32 (*StartTxSKB)(struct _RTMP_ADAPTER *pAd);

View File

@ -191,6 +191,11 @@ INT TxPowerManualCtrl(PRTMP_ADAPTER pAd, BOOLEAN fgPwrManCtrl, UINT8 u1TxPwrMode
#if defined(COMPOS_TESTMODE_WIN)
#endif
#if defined(CAL_BIN_FILE_SUPPORT) && defined(MT7615)
INT MtATE_PA_Trim_Proc(RTMP_ADAPTER *pAd, PUINT32 pData);
#endif /* CAL_BIN_FILE_SUPPORT */
#define MT_ATEInit(_pAd) ({ \
UINT32 _ret; \
_ret = MtTestModeInit(_pAd); \

View File

@ -738,12 +738,6 @@ ate_thread_dequeue:
#endif /* COMPOS_TESTMODE_WIN */
if (multi_users > 0) {
UCHAR *pate_pkt = TESTMODE_GET_PARAM(ate_ctrl, band_idx, pate_pkt);
ate_ctrl->wcid_ref = multi_users;
ret = MT_ATEGenPkt(pAd, pate_pkt, band_idx);
}
mode = TESTMODE_GET_PARAM(ate_ctrl, band_idx, Mode);
@ -906,7 +900,8 @@ err1:
RtmpOSTaskNotifyToExit(pTask);
if (pAd)
MtATESetMacTxRx(pAd, ASIC_MAC_TX, TRUE, band_idx);
cb->is_init = FALSE;
if (cb)
cb->is_init = FALSE;
if (ret)
MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR,
@ -914,7 +909,9 @@ err1:
MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_INFO,
("%s: leave\n", __func__));
RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS);
if (pAd)
RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS);
return ret;
}
@ -1150,6 +1147,13 @@ VOID MT_ATEUpdateRxStatistic(RTMP_ADAPTER *pAd, enum _TESTMODE_STAT_TYPE type, V
COUNTER_802_11 *wlanCounter = (COUNTER_802_11 *)data;
rx_stat->RxMacFCSErrCount =
wlanCounter->FCSErrorCount.u.LowPart;
#ifdef DBDC_MODE
if (pAd->CommonCfg.dbdc_mode) {
rx_stat->RxMacFCSErrCount_band1 =
(wlanCounter+1)->FCSErrorCount.u.LowPart;
}
#endif
}
}
@ -1340,6 +1344,10 @@ static INT32 MT_ATESetTxPowerX(RTMP_ADAPTER *pAd, ATE_TXPOWER TxPower)
if (TxPower.Power <= 0)
return Ret;
/* Tx Power value upper bound protection */
if (TxPower.Power > 50)
TxPower.Power = 50;
switch (TxPower.Ant_idx) {
case 0:
ATECtrl->TxPower0 = TxPower.Power;
@ -1765,7 +1773,7 @@ INT32 MT_ATEInsertLog(RTMP_ADAPTER *pAd, UCHAR *log, UINT32 log_type, UINT32 len
}
if (!insert_func)
goto err0;
goto err1;
log_cb = &ATECtrl->log_dump[logcb_idx];
idx = log_cb->idx;
@ -2241,13 +2249,16 @@ INT MT_ATERxDoneHandle(RTMP_ADAPTER *pAd, RX_BLK *pRxBlk)
ATEOp->SampleRssi(pAd, pRxBlk);
/* RX packet counter calculate by chfreq of RXD */
if (rxd_base->RxD1.ChFreq == chfreq0)
if (rxd_base->RxD1.ChFreq == chfreq0) {
ATECtrl->rx_stat.RxTotalCnt[TESTMODE_BAND0]++;
}
#ifdef MT7615
else if (rxd_base->RxD1.ChFreq == chfreq1)
#if defined(MT7615)
#ifdef DBDC_MODE
else if (rxd_base->RxD1.ChFreq == chfreq1) {
ATECtrl->rx_stat.RxTotalCnt[TESTMODE_BAND1]++;
}
#endif
#endif /* MT7615 */
else
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR,
@ -2373,8 +2384,13 @@ static INT32 MT_ATEInitBandInfo(RTMP_ADAPTER *pAd, UINT32 band_idx)
os_free_mem(ATECtrl->band_ext[idx].pate_pkt);
ret = os_alloc_mem(pAd, (PUCHAR *)&ATECtrl->band_ext[idx].pate_pkt, ATE_TESTPKT_LEN);
TESTMODE_SET_PARAM(ATECtrl, band_idx, Channel, 36);
TESTMODE_SET_PARAM(ATECtrl, band_idx, ControlChl, 36);
if (pAd->CommonCfg.eDBDC_mode == ENUM_DBDC_5G5G) {
TESTMODE_SET_PARAM(ATECtrl, band_idx, Channel, 100);
TESTMODE_SET_PARAM(ATECtrl, band_idx, ControlChl, 100);
} else {
TESTMODE_SET_PARAM(ATECtrl, band_idx, Channel, 36);
TESTMODE_SET_PARAM(ATECtrl, band_idx, ControlChl, 36);
}
TESTMODE_SET_PARAM(ATECtrl, band_idx, BW, 0);
TESTMODE_SET_PARAM(ATECtrl, band_idx, TxDoneCount, 0);
TESTMODE_SET_PARAM(ATECtrl, band_idx, TxedCount, 0);
@ -2386,7 +2402,7 @@ static INT32 MT_ATEInitBandInfo(RTMP_ADAPTER *pAd, UINT32 band_idx)
payload[0] = 0xAA;
TESTMODE_SET_PARAM(ATECtrl, band_idx, HLen, LENGTH_802_11);
TESTMODE_SET_PARAM(ATECtrl, band_idx, FixedPayload, 1);
TESTMODE_SET_PARAM(ATECtrl, band_idx, TxCount, 0);
TESTMODE_SET_PARAM(ATECtrl, band_idx, TxCount, 0xFFFFFFFF);
ATECtrl->band_ext[idx].pkt_skb = NULL;
NdisMoveMemory(ATECtrl->band_ext[idx].TemplateFrame, ATECtrl->TemplateFrame, 32);
NdisMoveMemory(ATECtrl->band_ext[idx].Addr1, addr, MAC_ADDR_LEN);
@ -2420,6 +2436,12 @@ static INT32 MT_ATEStart(RTMP_ADAPTER *pAd)
struct _BAND_INFO *Info = &(ATECtrl->band_ext[0]);
#endif /* DBDC_MODE */
#if defined(DBDC_MODE) && defined(DEFAULT_5G_PROFILE)
/* Remap wdev_idx for MP 3.3 Driver */
ATECtrl->wdev_idx = 1;
Info->wdev_idx = 0;
#endif /* DBDC_MODE */
/* Remind FW that Enable ATE mode */
MtCmdATEModeCtrl(pAd, 1);
@ -3108,10 +3130,7 @@ INT mt_ate_set_tmac_info(RTMP_ADAPTER *pAd, TMAC_INFO *tmac_info, UINT32 band_id
#ifdef SINGLE_SKU_V2
/* Update Power offset according to Band, Phymode, MCS, BW, Nss, SPE */
tmac_info->PowerOffset = SKUTxPwrOffsetGet(pAd,
band_idx, ATECtrl->PerPktBW, ATECtrl->PhyMode,
ATECtrl->Mcs,
ATECtrl->Nss, fgSPE);
tmac_info->PowerOffset = SKUTxPwrOffsetGet(pAd, band_idx, TESTMODE_GET_PARAM(ATECtrl, band_idx, PerPktBW), TESTMODE_GET_PARAM(ATECtrl, band_idx, PhyMode), TESTMODE_GET_PARAM(ATECtrl, band_idx, Mcs), TESTMODE_GET_PARAM(ATECtrl, band_idx, Nss), fgSPE);
MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("%s: tmac_info->PowerOffset = 0x%x (%d)\n",
__func__, tmac_info->PowerOffset, tmac_info->PowerOffset));
@ -4018,6 +4037,12 @@ INT32 MT_ATETxPkt(RTMP_ADAPTER *pAd, UINT32 band_idx)
#endif /* DBDC_MODE */
alloced = TESTMODE_GET_PARAM(ATECtrl, band_idx, is_alloc_skb);
if (!pkt_skb) {
MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR,
("%s: invalid pkt_skb\n", __func__));
return NDIS_STATUS_FAILURE;
}
if (!alloced) {
if (*pkt_skb)
RELEASE_NDIS_PACKET(pAd, *pkt_skb, NDIS_STATUS_SUCCESS);
@ -4037,12 +4062,14 @@ INT32 MT_ATETxPkt(RTMP_ADAPTER *pAd, UINT32 band_idx)
TESTMODE_SET_PARAM(ATECtrl, band_idx, is_alloc_skb, 1);
}
skb = (struct sk_buff *)(*pkt_skb);
OS_PKT_CLONE(pAd, skb, skb2, GFP_ATOMIC);
if (*pkt_skb) {
skb = (struct sk_buff *)(*pkt_skb);
OS_PKT_CLONE(pAd, skb, skb2, GFP_ATOMIC);
}
if (skb2 == NULL) {
RELEASE_NDIS_PACKET(pAd, *pkt_skb, NDIS_STATUS_SUCCESS);
pkt_skb = NULL;
if (*pkt_skb)
RELEASE_NDIS_PACKET(pAd, *pkt_skb, NDIS_STATUS_SUCCESS);
MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, ("%s: clone pakcet fail\n", __func__));
goto done;
}
@ -4218,7 +4245,7 @@ static INT32 mt_ate_calculate_duty_cycle(RTMP_ADAPTER *pAd, UINT32 band_idx)
ipg = ((pkt_tx_time * 100) / duty_cycle) - pkt_tx_time;
ipg_param->ipg = ipg;
/* If IPG value is not make sense, there's error handle when get ipg parameter */
ret = ATEOp->SetIPG(pAd);
ret = ATEOp->SetIPG(pAd, ipg);
} else if ((duty_cycle > 0) && (pkt_tx_time == 0) && (ipg > 0)) {
/* If pkt_tx_time is not make sense, there's error handle when start TX */
pkt_tx_time = (duty_cycle * ipg) / (100 - duty_cycle);
@ -4434,27 +4461,27 @@ static INT32 MT_ATEStartTx(RTMP_ADAPTER *pAd)
struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl;
struct _ATE_IF_OPERATION *if_ops = ATECtrl->ATEIfOps;
INT32 Ret = 0;
UCHAR cntrol_band_idx = ATECtrl->control_band_idx;
UCHAR *pate_pkt = TESTMODE_GET_PARAM(ATECtrl, cntrol_band_idx, pate_pkt);
UCHAR cntl_ch = TESTMODE_GET_PARAM(ATECtrl, cntrol_band_idx, ControlChl);
UCHAR ch = TESTMODE_GET_PARAM(ATECtrl, cntrol_band_idx, Channel);
UINT32 mode = TESTMODE_GET_PARAM(ATECtrl, cntrol_band_idx, Mode);
UINT32 tx_cnt = TESTMODE_GET_PARAM(ATECtrl, cntrol_band_idx, TxCount);
UCHAR bw = TESTMODE_GET_PARAM(ATECtrl, cntrol_band_idx, BW);
INT8 wdev_idx = TESTMODE_GET_PARAM(ATECtrl, cntrol_band_idx, wdev_idx);
UINT32 Rate = TESTMODE_GET_PARAM(ATECtrl, cntrol_band_idx, Mcs);
UINT32 duty_cycle = TESTMODE_GET_PARAM(ATECtrl, cntrol_band_idx, duty_cycle);
UCHAR control_band_idx = ATECtrl->control_band_idx;
UCHAR *pate_pkt = TESTMODE_GET_PARAM(ATECtrl, control_band_idx, pate_pkt);
UCHAR cntl_ch = TESTMODE_GET_PARAM(ATECtrl, control_band_idx, ControlChl);
UCHAR ch = TESTMODE_GET_PARAM(ATECtrl, control_band_idx, Channel);
UINT32 mode = TESTMODE_GET_PARAM(ATECtrl, control_band_idx, Mode);
UINT32 tx_cnt = TESTMODE_GET_PARAM(ATECtrl, control_band_idx, TxCount);
UCHAR bw = TESTMODE_GET_PARAM(ATECtrl, control_band_idx, BW);
INT8 wdev_idx = TESTMODE_GET_PARAM(ATECtrl, control_band_idx, wdev_idx);
UINT32 Rate = TESTMODE_GET_PARAM(ATECtrl, control_band_idx, Mcs);
UINT32 duty_cycle = TESTMODE_GET_PARAM(ATECtrl, control_band_idx, duty_cycle);
#ifdef ARBITRARY_CCK_OFDM_TX
UINT32 tx_sel = TESTMODE_GET_PARAM(ATECtrl, cntrol_band_idx, TxAntennaSel);
UINT8 phymode = TESTMODE_GET_PARAM(ATECtrl, cntrol_band_idx, PhyMode);
UINT32 tx_sel = TESTMODE_GET_PARAM(ATECtrl, control_band_idx, TxAntennaSel);
UINT8 phymode = TESTMODE_GET_PARAM(ATECtrl, control_band_idx, PhyMode);
#endif
#ifdef CONFIG_AP_SUPPORT
INT32 IdBss, MaxNumBss = pAd->ApCfg.BssidNum;
#endif
MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF,
("%s: cntrol_band_idx:%u, ch:%x, cntl_ch:%x, wdev_idx:%x\n",
__func__, cntrol_band_idx, ch, cntl_ch, wdev_idx));
("%s: control_band_idx:%u, ch:%x, cntl_ch:%x, wdev_idx:%x\n",
__func__, control_band_idx, ch, cntl_ch, wdev_idx));
if (!pate_pkt)
goto err0;
@ -4467,20 +4494,20 @@ static INT32 MT_ATEStartTx(RTMP_ADAPTER *pAd)
goto err1;
}
MtATESetMacTxRx(pAd, ASIC_MAC_TX, TRUE, cntrol_band_idx);
MtATESetMacTxRx(pAd, ASIC_MAC_TX, TRUE, control_band_idx);
#ifdef ARBITRARY_CCK_OFDM_TX
if (IS_MT7615(pAd)) {
MtATEInitCCK_OFDM_Path(pAd, cntrol_band_idx);
MtATEInitCCK_OFDM_Path(pAd, control_band_idx);
if (phymode == MODE_CCK || phymode == MODE_OFDM)
MtATESetCCK_OFDM_Path(pAd, tx_sel, cntrol_band_idx);
MtATESetCCK_OFDM_Path(pAd, tx_sel, control_band_idx);
}
#endif
if (Rate == 32)
mt_ate_mcs32_handle(pAd, ATECtrl->wcid_ref, bw);
MtATESetMacTxRx(pAd, ASIC_MAC_RX_RXV, FALSE, cntrol_band_idx);
MtATESetMacTxRx(pAd, ASIC_MAC_RX_RXV, FALSE, control_band_idx);
msleep(30);
/* Stop send TX packets from upper layer */
RTMP_OS_NETDEV_STOP_QUEUE(pAd->net_dev);
@ -4505,7 +4532,7 @@ static INT32 MT_ATEStartTx(RTMP_ADAPTER *pAd)
if_ops->clean_trx_q(pAd);
if (mode & ATE_RXFRAME)
MtATESetMacTxRx(pAd, ASIC_MAC_RX_RXV, TRUE, cntrol_band_idx);
MtATESetMacTxRx(pAd, ASIC_MAC_RX_RXV, TRUE, control_band_idx);
RTMP_OS_NETDEV_START_QUEUE(pAd->net_dev);
#ifdef CONFIG_AP_SUPPORT
@ -4526,51 +4553,51 @@ static INT32 MT_ATEStartTx(RTMP_ADAPTER *pAd)
/* Calculate duty_cycle related parameter first */
if (duty_cycle > 0)
Ret = mt_ate_calculate_duty_cycle(pAd, cntrol_band_idx);
Ret = mt_ate_calculate_duty_cycle(pAd, control_band_idx);
/* Prepare Tx packet */
if (if_ops->setup_frame)
Ret = if_ops->setup_frame(pAd, QID_AC_BE);
else
Ret = MT_ATEGenPkt(pAd, pate_pkt, cntrol_band_idx);
Ret = MT_ATEGenPkt(pAd, pate_pkt, control_band_idx);
if (Ret)
goto err0;
/* Apply IPG setting to HW */
Ret = mt_ate_apply_ipg_param(pAd, cntrol_band_idx);
Ret = mt_ate_apply_ipg_param(pAd, control_band_idx);
if (tx_cnt != 0xFFFFFFFF) {
#ifndef ATE_TXTHREAD
tx_cnt += TESTMODE_GET_PARAM(ATECtrl, cntrol_band_idx, TxDoneCount);
tx_cnt += TESTMODE_GET_PARAM(ATECtrl, control_band_idx, TxDoneCount);
#endif
TESTMODE_SET_PARAM(ATECtrl, cntrol_band_idx, TxCount, tx_cnt);
TESTMODE_SET_PARAM(ATECtrl, control_band_idx, TxCount, tx_cnt);
}
/* Tx Frame */
mode |= ATE_TXFRAME;
TESTMODE_SET_PARAM(ATECtrl, cntrol_band_idx, Mode, mode);
TESTMODE_SET_PARAM(ATECtrl, control_band_idx, Mode, mode);
if (if_ops->test_frame_tx)
Ret = if_ops->test_frame_tx(pAd);
else {
struct _ATE_IPG_PARAM *ipg_param = TESTMODE_GET_PADDR(ATECtrl, cntrol_band_idx, ipg_param);
struct _ATE_TX_TIME_PARAM *tx_time_param = TESTMODE_GET_PADDR(ATECtrl, cntrol_band_idx, tx_time_param);
struct _ATE_IPG_PARAM *ipg_param = TESTMODE_GET_PADDR(ATECtrl, control_band_idx, ipg_param);
struct _ATE_TX_TIME_PARAM *tx_time_param = TESTMODE_GET_PADDR(ATECtrl, control_band_idx, tx_time_param);
UINT32 ipg = ipg_param->ipg;
UINT32 pkt_tx_time = tx_time_param->pkt_tx_time;
if ((pkt_tx_time > 0) || (ipg > 0)) {
PKT_TOKEN_CB *pktTokenCb = (PKT_TOKEN_CB *) pAd->PktTokenCb;
UINT32 pkt_cnt, input_cnt;
UINT32 ate_tx_cnt = TESTMODE_GET_PARAM(ATECtrl, cntrol_band_idx, TxCount);
UINT32 txed_cnt = TESTMODE_GET_PARAM(ATECtrl, cntrol_band_idx, TxedCount);
UINT32 ate_tx_cnt = TESTMODE_GET_PARAM(ATECtrl, control_band_idx, TxCount);
UINT32 txed_cnt = TESTMODE_GET_PARAM(ATECtrl, control_band_idx, TxedCount);
UINT32 pkt_ampdu_cnt = tx_time_param->pkt_ampdu_cnt;
UINT32 pkt_enqueue_cnt = pktTokenCb->pkt_tx_tkid_max / 2;
MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF,
("%s: ate_tx_cnt=0x%x, pkt_ampdu_cnt=%d, pkt_enqueue_cnt=%d, pkt_tx_time=%d, ipg=%d\n",
__func__, ate_tx_cnt, pkt_ampdu_cnt, pkt_enqueue_cnt, pkt_tx_time, ipg));
MtATESetMacTxRx(pAd, ASIC_MAC_TX, FALSE, cntrol_band_idx);
MtATESetMacTxRx(pAd, ASIC_MAC_TX, FALSE, control_band_idx);
if (ate_tx_cnt > pkt_ampdu_cnt)
input_cnt = ate_tx_cnt;
@ -4581,15 +4608,15 @@ static INT32 MT_ATEStartTx(RTMP_ADAPTER *pAd)
/* Enqueue packet in HW queue in advance */
for (pkt_cnt = 0; pkt_cnt < input_cnt; pkt_cnt++) {
MT_ATETxPkt(pAd, cntrol_band_idx);
MT_ATETxPkt(pAd, control_band_idx);
txed_cnt++;
}
TESTMODE_SET_PARAM(ATECtrl, cntrol_band_idx, TxedCount, txed_cnt);
Ret = MT_ATETxControl(pAd, cntrol_band_idx, NULL);
MtATESetMacTxRx(pAd, ASIC_MAC_TX, TRUE, cntrol_band_idx);
TESTMODE_SET_PARAM(ATECtrl, control_band_idx, TxedCount, txed_cnt);
Ret = MT_ATETxControl(pAd, control_band_idx, NULL);
MtATESetMacTxRx(pAd, ASIC_MAC_TX, TRUE, control_band_idx);
} else
Ret = MT_ATETxControl(pAd, cntrol_band_idx, NULL);
Ret = MT_ATETxControl(pAd, control_band_idx, NULL);
}
if (Ret)
@ -4610,8 +4637,8 @@ static INT32 MT_ATEStartRx(RTMP_ADAPTER *pAd)
struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl;
struct _ATE_IF_OPERATION *if_ops = ATECtrl->ATEIfOps;
INT32 Ret = 0;
UCHAR cntrol_band_idx = ATECtrl->control_band_idx;
UINT32 mode = TESTMODE_GET_PARAM(ATECtrl, cntrol_band_idx, Mode);
UCHAR control_band_idx = ATECtrl->control_band_idx;
UINT32 mode = TESTMODE_GET_PARAM(ATECtrl, control_band_idx, Mode);
#ifdef CONFIG_AP_SUPPORT
INT32 IdBss, MaxNumBss = pAd->ApCfg.BssidNum;
#endif
@ -4620,7 +4647,7 @@ static INT32 MT_ATEStartRx(RTMP_ADAPTER *pAd)
goto err0;
/* Firmware offloading CR need to msleep(30) Currently for the second NETDEV_STOP_QUEUE */
MtATESetMacTxRx(pAd, ASIC_MAC_RX_RXV, FALSE, cntrol_band_idx);
MtATESetMacTxRx(pAd, ASIC_MAC_RX_RXV, FALSE, control_band_idx);
msleep(30);
/* Stop send TX packets */
RTMP_OS_NETDEV_STOP_QUEUE(pAd->net_dev);
@ -4659,7 +4686,7 @@ static INT32 MT_ATEStartRx(RTMP_ADAPTER *pAd)
/* Turn on TX again if set before */
if (mode & ATE_TXFRAME)
MtATESetMacTxRx(pAd, ASIC_MAC_TX, TRUE, cntrol_band_idx);
MtATESetMacTxRx(pAd, ASIC_MAC_TX, TRUE, control_band_idx);
/* reset counter when iwpriv only */
if (ATECtrl->bQAEnabled != TRUE) {
@ -4672,7 +4699,7 @@ static INT32 MT_ATEStartRx(RTMP_ADAPTER *pAd)
pAd->WlanCounters[0].FCSErrorCount.u.LowPart = 0;
/* Enable PDMA */
AsicSetWPDMA(pAd, PDMA_TX_RX, 1);
MtATESetMacTxRx(pAd, ASIC_MAC_RX_RXV, TRUE, cntrol_band_idx);
MtATESetMacTxRx(pAd, ASIC_MAC_RX_RXV, TRUE, control_band_idx);
#ifdef CONFIG_HW_HAL_OFFLOAD
MtCmdSetPhyCounter(pAd, 0, TESTMODE_BAND0);
MtCmdSetPhyCounter(pAd, 1, TESTMODE_BAND0);
@ -4685,7 +4712,7 @@ static INT32 MT_ATEStartRx(RTMP_ADAPTER *pAd)
#endif /* CONFIG_HW_HAL_OFFLOAD */
msleep(30);
mode |= ATE_RXFRAME;
TESTMODE_SET_PARAM(ATECtrl, cntrol_band_idx, Mode, mode);
TESTMODE_SET_PARAM(ATECtrl, control_band_idx, Mode, mode);
if (if_ops->test_frame_rx)
if_ops->test_frame_rx(pAd);
@ -4703,25 +4730,25 @@ static INT32 MT_ATEStopTx(RTMP_ADAPTER *pAd)
#ifdef ATE_TXTHREAD
INT32 thread_idx = 0;
#endif
UCHAR cntrol_band_idx = ATECtrl->control_band_idx;
UINT32 Mode = TESTMODE_GET_PARAM(ATECtrl, cntrol_band_idx, Mode);
UCHAR control_band_idx = ATECtrl->control_band_idx;
UINT32 Mode = TESTMODE_GET_PARAM(ATECtrl, control_band_idx, Mode);
struct qm_ops *ops = pAd->qm_ops;
struct _ATE_IPG_PARAM *ipg_param = TESTMODE_GET_PADDR(ATECtrl, cntrol_band_idx, ipg_param);
struct _ATE_TX_TIME_PARAM *tx_time_param = TESTMODE_GET_PADDR(ATECtrl, cntrol_band_idx, tx_time_param);
struct _ATE_IPG_PARAM *ipg_param = TESTMODE_GET_PADDR(ATECtrl, control_band_idx, ipg_param);
struct _ATE_TX_TIME_PARAM *tx_time_param = TESTMODE_GET_PADDR(ATECtrl, control_band_idx, tx_time_param);
UINT32 ipg = ipg_param->ipg;
UINT32 pkt_tx_time = tx_time_param->pkt_tx_time;
MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE,
("%s: cntrol_band_idx=%u\n", __func__, cntrol_band_idx));
("%s: control_band_idx=%u\n", __func__, control_band_idx));
TESTMODE_SET_PARAM(ATECtrl, cntrol_band_idx, TxedCount, 0);
TESTMODE_SET_PARAM(ATECtrl, control_band_idx, TxedCount, 0);
#ifdef ATE_TXTHREAD
TESTMODEThreadStopTx(pAd, thread_idx);
#endif
if ((Mode & ATE_TXFRAME) || (Mode == ATE_STOP)) {
Mode &= ~ATE_TXFRAME;
TESTMODE_SET_PARAM(ATECtrl, cntrol_band_idx, Mode, Mode);
TESTMODE_SET_PARAM(ATECtrl, control_band_idx, Mode, Mode);
if ((pkt_tx_time > 0) || (ipg > 0)) {
/* Flush SW queue */
@ -4733,7 +4760,7 @@ static INT32 MT_ATEStopTx(RTMP_ADAPTER *pAd)
}
#ifdef ARBITRARY_CCK_OFDM_TX
if (IS_MT7615(pAd)) {
MtATEInitCCK_OFDM_Path(pAd, cntrol_band_idx);
MtATEInitCCK_OFDM_Path(pAd, control_band_idx);
}
#endif
}
@ -4747,12 +4774,12 @@ static INT32 MT_ATEStopRx(RTMP_ADAPTER *pAd)
struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl;
struct _ATE_IF_OPERATION *if_ops = ATECtrl->ATEIfOps;
INT32 Ret = 0;
UCHAR cntrol_band_idx = ATECtrl->control_band_idx;
UINT32 Mode = TESTMODE_GET_PARAM(ATECtrl, cntrol_band_idx, Mode);
UCHAR control_band_idx = ATECtrl->control_band_idx;
UINT32 Mode = TESTMODE_GET_PARAM(ATECtrl, control_band_idx, Mode);
Ret = MtATESetMacTxRx(pAd, ASIC_MAC_RX_RXV, FALSE, cntrol_band_idx);
Ret = MtATESetMacTxRx(pAd, ASIC_MAC_RX_RXV, FALSE, control_band_idx);
Mode &= ~ATE_RXFRAME;
TESTMODE_SET_PARAM(ATECtrl, cntrol_band_idx, Mode, Mode);
TESTMODE_SET_PARAM(ATECtrl, control_band_idx, Mode, Mode);
if (if_ops->clean_trx_q)
if_ops->clean_trx_q(pAd);
@ -4811,8 +4838,14 @@ static INT32 MT_ATEStopRx(RTMP_ADAPTER *pAd)
static INT32 MT_ATESetTxAntenna(RTMP_ADAPTER *pAd, UINT32 Ant)
{
struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl;
INT32 Ret = 0;
UCHAR control_band_idx = ATECtrl->control_band_idx;
INT32 Ret = 0, ant_loop = 0;
UCHAR control_band_idx = ATECtrl->control_band_idx, ant_mask = 0;
struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl);
for (ant_loop = 0; ant_loop < cap->max_nss; ant_loop++)
ant_mask |= (0x1 << ant_loop);
Ant &= ant_mask;
MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE,
("%s: Ant = 0x%x, control_band_idx = %d\n",
@ -4830,8 +4863,14 @@ static INT32 MT_ATESetTxAntenna(RTMP_ADAPTER *pAd, UINT32 Ant)
static INT32 MT_ATESetRxAntenna(RTMP_ADAPTER *pAd, UINT32 Ant)
{
struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl;
INT32 Ret = 0;
UCHAR control_band_idx = ATECtrl->control_band_idx;
INT32 Ret = 0, ant_loop = 0;
UCHAR control_band_idx = ATECtrl->control_band_idx, ant_mask = 0;
struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl);
for (ant_loop = 0; ant_loop < cap->max_nss; ant_loop++)
ant_mask |= (0x1 << ant_loop);
Ant &= ant_mask;
MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE,
("%s: Ant = 0x%x, control_band_idx = %d\n",
@ -5227,8 +5266,8 @@ static INT32 mt_ate_set_duty_cycle(RTMP_ADAPTER *pAd, UINT32 value)
struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl;
INT32 ret = 0;
UCHAR control_band_idx = ATECtrl->control_band_idx;
UINT32 duty_cycle = value;
TESTMODE_SET_PARAM(ATECtrl, control_band_idx, duty_cycle, duty_cycle);
MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE,
("%s: Duty cycle=%d%%, control_band_idx=%d\n",
@ -5471,11 +5510,19 @@ static INT32 mt_ate_get_ipg_param(RTMP_ADAPTER *pAd)
}
static INT32 mt_ate_set_ipg(RTMP_ADAPTER *pAd)
static INT32 mt_ate_set_ipg(RTMP_ADAPTER *pAd, UINT32 value)
{
struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl;
INT32 ret = 0;
UCHAR control_band_idx = ATECtrl->control_band_idx;
UINT32 ipg = value;
MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE,
("%s: IPG=%dus, control_band_idx=%d\n",
__func__, ipg, control_band_idx));
TESTMODE_SET_PARAM(ATECtrl, control_band_idx, ipg_param.ipg, ipg);
ret = mt_ate_get_ipg_param(pAd);
return ret;
}
@ -5596,9 +5643,6 @@ static INT32 MT_ATETxCWTone(RTMP_ADAPTER *pAd, UINT32 Control)
INT32 pwr1 = 0, pwr2 = 0;
INT32 DcOffset_I = 0, DcOffset_Q = 0;
if (band_idx == -1)
return -1;
AntMask = TESTMODE_GET_PARAM(ATECtrl, band_idx, TxAntennaSel);
Channel = TESTMODE_GET_PARAM(ATECtrl, band_idx, Channel);
pwr1 = TESTMODE_GET_PARAM(ATECtrl, band_idx, RF_Power);
@ -6091,9 +6135,11 @@ INT32 MT_ATERFTestCB(RTMP_ADAPTER *pAd, UINT8 *Data, UINT32 Length)
struct _ATE_LOG_DUMP_CB *log_cb = NULL;
#ifdef PRE_CAL_MT7622_SUPPORT
UINT32 *cal_log = NULL;
if (IS_MT7622(pAd)) {
if (pAd->bPreCalMode)
os_alloc_mem(pAd, (UCHAR **)&cal_log, CAL_LOG_SIZE);
}
#endif /* PRE_CAL_MT7622_SUPPORT */
data->u4CalIndex = le2cpu32(data->u4CalIndex);
data->u4CalType = le2cpu32(data->u4CalType);
@ -6127,8 +6173,9 @@ INT32 MT_ATERFTestCB(RTMP_ADAPTER *pAd, UINT8 *Data, UINT32 Length)
MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_INFO, ("%08x\n", dump_tmp[i]));
re_cal.cr_val = dump_tmp[i];
#ifdef PRE_CAL_MT7622_SUPPORT
if (cal_log)
if (IS_MT7622(pAd)) {
cal_log[(i-1)/2] = dump_tmp[i];
}
#endif /* PRE_CAL_MT7622_SUPPORT */
if (pAd->ATECtrl.en_log & fATE_LOG_RE_CAL)
MT_ATEInsertLog(pAd, (UCHAR *)&re_cal, fATE_LOG_RE_CAL, sizeof(re_cal));
@ -6138,6 +6185,8 @@ INT32 MT_ATERFTestCB(RTMP_ADAPTER *pAd, UINT8 *Data, UINT32 Length)
}
}
#ifdef PRE_CAL_MT7622_SUPPORT
if (IS_MT7622(pAd)) {
if (pAd->bPreCalMode) {
if (cal_type == TX_LPFG) {
MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE,
@ -6160,6 +6209,7 @@ INT32 MT_ATERFTestCB(RTMP_ADAPTER *pAd, UINT8 *Data, UINT32 Length)
}
os_free_mem(cal_log);
}
}
#endif /* PRE_CAL_MT7622_SUPPORT */
}
break;
@ -7074,7 +7124,9 @@ static UINT32 MT_TestModeOpInit(RTMP_ADAPTER *pAd)
AteOp->SetDutyCycle = mt_ate_set_duty_cycle;
AteOp->SetPktTxTime = mt_ate_set_pkt_tx_time;
#ifdef PRE_CAL_MT7622_SUPPORT
AteOp->TxDPDTest7622 = MtATE_DPD_Cal_Store_Proc_7622;
if (IS_MT7622(pAd)) {
AteOp->TxDPDTest7622 = MtATE_DPD_Cal_Store_Proc_7622;
}
#endif /*PRE_CAL_MT7622_SUPPORT*/
#ifdef PRE_CAL_TRX_SET1_SUPPORT
AteOp->RxSelfTest = MtATE_DCOC_Cal_Store_Proc;
@ -7083,6 +7135,9 @@ static UINT32 MT_TestModeOpInit(RTMP_ADAPTER *pAd)
#ifdef PRE_CAL_TRX_SET2_SUPPORT
AteOp->PreCalTest = MtATE_Pre_Cal_Proc;
#endif /* PRE_CAL_TRX_SET2_SUPPORT */
#if defined(CAL_BIN_FILE_SUPPORT) && defined(MT7615)
AteOp->PATrim = MtATE_PA_Trim_Proc;
#endif /* CAL_BIN_FILE_SUPPORT */
#if !defined(COMPOS_TESTMODE_WIN)/* 1 todo RX_BLK */
AteOp->SampleRssi = MT_ATESampleRssi;
#endif
@ -7279,65 +7334,68 @@ INT MtATE_DPD_Cal_Store_Proc_7622(RTMP_ADAPTER *pAd, RTMP_STRING *arg)
USHORT doCal1 = 0;
MT_SWITCH_CHANNEL_CFG ch_cfg;
if (pAd->E2pAccessMode != E2P_FLASH_MODE && pAd->E2pAccessMode != E2P_BIN_MODE) {
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR,
("%s: Currently not in FLASH or BIN MODE,return.\n", __func__));
return FALSE;
}
/* set channel command , per group calibration - set to channel 7, BW20 */
ch_cfg.Bw = BW_20;
ch_cfg.CentralChannel = 7;
ch_cfg.TxStream = 4;
ch_cfg.RxStream = 4;
ch_cfg.ControlChannel = 7;
ch_cfg.ControlChannel2 = 0;
ch_cfg.BandIdx = 0;
ch_cfg.bScan = 0;
MtCmdChannelSwitch(pAd, ch_cfg);
if (IS_MT7622(pAd)) {
pAd->bPreCalMode = TRUE;
/* Retest Recal - TXLPFG */
u4CalId = TX_LPFG;
MtCmdRfTestRecal(pAd, u4CalId, TX_LPFG_RESP_LEN);
/* Retest Recal - TXDCIQ */
u4CalId = TX_DCIQC;
MtCmdRfTestRecal(pAd, u4CalId, TX_DCIQ_RESP_LEN);
pAd->TxDpdCalOfst = 0;
RTMPZeroMemory(pAd->CalTXDPDImage, CAL_TXDPD_SIZE);
/* Retest Recal - TXDPD */
for (i = 1; i <= 14; i++) {
ch_cfg.CentralChannel = i;
ch_cfg.ControlChannel = i;
if (pAd->E2pAccessMode != E2P_FLASH_MODE && pAd->E2pAccessMode != E2P_BIN_MODE) {
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR,
("%s: Currently not in FLASH or BIN MODE,return.\n", __func__));
return FALSE;
}
/* set channel command , per group calibration - set to channel 7, BW20 */
ch_cfg.Bw = BW_20;
ch_cfg.CentralChannel = 7;
ch_cfg.TxStream = 4;
ch_cfg.RxStream = 4;
ch_cfg.ControlChannel = 7;
ch_cfg.ControlChannel2 = 0;
ch_cfg.BandIdx = 0;
ch_cfg.bScan = 0;
MtCmdChannelSwitch(pAd, ch_cfg);
u4CalId = TX_DPD_LINK;
MtCmdRfTestRecal(pAd, u4CalId, TX_DPD_LINK_RESP_LEN);
}
/* raise DoCalibrate bits */
if (pAd->E2pAccessMode == E2P_BIN_MODE)
rtmp_ee_bin_read16(pAd, 0x52, &doCal1);
pAd->bPreCalMode = TRUE;
/* Retest Recal - TXLPFG */
u4CalId = TX_LPFG;
MtCmdRfTestRecal(pAd, u4CalId, TX_LPFG_RESP_LEN);
/* Retest Recal - TXDCIQ */
u4CalId = TX_DCIQC;
MtCmdRfTestRecal(pAd, u4CalId, TX_DCIQ_RESP_LEN);
pAd->TxDpdCalOfst = 0;
RTMPZeroMemory(pAd->CalTXDPDImage, CAL_TXDPD_SIZE);
/* Retest Recal - TXDPD */
for (i = 1; i <= 14; i++) {
ch_cfg.CentralChannel = i;
ch_cfg.ControlChannel = i;
MtCmdChannelSwitch(pAd, ch_cfg);
u4CalId = TX_DPD_LINK;
MtCmdRfTestRecal(pAd, u4CalId, TX_DPD_LINK_RESP_LEN);
}
/* raise DoCalibrate bits */
if (pAd->E2pAccessMode == E2P_BIN_MODE)
rtmp_ee_bin_read16(pAd, 0x52, &doCal1);
#ifdef RTMP_FLASH_SUPPORT
if (pAd->E2pAccessMode == E2P_FLASH_MODE)
rtmp_ee_flash_read(pAd, 0x52, &doCal1);
if (pAd->E2pAccessMode == E2P_FLASH_MODE)
rtmp_ee_flash_read(pAd, 0x52, &doCal1);
#endif
/* raise bit3 */
doCal1 |= (1 << 3);
if (pAd->E2pAccessMode == E2P_BIN_MODE) {
rtmp_ee_bin_write16(pAd, 0x52, doCal1);
rtmp_ee_write_to_bin(pAd); /* writeback to eeprom file */
}
/* raise bit3 */
doCal1 |= (1 << 3);
if (pAd->E2pAccessMode == E2P_BIN_MODE) {
rtmp_ee_bin_write16(pAd, 0x52, doCal1);
rtmp_ee_write_to_bin(pAd); /* writeback to eeprom file */
}
#ifdef RTMP_FLASH_SUPPORT
if (pAd->E2pAccessMode == E2P_FLASH_MODE)
rtmp_ee_flash_write(pAd, 0x52, doCal1);
if (pAd->E2pAccessMode == E2P_FLASH_MODE)
rtmp_ee_flash_write(pAd, 0x52, doCal1);
#endif
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("raised E2P 0x52 = %x\n", doCal1));
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF,
("====================\n"));
pAd->bPreCalMode = FALSE;
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("raised E2P 0x52 = %x\n", doCal1));
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF,
("====================\n"));
pAd->bPreCalMode = FALSE;
}
return TRUE;
}
#endif /* PRE_CAL_MT7622_SUPPORT */
@ -7807,7 +7865,7 @@ INT MtATE_Pre_Cal_Proc(RTMP_ADAPTER *pAd, UINT8 CalId, UINT32 ChGrpId)
if (pAd->E2pAccessMode == E2P_FLASH_MODE) {
pAd->PreCalStoreBuffer = pAd->EEPROMImage + PRECALPART_OFFSET;
} else {
ret = os_alloc_mem(pAd, &pAd->PreCalStoreBuffer, PRE_CAL_SIZE);
ret = os_alloc_mem(pAd, &pAd->PreCalStoreBuffer, PRE_CAL_SIZE_ONE_CARD);
if (ret != NDIS_STATUS_SUCCESS) {
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR,
@ -7822,6 +7880,42 @@ INT MtATE_Pre_Cal_Proc(RTMP_ADAPTER *pAd, UINT8 CalId, UINT32 ChGrpId)
}
#endif/* PRE_CAL_TRX_SET2_SUPPORT */
#if defined(CAL_BIN_FILE_SUPPORT) && defined(MT7615)
INT MtATE_PA_Trim_Proc(RTMP_ADAPTER *pAd, PUINT32 pData)
{
UINT16 DoPATrim;
UINT16 WriteAddr;
UINT8 idx;
USHORT *pStoreData = (USHORT *)pData;
USHORT value;
if (IS_MT7615(pAd)) {
WriteAddr = PA_TRIM_START_ADDR1;
for (idx = 0; idx < PA_TRIM_BLOCK_SIZE; idx++) {
value = *pStoreData;
RT28xx_EEPROM_WRITE16(pAd, WriteAddr, value);
WriteAddr += 2;
pStoreData++;
}
WriteAddr = PA_TRIM_START_ADDR2;
for (idx = 0; idx < PA_TRIM_BLOCK_SIZE; idx++) {
value = *pStoreData;
RT28xx_EEPROM_WRITE16(pAd, WriteAddr, value);
WriteAddr += 2;
pStoreData++;
}
/* Raise DoPATrim bits */
RT28xx_EEPROM_READ16(pAd, 0x52, DoPATrim);
DoPATrim |= (1 << 3);
RT28xx_EEPROM_WRITE16(pAd, 0x52, DoPATrim);
}
return TRUE;
}
#endif/* CAL_BIN_FILE_SUPPORT */
INT32 MtATETssiTrainingProc(RTMP_ADAPTER *pAd, UCHAR ucBW, UCHAR ucBandIdx)
{
struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl;

View File

@ -1110,6 +1110,30 @@ static INT32 HQA_GetChipID(
return Ret;
}
static INT32 HQA_GetFWVersion(
PRTMP_ADAPTER pAd,
RTMP_IOCTL_INPUT_STRUCT *WRQ,
struct _HQA_CMD_FRAME *HqaCmdFrame)
{
INT32 Ret = 0;
struct fw_info *fw_info = NULL;
UINT i = 0;
MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("%s\n", __func__));
fw_info = &pAd->MCUCtrl.fwdl_ctrl.fw_profile[WM_CPU].fw_info;
if (fw_info != NULL) {
MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("Built date: "));
for (i = 0; i < 12; i++)
MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("%c", fw_info->ram_built_date[i]));
MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\n"));
memcpy(HqaCmdFrame->Data + 2, &fw_info->ram_built_date[0], 12);
}
ResponseToQA(HqaCmdFrame, WRQ, 2+12, Ret);
return Ret;
}
static INT32 HQA_GetStatistics(
PRTMP_ADAPTER pAd,
@ -1466,6 +1490,7 @@ VOID RTMP_IO_READ_BULK(PRTMP_ADAPTER pAd, UCHAR *Dst, UINT32 Offset, UINT32 Len)
UINT32 NumOfReg = (Len >> 2);
BOOLEAN IsFound;
struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl;
UINT32 OffsetTmp = Offset;
MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_WARN, ("\n\n"));
#if !defined(COMPOS_TESTMODE_WIN)
@ -1477,6 +1502,7 @@ VOID RTMP_IO_READ_BULK(PRTMP_ADAPTER pAd, UCHAR *Dst, UINT32 Offset, UINT32 Len)
}
#endif /* !defined(COMPOS_TESTMODE_WIN) */
Offset = OffsetTmp;
for (Index = 0 ; Index < NumOfReg; Index++) {
pDst = (Dst + (Index << 2));
@ -2358,7 +2384,7 @@ static HQA_CMD_HANDLER HQA_CMD_SET3[] = {
HQA_GetCfgOnOff, /* 0x1314 */
NULL,
HQA_SetBufferBin, /* 0x1316 */
NULL, /* 0x1317 */
HQA_GetFWVersion, /* 0x1317 */
HQA_CA53RegRead, /* 0x1318 */
HQA_CA53RegWrite, /* 0x1319 */
};
@ -4765,6 +4791,7 @@ static INT32 HQA_TxBfProfileTagRead(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *
NdisMoveMemory((PUCHAR)&HqaCmdFrame->Data + 2, (PUCHAR)out, ate_ctrl->txbf_info_len);
ate_ctrl->Mode &= ~fATE_IN_BF;
os_free_mem(ate_ctrl->txbf_info);
ate_ctrl->txbf_info = NULL;
HQA_TAG_READ_FAIL:
if (cmd)
@ -4945,6 +4972,7 @@ static INT32 HQA_BFProfileDataRead(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *W
NdisMoveMemory((PUCHAR)&HqaCmdFrame->Data + 2 + offset, (PUCHAR)out, ate_ctrl->txbf_info_len);
offset += ate_ctrl->txbf_info_len;
os_free_mem(ate_ctrl->txbf_info);
ate_ctrl->txbf_info = NULL;
}
ate_ctrl->Mode &= ~fATE_IN_BF;
@ -5050,6 +5078,7 @@ static INT32 HQA_BFQdRead(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, struc
NdisMoveMemory((PUCHAR)&HqaCmdFrame->Data + 2, (PUCHAR)out, ate_ctrl->txbf_info_len);
ate_ctrl->Mode &= ~fATE_IN_BF;
os_free_mem(ate_ctrl->txbf_info);
ate_ctrl->txbf_info = NULL;
HQA_BF_QD_READ_FAIL:
if (cmd)
os_free_mem(cmd);
@ -6258,7 +6287,7 @@ static INT32 hqa_start_tx_ext(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *wrq, s
UCHAR *data = cmd_frame->Data;
struct _HQA_EXT_TXV param;
ATE_TXPOWER TxPower;
UINT32 Channel = 0, Ch_Band = 0, SysBw = 0, PktBw = 0;
UINT32 Channel = 0, Ch_Band = 0, SysBw = 0, PktBw = 0, ipg = 0;
len = PKTS_TRAN_TO_HOST(cmd_frame->Length);
EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, (UCHAR *)&param.ext_id);
@ -6301,6 +6330,7 @@ static INT32 hqa_start_tx_ext(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *wrq, s
Ch_Band = TESTMODE_GET_PARAM(ate_ctrl, band_idx, Ch_Band);
PktBw = TESTMODE_GET_PARAM(ate_ctrl, band_idx, PerPktBW);
SysBw = TESTMODE_GET_PARAM(ate_ctrl, band_idx, BW);
ipg = TESTMODE_GET_PARAM(ate_ctrl, band_idx, ipg_param.ipg);
ate_ctrl->control_band_idx = (UCHAR)band_idx;
if (param.rate == 32 && PktBw != BAND_WIDTH_40 && SysBw != BAND_WIDTH_40) {
@ -6316,7 +6346,7 @@ static INT32 hqa_start_tx_ext(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *wrq, s
TxPower.Dbdc_idx = band_idx;
TxPower.Band_idx = Ch_Band;
ret = ate_ops->SetTxPower0(pAd, TxPower);
ret = ate_ops->SetIPG(pAd);
ret = ate_ops->SetIPG(pAd, ipg);
ret = ate_ops->StartTx(pAd);
err0:
NdisMoveMemory(cmd_frame->Data + 2, (UCHAR *)&param.ext_id, sizeof(param.ext_id));
@ -6464,11 +6494,12 @@ static INT32 hqa_iBFGetStatus_ext(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *wr
u4Status = ate_ctrl->iBFCalStatus;
ate_ctrl->Mode &= ~fATE_IN_BF;
os_free_mem(ate_ctrl->txbf_info);
ate_ctrl->txbf_info = NULL;
/* MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF,("%s, val:%x\n", __FUNCTION__, u4Status)); */
ext_id = PKTL_TRAN_TO_HOST(ext_id);
u4Status = PKTL_TRAN_TO_HOST(u4Status);
NdisMoveMemory(cmd_frame->Data + 2, (UCHAR *)&ext_id, sizeof(ext_id));
NdisMoveMemory(cmd_frame->Data + 6, &u4Status, 4);
NdisMoveMemory(cmd_frame->Data + 6, (UCHAR *)&u4Status, 4);
HQA_TAG_DNC_FAIL:
ResponseToQA(cmd_frame, wrq, 10, ret);
return ret;

View File

@ -39,13 +39,21 @@
#endif
#ifdef CONFIG_AP_SUPPORT
#ifdef INTELP6_SUPPORT
#define DEFAULT_BIN_FILE "/nvram/MT7615_EEPROM_2G.bin"
#else
#define DEFAULT_BIN_FILE "/etc_ro/wlan/MT7615E_EEPROM1.bin"
#endif
#else
#define DEFAULT_BIN_FILE "/etc/MT7615E_EEPROM1.bin"
#endif /* CONFIG_AP_SUPPORT */
#ifdef CONFIG_RT_SECOND_CARD
#ifdef INTELP6_SUPPORT
#define SECOND_BIN_FILE "/nvram/MT7615_EEPROM_5G.bin"
#else
#define SECOND_BIN_FILE "/etc_ro/wlan/MT7615E_EEPROM2.bin"
#endif
#endif /* CONFIG_RT_SECOND_CARD */
#ifdef CONFIG_RT_THIRD_CARD
#define THIRD_BIN_FILE "/etc_ro/wlan/MT7615E_EEPROM3.bin"
@ -56,6 +64,12 @@ extern RBIST_DESC_T MT7615_SPECTRUM_DESC[];
extern UINT8 MT7615_SpectrumBankNum;
#endif /* WIFI_SPECTRUM_SUPPORT */
#ifdef CONFIG_RECOVERY_ON_INTERRUPT_MISS
#ifdef INTELP6_SUPPORT
INT RecoveryCount[MAX_NUM_OF_INF] = {0};
#endif
#endif
UCHAR mt7615_ba_range[] = {4, 8, 12, 24, 36, 48, 54, 64};
@ -621,15 +635,7 @@ static void mt7615_switch_channel(RTMP_ADAPTER *pAd, MT_SWITCH_CHANNEL_CFG SwChC
#ifdef PRE_CAL_TRX_SET1_SUPPORT
mt7615_apply_cal_data(pAd, SwChCfg);
#endif /* PRE_CAL_TRX_SET1_SUPPORT */
if (SwChCfg.Bw == BW_8080) {
if ((SwChCfg.ControlChannel2 - SwChCfg.CentralChannel) == 16 ||
(SwChCfg.CentralChannel - SwChCfg.ControlChannel2) == 16) {
SwChCfg.Bw = BW_160;
SwChCfg.CentralChannel = (SwChCfg.CentralChannel + SwChCfg.ControlChannel2)/2;
SwChCfg.ControlChannel2 = 0;
}
}
/*In Case of BW8080 Continous/NonContinous Channels of 80+80 is allowed by ACS*/
MtCmdChannelSwitch(pAd, SwChCfg);
@ -1551,9 +1557,27 @@ void mt7615_heart_beat_check(RTMP_ADAPTER *pAd)
UINT8 n9_detect = FALSE;
RTMP_STRING *str = NULL;
UINT32 RestoreValue;
#ifdef CONFIG_RECOVERY_ON_INTERRUPT_MISS
#ifdef INTELP6_SUPPORT
UINT idx = multi_inf_get_idx(pAd);
#endif
#endif
if (((pAd->Mlme.PeriodicRound % HEART_BEAT_CHECK_PERIOD) == 0)
#ifdef CONFIG_RECOVERY_ON_INTERRUPT_MISS
#ifdef INTELP6_SUPPORT
|| (pAd->ErrRecoveryCheck != RecoveryCount[idx])
#endif
#endif
if ((pAd->Mlme.PeriodicRound % HEART_BEAT_CHECK_PERIOD) == 0) {
) {
#ifdef CONFIG_RECOVERY_ON_INTERRUPT_MISS
#ifdef INTELP6_SUPPORT
if (pAd->ErrRecoveryCheck != RecoveryCount[idx]) {
RecoveryCount[idx] = pAd->ErrRecoveryCheck;
goto recoverycheck;
}
#endif
#endif
if (pAd->heart_beat_stop == TRUE)
return;
@ -1586,6 +1610,13 @@ void mt7615_heart_beat_check(RTMP_ADAPTER *pAd)
str = "N9 heart beat stop!!\n";
else if (cr4_detect)
str = "CR4 heart beat stop!!\n";
#ifdef CONFIG_RECOVERY_ON_INTERRUPT_MISS
#ifdef INTELP6_SUPPORT
recoverycheck:
if (pAd->ErrRecoveryCheck > 5)
str = "IntelP6 PCI stop!!\n";
#endif
#endif
if (str != NULL) {
pAd->heart_beat_stop = TRUE;
@ -2132,20 +2163,20 @@ UCHAR *mt7615_get_default_bin_image_file(RTMP_ADAPTER *pAd)
("Use %dst %s default bin.\n", multi_inf_get_idx(pAd), DEFAULT_BIN_FILE));
return DEFAULT_BIN_FILE;
}
#if defined(MT_SECOND_CARD)
#if defined(CONFIG_RT_SECOND_CARD)
else if (multi_inf_get_idx(pAd) == 1) {
MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF,
("Use %dst %s default bin.\n", multi_inf_get_idx(pAd), SECOND_BIN_FILE));
return SECOND_BIN_FILE;
}
#endif /* MT_SECOND_CARD */
#if defined(MT_THIRD_CARD)
#endif /* CONFIG_RT_SECOND_CARD */
#if defined(CONFIG_RT_THIRD_CARD)
else if (multi_inf_get_idx(pAd) == 2) {
MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF,
("Use %dst %s default bin.\n", multi_inf_get_idx(pAd), THIRD_BIN_FILE));
return THIRD_BIN_FILE;
}
#endif /* MT_THIRD_CARD */
#endif /* CONFIG_RT_THIRD_CARD */
else
#endif /* MULTI_INF_SUPPORT */
{
@ -2541,6 +2572,10 @@ static VOID mt7615_chipCap_init(RTMP_ADAPTER *pAd, BOOLEAN b11nOnly, BOOLEAN bTh
MT7615_ChipCap.num_of_tx_ring = 2;
MT7615_ChipCap.num_of_rx_ring = 2;
#ifdef BCN_V2_SUPPORT /* add bcn v2 support , 1.5k beacon support */
MT7615_ChipCap.max_v2_bcn_num = 16;
#endif
MT7615_ChipCap.tx_ring_size = 1024;
MT7615_ChipCap.rx0_ring_size = 1024;
MT7615_ChipCap.rx1_ring_size = 512;
@ -2549,6 +2584,7 @@ static VOID mt7615_chipCap_init(RTMP_ADAPTER *pAd, BOOLEAN b11nOnly, BOOLEAN bTh
#ifdef RTMP_MAC_PCI
MT7615_ChipCap.WPDMABurstSIZE = 3;
#endif
MT7615_ChipCap.ProbeRspTimes = 2;
MT7615_ChipCap.SnrFormula = SNR_FORMULA4;
MT7615_ChipCap.FlgIsHwWapiSup = TRUE;
MT7615_ChipCap.FlgIsHwAntennaDiversitySup = FALSE;
@ -2592,6 +2628,8 @@ static VOID mt7615_chipCap_init(RTMP_ADAPTER *pAd, BOOLEAN b11nOnly, BOOLEAN bTh
MT7615_ChipCap.asic_caps |= fASIC_CAP_PCIE_ASPM_DYM_CTRL;
#endif /* PCIE_ASPM_DYM_CTRL_SUPPORT */
MT7615_ChipCap.asic_caps |= fASIC_CAP_ADV_SECURITY;
if (b11nOnly) {
MT7615_ChipCap.phy_caps = (fPHY_CAP_24G | fPHY_CAP_5G | \
fPHY_CAP_HT | \
@ -2663,7 +2701,7 @@ static VOID mt7615_chipCap_init(RTMP_ADAPTER *pAd, BOOLEAN b11nOnly, BOOLEAN bTh
MT7615_ChipCap.max_amsdu_len = MPDU_7991_OCTETS;
MT7615_ChipCap.ht_max_ampdu_len_exp = 3;
#ifdef DOT11_VHT_AC
MT7615_ChipCap.max_mpdu_len = MPDU_11454_OCTETS;
MT7615_ChipCap.max_mpdu_len = MPDU_7991_OCTETS;
MT7615_ChipCap.vht_max_ampdu_len_exp = 7;
#endif /* DOT11_VHT_AC */
MT7615_ChipCap.default_txop = 0x60;
@ -2900,6 +2938,16 @@ VOID mt7615_init(RTMP_ADAPTER *pAd)
#ifdef DOT11W_PMF_SUPPORT
pChipCap->FlgPMFEncrtptMode = PMF_ENCRYPT_MODE_2;
#endif /* DOT11W_PMF_SUPPORT */
#ifdef CUSTOMER_RSG_FEATURE
pAd->EnableChannelStatsCheck = FALSE;
NdisZeroMemory(&pAd->RadioStatsCounter, sizeof(RADIO_STATS_COUNTER));
#endif
#ifdef CUSTOMER_DCC_FEATURE
pAd->ApEnableBeaconTable = FALSE;
pAd->CommonCfg.channelSwitch.CHSWMode = NORMAL_MODE;
pAd->CommonCfg.channelSwitch.CHSWCount = 0;
pAd->CommonCfg.channelSwitch.CHSWPeriod = 5;
#endif
/* For calibration log buffer size limitation issue */
pAd->fgQAtoolBatchDumpSupport = TRUE;
#ifdef RED_SUPPORT
@ -2948,6 +2996,10 @@ INT Mt7615AsicArchOpsInit(RTMP_ADAPTER *pAd)
#ifdef HTC_DECRYPT_IOT
arch_ops->archSetWcidAAD_OM = MtAsicSetWcidAAD_OMByFw;
#endif /* HTC_DECRYPT_IOT */
#ifdef MBSS_AS_WDS_AP_SUPPORT
arch_ops->archSetWcid4Addr_HdrTrans = MtAsicSetWcid4Addr_HdrTransByFw;
#endif
arch_ops->archAddRemoveKeyTab = MtAsicAddRemoveKeyTabByFw;
#ifdef BCN_OFFLOAD_SUPPORT
arch_ops->archEnableBeacon = NULL;
@ -3044,6 +3096,10 @@ INT Mt7615AsicArchOpsInit(RTMP_ADAPTER *pAd)
#ifdef IGMP_SNOOP_SUPPORT
arch_ops->archMcastEntryInsert = CmdMcastEntryInsert;
arch_ops->archMcastEntryDelete = CmdMcastEntryDelete;
#ifdef IGMP_TVM_SUPPORT
arch_ops->archMcastConfigAgeout = CmdSetMcastEntryAgeOut;
arch_ops->archMcastGetMcastTable = CmdGetMcastEntryTable;
#endif /* IGMP_TVM_SUPPORT */
#endif
arch_ops->write_txp_info = mtd_write_txp_info_by_cr4;
arch_ops->write_tmac_info_fixed_rate = mtd_write_tmac_info_fixed_rate;

View File

@ -244,6 +244,10 @@ static INT32 chip_dump_mib_info(struct hdev_ctrl *ctrl, RTMP_STRING *arg)
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("===Tx Related Counters(Generic)===\n"));
RTMP_IO_READ32(pAd, MIB_M0SDR0 + band_offset, &mac_val);
#ifdef CUSTOMER_RSG_FEATURE
pAd->RadioStatsCounter.TotalBeaconSentCount += (mac_val & 0xffff);
pAd->RadioStatsCounter.TotalTxCount += (mac_val & 0xffff);
#endif
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\tBeaconTxCnt=0x%x\n", (mac_val & 0xffff)));
RTMP_IO_READ32(pAd, MIB_M0DR0 + band_offset, &mac_val);
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\tTx 20MHz Cnt=0x%x\n", mac_val & 0xffff));
@ -295,6 +299,9 @@ static INT32 chip_dump_mib_info(struct hdev_ctrl *ctrl, RTMP_STRING *arg)
RTMP_IO_READ32(pAd, MIB_M0SDR11 + band_offset, &mac_val);
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\tRxLenMismatch=0x%x\n", (mac_val & 0xffff)));
RTMP_IO_READ32(pAd, MIB_M0SDR5 + band_offset, &mac_val);
#ifdef CUSTOMER_RSG_FEATURE
pAd->RadioStatsCounter.TotalRxCount += (mac_val & 0xffff);
#endif
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\tRxMPDUCnt=0x%x\n", (mac_val & 0xffff)));
RTMP_IO_READ32(pAd, MIB_M0SDR29 + band_offset, &mac_val);
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\tPFDropCnt=0x%x\n", (mac_val & 0x00ff)));

View File

@ -651,6 +651,30 @@ void mt7622_get_tx_pwr_info(RTMP_ADAPTER *pAd)
}
static UCHAR get_subid(void)
{
UCHAR subid = 0;
ULONG sysEfuseAddr = 0;
UINT32 sysEfuseVal = 0;
sysEfuseAddr = (ULONG)ioremap(0x1020682c, 4);
sysEfuseVal = (UINT32)ioread32((void *)sysEfuseAddr);
iounmap((void *)sysEfuseAddr);
if (((sysEfuseVal & 0xf000) >> 12) != 0)
subid = (sysEfuseVal & 0xf000) >> 12;
else if (((sysEfuseVal & 0xf00) >> 8) != 0)
subid = (sysEfuseVal & 0xf00) >> 8;
else if (((sysEfuseVal & 0xf0) >> 4) != 0)
subid = (sysEfuseVal & 0xf0) >> 4;
else
subid = 2;
MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("read sub id = %x\n", subid));
return subid;
}
static void mt7622_antenna_default_reset(
struct _RTMP_ADAPTER *pAd,
EEPROM_ANTENNA_STRUC *pAntenna)
@ -664,6 +688,11 @@ static void mt7622_antenna_default_reset(
pAntenna->field.TxPath = (pAd->EEPROMDefaultValue[EEPROM_NIC_CFG1_OFFSET] >> 4) & 0x0F;
pAntenna->field.RxPath = pAd->EEPROMDefaultValue[EEPROM_NIC_CFG1_OFFSET] & 0x0F;
#endif /* TXBF_SUPPORT */
if (get_subid() == 0x4) {
pAntenna->field.TxPath = 2;
pAntenna->field.RxPath = 2;
}
}
@ -800,17 +829,6 @@ static void mt7622_host_resume_done_ack(
#endif /* HOST_RESUME_DONE_ACK_SUPPORT */
#ifdef RF_LOCKDOWN
static UINT32 ICAL[] = {0x53, 0x54, 0x55, 0x56, 0x57, 0x5c, 0x5d, 0x62, 0x63, 0x68, 0x69,
0x6e, 0x6f, 0x73, 0x74, 0x78, 0x79, 0x82, 0x83, 0x87,
0x88, 0x8c, 0x8d, 0x91, 0x92, 0x96, 0x97, 0x9b, 0x9c, 0xa0, 0xa1,
0xaa, 0xab, 0xaf, 0xb0, 0xb4, 0xb5, 0xb9, 0xba, 0xf4,
0xf7, 0xff, 0x140, 0x141, 0x145, 0x146, 0x14a, 0x14b,
0x154, 0x155, 0x159, 0x15a, 0x15e, 0x15f, 0x163, 0x164, 0x168, 0x169,
0x16d, 0x16e, 0x172, 0x173, 0x17c, 0x17d, 0x181, 0x182,
0x186, 0x187, 0x18b, 0x18c
}; /* check and merge */
static UINT32 ICAL_NUM = (sizeof(ICAL) / sizeof(UINT32));
static UINT32 ICAL_JUST_MERGE[] = {0x118, 0x1b5, 0x1b6, 0x1b7, 0x3ac, 0x3ad, 0x3ae, 0x3af, 0x3b0, 0x3b1, 0x3b2}; /* merge but nott check */
static UINT32 ICAL_JUST_MERGE_NUM = (sizeof(ICAL_JUST_MERGE) / sizeof(UINT32));
@ -1464,6 +1482,9 @@ static VOID mt7622_chipCap_init(void)
MT7622_ChipCap.g_band_256_qam = TRUE;
#endif
#endif /* DOT11_VHT_AC */
#ifdef BCN_V2_SUPPORT /* add bcn v2 support , 1.5k beacon support */
MT7622_ChipCap.max_v2_bcn_num = 16;
#endif
MT7622_ChipCap.TXWISize = sizeof(TMAC_TXD_L);
MT7622_ChipCap.RXWISize = 28;
MT7622_ChipCap.tx_hw_hdr_len = MT7622_ChipCap.TXWISize;
@ -1520,7 +1541,12 @@ static VOID mt7622_chipCap_init(void)
MT7622_ChipCap.FlgHwTxBfCap = TXBF_HW_CAP;
#endif
MT7622_ChipCap.SnrFormula = SNR_FORMULA4;
MT7622_ChipCap.max_nss = 4;
if (get_subid() == 0x4) {
MT7622_ChipCap.max_nss = 2;
MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_INFO, ("7622D found!\n"));
} else {
MT7622_ChipCap.max_nss = 4;
}
/* todo Ellis */
#ifdef RTMP_EFUSE_SUPPORT
MT7622_ChipCap.EFUSE_USAGE_MAP_START = 0x3c0;
@ -1538,6 +1564,7 @@ static VOID mt7622_chipCap_init(void)
#ifdef RTMP_MAC_PCI
MT7622_ChipCap.WPDMABurstSIZE = 3;
#endif
MT7622_ChipCap.ProbeRspTimes = 2;
#ifdef NEW_MBSSID_MODE
#ifdef ENHANCE_NEW_MBSSID_MODE
MT7622_ChipCap.MBSSIDMode = MBSSID_MODE4;
@ -1637,6 +1664,8 @@ static VOID mt7622_chipCap_init(void)
MT7622_ChipCap.ba_range = mt7622_ba_range;
MT7622_ChipCap.txd_type = TXD_V1;
MT7622_ChipCap.tx_delay_support = TRUE;
MT7622_ChipCap.asic_caps |= fASIC_CAP_ADV_SECURITY;
}
static VOID mt7622_chipOp_init(void)
@ -2151,6 +2180,10 @@ INT Mt7622AsicArchOpsInit(RTMP_ADAPTER *pAd)
#ifdef HTC_DECRYPT_IOT
arch_ops->archSetWcidAAD_OM = MtAsicSetWcidAAD_OMByFw;
#endif /* HTC_DECRYPT_IOT */
#ifdef MBSS_AS_WDS_AP_SUPPORT
arch_ops->archSetWcid4Addr_HdrTrans = MtAsicSetWcid4Addr_HdrTransByFw;
#endif
arch_ops->archAddRemoveKeyTab = MtAsicAddRemoveKeyTabByFw;
#ifdef BCN_OFFLOAD_SUPPORT
/* sync with Carter, wilsonl */
@ -2222,6 +2255,10 @@ INT Mt7622AsicArchOpsInit(RTMP_ADAPTER *pAd)
#ifdef IGMP_SNOOP_SUPPORT
arch_ops->archMcastEntryInsert = MulticastFilterTableInsertEntry;
arch_ops->archMcastEntryDelete = MulticastFilterTableDeleteEntry;
#ifdef IGMP_TVM_SUPPORT
arch_ops->archMcastConfigAgeout = MulticastFilterConfigAgeOut;
arch_ops->archMcastGetMcastTable = MulticastFilterGetMcastTable;
#endif /* IGMP_TVM_SUPPORT */
#endif
arch_ops->write_txp_info = mtd_write_txp_info_by_host;
arch_ops->write_tmac_info_fixed_rate = mtd_write_tmac_info_fixed_rate;

View File

@ -100,6 +100,11 @@ config TPC_SUPPORT
depends on WIFI_DRIVER
default y
config TXRX_STAT_SUPPORT
bool "TxRx Stats Support"
depends on WIFI_DRIVER
default n
config ICAP_SUPPORT
bool "ICAP Support"
depends on WIFI_DRIVER
@ -126,7 +131,11 @@ config MT_DFS_SUPPORT
bool "Dynamic Frequency Selection Support"
depends on WIFI_DRIVER
default y
config MTK_OFFCHANNEL_SCAN_FEATURE
bool "Channel Quality Monitor"
depends on MTK_WIFI_DRIVER
depends on MTK_MT_AP_SUPPORT
default n
#config WFA_VHT_R2_PF
# bool "WFA VHT R2 Plugfest"
# depends on DOT11_VHT_AC
@ -225,7 +234,6 @@ config MBO_SUPPORT
select DOT11K_RRM_SUPPORT
select DOT11R_FT_SUPPORT
select DOT11W_PMF_SUPPORT
select PASSPOINT_R2
default n
#config CARRIER_DETECTION_SUPPORT
@ -305,7 +313,12 @@ config PRE_CAL_TRX_SET2_SUPPORT
bool "Pre-calibration to Flash Support"
depends on WIFI_DRIVER
default y
config CAL_BIN_FILE_SUPPORT
bool "Calibration to BinFile Support"
depends on WIFI_DRIVER
default y
config RF_LOCKDOWN_SUPPORT
bool "RF Lockdown Support"
depends on WIFI_DRIVER
@ -316,6 +329,11 @@ config LINK_TEST_SUPPORT
depends on WIFI_DRIVER
default y
config WIFI_EAP_FEATURE
bool "EAP Feature Support"
depends on WIFI_DRIVER
default y
#config LED_CONTROL_SUPPORT
# bool "LED Support"
# depends on WIFI_DRIVER
@ -470,11 +488,11 @@ menu "WiFi Operation Modes"
endchoice
if WIFI_MODE_AP || WIFI_MODE_BOTH
source "drivers/net/wireless/mt_wifi_ap/Kconfig"
source "drivers/net/wireless/mtk/mt7615e/mt_wifi_ap/Kconfig"
endif
if WIFI_MODE_STA || WIFI_MODE_BOTH
source "drivers/net/wireless/mt_wifi_sta/Kconfig"
source "drivers/net/wireless/mtk/mt7615e/mt_wifi_sta/Kconfig"
endif
endmenu

View File

@ -71,6 +71,70 @@ PLATFORM = PC
#PLATFORM = MT7622
endif
ifeq ($(PLATFORM),INTELP6)
ifndef TARG_ARCH
export TARG_ARCH=intel_gen3-linux
endif
ifndef BUILD_ROOT
export BUILD_ROOT=$(PWD)/../../..
endif
ifndef BUILD_DEST
export BUILD_DEST=$(BUILD_ROOT)/$(BUILD_DIR)/
endif
ifndef HOST_CC
export HOST_CC=gcc
endif
ifeq ($(TARG_ARCH),intel_gen3-linux)
BUILD_DIR=build_i686/staging_dir
HOST=LINUX
TARGET=LINUX
BUILD=LINUX
CROSS_COMPILE=$(BUILD_DEST)/bin/i686-cm-linux-
endif
export HOST
export TARGET
export BUILD
export CROSS_COMPILE
ifdef TARGETCC
export CC=$(TARGETCC)
export LD=$(TARGETLD)
export AR=$(TARGETAR)
export AR_RC=$(TARGETAR) rc
export STRIP=$(TARGETSTRIP)
export CXX=$(TARGETCXX)
export RANLIB=$(TARGETRANLIB)
export STRINGS=$(TARGETSTRINGS)
export M4=$(TARGETM4)
export BISON=$(TARGETBISON)
export YACC=$(TARGETYACC)
else
export CC=$(CROSS_COMPILE)gcc
export LD=$(CROSS_COMPILE)ld
export AR=$(CROSS_COMPILE)ar
export AR_RC=$(CROSS_COMPILE)ar rc
export STRIP=$(CROSS_COMPILE)strip
export CXX=$(CROSS_COMPILE)g++
export RANLIB=$(CROSS_COMPILE)ranlib
export STRINGS=$(CROSS_COMPILE)strings
export M4=$(CROSS_COMPILE)m4
export BISON=$(CROSS_COMPILE)bison
export YACC=$(CROSS_COMPILE)yacc
endif
ifndef TARGETDEST
export TARGETDEST = $(BUILD_ROOT)/project_build_i686/IntelCE/
endif
ifndef FSROOT
export FSROOT = $(TARGETDEST)/root/
endif
ifndef KERNEL_VER
export KERNEL_VER=linux-2.6.28
endif
ifndef KERNEL_DIR
export KERNEL_DIR=$(BUILD_DEST)/kernel/$(KERNEL_VER)
endif
endif
#APSOC
ifeq ($(CHIPSET),mt7628)
PLATFORM = MT7628
@ -185,8 +249,8 @@ CROSS_COMPILE =
endif
ifeq ($(PLATFORM),INTELP6)
LINUX_SRC = /tftpboot/IntelCE-20.0.11052.243193/project_build_i686/IntelCE/kernel-20.0.11024.238456/linux-2.6.35
CROSS_COMPILE = /tftpboot/IntelCE-20.0.11052.243193/build_i686/i686-linux-elf/bin/i686-cm-linux-
LINUX_SRC = $(KERNEL_DIR)
CROSS_COMPILE =
endif
ifeq ($(PLATFORM),IXP)
@ -454,6 +518,12 @@ ifeq ($(TARGET), LINUX)
cp -f $(RT28xx_OS_DIR)/linux/Makefile.clean $(RT28xx_OS_DIR)/linux/Makefile
$(MAKE) -C $(RT28xx_OS_DIR)/linux clean
rm -rf $(RT28xx_OS_DIR)/linux/Makefile
ifeq ($(PLATFORM),INTELP6)
rm -rf $(BUILD_DEST)/etc/Wireless/7615AP/
rm -rf $(FSROOT)/etc/Wireless/7615AP/
rm -rf $(BUILD_DEST)/lib/modules/wifi/mt7615e_ap.ko
rm -rf $(FSROOT)/lib/modules/wifi/mt7615e_ap.ko
endif
endif
ifeq ($(TARGET), UCOS)
$(MAKE) -C $(RT28xx_OS_DIR)/ucos clean MODE=$(RT28xx_MODE)

File diff suppressed because it is too large Load Diff

View File

@ -38,6 +38,10 @@ extern UCHAR WME_PARM_ELEM[];
extern UCHAR RALINK_OUI[];
extern UCHAR BROADCOM_OUI[];
#ifdef IGMP_TVM_SUPPORT
extern UCHAR IGMP_TVM_OUI[];
#endif /* IGMP_TVM_SUPPORT */
@ -104,7 +108,7 @@ static USHORT update_associated_mac_entry(
#ifdef RT_CFG80211_SUPPORT
|| wdev->IsCFG1xWdev
#endif /* RT_CFG80211_SUPPORT */
#ifdef WSC_INCLUDED
#if defined(WSC_INCLUDED) || defined(RT_CFG80211_SUPPORT)
|| (pEntry->bWscCapable && IS_AKM_WPA_CAPABILITY_Entry(wdev))
#endif /* WSC_INCLUDED */
)
@ -177,7 +181,12 @@ static USHORT update_associated_mac_entry(
/* 40Mhz BSS Width Trigger events */
#ifdef BW_VENDOR10_CUSTOM_FEATURE
/* Soft AP to follow BW of Root AP */
if ((IS_APCLI_BW_SYNC_FEATURE_ENBL(pAd) == FALSE) && ie_list->HTCapability.HtCapInfo.Forty_Mhz_Intolerant) {
#else
if (ie_list->HTCapability.HtCapInfo.Forty_Mhz_Intolerant) {
#endif
#ifdef DOT11N_DRAFT3
UCHAR op_ht_bw = wlan_operate_get_ht_bw(wdev);
UCHAR cfg_ht_bw = wlan_config_get_ht_bw(wdev);
@ -389,7 +398,10 @@ static USHORT update_associated_mac_entry(
others - association failed due to resource issue
==========================================================================
*/
static USHORT APBuildAssociation(
#ifndef HOSTAPD_11R_SUPPORT
static
#endif /* HOSTAPD_11R_SUPPORT */
USHORT APBuildAssociation(
IN RTMP_ADAPTER * pAd,
IN MAC_TABLE_ENTRY * pEntry,
IN IE_LISTS * ie_list,
@ -408,6 +420,9 @@ static USHORT APBuildAssociation(
PUINT8 pPmkid = NULL;
UINT8 pmkid_count = 0;
#endif /*CONFIG_OWE_SUPPORT*/
#ifdef RATE_PRIOR_SUPPORT
PBLACK_STA pBlackSta = NULL;
#endif/*RATE_PRIOR_SUPPORT*/
if (!pEntry)
return MLME_UNSPECIFY_FAIL;
@ -442,6 +457,28 @@ static USHORT APBuildAssociation(
#endif /* DOT11_VHT_AC */
#ifdef RATE_PRIOR_SUPPORT
if (pAd->LowRateCtrl.RatePrior) {
if (wdev->channel < 14 && ie_list->ht_cap_len == 0)
return MLME_UNSPECIFY_FAIL;
#ifdef DOT11_VHT_AC
if (wdev->channel > 14 && ie_list->vht_cap_len == 0)
return MLME_UNSPECIFY_FAIL;
#endif /* DOT11_VHT_AC */
RTMP_SEM_LOCK(&pAd->LowRateCtrl.BlackListLock);
DlListForEach(pBlackSta, &pAd->LowRateCtrl.BlackList, BLACK_STA, List) {
if (NdisCmpMemory(pBlackSta->Addr, pEntry->Addr, MAC_ADDR_LEN) == 0) {
MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF,
("Reject blk sta: %02x:%02x:%02x:%02x:%02x:%02x\n", PRINT_MAC(pBlackSta->Addr)));
RTMP_SEM_UNLOCK(&pAd->LowRateCtrl.BlackListLock);
return MLME_UNSPECIFY_FAIL;
}
}
RTMP_SEM_UNLOCK(&pAd->LowRateCtrl.BlackListLock);
}
#endif /*RATE_PRIOR_SUPPORT*/
if ((pEntry->Sst == SST_AUTH) || (pEntry->Sst == SST_ASSOC)) {
/* TODO:
should qualify other parameters, for example -
@ -469,17 +506,34 @@ static USHORT APBuildAssociation(
&pEntry->SecConfig,
&ie_list->RSN_IE[0],
ie_list->RSNIE_Len);
#ifdef DOT11_SAE_SUPPORT
{
INT cacheidx;
if ((StatusCode == MLME_SUCCESS)
&& IS_AKM_WPA3PSK(pEntry->SecConfig.AKMMap)
&& (is_rsne_pmkid_cache_match(ie_list->RSN_IE,
ie_list->RSNIE_Len,
&pAd->ApCfg.PMKIDCache,
pEntry->func_tb_idx,
pEntry->Addr,
&cacheidx))
&& (cacheidx == INVALID_PMKID_IDX))
StatusCode = MLME_INVALID_PMKID;
}
#endif /* DOT11_SAE_SUPPORT */
#ifdef CONFIG_OWE_SUPPORT
StatusCode = owe_pmkid_ecdh_process(pAd,
pEntry,
StatusCode,
ie_list->RSN_IE,
ie_list->RSNIE_Len,
&ie_list->ecdh_ie,
ie_list->ecdh_ie.length,
pPmkid,
&pmkid_count,
SUBTYPE_ASSOC_REQ);
if ((StatusCode == MLME_SUCCESS)
&& IS_AKM_OWE(pEntry->SecConfig.AKMMap))
StatusCode = owe_pmkid_ecdh_process(pAd,
pEntry,
ie_list->RSN_IE,
ie_list->RSNIE_Len,
&ie_list->ecdh_ie,
ie_list->ecdh_ie.length,
pPmkid,
&pmkid_count,
SUBTYPE_ASSOC_REQ);
#endif /*CONFIG_OWE_SUPPORT*/
if (StatusCode != MLME_SUCCESS) {
@ -631,6 +685,34 @@ BOOLEAN IAPP_L2_Update_Frame_Send(RTMP_ADAPTER *pAd, UINT8 *mac, INT wdev_idx)
return TRUE;
} /* End of IAPP_L2_Update_Frame_Send */
#endif /* IAPP_SUPPORT */
#ifdef ASUS_AC68_FIX
static BOOLEAN ext_channel_check(
PRTMP_ADAPTER pAd,
INT len,
UCHAR *chlist,
UCHAR Channel)
{
int i;
UCHAR first_channel, last_channel = 0;
UCHAR num_of_ch;
UCHAR ext_ch;
ext_ch = (pAd->CommonCfg.RegTransmitSetting.field.EXTCHA == EXTCHA_BELOW) ?
Channel - 4 : Channel + 4;
for (i = 0; i < len; i += 2) {
first_channel = chlist[i];
num_of_ch = chlist[i+1];
/* for 5G, last = first + 4*(num_ch - 1) */
if (first_channel <= 14)
last_channel = first_channel + (num_of_ch - 1);
if (ext_ch >= first_channel && ext_ch <= last_channel)
return TRUE;
}
return FALSE;
}
#endif /* ASUS_AC68_FIX */
/*
@ -670,6 +752,13 @@ BOOLEAN PeerAssocReqCmmSanity(
#endif /* DOT11K_RRM_SUPPORT */
HT_CAPABILITY_IE *pHtCapability = &ie_lists->HTCapability;
UCHAR i;
#ifdef CONFIG_MAP_SUPPORT
unsigned char map_cap;
#endif
#ifdef ASUS_AC68_FIX
BOOLEAN isFTPossible = TRUE;
UCHAR Channel = 0, apidx;
#endif /* ASUS_AC68_FIX */
pEntry = MacTableLookup(pAd, &Fr->Hdr.Addr2[0]);
@ -806,6 +895,21 @@ BOOLEAN PeerAssocReqCmmSanity(
#endif /* MBO_SUPPORT */
#ifdef IGMP_TVM_SUPPORT
if (IS_IGMP_TVM_MODE_EN(pEntry->wdev->IsTVModeEnable)) {
if (NdisEqualMemory(eid_ptr->Octet, IGMP_TVM_OUI, 4) &&
(eid_ptr->Len == IGMP_TVM_IE_LENGTH)) {
RTMPMoveMemory(&ie_lists->tvm_ie, &eid_ptr->Eid, IGMP_TVM_IE_LENGTH+2);
break;
}
}
#endif /* IGMP_TVM_SUPPORT */
#ifdef CONFIG_MAP_SUPPORT
if (map_check_cap_ie(eid_ptr, &map_cap) == TRUE)
ie_lists->MAP_AttriValue = map_cap;
#endif /* CONFIG_MAP_SUPPORT */
case IE_WPA2:
#ifdef DOT11R_FT_SUPPORT
#endif /* DOT11R_FT_SUPPORT */
@ -1056,6 +1160,27 @@ BOOLEAN PeerAssocReqCmmSanity(
for (i = 0; i < ie_lists->SupportedChlLen; i += 2)
MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_INFO, (" [ %4d : %4d ]\n", ie_lists->SupportedChl[i],
ie_lists->SupportedChl[i + 1]));
#ifdef ASUS_AC68_FIX
/* Although regulatory or other factors may limit Fat Channel operation (in the 2.4GHz)
* as is apparent from a STA's supported channels IE, yet if the STA advertise
* 40MHz capable in its IE_HT_CAP, then its a (possible) BUG.
* ASUS AC68 STA has this issue.
* The workaround is to override 'ChannelWidth' in HT_CAP and force 20MHz association
* only for the STA.
*/
/* XXX: only 2.4GHz handled now */
for (apidx = 0; apidx < pAd->ApCfg.BssidNum; apidx++) {
if (!RtmpOSNetDevIsUp(pAd->ApCfg.MBSSID[apidx].wdev.if_dev))
continue;
Channel = pAd->ApCfg.MBSSID[apidx].wdev.channel;
break;
}
if ((Channel != 0) && (Channel <= 14) && (Channel == BW_40))
isFTPossible = ext_channel_check(pAd, eid_ptr->Len, eid_ptr->Octet, Channel);
MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE,
("40MHz can%s be supported for this association\n", isFTPossible ? "yes" : "not"));
#endif /* ASUS_AC68_FIX */
break;
case IE_WLAN_EXTENSION:
@ -1065,7 +1190,7 @@ BOOLEAN PeerAssocReqCmmSanity(
switch (*extension_id) {
case IE_EXTENSION_ID_ECDH:
#ifdef CONFIG_OWE_SUPPORT
#if defined(CONFIG_OWE_SUPPORT) || defined(HOSTAPD_OWE_SUPPORT)
{
UCHAR *ext_ie_length = (UCHAR *)eid_ptr + 1;
os_zero_mem(ie_lists->ecdh_ie.public_key, *ext_ie_length-3);
@ -1089,6 +1214,10 @@ BOOLEAN PeerAssocReqCmmSanity(
eid_ptr = (PEID_STRUCT)((UCHAR *)eid_ptr + 2 + eid_ptr->Len);
}
#ifdef ASUS_AC68_FIX
if (!isFTPossible)
pHtCapability->HtCapInfo.ChannelWidth = 0;
#endif /* ASUS_AC68_FIX */
if ((Sanity & 0x3) != 0x03) {
MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_WARN, ("%s(): - missing mandatory field\n", __func__));
@ -1099,6 +1228,17 @@ BOOLEAN PeerAssocReqCmmSanity(
return TRUE;
}
#ifdef CONFIG_MAP_SUPPORT
static BOOLEAN is_controller_found(struct wifi_dev *wdev)
{
struct map_vendor_ie *ie = (struct map_vendor_ie *)wdev->MAPCfg.vendor_ie_buf;
if (ie->connectivity_to_controller)
return TRUE;
return FALSE;
}
#endif
VOID ap_cmm_peer_assoc_req_action(
IN PRTMP_ADAPTER pAd,
@ -1131,11 +1271,9 @@ VOID ap_cmm_peer_assoc_req_action(
#endif /* DBG */
UCHAR SubType;
BOOLEAN bACLReject = FALSE;
PUINT8 pPmkid = NULL;
UINT8 pmkid_count = 0;
#ifdef DOT11R_FT_SUPPORT
PFT_CFG pFtCfg = NULL;
FT_INFO FtInfoBuf;
FT_INFO FtInfoBuf = {0};
#endif /* DOT11R_FT_SUPPORT */
#ifdef WSC_AP_SUPPORT
WSC_CTRL *wsc_ctrl;
@ -1152,13 +1290,21 @@ VOID ap_cmm_peer_assoc_req_action(
#ifdef MBO_SUPPORT
BOOLEAN bMboReject = FALSE;
#endif /* MBO_SUPPORT */
#ifdef WAPP_SUPPORT
UINT8 wapp_cnnct_stage = WAPP_ASSOC;
UINT16 wapp_assoc_fail = NOT_FAILURE;
#endif /* WAPP_SUPPORT */
/* disallow new association */
if (pAd->ApCfg.BANClass3Data == TRUE) {
MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE,
("Disallow new Association\n"));
return;
#ifdef WAPP_SUPPORT
wapp_assoc_fail = DISALLOW_NEW_ASSOCI;
#endif /* WAPP_SUPPORT */
goto assoc_check;
}
/* allocate memory */
@ -1167,7 +1313,10 @@ VOID ap_cmm_peer_assoc_req_action(
if (ie_list == NULL) {
MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR,
("%s(): mem alloc failed\n", __func__));
return;
#ifdef WAPP_SUPPORT
wapp_assoc_fail = MLME_NO_RESOURCE;
#endif /* WAPP_SUPPORT */
goto assoc_check;
}
NdisZeroMemory(ie_list, sizeof(IE_LISTS));
@ -1203,6 +1352,55 @@ VOID ap_cmm_peer_assoc_req_action(
goto LabelOK;
}
/* WPS_BandSteering Support */
#if defined(BAND_STEERING) && defined(WSC_INCLUDED)
if (pAd->ApCfg.BandSteering) {
PWSC_CTRL pWscControl = NULL;
PBND_STRG_CLI_ENTRY cli_entry = NULL;
PBND_STRG_CLI_TABLE table = NULL;
PWPS_WHITELIST_ENTRY wps_entry = NULL;
PBS_LIST_ENTRY bs_whitelist_entry = NULL;
pWscControl = &pAd->ApCfg.MBSSID[wdev->func_idx].WscControl;
table = Get_BndStrgTable(pAd, wdev->func_idx);
if (table && table->bEnabled) {
cli_entry = BndStrg_TableLookup(table, pEntry->Addr);
wps_entry = FindWpsWhiteListEntry(&table->WpsWhiteList, pEntry->Addr);
/* WPS: special WIN7 case: no wps/rsn ie in assoc */
/* and send eapol start, consider it as wps station */
if ((ie_list->RSNIE_Len == 0) && (IS_AKM_WPA_CAPABILITY_Entry(wdev))
&& (pWscControl->WscConfMode != WSC_DISABLE))
ie_list->bWscCapable = TRUE;
/* in case probe did not have wps ie, but assoc has, create wps whitelist entry here */
if (!wps_entry && ie_list->bWscCapable && pWscControl->bWscTrigger) {
NdisAcquireSpinLock(&table->WpsWhiteListLock);
AddWpsWhiteList(&table->WpsWhiteList, pEntry->Addr);
NdisReleaseSpinLock(&table->WpsWhiteListLock);
MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("channel %u: WPS Assoc req: STA %02x:%02x:%02x:%02x:%02x:%02x wps whitelisted\n",
table->Channel, PRINT_MAC(pEntry->Addr)));
BND_STRG_PRINTQAMSG(table, pEntry->Addr, ("ASSOC STA %02x:%02x:%02x:%02x:%02x:%02x channel %u added in WPS Whitelist\n",
PRINT_MAC(pEntry->Addr), table->Channel));
}
bs_whitelist_entry = FindBsListEntry(&table->WhiteList, pEntry->Addr);
/* handle case: where a client has wps ie in probe, not have bndstrg entry/bndstrg whitelist, */
/* but doing normal assoc: dont allow */
if ((pWscControl->bWscTrigger) && (!cli_entry) && (!ie_list->bWscCapable) && (!bs_whitelist_entry)) {
MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("\n%s():reject assoc:bWscTrigger:%d, cli_entry:%p,bWscCapable:%d, bs_whitelist_entry:%p\n",
__func__, pWscControl->bWscTrigger, cli_entry, ie_list->bWscCapable, bs_whitelist_entry));
BND_STRG_PRINTQAMSG(table, pEntry->Addr, ("STA %02x:%02x:%02x:%02x:%02x:%02x Normal Assoc Rejected for BS unauthorized client\n",
PRINT_MAC(pEntry->Addr)));
goto LabelOK;
}
}
}
#endif
pMbss = &pAd->ApCfg.MBSSID[wdev->func_idx];
tr_entry = &pAd->MacTab.tr_entry[pEntry->tr_tb_idx];
#ifdef WSC_AP_SUPPORT
@ -1254,12 +1452,29 @@ VOID ap_cmm_peer_assoc_req_action(
break;
}
}
#ifdef CONFIG_MAP_SUPPORT
MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_INFO,
("%s():IS_MAP_ENABLE(pEntry->wdev)=%d\n", __func__, IS_MAP_ENABLE(pAd)));
if (IS_MAP_ENABLE(pAd)) {
MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_INFO,
("%s():Assoc Req len=%ld, ASSOC_REQ_LEN = %d\n",
__func__, (Elem->MsgLen - LENGTH_802_11), ASSOC_REQ_LEN));
if ((Elem->MsgLen - LENGTH_802_11) > ASSOC_REQ_LEN)
pEntry->assoc_req_len = ASSOC_REQ_LEN;
else
pEntry->assoc_req_len = (Elem->MsgLen - LENGTH_802_11);
NdisMoveMemory(pEntry->assoc_req_frame, (Elem->Msg + LENGTH_802_11), pEntry->assoc_req_len);
}
#endif
#ifdef MBO_SUPPORT
if (!MBO_AP_ALLOW_ASSOC(wdev)) {
StatusCode = MLME_ASSOC_REJ_UNABLE_HANDLE_STA;
bMboReject = TRUE;
#ifdef WAPP_SUPPORT
wapp_assoc_fail = MLME_UNABLE_HANDLE_STA;
#endif /* WAPP_SUPPORT */
goto SendAssocResponse;
}
#endif /* MBO_SUPPORT */
@ -1273,6 +1488,9 @@ VOID ap_cmm_peer_assoc_req_action(
#endif /* DOT11R_FT_SUPPORT */
) {
StatusCode = MLME_ASSOC_REJ_TEMPORARILY;
#ifdef WAPP_SUPPORT
wapp_assoc_fail = MLME_ASSOC_REJ_TEMP;
#endif /* WAPP_SUPPORT */
goto SendAssocResponse;
}
@ -1332,7 +1550,12 @@ VOID ap_cmm_peer_assoc_req_action(
if ((ie_list->RSNIE_Len == 0) &&
(IS_AKM_WPA_CAPABILITY_Entry(wdev)) &&
(wsc_ctrl->WscConfMode != WSC_DISABLE))
#ifdef RT_CFG80211_SUPPORT
(pMbss->WscIEBeacon.Value)
#else
(wsc_ctrl->WscConfMode != WSC_DISABLE)
#endif
)
pEntry->bWscCapable = TRUE;
}
@ -1391,6 +1614,10 @@ VOID ap_cmm_peer_assoc_req_action(
/* 2. qualify this STA's auth_asoc status in the MAC table, decide StatusCode */
StatusCode = APBuildAssociation(pAd, pEntry, ie_list, MaxSupportedRate, &Aid, isReassoc);
#ifdef WAPP_SUPPORT
if (StatusCode != MLME_SUCCESS)
wapp_assoc_fail = MLME_UNABLE_HANDLE_STA;
#endif /* WAPP_SUPPORT */
/*is status is success ,update STARec*/
if (StatusCode == MLME_SUCCESS && (pEntry->Sst == SST_ASSOC)) {
@ -1410,6 +1637,11 @@ VOID ap_cmm_peer_assoc_req_action(
StatusCode = FT_AssocReqHandler(pAd, isReassoc, pFtCfg, pEntry,
&ie_list->FtInfo, &FtInfoBuf);
#ifdef WAPP_SUPPORT
if (StatusCode != MLME_SUCCESS)
wapp_assoc_fail = FT_ERROR;
#endif /* WAPP_SUPPORT */
/* just silencely discard this frame */
if (StatusCode == 0xFFFF)
goto LabelOK;
@ -1445,6 +1677,24 @@ VOID ap_cmm_peer_assoc_req_action(
if (StatusCode == MLME_ASSOC_REJ_DATA_RATE)
RTMPSendWirelessEvent(pAd, IW_STA_MODE_EVENT_FLAG, pEntry->Addr, wdev->wdev_idx, 0);
#ifdef IGMP_TVM_SUPPORT
if (IS_IGMP_TVM_MODE_EN(pEntry->wdev->IsTVModeEnable)) {
/* Check whether the Peer has TV IE or not, because this needs to be set to */
/* FW to enable/disabled Mcast Packet cloning and conversion */
if (ie_list->tvm_ie.len == IGMP_TVM_IE_LENGTH) {
if (ie_list->tvm_ie.data.field.TVMode == IGMP_TVM_IE_MODE_ENABLE)
pEntry->TVMode = IGMP_TVM_IE_MODE_ENABLE;
else
pEntry->TVMode = IGMP_TVM_IE_MODE_AUTO;
} else {
pEntry->TVMode = IGMP_TVM_IE_MODE_DISABLE;
}
} else {
pEntry->TVMode = IGMP_TVM_IE_MODE_DISABLE;
}
#endif /* IGMP_TVM_SUPPORT */
#ifdef DOT11W_PMF_SUPPORT
SendAssocResponse:
#endif /* DOT11W_PMF_SUPPORT */
@ -1486,7 +1736,11 @@ SendAssocResponse:
rssi = RTMPMaxRssi(pAd,
ConvertToRssi(pAd, &Elem->rssi_info, RSSI_IDX_0),
ConvertToRssi(pAd, &Elem->rssi_info, RSSI_IDX_1),
ConvertToRssi(pAd, &Elem->rssi_info, RSSI_IDX_2));
ConvertToRssi(pAd, &Elem->rssi_info, RSSI_IDX_2)
#if defined(CUSTOMER_DCC_FEATURE) || defined(CONFIG_MAP_SUPPORT)
, ConvertToRssi(pAd, &Elem->rssi_info, RSSI_IDX_3)
#endif
);
MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_INFO,
("ra[%d] ASSOC_REQ Threshold = %d, PktMaxRssi=%d\n",
pEntry->func_tb_idx, pAd->ApCfg.MBSSID[pEntry->func_tb_idx].AssocReqRssiThreshold,
@ -1503,6 +1757,9 @@ SendAssocResponse:
MgtMacHeaderInit(pAd, &AssocRspHdr, SubType, 0, ie_list->Addr2,
wdev->if_addr, wdev->bssid);
StatusCode = MLME_UNSPECIFY_FAIL;
#ifdef WAPP_SUPPORT
wapp_assoc_fail = MLME_UNSPECIFY_FAILURE;
#endif /* WAPP_SUPPORT */
MakeOutgoingFrame(pOutBuffer, &FrameLen,
sizeof(HEADER_802_11), &AssocRspHdr,
2, &CapabilityInfoForAssocResp,
@ -1556,6 +1813,22 @@ SendAssocResponse:
FrameLen += TmpLen;
}
#ifdef CONFIG_MAP_SUPPORT
if (IS_MAP_ENABLE(pAd)) {
pEntry->DevPeerRole = ie_list->MAP_AttriValue;
if ((IS_MAP_TURNKEY_ENABLE(pAd)) &&
((pEntry->DevPeerRole & BIT(MAP_ROLE_BACKHAUL_STA)) &&
(wdev->MAPCfg.DevOwnRole & BIT(MAP_ROLE_BACKHAUL_BSS)) &&
!(is_controller_found(wdev)))) {
MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF,
("disallowing connection, DevOwnRole=%u,DevPeerRole=%u,controller=%d\n",
wdev->MAPCfg.DevOwnRole, pEntry->DevPeerRole, is_controller_found(wdev)));
MlmeDeAuthAction(pAd, pEntry, REASON_DECLINED, FALSE);
goto LabelOK;
} else
MAP_InsertMapCapIE(pAd, wdev, pOutBuffer+FrameLen, &FrameLen);
}
#endif /* CONFIG_MAP_SUPPORT */
#ifdef DOT11K_RRM_SUPPORT
@ -1795,7 +2068,9 @@ SendAssocResponse:
if (IS_MBO_ENABLE(wdev))
MakeMboOceIE(pAd, wdev, pOutBuffer+FrameLen, &FrameLen, MBO_FRAME_TYPE_ASSOC_RSP);
#endif /* MBO_SUPPORT */
#ifdef WSC_AP_SUPPORT
#ifndef RT_CFG80211_SUPPORT
if (pEntry->bWscCapable) {
UCHAR *pWscBuf = NULL, WscIeLen = 0;
@ -1814,7 +2089,9 @@ SendAssocResponse:
}
}
#endif /* RT_CFG80211_SUPPORT */
#endif /* WSC_AP_SUPPORT */
#ifdef RT_CFG80211_SUPPORT
/* Append extra IEs provided by wpa_supplicant */
@ -1862,11 +2139,13 @@ SendAssocResponse:
/* Insert MDIE. */
mdie_ptr = pOutBuffer + FrameLen;
mdie_len = 5;
FT_InsertMdIE(pAd, pOutBuffer + FrameLen,
&FrameLen,
FtInfoBuf.MdIeInfo.MdId,
FtInfoBuf.MdIeInfo.FtCapPlc);
/* Insert MdId only if the Peer has sent one */
if (FtInfoBuf.MdIeInfo.Len != 0) {
FT_InsertMdIE(pAd, pOutBuffer + FrameLen,
&FrameLen,
FtInfoBuf.MdIeInfo.MdId,
FtInfoBuf.MdIeInfo.FtCapPlc);
}
/* Insert FTIE. */
if (FtInfoBuf.FtIeInfo.Len != 0) {
ftie_ptr = pOutBuffer + FrameLen;
@ -1954,6 +2233,7 @@ SendAssocResponse:
MboIndicateStaBssidInfo(pAd, wdev, pEntry->Addr);
#endif /* MBO_SUPPORT */
pSecConfig->Handshake.GTKState = REKEY_ESTABLISHED;
pSecConfig->Handshake.WpaState = AS_PTKINITDONE;
pEntry->PrivacyFilter = Ndis802_11PrivFilterAcceptAll;
tr_entry->PortSecured = WPA_802_1X_PORT_SECURED;
WifiSysUpdatePortSecur(pAd, pEntry, NULL);
@ -1977,12 +2257,14 @@ SendAssocResponse:
if (IS_AKM_OWE_Entry(pEntry) && (StatusCode == MLME_SUCCESS)) {
BOOLEAN need_ecdh_ie = FALSE;
INT CacheIdx;/* Key cache */
UINT8 *pmkid = NULL;
UINT8 pmkid_count = 0;
pPmkid = WPA_ExtractSuiteFromRSNIE(ie_list->RSN_IE, ie_list->RSNIE_Len, PMKID_LIST, &pmkid_count);
if (pPmkid != NULL) {
pmkid = WPA_ExtractSuiteFromRSNIE(ie_list->RSN_IE, ie_list->RSNIE_Len, PMKID_LIST, &pmkid_count);
if (pmkid != NULL) {
CacheIdx = RTMPSearchPMKIDCache(&pAd->ApCfg.PMKIDCache, pEntry->func_tb_idx, pEntry->Addr);
if ((CacheIdx == -1) ||
((RTMPEqualMemory(pPmkid,
((RTMPEqualMemory(pmkid,
&pAd->ApCfg.PMKIDCache.BSSIDInfo[CacheIdx].PMKID,
LEN_PMKID)) == 0)) {
MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR,
@ -2002,6 +2284,11 @@ SendAssocResponse:
}
#endif /*CONFIG_OWE_SUPPORT*/
#ifdef IGMP_TVM_SUPPORT
/* ADD TV IE to this packet */
MakeTVMIE(pAd, wdev, pOutBuffer, &FrameLen);
#endif /* IGMP_TVM_SUPPORT*/
MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);
MlmeFreeMemory((PVOID) pOutBuffer);
#ifdef DOT11W_PMF_SUPPORT
@ -2092,10 +2379,10 @@ SendAssocResponse:
DBG_LVL_TRACE,
("SINGLE CFG: NOITFY ASSOCIATED, pEntry->bWscCapable:%d\n",
pEntry->bWscCapable));
CFG80211OS_NewSta(pEntry->wdev->if_dev,
ie_list->Addr2,
(PUCHAR)Elem->Msg,
Elem->MsgLen);
#ifdef RT_CFG80211_SUPPORT
CFG80211OS_NewSta(pEntry->wdev->if_dev, ie_list->Addr2,
(PUCHAR)Elem->Msg, Elem->MsgLen, isReassoc);
#endif
if (IS_CIPHER_WEP(pEntry->SecConfig.PairwiseCipher)) {
ASIC_SEC_INFO Info = {0};
@ -2121,35 +2408,20 @@ SendAssocResponse:
#endif
/* enqueue a EAPOL_START message to trigger EAP state machine doing the authentication */
if (IS_AKM_PSK_Entry(pEntry)) {
pPmkid = WPA_ExtractSuiteFromRSNIE(ie_list->RSN_IE,
ie_list->RSNIE_Len,
PMKID_LIST,
&pmkid_count);
if (pPmkid != NULL) {
INT CacheIdx;
CacheIdx = RTMPValidatePMKIDCache(&pAd->ApCfg.PMKIDCache,
pEntry->func_tb_idx,
pEntry->Addr,
pPmkid);
store_pmkid_cache_in_sec_config(pAd, pEntry, CacheIdx);
INT cacheidx;
if (is_rsne_pmkid_cache_match(ie_list->RSN_IE,
ie_list->RSNIE_Len,
&pAd->ApCfg.PMKIDCache,
pEntry->func_tb_idx,
pEntry->Addr,
&cacheidx)) {
store_pmkid_cache_in_sec_config(pAd, pEntry, cacheidx);
MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE,
("ASSOC - CacheIdx = %d\n",
CacheIdx));
if (IS_AKM_WPA3PSK(pEntry->SecConfig.AKMMap) &&
!is_pmkid_cache_in_sec_config(&pEntry->SecConfig)) {
MTWF_LOG(DBG_CAT_SEC,
CATSEC_SAE,
DBG_LVL_ERROR,
("ASSOC - SAE - verify pmkid fail\n"));
MlmeDeAuthAction(pAd, pEntry, REASON_NO_LONGER_VALID, FALSE);
goto LabelOK;
}
cacheidx));
}
#ifdef WSC_AP_SUPPORT
/*
* In WPA-PSK mode,
@ -2195,23 +2467,15 @@ SendAssocResponse:
#ifdef DOT1X_SUPPORT
else if (IS_AKM_WPA2_Entry(pEntry) ||
IS_AKM_WPA3_Entry(pEntry)) {
pPmkid = WPA_ExtractSuiteFromRSNIE(ie_list->RSN_IE,
ie_list->RSNIE_Len,
PMKID_LIST,
&pmkid_count);
if (pPmkid != NULL) {
/* Key cache */
INT CacheIdx;
CacheIdx = RTMPValidatePMKIDCache(&pAd->ApCfg.PMKIDCache,
pEntry->func_tb_idx,
pEntry->Addr,
pPmkid);
process_pmkid(pAd, wdev, pEntry, CacheIdx);
}
IS_AKM_WPA3_192BIT_Entry(pEntry)) {
INT cacheidx;
if (is_rsne_pmkid_cache_match(ie_list->RSN_IE,
ie_list->RSNIE_Len,
&pAd->ApCfg.PMKIDCache,
pEntry->func_tb_idx,
pEntry->Addr,
&cacheidx))
process_pmkid(pAd, wdev, pEntry, cacheidx);
} else if (IS_AKM_1X_Entry(pEntry) ||
(IS_IEEE8021X(&pEntry->SecConfig)
#ifdef WSC_AP_SUPPORT
@ -2233,6 +2497,9 @@ SendAssocResponse:
#if defined(MWDS) || defined(CONFIG_MAP_SUPPORT) || defined(WAPP_SUPPORT)
if (tr_entry && (tr_entry->PortSecured == WPA_802_1X_PORT_SECURED)) {
#if defined(CONFIG_MAP_SUPPORT) && defined(A4_CONN)
map_a4_peer_enable(pAd, pEntry, TRUE);
#endif /* CONFIG_MAP_SUPPORT */
#ifdef WAPP_SUPPORT
wapp_send_cli_join_event(pAd, pEntry);
#endif
@ -2281,6 +2548,30 @@ SendAssocResponse:
}
#endif /* CONFIG_HOTSPOT_R2 */
#ifdef DSCP_QOS_MAP_SUPPORT
if (CLIENT_STATUS_TEST_FLAG(pEntry, fCLIENT_STATUS_WMM_CAPABLE)) {
if (pMbss->DscpQosMapEnable) {
pEntry->PoolId = pMbss->DscpQosPoolId;
MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF,
("[DSCP-QOS-MAP] update sta mapping to CR4 for Pool %d wcid %d",
pEntry->PoolId, pEntry->wcid));
dscp_qosmap_update_sta_mapping_to_cr4(pAd, pEntry, pEntry->PoolId);
}
}
#endif
#ifdef MBSS_AS_WDS_AP_SUPPORT
if (IS_CIPHER_NONE(wdev->SecConfig.PairwiseCipher)) {
if (IS_ENTRY_CLIENT(pEntry)) {
pEntry->bEnable4Addr = TRUE;
if (wdev->wds_enable)
HW_SET_ASIC_WCID_4ADDR_HDR_TRANS(pAd,pEntry->wcid, TRUE);
else if (MAC_ADDR_EQUAL(pAd->ApCfg.wds_mac, pEntry->Addr))
HW_SET_ASIC_WCID_4ADDR_HDR_TRANS(pAd, pEntry->wcid, TRUE);
}
}
#endif
}
#ifdef FAST_EAPOL_WAR
@ -2372,13 +2663,24 @@ SendAssocResponse:
LabelOK:
#ifdef RT_CFG80211_SUPPORT
if (StatusCode != MLME_SUCCESS)
if (!((StatusCode == MLME_SUCCESS)
#ifdef DOT11W_PMF_SUPPORT
||(StatusCode == MLME_ASSOC_REJ_TEMPORARILY)
#endif /*DOT11W_PMF_SUPPORT*/
))
CFG80211_ApStaDelSendEvent(pAd, pEntry->Addr, pEntry->wdev->if_dev);
#endif /* RT_CFG80211_SUPPORT */
assoc_check:
#ifdef WAPP_SUPPORT
if (StatusCode != MLME_SUCCESS && wapp_assoc_fail != NOT_FAILURE)
wapp_send_sta_connect_rejected(pAd, wdev, ie_list->Addr2,
ie_list->Addr1, wapp_cnnct_stage, wapp_assoc_fail);
#endif /* WAPP_SUPPORT */
if (ie_list != NULL)
os_free_mem(ie_list);
return;
}
@ -2520,6 +2822,11 @@ VOID APPeerDisassocReqAction(RTMP_ADAPTER *pAd, MLME_QUEUE_ELEM *Elem)
#endif
ApLogEvent(pAd, Addr2, EVENT_DISASSOCIATED);
#ifdef WIFI_DIAG
if (pEntry && IS_ENTRY_CLIENT(pEntry))
DiagConnError(pAd, pEntry->func_tb_idx, pEntry->Addr,
DIAG_CONN_DEAUTH, REASON_DEAUTH_STA_LEAVING);
#endif
MacTableDeleteEntry(pAd, Elem->Wcid, Addr2);
#ifdef MAC_REPEATER_SUPPORT
@ -2547,6 +2854,24 @@ VOID APPeerDisassocReqAction(RTMP_ADAPTER *pAd, MLME_QUEUE_ELEM *Elem)
}
}
#ifdef BW_VENDOR10_CUSTOM_FEATURE
BOOLEAN IsClientConnected(RTMP_ADAPTER *pAd)
{
INT i;
PMAC_TABLE_ENTRY pEntry;
for (i = 0; VALID_UCAST_ENTRY_WCID(pAd, i); i++) {
pEntry = &pAd->MacTab.Content[i];
if (pEntry && IS_ENTRY_CLIENT(pEntry))
return TRUE;
}
return FALSE;
}
#endif
/*
==========================================================================
@ -2649,6 +2974,10 @@ VOID APMlmeKickOutSta(RTMP_ADAPTER *pAd, UCHAR *pStaAddr, UCHAR Wcid, USHORT Rea
END_OF_ARGS);
MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);
MlmeFreeMemory(pOutBuffer);
#ifdef WIFI_DIAG
if (pEntry && IS_ENTRY_CLIENT(pEntry))
DiagConnError(pAd, pEntry->func_tb_idx, pEntry->Addr, DIAG_CONN_DEAUTH, Reason);
#endif
MacTableDeleteEntry(pAd, Wcid, pStaAddr);
}
}
@ -2750,6 +3079,10 @@ VOID APCls3errAction(RTMP_ADAPTER *pAd, RX_BLK *pRxBlk)
pEntry = &(pAd->MacTab.Content[pRxBlk->wcid]);
if (pEntry) {
#ifdef WIFI_DIAG
if (IS_ENTRY_CLIENT(pEntry))
DiagConnError(pAd, pEntry->func_tb_idx, pEntry->Addr, DIAG_CONN_DEAUTH, Reason);
#endif
/*ApLogEvent(pAd, pAddr, EVENT_DISASSOCIATED); */
mac_entry_delete(pAd, pEntry);
}
@ -2797,6 +3130,10 @@ VOID APAssocStateMachineInit(
IN STATE_MACHINE * S,
OUT STATE_MACHINE_FUNC Trans[])
{
#ifdef CUSTOMER_DCC_FEATURE
pAd->ApDisableSTAConnectFlag = FALSE;
pAd->AllowedStaList.StaCount = 0;
#endif
StateMachineInit(S, (STATE_MACHINE_FUNC *)Trans, AP_MAX_ASSOC_STATE, AP_MAX_ASSOC_MSG, (STATE_MACHINE_FUNC)Drop,
AP_ASSOC_IDLE, AP_ASSOC_MACHINE_BASE);
StateMachineSetAction(S, AP_ASSOC_IDLE, APMT2_MLME_DISASSOC_REQ, (STATE_MACHINE_FUNC)APMlmeDisassocReqAction);

View File

@ -108,7 +108,9 @@ VOID APMlmeBroadcastDeauthReqAction(
MlmeFreeMemory(pOutBuffer);
}
#if !defined(WH_EZ_SETUP) && !defined(CONFIG_MAP_SUPPORT)
static
#endif
VOID APMlmeDeauthReqAction(
IN PRTMP_ADAPTER pAd,
IN MLME_QUEUE_ELEM * Elem)
@ -150,6 +152,10 @@ VOID APMlmeDeauthReqAction(
ARRISMOD_CALL(arris_event_send_hook, ATOM_HOST, WLAN_EVENT, STA_DISSOC,
disassoc_event_msg, strlen(disassoc_event_msg));
}
#endif
#ifdef WIFI_DIAG
if (pEntry && IS_ENTRY_CLIENT(pEntry))
DiagConnError(pAd, pEntry->func_tb_idx, pEntry->Addr, DIAG_CONN_DEAUTH, pInfo->Reason);
#endif
/* 1. remove this STA from MAC table */
MacTableDeleteEntry(pAd, Elem->Wcid, pInfo->Addr);
@ -278,6 +284,12 @@ static VOID APPeerDeauthReqAction(
}
#ifdef WIFI_DIAG
if (pEntry && IS_ENTRY_CLIENT(pEntry))
DiagConnError(pAd, pEntry->func_tb_idx, pEntry->Addr,
DIAG_CONN_DEAUTH, REASON_DEAUTH_STA_LEAVING);
#endif
if (pEntry && !IS_ENTRY_CLIENT(pEntry))
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE,
("%s: receive not client de-auth ###\n", __func__));
@ -428,11 +440,6 @@ static BOOLEAN APPeerAuthSanity(
else if (auth_info->auth_alg == AUTH_MODE_SAE) {
if (auth_info->auth_seq != SAE_COMMIT_SEQ && auth_info->auth_seq != SAE_CONFIRM_SEQ)
return FALSE;
if (auth_info->auth_status == MLME_SUCCESS)
return TRUE;
else
return FALSE;
}
#endif /* DOT11_SAE_SUPPORT */
@ -496,6 +503,7 @@ static VOID APPeerAuthReqAtIdleAction(RTMP_ADAPTER *pAd, MLME_QUEUE_ELEM *Elem)
USHORT RspReason;
AUTH_FRAME_INFO auth_info;
UINT32 apidx;
BOOLEAN checkAuthSanity = FALSE;
PHEADER_802_11 pRcvHdr;
HEADER_802_11 AuthHdr;
PUCHAR pOutBuffer = NULL;
@ -510,43 +518,72 @@ static VOID APPeerAuthReqAtIdleAction(RTMP_ADAPTER *pAd, MLME_QUEUE_ELEM *Elem)
#endif /* DOT11R_FT_SUPPORT */
BSS_STRUCT *pMbss;
struct wifi_dev *wdev;
#ifdef WAPP_SUPPORT
UINT8 wapp_cnnct_stage = WAPP_AUTH;
UINT16 wapp_auth_fail = NOT_FAILURE;
#endif /* WAPP_SUPPORT */
#ifdef RADIUS_MAC_AUTH_SUPPORT
UINT32 freq;
MAP_CHANNEL_ID_TO_KHZ(pAd->LatchRfRegs.Channel, freq);
freq /= 1000;
#endif /* RADIUS_MAC_AUTH_SUPPORT */
checkAuthSanity = APPeerAuthSanity(pAd, Elem->Msg, Elem->MsgLen, &auth_info);
/* Find which MBSSID to be authenticate */
apidx = get_apidx_by_addr(pAd, auth_info.addr1);
pMbss = &pAd->ApCfg.MBSSID[apidx];
wdev = &pMbss->wdev;
ASSERT((wdev->func_idx == apidx));
if (pAd->ApCfg.BANClass3Data == TRUE) {
MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("Disallow new Association\n"));
return;
#ifdef WAPP_SUPPORT
wapp_auth_fail = DISALLOW_NEW_ASSOCI;
#endif /* WAPP_SUPPORT */
goto auth_failure;
}
if (!APPeerAuthSanity(pAd, Elem->Msg, Elem->MsgLen, &auth_info))
return;
if (!checkAuthSanity) {
#ifdef WAPP_SUPPORT
wapp_auth_fail = PEER_REQ_SANITY_FAIL;
#endif /* WAPP_SUPPORT */
goto auth_failure;
}
/* Find which MBSSID to be authenticate */
apidx = get_apidx_by_addr(pAd, auth_info.addr1);
if (apidx >= pAd->ApCfg.BssidNum) {
MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("AUTH - Bssid not found\n"));
return;
#ifdef WAPP_SUPPORT
wapp_auth_fail = BSSID_NOT_FOUND;
#endif /* WAPP_SUPPORT */
goto auth_failure;
}
if (apidx >= HW_BEACON_MAX_NUM) {
MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("Index out of bound\n"));
return;
#ifdef WAPP_SUPPORT
wapp_auth_fail = BSSID_NOT_FOUND;
#endif /* WAPP_SUPPORT */
goto auth_failure;
}
pMbss = &pAd->ApCfg.MBSSID[apidx];
wdev = &pMbss->wdev;
ASSERT((wdev->func_idx == apidx));
if (!OPSTATUS_TEST_FLAG_WDEV(wdev, fOP_AP_STATUS_MEDIA_STATE_CONNECTED)) {
MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, ("AP is not ready, disallow new Association\n"));
return;
#ifdef WAPP_SUPPORT
wapp_auth_fail = AP_NOT_READY;
#endif /* WAPP_SUPPORT */
goto auth_failure;
}
if ((wdev->if_dev == NULL) || ((wdev->if_dev != NULL) &&
!(RTMP_OS_NETDEV_STATE_RUNNING(wdev->if_dev)))) {
MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("AUTH - Bssid IF didn't up yet.\n"));
return;
#ifdef WAPP_SUPPORT
wapp_auth_fail = BSSID_IF_NOT_READY;
#endif /* WAPP_SUPPORT */
goto auth_failure;
}
@ -568,7 +605,11 @@ static VOID APPeerAuthReqAtIdleAction(RTMP_ADAPTER *pAd, MLME_QUEUE_ELEM *Elem)
MacTableDeleteEntry(pAd, pEntry->wcid, pEntry->Addr);
pEntry = NULL;
MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_WARN, ("AUTH - Bssid does not match\n"));
return;
#ifdef WAPP_SUPPORT
wapp_auth_fail = BSSID_MISMATCH;
#endif /* WAPP_SUPPORT */
goto auth_failure;
} else {
#ifdef DOT11_N_SUPPORT
ba_session_tear_down_all(pAd, pEntry->wcid);
@ -600,10 +641,26 @@ SendAuth:
/* fail in ACL checking => send an AUTH-Fail seq#2. */
if (!ApCheckAccessControlList(pAd, auth_info.addr2, apidx)) {
#ifdef ACL_BLK_COUNT_SUPPORT
if (pAd->ApCfg.MBSSID[apidx].AccessControlList.Policy == 2) {
ULONG idx;
ULONG acl_num;
acl_num = pAd->ApCfg.MBSSID[apidx].AccessControlList.Num;
for (idx = 0; idx < acl_num; idx++) {
if (MAC_ADDR_EQUAL(auth_info.addr2,
pAd->ApCfg.MBSSID[apidx].AccessControlList.Entry[idx].Addr)) {
pAd->ApCfg.MBSSID[apidx].AccessControlList.Entry[idx].Reject_Count += 1;
break;
}
}
}
#endif/*ACL_BLK_COUNT_SUPPORT*/
ASSERT(auth_info.auth_seq == 1);
ASSERT(pEntry == NULL);
APPeerAuthSimpleRspGenAndSend(pAd, pRcvHdr, auth_info.auth_alg, auth_info.auth_seq + 1, MLME_UNSPECIFY_FAIL);
#ifdef WIFI_DIAG
DiagConnError(pAd, apidx, auth_info.addr2, DIAG_CONN_ACL_BLK, 0);
#endif
/* If this STA exists, delete it. */
if (pEntry)
MacTableDeleteEntry(pAd, pEntry->wcid, pEntry->Addr);
@ -614,7 +671,10 @@ SendAuth:
, MLME_UNSPECIFY_FAIL));
return;
#ifdef WAPP_SUPPORT
wapp_auth_fail = ACL_CHECK_FAIL;
#endif /* WAPP_SUPPORT */
goto auth_failure;
}
#ifdef BAND_STEERING
@ -623,14 +683,25 @@ SendAuth:
) {
BOOLEAN bBndStrgCheck = TRUE;
bBndStrgCheck = BndStrg_CheckConnectionReq(pAd, wdev, auth_info.addr2, Elem, NULL);
bBndStrgCheck = BndStrg_CheckConnectionReq(pAd, wdev, auth_info.addr2, &(Elem->rssi_info), Elem->MsgType, NULL);
if (bBndStrgCheck == FALSE) {
APPeerAuthSimpleRspGenAndSend(pAd, pRcvHdr, auth_info.auth_alg, auth_info.auth_seq + 1, MLME_UNSPECIFY_FAIL);
MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("AUTH - check failed.\n"));
return;
#ifdef WAPP_SUPPORT
wapp_auth_fail = BND_STRG_CONNECT_CHECK_FAIL;
#endif /* WAPP_SUPPORT */
#ifdef WIFI_DIAG
DiagConnError(pAd, apidx, auth_info.addr2, DIAG_CONN_BAND_STE, 0);
#endif
goto auth_failure;
}
}
#endif /* BAND_STEERING */
#ifdef CONFIG_STEERING_API_SUPPORT
if (BlackList_StaLookup(pAd,auth_info.addr2))
return;
#endif
#ifdef RADIUS_MAC_ACL_SUPPORT
if (IS_IEEE8021X_Entry(wdev) &&
@ -649,7 +720,9 @@ SendAuth:
if (pAclEntry) {
if (pAclEntry->result == RADIUS_ACL_REJECT) {
APPeerAuthSimpleRspGenAndSend(pAd, pRcvHdr, auth_info.auth_alg, auth_info.auth_seq + 1, MLME_UNSPECIFY_FAIL);
#ifdef WIFI_DIAG
DiagConnError(pAd, apidx, auth_info.addr2, DIAG_CONN_ACL_BLK, 0);
#endif
if (pEntry)
MacTableDeleteEntry(pAd, pEntry->wcid, pEntry->Addr);
@ -672,7 +745,13 @@ SendAuth:
MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("%02x:%02x:%02x:%02x:%02x:%02x Not Found in RADIUS ACL & go to Check.\n",
PRINT_MAC(auth_info.addr2)));
DOT1X_InternalCmdAction(pAd, pEntry, DOT1X_ACL_ENTRY);
return;
#ifdef WAPP_SUPPORT
wapp_auth_fail = NOT_FOUND_IN_RADIUS_ACL;
#endif /* WAPP_SUPPORT */
#ifdef WIFI_DIAG
DiagConnError(pAd, apidx, auth_info.addr2, DIAG_CONN_ACL_BLK, 0);
#endif
goto auth_failure;
}
}
@ -702,7 +781,14 @@ SendAuth:
("%s - give up this AUTH pkt ======================> Query R1KH from backbone (Wcid%d, %d)\n",
__func__, pEntry->wcid, pEntry->FT_R1kh_CacheMiss_Times));
os_free_mem(pFtInfoBuf);
return;
#ifdef WIFI_DIAG
DiagConnError(pAd, apidx, auth_info.addr2,
DIAG_CONN_AUTH_FAIL, REASON_NO_RESOURCE);
#endif
#ifdef WAPP_SUPPORT
wapp_auth_fail = MLME_NO_RESOURCE;
#endif /* WAPP_SUPPORT */
goto auth_failure;
}
FT_EnqueueAuthReply(pAd, pRcvHdr, auth_info.auth_alg, 2, result,
@ -742,6 +828,10 @@ SendAuth:
}
}
}
#ifdef WIFI_DIAG
else /* MAC table full*/
DiagConnError(pAd, apidx, auth_info.addr2, DIAG_CONN_STA_LIM, 0);
#endif
return;
}
@ -757,18 +847,25 @@ SendAuth:
tr_entry = &pAd->MacTab.tr_entry[pEntry->wcid];
if ((pEntry->SecConfig.PmfCfg.UsePMFConnect == TRUE)
&& (tr_entry->PortSecured != WPA_802_1X_PORT_SECURED)) {
&& (tr_entry->PortSecured == WPA_802_1X_PORT_SECURED)) {
APPeerAuthSimpleRspGenAndSend(pAd, pRcvHdr,
auth_info.auth_alg, auth_info.auth_seq, MLME_ASSOC_REJ_TEMPORARILY);
PMF_MlmeSAQueryReq(pAd, pEntry);
return;
#ifdef WIFI_DIAG
DiagConnError(pAd, apidx, auth_info.addr2, DIAG_CONN_AUTH_FAIL, REASON_REJ_TEMPORARILY);
#endif
#ifdef WAPP_SUPPORT
wapp_auth_fail = MLME_ASSOC_REJ_TEMP;
#endif /* WAPP_SUPPORT */
goto auth_failure;
}
}
#endif /* DOT11W_PMF_SUPPORT */
pmk = sae_handle_auth(pAd, &pAd->SaeCfg, Elem->Msg, Elem->MsgLen,
pMbss->wdev.SecConfig.PSK,
auth_info.auth_seq, auth_info.auth_status);
/* ap is passive, so do not consider the retrun value of sae_handle_auth */
sae_handle_auth(pAd, &pAd->SaeCfg, Elem->Msg, Elem->MsgLen,
pMbss->wdev.SecConfig.PSK,
auth_info.auth_seq, auth_info.auth_status, &pmk);
if (pmk) {
@ -792,6 +889,10 @@ SendAuth:
PRINT_MAC(pEntry->Addr), pmkid[0], pmkid[1], pmkid[2], pmkid[3], pmkid[4], pmkid[5]));
}
}
#ifdef WIFI_DIAG
else /* MAC table full*/
DiagConnError(pAd, apidx, auth_info.addr2, DIAG_CONN_STA_LIM, 0);
#endif
}
} else
#endif /* DOT11_SAE_SUPPORT */
@ -813,8 +914,15 @@ SendAuth:
}
APPeerAuthSimpleRspGenAndSend(pAd, pRcvHdr, auth_info.auth_alg, auth_info.auth_seq + 1, MLME_SUCCESS);
} else
; /* MAC table full, what should we respond ????? */
#ifdef RADIUS_MAC_AUTH_SUPPORT
if (wdev->radius_mac_auth_enable)
CFG80211OS_RxMgmt(wdev->if_dev, freq, Elem->Msg, Elem->MsgLen);
#endif /* RADIUS_MAC_AUTH_SUPPORT */
}
#ifdef WIFI_DIAG
else /* MAC table full*/
DiagConnError(pAd, apidx, auth_info.addr2, DIAG_CONN_STA_LIM, 0);
#endif
} else if ((auth_info.auth_alg == AUTH_MODE_KEY) &&
(IS_AKM_SHARED(pMbss->wdev.SecConfig.AKMMap)
|| IS_AKM_AUTOSWITCH(pMbss->wdev.SecConfig.AKMMap))) {
@ -835,8 +943,16 @@ SendAuth:
auth_info.auth_seq++;
NStatus = MlmeAllocateMemory(pAd, &pOutBuffer);
if (NStatus != NDIS_STATUS_SUCCESS)
return; /* if no memory, can't do anything */
if (NStatus != NDIS_STATUS_SUCCESS) {
#ifdef WAPP_SUPPORT
wapp_auth_fail = MLME_NO_RESOURCE;
#endif /* WAPP_SUPPORT */
#ifdef WIFI_DIAG
DiagConnError(pAd, apidx, auth_info.addr2,
DIAG_CONN_AUTH_FAIL, REASON_NO_RESOURCE);
#endif
goto auth_failure; /* if no memory, can't do anything */
}
MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("AUTH - Send AUTH seq#2 (Challenge)\n"));
MgtMacHeaderInit(pAd, &AuthHdr, SUBTYPE_AUTH, 0, auth_info.addr2,
@ -853,13 +969,22 @@ SendAuth:
END_OF_ARGS);
MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);
MlmeFreeMemory(pOutBuffer);
} else
; /* MAC table full, what should we respond ???? */
#ifdef RADIUS_MAC_AUTH_SUPPORT
if (wdev->radius_mac_auth_enable)
CFG80211OS_RxMgmt(wdev->if_dev, freq, Elem->Msg, Elem->MsgLen);
#endif /* RADIUS_MAC_AUTH_SUPPORT */
}
#ifdef WIFI_DIAG
else/* MAC table full */
DiagConnError(pAd, apidx, auth_info.addr2, DIAG_CONN_STA_LIM, 0);
#endif
}
else {
/* wrong algorithm */
APPeerAuthSimpleRspGenAndSend(pAd, pRcvHdr, auth_info.auth_alg, auth_info.auth_seq + 1, MLME_ALG_NOT_SUPPORT);
#ifdef WIFI_DIAG
DiagConnError(pAd, apidx, auth_info.addr2, DIAG_CONN_AUTH_FAIL, REASON_AUTH_WRONG_ALGORITHM);
#endif
/* If this STA exists, delete it. */
if (pEntry)
MacTableDeleteEntry(pAd, pEntry->wcid, pEntry->Addr);
@ -873,6 +998,12 @@ SendAuth:
SET_FLAG_CONN_IN_PROG(aid, pAd->ConInPrgress);
}
return;
auth_failure:
#ifdef WAPP_SUPPORT
wapp_send_sta_connect_rejected(pAd, wdev, auth_info.addr2, auth_info.addr1, wapp_cnnct_stage, wapp_auth_fail);
#endif /* WAPP_SUPPORT */
return;
}
@ -982,6 +1113,11 @@ static VOID APPeerAuthConfirmAction(
APPeerAuthSimpleRspGenAndSend(pAd, pRcvHdr, auth_info.auth_alg,
auth_info.auth_seq + 1,
MLME_REJ_CHALLENGE_FAILURE);
#ifdef WIFI_DIAG
if (pEntry && IS_ENTRY_CLIENT(pEntry))
DiagConnError(pAd, pEntry->func_tb_idx, pEntry->Addr,
DIAG_CONN_AUTH_FAIL, REASON_CHALLENGE_FAIL);
#endif
MacTableDeleteEntry(pAd, pEntry->wcid, pEntry->Addr);
/*Chtxt[127]='\0'; */
/*pAd->ApMlmeAux.Challenge[127]='\0'; */
@ -996,8 +1132,14 @@ static VOID APPeerAuthConfirmAction(
APPeerAuthSimpleRspGenAndSend(pAd, pRcvHdr, auth_info.auth_alg, auth_info.auth_seq + 1, MLME_UNSPECIFY_FAIL);
/* If this STA exists, delete it. */
if (pEntry)
if (pEntry) {
#ifdef WIFI_DIAG
if (pEntry && IS_ENTRY_CLIENT(pEntry))
DiagConnError(pAd, pEntry->func_tb_idx, pEntry->Addr,
DIAG_CONN_AUTH_FAIL, REASON_UNKNOWN);
#endif
MacTableDeleteEntry(pAd, pEntry->wcid, pEntry->Addr);
}
}
}
@ -1025,6 +1167,9 @@ VOID APCls2errAction(RTMP_ADAPTER *pAd, RX_BLK *pRxBlk)
pEntry = &(pAd->MacTab.Content[pRxBlk->wcid]);
if (pEntry && IS_ENTRY_CLIENT(pEntry)) {
#ifdef WIFI_DIAG
DiagConnError(pAd, pEntry->func_tb_idx, pEntry->Addr, DIAG_CONN_DEAUTH, Reason);
#endif
/*ApLogEvent(pAd, pAddr, EVENT_DISASSOCIATED); */
mac_entry_delete(pAd, pEntry);
} else {

View File

@ -17,7 +17,7 @@
#ifdef BAND_STEERING
#include "rt_config.h"
#define BNDSTRG_DRIVER_VER "3.1.2"
#define BNDSTRG_DRIVER_VER "3.1.3"
static inline PBND_STRG_CLI_TABLE Get_BndStrgTableByChannel(
PRTMP_ADAPTER pAd,
UINT8 Channel)
@ -54,6 +54,205 @@ inline PBND_STRG_CLI_TABLE Get_BndStrgTable(
return NULL;
}
/* WPS_BandSteering Support */
PWPS_WHITELIST_ENTRY FindWpsWhiteListEntry(
PLIST_HEADER pWpsWhiteList,
PUCHAR pMacAddr)
{
PWPS_WHITELIST_ENTRY pWpsWhiteListEntry = NULL;
RT_LIST_ENTRY *pListEntry = NULL;
pListEntry = pWpsWhiteList->pHead;
pWpsWhiteListEntry = (PWPS_WHITELIST_ENTRY)pListEntry;
while (pWpsWhiteListEntry != NULL) {
if (NdisEqualMemory(pWpsWhiteListEntry->addr, pMacAddr, MAC_ADDR_LEN))
return pWpsWhiteListEntry;
pListEntry = pListEntry->pNext;
pWpsWhiteListEntry = (PWPS_WHITELIST_ENTRY)pListEntry;
}
return NULL;
}
VOID AddWpsWhiteList(
PLIST_HEADER pWpsWhiteList,
PUCHAR pMacAddr)
{
PWPS_WHITELIST_ENTRY pWpsWhiteListEntry = NULL;
pWpsWhiteListEntry = FindWpsWhiteListEntry(pWpsWhiteList, pMacAddr);
if (pWpsWhiteListEntry) {
/* the Entry already exist */
MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE,
("%s: Found %02x:%02x:%02x:%02x:%02x:%02x in Wps White List\n",
__func__, PRINT_MAC(pMacAddr)));
} else {
/* Add new Entry */
os_alloc_mem(NULL, (UCHAR **)&pWpsWhiteListEntry, sizeof(WPS_WHITELIST_ENTRY));
if (pWpsWhiteListEntry) {
NdisZeroMemory(pWpsWhiteListEntry, sizeof(WPS_WHITELIST_ENTRY));
pWpsWhiteListEntry->pNext = NULL;
NdisCopyMemory(pWpsWhiteListEntry->addr, pMacAddr, MAC_ADDR_LEN);
insertTailList(pWpsWhiteList, (RT_LIST_ENTRY *)pWpsWhiteListEntry);
MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("[%s]%02x:%02x:%02x:%02x:%02x:%02x added to WpsList:size::%d\n",
__func__, PRINT_MAC(pWpsWhiteListEntry->addr), pWpsWhiteList->size));
} else
MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, ("[%s] Mem alloc fail\n", __func__));
}
}
VOID DelWpsWhiteListExceptMac(
PLIST_HEADER pWpsWhiteList,
PUCHAR pMacAddr)
{
RT_LIST_ENTRY *pListEntry = NULL, *pDelEntry = NULL;
PWPS_WHITELIST_ENTRY pWpsWhiteListEntry = NULL;
PLIST_HEADER pListHeader = pWpsWhiteList;
UCHAR Addr[6];
NdisCopyMemory(Addr, pMacAddr, MAC_ADDR_LEN);
if (pListHeader->size == 0) {
MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("%s: WpsWhiteList Empty.\n", __func__));
return;
}
pListEntry = pListHeader->pHead;
pWpsWhiteListEntry = (PWPS_WHITELIST_ENTRY)pListEntry;
while (pWpsWhiteListEntry != NULL) {
if (MAC_ADDR_EQUAL(pWpsWhiteListEntry->addr, Addr)) {
pListEntry = pListEntry->pNext;
} else {
pDelEntry = delEntryList(pWpsWhiteList, pListEntry);
pListEntry = pDelEntry->pNext;
os_free_mem(pDelEntry);
}
pWpsWhiteListEntry = (PWPS_WHITELIST_ENTRY)pListEntry;
}
MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("%s: WpsWhiteList size : %d\n",
__func__, pWpsWhiteList->size));
}
VOID ClearWpsWhiteList(
PLIST_HEADER pWpsWhiteList)
{
RT_LIST_ENTRY *pListEntry = NULL;
PLIST_HEADER pListHeader = pWpsWhiteList;
if (pListHeader->size == 0) {
MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("%s: WpsWhiteList already Empty.\n", __func__));
return;
}
pListEntry = pListHeader->pHead;
while (pListEntry != NULL) {
/*Remove ListEntry from Header*/
removeHeadList(pListHeader);
os_free_mem(pListEntry);
pListEntry = pListHeader->pHead;
}
MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("%s: Clean WpsWhiteList.\n", __func__));
}
PBS_LIST_ENTRY FindBsListEntry(
PLIST_HEADER pBsList,
PUCHAR pMacAddr)
{
PBS_LIST_ENTRY pBsListEntry = NULL;
RT_LIST_ENTRY *pListEntry = NULL;
pListEntry = pBsList->pHead;
pBsListEntry = (PBS_LIST_ENTRY)pListEntry;
while (pBsListEntry != NULL) {
if (NdisEqualMemory(pBsListEntry->addr, pMacAddr, MAC_ADDR_LEN))
return pBsListEntry;
pListEntry = pListEntry->pNext;
pBsListEntry = (PBS_LIST_ENTRY)pListEntry;
}
return NULL;
}
VOID AddBsListEntry(
PLIST_HEADER pBsList,
PUCHAR pMacAddr)
{
PBS_LIST_ENTRY pBsListEntry = NULL;
pBsListEntry = FindBsListEntry(pBsList, pMacAddr);
if (pBsListEntry) {
/* the Entry already exist */
MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE,
("%s: Found %02x:%02x:%02x:%02x:%02x:%02x in BsList.\n",
__func__, PRINT_MAC(pMacAddr)));
} else {
/* Add new Entry */
os_alloc_mem(NULL, (UCHAR **)&pBsListEntry, sizeof(BS_LIST_ENTRY));
if (pBsListEntry) {
NdisZeroMemory(pBsListEntry, sizeof(BS_LIST_ENTRY));
pBsListEntry->pNext = NULL;
NdisCopyMemory(pBsListEntry->addr, pMacAddr, MAC_ADDR_LEN);
insertTailList(pBsList, (RT_LIST_ENTRY *)pBsListEntry);
MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("[%s] %02x:%02x:%02x:%02x:%02x:%02x added in BsList:size::%d\n",
__func__, PRINT_MAC(pBsListEntry->addr), pBsList->size));
} else
MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, ("[%s]Mem alloc fail\n", __func__));
}
}
VOID DelBsListEntry(
PLIST_HEADER pBsList,
PUCHAR pMacAddr)
{
PBS_LIST_ENTRY pBsListEntry = NULL;
RT_LIST_ENTRY *pListEntry = NULL, *pDelEntry = NULL;
pBsListEntry = FindBsListEntry(pBsList, pMacAddr);
if (!pBsListEntry) {
/* the Entry already exist */
MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("%s: Not Found %02x:%02x:%02x:%02x:%02x:%02x in BsList.\n",
__func__, PRINT_MAC(pMacAddr)));
} else {
pListEntry = (RT_LIST_ENTRY *)pBsListEntry;
/* Delete the Entry */
pDelEntry = delEntryList(pBsList, pListEntry);
MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("%s: Sta %02x:%02x:%02x:%02x:%02x:%02x deleted from BsList:size::%d\n",
__func__, PRINT_MAC(pBsListEntry->addr), pBsList->size));
os_free_mem(pDelEntry);
}
}
VOID ClearBsList(
PLIST_HEADER pBsList)
{
RT_LIST_ENTRY *pListEntry = NULL;
PLIST_HEADER pListHeader = pBsList;
if (pListHeader->size == 0) {
MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("%s: BsList already Empty.\n", __func__));
return;
}
pListEntry = pListHeader->pHead;
while (pListEntry != NULL) {
/*Remove ListEntry from Header*/
removeHeadList(pListHeader);
os_free_mem(pListEntry);
pListEntry = pListHeader->pHead;
}
MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("%s: Clean BsList.\n", __func__));
}
INT Show_BndStrg_Info(
PRTMP_ADAPTER pAd,
RTMP_STRING *arg)
@ -89,23 +288,35 @@ INT Show_BndStrg_Info(
BND_STRG_MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\n"));
BND_STRG_MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\t WhiteListSize:%d\n", table->WhiteEntryListSize));
BND_STRG_MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\t WhiteListSize:%d\n", table->WhiteList.size));
if (table->WhiteEntryListSize) {
UINT8 i;
if (table->WhiteList.size) {
PBS_LIST_ENTRY pBsListEntry = NULL;
RT_LIST_ENTRY *pListEntry = NULL;
for (i = 0; i < BND_STRG_MAX_WHITELIST_ENTRY; i++) {
BND_STRG_MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\t %d -> %02x:%02x:%02x:%02x:%02x:%02x\n", i, PRINT_MAC(table->WhiteEntryList[i])));
pListEntry = table->WhiteList.pHead;
pBsListEntry = (PBS_LIST_ENTRY)pListEntry;
while (pBsListEntry != NULL) {
BND_STRG_MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\t -> %02x:%02x:%02x:%02x:%02x:%02x\n", PRINT_MAC(pBsListEntry->addr)));
pListEntry = pListEntry->pNext;
pBsListEntry = (PBS_LIST_ENTRY)pListEntry;
}
}
BND_STRG_MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\t BlackListSize:%d\n", table->BndStrgBlackListSize));
BND_STRG_MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\t BlackListSize:%d\n", table->BlackList.size));
if (table->BndStrgBlackListSize) {
UINT8 i;
if (table->BlackList.size) {
PBS_LIST_ENTRY pBsListEntry = NULL;
RT_LIST_ENTRY *pListEntry = NULL;
for (i = 0; i < BND_STRG_MAX_BLACKLIST_ENTRY; i++) {
BND_STRG_MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\t %d -> %02x:%02x:%02x:%02x:%02x:%02x\n", i, PRINT_MAC(table->BndStrgBlackList[i])));
pListEntry = table->BlackList.pHead;
pBsListEntry = (PBS_LIST_ENTRY)pListEntry;
while (pBsListEntry != NULL) {
BND_STRG_MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\t -> %02x:%02x:%02x:%02x:%02x:%02x\n", PRINT_MAC(pBsListEntry->addr)));
pListEntry = pListEntry->pNext;
pBsListEntry = (PBS_LIST_ENTRY)pListEntry;
}
}
@ -252,7 +463,7 @@ INT Set_BndStrg_Param(PRTMP_ADAPTER pAd, RTMP_STRING *arg)
bndstrg_param->Band = table->Band;
bndstrg_param->Channel = table->Channel;
bndstrg_param->len = strlen(arg);
strncpy(bndstrg_param->arg, arg, sizeof(bndstrg_param->arg));
strncpy(bndstrg_param->arg, arg, sizeof(bndstrg_param->arg) - 1);
BndStrgSendMsg(pAd, &msg);
return TRUE;
@ -409,6 +620,11 @@ INT BndStrg_TableInit(PRTMP_ADAPTER pAd, INT apidx)
if (init_table) {
NdisZeroMemory(init_table, sizeof(BND_STRG_CLI_TABLE));
OS_NdisAllocateSpinLock(&init_table->Lock);
/* WPS_BandSteering Support */
OS_NdisAllocateSpinLock(&init_table->WpsWhiteListLock);
OS_NdisAllocateSpinLock(&init_table->WhiteListLock);
OS_NdisAllocateSpinLock(&init_table->BlackListLock);
init_table->DaemonPid = 0xffffffff;
init_table->priv = (VOID *) pAd;
init_table->Band = Band;
@ -457,6 +673,22 @@ INT BndStrg_TableRelease(PBND_STRG_CLI_TABLE table)
return BND_STRG_NOT_INITIALIZED;
OS_NdisFreeSpinLock(&table->Lock);
NdisAcquireSpinLock(&table->WhiteListLock);
ClearBsList(&table->WhiteList);
NdisReleaseSpinLock(&table->WhiteListLock);
NdisAcquireSpinLock(&table->BlackListLock);
ClearBsList(&table->BlackList);
NdisReleaseSpinLock(&table->BlackListLock);
NdisAcquireSpinLock(&table->WpsWhiteListLock);
ClearWpsWhiteList(&table->WpsWhiteList);
NdisReleaseSpinLock(&table->WpsWhiteListLock);
OS_NdisFreeSpinLock(&table->WpsWhiteListLock);
OS_NdisFreeSpinLock(&table->WhiteListLock);
OS_NdisFreeSpinLock(&table->BlackListLock);
table->bInitialized = FALSE;
if (ret_val != BND_STRG_SUCCESS) {
@ -621,10 +853,11 @@ BOOLEAN BndStrg_CheckConnectionReq(
PRTMP_ADAPTER pAd,
struct wifi_dev *wdev,
PUCHAR pSrcAddr,
MLME_QUEUE_ELEM * Elem,
struct raw_rssi_info *rssi_info,
ULONG MsgType,
PEER_PROBE_REQ_PARAM * ProbeReqParam)
{
UINT8 FrameType = Elem->MsgType;
UINT8 FrameType = MsgType;
CHAR Rssi[4] = {0};
PBND_STRG_CLI_TABLE table = Get_BndStrgTable(pAd, wdev->func_idx);
BNDSTRG_MSG msg = { 0 };
@ -639,19 +872,22 @@ BOOLEAN BndStrg_CheckConnectionReq(
return TRUE;
/* send response to white listed clients*/
if (table->WhiteEntryListSize > 0) {
for (i = 0; i < BND_STRG_MAX_WHITELIST_ENTRY; i++) {
if (memcmp(table->WhiteEntryList[i], pSrcAddr, MAC_ADDR_LEN) == 0) {
BND_STRG_PRINTQAMSG(table, pSrcAddr, ("BndStrg STA %02x:%02x:%02x:%02x:%02x:%02x whitelisted\n", PRINT_MAC(pSrcAddr)));
return TRUE;
}
if (table->WhiteList.size > 0) {
PBS_LIST_ENTRY bs_whitelist_entry = NULL;
bs_whitelist_entry = FindBsListEntry(&table->WhiteList, pSrcAddr);
if (bs_whitelist_entry) {
BND_STRG_PRINTQAMSG(table, pSrcAddr, ("BndStrg STA %02x:%02x:%02x:%02x:%02x:%02x whitelisted\n", PRINT_MAC(pSrcAddr)));
return TRUE;
}
}
Rssi[0] = Elem->rssi_info.raw_rssi[0] ? ConvertToRssi(pAd, &Elem->rssi_info, RSSI_IDX_0) : 0;
Rssi[1] = Elem->rssi_info.raw_rssi[1] ? ConvertToRssi(pAd, &Elem->rssi_info, RSSI_IDX_1) : 0;
Rssi[2] = Elem->rssi_info.raw_rssi[2] ? ConvertToRssi(pAd, &Elem->rssi_info, RSSI_IDX_2) : 0;
Rssi[3] = Elem->rssi_info.raw_rssi[3] ? ConvertToRssi(pAd, &Elem->rssi_info, RSSI_IDX_3) : 0;
Rssi[0] = rssi_info->raw_rssi[0] ? ConvertToRssi(pAd, (rssi_info), RSSI_IDX_0) : 0;
Rssi[1] = rssi_info->raw_rssi[1] ? ConvertToRssi(pAd, (rssi_info), RSSI_IDX_1) : 0;
Rssi[2] = rssi_info->raw_rssi[2] ? ConvertToRssi(pAd, (rssi_info), RSSI_IDX_2) : 0;
Rssi[3] = rssi_info->raw_rssi[3] ? ConvertToRssi(pAd, (rssi_info), RSSI_IDX_3) : 0;
#ifdef DBDC_MODE
@ -687,6 +923,10 @@ BOOLEAN BndStrg_CheckConnectionReq(
cli_probe->bAllowStaConnectInHt = TRUE;
if (ProbeReqParam->IsVhtSupport && WMODE_CAP_AC(wdev->PhyMode))
cli_probe->bVHTCapable = TRUE;
if (ProbeReqParam->IsFromIos)
cli_probe->bIosCapable = TRUE;
cli_probe->Nss = GetNssFromHTCapRxMCSBitmask(ProbeReqParam->RxMCSBitmask);
memset(cli_probe->Rssi, 0x80, sizeof(cli_probe->Rssi));
@ -703,11 +943,45 @@ BOOLEAN BndStrg_CheckConnectionReq(
BndStrgSendMsg(pAd, &msg);
/* check for backlist client, stop response for them */
if (table->BndStrgBlackListSize > 0) {
for (i = 0; i < BND_STRG_MAX_BLACKLIST_ENTRY; i++) {
if (memcmp(table->BndStrgBlackList[i], pSrcAddr, MAC_ADDR_LEN) == 0) {
BND_STRG_PRINTQAMSG(table, pSrcAddr, ("BndStrg STA %02x:%02x:%02x:%02x:%02x:%02x blacklisted\n", PRINT_MAC(pSrcAddr)));
return FALSE;
if (table->BlackList.size > 0) {
PBS_LIST_ENTRY bs_blacklist_entry = NULL;
bs_blacklist_entry = FindBsListEntry(&table->BlackList, pSrcAddr);
if (bs_blacklist_entry) {
BND_STRG_PRINTQAMSG(table, pSrcAddr, ("BndStrg STA %02x:%02x:%02x:%02x:%02x:%02x blacklisted\n", PRINT_MAC(pSrcAddr)));
return FALSE;
}
}
/* WPS_BandSteering Support */
{
PWSC_CTRL pWscControl;
pWscControl = &pAd->ApCfg.MBSSID[wdev->func_idx].WscControl;
if (FrameType == APMT2_PEER_PROBE_REQ) {
if (pWscControl->bWscTrigger) {
if (ProbeReqParam->bWpsCapable) {
NdisAcquireSpinLock(&table->WpsWhiteListLock);
AddWpsWhiteList(&table->WpsWhiteList, pSrcAddr);
NdisReleaseSpinLock(&table->WpsWhiteListLock);
MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("channel %u: Probe req: STA %02x:%02x:%02x:%02x:%02x:%02x wps whitelisted\n",
table->Channel, PRINT_MAC(pSrcAddr)));
BND_STRG_PRINTQAMSG(table, pSrcAddr, ("STA %02x:%02x:%02x:%02x:%02x:%02x channel %u added in WPS Whitelist\n",
PRINT_MAC(pSrcAddr), table->Channel));
}
return TRUE;
}
}
if (FrameType == APMT2_PEER_AUTH_REQ) {
if (pWscControl->bWscTrigger) {
MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("channel %u: Auth req: STA %02x:%02x:%02x:%02x:%02x:%02x wps whitelisted\n",
table->Channel, PRINT_MAC(pSrcAddr)));
BND_STRG_PRINTQAMSG(table, pSrcAddr, ("STA %02x:%02x:%02x:%02x:%02x:%02x channel %u allowed Auth as per WPS Whitelist\n",
PRINT_MAC(pSrcAddr), table->Channel));
return TRUE;
}
}
}
@ -767,7 +1041,7 @@ INT BndStrg_Tbl_Enable(PBND_STRG_CLI_TABLE table, BOOLEAN enable, CHAR *IfName)
if (enable) {
table->bEnabled = TRUE;
strncpy(table->ucIfName, IfName, sizeof(table->ucIfName)); /* decide it by daemon */
strncpy(table->ucIfName, IfName, sizeof(table->ucIfName) - 1); /* decide it by daemon */
} else
table->bEnabled = FALSE;
@ -776,7 +1050,7 @@ INT BndStrg_Tbl_Enable(PBND_STRG_CLI_TABLE table, BOOLEAN enable, CHAR *IfName)
onoff->OnOff = table->bEnabled;
onoff->Band = table->Band;
onoff->Channel = table->Channel;
strncpy(onoff->ucIfName, IfName, sizeof(onoff->ucIfName));
strncpy(onoff->ucIfName, IfName, sizeof(onoff->ucIfName) - 1);
RtmpOSWrielessEventSend(
pAd->net_dev,
RT_WLAN_EVENT_CUSTOM,
@ -947,6 +1221,8 @@ void BndStrg_UpdateEntry(PRTMP_ADAPTER pAd,
if (ie_list->vht_cap_len > 0)
cli_assoc->bVHTCapable = TRUE;
cli_assoc->Nss = Nss;
/* WPS_BandSteering Support */
cli_assoc->bWpsAssoc = ie_list->bWscCapable;
#ifdef CONFIG_DOT11V_WNM
cli_assoc->BTMSupport = pEntry->BssTransitionManmtSupport;
#endif
@ -1555,7 +1831,7 @@ VOID BndStrg_InfStatusRsp(PRTMP_ADAPTER pAd, PBND_STRG_CLI_TABLE table, BNDSTRG_
inf_status_rsp->nss = table->nss;
inf_status_rsp->table_src_addr = (ULONG)table;
inf_status_rsp->table_size = BND_STRG_MAX_TABLE_SIZE;
strncpy(inf_status_rsp->ucIfName, inf_status_req->ucIfName, sizeof(inf_status_rsp->ucIfName));
strncpy(inf_status_rsp->ucIfName, inf_status_req->ucIfName, sizeof(inf_status_rsp->ucIfName) - 1);
#ifdef VENDOR_FEATURE5_SUPPORT
inf_status_rsp->nvram_support = 1;
#else
@ -1650,63 +1926,35 @@ VOID BndStrg_handle_onoff_event(PRTMP_ADAPTER pAd, PBND_STRG_CLI_TABLE table, BN
}
VOID BndStrg_UpdateWhiteBlackList(PRTMP_ADAPTER pAd, PBND_STRG_CLI_TABLE table, BNDSTRG_MSG *msg)
{
struct bnd_msg_update_white_black_list *update_list = &msg->data.update_white_black_list;
int i = 0, max_list_size = 0;
int emptyindex = -1;
UINT8 *list_size;
UCHAR macAddrzero[MAC_ADDR_LEN] = { 0 }, *list = NULL;
{
struct bnd_msg_update_white_black_list *update_list = &msg->data.update_white_black_list;
PLIST_HEADER pUpdateList = NULL;
NDIS_SPIN_LOCK *pBsListLock = NULL;
BND_STRG_PRINTQAMSG(table, update_list->Addr, ("%s: client[%02x:%02x:%02x:%02x:%02x:%02x] %s %s\n",
__func__, PRINT_MAC(update_list->Addr), (update_list->deladd ? "Add to":"Remove From"), ((update_list->list_type == bndstrg_whitelist) ? "WhiteList" : "BlackList")));
BND_STRG_PRINTQAMSG(table, update_list->Addr, ("%s: client[%02x:%02x:%02x:%02x:%02x:%02x] %s %s\n", __func__, PRINT_MAC(update_list->Addr),
(update_list->deladd ? "Add to":"Remove From"), ((update_list->list_type == bndstrg_whitelist) ? "WhiteList" : "BlackList")));
if (update_list->list_type == bndstrg_whitelist) {
list = (UCHAR *)&table->WhiteEntryList;
max_list_size = BND_STRG_MAX_WHITELIST_ENTRY;
list_size = &table->WhiteEntryListSize;
} else if (update_list->list_type == bndstrg_blacklist) {
list = (UCHAR *)&table->BndStrgBlackList;
max_list_size = BND_STRG_MAX_BLACKLIST_ENTRY;
list_size = &table->BndStrgBlackListSize;
} else
return;
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("%s: client[%02x:%02x:%02x:%02x:%02x:%02x] %s %s\n", __func__, PRINT_MAC(update_list->Addr),
(update_list->deladd ? "Add to":"Remove From"), ((update_list->list_type == bndstrg_whitelist) ? "WhiteList" : "BlackList")));
if (update_list->deladd) {
if (update_list->list_type == bndstrg_whitelist) {
pUpdateList = &table->WhiteList;
pBsListLock = &table->WhiteListLock;
} else if (update_list->list_type == bndstrg_blacklist) {
pUpdateList = &table->BlackList;
pBsListLock = &table->BlackListLock;
} else
return;
if ((*list_size) >= max_list_size) {
return;
}
for (i = 0; i < max_list_size; i++) {
if (memcmp((list + (i*MAC_ADDR_LEN)), update_list->Addr, MAC_ADDR_LEN) == 0)
return;
if ((emptyindex == -1) && (memcmp((list + (i*MAC_ADDR_LEN)), macAddrzero, MAC_ADDR_LEN) == 0))
emptyindex = i;
}
if (emptyindex != -1) {
BND_STRG_MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE,
("%s: Add Entry to List [%02x:%02x:%02x:%02x:%02x:%02x]!\n",
__func__, PRINT_MAC((list + (emptyindex*MAC_ADDR_LEN)))));
memcpy((list + (emptyindex*MAC_ADDR_LEN)), update_list->Addr, MAC_ADDR_LEN);
(*list_size)++;
} else {
BND_STRG_MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_WARN,
("%s[%d]: List is full [%d]!\n", __func__, __LINE__, *list_size));
}
} else {
for (i = 0; i < max_list_size; i++) {
if (memcmp((list + (i*MAC_ADDR_LEN)), update_list->Addr, MAC_ADDR_LEN) == 0) {
BND_STRG_MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE,
("%s: Remove Entry from List [%02x:%02x:%02x:%02x:%02x:%02x]!\n",
__func__, PRINT_MAC((list + (i*MAC_ADDR_LEN)))));
memcpy((list + (i*MAC_ADDR_LEN)), macAddrzero, MAC_ADDR_LEN);
(*list_size)--;
}
}
}
if (update_list->deladd) {
NdisAcquireSpinLock(pBsListLock);
AddBsListEntry(pUpdateList, update_list->Addr);
NdisReleaseSpinLock(pBsListLock);
} else {
NdisAcquireSpinLock(pBsListLock);
DelBsListEntry(pUpdateList, update_list->Addr);
NdisReleaseSpinLock(pBsListLock);
}
}
INT BndStrg_MsgHandle(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *wrq, INT apidx)
@ -1757,10 +2005,11 @@ INT BndStrg_MsgHandle(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *wrq, INT apidx
entry = BndStrg_TableLookup(table, cli_add->Addr);
if (entry == NULL) {
BndStrg_InsertEntry(table, cli_add, &entry);
if (table->BndStrgMode == POST_CONNECTION_STEERING) {
entry->bConnStatus = TRUE;
entry->BndStrg_Sta_State = BNDSTRG_STA_ASSOC;
if (BndStrg_InsertEntry(table, cli_add, &entry) == BND_STRG_SUCCESS) {
if (table->BndStrgMode == POST_CONNECTION_STEERING) {
entry->bConnStatus = TRUE;
entry->BndStrg_Sta_State = BNDSTRG_STA_ASSOC;
}
}
}
else

View File

@ -215,10 +215,18 @@ BOOLEAN RTMPSpoofedMgmtDetection(
rssi_info.raw_rssi[0] = rxblk->rx_signal.raw_rssi[0];
rssi_info.raw_rssi[1] = rxblk->rx_signal.raw_rssi[1];
rssi_info.raw_rssi[2] = rxblk->rx_signal.raw_rssi[2];
#if defined(CUSTOMER_DCC_FEATURE) || defined(CONFIG_MAP_SUPPORT)
rssi_info.raw_rssi[3] = rxblk->rx_signal.raw_rssi[3];
#endif
RcvdRssi = RTMPMaxRssi(pAd,
ConvertToRssi(pAd, &rssi_info, RSSI_IDX_0),
ConvertToRssi(pAd, &rssi_info, RSSI_IDX_1),
ConvertToRssi(pAd, &rssi_info, RSSI_IDX_2));
ConvertToRssi(pAd, &rssi_info, RSSI_IDX_2)
#if defined(CUSTOMER_DCC_FEATURE) || defined(CONFIG_MAP_SUPPORT)
, ConvertToRssi(pAd, &rssi_info, RSSI_IDX_3)
#endif
);
switch (FC->SubType) {
case SUBTYPE_ASSOC_RSP:
@ -276,7 +284,11 @@ VOID RTMPConflictSsidDetection(
IN UCHAR SsidLen,
IN CHAR Rssi0,
IN CHAR Rssi1,
IN CHAR Rssi2)
IN CHAR Rssi2
#if defined(CUSTOMER_DCC_FEATURE) || defined(CONFIG_MAP_SUPPORT)
, IN CHAR Rssi3
#endif
)
{
INT i;
@ -289,9 +301,17 @@ VOID RTMPConflictSsidDetection(
rssi_info.raw_rssi[0] = Rssi0;
rssi_info.raw_rssi[1] = Rssi1;
rssi_info.raw_rssi[2] = Rssi2;
#if defined(CUSTOMER_DCC_FEATURE) || defined(CONFIG_MAP_SUPPORT)
rssi_info.raw_rssi[3] = Rssi3;
#endif
RcvdRssi = RTMPMaxRssi(pAd, ConvertToRssi(pAd, &rssi_info, RSSI_IDX_0),
ConvertToRssi(pAd, &rssi_info, RSSI_IDX_1),
ConvertToRssi(pAd, &rssi_info, RSSI_IDX_2));
ConvertToRssi(pAd, &rssi_info, RSSI_IDX_2)
#if defined(CUSTOMER_DCC_FEATURE) || defined(CONFIG_MAP_SUPPORT)
, ConvertToRssi(pAd, &rssi_info, RSSI_IDX_3)
#endif
);
pAd->ApCfg.MBSSID[i].RcvdConflictSsidCount++;
pAd->ApCfg.MBSSID[i].RssiOfRcvdConflictSsid = RcvdRssi;
return;
@ -316,9 +336,17 @@ BOOLEAN RTMPReplayAttackDetection(
rssi_info.raw_rssi[0] = rxblk->rx_signal.raw_rssi[0];
rssi_info.raw_rssi[1] = rxblk->rx_signal.raw_rssi[1];
rssi_info.raw_rssi[2] = rxblk->rx_signal.raw_rssi[2];
#if defined(CUSTOMER_DCC_FEATURE) || defined(CONFIG_MAP_SUPPORT)
rssi_info.raw_rssi[3] = rxblk->rx_signal.raw_rssi[3];
#endif
RcvdRssi = RTMPMaxRssi(pAd, ConvertToRssi(pAd, &rssi_info, RSSI_IDX_0),
ConvertToRssi(pAd, &rssi_info, RSSI_IDX_1),
ConvertToRssi(pAd, &rssi_info, RSSI_IDX_2));
ConvertToRssi(pAd, &rssi_info, RSSI_IDX_2)
#if defined(CUSTOMER_DCC_FEATURE) || defined(CONFIG_MAP_SUPPORT)
, ConvertToRssi(pAd, &rssi_info, RSSI_IDX_3)
#endif
);
pAd->ApCfg.MBSSID[i].RcvdReplayAttackCount++;
pAd->ApCfg.MBSSID[i].RssiOfRcvdReplayAttack = RcvdRssi;
return TRUE;

View File

@ -87,6 +87,14 @@ VOID MBSS_Init(RTMP_ADAPTER *pAd, RTMP_OS_NETDEV_OP_HOOK *pNetDevOps)
if (pAd->FlgMbssInit != FALSE)
return;
#ifdef CREATE_ALL_INTERFACE_AT_INIT
/* Create and initialize all 8 MBSS interfaces duirng
* driver insmod as part of customer requirement
*/
MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("Set 8 Max BSS\n"));
pAd->ApCfg.BssidNum = MAX_MBSS_NUM;
#endif
MaxNumBss = pAd->ApCfg.BssidNum;
if (MaxNumBss > HW_BEACON_MAX_NUM)
@ -128,6 +136,14 @@ VOID MBSS_Init(RTMP_ADAPTER *pAd, RTMP_OS_NETDEV_OP_HOOK *pNetDevOps)
if (ifidx == 0)
autoSuffix = FALSE;
#endif /*MULTI_PROFILE*/
#ifdef INTELP6_SUPPORT
#ifdef CONFIG_RT_SECOND_CARD
if (pAd->dev_idx == 1)
pDevNew = RtmpOSNetDevCreate(MC_RowID, &IoctlIF, INT_MBSSID, IdBss + MAX_MBSS_NUM,
sizeof(struct mt_dev_priv), dev_name, autoSuffix);
else
#endif
#endif
pDevNew = RtmpOSNetDevCreate(MC_RowID, &IoctlIF, INT_MBSSID, ifidx,
sizeof(struct mt_dev_priv), final_name, autoSuffix);
#ifdef HOSTAPD_SUPPORT
@ -168,10 +184,29 @@ VOID MBSS_Init(RTMP_ADAPTER *pAd, RTMP_OS_NETDEV_OP_HOOK *pNetDevOps)
/* init operation functions and flags */
NdisCopyMemory(&netDevHook, pNetDevOps, sizeof(netDevHook));
netDevHook.priv_flags = INT_MBSSID;
#ifdef CREATE_ALL_INTERFACE_AT_INIT
netDevHook.needProtcted = FALSE;
#else
netDevHook.needProtcted = TRUE;
#endif
netDevHook.wdev = wdev;
/* Init MAC address of virtual network interface */
NdisMoveMemory(&netDevHook.devAddr[0], &wdev->bssid[0], MAC_ADDR_LEN);
#ifdef RT_CFG80211_SUPPORT
{
struct wireless_dev *pWdev;
CFG80211_CB *p80211CB = pAd->pCfg80211_CB;
UINT32 DevType = RT_CMD_80211_IFTYPE_AP;
pWdev = kzalloc(sizeof(*pWdev), GFP_KERNEL);
pDevNew->ieee80211_ptr = pWdev;
pWdev->wiphy = p80211CB->pCfg80211_Wdev->wiphy;
SET_NETDEV_DEV(pDevNew, wiphy_dev(pWdev->wiphy));
pWdev->netdev = pDevNew;
pWdev->iftype = DevType;
}
#endif /* RT_CFG80211_SUPPORT */
/* register this device to OS */
status = RtmpOSNetDevAttach(pAd->OpMode, pDevNew, &netDevHook);
}

View File

@ -136,6 +136,19 @@ VOID APMlmePeriodicExec(
USHORT ChannelMovingTime;
#endif
#endif /*A_BAND_SUPPORT*/
#ifdef A4_CONN
UCHAR mbss_idx;
#endif
#ifdef CUSTOMER_DCC_FEATURE
if (pAd->AllowedStaList.StaCount > 0)
RemoveOldStaList(pAd);
APResetStreamingStatus(pAd);
#endif
#ifdef CUSTOMER_DCC_FEATURE
if (pAd->ApEnableBeaconTable == TRUE)
RemoveOldBssEntry(pAd);
#endif
/*
Reqeust by David 2005/05/12
It make sense to disable Adjust Tx Power on AP mode, since we can't
@ -204,6 +217,16 @@ VOID APMlmePeriodicExec(
#ifdef CLIENT_WDS
CliWds_ProxyTabMaintain(pAd);
#endif /* CLIENT_WDS */
#ifdef A4_CONN
for (mbss_idx = 0; mbss_idx < pAd->ApCfg.BssidNum; mbss_idx++)
a4_proxy_maintain(pAd, mbss_idx);
pAd->a4_need_refresh = FALSE;
#endif /* A4_CONN */
#ifdef WIFI_DIAG
DiagApMlmeOneSecProc(pAd);
#endif
}
#ifdef AP_SCAN_SUPPORT
@ -214,12 +237,18 @@ VOID APMlmePeriodicExec(
if (pAd->Mlme.OneSecPeriodicRound % 2 == 0)
ApCliIfMonitor(pAd);
if (pAd->Mlme.OneSecPeriodicRound % 2 == 1
if ((pAd->Mlme.OneSecPeriodicRound % 2 == 1
#ifdef APCLI_AUTO_CONNECT_SUPPORT
&& (pAd->ApCfg.ApCliAutoConnectChannelSwitching == FALSE)
#endif /* APCLI_AUTO_CONNECT_SUPPORT */
)
) ||
(pAd->Mlme.OneSecPeriodicRound % 2 == 1
#ifdef CONFIG_MAP_SUPPORT
&& (IS_MAP_TURNKEY_ENABLE(pAd))
#endif /* APCLI_AUTO_CONNECT_SUPPORT */
)) {
ApCliIfUp(pAd);
}
{
INT loop;
@ -333,6 +362,9 @@ VOID APMlmePeriodicExec(
#ifdef MT_DFS_SUPPORT
DfsNonOccupancyCountDown(pAd);
DfsOutBandCacCountUpdate(pAd);
#ifdef DFS_VENDOR10_CUSTOM_FEATURE
DfsV10W56APDownTimeCountDown(pAd);
#endif
#endif
#ifdef MBO_SUPPORT
MboCheckBssTermination(pAd);
@ -457,6 +489,10 @@ BOOLEAN APMsgTypeSubst(
#endif /* WSC_AP_SUPPORT */
unsigned char hdr_len = LENGTH_802_11;
#ifdef A4_CONN
if ((pFrame->Hdr.FC.FrDs == 1) && (pFrame->Hdr.FC.ToDs == 1))
hdr_len = LENGTH_802_11_WITH_ADDR4;
#endif
/*
TODO:
only PROBE_REQ can be broadcast, all others must be unicast-to-me && is_mybssid;

View File

@ -401,6 +401,7 @@ INT GetMuraPFIDStatProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg)
AndesInitCmdMsg(msg, attr);
#ifdef RT_BIG_ENDIAN
cmd = cpu2le32(cmd);
u4Index = cpu2le32(u4Index);
#endif
AndesAppendCmdMsg(msg, (char *)&cmd, sizeof(cmd));
AndesAppendCmdMsg(msg, (char *)&u4Index, sizeof(u4Index));
@ -932,6 +933,7 @@ INT SetMuraMobilityIntervalCtrlProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg)
#ifdef RT_BIG_ENDIAN
cmd = cpu2le32(cmd);
param.u2MobilityInteral = cpu2le16(param.u2MobilityInteral);
#endif
AndesAppendCmdMsg(msg, (char *)&cmd, sizeof(cmd));
@ -1547,6 +1549,47 @@ error:
}
INT SetMuraEnableHwSwPatch(RTMP_ADAPTER *pAd)
{
INT32 Ret = TRUE;
/* prepare command message */
struct _CMD_ATTRIBUTE attr = {0};
struct cmd_msg *msg = NULL;
UINT32 cmd = MURA_ENABLE_MU_HWSW_PATCH;
CMD_MURGA_ENABLE_HW_SW_PATCH param = {0};
msg = AndesAllocCmdMsg(pAd, sizeof(cmd) + sizeof(param));
if (!msg) {
Ret = FALSE;
goto error;
}
param.ucEnableHwSwPatch = pAd->MuHwSwPatch;
SET_CMD_ATTR_MCU_DEST(attr, HOST2N9);
SET_CMD_ATTR_TYPE(attr, EXT_CID);
SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_MU_MIMO_RA);
SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_RETRY);
SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0);
SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0);
SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL);
SET_CMD_ATTR_RSP_HANDLER(attr, NULL);
AndesInitCmdMsg(msg, attr);
#ifdef RT_BIG_ENDIAN
cmd = cpu2le32(cmd);
#endif
AndesAppendCmdMsg(msg, (char *)&cmd, sizeof(cmd));
AndesAppendCmdMsg(msg, (char *)&param, sizeof(param));
AndesSendCmdMsg(pAd, msg);
error:
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO,
("%s:(Ret = %d_\n", __func__, Ret));
return Ret;
}
/*
==========================================================================
Description:

View File

@ -214,8 +214,11 @@ VOID APMakeBssTimFrame(RTMP_ADAPTER *pAd, INT apidx)
}
write_tmac_info_tim(pAd, apidx, tmac_info, &TimTransmit, FrameLen);
#ifdef BCN_V2_SUPPORT /* add bcn v2 support , 1.5k beacon support */
AsicUpdateBeacon(pAd, wdev, FrameLen, PKT_V2_TIM);
#else
AsicUpdateBeacon(pAd, wdev, FrameLen, PKT_TIM);
#endif
if (0) {
MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF,
("%s(): Dump the TimFrame of BSS%d!\n",

View File

@ -585,6 +585,14 @@ VOID QBSS_LoadUpdate(
#endif /* QLOAD_FUNC_BUSY_TIME_ALARM */
QLOAD_CTRL *pQloadCtrl = HcGetQloadCtrl(pAd);
UINT8 UpdateBands = 1, i = 0;
#ifdef ACS_CTCC_SUPPORT
struct wifi_dev *wdev = NULL;
UCHAR band_idx = 0;
AUTO_CH_CTRL *auto_ch_ctrl = NULL;
wdev = &pAd->ApCfg.MBSSID[MAIN_MBSSID].wdev;
band_idx = HcGetBandByWdev(wdev);
auto_ch_ctrl = HcGetAutoChCtrlbyBandIdx(pAd, band_idx);
#endif
UpdateBands = (pAd->CommonCfg.dbdc_mode == 0)?1:2;
@ -631,8 +639,15 @@ VOID QBSS_LoadUpdate(
continue;
if ((oper.ext_cha != 0) &&
(oper.ht_bw != 0)) {
(oper.ht_bw != 0)
#ifdef OFFCHANNEL_SCAN_FEATURE
&& (!ApScanRunning(pAd, NULL)) && (pAd->ScanCtrl.state == OFFCHANNEL_SCAN_INVALID)
#endif
) {
/* in 20MHz, no need to check busy time of secondary channel */
#ifdef ACS_CTCC_SUPPORT
if (auto_ch_ctrl->AutoChSelCtrl.AutoChScanStatMachine.CurrState == AUTO_CH_SEL_SCAN_IDLE)
#endif
BusyTime = AsicGetChBusyCnt(pAd, 1);
pQloadCtrl->QloadLatestChannelBusyTimeSec = BusyTime;
#ifdef QLOAD_FUNC_BUSY_TIME_STATS

View File

@ -575,6 +575,11 @@ UINT32 ReptTxPktCheckHandler(
eth_type = (pSrcBufVA[12] << 8) | pSrcBufVA[13];
#ifdef VLAN_SUPPORT
if (eth_type == ETH_TYPE_VLAN)
eth_type = (pSrcBufVA[16] << 8) | pSrcBufVA[17];
#endif
pReptEntry = RTMPLookupRepeaterCliEntry(
pAd,
TRUE,
@ -685,6 +690,56 @@ the eth pkt or upper layer pkt connecting rule should be refined.
return USE_CLI_LINK_INFO;
}
REPEATER_CLIENT_ENTRY *RTMPLookupRepeaterCliEntry_NoLock(
IN PVOID pData,
IN BOOLEAN bRealMAC,
IN PUCHAR pAddr,
IN BOOLEAN bIsPad)
{
ULONG HashIdx;
UCHAR tempMAC[6];
REPEATER_CLIENT_ENTRY *pEntry = NULL;
REPEATER_CLIENT_ENTRY_MAP *pMapEntry = NULL;
COPY_MAC_ADDR(tempMAC, pAddr);
HashIdx = MAC_ADDR_HASH_INDEX(tempMAC);
/* NdisAcquireSpinLock(&pAd->ApCfg.ReptCliEntryLock); */
if (bRealMAC == TRUE) {
if (bIsPad == TRUE)
pMapEntry = ((PRTMP_ADAPTER)pData)->ApCfg.ReptMapHash[HashIdx];
else
pMapEntry = *((((REPEATER_ADAPTER_DATA_TABLE *)pData)->MapHash) + HashIdx);
while (pMapEntry) {
pEntry = pMapEntry->pReptCliEntry;
if (pEntry) {
if (pEntry->CliEnable && MAC_ADDR_EQUAL(pEntry->OriginalAddress, tempMAC))
break;
pEntry = NULL;
pMapEntry = pMapEntry->pNext;
} else
pMapEntry = pMapEntry->pNext;
}
} else {
if (bIsPad == TRUE)
pEntry = ((PRTMP_ADAPTER)pData)->ApCfg.ReptCliHash[HashIdx];
else
pEntry = *((((REPEATER_ADAPTER_DATA_TABLE *)pData)->CliHash) + HashIdx);
while (pEntry) {
if (pEntry->CliEnable && MAC_ADDR_EQUAL(pEntry->CurrentAddress, tempMAC))
break;
pEntry = pEntry->pNext;
}
}
return pEntry;
}
VOID RTMPInsertRepeaterEntry(
PRTMP_ADAPTER pAd,
struct wifi_dev *wdev,
@ -718,12 +773,13 @@ VOID RTMPInsertRepeaterEntry(
if ((pReptCliEntry->CliEnable) &&
(MAC_ADDR_EQUAL(pReptCliEntry->OriginalAddress, pAddr) ||
MAC_ADDR_EQUAL(pReptCliEntry->CurrentAddress, pAddr))
) {
(pAd->ApCfg.MACRepeaterOuiMode != VENDOR_DEFINED_MAC_ADDR_OUI
&& MAC_ADDR_EQUAL(pReptCliEntry->CurrentAddress, pAddr)))
) {
NdisReleaseSpinLock(&pAd->ApCfg.ReptCliEntryLock);
MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_INFO,
("\n receive mac :%02x:%02x:%02x:%02x:%02x:%02x !!!\n",
PRINT_MAC(pAddr)));
("\n receive mac :%02x:%02x:%02x:%02x:%02x:%02x !!!\n",
PRINT_MAC(pAddr)));
MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_INFO,
(" duplicate Insert !!!\n"));
return;
@ -777,6 +833,19 @@ VOID RTMPInsertRepeaterEntry(
pReptCliEntry->MatchApCliIdx = wdev->func_idx;
pReptCliEntry->BandIdx = HcGetBandByWdev(wdev);
pReptCliMap->pReptCliEntry = pReptCliEntry;
#ifdef APCLI_SAE_SUPPORT
pReptCliEntry->sae_cfg_group = pAd->ApCfg.ApCliTab[pReptCliEntry->MatchApCliIdx].sae_cfg_group;
#endif
#ifdef APCLI_OWE_SUPPORT
pReptCliEntry->curr_owe_group = pAd->ApCfg.ApCliTab[pReptCliEntry->MatchApCliIdx].curr_owe_group;
#endif
#if defined(APCLI_SAE_SUPPORT) || defined(APCLI_OWE_SUPPORT)
NdisAllocateSpinLock(pAd, &pReptCliEntry->SavedPMK_lock);
#endif
pReptCliMap->pNext = NULL;
COPY_MAC_ADDR(pReptCliEntry->OriginalAddress, pAddr);
COPY_MAC_ADDR(tempMAC, pAddr);
@ -785,40 +854,54 @@ VOID RTMPInsertRepeaterEntry(
MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_ERROR,
("todo !!!\n"));
} else if (pAd->ApCfg.MACRepeaterOuiMode == VENDOR_DEFINED_MAC_ADDR_OUI) {
INT IdxToUse, i;
INT IdxToUse = 0, i;
UCHAR checkMAC[MAC_ADDR_LEN];
UCHAR flag = 0;
COPY_MAC_ADDR(checkMAC, pAddr);
for (idx = 0; idx < rept_vendor_def_oui_table_size; idx++) {
if (RTMPEqualMemory(VENDOR_DEFINED_OUI_ADDR[idx], pAddr, OUI_LEN))
continue;
else {
if (RTMPEqualMemory(VENDOR_DEFINED_OUI_ADDR[idx], pAddr, OUI_LEN)) {
if (idx < rept_vendor_def_oui_table_size - 1) {
NdisCopyMemory(checkMAC,
VENDOR_DEFINED_OUI_ADDR[idx+1], OUI_LEN);
for (i = 0; i < pAd->ApCfg.BssidNum; i++) {
if (MAC_ADDR_EQUAL(
pAd->ApCfg.MBSSID[i].wdev.if_addr,
checkMAC)) {
flag = 1;
break;
}
}
if (i >= pAd->ApCfg.BssidNum) {
IdxToUse = idx+1;
break;
}
}
} else if (flag == 1) {
NdisCopyMemory(checkMAC, VENDOR_DEFINED_OUI_ADDR[idx], OUI_LEN);
for (i = 0; i < pAd->ApCfg.BssidNum; i++) {
if (MAC_ADDR_EQUAL(pAd->ApCfg.MBSSID[i].wdev.if_addr, checkMAC))
break;
}
if (i >= pAd->ApCfg.BssidNum)
if (i >= pAd->ApCfg.BssidNum) {
IdxToUse = idx;
break;
}
}
}
/*
If there is a matched one can be used
otherwise, use the first one.
*/
if (idx >= 0 && idx < rept_vendor_def_oui_table_size)
IdxToUse = idx;
else
IdxToUse = 0;
NdisCopyMemory(tempMAC, VENDOR_DEFINED_OUI_ADDR[IdxToUse], OUI_LEN);
} else
NdisCopyMemory(tempMAC, wdev->if_addr, OUI_LEN);
if (RTMPLookupRepeaterCliEntry_NoLock(pAd, FALSE, tempMAC, TRUE) != NULL) {
NdisReleaseSpinLock(&pAd->ApCfg.ReptCliEntryLock);
MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_ERROR,
("ReptCLI duplicate Insert %02x:%02x:%02x:%02x:%02x:%02x !\n",
PRINT_MAC(tempMAC)));
return;
}
COPY_MAC_ADDR(pReptCliEntry->CurrentAddress, tempMAC);
pReptCliEntry->CliEnable = TRUE;
pReptCliEntry->CliConnectState = REPT_ENTRY_CONNTING;
@ -870,6 +953,17 @@ VOID RTMPInsertRepeaterEntry(
MlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_MT2_AUTH_REQ,
sizeof(APCLI_CTRL_MSG_STRUCT), &ApCliCtrlMsg, wdev->func_idx);
RTMP_MLME_HANDLER(pAd);
#ifdef MTFWD
MTWF_LOG(DBG_CAT_RX, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("Insert MacRep Sta:%pM, orig MAC:%pM, %s\n",
tempMAC, pReptCliEntry->OriginalAddress, wdev->if_dev->name));
RtmpOSWrielessEventSend(pAd->net_dev,
RT_WLAN_EVENT_CUSTOM,
FWD_CMD_ADD_TX_SRC,
NULL,
tempMAC,
MAC_ADDR_LEN);
#endif
}
VOID RTMPRemoveRepeaterEntry(
@ -904,6 +998,11 @@ VOID RTMPRemoveRepeaterEntry(
return;
}
#if defined(APCLI_SAE_SUPPORT) || defined(APCLI_OWE_SUPPORT)
NdisFreeSpinLock(&pEntry->SavedPMK_lock);
#endif
/*Release OMAC Idx*/
HcDelRepeaterEntry(pEntry->wdev, CliIdx);
HashIdx = MAC_ADDR_HASH_INDEX(pEntry->CurrentAddress);
@ -985,6 +1084,15 @@ done:
ReptLinkDownComplete(pEntry);
NdisReleaseSpinLock(&pAd->ApCfg.ReptCliEntryLock);
#ifdef MTFWD
MTWF_LOG(DBG_CAT_RX, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("Remove MacRep Sta:%pM\n", pEntry->CurrentAddress));
RtmpOSWrielessEventSend(pEntry->wdev->if_dev,
RT_WLAN_EVENT_CUSTOM,
FWD_CMD_DEL_TX_SRC,
NULL,
pEntry->CurrentAddress,
MAC_ADDR_LEN);
#endif
}
VOID RTMPRepeaterReconnectionCheck(
@ -1214,23 +1322,72 @@ VOID RepeaterLinkMonitor(RTMP_ADAPTER *pAd)
STA_TR_ENTRY *tr_entry = NULL;
APCLI_CTRL_MSG_STRUCT msg;
UCHAR CliIdx;
UCHAR TimeoutVal = 5;
#if defined(APCLI_SAE_SUPPORT) || defined(APCLI_OWE_SUPPORT)
APCLI_STRUCT *papcli_entry = NULL;
TimeoutVal = 30;
#endif
if ((pAd->ApCfg.bMACRepeaterEn) && (ReptPool != NULL)) {
for (CliIdx = 0; CliIdx < GET_MAX_REPEATER_ENTRY_NUM(cap); CliIdx++) {
pReptCliEntry = &pAd->ApCfg.pRepeaterCliPool[CliIdx];
#if defined(APCLI_SAE_SUPPORT) || defined(APCLI_OWE_SUPPORT)
papcli_entry = &pAd->ApCfg.ApCliTab[pReptCliEntry->MatchApCliIdx];
#endif
if (pReptCliEntry->CliEnable) {
Wcid = pReptCliEntry->MacTabWCID;
tr_entry = &pAd->MacTab.tr_entry[Wcid];
if ((tr_entry->PortSecured != WPA_802_1X_PORT_SECURED) &&
RTMP_TIME_AFTER(pAd->Mlme.Now32, (pReptCliEntry->CliTriggerTime + (5 * OS_HZ)))) {
RTMP_TIME_AFTER(pAd->Mlme.Now32, (pReptCliEntry->CliTriggerTime + (TimeoutVal * OS_HZ)))) {
if (pReptCliEntry->CtrlCurrState == APCLI_CTRL_DISCONNECTED)
HW_REMOVE_REPT_ENTRY(pAd, pReptCliEntry->MatchApCliIdx, CliIdx);
else {
if (!VALID_UCAST_ENTRY_WCID(pAd, Wcid))
continue;
#if defined(APCLI_SAE_SUPPORT) || defined(APCLI_OWE_SUPPORT)
if (IS_AKM_SAE_SHA256(papcli_entry->MlmeAux.AKMMap) || IS_AKM_OWE(papcli_entry->MlmeAux.AKMMap)) {
UCHAR pmkid[LEN_PMKID];
UCHAR pmk[LEN_PMK];
INT cached_idx;
UCHAR if_index = papcli_entry->wdev.func_idx;
/*Update PMK cache and delete sae instance*/
if (
#ifdef APCLI_SAE_SUPPORT
(IS_AKM_SAE_SHA256(papcli_entry->MlmeAux.AKMMap) &&
sae_get_pmk_cache(&pAd->SaeCfg, pReptCliEntry->CurrentAddress, papcli_entry->MlmeAux.Bssid, pmkid, pmk))
#endif
) {
cached_idx = apcli_search_pmkid_cache(pAd, papcli_entry->MlmeAux.Bssid, if_index, CliIdx);
if (cached_idx != INVALID_PMKID_IDX) {
#ifdef APCLI_SAE_SUPPORT
SAE_INSTANCE *pSaeIns = search_sae_instance(&pAd->SaeCfg, pReptCliEntry->CurrentAddress, papcli_entry->MlmeAux.Bssid);
MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_ERROR,
("%s:Connection falied with pmkid ,delete cache entry and sae instance \n", __func__));
if (pSaeIns != NULL) {
delete_sae_instance(pSaeIns);
pSaeIns = NULL;
}
#endif
apcli_delete_pmkid_cache(pAd, papcli_entry->MlmeAux.Bssid, if_index, CliIdx);
}
}
}
#endif
pReptCliEntry->Disconnect_Sub_Reason = APCLI_DISCONNECT_SUB_REASON_REPTLM_TRIGGER_TOO_LONG;
NdisZeroMemory(&msg, sizeof(APCLI_CTRL_MSG_STRUCT));
msg.BssIdx = pReptCliEntry->MatchApCliIdx;

View File

@ -55,7 +55,9 @@ VOID APPMFInit(
*/
pSecConfig->PmfCfg.MFPC = TRUE;
pSecConfig->PmfCfg.MFPR = (IS_AKM_WPA2PSK(pSecConfig->AKMMap)) ? FALSE : TRUE;
} else if (IS_AKM_WPA3(pSecConfig->AKMMap) || IS_AKM_OWE(pSecConfig->AKMMap)) {
} else if (IS_AKM_WPA3_192BIT(pSecConfig->AKMMap)
|| IS_AKM_OWE(pSecConfig->AKMMap)
|| IS_AKM_WPA3(pSecConfig->AKMMap)) {
/* In WPA3 spec, When WPA3-Enterprise Suite B is used,
* Protected Management Frame (PMF) shall be set to required (MFPR=1).
*/
@ -75,16 +77,10 @@ VOID APPMFInit(
MTWF_LOG(DBG_CAT_SEC, CATSEC_PMF, DBG_LVL_ERROR, ("[PMF]%s:: Security is not WPA2/WPA2PSK AES\n", __func__));
if (pSecConfig->PmfCfg.MFPC) {
/* default IGTK cipher is BIP-CMAC-128 */
if (pSecConfig->PmfCfg.igtk_cipher == 0x0) {
if (IS_AKM_WPA3(pSecConfig->AKMMap))
SET_CIPHER_BIP_GMAC256(pSecConfig->PmfCfg.igtk_cipher);
else
SET_CIPHER_BIP_CMAC128(pSecConfig->PmfCfg.igtk_cipher);
MTWF_LOG(DBG_CAT_SEC, CATSEC_PMF, DBG_LVL_ERROR,
("[PMF]%s: IGTK cipher is none, initail IGTK cipher to %s\n",
__func__, GetEncryModeStr(pSecConfig->PmfCfg.igtk_cipher)));
}
if (IS_AKM_WPA3_192BIT(pSecConfig->AKMMap))
SET_CIPHER_BIP_GMAC256(pSecConfig->PmfCfg.igtk_cipher);
else
SET_CIPHER_BIP_CMAC128(pSecConfig->PmfCfg.igtk_cipher);
}
MTWF_LOG(DBG_CAT_SEC, CATSEC_PMF, DBG_LVL_ERROR, ("[PMF]%s:: apidx=%d, MFPC=%d, MFPR=%d, SHA256=%d\n",
@ -320,6 +316,10 @@ VOID GroupRekeyExec(
if (IS_ENTRY_CLIENT(pEntry)
&& (pEntry->SecConfig.Handshake.WpaState == AS_PTKINITDONE)
&& (pEntry->func_tb_idx == apidx)) {
#ifdef A4_CONN
if (IS_ENTRY_A4(pEntry))
continue;
#endif /* A4_CONN */
entry_count++;
RTMPSetTimer(&pEntry->SecConfig.StartFor2WayTimer, ENQUEUE_EAPOL_2WAY_START_TIMER);
MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("Rekey interval excess, Update Group Key for %02X:%02X:%02X:%02X:%02X:%02X , DefaultKeyId= %x\n",
@ -642,6 +642,8 @@ VOID WpaSend(RTMP_ADAPTER *pAdapter, UCHAR *pPacket, ULONG Len)
break;
case EAP_CODE_FAILURE:
MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("Send Deauth, Reason : REASON_8021X_AUTH_FAIL\n"));
MlmeDeAuthAction(pAdapter, pEntry, REASON_8021X_AUTH_FAIL, FALSE);
break;
default:
@ -653,7 +655,6 @@ VOID WpaSend(RTMP_ADAPTER *pAdapter, UCHAR *pPacket, ULONG Len)
}
}
INT RTMPAddPMKIDCache(
IN NDIS_AP_802_11_PMKID * pPMKIDCache,
IN INT apidx,
@ -752,7 +753,6 @@ INT RTMPValidatePMKIDCache(
return INVALID_PMKID_IDX;
}
VOID RTMPDeletePMKIDCache(
IN NDIS_AP_802_11_PMKID * pPMKIDCache,
IN INT apidx,
@ -786,5 +786,24 @@ VOID RTMPMaintainPMKIDCache(
}
}
#endif /* DOT1X_SUPPORT */
UCHAR is_rsne_pmkid_cache_match(
IN UINT8 *rsnie,
IN UINT rsnie_len,
IN NDIS_AP_802_11_PMKID * pmkid_cache,
IN INT apidx,
IN UCHAR *addr,
OUT INT* cacheidx)
{
UINT8 *pmkid = NULL;
UINT8 pmkid_count;
pmkid = WPA_ExtractSuiteFromRSNIE(rsnie, rsnie_len, PMKID_LIST, &pmkid_count);
if (pmkid != NULL) {
*cacheidx = RTMPValidatePMKIDCache(pmkid_cache, apidx, addr, pmkid);
return TRUE;
}
return FALSE;
}
#endif /* DOT1X_SUPPORT */

View File

@ -16,6 +16,7 @@
#include "rt_config.h"
#include "mcu/mt_cmd.h"
#include "hdev/hdev.h"
#ifdef VOW_SUPPORT
#define UMAC_DRR_TABLE_CTRL0 (0x00008388)
@ -803,7 +804,7 @@ INT vow_set_at_estimator_group(PRTMP_ADAPTER pad, UINT32 subcmd, UINT8 group_id)
at_proc.rAtProcGeneralCtrl.rAtEstimateSubCtrl.u2GroupMinRatioValue[group_id] = cpu2le16(pad->vow_bss_cfg[group_id].min_airtime_ratio);
#ifdef RT_BIG_ENDIAN
at_proc.rAtProcGeneralCtrl.rAtEstimateSubCtrl.u4GroupRatioBitMask =
cpu2le16(at_proc.rAtProcGeneralCtrl.rAtEstimateSubCtrl.u4GroupRatioBitMask);
cpu2le32(at_proc.rAtProcGeneralCtrl.rAtEstimateSubCtrl.u4GroupRatioBitMask);
#endif
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("%s:(cmd = 0x%x, subcmd = 0x%x, group %d, val = 0x%x/0x%x)\n",
__func__, at_proc.u4CtrlFieldID, at_proc.u4CtrlSubFieldID, group_id,
@ -4148,6 +4149,18 @@ VOID vow_display_info_periodic(
rx_diff_time = rx_sum - vow_last_rx_time[i];
vow_tx_time[i] += tx_diff_time;
vow_rx_time[i] += rx_diff_time;
#ifdef CUSTOMER_DCC_FEATURE
{
PMAC_TABLE_ENTRY pEntry = NULL;
if (VALID_UCAST_ENTRY_WCID(pAd, i))
pEntry = &pAd->MacTab.Content[i];
if (IS_ENTRY_CLIENT(pEntry) && (pEntry->Sst == SST_ASSOC) && pEntry->pMbss) {
pEntry->ChannelUseTime += tx_diff_time + rx_diff_time;
pEntry->pMbss->ChannelUseTime += tx_diff_time + rx_diff_time;
}
}
#endif
vow_last_tx_time[i] = tx_sum;
vow_last_rx_time[i] = rx_sum;
vow_sum_tx_rx_time += tx_diff_time + rx_diff_time;
@ -4384,6 +4397,54 @@ VOID vow_avg_pkt_len_calculate(struct _MAC_TABLE_ENTRY *entry)
((mctrl->pkt_avg_len * mctrl->sta_nums) + avg_pkt_len) / (mctrl->sta_nums + 1);
mctrl->sta_nums++;
}
#if defined (CONFIG_VOW_VIDEO_PARAM)
void set_vow_video_param(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, UINT8 opmode)
{
struct hdev_obj *obj;
UINT8 pkt_num, retry_limit;
UINT32 length;
PEDCA_PARM pEdcaParm = NULL;
UINT8 band_idx;
struct video_ctl *videoctl = &pAd->vow_video_ctl;
ASSERT(wdev);
band_idx = HcGetBandByWdev(wdev);
obj = wdev->pHObj;
if (!hdev_obj_state_ready(obj))
return;
pEdcaParm = HcGetEdca(pAd, wdev);
pkt_num = wlan_operate_get_rts_pkt_thld(wdev);
retry_limit = wlan_operate_get_rts_retry_limit(wdev);
length = wlan_operate_get_rts_len_thld(wdev);
if (opmode == VOW_VIDEO_SET_PARAM) {
os_move_mem(&videoctl->edca_backup[obj->WmmIdx], pEdcaParm, sizeof(EDCA_PARM));
videoctl->rts_thld_pkt_num_backup[band_idx] = pkt_num;
pkt_num = VIDEO_RTS_PKT_THLD;
pEdcaParm->Cwmax[WMM_AC_VO] = VIDEO_CWMAX;
pEdcaParm->Cwmax[WMM_AC_VI] = VIDEO_CWMAX;
videoctl->rts_retry_limit_backup = retry_limit;
retry_limit = VIDEO_RTS_RETRY_LIMIT;
MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF,
("\n\x1b[31mCwmaxVO:%d CwmaxVI:%d rts [%d %d %d] wmm_idx:%d!\x1b[m\n",
pEdcaParm->Cwmax[WMM_AC_VO],
pEdcaParm->Cwmax[WMM_AC_VI], pkt_num, length, retry_limit, obj->WmmIdx));
} else {
/* restore parameter */
os_move_mem(pEdcaParm, &videoctl->edca_backup[obj->WmmIdx], sizeof(EDCA_PARM));
pkt_num = videoctl->rts_thld_pkt_num_backup[band_idx];
retry_limit = videoctl->rts_retry_limit_backup;
MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF,
("\n\x1b[32mCwmaxVO:%d CwmaxVI:%d rts [%d %d %d] wmm_idx:%d!\x1b[m\n",
pEdcaParm->Cwmax[WMM_AC_VO],
pEdcaParm->Cwmax[WMM_AC_VI], pkt_num, length, retry_limit, obj->WmmIdx));
}
HW_SET_RTS_THLD(pAd, wdev, pkt_num, length, retry_limit);
HW_SET_EDCA(pAd, wdev, pEdcaParm);
}
#endif
#else
VOID vow_atf_off_init(PRTMP_ADAPTER pad)
{

View File

@ -256,8 +256,10 @@ BOOLEAN wds_bss_linkdown(
return FALSE;
}
MlmeEnqueueWithWdev(pAd, WDS_STATE_MACHINE, WDS_BSS_LINKDOWN, sizeof(USHORT),
&wcid, 0, pEntry->wdev);
if (wdev_do_linkdown(pEntry->wdev) != TRUE)
MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("%s() linkdown fail!!!\n", __func__));
mac_entry_delete(pAd, pEntry);
return TRUE;
}
@ -615,6 +617,12 @@ MAC_TABLE_ENTRY *FindWdsEntry(
pRxBlk->rx_signal.raw_rssi[1],
pRxBlk->rx_signal.raw_rssi[2],
pRxBlk->rx_signal.raw_rssi[3],
#if defined(CUSTOMER_DCC_FEATURE) || defined(CONFIG_MAP_SUPPORT)
pRxBlk->rx_signal.raw_snr[0],
pRxBlk->rx_signal.raw_snr[1],
pRxBlk->rx_signal.raw_snr[2],
pRxBlk->rx_signal.raw_snr[3],
#endif
(rxd_base != NULL) ? rxd_base->RxD1.ChFreq : 0,
0,
OPMODE_AP,

View File

@ -58,7 +58,10 @@ MAC_TABLE_ENTRY *PACInquiry(RTMP_ADAPTER *pAd, UCHAR Wcid)
*/
VOID HandleCounterMeasure(RTMP_ADAPTER *pAd, MAC_TABLE_ENTRY *pEntry)
{
#ifndef RT_CFG80211_SUPPORT
INT i;
#endif
BOOLEAN Cancelled;
if (!pEntry)
@ -68,9 +71,11 @@ VOID HandleCounterMeasure(RTMP_ADAPTER *pAd, MAC_TABLE_ENTRY *pEntry)
if (IS_ENTRY_APCLI(pEntry) || IS_ENTRY_REPEATER(pEntry))
return;
/* if entry not set key done, ignore this RX MIC ERROR */
#ifndef RT_CFG80211_SUPPORT
/* if entry not set key done, ignore this RX MIC ERROR */
if ((pEntry->SecConfig.Handshake.WpaState < AS_PTKINITDONE) || (pEntry->SecConfig.Handshake.GTKState != REKEY_ESTABLISHED))
return;
#endif
MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("HandleCounterMeasure ===>\n"));
/* record which entry causes this MIC error, if this entry sends disauth/disassoc, AP doesn't need to log the CM */
@ -78,18 +83,32 @@ VOID HandleCounterMeasure(RTMP_ADAPTER *pAd, MAC_TABLE_ENTRY *pEntry)
pAd->ApCfg.MICFailureCounter++;
/* send wireless event - for MIC error */
RTMPSendWirelessEvent(pAd, IW_MIC_ERROR_EVENT_FLAG, pEntry->Addr, 0, 0);
#ifdef RT_CFG80211_SUPPORT
{
const UCHAR tsc[6] = {0, 0, 0, 0, 0, 0};
PNET_DEV pNetDev = pAd->ApCfg.MBSSID[pEntry->func_tb_idx].wdev.if_dev;
/* NL80211_KEYTYPE_PAIRWISE = 1, tsc = tsc of frame causing mic failure */
MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR,
("%s:calling cfg event to HandleCounterMeasure\n", __FUNCTION__));
cfg80211_michael_mic_failure(pNetDev, pEntry->Addr, 1, 0, tsc, GFP_KERNEL);
}
#endif
if (pAd->ApCfg.CMTimerRunning == TRUE) {
MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, ("Receive CM Attack Twice within 60 seconds ====>>>\n"));
/* send wireless event - for counter measures */
RTMPSendWirelessEvent(pAd, IW_COUNTER_MEASURES_EVENT_FLAG, pEntry->Addr, 0, 0);
ApLogEvent(pAd, pEntry->Addr, EVENT_COUNTER_M);
#ifndef RT_CFG80211_SUPPORT
/* renew GTK */
GenRandom(pAd, pAd->ApCfg.MBSSID[pEntry->func_tb_idx].wdev.bssid, pAd->ApCfg.MBSSID[pEntry->func_tb_idx].GNonce);
#endif
/* Cancel CounterMeasure Timer */
RTMPCancelTimer(&pAd->ApCfg.CounterMeasureTimer, &Cancelled);
pAd->ApCfg.CMTimerRunning = FALSE;
#ifndef RT_CFG80211_SUPPORT
for (i = 0; VALID_UCAST_ENTRY_WCID(pAd, i); i++) {
struct wifi_dev *wdev = pAd->MacTab.Content[i].wdev;
/* happened twice within 60 sec, AP SENDS disaccociate all associated STAs. All STA's transition to State 2 */
@ -97,6 +116,7 @@ VOID HandleCounterMeasure(RTMP_ADAPTER *pAd, MAC_TABLE_ENTRY *pEntry)
&& wdev->channel == pEntry->wdev->channel)
MlmeDeAuthAction(pAd, &pAd->MacTab.Content[i], REASON_MIC_FAILURE, FALSE);
}
#endif
/*
Further, ban all Class 3 DATA transportation for a period 0f 60 sec

View File

@ -292,6 +292,9 @@ static VOID ApCliMlmeAssocReqAction(
USHORT ifIndex = (USHORT)(Elem->Priv);
PULONG pCurrState = NULL;
struct _RTMP_CHIP_CAP *cap;
#if defined(WPA_SUPPLICANT_SUPPORT) || defined(RT_CFG80211_P2P_CONCURRENT_DEVICE) || defined(CFG80211_MULTI_STA) || defined(APCLI_CFG80211_SUPPORT)
USHORT VarIesOffset = 0;
#endif /* WPA_SUPPLICANT_SUPPORT */
APCLI_STRUCT *apcli_entry;
struct wifi_dev *wdev;
#ifdef MAC_REPEATER_SUPPORT
@ -622,7 +625,7 @@ static VOID ApCliMlmeAssocReqAction(
FrameLen += tmp;
}
#if defined(RT_CFG80211_P2P_CONCURRENT_DEVICE) || defined(CFG80211_MULTI_STA)
#if defined(RT_CFG80211_P2P_CONCURRENT_DEVICE) || defined(CFG80211_MULTI_STA) || defined(APCLI_CFG80211_SUPPORT)
apcli_entry->ReqVarIELen = 0;
NdisZeroMemory(apcli_entry->ReqVarIEs, MAX_VIE_LEN);
@ -651,6 +654,42 @@ static VOID ApCliMlmeAssocReqAction(
&& !(apcli_entry->wdev.WscControl.bWscTrigger)))
#endif /* WSC_AP_SUPPORT */
) {
#if (defined(FAST_EAPOL_WAR) && (defined(APCLI_SAE_SUPPORT) || defined(APCLI_OWE_SUPPORT)))
{
ULONG TempLen = 0;
CHAR rsne_idx = 0;
MAC_TABLE_ENTRY *pentry = (MAC_TABLE_ENTRY *)NULL;
#ifdef MAC_REPEATER_SUPPORT
if ((pAd->ApCfg.bMACRepeaterEn) &&
(CliIdx != 0xFF)) {
if (pReptEntry->pre_entry_alloc == TRUE)
pentry = &pAd->MacTab.Content[pReptEntry->MacTabWCID];
} else
#endif /* MAC_REPEATER_SUPPORT */
{
if (apcli_entry->pre_entry_alloc == TRUE)
pentry = &pAd->MacTab.Content[apcli_entry->MacTabWCID];
}
WPAMakeRSNIE(wdev->wdev_type, &pentry->SecConfig, pentry);
for (rsne_idx = 0; rsne_idx < SEC_RSNIE_NUM; rsne_idx++) {
if (pentry->SecConfig.RSNE_Type[rsne_idx] == SEC_RSNIE_NONE)
continue;
MakeOutgoingFrame(pOutBuffer + FrameLen, &TempLen,
1, &pentry->SecConfig.RSNE_EID[rsne_idx][0],
1, &pentry->SecConfig.RSNE_Len[rsne_idx],
pentry->SecConfig.RSNE_Len[rsne_idx], &pentry->SecConfig.RSNE_Content[rsne_idx][0],
END_OF_ARGS);
FrameLen += TempLen;
}
}
#else
{
ULONG TempLen = 0;
CHAR rsne_idx = 0;
@ -709,6 +748,7 @@ static VOID ApCliMlmeAssocReqAction(
FrameLen += TempLen;
}
}
#endif
}
#ifdef WSC_AP_SUPPORT
@ -735,6 +775,8 @@ static VOID ApCliMlmeAssocReqAction(
}
#endif /* WSC_AP_SUPPORT */
#if (!(defined(APCLI_SAE_SUPPORT) || defined(APCLI_OWE_SUPPORT)))
#ifdef FAST_EAPOL_WAR
/*
* insert WTBL here,unicast wcid can be found after associate request sent out
@ -800,6 +842,79 @@ static VOID ApCliMlmeAssocReqAction(
}
}
#endif /* FAST_EAPOL_WAR */
#endif
#if (defined(FAST_EAPOL_WAR) && defined(APCLI_OWE_SUPPORT))
{
MAC_TABLE_ENTRY *pentry = (MAC_TABLE_ENTRY *)NULL;
OWE_INFO *owe = NULL;
UCHAR *curr_group = NULL;
#ifdef MAC_REPEATER_SUPPORT
if ((pAd->ApCfg.bMACRepeaterEn) &&
(CliIdx != 0xFF)) {
if (pReptEntry->pre_entry_alloc == TRUE)
pentry = &pAd->MacTab.Content[pReptEntry->MacTabWCID];
curr_group = &pReptEntry->curr_owe_group;
} else
#endif /* MAC_REPEATER_SUPPORT */
{
if (apcli_entry->pre_entry_alloc == TRUE)
pentry = &pAd->MacTab.Content[apcli_entry->MacTabWCID];
curr_group = &apcli_entry->curr_owe_group;
}
owe = &pentry->SecConfig.owe;
if (IS_AKM_OWE(pentry->SecConfig.AKMMap)) {
/* FAST_EAPOL_WAR creates the mactable entry has already been created before Auth phase *
So we can use the mactable entry sec_config instead of Apcli wdev.sec_config*/
/* OWE use intialize group and add owe dh key ie to assoc request */
if (init_owe_group(owe, *curr_group) == 0) {
MTWF_LOG(DBG_CAT_SEC, CATSEC_OWE, DBG_LVL_ERROR,
("==> %s(), init_owe_group failed. shall not happen!\n", __func__));
*pCurrState = APCLI_ASSOC_IDLE;
ApCliCtrlMsg.Status = MLME_UNSPECIFY_FAIL;
MlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_ASSOC_RSP,
sizeof(APCLI_CTRL_MSG_STRUCT), &ApCliCtrlMsg, ifIndex);
return;
}
if (*curr_group == ECDH_GROUP_384)
pentry->SecConfig.key_deri_alg = SEC_KEY_DERI_SHA384;
else
pentry->SecConfig.key_deri_alg = SEC_KEY_DERI_SHA256;
FrameLen += build_owe_dh_ie(pAd, pentry, (UCHAR *)(pOutBuffer + FrameLen), *curr_group);
}
}
#endif /*CONFIG_OWE_SUPPORT*/
#ifdef CONFIG_MAP_SUPPORT
if (IS_MAP_ENABLE(pAd))
MAP_InsertMapCapIE(pAd, wdev, pOutBuffer+FrameLen, &FrameLen);
#endif /* CONFIG_MAP_SUPPORT */
#ifdef IGMP_TVM_SUPPORT
/* ADD TV IE to this packet */
MakeTVMIE(pAd, wdev, pOutBuffer, &FrameLen);
#endif /* IGMP_TVM_SUPPORT */
MiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, FrameLen);
MlmeFreeMemory(pOutBuffer);
@ -919,6 +1034,9 @@ static VOID ApCliMlmeDisassocReqAction(
#if defined(RT_CFG80211_P2P_CONCURRENT_DEVICE) || defined(CFG80211_MULTI_STA)
RT_CFG80211_LOST_GO_INFORM(pAd);
#endif /* RT_CFG80211_P2P_CONCURRENT_DEVICE || CFG80211_MULTI_STA */
#ifdef APCLI_CFG80211_SUPPORT
RT_CFG80211_LOST_AP_INFORM(pAd);
#endif /* APCLI_CFG80211_SUPPORT */
}
@ -995,14 +1113,14 @@ static VOID ApCliPeerAssocRspAction(
&EdcaParm, &CkipFlag, ie_list)) {
/* The frame is for me ? */
if (MAC_ADDR_EQUAL(Addr2, pAd->ApCfg.ApCliTab[ifIndex].MlmeAux.Bssid)) {
#if defined(RT_CFG80211_P2P_CONCURRENT_DEVICE) || defined(CFG80211_MULTI_STA)
#if defined(RT_CFG80211_P2P_CONCURRENT_DEVICE) || defined(CFG80211_MULTI_STA) || defined(APCLI_CFG80211_SUPPORT)
PFRAME_802_11 pFrame = (PFRAME_802_11) (Elem->Msg);
/* Store the AssocRsp Frame to wpa_supplicant via CFG80211 */
NdisZeroMemory(pAd->ApCfg.ApCliTab[ifIndex].ResVarIEs, MAX_VIE_LEN);
pAd->ApCfg.ApCliTab[ifIndex].ResVarIELen = 0;
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 */
#endif /* RT_CFG80211_P2P_CONCURRENT_DEVICE || CFG80211_MULTI_STA || APCLI_CFG80211_SUPPORT*/
MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, ("APCLI_ASSOC - receive ASSOC_RSP to me (status=%d)\n",
Status));
@ -1017,6 +1135,10 @@ static VOID ApCliPeerAssocRspAction(
if (Status == MLME_SUCCESS) {
#ifdef CONFIG_MAP_SUPPORT
if (IS_MAP_ENABLE(pAd))
pEntry->DevPeerRole = ie_list->MAP_AttriValue;
#endif /* CONFIG_MAP_SUPPORT */
/* go to procedure listed on page 376 */
#ifdef MAC_REPEATER_SUPPORT
if (CliIdx == 0xFF)
@ -1043,16 +1165,87 @@ static VOID ApCliPeerAssocRspAction(
#endif /* DOT11_VHT_AC */
}
#ifdef MAC_REPEATER_SUPPORT
if (CliIdx != 0xFF)
pEntry = &pAd->MacTab.Content[pReptEntry->MacTabWCID];
#endif /* MAC_REPEATER_SUPPORT */
set_mlme_rsn_ie(pAd, &pApCliEntry->wdev, pEntry);
#ifdef APCLI_OWE_SUPPORT
if (IS_AKM_OWE(pEntry->SecConfig.AKMMap)) {
UINT8 *pmkid = NULL;
UINT8 pmkid_count = 0;
INT idx = 0;
pmkid = WPA_ExtractSuiteFromRSNIE(ie_list->RSN_IE,
ie_list->RSNIE_Len,
PMKID_LIST,
&pmkid_count);
if (pmkid != NULL) {
idx = apcli_search_pmkid_cache(pAd, Addr2, ifIndex, CliIdx);
if ((idx == INVALID_PMKID_IDX) ||
((pEntry->SecConfig.pmkid) &&
((RTMPEqualMemory(pmkid,
pEntry->SecConfig.pmkid,
LEN_PMKID)) == 0))) {
MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR,
("%s: no OWE PMKID, do normal ECDH procedure\n",
__func__));
ApCliCtrlMsg.Status = MLME_UNSPECIFY_FAIL;
MlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_ASSOC_RSP,
sizeof(APCLI_CTRL_MSG_STRUCT), &ApCliCtrlMsg, ifIndex);
RTMP_MLME_HANDLER(pAd);
}
} else {
pEntry->need_process_ecdh_ie = TRUE;
/*Process ECDH IE as no pmkid in assoc rsp rsnie ,PMK id sent might have been invalid at AP ,need to clear seconfig pmk cache*/
idx = apcli_search_pmkid_cache(pAd, Addr2, ifIndex, CliIdx);
if ((idx != INVALID_PMKID_IDX) && (is_pmkid_cache_in_sec_config(&pEntry->SecConfig))) {
apcli_delete_pmkid_cache(pAd, Addr2, ifIndex, CliIdx);
pEntry->SecConfig.pmkid = NULL;
pEntry->SecConfig.pmk_cache = NULL;
}
}
if ((pEntry->need_process_ecdh_ie == TRUE) && (ie_list->ecdh_ie.length > 0))
NdisMoveMemory(&pEntry->ecdh_ie, &ie_list->ecdh_ie, sizeof(EXT_ECDH_PARAMETER_IE));
}
#endif /*CONFIG_OWE_SUPPORT*/
/* For Repeater get correct wmm valid setting */
pApCliEntry->MlmeAux.APEdcaParm.bValid = EdcaParm.bValid;
ApCliCtrlMsg.Status = MLME_SUCCESS;
#ifdef APCLI_AS_WDS_STA_SUPPORT
{
PMAC_TABLE_ENTRY pEntry = &pAd->MacTab.Content[pApCliEntry->MacTabWCID];
if (!(IS_AKM_WPA_CAPABILITY_Entry(pEntry)
#ifdef DOT1X_SUPPORT
|| IS_IEEE8021X(&pEntry->SecConfig)
#endif /* DOT1X_SUPPORT */
#ifdef RT_CFG80211_SUPPORT
|| pEntry->wdev->IsCFG1xWdev
#endif /* RT_CFG80211_SUPPORT */
|| pEntry->bWscCapable)) {
pEntry->bEnable4Addr = TRUE;
if (pApCliEntry->wdev.wds_enable)
HW_SET_ASIC_WCID_4ADDR_HDR_TRANS(pAd, pApCliEntry->MacTabWCID, TRUE);
}
}
#endif /* APCLI_AS_WDS_STA_SUPPORT */
#ifdef MAC_REPEATER_SUPPORT
ApCliCtrlMsg.BssIdx = ifIndex;
ApCliCtrlMsg.CliIdx = CliIdx;
@ -1063,7 +1256,6 @@ static VOID ApCliPeerAssocRspAction(
RTMP_MLME_HANDLER(pAd);
} else {
#ifdef FAST_EAPOL_WAR
ApCliAssocDeleteMacEntry(pAd, ifIndex, CliIdx);
#endif /* FAST_EAPOL_WAR */
ApCliCtrlMsg.Status = Status;
MlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_ASSOC_RSP,
@ -1184,9 +1376,6 @@ static VOID ApCliAssocTimeoutAction(
#endif /* MAC_REPEATER_SUPPORT */
pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].AssocCurrState;
#ifdef FAST_EAPOL_WAR
ApCliAssocDeleteMacEntry(pAd, ifIndex, CliIdx);
#endif /* FAST_EAPOL_WAR */
*pCurrState = APCLI_ASSOC_IDLE;
#ifdef MAC_REPEATER_SUPPORT
ifIndex = (USHORT)(Elem->Priv);
@ -1340,7 +1529,14 @@ static VOID set_mlme_rsn_ie(PRTMP_ADAPTER pAd, struct wifi_dev *wdev, PMAC_TABLE
else if ((pEid->Eid == IE_RSN)
&& (NdisEqualMemory(pEid->Octet + 2, RSN_OUI, 3))
&& (IS_AKM_WPA2(wdev->SecConfig.AKMMap)
|| IS_AKM_WPA2PSK(wdev->SecConfig.AKMMap))) {
|| IS_AKM_WPA2PSK(wdev->SecConfig.AKMMap)
#ifdef APCLI_SAE_SUPPORT
|| IS_AKM_WPA3PSK(wdev->SecConfig.AKMMap)
#endif
#ifdef APCLI_OWE_SUPPORT
|| IS_AKM_OWE(wdev->SecConfig.AKMMap)
#endif
)) {
NdisMoveMemory(pEntry->RSN_IE, pVIE, (pEid->Len + 2));
pEntry->RSNIE_Len = (pEid->Len + 2);
MTWF_LOG(DBG_CAT_CLIENT, DBG_SUBCAT_ALL, DBG_LVL_TRACE,

View File

@ -476,6 +476,10 @@ static VOID ApCliPeerDeauthAction(RTMP_ADAPTER *pAd, MLME_QUEUE_ELEM *Elem)
UCHAR CliIdx = 0xFF;
REPEATER_CLIENT_ENTRY *pReptEntry = NULL;
#endif /* MAC_REPEATER_SUPPORT */
#ifdef APCLI_SAE_SUPPORT
PULONG pCtrlCurrState = NULL;
#endif
PAPCLI_STRUCT pApCliEntry = NULL;
if ((ifIndex >= MAX_APCLI_NUM)
@ -491,17 +495,76 @@ static VOID ApCliPeerDeauthAction(RTMP_ADAPTER *pAd, MLME_QUEUE_ELEM *Elem)
CliIdx = ifIndex - REPT_MLME_START_IDX;
pReptEntry = &pAd->ApCfg.pRepeaterCliPool[CliIdx];
ifIndex = pReptEntry->wdev->func_idx;
pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];
pCurrState = &pReptEntry->AuthCurrState;
#ifdef APCLI_SAE_SUPPORT
pCtrlCurrState = &pReptEntry->CtrlCurrState;
#endif
} else
#endif /* MAC_REPEATER_SUPPORT */
{
pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];
pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].AuthCurrState;
#ifdef APCLI_SAE_SUPPORT
pCtrlCurrState = &pAd->ApCfg.ApCliTab[ifIndex].CtrlCurrState;
#endif
}
if (PeerDeauthSanity(pAd, Elem->Msg, Elem->MsgLen, Addr1, Addr2, Addr3, &Reason)) {
if (MAC_ADDR_EQUAL(pAd->ApCfg.ApCliTab[ifIndex].MlmeAux.Bssid, Addr2)) {
MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE,
("APCLI AUTH_RSP - receive DE-AUTH from our AP\n"));
*pCurrState = APCLI_AUTH_REQ_IDLE;
#ifdef APCLI_OWE_SUPPORT
apcli_reset_owe_parameters(pAd, ifIndex);
#endif
#ifdef APCLI_SAE_SUPPORT
if ((*pCtrlCurrState == APCLI_CTRL_ASSOC) || (*pCtrlCurrState == APCLI_CTRL_CONNECTED)) {
UCHAR if_addr[6];
INT CachedIdx;
UCHAR pmkid[LEN_PMKID];
UCHAR pmk[LEN_PMK];
#ifdef MAC_REPEATER_SUPPORT
if (CliIdx != 0xFF)
NdisCopyMemory(if_addr, &pReptEntry->CurrentAddress, MAC_ADDR_LEN);
else
#endif /* MAC_REPEATER_SUPPORT */
NdisCopyMemory(if_addr, &pApCliEntry->wdev.if_addr, MAC_ADDR_LEN);
/*Received PMK invalid status from AP delete entry from SavedPMK and delete SAE instance*/
if (
#ifdef APCLI_SAE_SUPPORT
(IS_AKM_WPA3PSK(pApCliEntry->MlmeAux.AKMMap) && sae_get_pmk_cache(&pAd->SaeCfg, if_addr, pApCliEntry->MlmeAux.Bssid, pmkid, pmk))
#endif
#ifdef APCLI_OWE_SUPPORT
|| (IS_AKM_OWE(pApCliEntry->MlmeAux.AKMMap))
#endif
) {
CachedIdx = apcli_search_pmkid_cache(pAd, pApCliEntry->MlmeAux.Bssid, ifIndex, CliIdx);
if (CachedIdx != INVALID_PMKID_IDX) {
#ifdef APCLI_SAE_SUPPORT
SAE_INSTANCE *pSaeIns = search_sae_instance(&pAd->SaeCfg, if_addr, pApCliEntry->MlmeAux.Bssid);
MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_OFF,
("%s:Reconnection falied with pmkid ,delete cache entry and sae instance \n", __func__));
if (pSaeIns != NULL) {
delete_sae_instance(pSaeIns);
}
#endif
apcli_delete_pmkid_cache(pAd, pApCliEntry->MlmeAux.Bssid, ifIndex, CliIdx);
}
}
}
#endif
#ifdef MAC_REPEATER_SUPPORT
ifIndex = (USHORT)(Elem->Priv);
#endif /* MAC_REPEATER_SUPPORT */
@ -671,6 +734,191 @@ VOID ApCliMlmeDeauthReqAction(
}
#ifdef APCLI_SAE_SUPPORT
/*
==========================================================================
Description:
IRQL = DISPATCH_LEVEL
==========================================================================
*/
VOID ApCliMlmeSaeAuthReqAction(RTMP_ADAPTER *pAd, MLME_QUEUE_ELEM *Elem)
{
USHORT ifIndex = (USHORT)(Elem->Priv);
#ifdef MAC_REPEATER_SUPPORT
UCHAR CliIdx = 0xFF;
REPEATER_CLIENT_ENTRY *pReptEntry = NULL;
#endif /* MAC_REPEATER_SUPPORT */
/* SAE_MLME_AUTH_REQ_STRUCT *AuthReq = (SAE_MLME_AUTH_REQ_STRUCT *)Elem->Msg; */
MLME_AUTH_REQ_STRUCT *AuthReq = (MLME_AUTH_REQ_STRUCT *)Elem->Msg;
PULONG pCurrState = NULL;
UCHAR if_addr[MAC_ADDR_LEN];
APCLI_STRUCT *apcli_entry = NULL;
UCHAR *pSae_cfg_group = NULL;
SAE_CFG *pSaeCfg = NULL;
APCLI_CTRL_MSG_STRUCT ApCliCtrlMsg;
pSaeCfg = &pAd->SaeCfg;
if ((ifIndex >= MAX_APCLI_NUM)
#ifdef MAC_REPEATER_SUPPORT
&& (ifIndex < REPT_MLME_START_IDX)
#endif /* MAC_REPEATER_SUPPORT */
)
return;
NdisZeroMemory(if_addr, MAC_ADDR_LEN);
#ifdef MAC_REPEATER_SUPPORT
if (ifIndex >= REPT_MLME_START_IDX) {
CliIdx = ifIndex - REPT_MLME_START_IDX;
pReptEntry = &pAd->ApCfg.pRepeaterCliPool[CliIdx];
pSae_cfg_group = &pReptEntry->sae_cfg_group;
ifIndex = pReptEntry->wdev->func_idx;
apcli_entry = &pAd->ApCfg.ApCliTab[ifIndex];
pCurrState = &pReptEntry->AuthCurrState;
COPY_MAC_ADDR(if_addr, pReptEntry->CurrentAddress);
} else
#endif /* MAC_REPEATER_SUPPORT */
{
apcli_entry = &pAd->ApCfg.ApCliTab[ifIndex];
pSae_cfg_group = &apcli_entry->sae_cfg_group;
pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].AuthCurrState;
COPY_MAC_ADDR(if_addr, pAd->ApCfg.ApCliTab[ifIndex].wdev.if_addr);
}
MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_OFF, ("==>%s()\n", __func__));
if (sae_auth_init(pAd, &pAd->SaeCfg, if_addr, AuthReq->Addr,
apcli_entry->MlmeAux.Bssid, apcli_entry->wdev.SecConfig.PSK, *pSae_cfg_group))
*pCurrState = AUTH_WAIT_SAE;
else {
*pCurrState = AUTH_REQ_IDLE;
ApCliCtrlMsg.Status = MLME_UNSPECIFY_FAIL;
#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_AUTH_RSP,
sizeof(APCLI_CTRL_MSG_STRUCT), &ApCliCtrlMsg, ifIndex);
RTMP_MLME_HANDLER(pAd);
}
}
/*
==========================================================================
Description:
IRQL = DISPATCH_LEVEL
==========================================================================
*/
VOID ApCliMlmeSaeAuthRspAction(RTMP_ADAPTER *pAd, MLME_QUEUE_ELEM *Elem)
{
FRAME_802_11 *Fr = (FRAME_802_11 *)Elem->Msg;
USHORT seq;
USHORT status;
UCHAR *pmk;
USHORT ifIndex = (USHORT)(Elem->Priv);
PULONG pAuthCurrState = NULL;
APCLI_CTRL_MSG_STRUCT ApCliCtrlMsg;
APCLI_STRUCT *apcli_entry;
#ifdef MAC_REPEATER_SUPPORT
REPEATER_CLIENT_ENTRY *pReptEntry = NULL;
#endif
#if defined(MAC_REPEATER_SUPPORT) || defined(FAST_EAPOL_WAR)
UCHAR CliIdx = 0xFF;
#endif /* MAC_REPEATER_SUPPORT */
if ((ifIndex >= MAX_APCLI_NUM)
#ifdef MAC_REPEATER_SUPPORT
&& (ifIndex < REPT_MLME_START_IDX)
#endif /* MAC_REPEATER_SUPPORT */
)
return;
#ifdef MAC_REPEATER_SUPPORT
if (ifIndex >= REPT_MLME_START_IDX) {
CliIdx = ifIndex - REPT_MLME_START_IDX;
pReptEntry = &pAd->ApCfg.pRepeaterCliPool[CliIdx];
ifIndex = pReptEntry->wdev->func_idx;
pAuthCurrState = &pReptEntry->AuthCurrState;
} else
#endif /* MAC_REPEATER_SUPPORT */
{
pAuthCurrState = &pAd->ApCfg.ApCliTab[ifIndex].AuthCurrState;
}
apcli_entry = &pAd->ApCfg.ApCliTab[ifIndex];
NdisMoveMemory(&seq, &Fr->Octet[2], 2);
NdisMoveMemory(&status, &Fr->Octet[4], 2);
if (FALSE == sae_handle_auth(pAd, &pAd->SaeCfg, Elem->Msg, Elem->MsgLen,
Elem->wdev->SecConfig.PSK,
seq, status, &pmk)){
*pAuthCurrState = APCLI_AUTH_REQ_IDLE;
/*If SAE instance has been deleted*/
ApCliCtrlMsg.Status = MLME_UNSPECIFY_FAIL;
#ifdef MAC_REPEATER_SUPPORT
ApCliCtrlMsg.CliIdx = CliIdx;
ApCliCtrlMsg.BssIdx = ifIndex;
ifIndex = (USHORT)(Elem->Priv);
#endif /* MAC_REPEATER_SUPPORT */
MlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_AUTH_RSP,
sizeof(APCLI_CTRL_MSG_STRUCT), &ApCliCtrlMsg, ifIndex);
RTMP_MLME_HANDLER(pAd);
} else if (pmk != NULL) {
USHORT Status;
MAC_TABLE_ENTRY *pEntry = NULL;
#ifdef MAC_REPEATER_SUPPORT
if (CliIdx != 0xFF) {
#ifdef FAST_EAPOL_WAR
if (pReptEntry->pre_entry_alloc == TRUE)
#endif
pEntry = &pAd->MacTab.Content[pReptEntry->MacTabWCID];
} else
#endif
{
#ifdef FAST_EAPOL_WAR
if (apcli_entry->pre_entry_alloc == TRUE)
#endif
pEntry = &pAd->MacTab.Content[apcli_entry->MacTabWCID];
}
DebugLevel = DBG_LVL_TRACE;
hex_dump("pmk:", (char *)pmk, LEN_PMK);
DebugLevel = DBG_LVL_ERROR;
if (pEntry) {
NdisMoveMemory(pEntry->SecConfig.PMK, pmk, LEN_PMK);
Status = MLME_SUCCESS;
MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_OFF, ("%s(): Security AKM = 0x%x, PairwiseCipher = 0x%x, GroupCipher = 0x%x\n",
__func__, pEntry->SecConfig.AKMMap, pEntry->SecConfig.PairwiseCipher, pEntry->SecConfig.GroupCipher));
} else
Status = MLME_UNSPECIFY_FAIL;
*pAuthCurrState = APCLI_AUTH_REQ_IDLE;
ApCliCtrlMsg.Status = Status;
#ifdef MAC_REPEATER_SUPPORT
ApCliCtrlMsg.CliIdx = CliIdx;
ApCliCtrlMsg.BssIdx = ifIndex;
ifIndex = (USHORT)(Elem->Priv);
#endif /* MAC_REPEATER_SUPPORT */
MlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_AUTH_RSP,
sizeof(APCLI_CTRL_MSG_STRUCT), &ApCliCtrlMsg, ifIndex);
RTMP_MLME_HANDLER(pAd);
}
}
#endif /* APCLI_SAE_SUPPORT */
/*
==========================================================================
Description:
@ -710,6 +958,15 @@ VOID ApCliAuthStateMachineInit(
StateMachineSetAction(Sm, APCLI_AUTH_WAIT_SEQ4, APCLI_MT2_AUTH_TIMEOUT, (STATE_MACHINE_FUNC)ApCliAuthTimeoutAction);
StateMachineSetAction(Sm, APCLI_AUTH_WAIT_SEQ4, APCLI_MT2_MLME_DEAUTH_REQ, (STATE_MACHINE_FUNC)ApCliMlmeDeauthReqAction);
#ifdef APCLI_SAE_SUPPORT
StateMachineSetAction(Sm, APCLI_AUTH_REQ_IDLE, APCLI_MT2_MLME_SAE_AUTH_REQ,
(STATE_MACHINE_FUNC) ApCliMlmeSaeAuthReqAction);
StateMachineSetAction(Sm, APCLI_AUTH_WAIT_SAE, APCLI_MT2_MLME_SAE_AUTH_COMMIT,
(STATE_MACHINE_FUNC) ApCliMlmeSaeAuthRspAction);
StateMachineSetAction(Sm, APCLI_AUTH_WAIT_SAE, APCLI_MT2_MLME_SAE_AUTH_CONFIRM,
(STATE_MACHINE_FUNC) ApCliMlmeSaeAuthRspAction);
#endif /*DOT11_SAE_SUPPORT */
for (i = 0; i < MAX_APCLI_NUM; i++) {
pAd->ApCfg.ApCliTab[i].AuthCurrState = APCLI_AUTH_REQ_IDLE;
pApCliEntry = &pAd->ApCfg.ApCliTab[i];

View File

@ -244,6 +244,48 @@ VOID ApCliCtrlStateMachineInit(
}
}
#ifdef FAST_EAPOL_WAR
static VOID ApCliCtrlDeleteMacEntry(
IN PRTMP_ADAPTER pAd,
IN UCHAR ifIndex,
IN UCHAR CliIdx)
{
PAPCLI_STRUCT pApCliEntry = NULL;
#ifdef MAC_REPEATER_SUPPORT
PREPEATER_CLIENT_ENTRY pReptEntry = NULL;
if (CliIdx != 0xff) {
pReptEntry = &pAd->ApCfg.pRepeaterCliPool[CliIdx];
pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];
} else
#endif
{
pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];
}
#ifdef MAC_REPEATER_SUPPORT
if (CliIdx != 0xFF) {
if ((pReptEntry->pre_entry_alloc == TRUE) &&
(pReptEntry->CliValid == FALSE)) {
UCHAR MacTabWCID;
MacTabWCID = pReptEntry->MacTabWCID;
MacTableDeleteEntry(pAd, MacTabWCID, pAd->MacTab.Content[MacTabWCID].Addr);
pReptEntry->MacTabWCID = 0xFF;
pReptEntry->pre_entry_alloc = FALSE;
}
} else
#endif
{
if ((pApCliEntry->pre_entry_alloc == TRUE) &&
(pApCliEntry->Valid == FALSE)) {
UCHAR MacTabWCID;
MacTabWCID = pApCliEntry->MacTabWCID;
MacTableDeleteEntry(pAd, MacTabWCID, APCLI_ROOT_BSSID_GET(pAd, MacTabWCID));
pApCliEntry->MacTabWCID = 0;
pApCliEntry->pre_entry_alloc = FALSE;
}
}
}
#endif /* FAST_EAPOL_WAR */
#ifdef APCLI_CONNECTION_TRIAL
static VOID ApCliTrialConnectTimeout(
IN PVOID SystemSpecific1,
@ -564,6 +606,12 @@ static VOID ApCliCtrlJoinReqAction(
NdisZeroMemory(&JoinReq, sizeof(APCLI_MLME_JOIN_REQ_STRUCT));
#ifdef APCLI_OWE_SUPPORT
if (IS_AKM_OWE(wdev->SecConfig.AKMMap))
BssTableInit(&pApCliEntry->MlmeAux.owe_bss_tab);
#endif
if (!MAC_ADDR_EQUAL(pApCliEntry->CfgApCliBssid, ZERO_MAC_ADDR))
COPY_MAC_ADDR(JoinReq.Bssid, pApCliEntry->CfgApCliBssid);
@ -620,8 +668,16 @@ static VOID ApCliCtrlJoinReqAction(
} else
#endif /* WSC_AP_SUPPORT */
{
#ifdef APCLI_OWE_SUPPORT
/*owe_trans_ssid present then update join request with OWE ssid, bssid parameters */
if (pApCliEntry->owe_trans_ssid_len > 0) {
NdisMoveMemory(&(JoinReq.Ssid), pApCliEntry->owe_trans_ssid, pApCliEntry->owe_trans_ssid_len);
COPY_MAC_ADDR(JoinReq.Bssid, pApCliEntry->owe_trans_bssid);
} else
#endif
if (pApCliEntry->CfgSsidLen != 0) {
#if defined(RT_CFG80211_P2P_CONCURRENT_DEVICE) || defined(CFG80211_MULTI_STA)
#if defined(RT_CFG80211_P2P_CONCURRENT_DEVICE) || defined(CFG80211_MULTI_STA) || defined(APCLI_CFG80211_SUPPORT)
ULONG bss_idx = BSS_NOT_FOUND;
bss_idx = BssSsidTableSearchBySSID(&pAd->ScanTab, (PCHAR)pApCliEntry->CfgSsid, pApCliEntry->CfgSsidLen);
@ -642,6 +698,7 @@ static VOID ApCliCtrlJoinReqAction(
/* if (wdev->channel != pAd->ScanTab.BssEntry[bss_idx].Channel) */
{
pApCliEntry->MlmeAux.Channel = pAd->ScanTab.BssEntry[bss_idx].Channel;
pApCliEntry->wdev.channel = pApCliEntry->MlmeAux.Channel;
#ifdef CONFIG_MULTI_CHANNEL
/* should be check and update in in asso to check ==> ApCliCheckHt() */
pApCliEntry->wdev.channel = pApCliEntry->MlmeAux.Channel;
@ -708,9 +765,16 @@ static VOID ApCliCtrlJoinReqTimeoutAction(
NdisZeroMemory(pApCliEntry->MlmeAux.Ssid, MAX_LEN_OF_SSID);
pApCliEntry->ProbeReqCnt = 0;
#ifdef APCLI_OWE_SUPPORT
apcli_reset_owe_parameters(pAd, ifIndex);
#endif
/* Driver Trigger New Scan Mode for Sigma DUT usage */
if (pAd->ApCfg.ApCliAutoConnectType[apcli_ifIndex] == TRIGGER_SCAN_BY_DRIVER &&
pAd->ScanCtrl.PartialScan.bScanning == FALSE
if ((pAd->ApCfg.ApCliAutoConnectType[apcli_ifIndex] == TRIGGER_SCAN_BY_DRIVER
#ifdef FOLLOW_HIDDEN_SSID_FEATURE
|| (pAd->ApCfg.ApCliAutoConnectType[apcli_ifIndex] == TRIGGER_SCAN_BY_USER
&& pAd->ApCfg.ApCliTab[ifIndex].AutoConnectFlag == TRUE)
#endif
) && pAd->ScanCtrl.PartialScan.bScanning == FALSE
) {
if (pApCliEntry->CfgSsidLen) {
NDIS_802_11_SSID Ssid;
@ -756,6 +820,14 @@ static VOID ApCliCtrlJoinReqTimeoutAction(
#endif /* WSC_AP_SUPPORT */
{
#ifdef APCLI_OWE_SUPPORT
/*Configure OWE ssid and bssid Join request parameters */
if (IS_AKM_OWE(pApCliEntry->wdev.SecConfig.AKMMap) && (pApCliEntry->owe_trans_ssid_len != 0)) {
JoinReq.SsidLen = pApCliEntry->owe_trans_ssid_len;
NdisMoveMemory(&(JoinReq.Ssid), pApCliEntry->owe_trans_ssid, JoinReq.SsidLen);
COPY_MAC_ADDR(JoinReq.Bssid, pApCliEntry->owe_trans_bssid);
} else
#endif
if (pApCliEntry->CfgSsidLen != 0) {
JoinReq.SsidLen = pApCliEntry->CfgSsidLen;
NdisMoveMemory(&(JoinReq.Ssid), pApCliEntry->CfgSsid, JoinReq.SsidLen);
@ -797,6 +869,8 @@ static VOID ApCliCtrlProbeRspAction(
#ifdef APCLI_AUTO_CONNECT_SUPPORT
USHORT apcli_ifIndex = (USHORT)(Elem->Priv);
#endif /* APCLI_AUTO_CONNECT_SUPPORT */
struct _SECURITY_CONFIG *pProfile_SecConfig = NULL;
if ((ifIndex >= MAX_APCLI_NUM)
#ifdef MAC_REPEATER_SUPPORT
@ -831,6 +905,7 @@ static VOID ApCliCtrlProbeRspAction(
#endif /* MAC_REPEATER_SUPPORT */
pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];
wdev = &pApCliEntry->wdev;
pProfile_SecConfig = &wdev->SecConfig;
#ifdef MAC_REPEATER_SUPPORT
@ -854,7 +929,192 @@ static VOID ApCliCtrlProbeRspAction(
pApCliEntry->AuthReqCnt = 0;
COPY_MAC_ADDR(AuthReq.Addr, pApCliEntry->MlmeAux.Bssid);
#if defined(APCLI_SAE_SUPPORT) || defined(APCLI_OWE_SUPPORT)
#ifdef FAST_EAPOL_WAR
/*Shifted from Fast Eapol War from assoc req phase to probe response phase as SAE and OWE update the PMK *
per mactable entry */
{
PMAC_TABLE_ENTRY pmac_entry = NULL;
#ifdef MAC_REPEATER_SUPPORT
if ((pAd->ApCfg.bMACRepeaterEn) &&
(IS_HIF_TYPE(pAd, HIF_MT)) &&
(CliIdx != 0xFF)
) {
if (pReptCliEntry->pre_entry_alloc == TRUE)
ApCliCtrlDeleteMacEntry(pAd, ifIndex, CliIdx);
{
pmac_entry = MacTableInsertEntry(
pAd,
(PUCHAR)(pApCliEntry->MlmeAux.Bssid),
pReptCliEntry->wdev,
ENTRY_REPEATER,
OPMODE_AP,
TRUE);
if (pmac_entry) {
pReptCliEntry->MacTabWCID = pmac_entry->wcid;
pReptCliEntry->pre_entry_alloc = TRUE;
} else {
MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_ERROR, ("repeater pEntry insert fail"));
*pCurrState = APCLI_CTRL_DISCONNECTED;
return;
}
}
} else
#endif /* MAC_REPEATER_SUPPORT */
{
if (pApCliEntry->pre_entry_alloc == TRUE)
ApCliCtrlDeleteMacEntry(pAd, ifIndex, CliIdx);
{
pmac_entry = MacTableInsertEntry(
pAd,
(PUCHAR)(pApCliEntry->MlmeAux.Bssid),
&pApCliEntry->wdev,
ENTRY_APCLI,
OPMODE_AP,
TRUE);
if (pmac_entry) {
pApCliEntry->pre_entry_alloc = TRUE;
pApCliEntry->MacTabWCID = pmac_entry->wcid;
} else {
MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_ERROR, ("apcli pEntry insert fail"));
*pCurrState = APCLI_CTRL_DISCONNECTED;
return;
}
}
}
/*With Fast Eaol War the mactable entry sec_config parameters can be updated here instead of during linkup*/
if (pmac_entry) {
struct _SECURITY_CONFIG *pProfile_SecConfig = &wdev->SecConfig;
struct _SECURITY_CONFIG *pEntry_SecConfig = &pmac_entry->SecConfig;
#ifdef DOT11W_PMF_SUPPORT
/*fill the pmac_entry's PMF parameters*/
{
RSN_CAPABILITIES RsnCap;
NdisMoveMemory(&RsnCap, &pApCliEntry->MlmeAux.RsnCap, sizeof(RSN_CAPABILITIES));
RsnCap.word = cpu2le16(RsnCap.word);
/*mismatch case*/
if (((pProfile_SecConfig->PmfCfg.MFPR) && (RsnCap.field.MFPC == FALSE))
|| ((pProfile_SecConfig->PmfCfg.MFPC == FALSE) && (RsnCap.field.MFPR))) {
pEntry_SecConfig->PmfCfg.UsePMFConnect = FALSE;
pEntry_SecConfig->key_deri_alg = SEC_KEY_DERI_SHA1;
}
if ((pProfile_SecConfig->PmfCfg.MFPC) && (RsnCap.field.MFPC)) {
pEntry_SecConfig->PmfCfg.UsePMFConnect = TRUE;
if ((pApCliEntry->MlmeAux.IsSupportSHA256KeyDerivation) || (RsnCap.field.MFPR))
pEntry_SecConfig->key_deri_alg = SEC_KEY_DERI_SHA256;
pEntry_SecConfig->PmfCfg.MFPC = RsnCap.field.MFPC;
pEntry_SecConfig->PmfCfg.MFPR = RsnCap.field.MFPR;
}
pEntry_SecConfig->PmfCfg.igtk_cipher = pApCliEntry->MlmeAux.IntegrityGroupCipher;
}
#endif /* DOT11W_PMF_SUPPORT */
if (IS_CIPHER_WEP(pEntry_SecConfig->PairwiseCipher)) {
os_move_mem(pEntry_SecConfig->WepKey, pProfile_SecConfig->WepKey, sizeof(SEC_KEY_INFO)*SEC_KEY_NUM);
pProfile_SecConfig->GroupKeyId = pProfile_SecConfig->PairwiseKeyId;
pEntry_SecConfig->PairwiseKeyId = pProfile_SecConfig->PairwiseKeyId;
} else {
CHAR rsne_idx = 0;
if (!(IS_AKM_SAE_SHA256(pEntry_SecConfig->AKMMap) || IS_AKM_OWE(pEntry_SecConfig->AKMMap)
|| IS_AKM_OPEN(pEntry_SecConfig->AKMMap))) {
{
SetWPAPSKKey(pAd, pProfile_SecConfig->PSK, strlen(pProfile_SecConfig->PSK),
pApCliEntry->MlmeAux.Ssid, pApCliEntry->MlmeAux.SsidLen, pEntry_SecConfig->PMK);
DebugLevel = DBG_LVL_TRACE;
hex_dump("pmkfromPSK:", (char *)pEntry_SecConfig->PMK, LEN_PMK);
DebugLevel = DBG_LVL_ERROR;
}
}
#ifdef MAC_REPEATER_SUPPORT
if ((pAd->ApCfg.bMACRepeaterEn) && (IS_HIF_TYPE(pAd, HIF_MT)) && (CliIdx != 0xFF)) {
os_move_mem(pEntry_SecConfig->Handshake.AAddr, pmac_entry->Addr, MAC_ADDR_LEN);
os_move_mem(pEntry_SecConfig->Handshake.SAddr, pReptCliEntry->CurrentAddress, MAC_ADDR_LEN);
} else
#endif /* MAC_REPEATER_SUPPORT */
{
os_move_mem(pEntry_SecConfig->Handshake.AAddr, pmac_entry->Addr, MAC_ADDR_LEN);
os_move_mem(pEntry_SecConfig->Handshake.SAddr, wdev->if_addr, MAC_ADDR_LEN);
}
os_zero_mem(pEntry_SecConfig->Handshake.ReplayCounter, LEN_KEY_DESC_REPLAY);
for (rsne_idx = 0; rsne_idx < SEC_RSNIE_NUM; rsne_idx++) {
pEntry_SecConfig->RSNE_Type[rsne_idx] = pProfile_SecConfig->RSNE_Type[rsne_idx];
if (pEntry_SecConfig->RSNE_Type[rsne_idx] == SEC_RSNIE_NONE)
continue;
os_move_mem(pEntry_SecConfig->RSNE_EID[rsne_idx], pProfile_SecConfig->RSNE_EID[rsne_idx], sizeof(UCHAR));
pEntry_SecConfig->RSNE_Len[rsne_idx] = pProfile_SecConfig->RSNE_Len[rsne_idx];
os_move_mem(pEntry_SecConfig->RSNE_Content[rsne_idx], pProfile_SecConfig->RSNE_Content[rsne_idx], sizeof(UCHAR)*MAX_LEN_OF_RSNIE);
}
pmac_entry->SecConfig.Handshake.WpaState = AS_INITPSK;
}
pEntry_SecConfig->GroupKeyId = pProfile_SecConfig->GroupKeyId;
MTWF_LOG(DBG_CAT_CLIENT, DBG_SUBCAT_ALL, DBG_LVL_TRACE,
("%s: (apcli%d) connect AKM(0x%x)=%s, PairwiseCipher(0x%x)=%s, GroupCipher(0x%x)=%s\n",
__func__, ifIndex,
pEntry_SecConfig->AKMMap, GetAuthModeStr(pEntry_SecConfig->AKMMap),
pEntry_SecConfig->PairwiseCipher, GetEncryModeStr(pEntry_SecConfig->PairwiseCipher),
pEntry_SecConfig->GroupCipher, GetEncryModeStr(pEntry_SecConfig->GroupCipher)));
MTWF_LOG(DBG_CAT_CLIENT, DBG_SUBCAT_ALL, DBG_LVL_TRACE,
("%s(): PairwiseKeyId=%d, GroupKeyId=%d\n",
__func__, pEntry_SecConfig->PairwiseKeyId, pEntry_SecConfig->GroupKeyId));
}
}
#endif /* FAST_EAPOL_WAR */
#endif
#ifdef APCLI_SAE_SUPPORT
if (IS_AKM_SAE_SHA256(pApCliEntry->MlmeAux.AKMMap)) {
UCHAR if_addr[MAC_ADDR_LEN];
UCHAR pmkid[LEN_PMKID];
UCHAR pmk[LEN_PMK];
UCHAR has_pmkid = FALSE;
NdisZeroMemory(if_addr, MAC_ADDR_LEN);
#ifdef MAC_REPEATER_SUPPORT
if (CliIdx != 0xFF)
NdisCopyMemory(if_addr, &pReptCliEntry->CurrentAddress, MAC_ADDR_LEN);
else
#endif /* MAC_REPEATER_SUPPORT */
NdisCopyMemory(if_addr, &pApCliEntry->wdev.if_addr, MAC_ADDR_LEN);
if (sae_get_pmk_cache(&pAd->SaeCfg, if_addr, pApCliEntry->MlmeAux.Bssid, pmkid, pmk)) {
apcli_add_pmkid_cache(pAd, pApCliEntry->MlmeAux.Bssid, pmkid, pmk, LEN_PMK, ifIndex, CliIdx);
has_pmkid = TRUE;
}
if (has_pmkid == TRUE) {
COPY_MAC_ADDR(AuthReq.Addr, pApCliEntry->MlmeAux.Bssid);
AuthReq.Alg = AUTH_MODE_OPEN;
MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_OFF,
("(%s) - use pmkid\n", __func__));
} else {
COPY_MAC_ADDR(AuthReq.Addr, pApCliEntry->MlmeAux.Bssid);
AuthReq.Alg = AUTH_MODE_SAE;
MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_OFF,
("(%s) - use SAE\n", __func__));
}
} else
#endif/* APCLI_SAE_SUPPORT */
/* start Authentication Req. */
/* If AuthMode is Auto, try shared key first */
if (IS_AKM_SHARED(pApCliEntry->MlmeAux.AKMMap) ||
@ -877,8 +1137,27 @@ static VOID ApCliCtrlProbeRspAction(
}
#endif /* MAC_REPEATER_SUPPORT */
#ifdef APCLI_SAE_SUPPORT
if (AuthReq.Alg == AUTH_MODE_SAE)
MlmeEnqueue(pAd, APCLI_AUTH_STATE_MACHINE, APCLI_MT2_MLME_SAE_AUTH_REQ,
sizeof(MLME_AUTH_REQ_STRUCT), &AuthReq, ifIndex);
else {
#endif
#if (!(defined(APCLI_SAE_SUPPORT) || defined(APCLI_OWE_SUPPORT)))
/*Skip pEntry PMK update from wdev->seconfig for SAE and OWE*/
/* Calculate PMK */
if (!IS_CIPHER_WEP(pProfile_SecConfig->PairwiseCipher)) {
SetWPAPSKKey(pAd, pProfile_SecConfig->PSK, strlen(pProfile_SecConfig->PSK),
pApCliEntry->MlmeAux.Ssid, pApCliEntry->MlmeAux.SsidLen, pProfile_SecConfig->PMK);
}
#endif
MlmeEnqueue(pAd, APCLI_AUTH_STATE_MACHINE, APCLI_MT2_MLME_AUTH_REQ,
sizeof(MLME_AUTH_REQ_STRUCT), &AuthReq, ifIndex);
#ifdef APCLI_SAE_SUPPORT
}
#endif
RTMP_MLME_HANDLER(pAd);
} else {
MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, ("(%s) Probe response fail.\n", __func__));
@ -914,6 +1193,8 @@ static VOID ApCliCtrlAuthRspAction(
PAPCLI_STRUCT pApCliEntry;
USHORT ifIndex = (USHORT)(Elem->Priv);
PULONG pCurrState = NULL;
PULONG pAssocCurrState = NULL;
USHORT Timeout = ASSOC_TIMEOUT;
#ifdef MAC_REPEATER_SUPPORT
UCHAR CliIdx = 0xFF;
REPEATER_CLIENT_ENTRY *pReptEntry = NULL;
@ -949,10 +1230,13 @@ static VOID ApCliCtrlAuthRspAction(
("(%s) Repeater Cli Receive ifIndex = %d, CliIdx = %d !!!\n",
__func__, ifIndex, CliIdx));
pCurrState = &pReptEntry->CtrlCurrState;
pAssocCurrState = &pReptEntry->AssocCurrState;
} else
#endif /* MAC_REPEATER_SUPPORT */
{
pCurrState = &pApCliEntry->CtrlCurrState;
pAssocCurrState = &pApCliEntry->AssocCurrState;
}
if (Status == MLME_SUCCESS) {
MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE,
("(%s) Auth Rsp Success.\n",
@ -966,6 +1250,14 @@ static VOID ApCliCtrlAuthRspAction(
#endif /* MAC_REPEATER_SUPPORT */
pApCliEntry->AssocReqCnt = 0;
#if defined(APCLI_SAE_SUPPORT) || defined(APCLI_OWE_SUPPORT)
if (IS_AKM_SAE_SHA256(pApCliEntry->MlmeAux.AKMMap)
|| IS_AKM_OWE(pApCliEntry->MlmeAux.AKMMap)
|| IS_AKM_FT_SAE_SHA256(pApCliEntry->MlmeAux.AKMMap)) {
pAssocCurrState = ASSOC_IDLE;
Timeout = 5000;
}
#endif
#ifdef APCLI_CONNECTION_TRIAL
/* if connection trying, wait until trialtimeout and enqueue Assoc REQ then. */
@ -976,7 +1268,7 @@ static VOID ApCliCtrlAuthRspAction(
&AssocReq,
pApCliEntry->MlmeAux.Bssid,
pApCliEntry->MlmeAux.CapabilityInfo,
ASSOC_TIMEOUT,
Timeout,
5);
#ifdef APCLI_CONNECTION_TRIAL
}
@ -1026,8 +1318,18 @@ static VOID ApCliCtrlAuthRspAction(
NdisZeroMemory(pApCliEntry->MlmeAux.Bssid, MAC_ADDR_LEN);
NdisZeroMemory(pApCliEntry->MlmeAux.Ssid, MAX_LEN_OF_SSID);
pApCliEntry->AuthReqCnt = 0;
}
#ifdef APCLI_OWE_SUPPORT
apcli_reset_owe_parameters(pAd, ifIndex);
#endif
}
#if defined(APCLI_SAE_SUPPORT) || defined(APCLI_OWE_SUPPORT)
#ifdef FAST_EAPOL_WAR
ApCliCtrlDeleteMacEntry(pAd, apcli_ifIndex, CliIdx);
#endif /* FAST_EAPOL_WAR */
#endif
*pCurrState = APCLI_CTRL_DISCONNECTED;
#ifdef APCLI_AUTO_CONNECT_SUPPORT
@ -1061,6 +1363,7 @@ static VOID ApCliCtrlAuth2RspAction(
PAPCLI_STRUCT pApCliEntry;
USHORT ifIndex = (USHORT)(Elem->Priv);
PULONG pCurrState = NULL;
PULONG pAssocCurrState = NULL;
#ifdef MAC_REPEATER_SUPPORT
REPEATER_CLIENT_ENTRY *pReptEntry = NULL;
UCHAR CliIdx = 0xFF;
@ -1090,12 +1393,16 @@ static VOID ApCliCtrlAuth2RspAction(
pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];
#ifdef MAC_REPEATER_SUPPORT
if (CliIdx != 0xFF)
if (CliIdx != 0xFF) {
pCurrState = &pReptEntry->CtrlCurrState;
pAssocCurrState = &pReptEntry->AssocCurrState;
}
else
#endif /* MAC_REPEATER_SUPPORT */
{
pCurrState = &pApCliEntry->CtrlCurrState;
pAssocCurrState = &pApCliEntry->AssocCurrState;
}
if (Status == MLME_SUCCESS) {
MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, ("(%s) Auth2 Rsp Success.\n", __func__));
*pCurrState = APCLI_CTRL_ASSOC;
@ -1184,6 +1491,11 @@ static VOID ApCliCtrlAuthReqTimeoutAction(
MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_ERROR,
("(%s) Rept CliIdx:%d Auth Req Timeout over 5 times.\n",
__func__, CliIdx));
#if defined(APCLI_SAE_SUPPORT) || defined(APCLI_OWE_SUPPORT)
#ifdef FAST_EAPOL_WAR
ApCliCtrlDeleteMacEntry(pAd, apcli_ifIndex, CliIdx);
#endif /* FAST_EAPOL_WAR */
#endif
*pCurrState = APCLI_CTRL_DISCONNECTED;
pReptEntry->AuthReqCnt = 0;
return;
@ -1194,10 +1506,21 @@ static VOID ApCliCtrlAuthReqTimeoutAction(
pApCliEntry->AuthReqCnt++;
if (pApCliEntry->AuthReqCnt > 5) {
#if defined(APCLI_SAE_SUPPORT) || defined(APCLI_OWE_SUPPORT)
#ifdef FAST_EAPOL_WAR
ApCliCtrlDeleteMacEntry(pAd, apcli_ifIndex, CliIdx);
#endif /* FAST_EAPOL_WAR */
#endif
*pCurrState = APCLI_CTRL_DISCONNECTED;
NdisZeroMemory(pApCliEntry->MlmeAux.Bssid, MAC_ADDR_LEN);
NdisZeroMemory(pApCliEntry->MlmeAux.Ssid, MAX_LEN_OF_SSID);
pApCliEntry->AuthReqCnt = 0;
#ifdef APCLI_OWE_SUPPORT
apcli_reset_owe_parameters(pAd, ifIndex);
#endif
#ifdef APCLI_AUTO_CONNECT_SUPPORT
if ((pAd->ApCfg.ApCliAutoConnectRunning[apcli_ifIndex] == TRUE)
@ -1240,52 +1563,6 @@ static VOID ApCliCtrlAuth2ReqTimeoutAction(
{
}
#ifdef FAST_EAPOL_WAR
static VOID ApCliCtrlDeleteMacEntry(
IN PRTMP_ADAPTER pAd,
IN UCHAR ifIndex,
IN UCHAR CliIdx)
{
PAPCLI_STRUCT pApCliEntry = NULL;
#ifdef MAC_REPEATER_SUPPORT
PREPEATER_CLIENT_ENTRY pReptEntry = NULL;
if (CliIdx != 0xff) {
pReptEntry = &pAd->ApCfg.pRepeaterCliPool[CliIdx];
pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];
} else
#endif
{
pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];
}
#ifdef MAC_REPEATER_SUPPORT
if (CliIdx != 0xFF) {
if ((pReptEntry->pre_entry_alloc == TRUE) &&
(pReptEntry->CliValid == FALSE)) {
UCHAR MacTabWCID;
MacTabWCID = pReptEntry->MacTabWCID;
MacTableDeleteEntry(pAd, MacTabWCID, pAd->MacTab.Content[MacTabWCID].Addr);
pReptEntry->MacTabWCID = 0xFF;
pReptEntry->pre_entry_alloc = FALSE;
}
} else
#endif
{
if ((pApCliEntry->pre_entry_alloc == TRUE) &&
(pApCliEntry->Valid == FALSE)) {
UCHAR MacTabWCID;
MacTabWCID = pApCliEntry->MacTabWCID;
MacTableDeleteEntry(pAd, MacTabWCID, APCLI_ROOT_BSSID_GET(pAd, MacTabWCID));
pApCliEntry->MacTabWCID = 0;
pApCliEntry->pre_entry_alloc = FALSE;
}
}
}
#endif /* FAST_EAPOL_WAR */
/*
==========================================================================
@ -1348,16 +1625,16 @@ static VOID ApCliCtrlAssocRspAction(
if (ApCliLinkUp(pAd, ifIndex)) {
*pCurrState = APCLI_CTRL_CONNECTED;
#if defined(RT_CFG80211_P2P_CONCURRENT_DEVICE) || defined(CFG80211_MULTI_STA)
#if defined(RT_CFG80211_P2P_CONCURRENT_DEVICE) || defined(CFG80211_MULTI_STA) || defined(APCLI_CFG80211_SUPPORT)
CFG80211_checkScanTable(pAd);
RT_CFG80211_P2P_CLI_CONN_RESULT_INFORM(pAd, pApCliEntry->MlmeAux.Bssid,
pApCliEntry->ReqVarIEs, pApCliEntry->ReqVarIELen,
pApCliEntry->ResVarIEs, pApCliEntry->ResVarIELen, TRUE);
pApCliEntry->ReqVarIEs, pApCliEntry->ReqVarIELen,
pApCliEntry->ResVarIEs, pApCliEntry->ResVarIELen, TRUE);
#ifndef APCLI_CFG80211_SUPPORT
if (pAd->cfg80211_ctrl.bP2pCliPmEnable == TRUE)
CmdP2pNoaOffloadCtrl(pAd, P2P_NOA_RX_ON);
#endif /* RT_CFG80211_P2P_CONCURRENT_DEVICE || CFG80211_MULTI_STA */
#endif /* APCLI_CFG80211_SUPPORT */
#endif /* RT_CFG80211_P2P_CONCURRENT_DEVICE || CFG80211_MULTI_STA || APCLI_CFG80211_SUPPORT */
} else {
MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, ("(%s) apCliIf = %d, Insert Remote AP to MacTable failed.\n", __func__, ifIndex));
/* Reset the apcli interface as disconnected and Invalid. */
@ -1383,11 +1660,11 @@ static VOID ApCliCtrlAssocRspAction(
ApCliSwitchCandidateAP(pAd, &pApCliEntry->wdev);
#endif /* APCLI_AUTO_CONNECT_SUPPORT */
#if defined(RT_CFG80211_P2P_CONCURRENT_DEVICE) || defined(CFG80211_MULTI_STA)
#if defined(RT_CFG80211_P2P_CONCURRENT_DEVICE) || defined(CFG80211_MULTI_STA) || defined(APCLI_CFG80211_SUPPORT)
CFG80211_checkScanTable(pAd);
RT_CFG80211_P2P_CLI_CONN_RESULT_INFORM(pAd, pApCliEntry->MlmeAux.Bssid,
NULL, 0, NULL, 0, 0);
#endif /* RT_CFG80211_P2P_CONCURRENT_DEVICE || CFG80211_MULTI_STA */
#endif /* RT_CFG80211_P2P_CONCURRENT_DEVICE || CFG80211_MULTI_STA || APCLI_CFG80211_SUPPORT */
}
} else {
MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_ERROR,
@ -1405,6 +1682,49 @@ static VOID ApCliCtrlAssocRspAction(
#ifdef FAST_EAPOL_WAR
ApCliCtrlDeleteMacEntry(pAd, apcli_ifIndex, CliIdx);
#endif /* FAST_EAPOL_WAR */
#ifdef APCLI_SAE_SUPPORT
if (Status == MLME_INVALID_PMKID) {
#ifdef APCLI_SAE_SUPPORT
UCHAR if_addr[MAC_ADDR_LEN];
#endif
INT CachedIdx;
UCHAR pmkid[LEN_PMKID];
UCHAR pmk[LEN_PMK];
#ifdef APCLI_SAE_SUPPORT
#ifdef MAC_REPEATER_SUPPORT
if (CliIdx != 0xFF)
NdisCopyMemory(if_addr, &pReptEntry->CurrentAddress, MAC_ADDR_LEN);
else
#endif /* MAC_REPEATER_SUPPORT */
NdisCopyMemory(if_addr, &pApCliEntry->wdev.if_addr, MAC_ADDR_LEN);
/*Received PMK invalid status from AP delete entry from SavedPMK and delete SAE instance*/
if (IS_AKM_SAE(pApCliEntry->MlmeAux.AKMMap) &&
sae_get_pmk_cache(&pAd->SaeCfg, if_addr, pApCliEntry->MlmeAux.Bssid, pmkid, pmk)
) {
CachedIdx = apcli_search_pmkid_cache(pAd, pApCliEntry->MlmeAux.Bssid, ifIndex, CliIdx);
if (CachedIdx != INVALID_PMKID_IDX) {
SAE_INSTANCE *pSaeIns = search_sae_instance(&pAd->SaeCfg, if_addr, pApCliEntry->MlmeAux.Bssid);
MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_ERROR,
("[SAE]Reconnection falied with pmkid ,delete cache entry and sae instance \n"));
if (pSaeIns != NULL) {
delete_sae_instance(pSaeIns);
}
apcli_delete_pmkid_cache(pAd, pApCliEntry->MlmeAux.Bssid, ifIndex, CliIdx);
}
}
#endif
}
#endif/*APCLI_SAE_SUPPORT*/
#ifdef APCLI_AUTO_CONNECT_SUPPORT
if ((pAd->ApCfg.ApCliAutoConnectRunning[apcli_ifIndex] == TRUE)
@ -1415,11 +1735,10 @@ static VOID ApCliCtrlAssocRspAction(
ApCliSwitchCandidateAP(pAd, &pApCliEntry->wdev);
#endif /* APCLI_AUTO_CONNECT_SUPPORT */
#if defined(RT_CFG80211_P2P_CONCURRENT_DEVICE) || defined(CFG80211_MULTI_STA)
#if defined(RT_CFG80211_P2P_CONCURRENT_DEVICE) || defined(CFG80211_MULTI_STA) || defined(APCLI_CFG80211_SUPPORT)
CFG80211_checkScanTable(pAd);
RT_CFG80211_P2P_CLI_CONN_RESULT_INFORM(pAd, pApCliEntry->MlmeAux.Bssid,
NULL, 0, NULL, 0, 0);
#endif /* RT_CFG80211_P2P_CONCURRENT_DEVICE || CFG80211_MULTI_STA */
RT_CFG80211_P2P_CLI_CONN_RESULT_INFORM(pAd, pApCliEntry->MlmeAux.Bssid, NULL, 0, NULL, 0, 0);
#endif /* RT_CFG80211_P2P_CONCURRENT_DEVICE || CFG80211_MULTI_STA || APCLI_CFG80211_SUPPORT */
}
@ -1544,6 +1863,10 @@ static VOID ApCliCtrlAssocReqTimeoutAction(
if (pReptEntry->AssocReqCnt > 5) {
MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE,
("(%s) Rept CliIdx:%d, Assoc Req Timeout over 5 times\n", __func__, CliIdx));
#ifdef FAST_EAPOL_WAR
ApCliCtrlDeleteMacEntry(pAd, ifIndex, CliIdx);
#endif /* FAST_EAPOL_WAR */
*pCurrState = APCLI_CTRL_DISCONNECTED;
pReptEntry->AssocReqCnt = 0;
return;
@ -1554,9 +1877,17 @@ static VOID ApCliCtrlAssocReqTimeoutAction(
pApCliEntry->AssocReqCnt++;
if (pApCliEntry->AssocReqCnt > 5) {
*pCurrState = APCLI_CTRL_DISCONNECTED;
#ifdef FAST_EAPOL_WAR
ApCliCtrlDeleteMacEntry(pAd, ifIndex, CliIdx);
#endif /* FAST_EAPOL_WAR */
NdisZeroMemory(pAd->ApCfg.ApCliTab[ifIndex].MlmeAux.Bssid, MAC_ADDR_LEN);
NdisZeroMemory(pAd->ApCfg.ApCliTab[ifIndex].MlmeAux.Ssid, MAX_LEN_OF_SSID);
pApCliEntry->AssocReqCnt = 0;
#ifdef APCLI_OWE_SUPPORT
apcli_reset_owe_parameters(pAd, ifIndex);
#endif
#ifdef APCLI_AUTO_CONNECT_SUPPORT
if ((pAd->ApCfg.ApCliAutoConnectRunning[ifIndex] == TRUE)
@ -1597,6 +1928,7 @@ static VOID ApCliCtrlDisconnectReqAction(
PAPCLI_STRUCT pApCliEntry;
USHORT ifIndex = (USHORT)(Elem->Priv);
PULONG pCurrState = NULL;
PULONG pAuthCurrState = NULL;
BOOLEAN bValid = FALSE;
#ifdef MAC_REPEATER_SUPPORT
UCHAR CliIdx = 0xFF;
@ -1619,12 +1951,14 @@ static VOID ApCliCtrlDisconnectReqAction(
CliIdx = ifIndex - REPT_MLME_START_IDX;
pReptEntry = &pAd->ApCfg.pRepeaterCliPool[CliIdx];
ifIndex = pReptEntry->wdev->func_idx;
pAuthCurrState = &pReptEntry->AuthCurrState;
pCurrState = &pReptEntry->CtrlCurrState;
pLinkDownReason = &pReptEntry->LinkDownReason;
} else
#endif /* MAC_REPEATER_SUPPORT */
{
pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].CtrlCurrState;
pAuthCurrState = &pAd->ApCfg.ApCliTab[ifIndex].AuthCurrState;
pLinkDownReason = &pAd->ApCfg.ApCliTab[ifIndex].LinkDownReason;
}
@ -1650,6 +1984,10 @@ static VOID ApCliCtrlDisconnectReqAction(
#endif
MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_ERROR, ("(%s) 2. Before do ApCliLinkDown. ifIndex = %d, bValid = %d\n", __func__, ifIndex, bValid));
#ifdef FAST_EAPOL_WAR
ApCliCtrlDeleteMacEntry(pAd, ifIndex, CliIdx);
#endif /* FAST_EAPOL_WAR */
if (bValid) {
#ifdef MAC_REPEATER_SUPPORT
ifIndex = (USHORT)(Elem->Priv);
@ -1678,6 +2016,7 @@ static VOID ApCliCtrlDisconnectReqAction(
}
{
*pAuthCurrState = AUTH_REQ_IDLE;
*pCurrState = APCLI_CTRL_DISCONNECTED;
}
}
@ -1793,6 +2132,10 @@ static VOID ApCliCtrlPeerDeAssocReqAction(
pAd->ApCfg.ApCliTab[ifIndex].MlmeAux.SsidLen = 0;
NdisZeroMemory(pAd->ApCfg.ApCliTab[ifIndex].MlmeAux.Ssid, MAX_LEN_OF_SSID);
pAd->ApCfg.ApCliTab[ifIndex].MlmeAux.Rssi = 0;
#ifdef APCLI_OWE_SUPPORT
apcli_reset_owe_parameters(pAd, ifIndex);
#endif
}
{

View File

@ -178,13 +178,24 @@ static VOID ApCliMlmeProbeReqAction(
NdisCopyMemory(pAd->ApCfg.ApCliTab[ifIndex].MlmeAux.Ssid, pAd->ApCfg.ApCliTab[ifIndex].CfgSsid,
pAd->ApCfg.ApCliTab[ifIndex].CfgSsidLen);
#endif /* APCLI_CONNECTION_TRIAL */
#ifdef APCLI_OWE_SUPPORT
/*OWE:clear previously selected ssid and bssid */
if (IS_AKM_OWE(wdev->SecConfig.AKMMap) && (pApCliEntry->owe_trans_ssid_len > 0)) {
NdisZeroMemory(pAd->ApCfg.ApCliTab[ifIndex].MlmeAux.Bssid, MAC_ADDR_LEN);
NdisZeroMemory(pAd->ApCfg.ApCliTab[ifIndex].MlmeAux.Ssid, MAX_LEN_OF_SSID);
}
#endif
ApCliEnqueueProbeRequest(pAd, Info->SsidLen, (PCHAR) Info->Ssid, ifIndex);
MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, ("ApCli SYNC - Start Probe the SSID %s on channel =%d\n",
pApCliEntry->MlmeAux.Ssid, pApCliEntry->MlmeAux.Channel));
*pCurrState = APCLI_JOIN_WAIT_PROBE_RSP;
}
/*
==========================================================================
Description:
@ -207,6 +218,21 @@ static VOID ApCliPeerProbeRspAtJoinAction(
ULONG *pCurrState;
BCN_IE_LIST *ie_list = NULL;
#if defined(CUSTOMER_DCC_FEATURE) || defined(CONFIG_MAP_SUPPORT)
UCHAR Snr[4] = {0};
CHAR rssi[4] = {0};
Snr[0] = ConvertToSnr(pAd, Elem->rssi_info.raw_Snr[0]);
Snr[1] = ConvertToSnr(pAd, Elem->rssi_info.raw_Snr[1]);
Snr[2] = ConvertToSnr(pAd, Elem->rssi_info.raw_Snr[2]);
Snr[3] = ConvertToSnr(pAd, Elem->rssi_info.raw_Snr[3]);
rssi[0] = ConvertToRssi(pAd, &Elem->rssi_info, RSSI_IDX_0);
rssi[1] = ConvertToRssi(pAd, &Elem->rssi_info, RSSI_IDX_1);
rssi[2] = ConvertToRssi(pAd, &Elem->rssi_info, RSSI_IDX_2);
rssi[3] = ConvertToRssi(pAd, &Elem->rssi_info, RSSI_IDX_3);
#endif
if (ifIndex >= MAX_APCLI_NUM)
return;
@ -254,18 +280,20 @@ static VOID ApCliPeerProbeRspAtJoinAction(
INT matchFlag = FALSE;
ULONG Bssidx;
CHAR Rssi = -127;
#if defined(RT_CFG80211_P2P_CONCURRENT_DEVICE) || defined(CFG80211_MULTI_STA) || defined(WH_EZ_SETUP)
#if defined(RT_CFG80211_P2P_CONCURRENT_DEVICE) || defined(CFG80211_MULTI_STA) || defined(WH_EZ_SETUP) || defined(APCLI_CFG80211_SUPPORT)
CHAR Rssi0 = ConvertToRssi(pAd, &Elem->rssi_info, RSSI_IDX_0);
CHAR Rssi1 = ConvertToRssi(pAd, &Elem->rssi_info, RSSI_IDX_1);
CHAR Rssi2 = ConvertToRssi(pAd, &Elem->rssi_info, RSSI_IDX_2);
LONG RealRssi = (LONG)(RTMPMaxRssi(pAd, Rssi0, Rssi1, Rssi2));
#endif
/* Update ScanTab */
Bssidx = BssTableSearch(&pAd->ScanTab, ie_list->Bssid, ie_list->Channel);
if (Bssidx == BSS_NOT_FOUND) {
{
/* discover new AP of this network, create BSS entry */
Bssidx = BssTableSetEntry(pAd, &pAd->ScanTab, ie_list, -Rssi, LenVIE, pVIE);
Bssidx = BssTableSetEntry(pAd, &pAd->ScanTab, ie_list, -Rssi, LenVIE, pVIE
#if defined(CUSTOMER_DCC_FEATURE) || defined(CONFIG_MAP_SUPPORT)
, Snr, rssi
#endif
);
if (Bssidx == BSS_NOT_FOUND) { /* return if BSS table full */
MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_ERROR, ("ERROR: Driver ScanTable Full In Apcli ProbeRsp Join\n"));
@ -283,7 +311,7 @@ static VOID ApCliPeerProbeRspAtJoinAction(
NdisMoveMemory(pAd->ScanTab.BssEntry[Bssidx].MacAddr, ie_list->Addr2, MAC_ADDR_LEN);
}
#if defined(RT_CFG80211_P2P_CONCURRENT_DEVICE) || defined(CFG80211_MULTI_STA)
#if defined(RT_CFG80211_P2P_CONCURRENT_DEVICE) || defined(CFG80211_MULTI_STA) || defined(APCLI_CFG80211_SUPPORT)
/* Determine primary channel by IE's DSPS rather than channel of received frame */
if (ie_list->Channel != 0)
@ -291,11 +319,47 @@ static VOID ApCliPeerProbeRspAtJoinAction(
MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, ("Info: Update the SSID %s in Kernel Table\n", ie_list->Ssid));
RT_CFG80211_SCANNING_INFORM(pAd, Bssidx, ie_list->Channel, (UCHAR *)Elem->Msg, Elem->MsgLen, RealRssi);
#endif /* RT_CFG80211_P2P_CONCURRENT_DEVICE || CFG80211_MULTI_STA */
#endif /* RT_CFG80211_P2P_CONCURRENT_DEVICE || CFG80211_MULTI_STA || APCLI_CFG80211_SUPPORT */
pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];
#ifdef APCLI_OWE_SUPPORT
if (IS_AKM_OWE(pApCliEntry->wdev.SecConfig.AKMMap) && (pApCliEntry->owe_trans_ssid_len > 0)) {
BSS_ENTRY *popen_bss_entry = NULL;
popen_bss_entry = &pAd->ScanTab.BssEntry[Bssidx];
if (!MAC_ADDR_EQUAL(pApCliEntry->owe_trans_bssid, ie_list->Bssid)) {
MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_ERROR, ("ERROR: OWE Transition AP BSSID not equal\n"));
goto LabelErr;
}
/*Validate that we are connecting wth the same OWE BSS that was mentioned in the OPEN BSS Transition IE*/
if (popen_bss_entry->owe_trans_ie_len > 0) {
UCHAR pair_ch = 0;
UCHAR pair_bssid[MAC_ADDR_LEN] = {0};
UCHAR pair_ssid[MAX_LEN_OF_SSID] = {0};
UCHAR pair_band = 0;
UCHAR pair_ssid_len = 0;
extract_pair_owe_bss_info(popen_bss_entry->owe_trans_ie,
popen_bss_entry->owe_trans_ie_len,
pair_bssid,
pair_ssid,
&pair_ssid_len,
&pair_band,
&pair_ch);
if (!MAC_ADDR_EQUAL(pApCliEntry->owe_trans_open_bssid, pair_bssid)
|| !SSID_EQUAL(pApCliEntry->owe_trans_open_ssid, pApCliEntry->owe_trans_open_ssid_len, pair_ssid, pair_ssid_len)) {
MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_ERROR, ("OWE:Transition AP Validation Failed\n"));
goto LabelErr;
}
}
} else
#endif
if (!MAC_ADDR_EQUAL(pApCliEntry->CfgApCliBssid, ZERO_MAC_ADDR)) {
if (!MAC_ADDR_EQUAL(pApCliEntry->CfgApCliBssid, ie_list->Bssid)) {
MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_ERROR, ("ERROR: AP BSSID not equal\n"));
goto LabelErr;
}
@ -322,6 +386,20 @@ static VOID ApCliPeerProbeRspAtJoinAction(
bssidEmptyFlag = FALSE;
}
} else
#endif
#ifdef APCLI_OWE_SUPPORT
if (pApCliEntry->owe_trans_ssid_len > 0) {
ssidEqualFlag = SSID_EQUAL(pApCliEntry->owe_trans_ssid, pApCliEntry->owe_trans_ssid_len, ie_list->Ssid, ie_list->SsidLen);
bssidEqualFlag = MAC_ADDR_EQUAL(pApCliEntry->owe_trans_bssid, ie_list->Bssid);
if (ssidEqualFlag == TRUE)
ssidEmptyFlag = FALSE;
if (bssidEqualFlag == TRUE)
bssidEmptyFlag = FALSE;
} else
#endif
{
/* Check the Probe-Rsp's Ssid. */
@ -372,10 +450,10 @@ static VOID ApCliPeerProbeRspAtJoinAction(
&& ((pApCliEntry->wdev.WscControl.WscConfMode == WSC_DISABLE) ||
(pApCliEntry->wdev.WscControl.bWscTrigger == FALSE))
#endif /* WSC_AP_SUPPORT */
#if defined(RT_CFG80211_P2P_CONCURRENT_DEVICE) || defined(CFG80211_MULTI_STA)
#if defined(RT_CFG80211_P2P_CONCURRENT_DEVICE) || defined(CFG80211_MULTI_STA) || defined(APCLI_CFG80211_SUPPORT)
/* When using CFG80211 and trigger WPS, do not check security. */
&& !(pApCliEntry->wpa_supplicant_info.WpaSupplicantUP & WPA_SUPPLICANT_ENABLE_WPS)
#endif /* RT_CFG80211_P2P_CONCURRENT_DEVICE || CFG80211_MULTI_STA */
#endif /* RT_CFG80211_P2P_CONCURRENT_DEVICE || CFG80211_MULTI_STA || APCLI_CFG80211_SUPPORT */
) {
#ifdef DOT11W_PMF_SUPPORT
{
@ -402,6 +480,12 @@ static VOID ApCliPeerProbeRspAtJoinAction(
pApCliEntry->MlmeAux.VarIELen = 0;
MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_ERROR,
("ERROR: The RSN IE of this received Probe-resp is dis-match !!!!!!!!!!\n"));
#ifdef CONFIG_MAP_SUPPORT
if (IS_MAP_TURNKEY_ENABLE(pAd)) {
pApCliEntry->Enable = 0;
wapp_send_apcli_association_change(WAPP_APCLI_DISASSOCIATED, pAd, pApCliEntry);
}
#endif
goto LabelErr;
}
} else {
@ -410,6 +494,9 @@ static VOID ApCliPeerProbeRspAtJoinAction(
&& ((pApCliEntry->wdev.WscControl.WscConfMode == WSC_DISABLE) ||
(pApCliEntry->wdev.WscControl.bWscTrigger == FALSE))
#endif /* WSC_AP_SUPPORT */
#ifdef APCLI_OWE_SUPPORT
&& !IS_AKM_OWE(pApCliEntry->wdev.SecConfig.AKMMap)
#endif
) {
/* ignore this response */
MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_ERROR,
@ -451,7 +538,19 @@ static VOID ApCliPeerProbeRspAtJoinAction(
SET_CIPHER_WEP(pApCliEntry->MlmeAux.PairwiseCipher);
SET_CIPHER_WEP(pApCliEntry->MlmeAux.GroupCipher);
} else {
}
#ifdef APCLI_OWE_SUPPORT
else if (IS_AKM_OWE(pSecConfig->AKMMap) && (Privacy == 0)) {
CLEAR_SEC_AKM(pApCliEntry->MlmeAux.AKMMap);
CLEAR_CIPHER(pApCliEntry->MlmeAux.PairwiseCipher);
CLEAR_CIPHER(pApCliEntry->MlmeAux.GroupCipher);
SET_AKM_OPEN(pApCliEntry->MlmeAux.AKMMap);
SET_CIPHER_NONE(pApCliEntry->MlmeAux.PairwiseCipher);
SET_CIPHER_NONE(pApCliEntry->MlmeAux.GroupCipher);
}
#endif
else {
/* Ignoring the probe response with privacy
* not matching our configured Security config
* No need to process further */
@ -482,7 +581,12 @@ static VOID ApCliPeerProbeRspAtJoinAction(
CHAR Rssi0 = ConvertToRssi(pAd, &Elem->rssi_info, RSSI_IDX_0);
CHAR Rssi1 = ConvertToRssi(pAd, &Elem->rssi_info, RSSI_IDX_1);
CHAR Rssi2 = ConvertToRssi(pAd, &Elem->rssi_info, RSSI_IDX_2);
#if defined(CUSTOMER_DCC_FEATURE) || defined(CONFIG_MAP_SUPPORT)
CHAR Rssi3 = ConvertToRssi(pAd, &Elem->rssi_info, RSSI_IDX_3);
LONG RealRssi = (LONG)(RTMPMaxRssi(pAd, Rssi0, Rssi1, Rssi2, Rssi3));
#else
LONG RealRssi = (LONG)(RTMPMaxRssi(pAd, Rssi0, Rssi1, Rssi2));
#endif
MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, ("SYNC - previous Rssi = %ld current Rssi=%ld\n",
pApCliEntry->MlmeAux.Rssi, (LONG)RealRssi));
@ -491,7 +595,6 @@ static VOID ApCliPeerProbeRspAtJoinAction(
goto LabelErr;
else
pApCliEntry->MlmeAux.Rssi = RealRssi;
if (ie_list->Channel != pApCliEntry->MlmeAux.Channel) {
MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, ("SYNC - current ie channel=%d, apcli channel=%d!\n",
ie_list->Channel, pApCliEntry->MlmeAux.Channel));
@ -619,7 +722,8 @@ static VOID ApCliPeerProbeRspAtJoinAction(
set_extcha_for_wdev(pAd, wdev, 1);
else
set_extcha_for_wdev(pAd, wdev, 0);
*pCurrState = APCLI_SYNC_IDLE;
pAd->ApCfg.ApCliTab[ifIndex].CtrlCurrState = APCLI_CTRL_DISCONNECTED;
goto LabelErr;
}
}
@ -633,6 +737,238 @@ static VOID ApCliPeerProbeRspAtJoinAction(
#endif /* APCLI_CERT_SUPPORT */
#endif /* WSC_AP_SUPPORT */
#ifdef APCLI_OWE_SUPPORT
if ((bssidEqualFlag == TRUE)
&& (pAd->ScanTab.BssEntry[Bssidx].owe_trans_ie_len > 0)
&& (IS_AKM_OWE(pApCliEntry->wdev.SecConfig.AKMMap)
&& (IS_AKM_OPEN(pApCliEntry->MlmeAux.AKMMap)
&& IS_CIPHER_NONE(pApCliEntry->MlmeAux.PairwiseCipher)))) {
BSS_ENTRY *popen_bss_entry = NULL;
BSS_TABLE *pscan_tab = NULL;
struct wifi_dev *papcli_wdev = NULL;
/*If bssidEqualFlag is set then the probe timer has been cancelled ,*
so we need to perform OWE trans IE parsing here in the case of Configured BSSID*/
*pCurrState = APCLI_SYNC_IDLE;
pscan_tab = &pAd->ScanTab;
papcli_wdev = (struct wifi_dev *)&pApCliEntry->wdev;
/*If Trans IE found then extract BSSID ,SSID ,Band and Channel*/
popen_bss_entry = &pscan_tab->BssEntry[Bssidx];
if (popen_bss_entry && (popen_bss_entry->owe_trans_ie_len > 0)) {
UCHAR pair_ch = 0;
UCHAR pair_bssid[MAC_ADDR_LEN] = {0};
UCHAR pair_ssid[MAX_LEN_OF_SSID] = {0};
UCHAR pair_band = 0;
UCHAR pair_ssid_len = 0;
extract_pair_owe_bss_info(popen_bss_entry->owe_trans_ie,
popen_bss_entry->owe_trans_ie_len,
pair_bssid,
pair_ssid,
&pair_ssid_len,
&pair_band,
&pair_ch);
if (pair_ch != 0) {
/*OWE Entry found ,update OweTransBssid and OweTranSsid*/
/*OWE bss is on different channel*/
if (BOARD_IS_5G_ONLY(pAd)) {
UCHAR BandIdx = HcGetBandByWdev(papcli_wdev);
CHANNEL_CTRL *pChCtrl = hc_get_channel_ctrl(pAd->hdev_ctrl, BandIdx);
/*Single Chip Dual band 5g only case*/
if (MTChGrpChannelChk(pChCtrl, pair_ch)) {
/*Channel is valid in the current channel group*/
if (pair_ch != popen_bss_entry->Channel) {
/*OWE send EVENT to host for OWE indicating different channel*/
wext_send_owe_trans_chan_event(papcli_wdev->if_dev,
OID_802_11_OWE_EVT_SAME_BAND_DIFF_CHANNEL,
pair_bssid,
pair_ssid,
&pair_ssid_len,
&pair_band,
&pair_ch);
MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE,
("%s:%d Different channel same band\n", __func__, __LINE__));
NdisMoveMemory(&pApCliEntry->owe_trans_bssid, pair_bssid, MAC_ADDR_LEN);
NdisMoveMemory(&pApCliEntry->owe_trans_ssid, pair_ssid, pair_ssid_len);
pApCliEntry->owe_trans_ssid_len = pair_ssid_len;
CLEAR_SEC_AKM(pApCliEntry->MlmeAux.AKMMap);
CLEAR_CIPHER(pApCliEntry->MlmeAux.PairwiseCipher);
CLEAR_CIPHER(pApCliEntry->MlmeAux.GroupCipher);
/*Delete the Open Bss entry from Scan table because apcli does not ageout scan tab entries*/
BssTableDeleteEntry(pscan_tab, pApCliEntry->MlmeAux.Bssid, pApCliEntry->MlmeAux.Channel);
MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, ("Switch to channel :%d\n",
pair_ch));
rtmp_set_channel(pAd, &pApCliEntry->wdev, pair_ch);
/* if bw adjust,timeout this time */
MlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_JOIN_REQ_TIMEOUT, 0, NULL, ifIndex);
return;
} else {
/*Same Channel send directed probe request to OWE BSS*/
/*Update the Owe transtion Bssid and Ssid that will used for a directed probe request to OWE AP*/
NdisMoveMemory(&pApCliEntry->owe_trans_bssid, pair_bssid, MAC_ADDR_LEN);
NdisMoveMemory(&pApCliEntry->owe_trans_ssid, pair_ssid, pair_ssid_len);
pApCliEntry->owe_trans_ssid_len = pair_ssid_len;
NdisMoveMemory(&pApCliEntry->owe_trans_open_bssid, popen_bss_entry->Bssid, MAC_ADDR_LEN);
NdisMoveMemory(&pApCliEntry->owe_trans_open_ssid, popen_bss_entry->Ssid, popen_bss_entry->SsidLen);
pApCliEntry->owe_trans_open_ssid_len = popen_bss_entry->SsidLen;
CLEAR_SEC_AKM(pApCliEntry->MlmeAux.AKMMap);
CLEAR_CIPHER(pApCliEntry->MlmeAux.PairwiseCipher);
CLEAR_CIPHER(pApCliEntry->MlmeAux.GroupCipher);
/*Delete the Open Bss entry from Scan table because apcli does not ageout scan tab entries*/
BssTableDeleteEntry(pscan_tab, pApCliEntry->MlmeAux.Bssid, pApCliEntry->MlmeAux.Channel);
MlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_JOIN_REQ_TIMEOUT, 0, NULL, ifIndex);
return;
}
} else {
/*Channel not in group of current band , but entry exists so send event to host to trigger connection on other band*/
wext_send_owe_trans_chan_event(papcli_wdev->if_dev,
OID_802_11_OWE_EVT_DIFF_BAND,
pair_bssid,
pair_ssid,
&pair_ssid_len,
&pair_band,
&pair_ch);
}
} else {
/*Check if the OWE bss is on the same band as the CLI,then check if channel change required*/
if ((WMODE_2G_ONLY(pApCliEntry->wdev.PhyMode) && (pair_ch <= 14))
|| (WMODE_5G_ONLY(pApCliEntry->wdev.PhyMode) && (pair_ch > 14))) {
if (pair_ch != popen_bss_entry->Channel) {
/*OWE send EVENT to host for OWE indicating different channel*/
wext_send_owe_trans_chan_event(papcli_wdev->if_dev,
OID_802_11_OWE_EVT_SAME_BAND_DIFF_CHANNEL,
pair_bssid,
pair_ssid,
&pair_ssid_len,
&pair_band,
&pair_ch);
MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, ("%s:%d Different channel same band\n", __func__, __LINE__));
NdisMoveMemory(&pApCliEntry->owe_trans_bssid, pair_bssid, MAC_ADDR_LEN);
NdisMoveMemory(&pApCliEntry->owe_trans_ssid, pair_ssid, pair_ssid_len);
pApCliEntry->owe_trans_ssid_len = pair_ssid_len;
NdisMoveMemory(&pApCliEntry->owe_trans_open_bssid, popen_bss_entry->Bssid, MAC_ADDR_LEN);
NdisMoveMemory(&pApCliEntry->owe_trans_open_ssid, popen_bss_entry->Ssid, popen_bss_entry->SsidLen);
pApCliEntry->owe_trans_open_ssid_len = popen_bss_entry->SsidLen;
CLEAR_SEC_AKM(pApCliEntry->MlmeAux.AKMMap);
CLEAR_CIPHER(pApCliEntry->MlmeAux.PairwiseCipher);
CLEAR_CIPHER(pApCliEntry->MlmeAux.GroupCipher);
/*Delete the Open Bss entry from Scan table because apcli does not ageout scan tab entries*/
BssTableDeleteEntry(pscan_tab, pApCliEntry->MlmeAux.Bssid, pApCliEntry->MlmeAux.Channel);
MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, ("Switch to channel :%d\n",
pair_ch));
rtmp_set_channel(pAd, &pApCliEntry->wdev, pair_ch);
MlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_JOIN_REQ_TIMEOUT, 0, NULL, ifIndex);
return;
} else {
/*Same Channel send directed probe request to OWE BSS*/
/*Update the Owe transtion Bssid and Ssid that will used for a directed probe request to OWE AP*/
NdisMoveMemory(&pApCliEntry->owe_trans_bssid, pair_bssid, MAC_ADDR_LEN);
NdisMoveMemory(&pApCliEntry->owe_trans_ssid, pair_ssid, pair_ssid_len);
pApCliEntry->owe_trans_ssid_len = pair_ssid_len;
NdisMoveMemory(&pApCliEntry->owe_trans_open_bssid, popen_bss_entry->Bssid, MAC_ADDR_LEN);
NdisMoveMemory(&pApCliEntry->owe_trans_open_ssid, popen_bss_entry->Ssid, popen_bss_entry->SsidLen);
pApCliEntry->owe_trans_open_ssid_len = popen_bss_entry->SsidLen;
CLEAR_SEC_AKM(pApCliEntry->MlmeAux.AKMMap);
CLEAR_CIPHER(pApCliEntry->MlmeAux.PairwiseCipher);
CLEAR_CIPHER(pApCliEntry->MlmeAux.GroupCipher);
/*Delete the Open Bss entry from Scan table because apcli does not ageout scan tab entries*/
BssTableDeleteEntry(pscan_tab, pApCliEntry->MlmeAux.Bssid, pApCliEntry->MlmeAux.Channel);
MlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_JOIN_REQ_TIMEOUT, 0, NULL, ifIndex);
return;
}
} else {
/*Channel not in group of current band , but entry exists so send event to host to trigger connection on other band*/
wext_send_owe_trans_chan_event(papcli_wdev->if_dev,
OID_802_11_OWE_EVT_DIFF_BAND,
pair_bssid,
pair_ssid,
&pair_ssid_len,
&pair_band,
&pair_ch);
}
}
} else {
/*Same Channel send directed probe request to OWE BSS*/
/*Update the Owe transtion Bssid and Ssid that will used for a directed probe request to OWE AP*/
NdisMoveMemory(&pApCliEntry->owe_trans_bssid, pair_bssid, MAC_ADDR_LEN);
NdisMoveMemory(&pApCliEntry->owe_trans_ssid, pair_ssid, pair_ssid_len);
pApCliEntry->owe_trans_ssid_len = pair_ssid_len;
NdisMoveMemory(&pApCliEntry->owe_trans_open_bssid, popen_bss_entry->Bssid, MAC_ADDR_LEN);
NdisMoveMemory(&pApCliEntry->owe_trans_open_ssid, popen_bss_entry->Ssid, popen_bss_entry->SsidLen);
pApCliEntry->owe_trans_open_ssid_len = popen_bss_entry->SsidLen;
CLEAR_SEC_AKM(pApCliEntry->MlmeAux.AKMMap);
CLEAR_CIPHER(pApCliEntry->MlmeAux.PairwiseCipher);
CLEAR_CIPHER(pApCliEntry->MlmeAux.GroupCipher);
/*Delete the Open Bss entry from Scan table because apcli does not ageout scan tab entries*/
BssTableDeleteEntry(pscan_tab, pApCliEntry->MlmeAux.Bssid, pApCliEntry->MlmeAux.Channel);
MlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_JOIN_REQ_TIMEOUT, 0, NULL, ifIndex);
return;
}
}
} else
#endif
if (bssidEqualFlag == TRUE) {
*pCurrState = APCLI_SYNC_IDLE;
ApCliCtrlMsg.Status = MLME_SUCCESS;
@ -641,13 +977,16 @@ static VOID ApCliPeerProbeRspAtJoinAction(
ApCliCtrlMsg.CliIdx = 0xFF;
#endif /* MAC_REPEATER_SUPPORT */
#ifdef APCLI_AUTO_CONNECT_SUPPORT
#ifndef APCLI_CFG80211_SUPPORT
/* follow root ap setting while ApCliAutoConnectRunning is active */
if (((pAd->ApCfg.ApCliAutoConnectRunning[ifIndex] == TRUE) &&
(pAd->ApCfg.ApCliAutoBWAdjustCnt[ifIndex] < 3))
#ifdef BT_APCLI_SUPPORT
|| (pAd->ApCfg.ApCliAutoBWBTSupport == TRUE)
#endif
) {
)
#endif /*APCLI_CFG80211_SUPPORT*/
{
ULONG Bssidx = 0;
@ -722,13 +1061,52 @@ static VOID ApCliProbeTimeoutAtJoinAction(
PULONG pCtrl_CurrState = &pAd->ApCfg.ApCliTab[ifIndex].CtrlCurrState;
#endif
APCLI_STRUCT *pApCliEntry = NULL;
#ifdef APCLI_OWE_SUPPORT
UCHAR entryIdx = 0;
BSS_TABLE *pscan_tab = NULL, *pssid_bss_tab = NULL;
struct wifi_dev *papcli_wdev = NULL;
#endif
MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, ("APCLI_SYNC - ProbeTimeoutAtJoinAction\n"));
if (ifIndex >= MAX_APCLI_NUM)
return;
pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];
#ifdef APCLI_OWE_SUPPORT
papcli_wdev = (struct wifi_dev *)&pApCliEntry->wdev;
pscan_tab = &pAd->ScanTab;
pssid_bss_tab = &pApCliEntry->MlmeAux.owe_bss_tab;
pssid_bss_tab->BssNr = 0;
/*
Find out APs with OWE transition IE and store them in the owe_bss_tab*
*/
if (IS_AKM_OWE(pApCliEntry->wdev.SecConfig.AKMMap)) {
for (entryIdx = 0; entryIdx < pscan_tab->BssNr; entryIdx++) {
BSS_ENTRY *pBssEntry = &pscan_tab->BssEntry[entryIdx];
if (pBssEntry->Channel == 0)
continue;
if ((pBssEntry->owe_trans_ie_len > 0) &&
(pssid_bss_tab->BssNr < MAX_LEN_OF_BSS_TABLE)) {
MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_INFO, ("%s:OWE Table %d:Bssid=%02x:%02x:%02x:%02x:%02x:%02x\n", __func__, __LINE__,
PRINT_MAC(pBssEntry->Bssid)));
NdisMoveMemory(&pssid_bss_tab->BssEntry[pssid_bss_tab->BssNr++],
pBssEntry, sizeof(BSS_ENTRY));
}
}
}
if (pssid_bss_tab->BssNr < MAX_LEN_OF_BSS_TABLE)
NdisZeroMemory(&pssid_bss_tab->BssEntry[pssid_bss_tab->BssNr], sizeof(BSS_ENTRY));
#endif/* APCLI_OWE_SUPPORT */
*pCurrState = SYNC_IDLE;
#ifdef APCLI_CONNECTION_TRIAL
@ -751,16 +1129,249 @@ static VOID ApCliProbeTimeoutAtJoinAction(
ApCliCtrlMsg.BssIdx = ifIndex;
ApCliCtrlMsg.CliIdx = 0xFF;
#endif /* MAC_REPEATER_SUPPORT */
#ifdef APCLI_AUTO_CONNECT_SUPPORT
#ifdef APCLI_OWE_SUPPORT
/*Find Open BSS with Trans IE*/
if (IS_AKM_OWE(papcli_wdev->SecConfig.AKMMap)
&& (IS_AKM_OPEN(pApCliEntry->MlmeAux.AKMMap)
&& IS_CIPHER_NONE(pApCliEntry->MlmeAux.PairwiseCipher))) {
ULONG bssidx = 0;
BSS_ENTRY *popen_bss_entry = NULL;
/*Find BSS entry for Open bss from owe_bss_tab*/
bssidx = BssTableSearch(pssid_bss_tab, pApCliEntry->MlmeAux.Bssid, pApCliEntry->MlmeAux.Channel);
if (bssidx != BSS_NOT_FOUND) {
/*If Trans IE found then extract BSSID ,SSID ,Band and Channel*/
popen_bss_entry = &pssid_bss_tab->BssEntry[bssidx];
if (popen_bss_entry && (popen_bss_entry->owe_trans_ie_len > 0)) {
UCHAR pair_ch = 0;
UCHAR pair_bssid[MAC_ADDR_LEN] = {0};
UCHAR pair_ssid[MAX_LEN_OF_SSID] = {0};
UCHAR pair_band = 0;
UCHAR pair_ssid_len = 0;
extract_pair_owe_bss_info(popen_bss_entry->owe_trans_ie,
popen_bss_entry->owe_trans_ie_len,
pair_bssid,
pair_ssid,
&pair_ssid_len,
&pair_band,
&pair_ch);
if (pair_ch != 0) {
/*OWE Entry found ,update OweTransBssid and OweTranSsid*/
/*OWE bss is on different channel*/
if (BOARD_IS_5G_ONLY(pAd)) {
UCHAR BandIdx = HcGetBandByWdev(papcli_wdev);
CHANNEL_CTRL *pChCtrl = hc_get_channel_ctrl(pAd->hdev_ctrl, BandIdx);
/*Single Chip Dual band 5g only case*/
if (MTChGrpChannelChk(pChCtrl, pair_ch)) {
/*Channel is valid in the current channel group*/
if (pair_ch != popen_bss_entry->Channel) {
/*OWE send EVENT to host for OWE indicating different channel*/
wext_send_owe_trans_chan_event(papcli_wdev->if_dev,
OID_802_11_OWE_EVT_SAME_BAND_DIFF_CHANNEL,
pair_bssid,
pair_ssid,
&pair_ssid_len,
&pair_band,
&pair_ch);
MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE,
("%s:%d Different channel same band\n", __func__, __LINE__));
NdisMoveMemory(&pApCliEntry->owe_trans_bssid, pair_bssid, MAC_ADDR_LEN);
NdisMoveMemory(&pApCliEntry->owe_trans_ssid, pair_ssid, pair_ssid_len);
pApCliEntry->owe_trans_ssid_len = pair_ssid_len;
NdisMoveMemory(&pApCliEntry->owe_trans_open_bssid, popen_bss_entry->Bssid, MAC_ADDR_LEN);
NdisMoveMemory(&pApCliEntry->owe_trans_open_ssid, popen_bss_entry->Ssid, popen_bss_entry->SsidLen);
pApCliEntry->owe_trans_open_ssid_len = popen_bss_entry->SsidLen;
CLEAR_SEC_AKM(pApCliEntry->MlmeAux.AKMMap);
CLEAR_CIPHER(pApCliEntry->MlmeAux.PairwiseCipher);
CLEAR_CIPHER(pApCliEntry->MlmeAux.GroupCipher);
/*Delete the Open Bss entry from Scan table because apcli does not ageout scan tab entries*/
BssTableDeleteEntry(pscan_tab, pApCliEntry->MlmeAux.Bssid, pApCliEntry->MlmeAux.Channel);
MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, ("Switch to channel :%d\n",
pair_ch));
rtmp_set_channel(pAd, &pApCliEntry->wdev, pair_ch);
/* if bw adjust,timeout this time */
MlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_JOIN_REQ_TIMEOUT, 0, NULL, ifIndex);
return;
} else {
/*Same Channel send directed probe request to OWE BSS*/
/*Update the Owe transtion Bssid and Ssid that will used for a directed probe request to OWE AP*/
NdisMoveMemory(&pApCliEntry->owe_trans_bssid, pair_bssid, MAC_ADDR_LEN);
NdisMoveMemory(&pApCliEntry->owe_trans_ssid, pair_ssid, pair_ssid_len);
pApCliEntry->owe_trans_ssid_len = pair_ssid_len;
NdisMoveMemory(&pApCliEntry->owe_trans_open_bssid, popen_bss_entry->Bssid, MAC_ADDR_LEN);
NdisMoveMemory(&pApCliEntry->owe_trans_open_ssid, popen_bss_entry->Ssid, popen_bss_entry->SsidLen);
pApCliEntry->owe_trans_open_ssid_len = popen_bss_entry->SsidLen;
CLEAR_SEC_AKM(pApCliEntry->MlmeAux.AKMMap);
CLEAR_CIPHER(pApCliEntry->MlmeAux.PairwiseCipher);
CLEAR_CIPHER(pApCliEntry->MlmeAux.GroupCipher);
/*Delete the Open Bss entry from Scan table because apcli does not ageout scan tab entries*/
BssTableDeleteEntry(pscan_tab, pApCliEntry->MlmeAux.Bssid, pApCliEntry->MlmeAux.Channel);
MlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_JOIN_REQ_TIMEOUT, 0, NULL, ifIndex);
return;
}
} else {
/*Channel not in group of current band , but entry exists so send event to host to trigger connection on other band*/
wext_send_owe_trans_chan_event(papcli_wdev->if_dev,
OID_802_11_OWE_EVT_DIFF_BAND,
pair_bssid,
pair_ssid,
&pair_ssid_len,
&pair_band,
&pair_ch);
}
} else {
/*Check if the OWE bss is on the same band as the CLI,then check if channel change required*/
if ((WMODE_2G_ONLY(pApCliEntry->wdev.PhyMode) && (pair_ch <= 14))
|| (WMODE_5G_ONLY(pApCliEntry->wdev.PhyMode) && (pair_ch > 14))) {
if (pair_ch != popen_bss_entry->Channel) {
/*OWE send EVENT to host for OWE indicating different channel*/
wext_send_owe_trans_chan_event(papcli_wdev->if_dev,
OID_802_11_OWE_EVT_SAME_BAND_DIFF_CHANNEL,
pair_bssid,
pair_ssid,
&pair_ssid_len,
&pair_band,
&pair_ch);
MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, ("%s:%d Different channel same band\n", __func__, __LINE__));
NdisMoveMemory(&pApCliEntry->owe_trans_bssid, pair_bssid, MAC_ADDR_LEN);
NdisMoveMemory(&pApCliEntry->owe_trans_ssid, pair_ssid, pair_ssid_len);
pApCliEntry->owe_trans_ssid_len = pair_ssid_len;
NdisMoveMemory(&pApCliEntry->owe_trans_open_bssid, popen_bss_entry->Bssid, MAC_ADDR_LEN);
NdisMoveMemory(&pApCliEntry->owe_trans_open_ssid, popen_bss_entry->Ssid, popen_bss_entry->SsidLen);
pApCliEntry->owe_trans_open_ssid_len = popen_bss_entry->SsidLen;
CLEAR_SEC_AKM(pApCliEntry->MlmeAux.AKMMap);
CLEAR_CIPHER(pApCliEntry->MlmeAux.PairwiseCipher);
CLEAR_CIPHER(pApCliEntry->MlmeAux.GroupCipher);
/*Delete the Open Bss entry from Scan table because apcli does not ageout scan tab entries*/
BssTableDeleteEntry(pscan_tab, pApCliEntry->MlmeAux.Bssid, pApCliEntry->MlmeAux.Channel);
MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, ("Switch to channel :%d\n",
pair_ch));
rtmp_set_channel(pAd, &pApCliEntry->wdev, pair_ch);
MlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_JOIN_REQ_TIMEOUT, 0, NULL, ifIndex);
return;
} else {
/*Same Channel send directed probe request to OWE BSS*/
/*Update the Owe transtion Bssid and Ssid that will used for a directed probe request to OWE AP*/
NdisMoveMemory(&pApCliEntry->owe_trans_bssid, pair_bssid, MAC_ADDR_LEN);
NdisMoveMemory(&pApCliEntry->owe_trans_ssid, pair_ssid, pair_ssid_len);
pApCliEntry->owe_trans_ssid_len = pair_ssid_len;
NdisMoveMemory(&pApCliEntry->owe_trans_open_bssid, popen_bss_entry->Bssid, MAC_ADDR_LEN);
NdisMoveMemory(&pApCliEntry->owe_trans_open_ssid, popen_bss_entry->Ssid, popen_bss_entry->SsidLen);
pApCliEntry->owe_trans_open_ssid_len = popen_bss_entry->SsidLen;
CLEAR_SEC_AKM(pApCliEntry->MlmeAux.AKMMap);
CLEAR_CIPHER(pApCliEntry->MlmeAux.PairwiseCipher);
CLEAR_CIPHER(pApCliEntry->MlmeAux.GroupCipher);
/*Delete the Open Bss entry from Scan table because apcli does not ageout scan tab entries*/
BssTableDeleteEntry(pscan_tab, pApCliEntry->MlmeAux.Bssid, pApCliEntry->MlmeAux.Channel);
MlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_JOIN_REQ_TIMEOUT, 0, NULL, ifIndex);
return;
}
} else {
/*Channel not in group of current band , but entry exists so send event to host to trigger connection on other band*/
wext_send_owe_trans_chan_event(papcli_wdev->if_dev,
OID_802_11_OWE_EVT_DIFF_BAND,
pair_bssid,
pair_ssid,
&pair_ssid_len,
&pair_band,
&pair_ch);
}
}
} else {
/*Same Channel send directed probe request to OWE BSS*/
/*Update the Owe transtion Bssid and Ssid that will used for a directed probe request to OWE AP*/
NdisMoveMemory(&pApCliEntry->owe_trans_bssid, pair_bssid, MAC_ADDR_LEN);
NdisMoveMemory(&pApCliEntry->owe_trans_ssid, pair_ssid, pair_ssid_len);
pApCliEntry->owe_trans_ssid_len = pair_ssid_len;
NdisMoveMemory(&pApCliEntry->owe_trans_open_bssid, popen_bss_entry->Bssid, MAC_ADDR_LEN);
NdisMoveMemory(&pApCliEntry->owe_trans_open_ssid, popen_bss_entry->Ssid, popen_bss_entry->SsidLen);
pApCliEntry->owe_trans_open_ssid_len = popen_bss_entry->SsidLen;
CLEAR_SEC_AKM(pApCliEntry->MlmeAux.AKMMap);
CLEAR_CIPHER(pApCliEntry->MlmeAux.PairwiseCipher);
CLEAR_CIPHER(pApCliEntry->MlmeAux.GroupCipher);
/*Delete the Open Bss entry from Scan table because apcli does not ageout scan tab entries*/
BssTableDeleteEntry(pscan_tab, pApCliEntry->MlmeAux.Bssid, pApCliEntry->MlmeAux.Channel);
MlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_JOIN_REQ_TIMEOUT, 0, NULL, ifIndex);
return;
}
}
}
}
#endif
#ifdef APCLI_AUTO_CONNECT_SUPPORT
#ifndef APCLI_CFG80211_SUPPORT
/* follow root ap setting while ApCliAutoConnectRunning is active */
if (((pAd->ApCfg.ApCliAutoConnectRunning[ifIndex] == TRUE) &&
(pAd->ApCfg.ApCliAutoBWAdjustCnt[ifIndex] < 3))
#ifdef BT_APCLI_SUPPORT
|| (pAd->ApCfg.ApCliAutoBWBTSupport == TRUE)
#endif
) {
)
#endif /* APCLI_CFG80211_SUPPORT */
{
ULONG Bssidx = 0;
Bssidx = BssTableSearch(&pAd->ScanTab, pApCliEntry->MlmeAux.Bssid, pApCliEntry->wdev.channel);
@ -865,6 +1476,12 @@ static VOID ApCliEnqueueProbeRequest(
return;
}
#ifdef APCLI_OWE_SUPPORT
if (IS_AKM_OWE(pApCliEntry->wdev.SecConfig.AKMMap) && (pApCliEntry->owe_trans_ssid_len > 0))
ApCliMgtMacHeaderInit(pAd, &Hdr80211, SUBTYPE_PROBE_REQ, 0,
pAd->ApCfg.ApCliTab[ifIndex].owe_trans_bssid, pAd->ApCfg.ApCliTab[ifIndex].owe_trans_bssid, ifIndex);
else
#endif
if (MAC_ADDR_EQUAL(pAd->ApCfg.ApCliTab[ifIndex].CfgApCliBssid, ZERO_MAC_ADDR))
ApCliMgtMacHeaderInit(pAd, &Hdr80211, SUBTYPE_PROBE_REQ, 0,
BROADCAST_ADDR, BROADCAST_ADDR, ifIndex);

View File

@ -27,3 +27,754 @@
Who When What
--------- ---------- ----------------------------------------------
*/
#ifdef A4_CONN
#include "rt_config.h"
BOOLEAN a4_interface_init(
IN PRTMP_ADAPTER adapter,
IN UCHAR if_index,
IN BOOLEAN is_ap,
IN UCHAR a4_type
)
{
BSS_STRUCT *mbss = NULL;
BOOLEAN add_inf = FALSE;
if (is_ap) {
if (if_index >= HW_BEACON_MAX_NUM)
return FALSE;
mbss = &adapter->ApCfg.MBSSID[if_index];
if (mbss->a4_init == 0) {
NdisAllocateSpinLock(adapter, &mbss->a4_entry_lock);
DlListInit(&mbss->a4_entry_list);
RoutingTabInit(adapter, if_index, ROUTING_ENTRY_A4);
add_inf = TRUE;
}
mbss->a4_init |= (1 << a4_type);
}
#ifdef APCLI_SUPPORT
else {
PAPCLI_STRUCT apcli_entry;
if (if_index >= MAX_APCLI_NUM)
return FALSE;
apcli_entry = &adapter->ApCfg.ApCliTab[if_index];
if (apcli_entry->a4_init == 0)
add_inf = TRUE;
apcli_entry->a4_init |= (1 << a4_type);
}
#else
else
return FALSE;
#endif
if (add_inf) {
if (adapter->a4_interface_count == 0)
MtCmdSetA4Enable(adapter, HOST2CR4, TRUE);
adapter->a4_interface_count++;
}
MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_WARN, ("a4_interface_init a4_interface_count: %d\n",
adapter->a4_interface_count));
return TRUE;
}
BOOLEAN a4_interface_deinit(
IN PRTMP_ADAPTER adapter,
IN UCHAR if_index,
IN BOOLEAN is_ap,
IN UCHAR a4_type
)
{
BSS_STRUCT *mbss = NULL;
PA4_CONNECT_ENTRY a4_entry = NULL, pConnEntryTmp = NULL;
PDL_LIST a4_entry_list = NULL;
PMAC_TABLE_ENTRY entry = NULL;
BOOLEAN delete_inf = FALSE;
if (is_ap) {
if (if_index >= HW_BEACON_MAX_NUM)
return FALSE;
mbss = &adapter->ApCfg.MBSSID[if_index];
if (mbss->a4_init) {
a4_entry_list = &mbss->a4_entry_list;
DlListForEachSafe(a4_entry, pConnEntryTmp, a4_entry_list, A4_CONNECT_ENTRY, List) {
if (a4_entry) {
entry = &adapter->MacTab.Content[a4_entry->wcid];
a4_ap_peer_disable(adapter, entry, a4_type);
}
}
mbss->a4_init &= ~(1 << a4_type);
if (!mbss->a4_init) {
NdisFreeSpinLock(&mbss->a4_entry_lock);
RoutingTabDestory(adapter, if_index, ROUTING_ENTRY_A4);
delete_inf = TRUE;
}
}
}
#ifdef APCLI_SUPPORT
else {
PAPCLI_STRUCT apcli_entry;
if (if_index >= MAX_APCLI_NUM)
return FALSE;
apcli_entry = &adapter->ApCfg.ApCliTab[if_index];
if (apcli_entry->a4_init) {
apcli_entry->a4_init &= ~(1 << a4_type);
if (!apcli_entry->a4_init)
delete_inf = TRUE;
}
}
#else
else
return FALSE;
#endif
if (delete_inf) {
adapter->a4_interface_count--;
if (adapter->a4_interface_count == 0)
MtCmdSetA4Enable(adapter, HOST2CR4, FALSE);
}
MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_WARN, ("a4_interface_init a4_interface_count: %d\n",
adapter->a4_interface_count));
return TRUE;
}
INT a4_get_entry_count(
IN PRTMP_ADAPTER adapter,
IN UCHAR if_index
)
{
int count = 0;
BSS_STRUCT *mbss = NULL;
if (if_index >= HW_BEACON_MAX_NUM)
return 0;
mbss = &adapter->ApCfg.MBSSID[if_index];
if (!mbss->a4_init)
return 0;
count = DlListLen(&mbss->a4_entry_list);
return count;
}
BOOLEAN a4_lookup_entry_by_wcid(
IN PRTMP_ADAPTER adapter,
IN UCHAR if_index,
IN UCHAR wcid
)
{
BSS_STRUCT *mbss = NULL;
PDL_LIST a4_entry_list = NULL;
PA4_CONNECT_ENTRY a4_entry = NULL;
BOOLEAN found = FALSE;
if (a4_get_entry_count(adapter, if_index) == 0)
return FALSE;
mbss = &adapter->ApCfg.MBSSID[if_index];
a4_entry_list = &mbss->a4_entry_list;
DlListForEach(a4_entry, a4_entry_list, A4_CONNECT_ENTRY, List) {
if (a4_entry &&
a4_entry->valid &&
(a4_entry->wcid == wcid)) {
found = TRUE;
break;
}
}
return found;
}
BOOLEAN a4_lookup_entry_by_addr(
IN PRTMP_ADAPTER adapter,
IN UCHAR if_index,
IN PUCHAR mac_addr
)
{
BSS_STRUCT *mbss = NULL;
PDL_LIST a4_entry_list = NULL;
PA4_CONNECT_ENTRY a4_entry = NULL;
PMAC_TABLE_ENTRY entry = NULL;
BOOLEAN found = FALSE;
if ((a4_get_entry_count(adapter, if_index) == 0) ||
(mac_addr == NULL))
return FALSE;
mbss = &adapter->ApCfg.MBSSID[if_index];
a4_entry_list = &mbss->a4_entry_list;
DlListForEach(a4_entry, a4_entry_list, A4_CONNECT_ENTRY, List) {
if (a4_entry && a4_entry->valid && VALID_WCID(a4_entry->wcid)) {
entry = &adapter->MacTab.Content[a4_entry->wcid];
if (MAC_ADDR_EQUAL(mac_addr, entry->Addr)) {
found = TRUE;
break;
}
}
}
return found;
}
VOID a4_add_entry(
IN PRTMP_ADAPTER adapter,
IN UCHAR if_index,
IN UCHAR wcid
)
{
BSS_STRUCT *mbss = NULL;
PA4_CONNECT_ENTRY a4_entry = NULL;
if (a4_lookup_entry_by_wcid(adapter, if_index, wcid))
return;
mbss = &adapter->ApCfg.MBSSID[if_index];
os_alloc_mem(adapter, (UCHAR **)&a4_entry, sizeof(A4_CONNECT_ENTRY));
if (a4_entry) {
NdisZeroMemory(a4_entry, sizeof(A4_CONNECT_ENTRY));
a4_entry->valid = 1;
a4_entry->wcid = wcid;
RTMP_SEM_LOCK(&mbss->a4_entry_lock);
DlListAddTail(&mbss->a4_entry_list, &a4_entry->List);
RTMP_SEM_UNLOCK(&mbss->a4_entry_lock);
} else
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR,
("%s: Fail to alloc memory for pNewConnEntry\n", __func__));
}
VOID a4_delete_entry(
IN PRTMP_ADAPTER adapter,
IN UCHAR if_index,
IN UCHAR wcid
)
{
BSS_STRUCT *mbss = NULL;
PA4_CONNECT_ENTRY a4_entry = NULL;
PDL_LIST a4_entry_list = NULL;
if (a4_get_entry_count(adapter, if_index) == 0)
return;
mbss = &adapter->ApCfg.MBSSID[if_index];
a4_entry_list = &mbss->a4_entry_list;
RTMP_SEM_LOCK(&mbss->a4_entry_lock);
DlListForEach(a4_entry, a4_entry_list, A4_CONNECT_ENTRY, List) {
if (a4_entry &&
a4_entry->valid &&
(a4_entry->wcid == wcid)) {
DlListDel(&a4_entry->List);
os_free_mem(a4_entry);
break;
}
}
RTMP_SEM_UNLOCK(&mbss->a4_entry_lock);
}
VOID a4_proxy_delete(
IN PRTMP_ADAPTER adapter,
IN UCHAR if_index,
IN PUCHAR mac_addr
)
{
if (a4_get_entry_count(adapter, if_index) == 0)
return;
RoutingTabSetOneFree(adapter, if_index, mac_addr, ROUTING_ENTRY_A4);
}
BOOLEAN a4_get_dst_ip(void *pkt, unsigned char *ip)
{
UCHAR *pSrcBuf;
UINT16 TypeLen;
UINT32 type_len_idx = 12;
UCHAR *ip_header = NULL;
pSrcBuf = pkt;
TypeLen = (pSrcBuf[type_len_idx] << 8) | pSrcBuf[type_len_idx + 1];
while (TypeLen == ETH_TYPE_VLAN) {
type_len_idx += 2;
TypeLen = (pSrcBuf[type_len_idx] << 8) | pSrcBuf[type_len_idx + 1];
}
if (TypeLen == ETH_TYPE_IPv4) {
ip_header = &pSrcBuf[type_len_idx + 2];
NdisCopyMemory(ip, ip_header + 16, 4);
return TRUE;
}
return FALSE;
}
BOOLEAN a4_proxy_lookup(
IN PRTMP_ADAPTER adapter,
IN UCHAR if_index,
IN PUCHAR mac_addr,
IN BOOLEAN update_alive_time,
IN BOOLEAN is_rx,
OUT UCHAR *wcid
)
{
*wcid = 0;
if (a4_get_entry_count(adapter, if_index) == 0) {
return FALSE;
}
if (RoutingTabLookup(adapter, if_index, mac_addr, update_alive_time, wcid) != NULL)
return TRUE;
else {
return FALSE;
}
}
VOID a4_proxy_update(
IN PRTMP_ADAPTER adapter,
IN UCHAR if_index,
IN UCHAR wcid,
IN PUCHAR mac_addr,
IN UINT32 ip /* ARP Sender IP*/
)
{
UCHAR proxy_wcid = 0;
BOOLEAN found = FALSE;
PROUTING_ENTRY routing_entry = NULL;
if (a4_get_entry_count(adapter, if_index) == 0)
return;
if (!VALID_WCID(wcid) || !mac_addr)
return;
routing_entry = RoutingTabLookup(adapter, if_index, mac_addr, TRUE, &proxy_wcid);
found = (routing_entry != NULL) ? TRUE : FALSE;
if (found) {
if (ROUTING_ENTRY_TEST_FLAG(routing_entry, ROUTING_ENTRY_A4)) {
/* Mean the target change to other ProxyAP */
if (proxy_wcid != wcid) {
RoutingTabSetOneFree(adapter, if_index, mac_addr, ROUTING_ENTRY_A4);
routing_entry = NULL;
found = FALSE;
}
} else {
/* Assign A4 falg to this one if found. */
SET_ROUTING_ENTRY(routing_entry, ROUTING_ENTRY_A4);
}
}
if (!found) {
/* Allocate a new one if not found. */
routing_entry = RoutingTabGetFree(adapter, if_index);
if (routing_entry) {
SET_ROUTING_ENTRY(routing_entry, ROUTING_ENTRY_A4);
RoutingEntrySet(adapter, if_index, wcid, mac_addr, routing_entry);
}
}
if (routing_entry != NULL && (ip != 0)) /* ARP Sender IP Update*/
RoutingTabARPLookupUpdate(adapter, if_index, routing_entry, ip);
}
VOID a4_proxy_maintain(
IN PRTMP_ADAPTER adapter,
IN UCHAR if_index
)
{
if (a4_get_entry_count(adapter, if_index) == 0)
return;
RoutingTabMaintain(adapter, if_index);
}
INT a4_hard_transmit(
IN PRTMP_ADAPTER adapter,
IN struct wifi_dev *wdev,
IN PNDIS_PACKET pkt
)
{
UINT pkt_len;
INT ret = NDIS_STATUS_SUCCESS;
UCHAR wcid = RESERVED_WCID;
struct wifi_dev_ops *ops = wdev->wdev_ops;
/* Precautionary measure */
if (RTMP_GET_PACKET_WCID(pkt) == 0) {
MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_WARN, ("invalid wcid=0 in a4_hard_transmit\n"));
RELEASE_NDIS_PACKET(adapter, pkt, NDIS_STATUS_FAILURE);
return ret;
}
if (IS_ASIC_CAP(adapter, fASIC_CAP_MCU_OFFLOAD))
ret = ops->fp_send_data_pkt(adapter, wdev, pkt);
else {
wcid = RTMP_GET_PACKET_WCID(pkt);
pkt_len = GET_OS_PKT_LEN(pkt);
if ((pkt_len <= 14)
|| (!RTMPCheckEtherType(adapter, pkt, &adapter->MacTab.tr_entry[wcid], wdev))) {
MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_WARN, ("Pkt Len/Ethernet Check Fail\n"));
RELEASE_NDIS_PACKET(adapter, pkt, NDIS_STATUS_FAILURE);
return ret;
}
ret = ops->send_data_pkt(adapter, wdev, pkt);
}
return ret;
}
PNDIS_PACKET a4_clone_packet(
IN PRTMP_ADAPTER adapter,
IN PNET_DEV if_dev,
IN PNDIS_PACKET pkt
)
{
struct sk_buff *skb = NULL;
PNDIS_PACKET pkt_clone = NULL;
skb = skb_copy(RTPKT_TO_OSPKT(pkt), GFP_ATOMIC);
if (skb) {
skb->dev = if_dev;
pkt_clone = OSPKT_TO_RTPKT(skb);
}
return pkt_clone;
}
void a4_send_clone_pkt(
IN PRTMP_ADAPTER adapter,
IN UCHAR if_index,
IN PNDIS_PACKET pkt,
IN PUCHAR exclude_mac_addr
)
{
struct wifi_dev *wdev = NULL;
PNDIS_PACKET pkt_clone = NULL;
PDL_LIST a4_entry_list = NULL;
PA4_CONNECT_ENTRY a4_entry = NULL;
PROUTING_ENTRY routing_entry = NULL;
PMAC_TABLE_ENTRY entry = NULL;
BOOLEAN found = FALSE;
UCHAR wcid = 0;
struct wifi_dev *ap_wdev = NULL;
if (!pkt)
return;
if ((a4_get_entry_count(adapter, if_index) > 0)) {
ap_wdev = &adapter->ApCfg.MBSSID[if_index].wdev;
#if (defined(IGMP_SNOOP_SUPPORT) && defined(IGMP_TX_QUERY_HOLD))
if (ap_wdev->IgmpSnoopEnable) { /* If snooping enabled*/
UCHAR *pDestAddr = NULL;
pDestAddr = GET_OS_PKT_DATAPTR(pPacket);
if (IS_MULTICAST_MAC_ADDR(pDestAddr)) {
PUCHAR pData = pDestAddr + 12;
UINT16 protoType = OS_NTOHS(*((UINT16 *)(pData)));
/* Check whether membership query sent by some other device.*/
/* If detected, set internal query Hold duration to avoid flooding in network*/
if (protoType == ETH_P_IP) {
if (isIGMPquery(adapter, pDestAddr, pData)) {
adapter->ApCfg.MBSSID[if_index].IgmpQueryHoldTick = QUERY_HOLD_PERIOD;
}
} else if (protoType == ETH_P_IPV6) {
if (isMLDquery(adapter, pDestAddr, pData)) {
adapter->ApCfg.MBSSID[if_index].MldQueryHoldTick = QUERY_HOLD_PERIOD;
}
}
}
}
#endif
if (exclude_mac_addr) {
routing_entry = RoutingTabLookup(adapter, if_index, exclude_mac_addr, FALSE, &wcid);
if (routing_entry && ROUTING_ENTRY_TEST_FLAG(routing_entry, ROUTING_ENTRY_A4))
found = TRUE;
else
found = FALSE;
}
a4_entry_list = &adapter->ApCfg.MBSSID[if_index].a4_entry_list;
DlListForEach(a4_entry, a4_entry_list, A4_CONNECT_ENTRY, List) {
if (a4_entry && a4_entry->valid && VALID_WCID(a4_entry->wcid)) {
if (found && (wcid == a4_entry->wcid))
continue;
entry = &adapter->MacTab.Content[a4_entry->wcid];
wdev = entry->wdev;
pkt_clone = a4_clone_packet(adapter, wdev->if_dev, pkt);
if (pkt_clone == NULL) {
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR,
("%s: Fail to alloc memory for pPacketClone\n", __func__));
return;
}
RTMP_SET_PACKET_WCID(pkt_clone, entry->wcid);
RTMP_SET_PACKET_WDEV(pkt_clone, wdev->wdev_idx);
RTMP_SET_PACKET_MOREDATA(pkt_clone, FALSE);
/*RTMP_SET_PACKET_QUEIDX(pPacketClone, QID_AC_BE);*/
a4_hard_transmit(adapter, wdev, pkt_clone);
}
}
}
}
BOOLEAN a4_ap_peer_enable(
IN PRTMP_ADAPTER adapter,
IN PMAC_TABLE_ENTRY entry,
IN UCHAR type
)
{
BSS_STRUCT *mbss = NULL;
UCHAR if_index;
CMD_WTBL_HDR_TRANS_T wtbl_hdr_trans;
if (!entry || !IS_ENTRY_CLIENT(entry))
return FALSE;
if_index = entry->func_tb_idx;
if (if_index >= HW_BEACON_MAX_NUM)
return FALSE;
mbss = &adapter->ApCfg.MBSSID[if_index];
#ifdef WSC_AP_SUPPORT
if (mbss &&
(mbss->WscControl.WscConfMode != WSC_DISABLE) &&
(mbss->WscControl.bWscTrigger == TRUE))
return FALSE;
#endif /* WSC_AP_SUPPORT */
if (IS_ENTRY_A4(entry) == FALSE) {
/* To check and remove entry which is created from another side. */
a4_proxy_delete(adapter, if_index, entry->Addr);
os_zero_mem(&wtbl_hdr_trans, sizeof(CMD_WTBL_HDR_TRANS_T));
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_WARN,
("Enabled A4 for entry:%02x-%02x-%02x-%02x-%02x-%02x\n",
PRINT_MAC(entry->Addr)));
wtbl_hdr_trans.u2Tag = WTBL_HDR_TRANS;
wtbl_hdr_trans.u2Length = sizeof(CMD_WTBL_HDR_TRANS_T);
wtbl_hdr_trans.ucTd = 1;
wtbl_hdr_trans.ucFd = 1;
wtbl_hdr_trans.ucDisRhtr = 0;
if (NDIS_STATUS_SUCCESS != CmdExtWtblUpdate(adapter,
entry->wcid,
SET_WTBL,
&wtbl_hdr_trans,
sizeof(CMD_WTBL_HDR_TRANS_T)))
return FALSE;
a4_add_entry(adapter, if_index, entry->wcid);
}
if (type > GET_ENTRY_A4(entry)) {
SET_ENTRY_A4(entry, type);
MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("SET_A4_ENTRY type:%d OK!\n", type));
}
return TRUE;
}
BOOLEAN a4_ap_peer_disable(
IN PRTMP_ADAPTER adapter,
IN PMAC_TABLE_ENTRY entry,
IN UCHAR type
)
{
UCHAR if_index;
if (!entry || !IS_ENTRY_CLIENT(entry))
return FALSE;
if_index = entry->func_tb_idx;
if (if_index >= HW_BEACON_MAX_NUM)
return FALSE;
if (type == GET_ENTRY_A4(entry)) {
SET_ENTRY_A4(entry, A4_TYPE_NONE);
a4_delete_entry(adapter, if_index, entry->wcid);
RoutingTabSetAllFree(adapter, if_index, entry->wcid, ROUTING_ENTRY_A4);
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_WARN,
("a4_ap_peer_disable: Disable A4 for entry : %02x-%02x-%02x-%02x-%02x-%02x\n",
PRINT_MAC(entry->Addr)));
}
return TRUE;
}
#ifdef APCLI_SUPPORT
BOOLEAN a4_apcli_peer_enable(
IN PRTMP_ADAPTER adapter,
IN PAPCLI_STRUCT apcli_entry,
IN PMAC_TABLE_ENTRY entry,
IN UCHAR type
)
{
CMD_WTBL_HDR_TRANS_T wtbl_hdr_trans;
if (!apcli_entry || !entry || !IS_ENTRY_APCLI(entry))
return FALSE;
#ifdef WSC_AP_SUPPORT
if (((apcli_entry->WscControl.WscConfMode != WSC_DISABLE) &&
(apcli_entry->WscControl.bWscTrigger == TRUE)))
return FALSE;
#endif /* WSC_AP_SUPPORT */
if (IS_ENTRY_A4(entry) == FALSE) {
os_zero_mem(&wtbl_hdr_trans, sizeof(CMD_WTBL_HDR_TRANS_T));
MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_WARN,
("a4_apcli_peer_enable enabled A4 for entry : %02x-%02x-%02x-%02x-%02x-%02x\n",
PRINT_MAC(entry->Addr)));
wtbl_hdr_trans.u2Tag = WTBL_HDR_TRANS;
wtbl_hdr_trans.u2Length = sizeof(CMD_WTBL_HDR_TRANS_T);
wtbl_hdr_trans.ucTd = 1;
wtbl_hdr_trans.ucFd = 1;
wtbl_hdr_trans.ucDisRhtr = 0;
if (CmdExtWtblUpdate(adapter,
entry->wcid,
SET_WTBL,
&wtbl_hdr_trans,
sizeof(CMD_WTBL_HDR_TRANS_T)) == NDIS_STATUS_SUCCESS)
MTWF_LOG(DBG_CAT_CLIENT, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("SET_A4_ENTRY OK!\n"));
else
return FALSE;
}
if (type > GET_ENTRY_A4(entry)) {
SET_APCLI_A4(apcli_entry, type);
SET_ENTRY_A4(entry, type);
}
return TRUE;
}
BOOLEAN a4_apcli_peer_disable(
IN PRTMP_ADAPTER adapter,
IN PAPCLI_STRUCT apcli_entry,
IN PMAC_TABLE_ENTRY entry,
IN UCHAR type
)
{
if (!apcli_entry || !entry)
return FALSE;
if (type == GET_ENTRY_A4(entry)) {
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_WARN,
("a4_apcli_peer_disable, Disable A4 for entry:%02x-%02x-%02x-%02x-%02x-%02x\n",
PRINT_MAC(entry->Addr)));
SET_APCLI_A4(apcli_entry, A4_TYPE_NONE);
SET_ENTRY_A4(entry, A4_TYPE_NONE);
}
return TRUE;
}
#endif /* APCLI_SUPPORT */
INT Set_APProxy_Status_Show_Proc(
IN PRTMP_ADAPTER adapter,
IN RTMP_STRING * arg)
{
POS_COOKIE obj;
UCHAR if_index;
INT32 i, count = 0;
UINT32 ip_addr = 0;
ULONG now = 0, AliveTime = 0;
PDL_LIST a4_entry_list = NULL;
PA4_CONNECT_ENTRY a4_entry = NULL;
PROUTING_ENTRY routing_entry = NULL, *routing_entry_list[ROUTING_POOL_SIZE];
UCHAR *proxy_mac_addr = NULL, proxy_ip[64];
obj = (POS_COOKIE) adapter->OS_Cookie;
if_index = obj->ioctl_if;
if ((obj->ioctl_if_type != INT_MBSSID) && (obj->ioctl_if_type != INT_MAIN))
return FALSE;
if (a4_get_entry_count(adapter, if_index) == 0)
return TRUE;
a4_entry_list = &adapter->ApCfg.MBSSID[if_index].a4_entry_list;
NdisGetSystemUpTime(&now);
DlListForEach(a4_entry, a4_entry_list, A4_CONNECT_ENTRY, List) {
if (a4_entry && a4_entry->valid && VALID_WCID(a4_entry->wcid)) {
count = 0;
proxy_mac_addr = adapter->MacTab.Content[a4_entry->wcid].Addr;
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF,
("Proxy Mac: %02X:%02X:%02X:%02X:%02X:%02X\n",
PRINT_MAC(proxy_mac_addr)));
if (GetRoutingEntryAll(adapter, if_index, a4_entry->wcid, ROUTING_ENTRY_A4,
ROUTING_POOL_SIZE, (ROUTING_ENTRY **)&routing_entry_list, &count)) {
for (i = 0; i < count; i++) {
routing_entry = (PROUTING_ENTRY)routing_entry_list[i];
if (!routing_entry)
continue;
if (routing_entry->KeepAliveTime >= now)
AliveTime = ((routing_entry->KeepAliveTime - now) / OS_HZ);
else
AliveTime = 0;
if (routing_entry->IPAddr != 0) {
ip_addr = routing_entry->IPAddr;
sprintf(proxy_ip, "%d.%d.%d.%d",
(ip_addr & 0xff),
((ip_addr & (0xff << 8)) >> 8),
((ip_addr & (0xff << 16)) >> 16),
((ip_addr & (0xff << 24)) >> 24));
} else
strcpy(proxy_ip, "0.0.0.0");
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF,
("MAC:%02X:%02X:%02X:%02X:%02X:%02X, IP:%s, AgeOut:%lus, Retry:(%d,%d)\n",
PRINT_MAC(routing_entry->Mac), proxy_ip, AliveTime,
routing_entry->Retry, ROUTING_ENTRY_MAX_RETRY));
}
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("Total Count = %d\n\n", count));
}
}
}
return TRUE;
}
INT Set_APProxy_Refresh_Proc(
IN PRTMP_ADAPTER adapter,
IN RTMP_STRING * arg)
{
adapter->a4_need_refresh = TRUE;
return TRUE;
}
#endif /* A4_CONN */

View File

@ -76,7 +76,9 @@ VOID ActionStateMachineInit(
StateMachineSetAction(S, ACT_IDLE, MT2_MLME_REC_DELBA_CATE, (STATE_MACHINE_FUNC)MlmeDELBAAction);
#endif /* DOT11_N_SUPPORT */
StateMachineSetAction(S, ACT_IDLE, MT2_PEER_PUBLIC_CATE, (STATE_MACHINE_FUNC)PeerPublicAction);
#ifndef HOSTAPD_11K_SUPPORT
StateMachineSetAction(S, ACT_IDLE, MT2_PEER_RM_CATE, (STATE_MACHINE_FUNC)PeerRMAction);
#endif
StateMachineSetAction(S, ACT_IDLE, MT2_MLME_QOS_CATE, (STATE_MACHINE_FUNC)MlmeQOSAction);
StateMachineSetAction(S, ACT_IDLE, MT2_MLME_DLS_CATE, (STATE_MACHINE_FUNC)MlmeDLSAction);
StateMachineSetAction(S, ACT_IDLE, MT2_ACT_INVALID, (STATE_MACHINE_FUNC)MlmeInvalidAction);
@ -676,7 +678,7 @@ struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl);
#endif /* RACTRL_FW_OFFLOAD_SUPPORT */
#endif /* CONFIG_AP_SUPPORT */
#if defined(CONFIG_HOTSPOT) && defined(CONFIG_AP_SUPPORT)
#if defined(WAPP_SUPPORT) && defined(CONFIG_AP_SUPPORT)
if (!GasEnable(pAd, Elem))
#endif
@ -729,7 +731,13 @@ struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl);
/*hex_dump("IntolerantReport ", (PUCHAR)pIntolerantReport, sizeof(BSS_2040_INTOLERANT_CH_REPORT));*/
if (pAd->CommonCfg.bBssCoexEnable == FALSE || (pAd->CommonCfg.bForty_Mhz_Intolerant == TRUE)) {
/* Soft AP to follow BW of Root AP */
if (
#ifdef BW_VENDOR10_CUSTOM_FEATURE
IS_APCLI_BW_SYNC_FEATURE_ENBL(pAd) ||
#endif
pAd->CommonCfg.bBssCoexEnable == FALSE || (pAd->CommonCfg.bForty_Mhz_Intolerant == TRUE)) {
MTWF_LOG(DBG_CAT_PROTO, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("20/40 BSS CoexMgmt=%d, bForty_Mhz_Intolerant=%d, ignore this action!!\n",
pAd->CommonCfg.bBssCoexEnable,
pAd->CommonCfg.bForty_Mhz_Intolerant));
@ -888,7 +896,7 @@ struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl);
#endif /* DOT11N_DRAFT3 */
#endif /* DOT11_N_SUPPORT */
#ifdef CONFIG_AP_SUPPORT
#if defined(CONFIG_HOTSPOT) || defined(FTM_SUPPORT)
#if defined(WAPP_SUPPORT) || defined(FTM_SUPPORT)
case ACTION_GAS_INIT_REQ:
if (GasEnable(pAd, Elem))
@ -1206,7 +1214,7 @@ VOID SendRefreshBAR(RTMP_ADAPTER *pAd, MAC_TABLE_ENTRY *pEntry)
return;
}
Sequence = pAd->MacTab.tr_entry[pEntry->wcid].TxSeq[TID];
Sequence = AsicGetTidSn(pAd, pEntry->wcid, TID);
#ifdef APCLI_SUPPORT
#ifdef MAC_REPEATER_SUPPORT

View File

@ -1738,13 +1738,15 @@ VOID ba_reorder(RTMP_ADAPTER *pAd, RX_BLK *pRxBlk, UCHAR wdev_idx)
ba_refresh_reordering_mpdus(pAd, pBAEntry);
ASSERT((pBAEntry->list.qlen == 0) && (pBAEntry->list.next == NULL));
MTWF_LOG(DBG_CAT_PROTO, CATPROTO_BA, DBG_LVL_INFO, ("%s:Reset Last Indicate Sequence(%d): amsdu state = %d\n", __func__, pRxBlk->SN, pRxBlk->AmsduState));
indicate_rx_pkt(pAd, pRxBlk, wdev_idx);
pBAEntry->LastIndSeq = Sequence;
/*
* For the first reordering pkt in the BA session, initialize LastIndSeq to (Sequence - 1)
* so that the ba_reorder_check will fall in the in-order SEQ_STEPONE case.
*/
pBAEntry->LastIndSeq = (Sequence - 1) & MAXSEQ;
pBAEntry->LastIndSeqAtTimer = Now32;
pBAEntry->PreviousAmsduState = pRxBlk->AmsduState;
pBAEntry->PreviousSN = Sequence;
pBAEntry->REC_BA_Status = Recipient_Established;
return;
case Recipient_Established:
break;

View File

@ -61,9 +61,20 @@ VOID write_tmac_info_beacon(
)
{
#ifdef MT_MAC
HTTRANSMIT_SETTING *BcnTransmit = NULL;
#ifdef MIN_PHY_RATE_SUPPORT
if (wdev->rate.MinPhyBeaconRate != 0) {
BcnTransmit = &(wdev->rate.MinPhyBeaconRateTransmit);
} else {
BcnTransmit = BeaconTransmit;
}
#else
BcnTransmit = BeaconTransmit;
#endif /* MIN_PHY_RATE_SUPPORT */
if (IS_HIF_TYPE(pAd, HIF_MT))
mt_write_tmac_info_beacon(pAd, wdev, tmac_buf, BeaconTransmit, frmLen);
mt_write_tmac_info_beacon(pAd, wdev, tmac_buf, BcnTransmit, frmLen);
#endif /* MT_MAC */
}
@ -84,6 +95,10 @@ BOOLEAN BeaconTransmitRequired(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, BOOLEAN
BCN_BUF_STRUC *bcn_info = &wdev->bcn_buf;
struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl);
#ifdef CONFIG_INIT_RADIO_ONOFF
if (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_SYSEM_READY))
return FALSE;
#endif
if (!WDEV_WITH_BCN_ABILITY(wdev) || ATE_ON(pAd)) {
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF,
@ -276,6 +291,12 @@ UINT16 MakeBeacon(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, BOOLEAN UpdateRoutin
#endif
BCN_BUF_STRUC *pbcn_buf = &wdev->bcn_buf;
#ifdef RT_CFG80211_SUPPORT
if (pAd->cfg80211_ctrl.beaconIsSetFromHostapd == TRUE)
return -1;
#endif
RTMP_SEM_LOCK(&pbcn_buf->BcnContentLock);
tmac_info = (UCHAR *)GET_OS_PKT_DATAPTR(pbcn_buf->BeaconPkt);
@ -326,6 +347,12 @@ UINT16 MakeBeacon(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, BOOLEAN UpdateRoutin
#endif /* CONFIG_AP_SUPPORT */
ComposeBcnPktTail(pAd, wdev, &UpdatePos, pBeaconFrame);
FrameLen = UpdatePos;/* update newest FrameLen. */
#ifdef IGMP_TVM_SUPPORT
/* ADD TV IE to this packet */
MakeTVMIE(pAd, wdev, pBeaconFrame, &FrameLen);
#endif /* IGMP_TVM_SUPPORT */
/* step 6. Since FrameLen may change, update TXWI. */
#ifdef A_BAND_SUPPORT
@ -340,6 +367,11 @@ UINT16 MakeBeacon(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, BOOLEAN UpdateRoutin
RTMPFrameEndianChange(pAd, pBeaconFrame, DIR_WRITE, FALSE);
#endif
RTMP_SEM_UNLOCK(&pbcn_buf->BcnContentLock);
#ifdef WIFI_DIAG
DiagBcnTx(pAd, pMbss, pBeaconFrame, FrameLen);
#endif
return FrameLen;
}
@ -349,6 +381,22 @@ VOID ComposeRSNIE(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, ULONG *pFrameLen, UC
ULONG FrameLen = *pFrameLen;
ULONG TempLen = 0;
CHAR rsne_idx = 0;
#ifdef DISABLE_HOSTAPD_BEACON
BSS_STRUCT *pMbss = &pAd->ApCfg.MBSSID[wdev->func_idx];
for (rsne_idx = 0; rsne_idx < 2; rsne_idx++) {
if (pMbss->RSNIE_Len[rsne_idx] != 0) {
MakeOutgoingFrame(pBeaconFrame+FrameLen,
&TempLen, 1,
&pMbss->RSNIE_ID[rsne_idx], 1,
&pMbss->RSNIE_Len[rsne_idx],
pMbss->RSNIE_Len[rsne_idx], &pMbss->RSN_IE[rsne_idx][0],
END_OF_ARGS);
FrameLen += TempLen;
}
}
#else
struct _SECURITY_CONFIG *pSecConfig = &wdev->SecConfig;
#ifdef CONFIG_HOTSPOT_R2
extern UCHAR OSEN_IE[];
@ -380,8 +428,8 @@ VOID ComposeRSNIE(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, ULONG *pFrameLen, UC
FrameLen += TempLen;
}
}
*pFrameLen = FrameLen;
#endif /*DISABLE_HOSTAPD_BEACON */
*pFrameLen = FrameLen;
}
VOID ComposeWPSIE(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, ULONG *pFrameLen, UCHAR *pBeaconFrame)
@ -411,15 +459,24 @@ VOID ComposeWPSIE(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, ULONG *pFrameLen, UC
#ifdef WSC_AP_SUPPORT
/* add Simple Config Information Element */
if (((wdev->WscControl.WscConfMode >= 1) && (wdev->WscIEBeacon.ValueLen)))
#ifdef DISABLE_HOSTAPD_BEACON
if (pMbss->WscIEBeacon.ValueLen)
#else
if (((wdev->WscControl.WscConfMode >= 1) && (wdev->WscIEBeacon.ValueLen)))
#endif
bHasWpsIE = TRUE;
if (bHasWpsIE) {
ULONG WscTmpLen = 0;
MakeOutgoingFrame(pBeaconFrame + FrameLen, &WscTmpLen,
#ifdef RT_CFG80211_SUPPORT
MakeOutgoingFrame(pBeaconFrame + FrameLen, &WscTmpLen,
pMbss->WscIEBeacon.ValueLen, pMbss->WscIEBeacon.Value,
END_OF_ARGS);
#else
MakeOutgoingFrame(pBeaconFrame + FrameLen, &WscTmpLen,
wdev->WscIEBeacon.ValueLen, wdev->WscIEBeacon.Value,
END_OF_ARGS);
#endif
FrameLen += WscTmpLen;
}
@ -745,6 +802,10 @@ VOID MakeExtCapIE(RTMP_ADAPTER *pAd, BSS_STRUCT *pMbss, ULONG *pFrameLen, UCHAR
extCapInfo.qosmap = 1;
#endif /* CONFIG_HOTSPOT_R2 */
#endif /* CONFIG_DOT11V_WNM */
#if defined(DOT11U_INTERWORKING_IE_SUPPORT) && !defined(CONFIG_HOTSPOT)
if (pMbss->bEnableInterworkingIe == TRUE)
extCapInfo.interworking = 1;
#endif
#ifdef CONFIG_DOT11U_INTERWORKING
if (pMbss->GASCtrl.b11U_enable)
extCapInfo.interworking = 1;
@ -1128,6 +1189,11 @@ VOID ComposeBcnPktTail(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, ULONG *pFrameLe
MakeChSwitchAnnounceIEandExtend(pAd, wdev, &FrameLen, pBeaconFrame);
#endif /* A_BAND_SUPPORT */
#ifdef CUSTOMER_DCC_FEATURE
else if (pComCfg->channelSwitch.CHSWMode == CHANNEL_SWITCHING_MODE)
MakeChSwitchAnnounceIEandExtend(pAd, wdev, &FrameLen, pBeaconFrame);
#endif
#endif /* CONFIG_AP_SUPPORT */
#ifdef CONFIG_AP_SUPPORT
#ifdef DOT11K_RRM_SUPPORT
@ -1164,6 +1230,18 @@ VOID ComposeBcnPktTail(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, ULONG *pFrameLe
MakeExtSuppRateIe(pAd, wdev, &FrameLen, pBeaconFrame);
ComposeRSNIE(pAd, wdev, &FrameLen, pBeaconFrame);
ComposeWPSIE(pAd, wdev, &FrameLen, pBeaconFrame);
#ifdef HOSTAPD_OWE_SUPPORT
if (pMbss->TRANSIE_Len) {
ULONG TmpLen;
MakeOutgoingFrame(pBeaconFrame+FrameLen, &TmpLen,
pMbss->TRANSIE_Len, pMbss->TRANS_IE,
END_OF_ARGS);
FrameLen += TmpLen;
}
#endif
#ifdef AP_QLOAD_SUPPORT
if (pAd->CommonCfg.dbdc_mode == 0)
pQloadCtrl = HcGetQloadCtrl(pAd);
@ -1180,6 +1258,26 @@ VOID ComposeBcnPktTail(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, ULONG *pFrameLe
FrameLen += QBSS_LoadElementAppend(pAd, pBeaconFrame+FrameLen, pQloadCtrl);
}
#endif /* AP_QLOAD_SUPPORT */
#if defined(DOT11U_INTERWORKING_IE_SUPPORT) && !defined(CONFIG_HOTSPOT)
if (pMbss->bEnableInterworkingIe == TRUE) {
ULONG TmpLen;
UCHAR InterworkIeLen, InterWorkIe;
PINTERWORKING_IE pInterWorkInfo;
InterWorkIe = IE_INTERWORKING;
InterworkIeLen = sizeof(*pInterWorkInfo);
pInterWorkInfo = &pMbss->InterWorkingIe;
MakeOutgoingFrame(pBeaconFrame+FrameLen, &TmpLen,
1, &InterWorkIe,
1, &InterworkIeLen,
InterworkIeLen, pInterWorkInfo,
END_OF_ARGS);
FrameLen += TmpLen;
}
#endif /* DOT11U_INTERWORKING_IE_SUPPORT */
#if defined(CONFIG_HOTSPOT) || defined(FTM_SUPPORT)
if (pMbss->GASCtrl.b11U_enable)
@ -1284,6 +1382,52 @@ VOID ComposeBcnPktTail(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, ULONG *pFrameLe
#endif /* MBO_SUPPORT */
#endif /*CONFIG_AP_SUPPORT*/
#if defined(WAPP_SUPPORT) && defined(CONFIG_MAP_SUPPORT)
if (IS_MAP_ENABLE(pAd) && wdev->MAPCfg.vendor_ie_len) {
ULONG MAPIeTmpLen = 0;
MakeOutgoingFrame(pBeaconFrame + FrameLen, &MAPIeTmpLen,
wdev->MAPCfg.vendor_ie_len, wdev->MAPCfg.vendor_ie_buf,
END_OF_ARGS);
FrameLen += MAPIeTmpLen;
}
#endif
/*Vendor IE should be final IE to be added, so we can determine the maximum length of Beacon*/
#ifdef CUSTOMER_VENDOR_IE_SUPPORT
RTMP_SPIN_LOCK(&pAd->ApCfg.MBSSID[apidx].ap_vendor_ie.vendor_ie_lock);
if (pAd->ApCfg.MBSSID[apidx].ap_vendor_ie.pointer != NULL) {
struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl);
ULONG TmpMaxBeaconLen;
#ifdef BCN_V2_SUPPORT
if (apidx < cap->max_v2_bcn_num)
TmpMaxBeaconLen = 1520 - cap->tx_hw_hdr_len;/*FW limitation*/
else
TmpMaxBeaconLen = 512 - cap->tx_hw_hdr_len;
#else
TmpMaxBeaconLen = 512 - cap->tx_hw_hdr_len;
#endif
if (FrameLen + pAd->ApCfg.MBSSID[apidx].ap_vendor_ie.length > TmpMaxBeaconLen)
MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR,
("%s : BCN is too long, can't add vendor ie!\n", __func__));
else {
ULONG TmpLen;
MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_INFO,
("BCN add vendor ie\n"));
MakeOutgoingFrame(pBeaconFrame + FrameLen,
&TmpLen,
pAd->ApCfg.MBSSID[apidx].ap_vendor_ie.length,
pAd->ApCfg.MBSSID[apidx].ap_vendor_ie.pointer,
END_OF_ARGS);
FrameLen += TmpLen;
}
}
RTMP_SPIN_UNLOCK(&pAd->ApCfg.MBSSID[apidx].ap_vendor_ie.vendor_ie_lock);
#endif /* CUSTOMER_VENDOR_IE_SUPPORT */
*pFrameLen = FrameLen;
}
VOID updateBeaconRoutineCase(RTMP_ADAPTER *pAd, BOOLEAN UpdateAfterTim)
@ -1296,6 +1440,10 @@ VOID updateBeaconRoutineCase(RTMP_ADAPTER *pAd, BOOLEAN UpdateAfterTim)
UCHAR cfg_ext_cha;
UCHAR op_ht_bw;
UCHAR op_ext_cha;
#ifdef MBSS_DTIM_SUPPORT
UINT bssidx;
UCHAR minDtimCount = pAd->ApCfg.MBSSID[0].DtimCount;
#endif
wdev = get_default_wdev(pAd);
cfg_ht_bw = wlan_config_get_ht_bw(wdev);
@ -1303,19 +1451,39 @@ VOID updateBeaconRoutineCase(RTMP_ADAPTER *pAd, BOOLEAN UpdateAfterTim)
op_ht_bw = wlan_operate_get_ht_bw(wdev);
op_ext_cha = wlan_operate_get_ext_cha(wdev);
#ifdef MBSS_DTIM_SUPPORT
for (bssidx = 0; bssidx < pAd->ApCfg.BssidNum; bssidx++) {
if (pAd->ApCfg.MBSSID[bssidx].DtimCount == 0)
pAd->ApCfg.MBSSID[bssidx].DtimCount = pAd->ApCfg.MBSSID[bssidx].DtimPeriod - 1;
else
pAd->ApCfg.MBSSID[bssidx].DtimCount -= 1;
if (pAd->ApCfg.MBSSID[bssidx].DtimCount < minDtimCount)
minDtimCount = pAd->ApCfg.MBSSID[bssidx].DtimCount;
}
#else
if (pAd->ApCfg.DtimCount == 0)
pAd->ApCfg.DtimCount = pAd->ApCfg.DtimPeriod - 1;
else
pAd->ApCfg.DtimCount -= 1;
#endif
#ifdef AP_QLOAD_SUPPORT
FlgQloadIsAlarmIssued = QBSS_LoadIsAlarmIssued(pAd);
#endif /* AP_QLOAD_SUPPORT */
if ((pAd->ApCfg.DtimCount == 0) &&
(((pAd->CommonCfg.Bss2040CoexistFlag & BSS_2040_COEXIST_INFO_SYNC) &&
if (
#ifdef MBSS_DTIM_SUPPORT
(minDtimCount == 0)
#else
(pAd->ApCfg.DtimCount == 0)
#endif
&& (((pAd->CommonCfg.Bss2040CoexistFlag & BSS_2040_COEXIST_INFO_SYNC) &&
(pAd->CommonCfg.bForty_Mhz_Intolerant == FALSE)) ||
(FlgQloadIsAlarmIssued == TRUE))) {
(FlgQloadIsAlarmIssued == TRUE))) {
UCHAR prevBW, prevExtChOffset;
MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE,
@ -1381,6 +1549,24 @@ VOID UpdateBeaconHandler(
pAd->Mlme.PeriodicRound = 0;
}
#ifdef CONVERTER_MODE_SWITCH_SUPPORT
{
BSS_STRUCT *pMbss = &pAd->ApCfg.MBSSID[wdev->func_idx];
if (pMbss->APStartPseduState != AP_STATE_ALWAYS_START_AP_DEFAULT) {
MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("%s: StopBeaconing: pAd Idx = %u\n",
__func__,
#ifdef MULTI_INF_SUPPORT
multi_inf_get_idx(pAd)
#else
0
#endif /* MULTI_INF_SUPPORT */
));
return;
}
}
#endif /* CONVERTER_MODE_SWITCH_SUPPORT */
HW_BEACON_UPDATE(pAd, wdev, BCN_UPDATE_REASON);
end:
@ -1446,8 +1632,16 @@ INT BcnTimUpdate(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, UCHAR *ptr)
/* BSS_STRUCT *pMbss = wdev->func_dev; */
BCN_BUF_STRUC *bcn_buf = &wdev->bcn_buf;
*ptr = IE_TIM;
#ifdef MBSS_DTIM_SUPPORT
*(ptr + 2) = pAd->ApCfg.MBSSID[wdev->func_idx].DtimCount;
*(ptr + 3) = pAd->ApCfg.MBSSID[wdev->func_idx].DtimPeriod;
#else
*(ptr + 2) = pAd->ApCfg.DtimCount;
*(ptr + 3) = pAd->ApCfg.DtimPeriod;
#endif
/* find the smallest AID (PS mode) */
TimFirst = 0; /* record first TIM byte != 0x00 */
TimLast = 0; /* record last TIM byte != 0x00 */
@ -1480,7 +1674,11 @@ INT BcnTimUpdate(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, UCHAR *ptr)
*(ptr + 5 + i - TimFirst) = pTim[i];
/* bit0 means backlogged mcast/bcast */
#ifdef MBSS_DTIM_SUPPORT
if (pAd->ApCfg.MBSSID[wdev->func_idx].DtimCount == 0)
#else
if (pAd->ApCfg.DtimCount == 0)
#endif
*(ptr + 4) |= (bcn_buf->TimBitmaps[WLAN_CT_TIM_BCMC_OFFSET] & 0x01);
/* adjust BEACON length according to the new TIM */
@ -1591,10 +1789,12 @@ VOID BcnCheck(RTMP_ADAPTER *pAd)
UINT32 *prebcncnt;
UINT32 *totalbcncnt;
UCHAR bandidx;
UINT32 band_offset;
if ((pAd->Mlme.PeriodicRound % PRE_BCN_CHECK_PERIOD) == 0) {
#ifndef CUSTOMER_RSG_FEATURE
UINT32 band_offset;
UINT32 mac_val;
#endif
UINT32 bcn_cnt = 0;
UINT32 recoverext = 0;
UINT32 Index;
@ -1602,7 +1802,9 @@ VOID BcnCheck(RTMP_ADAPTER *pAd)
struct wifi_dev *wdev;
for (bandidx = 0; bandidx < HcGetAmountOfBand(pAd) ; bandidx++) {
#ifndef CUSTOMER_RSG_FEATURE
band_offset = 0x200 * bandidx;
#endif
#ifdef ERR_RECOVERY
if (IsErrRecoveryInIdleStat(pAd) == FALSE)
@ -1670,9 +1872,14 @@ VOID BcnCheck(RTMP_ADAPTER *pAd)
prebcncnt = &BcnCheckInfo->prebcncnt1;
totalbcncnt = &BcnCheckInfo->totalbcncnt1;
}
#ifdef CUSTOMER_RSG_FEATURE
bcn_cnt = pAd->beacon_cnt;
pAd->beacon_cnt = 0;
#else
MAC_IO_READ32(pAd, MIB_M0SDR0 + band_offset, &mac_val);
bcn_cnt = (mac_val & 0xffff);
#endif
*totalbcncnt += bcn_cnt; /* Save total bcn count for MibInfo query */
if ((pAd->Mlme.PeriodicRound % BCN_CHECK_PERIOD) == 0) {

View File

@ -1142,6 +1142,12 @@ VOID DedicatedZeroWaitStartAction(
MuSwitch(pAd, 0);
#endif /* CFG_SUPPORT_MU_MIMO */
#ifdef ONDEMAND_DFS
/* Move to DFS 2x2 Mode */
if (IS_SUPPORT_ONDEMAND_ZEROWAIT_DFS(pAd))
SET_ONDEMAND_DFS_MODE(pAd, ONDEMAND_2x2MODE);
#endif
BgndScanCfg.ControlChannel = OutBandCh;
BgndScanCfg.CentralChannel = DfsPrimToCent(OutBandCh, OutBandBw);
BgndScanCfg.Bw = OutBandBw;
@ -1187,17 +1193,30 @@ VOID DedicatedZeroWaitRunningAction(
OutBandCh = GET_BGND_PARAM(pAd, OUTBAND_CH);
OutBandBw = GET_BGND_PARAM(pAd, OUTBAND_BW);
/* Switch to 4x4 on Detection of Non-Zero DFS Channel */
if (OutBandCh == 0) {
MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\x1b[1;33m [%s] No available outband Channel \x1b[m \n",
__FUNCTION__));
MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF,
("\x1b[1;33m [%s] No available outband Channel \x1b[m \n",
__func__));
DedicatedZeroWaitStop(pAd, FALSE);
return;
}
#ifdef ONDEMAND_DFS
if ((IS_SUPPORT_ONDEMAND_ZEROWAIT_DFS(pAd)) && (!RadarChannelCheck(pAd, OutBandCh))) {
struct wifi_dev *wdev = NULL;
wdev = pAd->wdev_list[0];
MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF,
("\x1b[1;33m [%s] Non-DFS Channel Selected Move to 4x4 \x1b[m \n", __func__));
DedicatedZeroWaitStop(pAd, TRUE);
rtmp_set_channel(pAd, wdev, OutBandCh);
return;
}
#endif
pAd->BgndScanCtrl.BgndScanStatMachine.CurrState = BGND_RDD_DETEC;
os_zero_mem(&BgndScanCfg, sizeof(MT_BGND_SCAN_CFG));
BgndScanCfg.ControlChannel = OutBandCh;
BgndScanCfg.CentralChannel = DfsPrimToCent(OutBandCh, OutBandBw);
BgndScanCfg.Bw = OutBandBw;
@ -1205,14 +1224,11 @@ VOID DedicatedZeroWaitRunningAction(
BgndScanCfg.RxPath = 0x0c;
BgndScanCfg.Reason = CH_SWITCH_BACKGROUND_SCAN_RUNNING;
BgndScanCfg.BandIdx = 1;
MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\x1b[1;33m [%s] Bandidx=%d, BW=%d, CtrlCh=%d, CenCh=%d, Reason=%d, RxPath=%d \x1b[m \n",
MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF,
("\x1b[1;33m [%s] Bandidx=%d, BW=%d, CtrlCh=%d, CenCh=%d, Reason=%d, RxPath=%d \x1b[m \n",
__FUNCTION__, BgndScanCfg.BandIdx, BgndScanCfg.Bw, BgndScanCfg.ControlChannel,
BgndScanCfg.CentralChannel, BgndScanCfg.Reason, BgndScanCfg.RxPath));
MtCmdBgndScan(pAd, BgndScanCfg);
/*Start Band1 radar detection*/
DfsDedicatedOutBandRDDStart(pAd);
}
@ -1240,7 +1256,12 @@ VOID DedicatedZeroWaitStop(
CurrentSwChCfg = &(BgndScanCtrl->CurrentSwChCfg[0]);
if (!IS_SUPPORT_DEDICATED_ZEROWAIT_DFS(pAd))
if ((!IS_SUPPORT_DEDICATED_ZEROWAIT_DFS(pAd))
#ifdef ONDEMAND_DFS
&& (!IS_SUPPORT_ONDEMAND_ZEROWAIT_DFS(pAd))
#endif
)
return;
if (!GET_BGND_STATE(pAd, BGND_RDD_DETEC))
@ -1249,24 +1270,26 @@ VOID DedicatedZeroWaitStop(
if (InBandCh == 0)
return;
BgndScanCtrl->BgndScanStatMachine.CurrState = BGND_SCAN_IDLE;
#ifdef ONDEMAND_DFS
if (IS_SUPPORT_ONDEMAND_ZEROWAIT_DFS(pAd))
BgndScanCtrl->BgndScanStatMachine.CurrState = BGND_ONDMND_CNLSWITCH_ON;
else
#endif
BgndScanCtrl->BgndScanStatMachine.CurrState = BGND_SCAN_IDLE;
DfsDedicatedOutBandRDDStop(pAd);
/* RxStream to RxPath */
RxStreamNums = CurrentSwChCfg->RxStream;
if (RxStreamNums > 4) {
#ifdef DFS_DBG_LOG_0
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR,
("\x1b[1;33m %s():illegal RxStreamNums(%d) \x1b[m \n",
__FUNCTION__, RxStreamNums));
__func__, RxStreamNums));
#endif
RxStreamNums = 4;
}
for (i = 0; i < RxStreamNums; i++)
RxPath |= 1 << i;
BgndScanCfg.BandIdx = 0;
BgndScanCfg.Bw = InBandBw;
BgndScanCfg.ControlChannel = InBandCh;
@ -1274,18 +1297,14 @@ VOID DedicatedZeroWaitStop(
BgndScanCfg.Reason = CH_SWITCH_BACKGROUND_SCAN_STOP;
BgndScanCfg.RxPath = RxPath; /* return to 4 Rx */
BgndScanCfg.TxStream = CurrentSwChCfg->TxStream;
MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("[%s] Bandidx=%d, BW=%d, CtrlCh=%d, CenCh=%d, Reason=%d, RxPath=%d\n",
__FUNCTION__, BgndScanCfg.BandIdx, BgndScanCfg.Bw, BgndScanCfg.ControlChannel,
MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF,
("[%s] Bandidx=%d, BW=%d, CtrlCh=%d, CenCh=%d, Reason=%d, RxPath=%d\n",
__func__, BgndScanCfg.BandIdx, BgndScanCfg.Bw, BgndScanCfg.ControlChannel,
BgndScanCfg.CentralChannel, BgndScanCfg.Reason, BgndScanCfg.RxPath));
MtCmdBgndScan(pAd, BgndScanCfg);
BgScNotify.NotifyFunc = (BgndScanCfg.TxStream << 5 | 0xf);
BgScNotify.BgndScanStatus = 0;/*stop*/
MtCmdBgndScanNotify(pAd, BgScNotify);
/*Enable BF, MU*/
#if defined(MT_MAC) && (!defined(MT7636)) && defined(TXBF_SUPPORT)
/*BfSwitch(pAd, 1);*/
@ -1294,7 +1313,6 @@ VOID DedicatedZeroWaitStop(
#ifdef CFG_SUPPORT_MU_MIMO
MuSwitch(pAd, 1);
#endif /* CFG_SUPPORT_MU_MIMO */
}
#endif

View File

@ -97,6 +97,29 @@ VOID CliWdsEntyFree(
return;
}
VOID CliWdsEnryFreeAid(
IN PRTMP_ADAPTER pAd,
IN SHORT Aid)
{
INT idx;
PCLIWDS_PROXY_ENTRY pCliWdsEntry;
for (idx = 0; idx < CLIWDS_HASH_TAB_SIZE; idx++) {
pCliWdsEntry =
(PCLIWDS_PROXY_ENTRY)pAd->ApCfg.CliWdsProxyTb[idx].pHead;
while (pCliWdsEntry) {
if (pCliWdsEntry->Aid == Aid) {
delEntryList(&pAd->ApCfg.CliWdsProxyTb[idx], (RT_LIST_ENTRY *)pCliWdsEntry);
CliWdsEntyFree(pAd, pCliWdsEntry);
}
pCliWdsEntry = pCliWdsEntry->pNext;
}
}
return;
}
UCHAR *CliWds_ProxyLookup(RTMP_ADAPTER *pAd, UCHAR *pMac)
{
@ -164,8 +187,8 @@ VOID CliWds_ProxyTabMaintain(
while (pCliWdsEntry) {
PCLIWDS_PROXY_ENTRY pCliWdsEntryNext = pCliWdsEntry->pNext;
if (RTMP_TIME_AFTER(Now, pCliWdsEntry->LastRefTime + (ULONG)((ULONG)(CLI_WDS_ENTRY_AGEOUT) * OS_HZ / 1000))) {
if (RTMP_TIME_AFTER(Now, pCliWdsEntry->LastRefTime + (CLI_WDS_ENTRY_AGEOUT * OS_HZ / 1000))) {
delEntryList(&pAd->ApCfg.CliWdsProxyTb[idx], (RT_LIST_ENTRY *)pCliWdsEntry);
CliWdsEntyFree(pAd, pCliWdsEntry);
}
@ -177,5 +200,124 @@ VOID CliWds_ProxyTabMaintain(
return;
}
#ifndef WDS_SUPPORT
MAC_TABLE_ENTRY *FindWdsEntry(
IN PRTMP_ADAPTER pAd,
IN RX_BLK * pRxBlk)
{
MAC_TABLE_ENTRY *pEntry;
MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("%s(): Wcid = %d, PhyMode = 0x%x\n", __func__,
pRxBlk->wcid, pRxBlk->rx_rate.field.MODE));
/* lookup the match wds entry for the incoming packet. */
pEntry = WdsTableLookupByWcid(pAd, pRxBlk->wcid, pRxBlk->Addr2, TRUE);
if (pEntry == NULL)
pEntry = WdsTableLookup(pAd, pRxBlk->Addr2, TRUE);
/* Report to MLME, add WDS entry */
if ((pEntry == NULL) && (pAd->WdsTab.Mode >= WDS_LAZY_MODE)) {
UCHAR *pTmpBuf = pRxBlk->pData - LENGTH_802_11;
RXD_BASE_STRUCT *rxd_base = (RXD_BASE_STRUCT *)pRxBlk->rmac_info;
NdisMoveMemory(pTmpBuf, pRxBlk->FC, LENGTH_802_11);
REPORT_MGMT_FRAME_TO_MLME(pAd, pRxBlk->wcid,
pTmpBuf,
pRxBlk->DataSize + LENGTH_802_11,
pRxBlk->rx_signal.raw_rssi[0],
pRxBlk->rx_signal.raw_rssi[1],
pRxBlk->rx_signal.raw_rssi[2],
pRxBlk->rx_signal.raw_rssi[3],
#if defined(CUSTOMER_DCC_FEATURE) || defined(CONFIG_MAP_SUPPORT)
pRxBlk->rx_signal.raw_snr[0],
pRxBlk->rx_signal.raw_snr[1],
pRxBlk->rx_signal.raw_snr[2],
pRxBlk->rx_signal.raw_snr[3],
#endif
(rxd_base != NULL) ? rxd_base->RxD1.ChFreq : 0,
0,
OPMODE_AP,
&pAd->ApCfg.MBSSID[pRxBlk->bss_idx].wdev,
pRxBlk->rx_rate.field.MODE);
MTWF_LOG(DBG_CAT_RX, DBG_SUBCAT_ALL, DBG_LVL_TRACE,
("!!! report WDS UC DATA (from %02x-%02x-%02x-%02x-%02x-%02x) to MLME (len=%d) !!!\n",
PRINT_MAC(pRxBlk->Addr2), pRxBlk->DataSize));
}
return pEntry;
}
MAC_TABLE_ENTRY *WdsTableLookupByWcid(
IN PRTMP_ADAPTER pAd,
IN UCHAR wcid,
IN PUCHAR pAddr,
IN BOOLEAN bResetIdelCount)
{
ULONG WdsIndex;
MAC_TABLE_ENTRY *pCurEntry = NULL, *pEntry = NULL;
RETURN_ZERO_IF_PAD_NULL(pAd);
if (!VALID_UCAST_ENTRY_WCID(pAd, wcid))
return NULL;
NdisAcquireSpinLock(&pAd->WdsTab.WdsTabLock);
NdisAcquireSpinLock(&pAd->MacTabLock);
do {
pCurEntry = &pAd->MacTab.Content[wcid];
WdsIndex = 0xff;
if ((pCurEntry) && IS_ENTRY_WDS(pCurEntry))
WdsIndex = pCurEntry->func_tb_idx;
if (WdsIndex == 0xff)
break;
if (pAd->WdsTab.WdsEntry[WdsIndex].Valid != TRUE)
break;
if (MAC_ADDR_EQUAL(pCurEntry->Addr, pAddr)) {
if (bResetIdelCount) {
pCurEntry->NoDataIdleCount = 0;
/* TODO: shiang-usw, remove upper setting because we need to migrate to tr_entry! */
pAd->MacTab.tr_entry[pCurEntry->tr_tb_idx].NoDataIdleCount = 0;
}
pEntry = pCurEntry;
break;
}
} while (FALSE);
NdisReleaseSpinLock(&pAd->MacTabLock);
NdisReleaseSpinLock(&pAd->WdsTab.WdsTabLock);
return pEntry;
}
MAC_TABLE_ENTRY *WdsTableLookup(RTMP_ADAPTER *pAd, UCHAR *addr, BOOLEAN bResetIdelCount)
{
USHORT HashIdx;
PMAC_TABLE_ENTRY pEntry = NULL;
NdisAcquireSpinLock(&pAd->WdsTab.WdsTabLock);
NdisAcquireSpinLock(&pAd->MacTabLock);
HashIdx = MAC_ADDR_HASH_INDEX(addr);
pEntry = pAd->MacTab.Hash[HashIdx];
while (pEntry) {
if (IS_ENTRY_WDS(pEntry) && MAC_ADDR_EQUAL(pEntry->Addr, addr)) {
if (bResetIdelCount) {
pEntry->NoDataIdleCount = 0;
/* TODO: shiang-usw, remove upper setting because we need to migrate to tr_entry! */
pAd->MacTab.tr_entry[pEntry->wcid].NoDataIdleCount = 0;
}
break;
}
pEntry = pEntry->pNext;
}
NdisReleaseSpinLock(&pAd->MacTabLock);
NdisReleaseSpinLock(&pAd->WdsTab.WdsTabLock);
return pEntry;
}
#endif
#endif /* CLIENT_WDS */

View File

@ -305,10 +305,15 @@ static NTSTATUS ChannelRescanHdlr(IN PRTMP_ADAPTER pAd, IN PCmdQElmt CMDQelmt)
Channel = APAutoSelectChannel(pAd, wdev, TRUE, pAutoChCtrl->pChannelInfo->IsABand);
MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("cmd> Re-scan channel!\n"));
#ifdef ACS_CTCC_SUPPORT
if (!pAd->ApCfg.auto_ch_score_flag)
#endif
{
wdev->channel = Channel;
MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("cmd> Switch to %d!\n", Channel));
APStop(pAd, pMbss, AP_BSS_OPER_BY_RF);
APStartUp(pAd, pMbss, AP_BSS_OPER_BY_RF);
}
#ifdef AP_QLOAD_SUPPORT
QBSS_LoadAlarmResume(pAd);
#endif /* AP_QLOAD_SUPPORT */

View File

@ -45,14 +45,11 @@ static INT build_wsc_probe_req_ie(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, UCHA
#endif /* WSC_V2_SUPPORT */
#endif /* APCLI_SUPPORT */
#ifdef CON_WPS
{
if (bHasWscIe) {
PWSC_CTRL pWscControl = NULL;
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
UCHAR apidx = pObj->ioctl_if;
/* Do not include wsc ie in case concurrent WPS is running */
bHasWscIe = FALSE;
pWscControl = &pAd->ApCfg.ApCliTab[apidx].wdev.WscControl;
pWscControl = &wdev->WscControl;
if ((pWscControl->conWscStatus == CON_WPS_STATUS_DISABLED) ||
(pAd->ApCfg.ConWpsApCliMode != CON_WPS_APCLI_BAND_AUTO))
@ -186,6 +183,15 @@ INT build_extra_probe_req_ie(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, UCHAR *bu
{
INT len = 0;
SCAN_INFO *ScanInfo = &wdev->ScanInfo;
#ifdef RT_CFG80211_SUPPORT
#ifdef APCLI_CFG80211_SUPPORT
if ((pAd->ApCfg.ApCliTab[wdev->func_idx].wpa_supplicant_info.WpaSupplicantUP != WPA_SUPPLICANT_DISABLE) &&
(pAd->cfg80211_ctrl.ExtraIeLen > 0)) {
MAKE_IE_TO_BUF(buf, pAd->cfg80211_ctrl.pExtraIe,
pAd->cfg80211_ctrl.ExtraIeLen, len);
}
#endif /* APCLI_CFG80211_SUPPORT */
#endif /* RT_CFG80211_SUPPORT */
if (ScanInfo->ExtraIeLen && ScanInfo->ExtraIe) {
MAKE_IE_TO_BUF(buf, ScanInfo->ExtraIe,
@ -256,6 +262,12 @@ INT build_ap_extended_cap_ie(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, UCHAR *bu
#endif /* CONFIG_HOTSPOT_R2 */
#endif /* CONFIG_DOT11V_WNM */
/* interworking ie without hotspot enabled. */
#ifdef DOT11U_INTERWORKING_IE_SUPPORT
if (mbss->bEnableInterworkingIe == TRUE)
extCapInfo.interworking = 1;
#endif
#if defined(CONFIG_HOTSPOT) || defined(FTM_SUPPORT)
if (mbss->GASCtrl.b11U_enable)

View File

@ -1763,7 +1763,7 @@ VOID RTMPRingCleanUp(RTMP_ADAPTER *pAd, UCHAR RingType)
for (i = 0; i < CTL_RING_SIZE; i++) {
#ifdef RT_BIG_ENDIAN
pDestTxD = (TXD_STRUC *) pAd->CtrlRing.Cell[i].AllocVa;
pDestTxD = (TXD_STRUC *) hif->CtrlRing.Cell[i].AllocVa;
TxD = *pDestTxD;
pTxD = &TxD;
RTMPDescriptorEndianChange((PUCHAR)pTxD, TYPE_TXD);

View File

@ -270,11 +270,17 @@ PUCHAR MATEngineRxHandle(
/* Get the upper layer protocol type of this 802.3 pkt and dispatch to specific handler */
protoType = OS_NTOHS(get_unaligned((PUINT16)(pPktHdr + 12)));
pLayerHdr = (pPktHdr + MAT_ETHER_HDR_LEN);
if (protoType == ETH_P_VLAN) {
protoType = OS_NTOHS(get_unaligned((PUINT16)(pPktHdr + 12 + LENGTH_802_1Q))); /* Shift VLAN Tag Length (4 byte) */
pLayerHdr = (pPktHdr + MAT_VLAN_ETH_HDR_LEN);
}
for (i = 0; i < MAX_MAT_SUPPORT_PROTO_NUM; i++) {
if (protoType == MATProtoTb[i].protocol) {
pHandle = MATProtoTb[i].pHandle; /* the pHandle must not be null! */
pLayerHdr = (pPktHdr + MAT_ETHER_HDR_LEN);
/* RTMP_SEM_LOCK(&MATDBLock); */
if (pHandle->rx != NULL)
@ -306,6 +312,9 @@ BOOLEAN MATPktRxNeedConvert(
/*BSSID match the ApCliBssid ?(from a valid AP) */
if ((pAd->ApCfg.ApCliTab[i].Valid == TRUE)
&& (net_dev == pAd->ApCfg.ApCliTab[i].wdev.if_dev)
#ifdef A4_CONN
&& (IS_APCLI_A4(&pAd->ApCfg.ApCliTab[i]) == FALSE)
#endif /* A4_CONN */
){
//MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_WARN,("MATPktRxNeedConvert TRUE for ApCliTab[%d]\n",i));
return TRUE;

View File

@ -51,19 +51,21 @@ BOOLEAN RadarChannelCheck(
{
INT i;
BOOLEAN result = FALSE;
UCHAR BandIdx;
CHANNEL_CTRL *pChCtrl;
for (BandIdx = 0; BandIdx < DBDC_BAND_NUM; BandIdx++) {
pChCtrl = hc_get_channel_ctrl(pAd->hdev_ctrl, BandIdx);
for (i = 0; i < pChCtrl->ChListNum; i++) {
if (Ch == pChCtrl->ChList[i].Channel) {
result = pChCtrl->ChList[i].DfsReq;
break;
/* Non-Zero Channel & Null Pointer Check */
if (Ch && pAd) {
for (BandIdx = 0; BandIdx < DBDC_BAND_NUM; BandIdx++) {
pChCtrl = hc_get_channel_ctrl(pAd->hdev_ctrl, BandIdx);
for (i = 0; i < pChCtrl->ChListNum; i++) {
if (Ch == pChCtrl->ChList[i].Channel) {
result = pChCtrl->ChList[i].DfsReq;
break;
}
}
}
}
return result;
}
@ -153,14 +155,20 @@ VOID RadarStateCheck(
BOOLEAN CheckNonOccupancyChannel(
IN PRTMP_ADAPTER pAd,
IN struct wifi_dev *wdev)
IN struct wifi_dev *wdev,
IN UCHAR ch)
{
INT i;
BOOLEAN InNOP = FALSE;
UCHAR channel = wdev->channel;
UCHAR channel = 0;
UCHAR BandIdx = HcGetBandByWdev(wdev);
CHANNEL_CTRL *pChCtrl = hc_get_channel_ctrl(pAd->hdev_ctrl, BandIdx);
if (ch == RDD_CHECK_NOP_BY_WDEV)
channel = wdev->channel;
else
channel = ch;
#ifdef MT_DFS_SUPPORT
DfsNonOccupancyUpdate(pAd);
#endif
@ -293,6 +301,33 @@ VOID ChannelSwitchingCountDownProc(
}
}
#ifdef CUSTOMER_DCC_FEATURE
VOID ChannelSwitchingCountDownProcNew(
IN PRTMP_ADAPTER pAd,
struct wifi_dev *wdev)
{
UCHAR apIdx = 0xff;
if (wdev == NULL)
return;
MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("%s::Channel Switching...(%d/%d)\n", __func__,
pAd->CommonCfg.channelSwitch.CHSWCount, pAd->CommonCfg.channelSwitch.CHSWPeriod));
pAd->CommonCfg.channelSwitch.CHSWCount++;
if (pAd->CommonCfg.channelSwitch.CHSWCount >= pAd->CommonCfg.channelSwitch.CHSWPeriod) {
if (wdev && (wdev->wdev_type == WDEV_TYPE_AP))
apIdx = wdev->func_idx;
pAd->CommonCfg.channelSwitch.CHSWMode = NORMAL_MODE;
MlmeEnqueue(pAd, AP_SYNC_STATE_MACHINE, APMT2_CHANNEL_SWITCH, sizeof(apIdx), &apIdx, 0);
RTMP_MLME_HANDLER(pAd);
}
}
#endif
void update_ch_by_wdev(RTMP_ADAPTER *pAd, struct wifi_dev *wdev);
/*
*
*/
@ -302,28 +337,53 @@ NTSTATUS Dot11HCntDownTimeoutAction(PRTMP_ADAPTER pAd, PCmdQElmt CMDQelmt)
BSS_STRUCT *pMbss = &pAd->ApCfg.MBSSID[MAIN_MBSSID];
UCHAR apOper = AP_BSS_OPER_ALL;
struct DOT11_H *pDot11h = NULL;
#ifdef OFFCHANNEL_SCAN_FEATURE
OFFCHANNEL_SCAN_MSG Rsp;
UCHAR RfIC = 0;
Rsp.Action = DRIVER_CHANNEL_SWITCH_SUCCESSFUL;
memcpy(Rsp.ifrn_name, pAd->ScanCtrl.if_name, IFNAMSIZ);
#endif
NdisMoveMemory(&apIdx, CMDQelmt->buffer, sizeof(UCHAR));
/* check apidx valid */
if (apIdx != 0xff) {
pMbss = &pAd->ApCfg.MBSSID[apIdx];
apOper = AP_BSS_OPER_BY_RF;
/* This event comes on every bss of the RF */
apOper = AP_BSS_OPER_SINGLE;
}
if (pMbss == NULL)
return 0;
pDot11h = pMbss->wdev.pDot11_H;
if (pDot11h == NULL)
return 0;
/* Normal DFS */
#if defined(MT_DFS_SUPPORT) && defined(BACKGROUND_SCAN_SUPPORT)
DedicatedZeroWaitStop(pAd, FALSE);
MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\x1b[1;33m [%s] 2 \x1b[m \n", __func__));
#ifdef ONDEMAND_DFS
#ifdef OFFCHANNEL_SCAN_FEATURE
if (pAd->radar_hit == TRUE) {
printk("[%s] Radar detected \n", __func__);
Rsp.Action = DFS_DRIVER_CHANNEL_SWITCH;
pAd->radar_hit = FALSE;
}
#endif
if (IS_SUPPORT_ONDEMAND_ZEROWAIT_DFS(pAd))
DedicatedZeroWaitStop(pAd, TRUE);
else
#endif
DedicatedZeroWaitStop(pAd, FALSE);
#endif
pDot11h->RDMode = RD_SILENCE_MODE;
#ifdef CONFIG_MAP_SUPPORT
if (pMbss->wdev.quick_ch_change == TRUE && !RadarChannelCheck(pAd, pMbss->wdev.channel)) {
MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("%s %d\n",
(char *)pMbss->wdev.if_dev->name,
pMbss->wdev.quick_ch_change));
update_ch_by_wdev(pAd, &pMbss->wdev);
} else {
#endif
APStop(pAd, pMbss, apOper);
#ifdef MT_DFS_SUPPORT
if (DfsStopWifiCheck(pAd)) {
@ -332,19 +392,74 @@ NTSTATUS Dot11HCntDownTimeoutAction(PRTMP_ADAPTER pAd, PCmdQElmt CMDQelmt)
}
#endif
APStartUp(pAd, pMbss, apOper);
#ifdef MT_DFS_SUPPORT
if (pAd->CommonCfg.dbdc_mode) {
MtCmdSetDfsTxStart(pAd, HcGetBandByWdev(&pMbss->wdev));
} else {
MtCmdSetDfsTxStart(pAd, DBDC_BAND0);
#ifdef CONFIG_MAP_SUPPORT
}
#endif
#ifdef MT_DFS_SUPPORT
if (pAd->CommonCfg.dbdc_mode)
MtCmdSetDfsTxStart(pAd, HcGetBandByWdev(&pMbss->wdev));
else
MtCmdSetDfsTxStart(pAd, DBDC_BAND0);
DfsSetCacRemainingTime(pAd, &pMbss->wdev);
DfsReportCollision(pAd);
#ifdef BACKGROUND_SCAN_SUPPORT
DfsDedicatedScanStart(pAd);
#endif
#endif
#ifdef CONFIG_MAP_SUPPORT
if (pMbss->wdev.cac_not_required) {
pMbss->wdev.cac_not_required = FALSE;
pDot11h->cac_not_required = TRUE;
}
if (pDot11h->cac_not_required) {
int i = 0;
struct wifi_dev *wdev_temp = NULL;
BOOLEAN can_reset_cac = TRUE;
for (i = 0; i < pAd->ApCfg.BssidNum; i++) {
wdev_temp = &pAd->ApCfg.MBSSID[i].wdev;
if ((wdev_temp->pDot11_H == pDot11h) &&
wdev_temp->cac_not_required) {
can_reset_cac = FALSE;
break;
}
}
if (can_reset_cac) {
pDot11h->RDCount = pDot11h->ChMovingTime;
pDot11h->cac_not_required = FALSE;
if (IS_MAP_TURNKEY_ENABLE(pAd)) {
int j;
for (j = 0; j < MAX_APCLI_NUM; j++) {
wdev_temp = &pAd->ApCfg.ApCliTab[j].wdev;
if (wdev_temp->pDot11_H == pDot11h) {
pAd->ApCfg.ApCliTab[j].Enable = TRUE;
break;
}
}
}
}
}
#endif
#ifdef OFFCHANNEL_SCAN_FEATURE
RfIC = (WMODE_CAP_5G(pMbss->wdev.PhyMode)) ? RFIC_5GHZ : RFIC_24GHZ;
Rsp.data.operating_ch_info.channel = HcGetChannelByRf(pAd, RfIC);
Rsp.data.operating_ch_info.cfg_ht_bw = wlan_config_get_ht_bw(&pAd->ApCfg.MBSSID[MAIN_MBSSID].wdev);
Rsp.data.operating_ch_info.cfg_vht_bw = wlan_config_get_vht_bw(&pAd->ApCfg.MBSSID[MAIN_MBSSID].wdev);
Rsp.data.operating_ch_info.RDDurRegion = pAd->CommonCfg.RDDurRegion;
Rsp.data.operating_ch_info.region = GetCountryRegionFromCountryCode(pAd->CommonCfg.CountryCode);
#ifdef ONDEMAND_DFS
Rsp.data.operating_ch_info.is4x4Mode = IS_ONDEMAND_DFS_MODE_4x4(pAd);
#else
Rsp.data.operating_ch_info.is4x4Mode = 1;
#endif
RtmpOSWrielessEventSend(
pAd->net_dev,
RT_WLAN_EVENT_CUSTOM,
OID_OFFCHANNEL_INFO,
NULL,
(UCHAR *) &Rsp,
sizeof(OFFCHANNEL_SCAN_MSG));
#endif
return 0;
}
@ -463,3 +578,308 @@ VOID UpdateDot11hForWdev(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, BOOLEAN attac
}
}
#ifdef CUSTOMISE_RDD_THRESHOLD_SUPPORT
INT Set_RadarMinLPN_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg)
{
UINT16 u2MinLpnUpdate = simple_strtol(arg, 0, 10);
if (u2MinLpnUpdate <= PB_SIZE) {
pAd->CommonCfg.DfsParameter.u2FCC_LPN_MIN = u2MinLpnUpdate;
MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR,
("%s():LPN Update %d \n", __func__, pAd->CommonCfg.DfsParameter.u2FCC_LPN_MIN));
MtCmdSetFcc5MinLPN(pAd, u2MinLpnUpdate);
} else {
MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR,
("%s():Invalid LPN value %d, please set in range 0 to %d\n", __func__, u2MinLpnUpdate, PB_SIZE));
}
return TRUE;
}
INT Set_RadarThresholdParam_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg)
{
CMD_RDM_RADAR_THRESHOLD_UPDATE_T RadarThreshold = {0};
PSW_RADAR_TYPE_T prRadarType = NULL;
INT32 i4Recv = 0;
UINT32 u2RadarType = 0;
UINT32 ucRT_ENB = 0, ucRT_STGR = 0;
UINT32 ucRT_CRPN_MIN = 0, ucRT_CRPN_MAX = 0, ucRT_CRPR_MIN = 0;
UINT32 ucRT_PW_MIN = 0, ucRT_PW_MAX = 0;
UINT32 ucRT_CRBN_MIN = 0, ucRT_CRBN_MAX = 0;
UINT32 ucRT_STGPN_MIN = 0, ucRT_STGPN_MAX = 0, ucRT_STGPR_MIN = 0;
UINT32 u4RT_PRI_MIN = 0, u4RT_PRI_MAX = 0;
PDFS_RADAR_THRESHOLD_PARAM prRadarThresholdParam = NULL;
prRadarThresholdParam = &pAd->CommonCfg.DfsParameter.rRadarThresholdParam;
if (arg) {
i4Recv = sscanf(arg, "%d-%d-%d-%d-%d-%d-%d-%d-%d-%d-%d-%d-%d-%d-%d",
&u2RadarType, &ucRT_ENB, &ucRT_STGR, &ucRT_CRPN_MIN,
&ucRT_CRPN_MAX, &ucRT_CRPR_MIN, &ucRT_PW_MIN, &ucRT_PW_MAX,
&u4RT_PRI_MIN, &u4RT_PRI_MAX, &ucRT_CRBN_MIN, &ucRT_CRBN_MAX,
&ucRT_STGPN_MIN, &ucRT_STGPN_MAX, &ucRT_STGPR_MIN);
if (i4Recv != 15) {
MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR,
("Format Error! Please enter in the following format\n"
"RadarType-RT_ENB-RT_STGR-RT_CRPN_MIN-RT_CRPN_MAX-RT_CRPR_MIN-RT_PW_MIN-RT_PW_MAX-"
"RT_PRI_MIN-RT_PRI_MAX-RT_CRBN_MIN-RT_CRBN_MAX-RT_STGPN_MIN-RT_STGPN_MAX-RT_STGPR_MIN\n"));
return TRUE;
}
if (u2RadarType > RT_NUM) {
MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR,
("Radar Type invalid!! Only 0 to %d supported\n", RT_NUM));
return TRUE;
}
memset(&RadarThreshold, 0, sizeof(CMD_RDM_RADAR_THRESHOLD_UPDATE_T));
RadarThreshold.u2RadarType = u2RadarType;
RadarThreshold.ucRT_ENB = ucRT_ENB;
RadarThreshold.ucRT_STGR = ucRT_STGR;
RadarThreshold.ucRT_CRPN_MIN = ucRT_CRPN_MIN;
RadarThreshold.ucRT_CRPN_MAX = ucRT_CRPN_MAX;
RadarThreshold.ucRT_CRPR_MIN = ucRT_CRPR_MIN;
RadarThreshold.ucRT_PW_MIN = ucRT_PW_MIN;
RadarThreshold.ucRT_PW_MAX = ucRT_PW_MAX;
RadarThreshold.u4RT_PRI_MIN = u4RT_PRI_MIN;
RadarThreshold.u4RT_PRI_MAX = u4RT_PRI_MAX;
RadarThreshold.ucRT_CRBN_MIN = ucRT_CRBN_MIN;
RadarThreshold.ucRT_CRBN_MAX = ucRT_CRBN_MAX;
RadarThreshold.ucRT_STGPN_MIN = ucRT_STGPN_MIN;
RadarThreshold.ucRT_STGPN_MAX = ucRT_STGPN_MAX;
RadarThreshold.ucRT_STGPR_MIN = ucRT_STGPR_MIN;
MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR,
("%s():RadarType = %d\n RT_ENB = %d\n RT_STGR = %d\n "
"RT_CRPN_MIN = %d\n RT_CRPN_MAX = %d\n RT_CRPR_MIN = %d\n "
"RT_PW_MIN = %d\n RT_PW_MAX =%d\n RT_PRI_MIN = %d\n "
"RT_PRI_MAX = %d\n RT_CRBN_MIN = %d\n RT_CRBN_MAX = %d\n"
"RT_STGPN_MIN = %d\n RT_STGPN_MAX = %d\n RT_STGPR_MIN = %d\n ",
__func__, RadarThreshold.u2RadarType, RadarThreshold.ucRT_ENB, RadarThreshold.ucRT_STGR,
RadarThreshold.ucRT_CRPN_MIN, RadarThreshold.ucRT_CRPN_MAX, RadarThreshold.ucRT_CRPR_MIN,
RadarThreshold.ucRT_PW_MIN, RadarThreshold.ucRT_PW_MAX, RadarThreshold.u4RT_PRI_MIN,
RadarThreshold.u4RT_PRI_MAX, RadarThreshold.ucRT_CRBN_MIN, RadarThreshold.ucRT_CRBN_MAX,
RadarThreshold.ucRT_STGPN_MIN, RadarThreshold.ucRT_STGPN_MAX, RadarThreshold.ucRT_STGPR_MIN));
prRadarType = &prRadarThresholdParam->arRadarType[u2RadarType];
prRadarType->ucRT_ENB = RadarThreshold.ucRT_ENB;
prRadarType->ucRT_STGR = RadarThreshold.ucRT_STGR;
prRadarType->ucRT_CRPN_MIN = RadarThreshold.ucRT_CRPN_MIN;
prRadarType->ucRT_CRPN_MAX = RadarThreshold.ucRT_CRPN_MAX;
prRadarType->ucRT_CRPR_MIN = RadarThreshold.ucRT_CRPR_MIN;
prRadarType->ucRT_PW_MIN = RadarThreshold.ucRT_PW_MIN;
prRadarType->ucRT_PW_MAX = RadarThreshold.ucRT_PW_MAX;
prRadarType->u4RT_PRI_MIN = RadarThreshold.u4RT_PRI_MIN;
prRadarType->u4RT_PRI_MAX = RadarThreshold.u4RT_PRI_MAX;
prRadarType->ucRT_CRBN_MIN = RadarThreshold.ucRT_CRBN_MIN;
prRadarType->ucRT_CRBN_MAX = RadarThreshold.ucRT_CRBN_MAX;
prRadarType->ucRT_STGPN_MIN = RadarThreshold.ucRT_STGPN_MIN;
prRadarType->ucRT_STGPN_MAX = RadarThreshold.ucRT_STGPN_MAX;
prRadarType->ucRT_STGPR_MIN = RadarThreshold.ucRT_STGPR_MIN;
MtCmdSetRadarThresholdParam(pAd, &RadarThreshold);
}
return TRUE;
}
INT Set_RadarPulseThresholdParam_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg)
{
INT32 i4Recv = 0, i4PulsePwrMax = 0, i4PulsePwrMin = 0;
UINT32 u4PulseWidthMax = 0, u4PRIMinSTGR = 0, u4PRIMaxSTGR = 0;
UINT32 u4PRIMinCR = 0, u4PRIMaxCR = 0;
PDFS_PULSE_THRESHOLD_PARAM prPulseThresholdParam = NULL;
CMD_RDM_PULSE_THRESHOLD_UPDATE_T PulseThresholdUpdate = {0};
if (arg) {
i4Recv = sscanf(arg, "%d-%d-%d-%d-%d-%d-%d",
&u4PulseWidthMax, &i4PulsePwrMax, &i4PulsePwrMin,
&u4PRIMinSTGR, &u4PRIMaxSTGR, &u4PRIMinCR, &u4PRIMaxCR);
if (i4Recv != 7) {
MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR,
("Format Error! Please enter in the following format\n"
"MaxPulseWidth-MaxPulsePower-MinPulsePower-"
"MinPRISTGR-MaxPRISTGR-MinPRICR-MaxPRICR\n"));
return TRUE;
}
PulseThresholdUpdate.u4PP_PulseWidthMAX = u4PulseWidthMax;
PulseThresholdUpdate.i4PulsePowerMAX = i4PulsePwrMax;
PulseThresholdUpdate.i4PulsePowerMIN = i4PulsePwrMin;
PulseThresholdUpdate.u4PRI_MIN_STGR = u4PRIMinSTGR;
PulseThresholdUpdate.u4PRI_MAX_STGR = u4PRIMaxSTGR;
PulseThresholdUpdate.u4PRI_MIN_CR = u4PRIMinCR;
PulseThresholdUpdate.u4PRI_MAX_CR = u4PRIMaxCR;
MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR,
("%s():MaxPulseWidth = %d\nMaxPulsePower = %d\nMinPulsePower = %d\n"
"MinPRISTGR = %d\nMaxPRISTGR = %d\nMinPRICR = %d\nMaxPRICR = %d\n",
__func__, PulseThresholdUpdate.u4PP_PulseWidthMAX, PulseThresholdUpdate.i4PulsePowerMAX,
PulseThresholdUpdate.i4PulsePowerMIN, PulseThresholdUpdate.u4PRI_MIN_STGR,
PulseThresholdUpdate.u4PRI_MAX_STGR, PulseThresholdUpdate.u4PRI_MAX_STGR,
PulseThresholdUpdate.u4PRI_MAX_CR));
prPulseThresholdParam = &pAd->CommonCfg.DfsParameter.rRadarThresholdParam.rPulseThresholdParam;
prPulseThresholdParam->u4PulseWidthMax = u4PulseWidthMax;
prPulseThresholdParam->i4PulsePwrMax = i4PulsePwrMax;
prPulseThresholdParam->i4PulsePwrMin = i4PulsePwrMin;
prPulseThresholdParam->u4PRI_MIN_STGR = u4PRIMinSTGR;
prPulseThresholdParam->u4PRI_MAX_STGR = u4PRIMaxSTGR;
prPulseThresholdParam->u4PRI_MIN_CR = u4PRIMinCR;
prPulseThresholdParam->u4PRI_MAX_CR = u4PRIMaxCR;
MtCmdSetPulseThresholdParam(pAd, &PulseThresholdUpdate);
}
return TRUE;
}
INT Set_RadarDbgLogConfig_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg)
{
INT32 i4Recv = 0;
UINT32 ucHwRDDLogEnable = 0;
UINT32 ucSwRDDLogEnable = 0;
UINT32 ucSwRDDLogCond = 1;
PDFS_PARAM pDfsParam = &pAd->CommonCfg.DfsParameter;
if (arg) {
i4Recv = sscanf(arg, "%d-%d-%d", &ucHwRDDLogEnable, &ucSwRDDLogEnable, &ucSwRDDLogCond);
if (i4Recv != 3) {
MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR,
("Format Error! Please enter in the following format\n"
"HWRDD_LOG_ENB-SWRDD_LOG_ENB-SWRDD_LOG_COND\n"));
return TRUE;
}
if (ucHwRDDLogEnable != 0)
pDfsParam->fgHwRDDLogEnable = TRUE;
else
pDfsParam->fgHwRDDLogEnable = FALSE;
if (ucSwRDDLogEnable != 0)
pDfsParam->fgSwRDDLogEnable = TRUE;
else
pDfsParam->fgSwRDDLogEnable = FALSE;
if (ucSwRDDLogCond == 0)
pDfsParam->fgSwRDDLogCond = FALSE;
else
pDfsParam->fgSwRDDLogCond = TRUE;
MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR,
("%s():HWRDD_LOG_ENB = %d, SWRDD_LOG_ENB = %d SWRDD_LOG_COND = %d \n",
__func__, pDfsParam->fgHwRDDLogEnable, pDfsParam->fgSwRDDLogEnable, pDfsParam->fgSwRDDLogCond));
MtCmdSetRddLogConfigUpdate(pAd, ucHwRDDLogEnable, ucSwRDDLogEnable, ucSwRDDLogCond);
}
return TRUE;
}
INT Show_Radar_Threshold_Param_Proc(
PRTMP_ADAPTER pAd,
RTMP_STRING *arg)
{
UINT8 ucRadarTypeIdx = 0;
PDFS_RADAR_THRESHOLD_PARAM prRadarThresholdParam = NULL;
PSW_RADAR_TYPE_T prRadarType = NULL;
prRadarThresholdParam = &pAd->CommonCfg.DfsParameter.rRadarThresholdParam;
MTWF_LOG(DBG_CAT_PROTO, CATPROTO_DFS, DBG_LVL_OFF,
("---------------------------------Debug Log Conditions---------------------------------------\n"));
MTWF_LOG(DBG_CAT_PROTO, CATPROTO_DFS, DBG_LVL_OFF,
("HWRDD_LOG_ENB = %d\nSWRDD_LOG_ENB = %d\nSWRDD_LOG_COND = %d\n",
pAd->CommonCfg.DfsParameter.fgHwRDDLogEnable,
pAd->CommonCfg.DfsParameter.fgSwRDDLogEnable,
pAd->CommonCfg.DfsParameter.fgSwRDDLogCond));
MTWF_LOG(DBG_CAT_PROTO, CATPROTO_DFS, DBG_LVL_OFF,
("-------------------------------Pulse Threshold Parameters-----------------------------------\n"));
MTWF_LOG(DBG_CAT_PROTO, CATPROTO_DFS, DBG_LVL_OFF, ("FCC5_LPN = %d\n",
pAd->CommonCfg.DfsParameter.u2FCC_LPN_MIN));
MTWF_LOG(DBG_CAT_PROTO, CATPROTO_DFS, DBG_LVL_OFF, ("PLS_POWER_MIN = %d\n",
prRadarThresholdParam->rPulseThresholdParam.i4PulsePwrMin));
MTWF_LOG(DBG_CAT_PROTO, CATPROTO_DFS, DBG_LVL_OFF, ("PLS_POWER_MAX = %d\n",
prRadarThresholdParam->rPulseThresholdParam.i4PulsePwrMax));
MTWF_LOG(DBG_CAT_PROTO, CATPROTO_DFS, DBG_LVL_OFF, ("SP_PW_MAX = %d\n",
prRadarThresholdParam->rPulseThresholdParam.u4PulseWidthMax));
MTWF_LOG(DBG_CAT_PROTO, CATPROTO_DFS, DBG_LVL_OFF, ("PRI_MIN_STGR = %d\n",
prRadarThresholdParam->rPulseThresholdParam.u4PRI_MIN_STGR));
MTWF_LOG(DBG_CAT_PROTO, CATPROTO_DFS, DBG_LVL_OFF, ("PRI_MAX_STGR = %d\n",
prRadarThresholdParam->rPulseThresholdParam.u4PRI_MAX_STGR));
MTWF_LOG(DBG_CAT_PROTO, CATPROTO_DFS, DBG_LVL_OFF, ("PRI_MIN_CR = %d\n",
prRadarThresholdParam->rPulseThresholdParam.u4PRI_MIN_CR));
MTWF_LOG(DBG_CAT_PROTO, CATPROTO_DFS, DBG_LVL_OFF, ("PRI_MAX_CR = %d\n",
prRadarThresholdParam->rPulseThresholdParam.u4PRI_MAX_CR));
MTWF_LOG(DBG_CAT_PROTO, CATPROTO_DFS, DBG_LVL_OFF,
("---------------------------------RADAR Threshold Info---------------------------------------\n"));
for (ucRadarTypeIdx = 0; ucRadarTypeIdx < RT_NUM; ucRadarTypeIdx++) {
prRadarType = &prRadarThresholdParam->arRadarType[ucRadarTypeIdx];
MTWF_LOG(DBG_CAT_PROTO, CATPROTO_DFS, DBG_LVL_OFF,
("RT - %d: ENB = %d, STGR = %d, CRPN_MIN = %d, CRPN_MAX = %d, CRPR_MIN = %d, PW_MIN = %d, PW_MAX = %d,"
"PRI_MIN = %d, PRI_MAX = %d, CRBN_MIN = %d, CRBN_MAX = %d\n\t"
"STGPN_MIN = %d, STGPN_MAX = %d, STGPR_MIN = %d\n",
ucRadarTypeIdx,
prRadarType->ucRT_ENB,
prRadarType->ucRT_STGR,
prRadarType->ucRT_CRPN_MIN,
prRadarType->ucRT_CRPN_MAX,
prRadarType->ucRT_CRPR_MIN,
prRadarType->ucRT_PW_MIN,
prRadarType->ucRT_PW_MAX,
prRadarType->u4RT_PRI_MIN,
prRadarType->u4RT_PRI_MAX,
prRadarType->ucRT_CRBN_MIN,
prRadarType->ucRT_CRBN_MAX,
prRadarType->ucRT_STGPN_MIN,
prRadarType->ucRT_STGPN_MAX,
prRadarType->ucRT_STGPR_MIN
));
}
MTWF_LOG(DBG_CAT_AP, CATPROTO_DFS, DBG_LVL_OFF,
("---------------------------------------------------------------------------------------------\n"));
return TRUE;
}
#endif /* CUSTOMISE_RDD_THRESHOLD_SUPPORT */
#ifdef RDM_FALSE_ALARM_DEBUG_SUPPORT
INT Set_RadarTestPulsePattern_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg)
{
INT32 i4Recv = 0;
CHAR *pcPulseParams = 0;
UINT32 u4PulseNum = 0;
CMD_RDM_TEST_RADAR_PATTERN_T PulsePattern = {0};
PPERIODIC_PULSE_BUFFER_T prPulseBuffer = NULL;
/*
Ex: 29151901-28-748;29153127-29-760;29154352-29-748;29155577-28-760;29156652-29-751
*/
if (arg) {
for (u4PulseNum = 0, pcPulseParams = rstrtok(arg, ";"); (pcPulseParams != NULL) && (u4PulseNum < PB_SIZE); pcPulseParams = rstrtok(NULL, ";"), u4PulseNum++) {
prPulseBuffer = &PulsePattern.arPulseBuffer[u4PulseNum];
i4Recv = sscanf(pcPulseParams, "%d-%hu-%hi", &(prPulseBuffer->u4PeriodicStartTime), &(prPulseBuffer->u2PeriodicPulseWidth), &(prPulseBuffer->i2PeriodicPulsePower));
if (i4Recv != 3) {
MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR,
("Format Error! Please enter in the following format\n"
"StartTime0-PulseWidth0-PulsePower0;StartTime1-PulseWidth1-PulsePower1;...\n"));
return TRUE;
}
}
PulsePattern.ucPulseNum = u4PulseNum;
MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("%s:No of pulses = %d\n", __func__, PulsePattern.ucPulseNum));
MtCmdSetTestRadarPattern(pAd, &PulsePattern);
}
return TRUE;
}
#endif /* RDM_FALSE_ALARM_DEBUG_SUPPORT */

View File

@ -107,7 +107,7 @@ INT rd_dashboard(RTMP_ADAPTER *pAd, IN RTMP_IOCTL_INPUT_STRUCT *wrq)
return 0;
memset(msg, 0x00, MSG_LEN);
sprintf(msg, "\n");
sprintf(msg+strlen(msg), "%s%-16s%s\n", "====================", " RvR Debug Info ", "====================");
snprintf(msg+strlen(msg), 100, "%s%-16s%s\n", "====================", " RvR Debug Info ", "====================");
if ((pRVRDBGCtrl->ucViewLevel & VIEW_BASICINFO) == VIEW_BASICINFO)
printBasicinfo(pAd, msg);
if ((pRVRDBGCtrl->ucViewLevel & VIEW_WCID) == VIEW_WCID)
@ -122,7 +122,7 @@ INT rd_dashboard(RTMP_ADAPTER *pAd, IN RTMP_IOCTL_INPUT_STRUCT *wrq)
printNoise(pAd, msg);
if ((pRVRDBGCtrl->ucViewLevel & VIEW_OTHERS) == VIEW_OTHERS)
printOthers(pAd, msg);
sprintf(msg+strlen(msg), "%s\n", "========================================================");
snprintf(msg+strlen(msg), 100, "%s\n", "========================================================");
if ((pRVRDBGCtrl->ucViewLevel & VIEW_CNNUMBER) == VIEW_CNNUMBER)
updateCNNum(pAd, TRUE);
else
@ -380,16 +380,16 @@ INT rd_help(RTMP_ADAPTER *pAd, RTMP_STRING *arg, RTMP_IOCTL_INPUT_STRUCT *wrq)
sprintf(msg, "\n");
switch (button) {
case Case_SHOW:
sprintf(msg + strlen(msg), "%s", "iwpriv [Interface] rd [Sub-command]\n");
sprintf(msg + strlen(msg), "%s", "Sub-command List\n");
sprintf(msg + strlen(msg), "%-25s %s", "view", "Show view level status\n");
sprintf(msg + strlen(msg), "%-25s %s", "view=", "Set view level by hex value(8bits 00~FF)\n");
sprintf(msg + strlen(msg), "%-25s %s", "view+=", "Enable view level by string\n");
sprintf(msg + strlen(msg), "%-25s %s", "view-=", "Disable view level by string\n");
sprintf(msg + strlen(msg), "%-25s %s", "wcid,sta,ap,apcli", "Show mac table\n");
sprintf(msg + strlen(msg), "%-25s %s", "wcid=,sta=,ap=,apcli=", "Set WCID\n");
sprintf(msg + strlen(msg), "%-25s %s", "reset", "Reset all counter\n");
sprintf(msg + strlen(msg), "%-25s %s", "help", "Show support command info\n");
snprintf(msg + strlen(msg), 100, "%s", "iwpriv [Interface] rd [Sub-command]\n");
snprintf(msg + strlen(msg), 100, "%s", "Sub-command List\n");
snprintf(msg + strlen(msg), 100, "%-25s %s", "view", "Show view level status\n");
snprintf(msg + strlen(msg), 100, "%-25s %s", "view=", "Set view level by hex value(8bits 00~FF)\n");
snprintf(msg + strlen(msg), 100, "%-25s %s", "view+=", "Enable view level by string\n");
snprintf(msg + strlen(msg), 100, "%-25s %s", "view-=", "Disable view level by string\n");
snprintf(msg + strlen(msg), 100, "%-25s %s", "wcid,sta,ap,apcli", "Show mac table\n");
snprintf(msg + strlen(msg), 100, "%-25s %s", "wcid=,sta=,ap=,apcli=", "Set WCID\n");
snprintf(msg + strlen(msg), 100, "%-25s %s", "reset", "Reset all counter\n");
snprintf(msg + strlen(msg), 100, "%-25s %s", "help", "Show support command info\n");
break;
}
wrq->u.data.length = strlen(msg);
@ -411,10 +411,10 @@ INT printBasicinfo (RTMP_ADAPTER *pAd, RTMP_STRING *msg)
else
return FALSE;
sprintf(msg+strlen(msg), "%s%-16s%s\n", "====================", " BASIC ", "====================");
sprintf(msg+strlen(msg), "%-32s= %d\n", "Current Band ", ucBand);
snprintf(msg+strlen(msg), 100, "%s%-16s%s\n", "====================", " BASIC ", "====================");
snprintf(msg+strlen(msg), 100, "%-32s= %d\n", "Current Band ", ucBand);
RTMP_GET_TEMPERATURE(pAd, &temperature);
sprintf(msg+strlen(msg), "%-32s= %d\n", "Current Temperature ", temperature);
snprintf(msg+strlen(msg), 100, "%-32s= %d\n", "Current Temperature ", temperature);
return TRUE;
}
@ -423,9 +423,9 @@ VOID printView(RTMP_ADAPTER *pAd, IN RTMP_STRING *msg)
PRvR_Debug_CTRL pRVRDBGCtrl;
INT view_bits = 0;
pRVRDBGCtrl = &pAd->RVRDBGCtrl;
sprintf(msg + strlen(msg), "%-4s | %-6s | %-15s | %s\n", "bit", "arg", "info", "Status");
snprintf(msg + strlen(msg), 100, "%-4s | %-6s | %-15s | %s\n", "bit", "arg", "info", "Status");
for (PView_Key_Node = View_Key_Node_List; PView_Key_Node->key; PView_Key_Node++) {
sprintf(msg + strlen(msg), "%-4d | %-6s | %-15s | %s\n",
snprintf(msg + strlen(msg), 100, "%-4d | %-6s | %-15s | %s\n",
view_bits++,
PView_Key_Node->key,
PView_Key_Node->str,
@ -446,7 +446,7 @@ INT printWcid (RTMP_ADAPTER *pAd, RTMP_STRING *msg)
pRVRDBGCtrl = &pAd->RVRDBGCtrl;
sprintf(msg+strlen(msg), "%s%-16s%s\n", "====================", " WCID ", "====================");
snprintf(msg+strlen(msg), 100, "%s%-16s%s\n", "====================", " WCID ", "====================");
/* User assign aid, default = 0 will auto search first sta */
if (pRVRDBGCtrl->ucWcid == 0)
@ -463,7 +463,7 @@ INT printWcid (RTMP_ADAPTER *pAd, RTMP_STRING *msg)
sprintf(msg+strlen(msg), "%-32s= %02X:%02X:%02X:%02X:%02X:%02X\n", "MAC Addr ", PRINT_MAC(pEntry->Addr));
snprintf(tmp_str, temp_str_len, "%d %d %d %d", pEntry->RssiSample.AvgRssi[0], pEntry->RssiSample.AvgRssi[1],
pEntry->RssiSample.AvgRssi[2], pEntry->RssiSample.AvgRssi[3]);
sprintf(msg+strlen(msg), "%-32s= %s\n", "RSSI0/1/2/3 ", tmp_str);
snprintf(msg+strlen(msg), 100, "%-32s= %s\n", "RSSI0/1/2/3 ", tmp_str);
lastRxRate = pEntry->LastRxRate;
lastTxRate = pEntry->LastTxRate;
if (cap->fgRateAdaptFWOffload == TRUE) {
@ -510,7 +510,7 @@ INT printMacCounter (RTMP_ADAPTER *pAd, RTMP_STRING *msg)
ucBand = HcGetBandByWdev(wdev);
else
return FALSE;
sprintf(msg+strlen(msg), "%s%-16s%s\n", "====================", " MAC COUNTER ", "====================");
snprintf(msg+strlen(msg), 100, "%s%-16s%s\n", "====================", " MAC COUNTER ", "====================");
/* Tx Count */
txCount = pAd->WlanCounters[ucBand].TransmittedFragmentCount.u.LowPart;
@ -574,7 +574,7 @@ INT printPhyCounter (RTMP_ADAPTER *pAd, RTMP_STRING *msg)
ucBand = HcGetBandByWdev(wdev);
else
return FALSE;
sprintf(msg+strlen(msg), "%s%-16s%s\n", "====================", " PHY COUNTER ", "====================");
snprintf(msg+strlen(msg), 100, "%s%-16s%s\n", "====================", " PHY COUNTER ", "====================");
if ((pRVRDBGCtrl->ucViewLevel & VIEW_CNNUMBER) == VIEW_CNNUMBER)
printCNNum(pAd, msg);
return TRUE;
@ -594,8 +594,8 @@ INT printNoise (RTMP_ADAPTER *pAd, RTMP_STRING *msg)
ucBand = HcGetBandByWdev(wdev);
else
return FALSE;
sprintf(msg+strlen(msg), "%s%-16s%s\n", "====================", " NOISE ", "====================");
sprintf(msg+strlen(msg), "%-32s= %s\n",
snprintf(msg+strlen(msg), 100, "%s%-16s%s\n", "====================", " NOISE ", "====================");
snprintf(msg+strlen(msg), 100, "%-32s= %s\n",
"MibBucket ", pAd->OneSecMibBucket.Enabled[ucBand] ? "Enable":"Disable");
sprintf(msg+strlen(msg), "%-32s= %d\n",
"Channel Busy Time ", pAd->OneSecMibBucket.ChannelBusyTime[ucBand]);
@ -628,7 +628,7 @@ INT printOthers (RTMP_ADAPTER *pAd, RTMP_STRING *msg)
else
return FALSE;
*/
sprintf(msg+strlen(msg), "%s%-16s%s\n", "====================", " OTHERS ", "====================");
snprintf(msg+strlen(msg), 100, "%s%-16s%s\n", "====================", " OTHERS ", "====================");
return TRUE;
}

View File

@ -32,7 +32,7 @@
#endif /* DOT11R_FT_SUPPORT */
extern UCHAR CISCO_OUI[];
extern UCHAR APPLE_OUI[]; /* For IOS immediately connect */
extern UCHAR WPA_OUI[];
extern UCHAR RSN_OUI[];
extern UCHAR WME_INFO_ELEM[];
@ -276,6 +276,9 @@ BOOLEAN PeerBeaconAndProbeRspSanity(
BOOLEAN bWscCheck = TRUE;
UCHAR LatchRfChannel = 0;
UCHAR *ptr_eid = NULL;
#ifdef CONFIG_RCSA_SUPPORT
CSA_IE_INFO *CsaInfo = &ie_list->CsaInfo;
#endif
/*
For some 11a AP which didn't have DS_IE, we use two conditions to decide the channel
1. If the AP is 11n enabled, then check the control channel.
@ -418,8 +421,12 @@ BOOLEAN PeerBeaconAndProbeRspSanity(
break;
case IE_SECONDARY_CH_OFFSET:
if (pEid->Len == 1)
if (pEid->Len == 1) {
ie_list->NewExtChannelOffset = pEid->Octet[0];
#ifdef CONFIG_RCSA_SUPPORT
CsaInfo->SChOffIE.SecondaryChannelOffset = pEid->Octet[0];
#endif
}
else
MTWF_LOG(DBG_CAT_MLME, DBG_SUBCAT_ALL, DBG_LVL_WARN, ("%s() - wrong IE_SECONDARY_CH_OFFSET.\n", __func__));
@ -473,11 +480,29 @@ BOOLEAN PeerBeaconAndProbeRspSanity(
break;
case IE_CHANNEL_SWITCH_ANNOUNCEMENT:
if (pEid->Len == 3)
if (pEid->Len == 3) {
ie_list->NewChannel = pEid->Octet[1]; /*extract new channel number*/
#ifdef CONFIG_RCSA_SUPPORT
NdisMoveMemory(&CsaInfo->ChSwAnnIE, &pEid->Octet[0], pEid->Len);
#endif
}
break;
#ifdef CONFIG_RCSA_SUPPORT
case IE_EXT_CHANNEL_SWITCH_ANNOUNCEMENT:
if (pEid->Len == 4) {
if (ie_list->NewChannel == 0)
ie_list->NewChannel = pEid->Octet[2]; /*extract new channel number*/
NdisMoveMemory(&CsaInfo->ExtChSwAnnIE, &pEid->Octet[0], pEid->Len);
}
break;
case IE_WIDE_BW_CH_SWITCH:
if (pEid->Len == 3)
NdisMoveMemory(&CsaInfo->wb_info, &pEid->Octet[0], pEid->Len);
break;
#endif
/*
New for WPA
CCX v2 has the same IE, we need to parse that too
@ -497,10 +522,115 @@ BOOLEAN PeerBeaconAndProbeRspSanity(
#ifdef CONFIG_OWE_SUPPORT
if (NdisEqualMemory(pEid->Octet, OWE_TRANS_OUI, 4)) {
#ifdef APCLI_SUPPORT
#ifdef APCLI_OWE_SUPPORT
UCHAR pair_ch = 0;
UCHAR pair_bssid[MAC_ADDR_LEN] = {0};
UCHAR pair_ssid[MAX_LEN_OF_SSID] = {0};
UCHAR pair_band = 0;
UCHAR pair_ssid_len = 0;
#endif
#endif
/* Copy to pVIE which will report to bssid list.*/
Ptr = (PUCHAR) pVIE;
NdisMoveMemory(Ptr + *LengthVIE, ptr_eid, pEid->Len + 2);
*LengthVIE += (pEid->Len + 2);
#ifdef APCLI_SUPPORT
#ifdef APCLI_OWE_SUPPORT
extract_pair_owe_bss_info(pEid->Octet + 4,
pEid->Len - 4,
pair_bssid,
pair_ssid,
&pair_ssid_len,
&pair_band,
&pair_ch);
if (pair_ch != 0) {
UINT32 idx = 0;
UINT32 max_con_bands = HcGetAmountOfBand(pAd);
CHANNEL_CTRL *pchctrl = NULL;
BOOLEAN bchanpresent = FALSE;
if (BOARD_IS_5G_ONLY(pAd)) {
for (idx = 0; idx < max_con_bands; idx++) {
pchctrl = hc_get_channel_ctrl(pAd->hdev_ctrl, idx);
if (pchctrl && MTChGrpChannelChk(pchctrl, pair_ch)) {
bchanpresent = TRUE;
break;
}
}
} else {
for (idx = 0; idx < max_con_bands; idx++) {
UINT32 i = 0;
pchctrl = hc_get_channel_ctrl(pAd->hdev_ctrl, idx);
for (i = 0; i < pchctrl->ChListNum; i++) {
if (pair_ch == pchctrl->ChList[i].Channel) {
bchanpresent = TRUE;
break;
}
}
}
}
if (bchanpresent == FALSE) {
if (pPeerWscIe)
os_free_mem(pPeerWscIe);
return FALSE;
}
} else {
UINT32 idx = 0;
UINT32 max_con_bands = HcGetAmountOfBand(pAd);
CHANNEL_CTRL *pchctrl = NULL;
BOOLEAN bchanpresent = FALSE;
/*If pair channel is not present validate probe resp channel to handle 2g overlap case*/
if (BOARD_IS_5G_ONLY(pAd)) {
for (idx = 0; idx < max_con_bands; idx++) {
pchctrl = hc_get_channel_ctrl(pAd->hdev_ctrl, idx);
if (pchctrl && MTChGrpChannelChk(pchctrl, ie_list->Channel)) {
bchanpresent = TRUE;
break;
}
}
} else {
for (idx = 0; idx < max_con_bands; idx++) {
UINT32 i = 0;
pchctrl = hc_get_channel_ctrl(pAd->hdev_ctrl, idx);
for (i = 0; i < pchctrl->ChListNum; i++) {
if (ie_list->Channel == pchctrl->ChList[i].Channel) {
bchanpresent = TRUE;
break;
}
}
}
}
if (bchanpresent == FALSE) {
if (pPeerWscIe)
os_free_mem(pPeerWscIe);
return FALSE;
}
}
#endif
#endif
} else
#endif /*CONFIG_OWE_SUPPORT*/
if (NdisEqualMemory(pEid->Octet, WPA_OUI, 4)) {
@ -683,8 +813,8 @@ BOOLEAN PeerBeaconAndProbeRspSanity(
#ifdef RT_BIG_ENDIAN
(*(UINT32 *)(&(ie_list->ExtCapInfo))) =
le2cpu32(*(UINT32 *)(&(ie_list->ExtCapInfo)));
(*(UINT32 *)(&(ie_list->ExtCapInfo)+4)) =
le2cpu32(*(UINT32 *)(&(ie_list->ExtCapInfo)+4));
(*(UINT32 *)((UCHAR *)&(ie_list->ExtCapInfo)+4)) =
le2cpu32(*(UINT32 *)((UCHAR *)&(ie_list->ExtCapInfo)+4));
#endif
}
@ -967,8 +1097,26 @@ UCHAR ChannelSanity(
return 0;
}
UCHAR ChannelSanityDBDC(
IN PRTMP_ADAPTER pAd,
IN struct wifi_dev *wdev,
IN UCHAR channel)
{
int i;
UCHAR BandIdx = HcGetBandByWdev(wdev);
CHANNEL_CTRL *pChCtrl = hc_get_channel_ctrl(pAd->hdev_ctrl, BandIdx);
for (i = 0; i < pChCtrl->ChListNum; i++) {
if (channel == pChCtrl->ChList[i].Channel)
return 1;
}
return 0;
}
#ifdef CONFIG_AP_SUPPORT
#ifdef DBDC_MODE
#ifdef WSC_INCLUDED
UCHAR CheckWPSTriggeredPerBand(
IN PRTMP_ADAPTER pAd,
IN MLME_QUEUE_ELEM * Elem)
@ -992,6 +1140,7 @@ UCHAR CheckWPSTriggeredPerBand(
return bss_index;
}
#endif /*WSC_INCLUDED*/
#endif /*DBDC_MODE*/
#endif /*CONFIG_AP_SUPPORT*/
@ -1274,8 +1423,10 @@ BOOLEAN PeerProbeReqSanity(
#endif /* CONFIG_AP_SUPPORT */
UINT total_ie_len = 0;
#ifdef WSC_INCLUDED
MLME_QUEUE_ELEM *Elem = NULL;
UCHAR current_band = 0;
#endif /*WSC_INCLUDED*/
/* NdisZeroMemory(ProbeReqParam, sizeof(*ProbeReqParam)); */
COPY_MAC_ADDR(ProbeReqParam->Addr2, &Fr->Hdr.Addr2);
@ -1284,13 +1435,15 @@ BOOLEAN PeerProbeReqSanity(
MTWF_LOG(DBG_CAT_MLME, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("%s(): sanity fail - wrong SSID IE\n", __func__));
return FALSE;
}
#if defined(CONFIG_MAP_SUPPORT) && defined(WAPP_SUPPORT)
if (!ApCheckAccessControlList(pAd, ProbeReqParam->Addr2, apidx)) {
MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("ApCheckAccessControlList(): Keep silent\n"));
return FALSE;
}
#endif
/*
* MAP-R1 4.8.5 workaround
* Test case expect auth/assoc reject after probe response therefore
* dropping it here will cause test case to fail.
* Impact on band steering: Client will be able to see blocked bss as
* well, however connection will be rejected in auth phase.
* TODO: Define a seperate ioctl for probe withholding and do not
* call that in certification case. Correct apidex passed in below API.
*/
ProbeReqParam->SsidLen = Fr->Octet[1];
NdisMoveMemory(ProbeReqParam->Ssid, &Fr->Octet[2], ProbeReqParam->SsidLen);
@ -1313,6 +1466,11 @@ BOOLEAN PeerProbeReqSanity(
if (eid_len <= 4)
break;
/* For IOS immediately connect */
if (!ProbeReqParam->IsFromIos && NdisEqualMemory(eid_data, APPLE_OUI, 3)) {
ProbeReqParam->IsFromIos = TRUE;
}
#ifdef RSSI_FEEDBACK
if (ProbeReqParam->bRssiRequested &&
@ -1325,6 +1483,17 @@ BOOLEAN PeerProbeReqSanity(
#endif /* RSSI_FEEDBACK */
#ifdef CUSTOMER_VENDOR_IE_SUPPORT
if ((pAd->ApCfg.ap_customer_oui.pointer != NULL) &&
(eid_len >= pAd->ApCfg.ap_customer_oui.length) &&
NdisEqualMemory(eid_data, pAd->ApCfg.ap_customer_oui.pointer,
pAd->ApCfg.ap_customer_oui.length)) {
ProbeReqParam->report_param.vendor_ie.element_id = IE_VENDOR_SPECIFIC;
ProbeReqParam->report_param.vendor_ie.len = eid_len;
NdisMoveMemory(ProbeReqParam->report_param.vendor_ie.custom_ie, eid_data, eid_len);
break;
}
#endif /* CUSTOMER_VENDOR_IE_SUPPORT */
if (NdisEqualMemory(eid_data, WPS_OUI, 4)
) {
@ -1431,6 +1600,10 @@ BOOLEAN PeerProbeReqSanity(
#ifdef WSC_INCLUDED
if (pPeerWscIe && (PeerWscIeLen > 0) && (bWscCheck == TRUE)) {
/* WPS_BandSteering Support */
#ifdef BAND_STEERING
ProbeReqParam->bWpsCapable = TRUE;
#endif
for (apidx = 0; apidx < pAd->ApCfg.BssidNum; apidx++) {
if (NdisEqualMemory(Addr1, pAd->ApCfg.MBSSID[apidx].wdev.bssid, MAC_ADDR_LEN))
break;

View File

@ -113,7 +113,10 @@ static UCHAR BuildChannelListFor2G(RTMP_ADAPTER *pAd, CHANNEL_CTRL *pChCtrl, UCH
}
#endif
pChCtrl->ChList[ChIdx].Channel = pChannelList[ChIdx];
pChCtrl->ChList[ChIdx].MaxTxPwr = 20;
if (!strncmp((RTMP_STRING *) pAd->CommonCfg.CountryCode, "CN", 2))
pChCtrl->ChList[ChIdx].MaxTxPwr = pAd->MaxTxPwr;/*for CN CountryCode*/
else
pChCtrl->ChList[ChIdx].MaxTxPwr = 20;
pChCtrl->ChList[ChIdx].Flags = pChannelListFlag[ChIdx];
#ifdef RT_CFG80211_SUPPORT
@ -152,6 +155,19 @@ static UCHAR BuildChannelListFor5G(RTMP_ADAPTER *pAd, CHANNEL_CTRL *pChCtrl, UCH
PUCHAR pChannelList;
PUCHAR pChannelListFlag;
#ifdef RT_CFG80211_SUPPORT
UCHAR bw;
int apidx;
for (apidx = 0; apidx < pAd->ApCfg.BssidNum; apidx++) {
BSS_STRUCT *pMbss = &pAd->ApCfg.MBSSID[apidx];
struct wifi_dev *wdev = &pMbss->wdev;
bw = HcGetBw(pAd, wdev);
}
PhyMode = HcGetRadioPhyMode(pAd);
#endif
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("[BuildChannelListFor5G] \n"));
for (ChIdx = 0; ChIdx < Country_Region_GroupNum_5GHZ; ChIdx++) {
@ -286,7 +302,10 @@ static UCHAR BuildChannelListFor5G(RTMP_ADAPTER *pAd, CHANNEL_CTRL *pChCtrl, UCH
pChCtrl->ChList[ChIdx].DfsReq = TRUE;
}
}
pChCtrl->ChList[ChIdx].MaxTxPwr = 20;
if (!strncmp((RTMP_STRING *) pAd->CommonCfg.CountryCode, "CN", 2))
pChCtrl->ChList[ChIdx].MaxTxPwr = pAd->MaxTxPwr;/*for CN CountryCode*/
else
pChCtrl->ChList[ChIdx].MaxTxPwr = 20;
#ifdef RT_CFG80211_SUPPORT
CFG80211OS_ChanInfoInit(
pAd->pCfg80211_CB,
@ -445,8 +464,37 @@ UCHAR FirstChannel(RTMP_ADAPTER *pAd, struct wifi_dev *wdev)
{
UCHAR BandIdx = HcGetBandByWdev(wdev);
CHANNEL_CTRL *pChCtrl = hc_get_channel_ctrl(pAd->hdev_ctrl, BandIdx);
#ifdef MT_DFS_SUPPORT
int ChnIdx, DfsChnIdx;
UCHAR first_channel = 0;
PDFS_PARAM pDfsParam = &pAd->CommonCfg.DfsParameter;
BOOLEAN ChannelFound = FALSE;
for (ChnIdx = 0; ChnIdx < (pChCtrl->ChListNum - 1); ChnIdx++) {
/* For each channel from pChCtrl->ChList[i], check if the channel is present in DFS channel list with NOP == 0 */
for (DfsChnIdx = 0; DfsChnIdx < pDfsParam->ChannelListNum; DfsChnIdx++) {
if (pChCtrl->ChList[ChnIdx].Channel == pDfsParam->DfsChannelList[DfsChnIdx].Channel) {
if (pDfsParam->DfsChannelList[DfsChnIdx].NonOccupancy == 0)
ChannelFound = TRUE;
break;
}
}
/* If channel is found to be DFS with NOP = 0 or it is non DFS channel, then get the current channel */
if (ChannelFound ||
(DfsChnIdx == pDfsParam->ChannelListNum)) {
first_channel = pChCtrl->ChList[ChnIdx].Channel;
break;
}
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("Skip scanning channel %u due to remaining %u sec NOP\n",
pChCtrl->ChList[ChnIdx].Channel, pDfsParam->DfsChannelList[DfsChnIdx].NonOccupancy));
}
return first_channel;
#else
return pChCtrl->ChList[0].Channel;
#endif /* MT_DFS_SUPPORT */
}
@ -467,9 +515,16 @@ UCHAR NextChannel(
struct wifi_dev *wdev)
{
int i;
#ifdef MT_DFS_SUPPORT
int DfsChnIdx;
#endif /* MT_DFS_SUPPORT */
UCHAR next_channel = 0;
UCHAR BandIdx = HcGetBandByWdev(wdev);
CHANNEL_CTRL *pChCtrl = hc_get_channel_ctrl(pAd->hdev_ctrl, BandIdx);
#ifdef MT_DFS_SUPPORT
PDFS_PARAM pDfsParam = &pAd->CommonCfg.DfsParameter;
BOOLEAN ChannelFound = FALSE;
#endif /* MT_DFS_SUPPORT */
for (i = 0; i < (pChCtrl->ChListNum - 1); i++) {
if (channel == pChCtrl->ChList[i].Channel) {
@ -485,9 +540,32 @@ UCHAR NextChannel(
#endif /* DOT11N_DRAFT3 */
#endif /* DOT11_N_SUPPORT */
{
#ifdef MT_DFS_SUPPORT
/* For each channel from pChCtrl->ChList[i], check if the channel is present in DFS channel list with NOP == 0 */
for (DfsChnIdx = 0; DfsChnIdx < pDfsParam->ChannelListNum; DfsChnIdx++) {
if (pChCtrl->ChList[i + 1].Channel == pDfsParam->DfsChannelList[DfsChnIdx].Channel) {
if (pDfsParam->DfsChannelList[DfsChnIdx].NonOccupancy == 0)
ChannelFound = TRUE;
break;
}
}
/* If channel is found to be DFS with NOP = 0 or it is non DFS channel, then get the current channel */
if (ChannelFound ||
(DfsChnIdx == pDfsParam->ChannelListNum)) {
next_channel = pChCtrl->ChList[i + 1].Channel;
break;
}
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("Skip scanning channel %u due to remaining %u sec NOP\n",
pChCtrl->ChList[i + 1].Channel, pDfsParam->DfsChannelList[DfsChnIdx].NonOccupancy));
channel = pChCtrl->ChList[i + 1].Channel;
#else
/* Record this channel's idx in ChannelList array.*/
next_channel = pChCtrl->ChList[i + 1].Channel;
break;
#endif /* MT_DFS_SUPPORT */
}
}
}
@ -599,6 +677,9 @@ CHAR ConvertToRssi(RTMP_ADAPTER *pAd, struct raw_rssi_info *rssi_info, UCHAR rss
CHAR ConvertToSnr(RTMP_ADAPTER *pAd, UCHAR Snr)
{
#if defined(CUSTOMER_DCC_FEATURE) || defined(CONFIG_MAP_SUPPORT)
return Snr;
#else
CHAR ret = 0;
struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl);
@ -612,8 +693,41 @@ CHAR ConvertToSnr(RTMP_ADAPTER *pAd, UCHAR Snr)
ret = ((0xeb - Snr) * 3) / 16;
return ret;
}
#endif
}
static UINT8 ch_offset_abs(UINT8 x, UINT8 y)
{
if (x > y)
return x - y;
else
return y - x;
}
#ifdef BW_VENDOR10_CUSTOM_FEATURE
/* BW Sync when Soft AP is Down */
BOOLEAN CheckSoftAPSyncRequired(RTMP_ADAPTER *pAd, struct wifi_dev *wdev_ap, BCN_IE_LIST *ie_list)
{
/* Soft AP must be disabled */
if (wlan_operate_get_state(wdev_ap) != WLAN_OPER_STATE_INVALID)
return FALSE;
if (WMODE_CAP_N(wdev_ap->PhyMode) && ie_list->AddHtInfoLen != 0 && wdev_ap->channel < 14) {
if (wlan_operate_get_ht_bw(wdev_ap) != ie_list->AddHtInfo.AddHtInfo.RecomWidth)
wdev_sync_ht_bw(pAd, wdev_ap, &ie_list->AddHtInfo.AddHtInfo);
}
if (WMODE_CAP_AC(wdev_ap->PhyMode)) {
if (wlan_operate_get_vht_bw(wdev_ap) != ie_list->vht_op_ie.vht_op_info.ch_width)
wdev_sync_vht_bw(pAd, wdev_ap, ie_list->vht_op_ie.vht_op_info.ch_width, ie_list->vht_op_ie.vht_op_info.center_freq_1);
}
return TRUE;
}
#endif
BOOLEAN AdjustBwToSyncAp(RTMP_ADAPTER *pAd, BCN_IE_LIST *ie_list, UCHAR Wcid, UCHAR fun_tb_idx)
{
BOOLEAN bAdjust = FALSE;
@ -623,6 +737,22 @@ BOOLEAN AdjustBwToSyncAp(RTMP_ADAPTER *pAd, BCN_IE_LIST *ie_list, UCHAR Wcid, U
UCHAR op_ht_bw;
UCHAR cfg_ht_bw;
UCHAR ExtCha;
#ifdef BW_VENDOR10_CUSTOM_FEATURE
BOOLEAN bAdjustHTBW = FALSE, bAdjustVHTBW = FALSE;
UCHAR softap_op_ht_bw = 0;
UINT_8 i = 0;
BSS_STRUCT *pMbss = NULL;
struct wifi_dev *pwdev = NULL;
/* Soft AP wdev/mbss */
for (i = 0; i < pAd->ApCfg.BssidNum; i++) {
pMbss = &pAd->ApCfg.MBSSID[i];
pwdev = &pAd->ApCfg.MBSSID[i].wdev;
if ((pMbss) && (pwdev) && (pMbss->wdev.wdev_type == WDEV_TYPE_AP))
break;
}
#endif
pEntry = &pAd->MacTab.Content[Wcid];
wdev = pEntry->wdev;
@ -636,7 +766,18 @@ BOOLEAN AdjustBwToSyncAp(RTMP_ADAPTER *pAd, BCN_IE_LIST *ie_list, UCHAR Wcid, U
ExtCha = wlan_operate_get_ext_cha(wdev);
/* BW 40 -> 20 */
#ifdef BW_VENDOR10_CUSTOM_FEATURE
if (pwdev) {
softap_op_ht_bw = wlan_operate_get_ht_bw(pwdev);
MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE,
("[%s] op_ht_bw %d softap_op_bw %d op_ht %d cfg_ht_bw %d\n",
__func__, op_ht_bw, wlan_operate_get_bw(pwdev), wlan_operate_get_ht_bw (pwdev), cfg_ht_bw));
}
if (op_ht_bw == HT_BW_40 || (pwdev && softap_op_ht_bw == HT_BW_40)) {
#else
if (op_ht_bw == HT_BW_40) {
#endif
/* Check if root-ap change BW to 20 */
if ((ie_list->AddHtInfo.AddHtInfo.ExtChanOffset == EXTCHA_NONE &&
ie_list->AddHtInfo.AddHtInfo.RecomWidth == 0)
@ -644,10 +785,22 @@ BOOLEAN AdjustBwToSyncAp(RTMP_ADAPTER *pAd, BCN_IE_LIST *ie_list, UCHAR Wcid, U
bAdjust = TRUE;
Set_Diff_Bw(pAd, Wcid, BW_20, EXTCHA_NONE);
MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, ("FallBack APClient BW to 20MHz\n"));
#ifdef BW_VENDOR10_CUSTOM_FEATURE
/* Sync new BW & Ext Channel for Soft AP */
if (pwdev && IS_SYNC_BW_POLICY_VALID(pAd, TRUE, HT_4020_DOWN_ENBL)) {
MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE,
("[%s] Enter 4020 HT Sync\n", __func__));
wdev_sync_ht_bw(pAd, pwdev, &ie_list->AddHtInfo.AddHtInfo);
bAdjustHTBW = TRUE;
}
#endif
}
/* BW 20 -> 40 */
#ifdef BW_VENDOR10_CUSTOM_FEATURE
} else if ((op_ht_bw == HT_BW_20 || (pwdev && softap_op_ht_bw == HT_BW_20)) && cfg_ht_bw != HT_BW_20) {
#else
} else if (op_ht_bw == HT_BW_20 && cfg_ht_bw != HT_BW_20) {
#endif
/* Check if root-ap change BW to 40 */
if (ie_list->AddHtInfo.AddHtInfo.ExtChanOffset != EXTCHA_NONE &&
ie_list->AddHtInfo.AddHtInfo.RecomWidth == 1 &&
@ -662,6 +815,16 @@ BOOLEAN AdjustBwToSyncAp(RTMP_ADAPTER *pAd, BCN_IE_LIST *ie_list, UCHAR Wcid, U
wlan_operate_set_prim_ch(wdev, wdev->channel);
MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, ("FallBack Client/APClient BW to 40MHz\n"));
}
#ifdef BW_VENDOR10_CUSTOM_FEATURE
/* Sync new BW & Ext Channel for Soft AP */
if (pwdev && IS_SYNC_BW_POLICY_VALID(pAd, TRUE, HT_2040_UP_ENBL)) {
MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE,
("[%s] Enter 2040 HT Sync\n", __func__));
wdev_sync_ht_bw(pAd, pwdev, &ie_list->AddHtInfo.AddHtInfo);
bAdjustHTBW = TRUE;
}
#endif
}
}
@ -699,11 +862,37 @@ BOOLEAN AdjustBwToSyncAp(RTMP_ADAPTER *pAd, BCN_IE_LIST *ie_list, UCHAR Wcid, U
if (WMODE_CAP_AC(wdev->PhyMode)) {
UCHAR current_operating_mode = 0;
UCHAR prev_operating_mode = 0;
#ifdef BW_VENDOR10_CUSTOM_FEATURE
UCHAR softap_prev_op_mode = 0;
#endif
UCHAR current_nss;
UINT8 p80ccf = ie_list->vht_op_ie.vht_op_info.center_freq_1;
UINT8 s80160ccf = ie_list->vht_op_ie.vht_op_info.center_freq_2;
UCHAR Operting_BW = wlan_operate_get_vht_bw(wdev);
UCHAR AP_Operting_BW = ie_list->vht_op_ie.vht_op_info.ch_width;
P_RA_ENTRY_INFO_T pRaEntry = &pEntry->RaEntry;
BOOLEAN force_ra_update = FALSE;
#ifdef BW_VENDOR10_CUSTOM_FEATURE
if (pwdev) {
/* Beacon Sync Scenario */
if (wlan_operate_get_ht_bw(pwdev) == BW_20)
softap_prev_op_mode = BW_20;
else if (wlan_operate_get_vht_bw(pwdev) == VHT_BW_2040)
softap_prev_op_mode = 1; /*40Mhz*/
else if (wlan_operate_get_vht_bw(pwdev) == VHT_BW_80)
softap_prev_op_mode = 2; /*80Mhz*/
else if ((wlan_operate_get_vht_bw(pwdev) == VHT_BW_160) ||
(wlan_operate_get_vht_bw(pwdev) == VHT_BW_8080))
softap_prev_op_mode = 3; /*80_80,160Mhz*/
MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE,
("[%s] ApCli Wdev %d AP Wdev %d AP BW %d\n",
__func__, wdev->wdev_idx, pwdev->wdev_idx, softap_prev_op_mode));
}
#endif
if ((ie_list->AddHtInfo.AddHtInfo.ExtChanOffset == EXTCHA_NONE &&
ie_list->AddHtInfo.AddHtInfo.RecomWidth == 0))
current_operating_mode = 0; /*20Mhz*/
@ -711,7 +900,28 @@ BOOLEAN AdjustBwToSyncAp(RTMP_ADAPTER *pAd, BCN_IE_LIST *ie_list, UCHAR Wcid, U
if (ie_list->vht_op_ie.vht_op_info.ch_width == VHT_BW_2040) {
current_operating_mode = 1; /*40Mhz*/
} else if (ie_list->vht_op_ie.vht_op_info.ch_width == VHT_BW_80) {
current_operating_mode = 2; /*80Mhz*/
if (Operting_BW == VHT_BW_80)
current_operating_mode = 2; /*80Mhz*/
else if (Operting_BW > VHT_BW_80) {
if (s80160ccf == 0)
current_operating_mode = 2; /*80Mhz*/
else if (ch_offset_abs(s80160ccf, p80ccf) == 8) {
AP_Operting_BW = VHT_BW_160;
current_operating_mode = 3; /*160Mhz*/
} else if (ch_offset_abs(s80160ccf, p80ccf) >= 16) {
AP_Operting_BW = VHT_BW_8080;
current_operating_mode = 3; /*80_80*/
if (wlan_operate_get_cen_ch_2(wdev) != s80160ccf) {
wlan_operate_set_cen_ch_2(wdev, s80160ccf);
force_ra_update = TRUE;
}
}
}
#ifdef BW_VENDOR10_CUSTOM_FEATURE
/* Current Op BW = 20/40 */
else if (Operting_BW == VHT_BW_2040)
current_operating_mode = 2;
#endif
} else if ((ie_list->vht_op_ie.vht_op_info.ch_width == VHT_BW_160) ||
(ie_list->vht_op_ie.vht_op_info.ch_width == VHT_BW_8080)) {
current_operating_mode = 3; /*80_80,160Mhz*/
@ -742,22 +952,58 @@ BOOLEAN AdjustBwToSyncAp(RTMP_ADAPTER *pAd, BCN_IE_LIST *ie_list, UCHAR Wcid, U
(pRaEntry->vhtOpModeRxNss != pEntry->operating_mode.rx_nss) ||
(pRaEntry->vhtOpModeRxNssType != pEntry->operating_mode.rx_nss_type))) {
force_ra_update = TRUE;
#ifdef BW_VENDOR10_CUSTOM_FEATURE
} else if ((prev_operating_mode != current_operating_mode) || (pwdev && (softap_prev_op_mode != current_operating_mode))) {
MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE,
("BW Diff (apcli previous= %d softap previous= %d current=%d)\n",
prev_operating_mode, softap_prev_op_mode, current_operating_mode));
#else
} else if (prev_operating_mode != current_operating_mode) {
MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_ERROR,
("BW Diff (previous= %d current=%d)\n",
prev_operating_mode, current_operating_mode));
#endif
pEntry->operating_mode.ch_width = current_operating_mode;
pEntry->operating_mode.rx_nss = current_nss;
pEntry->force_op_mode = TRUE;
force_ra_update = TRUE;
#ifdef BW_VENDOR10_CUSTOM_FEATURE
/* Sync new HT BW & Ext Channel for Soft AP */
if (pwdev && (current_operating_mode == 0 && (prev_operating_mode >= 1 || softap_prev_op_mode >= 1) && ie_list->AddHtInfo.AddHtInfo.RecomWidth == 0)
&& IS_SYNC_BW_POLICY_VALID(pAd, TRUE, HT_4020_DOWN_ENBL)) {
MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, ("[%s] Enter 4020 HT Sync\n", __func__));
bAdjustHTBW = TRUE;
} else if (pwdev && (current_operating_mode >= 1 && (prev_operating_mode == 0 || softap_prev_op_mode == 0) && ie_list->AddHtInfo.AddHtInfo.RecomWidth == 1)
&& IS_SYNC_BW_POLICY_VALID(pAd, TRUE, HT_2040_UP_ENBL)) {
MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, ("[%s] Enter 2040 HT Sync\n", __func__));
bAdjustHTBW = TRUE;
}
/* Sync new VHT BW & Ext Channel for Soft AP */
if (pwdev && ((prev_operating_mode == 2 || softap_prev_op_mode == 2) && current_operating_mode <= 1)
&& IS_SYNC_BW_POLICY_VALID(pAd, FALSE, VHT_80_2040_DOWN_CHK)) {
MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, ("[%s] Enter 80-2040 VHT Sync\n", __func__));
bAdjustVHTBW = TRUE;
} else if (pwdev && ((prev_operating_mode <= 1 || softap_prev_op_mode <= 1) && current_operating_mode == 2)
&& IS_SYNC_BW_POLICY_VALID(pAd, FALSE, VHT_2040_80_UP_CHK)) {
MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, ("[%s] Enter 2040-80 VHT Sync\n", __func__));
bAdjustVHTBW = TRUE;
}
#endif
}
if (force_ra_update) {
CMD_STAREC_AUTO_RATE_UPDATE_T rRaParam;
if (current_operating_mode == 0)
wlan_operate_set_ht_bw(wdev, HT_BW_20, EXTCHA_NONE);
wlan_operate_set_vht_bw(wdev, ie_list->vht_op_ie.vht_op_info.ch_width);
MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_ERROR,
wlan_operate_set_vht_bw(wdev, AP_Operting_BW);
#ifdef BW_VENDOR10_CUSTOM_FEATURE
if (bAdjustHTBW)
wdev_sync_ht_bw(pAd, pwdev, &ie_list->AddHtInfo.AddHtInfo);
if (bAdjustVHTBW)
wdev_sync_vht_bw(pAd, pwdev, AP_Operting_BW, p80ccf);
#endif
MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE,
("RA Param Update:ChWidth %d,Rxnss %d\n",
pEntry->operating_mode.ch_width, pEntry->operating_mode.rx_nss));
NdisZeroMemory(&rRaParam, sizeof(CMD_STAREC_AUTO_RATE_UPDATE_T));
@ -766,6 +1012,34 @@ BOOLEAN AdjustBwToSyncAp(RTMP_ADAPTER *pAd, BCN_IE_LIST *ie_list, UCHAR Wcid, U
}
}
#endif
#ifdef BW_VENDOR10_CUSTOM_FEATURE
/* Add check to skip sync, if already done */
if (!(bAdjustHTBW || bAdjustVHTBW) && IS_APCLI_BW_SYNC_FEATURE_ENBL(pAd) && pwdev)
/* Soft AP Interface Down Handling */
CheckSoftAPSyncRequired(pAd, pwdev, ie_list);
if ((bAdjustHTBW || bAdjustVHTBW) && (IS_APCLI_SYNC_PEER_DEAUTH_ENBL(pAd) == FALSE)) {
if (IS_APCLI_SYNC_PEER_DEAUTH_VALID(pAd) && IsClientConnected(pAd)) {
SET_APCLI_SYNC_PEER_DEAUTH_ENBL(pAd, TRUE);
if (IS_APCLI_SYNC_BAND_VALID(pAd, DIFF_BAND_SYNC)) {
/* Both 2G/5G Bands Soft AP Clients Disconnect */
APStop(pAd, pMbss, AP_BSS_OPER_ALL);
APStartUp(pAd, pMbss, AP_BSS_OPER_ALL);
} else if (IS_APCLI_SYNC_BAND_VALID(pAd, SAME_BAND_SYNC)) {
/* Same Band SoftAP Clients Disconnect */
APStop(pAd, pMbss, AP_BSS_OPER_BY_RF);
APStartUp(pAd, pMbss, AP_BSS_OPER_BY_RF);
}
SET_APCLI_SYNC_PEER_DEAUTH_ENBL(pAd, FALSE);
} else {
/* Soft AP Clients Disconnect Disable Case */
UpdateBeaconHandler(pAd, pwdev, BCN_UPDATE_IE_CHG);
/* Same Band Client BW Update */
}
}
#endif
#endif /* DOT11_N_SUPPORT */
return bAdjust;

View File

@ -30,7 +30,8 @@
#include "rt_config.h"
#include "hdev/hdev.h"
#include <linux/mtd/mtd.h>
#include <linux/mtd/partitions.h>
/*decision flash api by compiler flag*/
#ifdef CONFIG_PROPRIETARY_DRIVER
/*
@ -111,9 +112,8 @@ extern int ra_mtd_read(int num, loff_t from, size_t len, u_char *buf);
int mt_mtd_write_nm_wifi(char *name, loff_t to, size_t len, const u_char *buf);
int mt_mtd_read_nm_wifi(char *name, loff_t from, size_t len, u_char *buf);
#define flash_read(_ctrl, _ptr, _offset, _len) mt_mtd_read_nm_wifi("Factory", _offset, (size_t)_len, _ptr)
#define flash_write(_ctrl, _ptr, _offset, _len) mt_mtd_write_nm_wifi("Factory", _offset, (size_t)_len, _ptr)
#define flash_read(_ctrl, _ptr, _offset, _len) mt_mtd_read_nm_wifi("factory", _offset&0xFFFF, (size_t)_len, _ptr)
#define flash_write(_ctrl, _ptr, _offset, _len) mt_mtd_write_nm_wifi("factory", _offset&0xFFFF, (size_t)_len, _ptr)
#else
/*
* @ use sdk export func.
@ -122,8 +122,8 @@ int mt_mtd_read_nm_wifi(char *name, loff_t from, size_t len, u_char *buf);
extern int ra_mtd_write_nm(char *name, loff_t to, size_t len, const u_char *buf);
extern int ra_mtd_read_nm(char *name, loff_t from, size_t len, u_char *buf);
#define flash_read(_ctrl, _ptr, _offset, _len) ra_mtd_read_nm("Factory", _offset, (size_t)_len, _ptr)
#define flash_write(_ctrl, _ptr, _offset, _len) ra_mtd_write_nm("Factory", _offset, (size_t)_len, _ptr)
#define flash_read(_ctrl, _ptr, _offset, _len) ra_mtd_read_nm("factory", _offset&0xFFFF, (size_t)_len, _ptr)
#define flash_write(_ctrl, _ptr, _offset, _len) ra_mtd_write_nm("factory", _offset&0xFFFF, (size_t)_len, _ptr)
#endif /*CONFIG_WIFI_MTD*/
#endif /*RA_MTD_RW_BY_NUM*/
@ -137,7 +137,14 @@ void RtmpFlashRead(
ULONG a,
ULONG b)
{
flash_read(hdev_ctrl, p, a, b);
size_t retlen;
struct mtd_info *mtd_info = get_mtd_device_nm("factory");
if (IS_ERR(mtd_info) || mtd_info == NULL) {
printk("ERROR: failed to find 'Factory' mtd partiton\n");
return;
}
mtd_read(mtd_info, a, b, &retlen, p);
put_mtd_device(mtd_info);
}
void RtmpFlashWrite(
@ -146,7 +153,14 @@ void RtmpFlashWrite(
ULONG a,
ULONG b)
{
flash_write(hdev_ctrl, p, a, b);
size_t retlen;
struct mtd_info *mtd_info = get_mtd_device_nm("factory");
if (IS_ERR(mtd_info) || mtd_info == NULL) {
printk("ERROR: failed to find 'Factory' mtd partiton\n");
return;
}
mtd_write(mtd_info, a, b, &retlen, p);
put_mtd_device(mtd_info);
}

View File

@ -38,14 +38,31 @@
#if defined(PRE_CAL_TRX_SET1_SUPPORT) || defined(PRE_CAL_TRX_SET2_SUPPORT) || defined(RLM_CAL_CACHE_SUPPORT)
#ifdef CONFIG_RT_FIRST_CARD
#ifdef INTELP6_SUPPORT
#define FIRST_CAL_FILE_PATH "/nvram/MT7615_CALDATA1.bin"
#else
#define FIRST_CAL_FILE_PATH "/etc_ro/Wireless/RT2860/CALDATA1.bin"
#endif
#endif
#ifdef CONFIG_RT_SECOND_CARD
#ifdef INTELP6_SUPPORT
#define SECOND_CAL_FILE_PATH "/nvram/MT7615_CALDATA2.bin"
#else
#define SECOND_CAL_FILE_PATH "/etc_ro/Wireless/iNIC/CALDATA2.bin"
#endif
#endif
#endif /* PRE_CAL_TRX_SET1_SUPPORT */
#if defined(CAL_BIN_FILE_SUPPORT) && defined(MT7615)
#ifdef CONFIG_RT_FIRST_CARD
#define FIRST_CAL_BIN_FILE_PATH "/etc_ro/Wireless/RT2860AP/CALIBRATION_DATA_1.bin"
#endif /* CONFIG_RT_FIRST_CARD */
#ifdef CONFIG_RT_SECOND_CARD
#define SECOND_CAL_BIN_FILE_PATH "/etc_ro/Wireless/iNIC/CALIBRATION_DATA_2.bin"
#endif /* CONFIG_RT_SECOND_CARD */
#endif /* CAL_BIN_FILE_SUPPORT */
struct chip_map {
UINT32 ChipVersion;
@ -193,6 +210,37 @@ INT rtmp_read_txpwr_from_eeprom(RTMP_ADAPTER *pAd)
}
static INT32 checkAntCapSanity(RTMP_ADAPTER *ad)
{
UCHAR tx_ant_cap = 0, rx_ant_cap = 0;
UCHAR efuse_value;
struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(ad->hdev_ctrl);
if (cap->max_nss > 0) {
efuse_value = ad->EEPROMImage[EEPROM_NIC1_OFFSET];
tx_ant_cap = (efuse_value >> 4) & 0xf;
rx_ant_cap = efuse_value & 0xf;
efuse_value = 0;
if (tx_ant_cap != 0)
efuse_value |= min(tx_ant_cap, cap->max_nss) << 4;
else
efuse_value |= cap->max_nss << 4;
if (rx_ant_cap != 0)
efuse_value |= min(rx_ant_cap, cap->max_nss);
else
efuse_value |= cap->max_nss;
ad->EEPROMImage[EEPROM_NIC1_OFFSET] = efuse_value;
}
return 0;
}
/*
========================================================================
@ -218,9 +266,15 @@ INT NICReadEEPROMParameters(RTMP_ADAPTER *pAd, RTMP_STRING *mac_addr)
EEPROM_ANTENNA_STRUC Antenna;
EEPROM_NIC_CONFIG2_STRUC NicConfig2;
USHORT Addr01, Addr23, Addr45;
#ifdef PRE_CAL_TRX_SET2_SUPPORT
UINT16 PreCalSize;
#endif /* PRE_CAL_TRX_SET2_SUPPORT */
#if defined(PRE_CAL_TRX_SET2_SUPPORT) || defined(PRE_CAL_MT7622_SUPPORT)
UINT16 DoPreCal = 0;
#endif /* PRE_CAL_TRX_SET2_SUPPORT */
#if defined(CAL_BIN_FILE_SUPPORT) && defined(MT7615)
UINT16 DoPATrim = 0;
#endif /* CAL_BIN_FILE_SUPPORT */
struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(pAd->hdev_ctrl);
#ifdef PRE_CAL_MT7622_SUPPORT
@ -235,6 +289,7 @@ INT NICReadEEPROMParameters(RTMP_ADAPTER *pAd, RTMP_STRING *mac_addr)
#else
/* If we are run in Multicard mode */
ops->eeinit(pAd);
checkAntCapSanity(pAd);
#endif /*WCX_SUPPORT */
#ifdef RF_LOCKDOWN
@ -250,21 +305,33 @@ INT NICReadEEPROMParameters(RTMP_ADAPTER *pAd, RTMP_STRING *mac_addr)
}
#ifdef PRE_CAL_MT7622_SUPPORT
/* Check DoPreCal bits */
RT28xx_EEPROM_READ16(pAd, 0x52, DoPreCal);
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF,
("\x1b[34m%s: EEPROM 0x52 %x\x1b[m\n", __func__, DoPreCal));
if (pAd->E2pAccessMode == E2P_FLASH_MODE) {
if (DoPreCal & (1 << 3)) {
MtCmdSetTxLpfCal_7622(pAd);
MtCmdSetTxDcIqCal_7622(pAd);
for (ch = 1; ch < 14; ch++)
MtCmdSetTxDpdCal_7622(pAd, ch);
if (IS_MT7622(pAd)) {
/* Check DoPreCal bits */
RT28xx_EEPROM_READ16(pAd, 0x52, DoPreCal);
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF,
("\x1b[34m%s: EEPROM 0x52 %x\x1b[m\n", __func__, DoPreCal));
if (pAd->E2pAccessMode == E2P_FLASH_MODE) {
if (DoPreCal & (1 << 3)) {
MtCmdSetTxLpfCal_7622(pAd);
MtCmdSetTxDcIqCal_7622(pAd);
for (ch = 1; ch < 14; ch++)
MtCmdSetTxDpdCal_7622(pAd, ch);
}
}
}
#endif /*PRE_CAL_MT7622_SUPPORT*/
#ifdef PRE_CAL_TRX_SET2_SUPPORT
PreCalSize = PRE_CAL_SIZE_ONE_CARD;
#ifdef CONFIG_RALINK_MT7621
/* Litmit PreCalSize to 12k for MT7622 + MT7615 + MT7615 */
#ifdef MULTI_INF_SUPPORT
if (multi_inf_get_count() >= 2)
PreCalSize = PRE_CAL_SIZE_DUAL_CARD;
#endif /*MULTI_INF_SUPPORT*/
#endif /*CONFIG_RALINK_MT7621*/
/* Check DoPreCal bits */
RT28xx_EEPROM_READ16(pAd, 0x52, DoPreCal);
@ -277,7 +344,7 @@ INT NICReadEEPROMParameters(RTMP_ADAPTER *pAd, RTMP_STRING *mac_addr)
if (!rlmCalCacheDone(pAd->rlmCalCache) && (DoPreCal & (1 << 2))) {
INT32 ret = 0;
INT32 ret_cal_data = NDIS_STATUS_SUCCESS;
ret = os_alloc_mem(pAd, &pAd->PreCalReStoreBuffer, PRE_CAL_SIZE);/* Allocate 16K buffer*/
ret = os_alloc_mem(pAd, &pAd->PreCalReStoreBuffer, PreCalSize);/* Allocate 16K buffer*/
if (ret != NDIS_STATUS_SUCCESS) {
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR,
@ -287,11 +354,11 @@ INT NICReadEEPROMParameters(RTMP_ADAPTER *pAd, RTMP_STRING *mac_addr)
#ifdef RTMP_FLASH_SUPPORT
if (pAd->E2pAccessMode == E2P_FLASH_MODE)
RtmpFlashRead(pAd->hdev_ctrl, pAd->PreCalReStoreBuffer,
get_dev_eeprom_offset(pAd) + PRECALPART_OFFSET, PRE_CAL_SIZE);
get_dev_eeprom_offset(pAd) + PRECALPART_OFFSET, PreCalSize);
#endif /* RTMP_FLASH_SUPPORT */
if (pAd->E2pAccessMode == E2P_BIN_MODE) {
ret_cal_data = rtmp_cal_load_from_bin(pAd, pAd->PreCalReStoreBuffer, PRECALPART_OFFSET,
PRE_CAL_SIZE);
PreCalSize);
if (ret_cal_data != NDIS_STATUS_SUCCESS) {
/* Erase DoPreCal bit */
@ -313,6 +380,30 @@ INT NICReadEEPROMParameters(RTMP_ADAPTER *pAd, RTMP_STRING *mac_addr)
RT28xx_EEPROM_WRITE16(pAd, 0x52, DoPreCal);
}
#endif /* PRE_CAL_TRX_SET2_SUPPORT */
#if defined(CAL_BIN_FILE_SUPPORT) && defined(MT7615)
if (IS_MT7615(pAd)) {
/* Check DoPATrim bits */
RT28xx_EEPROM_READ16(pAd, 0x52, DoPATrim);
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF,
("\x1b[34m%s: EEPROM 0x52 %x\x1b[m\n", __func__, DoPATrim));
/* Restore PA data when EEPROM 0x52[3]=1 */
if (DoPATrim & (1 << 3)) {
INT32 Status = NDIS_STATUS_FAILURE;
Status = MtCmdCalReStoreFromFileProc(pAd, CAL_RESTORE_PA_TRIM);
if (Status != NDIS_STATUS_SUCCESS) {
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR,
("\x1b[41m%s : Fail to restore PA data!!\x1b[m\n", __func__));
}
}
}
#endif /* CAL_BIN_FILE_SUPPORT */
#ifdef MT_DFS_SUPPORT /*Dynamically enable or disable DFS calibration in firmware. Must be performed before power on calibration*/
DfsSetCalibration(pAd, pAd->CommonCfg.DfsParameter.DisableDfsCal);
#endif
@ -606,7 +697,7 @@ static NDIS_STATUS rtmp_ee_bin_init(PRTMP_ADAPTER pAd)
printk("%s(): bDCOCReloaded = false.\n", __func__);
if ((NDIS_STATUS_SUCCESS ==
rtmp_cal_load_from_bin(pAd, pAd->CalDPDAPart1Image, DPDPART1_OFFSET, TXDPD_IMAGE1_SIZE)) ||
rtmp_cal_load_from_bin(pAd, pAd->CalDPDAPart1Image, DPDPART1_OFFSET, TXDPD_IMAGE1_SIZE)) &&
(NDIS_STATUS_SUCCESS ==
rtmp_cal_load_from_bin(pAd, pAd->CalDPDAPart2Image, DPDPART2_OFFSET, TXDPD_IMAGE2_SIZE)))
pAd->bDPDReloaded = TRUE;
@ -646,7 +737,7 @@ INT RtmpChipOpsEepromHook(RTMP_ADAPTER *pAd, INT infType, INT forceMode)
efuse_probe(pAd);
#endif /* RTMP_EFUSE_SUPPORT */
/* rtmp_eeprom_of_platform(pAd); //for MT7615, only use E2pAccessMode parameter to get eeprom type */
rtmp_eeprom_of_platform(pAd);
if (forceMode != E2P_NONE && forceMode < NUM_OF_E2P_MODE) {
e2p_type = forceMode;
@ -1061,6 +1152,182 @@ NDIS_STATUS rtmp_cal_write_to_bin(
}
#endif /* PRE_CAL_TRX_SET1_SUPPORT */
#if defined(CAL_BIN_FILE_SUPPORT) && defined(MT7615)
INT Cal_Data_Write_To_Bin(
IN PRTMP_ADAPTER pAd,
IN UINT8 *Buf,
IN UINT32 Offset,
IN UINT32 Len)
{
INT32 retval, Status = NDIS_STATUS_FAILURE;
RTMP_STRING *pSrc = NULL;
RTMP_OS_FD pSrcf;
RTMP_OS_FS_INFO osFSInfo;
if (IS_MT7615(pAd)) {
#ifdef CONFIG_RT_FIRST_CARD
if (pAd->dev_idx == 0) {
pSrc = FIRST_CAL_BIN_FILE_PATH;
} else
#endif /* CONFIG_RT_FIRST_CARD */
#ifdef CONFIG_RT_SECOND_CARD
if (pAd->dev_idx == 1) {
pSrc = SECOND_CAL_BIN_FILE_PATH;
} else {
#endif /* CONFIG_RT_SECOND_CARD */
pSrc = CAL_BIN_FILE_PATH;
#ifdef CONFIG_RT_SECOND_CARD
}
#endif /* CONFIG_RT_SECOND_CARD */
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE,
("\x1b[32m%s: FileName = %s\x1b[m\n", __func__, pSrc));
/* Change limits of authority in order to read/write file */
RtmpOSFSInfoChange(&osFSInfo, TRUE);
/* Create file descriptor */
pSrcf = RtmpOSFileOpen(pSrc, O_WRONLY|O_CREAT, 0);
if (IS_FILE_OPEN_ERR(pSrcf)) {
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR,
("\x1b[41m%s: Error opening %s\x1b[m\n", __func__, pSrc));
goto error;
}
RtmpOSFileSeek(pSrcf, Offset);
retval = RtmpOSFileWrite(pSrcf, (RTMP_STRING *)Buf, Len);
if (retval < 0) {
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR,
("\x1b[41m%s : Fail to write data to %s !!\x1b[m\n", __func__, pSrc));
goto error;
}
/* Close file descriptor */
if (!IS_FILE_OPEN_ERR(pSrcf)) {
retval = RtmpOSFileClose(pSrcf);
if (retval) {
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR,
("\x1b[41m%s: Error %d closing %s\x1b[m\n", __func__, -retval, pSrc));
goto error;
}
}
/* Change limits of authority in order to read/write file */
RtmpOSFSInfoChange(&osFSInfo, FALSE);
/* Update status */
Status = NDIS_STATUS_SUCCESS;
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF,
("\x1b[42m%s: Store data to %s done !!\x1b[m \n", __func__, pSrc));
return Status;
error:
/* Close file descriptor */
if (!IS_FILE_OPEN_ERR(pSrcf)) {
retval = RtmpOSFileClose(pSrcf);
if (retval) {
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR,
("\x1b[41m%s: Error %d closing %s\x1b[m\n", __func__, -retval, pSrc));
}
}
/* Change limits of authority in order to read/write file */
RtmpOSFSInfoChange(&osFSInfo, FALSE);
}
return Status;
}
INT Cal_Data_Load_From_Bin(
IN PRTMP_ADAPTER pAd,
IN UINT8 *Buf,
IN UINT32 Offset,
IN UINT32 Len)
{
INT32 retval, Status = NDIS_STATUS_FAILURE;
RTMP_STRING *pSrc = NULL;
RTMP_OS_FD pSrcf;
RTMP_OS_FS_INFO osFSInfo;
if (IS_MT7615(pAd)) {
#ifdef CONFIG_RT_FIRST_CARD
if (pAd->dev_idx == 0) {
pSrc = FIRST_CAL_BIN_FILE_PATH;
} else
#endif /* CONFIG_RT_FIRST_CARD */
#ifdef CONFIG_RT_SECOND_CARD
if (pAd->dev_idx == 1) {
pSrc = SECOND_CAL_BIN_FILE_PATH;
} else {
#endif /* CONFIG_RT_SECOND_CARD */
pSrc = CAL_BIN_FILE_PATH;
#ifdef CONFIG_RT_SECOND_CARD
}
#endif /* CONFIG_RT_SECOND_CARD */
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE,
("\x1b[32m%s: FileName = %s\x1b[m\n", __func__, pSrc));
/* Change limits of authority in order to read/write file */
RtmpOSFSInfoChange(&osFSInfo, TRUE);
/* Create file descriptor */
pSrcf = RtmpOSFileOpen(pSrc, O_RDONLY, 0);
if (IS_FILE_OPEN_ERR(pSrcf)) {
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR,
("\x1b[41m%s: Error opening %s\x1b[m\n", __func__, pSrc));
goto error;
}
RtmpOSFileSeek(pSrcf, Offset);
retval = RtmpOSFileRead(pSrcf, (RTMP_STRING *)Buf, Len);
if (retval < 0) {
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR,
("\x1b[41m%s : Fail to load data from %s !!\x1b[m\n", __func__, pSrc));
goto error;
}
/* Close file descriptor */
if (!IS_FILE_OPEN_ERR(pSrcf)) {
retval = RtmpOSFileClose(pSrcf);
if (retval) {
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR,
("\x1b[41m%s: Error %d closing %s\x1b[m\n", __func__, -retval, pSrc));
goto error;
}
}
/* Change limits of authority in order to read/write file */
RtmpOSFSInfoChange(&osFSInfo, FALSE);
/* Update status */
Status = NDIS_STATUS_SUCCESS;
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF,
("\x1b[42m%s : Load data from %s success!!\x1b[m\n", __func__, pSrc));
return Status;
error:
/* Close file descriptor */
if (!IS_FILE_OPEN_ERR(pSrcf)) {
retval = RtmpOSFileClose(pSrcf);
if (retval) {
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR,
("\x1b[41m%s: Error %d closing %s\x1b[m\n", __func__, -retval, pSrc));
}
}
/* Change limits of authority in order to read/write file */
RtmpOSFSInfoChange(&osFSInfo, FALSE);
}
return Status;
}
#endif/* CAL_BIN_FILE_SUPPORT */
INT rtmp_ee_write_to_bin(
IN PRTMP_ADAPTER pAd)
{

View File

@ -239,11 +239,11 @@ VOID fp_fair_tx_pkt_deq_func(RTMP_ADAPTER *pAd)
PKT_TOKEN_CB *pktTokenCb = (PKT_TOKEN_CB *)pAd->PktTokenCb;
UINT32 idx = 0;
struct wifi_dev *wdev = NULL;
STA_TR_ENTRY *tr_entry;
STA_TR_ENTRY *tr_entry = NULL;
struct wifi_dev_ops *wdev_ops;
RTMP_ARCH_OP *arch_ops = &pAd->archOps;
BOOLEAN need_schedule = (pAd->tx_dequeue_scheduable ? TRUE : FALSE);
UCHAR user_prio;
UCHAR user_prio = 0;
BOOLEAN data_turn = FALSE;
struct dequeue_info deq_info = {0};
#ifdef CONFIG_TP_DBG

View File

@ -68,31 +68,58 @@ INT8 GetDscpMappedPriority(
UINT8 dscpVal = 0;
PUCHAR pPktHdr = NULL;
UINT16 protoType;
struct wifi_dev *wdev;
pPktHdr = GET_OS_PKT_DATAPTR(pPkt);
if (!pPktHdr)
return pri;
protoType = OS_NTOHS(get_unaligned((PUINT16)(pPktHdr + 12)));
pPktHdr += LENGTH_802_3;
if (protoType <= 1500) {
/* 802.3, 802.3 LLC: DestMAC(6) + SrcMAC(6) + Length (2) + DSAP(1) + SSAP(1) + Control(1) + */
/* if the DSAP = 0xAA, SSAP=0xAA, Contorl = 0x03, it has a 5-bytes SNAP header.*/
/* => + SNAP (5, OriginationID(3) + etherType(2)) */
/* else */
/* => It just has 3-byte LLC header, maybe a legacy ether type frame. we didn't handle it */
if (pPktHdr[0] == 0xAA && pPktHdr[1] == 0xAA && pPktHdr[2] == 0x03) {
pPktHdr += 6; /* Advance to type LLC 3byte + SNAP OriginationID 3 Byte*/
protoType = OS_NTOHS(get_unaligned((PUINT16)(pPktHdr)));
} else {
return pri;
}
}
/* If it's a VLAN packet, get the real Type/Length field.*/
if (protoType == ETH_TYPE_VLAN) {
pPktHdr += 2; /* Skip the VLAN Header.*/
protoType = OS_NTOHS(get_unaligned((PUINT16)(pPktHdr)));
}
switch (protoType) {
case 0x0800:
dscpVal = ((pPktHdr[15] & 0xfc) >> 2);
dscpVal = ((pPktHdr[1] & 0xfc) >> 2);
break;
case 0x86DD:
dscpVal = (((pPktHdr[14] & 0x0f) << 2) | ((pPktHdr[15] & 0xc0) >> 6));
dscpVal = (((pPktHdr[0] & 0x0f) << 2) | ((pPktHdr[1] & 0xc0) >> 6));
break;
default:
return pri;
}
if (dscpVal <= 63) {
UCHAR wdev_idx = RTMP_GET_PACKET_WDEV(pPkt);
if (wdev_idx < WDEV_NUM_MAX) {
if (pAd->wdev_list[wdev_idx]->channel <= 14) {
pri = pAd->dscp_pri_map[DSCP_PRI_2G_MAP][dscpVal];
} else
pri = pAd->dscp_pri_map[DSCP_PRI_5G_MAP][dscpVal];
}
wdev = get_wdev_by_idx(pAd, wdev_idx);
if (!wdev)
return pri;
pri = pAd->ApCfg.MBSSID[wdev->func_idx].dscp_pri_map[dscpVal];
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("[%s] ApIdx:%d dscp value:%d local PRI:%d\n",
__func__, wdev->func_idx, dscpVal, pri));
}
return pri;
}
#endif
@ -175,8 +202,9 @@ VOID fp_tx_pkt_deq_func(RTMP_ADAPTER *pAd)
pTxBlk->TxFrameType = tx_pkt_classification(pAd, pTxBlk->pPacket, pTxBlk);
pTxBlk->HeaderBuf = arch_ops->get_hif_buf(pAd, pTxBlk, pTxBlk->resource_idx, pTxBlk->TxFrameType);
#ifdef DSCP_PRI_SUPPORT
/*Get the Dscp value of the packet and if there is any mapping defined set the DscpMappedPri value */
pTxBlk->DscpMappedPri = GetDscpMappedPriority(pAd, pkt);
/*Get the Dscp value of the packet and if there is any mapping defined set the DscpMappedPri value */
if (!TX_BLK_TEST_FLAG(pTxBlk, fTX_bApCliPacket))
pTxBlk->DscpMappedPri = GetDscpMappedPriority(pAd, pkt);
#endif
InsertTailQueue(&pTxBlk->TxPacketList, PACKET_TO_QUEUE_ENTRY(pkt));

View File

@ -59,8 +59,8 @@ INT fq_init(RTMP_ADAPTER *pAd)
if ((pAd->fq_ctrl.enable & FQ_EN) == 0)
return 0;
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR,
("Fair Queueing Scheduler Initializatio...\n"));
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF,
("Fair Queueing Scheduler Initialization...\n"));
fq_en = pAd->fq_ctrl.enable;
factor = pAd->fq_ctrl.factor;
os_zero_mem(&pAd->fq_ctrl, sizeof(struct fq_ctrl_type));
@ -135,21 +135,26 @@ INT fq_deinit(RTMP_ADAPTER *pAd)
STA_TR_ENTRY *tr_entry = NULL;
struct fq_stainfo_type *pfq_sta = NULL;
INT i, j;
UINT32 prev_enable;
pAd->fq_ctrl.enable &= ~FQ_READY;
pAd->fq_ctrl.enable &= ~FQ_READY;
prev_enable = pAd->fq_ctrl.enable & (FQ_EN | FQ_NEED_ON);
for (j = 0; j < MAX_LEN_OF_MAC_TABLE ; j++) {
tr_entry = &pAd->MacTab.tr_entry[j];
pfq_sta = &tr_entry->fq_sta_rec;
for (i = 0; i < WMM_NUM_OF_AC; i++) {
for (i = 0; i < WMM_NUM_OF_AC; i++) {
NdisFreeSpinLock(&pfq_sta->lock[i]);
os_zero_mem(pfq_sta, sizeof(struct fq_stainfo_type));
}
}
fq_reset_list_entry(pAd, WMM_NUM_OF_AC, j);
}
}
os_zero_mem(&pAd->fq_ctrl, sizeof(struct fq_ctrl_type));
pAd->fq_ctrl.enable = prev_enable | FQ_NO_PKT_STA_KEEP_IN_LIST | FQ_ARRAY_SCH;
pAd->fq_ctrl.factor = 2;
return 0;
}
@ -1100,7 +1105,7 @@ INT show_fq_info(PRTMP_ADAPTER pAd, RTMP_STRING *arg)
pAd->fq_ctrl.prev_qidx = -1;
if (!pAd->fq_ctrl.enable) {
if ((pAd->fq_ctrl.enable & FQ_EN) == 0) {
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, ("FQ was is Disabled (qm=%d)\n", cap->qm));
return TRUE;
}

View File

@ -421,6 +421,10 @@ VOID FT_CfgInitial(
NdisZeroMemory(pFtCfg->FtR0khId, sizeof(pFtCfg->FtR0khId));
NdisMoveMemory(pFtCfg->FtR0khId, R0khIdBuf, strlen(R0khIdBuf));
pFtCfg->FtR0khIdLen = strlen(R0khIdBuf);
#ifdef HOSTAPD_11R_SUPPORT
NdisZeroMemory(pFtCfg->FtR1khId, MAC_ADDR_LEN);
NdisMoveMemory(pFtCfg->FtR1khId, pAd->ApCfg.MBSSID[apidx].wdev.bssid, MAC_ADDR_LEN);
#endif
}
}
@ -772,8 +776,13 @@ USHORT FT_AssocReqHandler(
ft_len += (2 + pFtInfoBuf->FtIeInfo.R0khIdLen);
/* Prepare in the R1KHID and its length */
pFtInfoBuf->FtIeInfo.R1khIdLen = MAC_ADDR_LEN;
#ifdef HOSTAPD_11R_SUPPORT
NdisMoveMemory(pFtInfoBuf->FtIeInfo.R1khId,
pFtCfg->FtR1khId, MAC_ADDR_LEN);
#else
NdisMoveMemory(pFtInfoBuf->FtIeInfo.R1khId,
pAd->ApCfg.MBSSID[pEntry->func_tb_idx].wdev.bssid, MAC_ADDR_LEN);
#endif /* HOSTAPD_11R_SUPPORT */
ft_len += (2 + MAC_ADDR_LEN);
/* Update the length of FTIE */
pFtInfoBuf->FtIeInfo.Len = ft_len;
@ -1325,12 +1334,22 @@ VOID FT_RrbHandler(
END_OF_ARGS);
/* enqueue it into FT action state machine. */
if (pEntry) {
#if defined(CUSTOMER_DCC_FEATURE) || defined(CONFIG_MAP_SUPPORT)
REPORT_MGMT_FRAME_TO_MLME(pAd, Wcid, pOutBuffer, FrameLen,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, OPMODE_AP, wdev, pEntry->HTPhyMode.field.MODE);
#else
REPORT_MGMT_FRAME_TO_MLME(pAd, Wcid, pOutBuffer, FrameLen,
0, 0, 0, 0, 0, 0, OPMODE_AP, wdev, pEntry->HTPhyMode.field.MODE);
#endif
} else {
/* Report basic phymode if pEntry = NULL */
#if defined(CUSTOMER_DCC_FEATURE) || defined(CONFIG_MAP_SUPPORT)
REPORT_MGMT_FRAME_TO_MLME(pAd, Wcid, pOutBuffer, FrameLen,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, OPMODE_AP, wdev, WMODE_CAP_5G(wdev->PhyMode) ? MODE_OFDM : MODE_CCK);
#else
REPORT_MGMT_FRAME_TO_MLME(pAd, Wcid, pOutBuffer, FrameLen,
0, 0, 0, 0, 0, 0, OPMODE_AP, wdev, WMODE_CAP_5G(wdev->PhyMode) ? MODE_OFDM : MODE_CCK);
#endif
}
if (pOutBuffer)

View File

@ -916,7 +916,7 @@ static VOID FT_OverDs_SimReq(
&FtInfoBuf);
/* enqueue it into FT action state machine. */
#ifdef CUSTOMER_DCC_FEATURE
#if defined(CUSTOMER_DCC_FEATURE) || defined(CONFIG_MAP_SUPPORT)
REPORT_MGMT_FRAME_TO_MLME(pAd, FtEntry->wcid, pOutBuffer, FrameLen, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, OPMODE_AP, &pAd->ApCfg.MBSSID[FtEntry->apidx].wdev, FtEntry->HTPhyMode.field.MODE);
#else
REPORT_MGMT_FRAME_TO_MLME(pAd, FtEntry->wcid, pOutBuffer, FrameLen, 0, 0, 0, 0, 0, 0, OPMODE_AP, &pAd->ApCfg.MBSSID[FtEntry->apidx].wdev, FtEntry->HTPhyMode.field.MODE);

View File

@ -163,17 +163,23 @@ VOID SendGASRsp(
MAC_TABLE_ENTRY *pEntry = NULL;
UCHAR WildcardBssid[MAC_ADDR_LEN] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
GAS_QUERY_RSP_FRAGMENT *GASQueryRspFrag, *GASQueryRspFragTmp;
BOOLEAN bPeerFound = FALSE;
#ifdef CONFIG_HOTSPOT
PHOTSPOT_CTRL pHSCtrl = &pAd->ApCfg.MBSSID[Event->ControlIndex].HotSpotCtrl;
#endif
MTWF_LOG(DBG_CAT_PROTO, CATPROTO_WNM, DBG_LVL_TRACE, ("%s\n", __func__));
RTMP_SEM_LOCK(&pGASCtrl->GASPeerListLock);
DlListForEach(GASPeerEntry, &pGASCtrl->GASPeerList, GAS_PEER_ENTRY, List) {
if (MAC_ADDR_EQUAL(GASPeerEntry->PeerMACAddr, Event->PeerMACAddr))
if (MAC_ADDR_EQUAL(GASPeerEntry->PeerMACAddr, Event->PeerMACAddr)) {
bPeerFound = TRUE;
break;
}
}
RTMP_SEM_UNLOCK(&pGASCtrl->GASPeerListLock);
if (bPeerFound == FALSE)
return;
if (Event->u.GAS_RSP_DATA.AdvertisementProID == ACCESS_NETWORK_QUERY_PROTOCOL) {
/* Advertisement protocol element + Query response length field */
VarLen += 6;
@ -485,11 +491,20 @@ static VOID SendGASCBRsp(
GAS_PEER_ENTRY *GASPeerEntry;
GAS_QUERY_RSP_FRAGMENT *GASQueryRspFrag = NULL, *GASQueryRspFragTmp;
PGAS_CTRL pGASCtrl = &pAd->ApCfg.MBSSID[Event->ControlIndex].GASCtrl;
BOOLEAN bGASQueryRspFragFound = FALSE;
BOOLEAN bGASQueryRspFragFound = FALSE, bPeerFound = FALSE;
BOOLEAN Cancelled;
MAC_TABLE_ENTRY *pEntry = NULL;
UCHAR WildcardBssid[MAC_ADDR_LEN] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
/* Pre-allocate max possible length */
os_alloc_mem(NULL, (UCHAR **)&Buf, sizeof(*GASFrame) + 6 + pGASCtrl->MMPDUSize);
if (!Buf) {
MTWF_LOG(DBG_CAT_PROTO, CATPROTO_WNM, DBG_LVL_ERROR, ("%s Not available memory\n", __func__));
return;
}
NdisZeroMemory(Buf, sizeof(*GASFrame) + 6 + pGASCtrl->MMPDUSize);
MTWF_LOG(DBG_CAT_PROTO, CATPROTO_WNM, DBG_LVL_TRACE, ("%s\n", __func__));
RTMP_SEM_LOCK(&pGASCtrl->GASPeerListLock);
DlListForEach(GASPeerEntry, &pGASCtrl->GASPeerList, GAS_PEER_ENTRY, List) {
@ -509,18 +524,26 @@ static VOID SendGASCBRsp(
break;
}
}
bPeerFound = TRUE;
break;
}
}
RTMP_SEM_UNLOCK(&pGASCtrl->GASPeerListLock);
os_alloc_mem(NULL, (UCHAR **)&Buf, sizeof(*GASFrame) + VarLen);
if (!Buf) {
MTWF_LOG(DBG_CAT_PROTO, CATPROTO_WNM, DBG_LVL_ERROR, ("%s Not available memory\n", __func__));
if ((bPeerFound == FALSE) || (bGASQueryRspFragFound == FALSE)) {
MTWF_LOG(DBG_CAT_PROTO, CATPROTO_WNM, DBG_LVL_TRACE,
("%s bPeerFound =%d bGASQueryRspFragFound=%d\n", __func__, bPeerFound, bGASQueryRspFragFound));
RTMP_SEM_UNLOCK(&pGASCtrl->GASPeerListLock);
os_free_mem(Buf);
return;
}
if (!GASQueryRspFrag->FragQueryRsp) {
MTWF_LOG(DBG_CAT_PROTO, CATPROTO_WNM, DBG_LVL_TRACE,
("%s GASQueryRspFrag->FragQueryRsp is Null\n", __func__));
RTMP_SEM_UNLOCK(&pGASCtrl->GASPeerListLock);
os_free_mem(Buf);
return;
}
NdisZeroMemory(Buf, sizeof(*GASFrame) + VarLen);
GASFrame = (GAS_FRAME *)Buf;
pEntry = MacTableLookup(pAd, GASPeerEntry->PeerMACAddr);
@ -574,7 +597,6 @@ static VOID SendGASCBRsp(
FrameLen += 6;
}
RTMP_SEM_LOCK(&pGASCtrl->GASPeerListLock);
DlListDel(&GASPeerEntry->List);
DlListForEachSafe(GASQueryRspFrag, GASQueryRspFragTmp,
&GASPeerEntry->GASQueryRspFragList, GAS_QUERY_RSP_FRAGMENT, List) {
@ -628,6 +650,7 @@ static VOID SendGASCBRsp(
/* GASSetPeerCurrentState(pAd, Elem, WAIT_GAS_CB_REQ); */
GASSetPeerCurrentState(pAd, Event, WAIT_GAS_CB_REQ);
RTMP_SEM_UNLOCK(&pGASCtrl->GASPeerListLock);
}
MiniportMMRequest(pAd, 0, Buf, FrameLen);

View File

@ -381,6 +381,11 @@ USHORT mtd_pci_write_tx_resource(
dma_cb->pNextNdisPacket = NULL;
dma_cb->PacketPa = pTxBlk->SrcBufPA;
if (pTxBlk->TxFrameType != TX_FRAG_FRAME)
dma_cb->DmaBuf.AllocSize = mt_pci_get_buf_len(pAd, pTxBlk);
else
dma_cb->DmaBuf.AllocSize = write_first_buf(pAd, pTxBlk, pDMAHeaderBufVA);
#ifndef RT_BIG_ENDIAN
pTxD = (TXD_STRUC *)dma_cb->AllocVa;
#else
@ -389,13 +394,14 @@ USHORT mtd_pci_write_tx_resource(
pTxD = (TXD_STRUC *)&tx_hw_info[0];
TmacLen = (cap->tx_hw_hdr_len - pTxBlk->hw_rsv_len);
MTMacInfoEndianChange(pAd, (PUCHAR)(pDMAHeaderBufVA), TYPE_TMACINFO, TmacLen);
RTMPFrameEndianChange(pAd, (PUCHAR)(pDMAHeaderBufVA + TmacLen), DIR_WRITE, FALSE);
#endif
if (pTxBlk->TxFrameType != TX_FRAG_FRAME)
dma_cb->DmaBuf.AllocSize = mt_pci_get_buf_len(pAd, pTxBlk);
else
dma_cb->DmaBuf.AllocSize = write_first_buf(pAd, pTxBlk, pDMAHeaderBufVA);
if (!TX_BLK_TEST_FLAG(pTxBlk, fTX_HDR_TRANS)) {
ra_dma_addr_t SrcBufPA = 0;
RTMPFrameEndianChange(pAd, (PUCHAR)(pTxBlk->pSrcBufData), DIR_WRITE, FALSE);
SrcBufPA = PCI_MAP_SINGLE(pAd, pTxBlk, 0, 1, RTMP_PCI_DMA_TODEVICE);
}
#endif
dma_cb->DmaBuf.AllocPa = PCI_MAP_SINGLE(pAd, pDMAHeaderBufVA, dma_cb->DmaBuf.AllocSize, 0, RTMP_PCI_DMA_TODEVICE);
pTxD->SDPtr0 = dma_cb->DmaBuf.AllocPa;
@ -931,22 +937,11 @@ BOOLEAN mtd_free_txd(RTMP_ADAPTER *pAd, UINT8 hif_idx)
while (tx_ring->TxSwFreeIdx != tx_ring->TxDmaIdx) {
dma_cb = &tx_ring->Cell[tx_ring->TxSwFreeIdx];
#ifdef RT_BIG_ENDIAN
pDestTxD = (TXD_STRUC *)(dma_cb->AllocVa);
NdisMoveMemory(&hw_hdr_info[0], pDestTxD, TXD_SIZE);
pTxD = (TXD_STRUC *)&hw_hdr_info[0];
RTMPDescriptorEndianChange((PUCHAR)pTxD, TYPE_TXD);
#endif
PCI_UNMAP_SINGLE(pAd, dma_cb->DmaBuf.AllocPa, dma_cb->DmaBuf.AllocSize, RTMP_PCI_DMA_TODEVICE);
/* flush dcache if no consistent memory is supported */
RTMP_DCACHE_FLUSH(dma_cb->AllocPa, TXD_SIZE);
INC_RING_INDEX(tx_ring->TxSwFreeIdx, tx_ring_size);
#ifdef RT_BIG_ENDIAN
RTMPDescriptorEndianChange((PUCHAR)pTxD, TYPE_TXD);
WriteBackToDescriptor((PUCHAR)pDestTxD, (PUCHAR)pTxD, TRUE, TYPE_TXD);
#endif
}
RTMP_SEM_UNLOCK(lock);
@ -1547,7 +1542,7 @@ static INT rx_scatter_gather(
#ifdef CONFIG_WIFI_BUILD_SKB
DEV_FREE_FRAG_BUF(pCurRxCell->pNdisPacket);
#else
RELEASE_NDIS_PACKET(pAd, pRxCell->pNdisPacket, NDIS_STATUS_SUCCESS);
RELEASE_NDIS_PACKET(pAd, pCurRxCell->pNdisPacket, NDIS_STATUS_SUCCESS);
#endif
pCurRxCell->pNdisPacket = RTMP_AllocateRxPacketBuffer(pRxRing,
@ -2550,6 +2545,9 @@ VOID mtd_isr(RTMP_ADAPTER *pAd)
mt_int_status_clear(pAd, IntSource);
return;
}
#ifdef CONFIG_RECOVERY_ON_INTERRUPT_MISS
pAd->tr_ctl.total_int_count++;
#endif
if (IntSource & MT_TxCoherent)
MTWF_LOG(DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_ERROR, (">>>TxCoherent<<<\n"));
@ -2575,6 +2573,9 @@ VOID mtd_isr(RTMP_ADAPTER *pAd)
IntSource &= ~MT_INT_RX_DATA;
else
pci_hif->IntPending |= MT_INT_RX_DATA;
#ifdef CONFIG_RECOVERY_ON_INTERRUPT_MISS
pAd->tr_ctl.rx_data_int_count++;
#endif
}
if (IntSource & MT_INT_RX_CMD) {
@ -2582,6 +2583,10 @@ VOID mtd_isr(RTMP_ADAPTER *pAd)
IntSource &= ~MT_INT_RX_CMD;
else
pci_hif->IntPending |= MT_INT_RX_CMD;
#ifdef CONFIG_RECOVERY_ON_INTERRUPT_MISS
pAd->tr_ctl.rx_cmd_int_count++;
#endif
}
if (IntSource & MT_INT_RX_DLY) {
@ -2711,6 +2716,10 @@ VOID mtd_non_rx_delay_isr(RTMP_ADAPTER *pAd)
return;
}
#ifdef CONFIG_RECOVERY_ON_INTERRUPT_MISS
pAd->tr_ctl.total_int_count++;
#endif
if (IntSource & MT_TxCoherent)
MTWF_LOG(DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_ERROR, (">>>TxCoherent<<<\n"));
@ -2739,6 +2748,9 @@ VOID mtd_non_rx_delay_isr(RTMP_ADAPTER *pAd)
#ifdef CONFIG_TP_DBG
tp_dbg->IsrRxCnt++;
#endif
#ifdef CONFIG_RECOVERY_ON_INTERRUPT_MISS
pAd->tr_ctl.rx_data_int_count++;
#endif
}
@ -2751,6 +2763,9 @@ VOID mtd_non_rx_delay_isr(RTMP_ADAPTER *pAd)
#ifdef CONFIG_TP_DBG
tp_dbg->IsrRx1Cnt++;
#endif
#ifdef CONFIG_RECOVERY_ON_INTERRUPT_MISS
pAd->tr_ctl.rx_cmd_int_count++;
#endif
}

View File

@ -271,82 +271,6 @@ inline INT Set_HotSpot_DGAF(
return 0;
}
INT Set_HotSpot_Param(
IN PRTMP_ADAPTER pAd,
UINT32 Param,
UINT32 Value)
{
POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie;
UCHAR APIndex = pObj->ioctl_if;
PHOTSPOT_CTRL pHSCtrl;
PWNM_CTRL pWNMCtrl;
PGAS_CTRL pGASCtrl;
#ifdef MBO_SUPPORT
P_MBO_CTRL pMboCtrl;
#endif
pHSCtrl = &pAd->ApCfg.MBSSID[APIndex].HotSpotCtrl;
pWNMCtrl = &pAd->ApCfg.MBSSID[APIndex].WNMCtrl;
pGASCtrl = &pAd->ApCfg.MBSSID[APIndex].GASCtrl;
#ifdef MBO_SUPPORT
pMboCtrl = &pAd->ApCfg.MBSSID[APIndex].wdev.MboCtrl;
#endif /* MBO_SUPPORT */
switch (Param) {
case PARAM_DGAF_DISABLED:
pHSCtrl->DGAFDisable = Value;
hotspot_update_bssflag(pAd, fgDGAFDisable, Value, pHSCtrl);
break;
case PARAM_PROXY_ARP:
pWNMCtrl->ProxyARPEnable = Value;
hotspot_update_bssflag(pAd, fgProxyArpEnable, Value, pHSCtrl);
break;
case PARAM_L2_FILTER:
pHSCtrl->L2Filter = Value;
break;
case PARAM_ICMPV4_DENY:
pHSCtrl->ICMPv4Deny = Value;
break;
case PARAM_MMPDU_SIZE:
pHSCtrl->MMPDUSize = Value;
break;
case PARAM_EXTERNAL_ANQP_SERVER_TEST:
pGASCtrl->ExternalANQPServerTest = Value;
break;
case PARAM_GAS_COME_BACK_DELAY:
pGASCtrl->cb_delay = Value;
break;
#ifdef CONFIG_HOTSPOT_R2
case PARAM_WNM_NOTIFICATION:
pWNMCtrl->WNMNotifyEnable = Value;
break;
case PARAM_QOSMAP:
pHSCtrl->QosMapEnable = Value;
hotspot_update_bssflag(pAd, fgQosMapEnable, Value, pHSCtrl);
break;
case PARAM_WNM_BSS_TRANSITION_MANAGEMENT:
pWNMCtrl->WNMBTMEnable = Value;
break;
#endif
default:
MTWF_LOG(DBG_CAT_PROTO, DBG_SUBCAT_ALL, DBG_LVL_ERROR, ("Unknow Parameter:%d\n", Param));
break;
}
/* for 7615 offload to CR4 */
hotspot_update_bss_info_to_cr4(pAd, APIndex);
return 0;
}
VOID Clear_Hotspot_All_IE(
IN PRTMP_ADAPTER pAd)
{
@ -991,8 +915,9 @@ VOID hotspot_update_ap_qload_to_bcn(RTMP_ADAPTER *pAd)
UINT BssIdx;
struct wifi_dev *wdev = NULL;
NdisGetSystemUpTime(&UpTime);
#ifdef AP_QLOAD_SUPPORT
QBSS_LoadUpdate(pAd, UpTime);
#endif /* AP_QLOAD_SUPPORT */
for (BssIdx = 0; BssIdx < pAd->ApCfg.BssidNum; BssIdx++) {
wdev = &pAd->ApCfg.MBSSID[BssIdx].wdev;

View File

@ -168,6 +168,43 @@ VOID setNonOpChnList(
}
int map_make_vend_ie(IN PRTMP_ADAPTER pAd, IN UCHAR ApIdx)
{
struct vendor_map_element *ie = NULL;
char *buf;
int ie_len = 0;
ie_len = sizeof(struct vendor_map_element);
os_alloc_mem(NULL, (UCHAR **)&buf, sizeof(struct vendor_map_element));
if (!buf) {
MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR,
("memory is not available\n"));
return -1;
}
NdisZeroMemory(buf, ie_len);
ie = (struct vendor_map_element *)buf;
ie->eid = VEND_IE_TYPE;
ie->length = ie_len - 2;
NdisCopyMemory(ie->oui, MTK_OUI, OUI_LEN);
ie->mtk_ie_element[0] = 0;
ie->mtk_ie_element[1] = 1;
ie->type = 0;
ie->subtype = 0;
ie->root_distance = 0;
ie->controller_connectivity = 0;
ie->uplink_rate = 0;
NdisZeroMemory(ie->_2g_bssid, ETH_ALEN);
NdisZeroMemory(ie->_5g_bssid, ETH_ALEN);
NdisZeroMemory(ie->uplink_bssid, ETH_ALEN);
wapp_set_ap_ie(pAd, buf, ie_len, ApIdx);
os_free_mem(buf);
return 0;
}
VOID MAP_Init(
IN PRTMP_ADAPTER pAd,
@ -176,12 +213,15 @@ VOID MAP_Init(
)
{
wdev->MAPCfg.DevOwnRole = MAP_CheckDevRole(pAd, wdev_type);
wdev->MAPCfg.bMAPEnable = TRUE;/*by default*/
wdev->MAPCfg.bMAPEnable = TRUE; /*by default*/
wdev->MAPCfg.bUnAssocStaLinkMetricRptOpBss = TRUE;/*by default*/
wdev->MAPCfg.bUnAssocStaLinkMetricRptNonOpBss = FALSE;/*by default*/
pAd->ApCfg.SteerPolicy.steer_policy = 0;
pAd->ApCfg.SteerPolicy.cu_thr = 0;
pAd->ApCfg.SteerPolicy.rcpi_thr = 0;
NdisZeroMemory(wdev->MAPCfg.vendor_ie_buf, VENDOR_SPECIFIC_LEN);
NdisZeroMemory(&(wdev->MAPCfg.scan_bh_ssids), sizeof(struct scan_BH_ssids));
}
INT map_send_bh_sta_wps_done_event(
@ -201,13 +241,13 @@ INT map_send_bh_sta_wps_done_event(
#endif
if (is_ap) {
if (IS_MAP_ENABLE(mac_entry->wdev) && (mac_entry->DevPeerRole & BIT(MAP_ROLE_BACKHAUL_STA)))
if (IS_MAP_ENABLE(adapter) && (mac_entry->DevPeerRole & BIT(MAP_ROLE_BACKHAUL_STA)))
send_event = TRUE;
}
#ifdef APCLI_SUPPORT
else {
apcli_entry = &adapter->ApCfg.ApCliTab[mac_entry->func_tb_idx];
if (IS_MAP_ENABLE(&apcli_entry->wdev) &&
if (IS_MAP_ENABLE(adapter) &&
(mac_entry->DevPeerRole &
(BIT(MAP_ROLE_FRONTHAUL_BSS) | BIT(MAP_ROLE_BACKHAUL_BSS))))
COPY_MAC_ADDR(bsta_info->connected_bssid, apcli_entry->wdev.bssid);
@ -290,4 +330,142 @@ VOID map_rssi_status_check(
}
}
INT ReadMapParameterFromFile(
PRTMP_ADAPTER pAd,
RTMP_STRING *tmpbuf,
RTMP_STRING *pBuffer)
{
INT i;
RTMP_STRING *macptr;
#ifdef CONFIG_MAP_SUPPORT
if (RTMPGetKeyParameter("MapEnable", tmpbuf, 25, pBuffer, TRUE)) {
pAd->bMAPEnable = (UCHAR) os_str_tol(tmpbuf, 0, 10);
MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR,
("MapEnable=%d\n", pAd->bMAPEnable));
}
if (RTMPGetKeyParameter("MAP_Turnkey", tmpbuf, 25, pBuffer, TRUE)) {
pAd->bMAPTurnKeyEnable = (UCHAR) os_str_tol(tmpbuf, 0, 10);
MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR,
("MAP_Turnkey=%d\n", pAd->bMAPTurnKeyEnable));
#ifdef APCLI_SUPPORT
#ifdef ROAMING_ENHANCE_SUPPORT
if (pAd->bMAPTurnKeyEnable == 1)
pAd->ApCfg.bRoamingEnhance = TRUE;
#endif
#endif
if (pAd->bMAPTurnKeyEnable) {
int j;
for (j = BSS0; j < WDEV_NUM_MAX; j++) {
#ifdef CONFIG_MAP_SUPPORT
struct wifi_dev *wdev = pAd->wdev_list[j];
if (wdev && wdev->wdev_type == WDEV_TYPE_AP)
map_make_vend_ie(pAd, (UCHAR)wdev->BssIdx);
#endif /* CONFIG_MAP_SUPPORT */
}
}
pAd->ApEnableBeaconTable = TRUE;
}
if (RTMPGetKeyParameter("MAP_Ext", tmpbuf, 25, pBuffer, TRUE)) {
for (i = 0, macptr = rstrtok(tmpbuf, ";");
(macptr && i < MAX_MBSSID_NUM(pAd));
macptr = rstrtok(NULL, ";"), i++) {
pAd->ApCfg.MBSSID[i].wdev.MAPCfg.DevOwnRole = (UCHAR)os_str_tol(macptr, 0, 10);
MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE,
("IF(%s%d) ==> MAP_Ext=%u\n",
INF_MBSSID_DEV_NAME, i,
pAd->ApCfg.MBSSID[i].wdev.MAPCfg.DevOwnRole));
}
}
#ifdef CONFIG_RCSA_SUPPORT
if (pAd->bMAPTurnKeyEnable)
pAd->CommonCfg.DfsParameter.bRCSAEn = FALSE;
#endif
#endif /* CONFIG_MAP_SUPPORT */
return TRUE;
}
#ifdef A4_CONN
BOOLEAN map_a4_peer_enable(
IN PRTMP_ADAPTER adapter,
IN PMAC_TABLE_ENTRY entry,
IN BOOLEAN is_ap /*if i'm AP or not*/
)
{
#ifdef APCLI_SUPPORT
PAPCLI_STRUCT apcli_entry;
#endif
if (is_ap) {
if (IS_MAP_ENABLE(adapter) &&
(entry->wdev->MAPCfg.DevOwnRole & BIT(MAP_ROLE_BACKHAUL_BSS)) &&
(entry->DevPeerRole & BIT(MAP_ROLE_BACKHAUL_STA)))
return a4_ap_peer_enable(adapter, entry, A4_TYPE_MAP);
}
#ifdef APCLI_SUPPORT
else {
apcli_entry = &adapter->ApCfg.ApCliTab[entry->func_tb_idx];
if (IS_MAP_ENABLE(adapter) &&
(entry->DevPeerRole & (BIT(MAP_ROLE_BACKHAUL_BSS)))) {
return a4_apcli_peer_enable(adapter,
apcli_entry,
entry,
A4_TYPE_MAP);
}
}
#endif
return FALSE;
}
BOOLEAN map_a4_peer_disable(
IN PRTMP_ADAPTER adapter,
IN PMAC_TABLE_ENTRY entry,
IN BOOLEAN is_ap /*if i'm AP or not*/
)
{
if (is_ap)
return a4_ap_peer_disable(adapter, entry, A4_TYPE_MAP);
#ifdef APCLI_SUPPORT
else
return a4_apcli_peer_disable(adapter, &adapter->ApCfg.ApCliTab[entry->func_tb_idx], entry, A4_TYPE_MAP);
#else
return FALSE;
#endif
}
BOOLEAN map_a4_init(
IN PRTMP_ADAPTER adapter,
IN UCHAR if_index,
IN BOOLEAN is_ap
)
{
return a4_interface_init(adapter, if_index, is_ap, A4_TYPE_MAP);
}
BOOLEAN map_a4_deinit(
IN PRTMP_ADAPTER adapter,
IN UCHAR if_index,
IN BOOLEAN is_ap
)
{
return a4_interface_deinit(adapter, if_index, is_ap, A4_TYPE_MAP);
}
BOOLEAN MapNotRequestedChannel(struct wifi_dev *wdev, unsigned char channel)
{
int i = 0;
if (wdev->MAPCfg.scan_bh_ssids.scan_channel_count == 0)
return FALSE;
for (i = 0; i < wdev->MAPCfg.scan_bh_ssids.scan_channel_count; i++) {
if (channel == wdev->MAPCfg.scan_bh_ssids.scan_channel_list[i])
return FALSE;
}
return TRUE;
}
#endif

View File

@ -166,6 +166,13 @@ VOID MakeMboOceIE(
return;
}
if (wdev->SecConfig.PmfCfg.MFPC == FALSE &&
IS_AKM_WPA_CAPABILITY(wdev->SecConfig.AKMMap)) {
MTWF_LOG(DBG_CAT_PROTO, DBG_SUBCAT_ALL, DBG_LVL_INFO,
("%s::Security is WPA2/WPA3, please enable PMF MFPC\n", __func__));
return;
}
MlmeAllocateMemory(pAd, &pAttrBuf);
@ -247,24 +254,25 @@ static VOID WextMboSendNeighborReportToDaemonEvent(
P_DAEMON_EVENT_NR_LIST NeighborRepList,
UINT16 report_buf_len)
{
P_DAEMON_NR_MSG pNRMsg;
struct neighbor_list_data *neighbor_list_data;
UINT16 buflen = 0;
char *buf;
buflen = sizeof(DAEMON_NR_MSG);
/* 8 = sizeof(neighbor_list_data->ifindex) + sizeof(neighbor_list_data->neighbor_list_len) */
buflen = 8 + report_buf_len;
os_alloc_mem(NULL, (UCHAR **)&buf, buflen);
NdisZeroMemory(buf, buflen);
pNRMsg = (P_DAEMON_NR_MSG)buf;
NdisCopyMemory(&pNRMsg->evt_nr_list, NeighborRepList, report_buf_len);
MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR,
("%s - sizeof %u report_buf_len %u buflen %u\n",
__func__, (UINT32)sizeof(DAEMON_EVENT_NR_LIST), report_buf_len, buflen));
neighbor_list_data = (struct neighbor_list_data *)buf;
neighbor_list_data->ifindex = RtmpOsGetNetIfIndex(net_dev);
neighbor_list_data->neighbor_list_len = report_buf_len;
NdisCopyMemory(neighbor_list_data->neighbor_list_req, NeighborRepList, report_buf_len);
RtmpOSWrielessEventSend(net_dev, RT_WLAN_EVENT_CUSTOM,
OID_NEIGHBOR_REPORT, NULL, (PUCHAR)buf, buflen);
os_free_mem(buf);
}
static VOID MboUpdateNRElement(
@ -369,8 +377,12 @@ static VOID MboUpdateNRElement(
}
pNeighborEntry->BssidInfo = BssidInfo.word;
pNeighborEntry->RegulatoryClass = get_regulatory_class(pAd, pBssEntry->Channel,
pWdev->PhyMode, pWdev);/* pBssEntry->RegulatoryClass; */
/* If the NR is from a client, then
* pBssEntry->RegulatoryClass would be already set */
pNeighborEntry->RegulatoryClass = (pBssEntry->RegulatoryClass ?
pBssEntry->RegulatoryClass :
get_regulatory_class(pAd, pBssEntry->Channel,
pWdev->PhyMode, pWdev));
pNeighborEntry->ChNum = pBssEntry->Channel;
pNeighborEntry->PhyType = pBssEntry->CondensedPhyType;
@ -479,7 +491,8 @@ INT MboIndicateNeighborReportToDaemon(
DAEMON_NEIGHBOR_REP_INFO *pNeighborEntry = &NeighborRepList.EvtNRInfo[NeighborRepList.CurrNum];
NeighborRepList.CurrNum++;
/* Regulatory class would be determined in MboUpdateNRElement()*/
pBssEntry->RegulatoryClass = 0;
MboUpdateNRElement(pAd, pWdev, pBssEntry, pNeighborEntry);
MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE,
@ -518,19 +531,25 @@ INT MboIndicateNeighborReportToDaemon(
NdisZeroMemory(&NeighborRepList, sizeof(DAEMON_EVENT_NR_LIST));
}
} else {
MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR,
("%s - nothing to indicate, pAd->ScanTab.BssNr = %d\n",
__func__, pAd->ScanTab.BssNr));
} else { /*cert env will really have 0 AP alive, indicate ourself anyway*/
MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR,
("%s - ScanTab->BssNr=0, indicate our own bssid anyway\n", __func__));
NdisZeroMemory(&NeighborRepList, sizeof(DAEMON_EVENT_NR_LIST));
TotalReportNum = 1;
NeighborRepList.TotalNum = TotalReportNum;
NeighborRepList.Newlist = TRUE;
NeighborRepList.TotalNum = 0;
/* insert our own bss info into NR list first */
pNeighborEntry = &NeighborRepList.EvtNRInfo[NeighborRepList.CurrNum++];
MboUpdateNRElement(pAd, pWdev, NULL, pNeighborEntry);
NeighborRepList.Newlist = TRUE;
/* indicate our own bss to daemon */
WextMboSendNeighborReportToDaemonEvent(pAd->net_dev,
&NeighborRepList,
sizeof(DAEMON_EVENT_NR_LIST));
}
/* indicate zero to daemon */
WextMboSendNeighborReportToDaemonEvent(pAd->net_dev,
&NeighborRepList,
sizeof(DAEMON_EVENT_NR_LIST));
}
#endif /* AP_SCAN_SUPPORT */
#endif /* DOT11K_RRM_SUPPORT */

View File

@ -0,0 +1,173 @@
/*
***************************************************************************
* MediaTek Inc.
*
* All rights reserved. source code is an unpublished work and the
* use of a copyright notice does not imply otherwise. This source code
* contains confidential trade secret material of MediaTek. Any attemp
* or participation in deciphering, decoding, reverse engineering or in any
* way altering the source code is stricitly prohibited, unless the prior
* written consent of MediaTek, Inc. is obtained.
***************************************************************************
Module Name:
misc_app.c
*/
#include "rt_config.h"
#include "misc_app.h"
#ifndef _LINUX_BITOPS_H
#define BIT(n) ((UINT32) 1 << (n))
#endif /* BIT */
static enum wifi_cap_operation_status wifi_chip_cap_list_register(struct _RTMP_ADAPTER *ad)
{
int dbdc_cap = WIFI_CAP_DBDC_SUP_MODE_NONE;
int channel_cap = WIFI_CAP_CH_SUP_MODE_2G;
struct wifi_feature_support_list_query *wifi_cap = &ad->wifi_cap_list;
UINT32 *chip_cap_list = &wifi_cap->chip_cap_list;
UINT32 local_cap = 0;
struct _RTMP_CHIP_CAP *chip_cap = hc_get_chip_cap(ad->hdev_ctrl);
if (chip_cap->phy_caps & fPHY_CAP_HT)
local_cap |= BIT(WIFI_CAP_HT_MODE_BITS);
if (chip_cap->phy_caps & fPHY_CAP_VHT)
local_cap |= BIT(WIFI_CAP_VHT_MODE_BITS);
if (chip_cap->phy_caps & fPHY_CAP_HE)
local_cap |= BIT(WIFI_CAP_HE_MODE_BITS);
if (chip_cap->asic_caps & fASIC_CAP_DBDC) {
if (BOARD_IS_5G_ONLY(ad))
dbdc_cap = WIFI_CAP_DBDC_SUP_MODE_5G5G;
else
dbdc_cap = WIFI_CAP_DBDC_SUP_MODE_2G5G;
}
local_cap |= (dbdc_cap << WIFI_CAP_DBDC_SUP_MODE_BITS);
if (RFIC_IS_5G_BAND(ad))
channel_cap = WIFI_CAP_CH_SUP_MODE_2G5G;
else if (BOARD_IS_5G_ONLY(ad))
channel_cap = WIFI_CAP_CH_SUP_MODE_5G;
local_cap |= (channel_cap << WIFI_CAP_CH_SUP_MODE_BITS);
if (chip_cap->asic_caps & fASIC_CAP_ADV_SECURITY)
local_cap |= BIT(WIFI_CAP_ADV_SEC_SUP_BITS);
if (chip_cap->phy_caps & fPHY_CAP_TXBF)
local_cap |= BIT(WIFI_CAP_BF_SUP_BITS);
if (chip_cap->phy_caps & fPHY_CAP_MUMIMO)
local_cap |= BIT(WIFI_CAP_MU_MIMO_SUP_BITS);
#ifdef CONFIG_AP_SUPPORT
local_cap |= (ad->ApCfg.BssidNum << WIFI_CAP_MBSS_NUM_BITS);
#endif
local_cap |= (chip_cap->max_nss << WIFI_CAP_TX_STR_NUM_BITS);
local_cap |= (chip_cap->max_nss << WIFI_CAP_RX_STR_NUM_BITS);
os_move_mem(chip_cap_list, &local_cap, sizeof(UINT32));
return WIFI_CAP_STATUS_OK;
}
static enum wifi_cap_operation_status wifi_sec_list_register(struct _RTMP_ADAPTER *ad)
{
struct wifi_feature_support_list_query *wifi_cap = &ad->wifi_cap_list;
UINT32 *sec_cap_list = &wifi_cap->sec_cap_list;
UINT32 local_cap = 0;
local_cap |= (BIT(WIFI_SEC_WEP_SUP_BITS) |
BIT(WIFI_SEC_WPA1PSK_SUP_BITS) |
BIT(WIFI_SEC_WPA2PSK_SUP_BITS));
#ifdef DOT11W_PMF_SUPPORT
local_cap |= BIT(WIFI_SEC_PMF_SUP_BITS);
#endif
#ifdef DOT1X_SUPPORT
local_cap |= (BIT(WIFI_SEC_WPA1_SUP_BITS) | BIT(WIFI_SEC_WPA2_SUP_BITS));
#endif
#if defined(DOT11_SAE_SUPPORT) && defined(DOT11W_PMF_SUPPORT)
local_cap |= BIT(WIFI_SEC_WPA3PSK_SUP_BITS);
#if defined(DOT1X_SUPPORT)
local_cap |= BIT(WIFI_SEC_WPA3_SUP_BITS);
#if defined(DOT11_SUITEB_SUPPORT)
local_cap |= BIT(WIFI_SEC_WPA3SUITEB192_SUP_BITS);
#endif /*DOT11_SUITEB_SUPPORT*/
#endif /*DOT1X_SUPPORT*/
#endif /*DOT11_SAE_SUPPORT && DOT11W_PMF_SUPPORT*/
#ifdef CONFIG_OWE_SUPPORT
local_cap |= BIT(WIFI_SEC_ENHANCE_OPEN_SUP_BITS);
#endif
os_move_mem(sec_cap_list, &local_cap, sizeof(UINT32));
return WIFI_CAP_STATUS_OK;
}
static enum wifi_cap_operation_status wifi_feature_list_register(struct _RTMP_ADAPTER *ad)
{
return WIFI_CAP_STATUS_OK;
}
enum wifi_cap_operation_status wifi_sup_list_register(struct _RTMP_ADAPTER *ad,
enum wifi_cap_type cap_type)
{
enum wifi_cap_operation_status ret = WIFI_CAP_STATUS_OK;
switch (cap_type) {
case WIFI_CAP_CHIP:
ret = wifi_chip_cap_list_register(ad);
break;
case WIFI_CAP_SEC:
ret = wifi_sec_list_register(ad);
break;
case WIFI_CAP_FEATURE:
ret = wifi_feature_list_register(ad);
break;
default:
ret = WIFI_CAP_STATUS_INVALID_PARAMETER;
}
return ret;
}
static void print_wifi_chip_cap(struct _RTMP_ADAPTER *ad)
{
struct wifi_feature_support_list_query *wifi_cap = &ad->wifi_cap_list;
UINT32 *chip_cap_list = &wifi_cap->chip_cap_list;
MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_INFO,
("%s, chip_cap:0x%08x\n", __func__, *chip_cap_list));
}
static void print_wifi_sec_cap(struct _RTMP_ADAPTER *ad)
{
struct wifi_feature_support_list_query *wifi_cap = &ad->wifi_cap_list;
UINT32 *sec_cap_list = &wifi_cap->sec_cap_list;
MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_INFO,
("%s, sec_cap:0x%08x\n", __func__, *sec_cap_list));
}
static void print_wifi_feature_cap(struct _RTMP_ADAPTER *ad)
{
}
INT show_wifi_cap_list(struct _RTMP_ADAPTER *ad, char *arg)
{
print_wifi_chip_cap(ad);
print_wifi_sec_cap(ad);
print_wifi_feature_cap(ad);
return TRUE;
}

View File

@ -27,6 +27,9 @@
#include "rt_config.h"
#include <stdarg.h>
#ifdef TXRX_STAT_SUPPORT
#include "hdev/hdev_basic.h"
#endif
#ifdef DOT11R_FT_SUPPORT
#include "ft.h"
#endif /* DOT11R_FT_SUPPORT */
@ -36,7 +39,12 @@
#include "arris_wps_gpio_handler.h"
#endif
#endif
#ifdef CUSTOMER_DCC_FEATURE
UCHAR FILTER_OUI[] = {0x00, 0x50, 0xf2};
UINT32 TxRx_time[MAX_LEN_OF_MAC_TABLE];
UINT32 Last_TxRx_time[MAX_LEN_OF_MAC_TABLE];
#endif
UCHAR APPLE_OUI[] = {0x00, 0x17, 0xf2}; /* For IOS immediately connect */
UCHAR OfdmRateToRxwiMCS[12] = {
0, 0, 0, 0,
0, 1, 2, 3, /* OFDM rate 6,9,12,18 = rxwi mcs 0,1,2,3 */
@ -592,6 +600,210 @@ end:
return ret;
}
#ifdef CUSTOMER_DCC_FEATURE
VOID GetTxRxActivityTime(
IN PRTMP_ADAPTER pAd,
IN UINT wcid)
{
CHAR ac;
UINT32 wtbl_offset;
UINT32 tx_sum, rx_sum, tx, rx, txrx_time_diff;
PMAC_TABLE_ENTRY pEntry = NULL;
/* UINT32 count = 0, wcid_start = 0; */
#ifdef VOW_SUPPORT
if (pAd->vow_dvt_en) {
if (wcid <= pAd->vow_monitor_sta)
return;
}
#endif
pEntry = &pAd->MacTab.Content[wcid];
if (IS_ENTRY_CLIENT(pEntry) && (pEntry->Sst == SST_ASSOC) && (pEntry->pMbss != NULL)) {
wtbl_offset = (wcid << 8) | 0x3004C;
tx_sum = rx_sum = 0;
for (ac = 0; ac < 4; ac++) {
RTMP_IO_READ32(pAd, wtbl_offset + (ac << 3), &tx);
tx_sum += tx;
RTMP_IO_READ32(pAd, wtbl_offset + (ac << 3) + 4, &rx);
rx_sum += rx;
}
txrx_time_diff = (tx_sum + rx_sum - Last_TxRx_time[wcid]);
pEntry->ChannelUseTime += txrx_time_diff;
pEntry->pMbss->ChannelUseTime += txrx_time_diff;
Last_TxRx_time[wcid] = tx_sum + rx_sum;
}
}
VOID RemoveOldStaList(
IN PRTMP_ADAPTER pAd)
{
INT32 i;
NdisAcquireSpinLock(&pAd->MacTabLock);
if (pAd->AllowedStaList.StaCount > 0) {
for (i = 0; i < pAd->AllowedStaList.StaCount; i++) {
if ((jiffies_to_msecs(jiffies) - pAd->AllowedStaList.AllowedSta[i].DissocTime) >= 30000) {
NdisZeroMemory(&pAd->AllowedStaList.AllowedSta[i], sizeof(ALLOWED_STA));
if (i != (pAd->AllowedStaList.StaCount - 1)) {
NdisCopyMemory(&pAd->AllowedStaList.AllowedSta[i], &pAd->AllowedStaList.AllowedSta[pAd->AllowedStaList.StaCount - 1], sizeof(ALLOWED_STA));
NdisZeroMemory(&pAd->AllowedStaList.AllowedSta[pAd->AllowedStaList.StaCount - 1], sizeof(ALLOWED_STA));
}
pAd->AllowedStaList.StaCount--;
}
}
}
NdisReleaseSpinLock(&pAd->MacTabLock);
}
VOID APResetStreamingStatus(
IN PRTMP_ADAPTER pAd)
{
UINT64 Time = jiffies_to_msecs(jiffies);
if ((Time - pAd->StreamingTypeStatus.BE_Time) > 1000)
pAd->StreamingTypeStatus.BE = FALSE;
if ((Time - pAd->StreamingTypeStatus.BK_Time) > 1000)
pAd->StreamingTypeStatus.BK = FALSE;
if ((Time - pAd->StreamingTypeStatus.VI_Time) > 1000)
pAd->StreamingTypeStatus.VI = FALSE;
if ((Time - pAd->StreamingTypeStatus.VO_Time) > 1000)
pAd->StreamingTypeStatus.VO = FALSE;
}
#endif
#ifdef TXRX_STAT_SUPPORT
VOID Update_LastSec_TXRX_Stats(
IN PRTMP_ADAPTER pAd)
{
MAC_TABLE_ENTRY *pEntry = NULL;
UINT32 i, bandidx;
struct hdev_ctrl *ctrl = (struct hdev_ctrl *)pAd->hdev_ctrl;
for (i = 0; i < DBDC_BAND_NUM; i++) {
ctrl->rdev[i].pRadioCtrl->LastSecTxByte.QuadPart = 0;
ctrl->rdev[i].pRadioCtrl->LastSecRxByte.QuadPart = 0;
}
for (i = 0; i < pAd->ApCfg.BssidNum; i++) {
pAd->ApCfg.MBSSID[i].stat_bss.LastSecTxBytes.QuadPart = 0;
pAd->ApCfg.MBSSID[i].stat_bss.LastSecRxBytes.QuadPart = 0;
}
for (i = 0 ; VALID_UCAST_ENTRY_WCID(pAd, i); i++) {
pEntry = &pAd->MacTab.Content[i];
if (pEntry && pEntry->wdev && IS_ENTRY_CLIENT(pEntry) && (pEntry->Sst == SST_ASSOC)) {
bandidx = HcGetBandByWdev(pEntry->wdev);
if (pEntry->TxDataPacketCount.QuadPart >= pEntry->LastTxDataPacketCountValue.QuadPart)
pEntry->TxDataPacketCount1SecValue.QuadPart = pEntry->TxDataPacketCount.QuadPart - pEntry->LastTxDataPacketCountValue.QuadPart;
if (pEntry->TxDataPacketByte.QuadPart >= pEntry->LastTxDataPacketByteValue.QuadPart) {
pEntry->TxDataPacketByte1SecValue.QuadPart = pEntry->TxDataPacketByte.QuadPart - pEntry->LastTxDataPacketByteValue.QuadPart;
ctrl->rdev[bandidx].pRadioCtrl->LastSecTxByte.QuadPart += pEntry->TxDataPacketByte1SecValue.QuadPart;
pEntry->pMbss->stat_bss.LastSecTxBytes.QuadPart += pEntry->TxDataPacketByte1SecValue.QuadPart;
}
if (pEntry->RxDataPacketCount.QuadPart >= pEntry->LastRxDataPacketCountValue.QuadPart)
pEntry->RxDataPacketCount1SecValue.QuadPart = pEntry->RxDataPacketCount.QuadPart - pEntry->LastRxDataPacketCountValue.QuadPart;
if (pEntry->RxDataPacketByte.QuadPart >= pEntry->LastRxDataPacketByteValue.QuadPart) {
pEntry->RxDataPacketByte1SecValue.QuadPart = pEntry->RxDataPacketByte.QuadPart - pEntry->LastRxDataPacketByteValue.QuadPart;
ctrl->rdev[bandidx].pRadioCtrl->LastSecRxByte.QuadPart += pEntry->RxDataPacketByte1SecValue.QuadPart;
pEntry->pMbss->stat_bss.LastSecRxBytes.QuadPart += pEntry->RxDataPacketByte1SecValue.QuadPart;
}
MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE,
("%s : STA : %d \n", __func__, pEntry->wcid));
MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE,
("1) TotalTxCount: %lld LastTxCnt: %lld TxPktCount1Sec: %lld\n", pEntry->TxDataPacketCount.QuadPart, pEntry->LastTxDataPacketCountValue.QuadPart, pEntry->TxDataPacketCount1SecValue.QuadPart));
MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE,
("2) TotalRxCount: %lld LastRxCnt: %lld RxPktCount1Sec: %lld\n", pEntry->RxDataPacketCount.QuadPart, pEntry->LastRxDataPacketCountValue.QuadPart, pEntry->RxDataPacketCount1SecValue.QuadPart));
MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE,
("3) TotalTxByte : %lld LastTxByte: %lld TxByte1secValue: %lld\n", pEntry->TxDataPacketByte.QuadPart, pEntry->LastTxDataPacketByteValue.QuadPart, pEntry->TxDataPacketByte1SecValue.QuadPart));
MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE,
("4) TotalRxByte : %lld LastRxByte: %lld RxByte1secValue: %lld\n", pEntry->RxDataPacketByte.QuadPart, pEntry->LastRxDataPacketByteValue.QuadPart, pEntry->RxDataPacketByte1SecValue.QuadPart));
pEntry->LastTxDataPacketByteValue.QuadPart = pEntry->TxDataPacketByte.QuadPart;
pEntry->LastTxDataPacketCountValue.QuadPart = pEntry->TxDataPacketCount.QuadPart;
pEntry->LastRxDataPacketByteValue.QuadPart = pEntry->RxDataPacketByte.QuadPart;
pEntry->LastRxDataPacketCountValue.QuadPart = pEntry->RxDataPacketCount.QuadPart;
}
}
}
#endif
#if defined(CUSTOMER_RSG_FEATURE) || defined (CUSTOMER_DCC_FEATURE)
VOID Update_Wtbl_Counters(
IN PRTMP_ADAPTER pAd)
{
UINT32 u4Field = GET_WTBL_TX_COUNT | GET_WTBL_PER_STA_TX_COUNT;
MtCmdGetWtblTxStat(pAd, u4Field, 0);
}
#endif
#ifdef CUSTOMER_RSG_FEATURE
VOID UpdateRadioStatCounters(
IN PRTMP_ADAPTER pAd)
{
if (pAd->ApCfg.EntryClientCount)
Update_Wtbl_Counters(pAd);
Read_Mib_TxRx_Counters(pAd);
}
VOID ClearChannelStatsCr(
IN PRTMP_ADAPTER pAd)
{
UINT32 CrValue;
UINT32 Time;
ULONG TNow;
UCHAR CurrIdx = pAd->MsMibBucket.CurIdx;
NdisGetSystemUpTime(&TNow);
Time = jiffies_to_usecs(TNow);
/* TIMESTAMP_GET(pAd, Time); */
pAd->ChannelStats.LastReadTime = Time;
/* OBSS Air time */
HW_IO_READ32(pAd, RMAC_MIBTIME5, &CrValue);
pAd->ChannelStats.MibUpdateOBSSAirtime[CurrIdx] += CrValue;
/* My Tx Air time */
HW_IO_READ32(pAd, MIB_M0SDR36, &CrValue);
pAd->ChannelStats.MibUpdateMyTxAirtime[CurrIdx] += CrValue;
/* My Rx Air time */
HW_IO_READ32(pAd, MIB_M0SDR37, &CrValue);
pAd->ChannelStats.MibUpdateMyRxAirtime[CurrIdx] += CrValue;
/* EDCCA time */
RTMP_IO_READ32(pAd, MIB_M0SDR18, &CrValue);
pAd->ChannelStats.MibUpdateEDCCAtime[CurrIdx] += CrValue;
CrValue = (CrValue & 0xffffff);
/* Reset OBSS Air time */
HW_IO_READ32(pAd, RMAC_MIBTIME0, &CrValue);
CrValue |= 1 << RX_MIBTIME_CLR_OFFSET;
CrValue |= 1 << RX_MIBTIME_EN_OFFSET;
HW_IO_WRITE32(pAd, RMAC_MIBTIME0, CrValue);
/* FALSE CCA Count */
HW_IO_READ32(pAd, RO_BAND0_PHYCTRL_STS0, &CrValue); /* PD count */
pAd->ChannelStats.MibUpdatePdCount[CurrIdx] += CrValue;
HW_IO_READ32(pAd, RO_BAND0_PHYCTRL_STS5, &CrValue); /* MDRDY count */
pAd->ChannelStats.MibUpdateMdrdyCount[CurrIdx] += CrValue;
/* reset PD and MDRDY count */
HW_IO_READ32(pAd, PHY_BAND0_PHYMUX_5, &CrValue);
CrValue &= 0xff8fffff;
HW_IO_WRITE32(pAd, PHY_BAND0_PHYMUX_5, CrValue); /* Reset */
CrValue |= 0x500000;
HW_IO_WRITE32(pAd, PHY_BAND0_PHYMUX_5, CrValue); /* Enable */
}
VOID ResetChannelStats(
IN PRTMP_ADAPTER pAd)
{
pAd->ChannelStats.LastReadTime = 0;
pAd->ChannelStats.TotalDuration = 0;
pAd->ChannelStats.CCABusytime = 0;
pAd->ChannelStats.ChBusytime = 0;
pAd->ChannelStats.FalseCCACount = 0;
pAd->ChannelStats.ChannelApActivity = 0;
}
#endif
/*
==========================================================================
Description:
@ -865,6 +1077,19 @@ VOID MlmeHandler(RTMP_ADAPTER *pAd)
Elem, pAd->Mlme.WdsMachine.CurrState);
break;
#endif
#ifdef CHANNEL_SWITCH_MONITOR_CONFIG
case CH_SWITCH_MONITOR_STATE_MACHINE:
StateMachinePerformAction(pAd, &pAd->ch_sw_cfg.ch_switch_sm, Elem,
pAd->ch_sw_cfg.ch_switch_sm.CurrState);
break;
#endif
#ifdef WIFI_DIAG
case WIFI_DAIG_STATE_MACHINE:
DiagLogFileWrite(pAd);
DiagConnErrorWrite(pAd);
break;
#endif
default:
MTWF_LOG(DBG_CAT_MLME, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("%s(): Illegal SM %ld\n",
__func__, Elem->Machine));
@ -1073,6 +1298,13 @@ NDIS_STATUS MlmeInit(RTMP_ADAPTER *pAd)
#ifdef CONFIG_DOT11U_INTERWORKING
GASStateMachineInit(pAd, &pAd->Mlme.GASMachine, pAd->Mlme.GASFunc);
#endif /*CONFIG_DOT11U_INTERWORKING*/
#ifdef DSCP_QOS_MAP_SUPPORT
DscpQosMapInit(pAd);
#endif
#ifdef CHANNEL_SWITCH_MONITOR_CONFIG
ch_switch_monitor_state_machine_init(pAd);
#endif
#ifdef CONFIG_11KV_API_SUPPORT
#ifdef DOT11K_RRM_SUPPORT
@ -1080,7 +1312,12 @@ NDIS_STATUS MlmeInit(RTMP_ADAPTER *pAd)
NRStateMachineInit(pAd, &pAd->Mlme.NRMachine, pAd->Mlme.NRFunc);
#endif
#endif /* CONFIG_11KV_API_SUPPORT */
#ifdef CONFIG_STEERING_API_SUPPORT
BTMActionFrameListInit(pAd);
pAd->ApCfg.NonAssocStaEnable = FALSE;
pAd->ApCfg.NonAssocStaReport = TRUE;
pAd->ApCfg.PauseNonAssocStaReport = FALSE;
#endif
#ifdef CONFIG_DOT11V_WNM
WNMCtrlInit(pAd);
BTMStateMachineInit(pAd, &pAd->Mlme.BTMMachine, pAd->Mlme.BTMFunc);
@ -1212,9 +1449,15 @@ VOID MlmeHalt(RTMP_ADAPTER *pAd)
#ifdef CONFIG_DOT11U_INTERWORKING
GASCtrlExit(pAd);
#endif
#ifdef CONFIG_STEERING_API_SUPPORT
BTMActionFrameListExit(pAd);
#endif
#ifdef CONFIG_DOT11V_WNM
WNMCtrlExit(pAd);
#endif
#ifdef CHANNEL_SWITCH_MONITOR_CONFIG
ch_switch_monitor_del(pAd);
#endif
if (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) {
RTMP_CHIP_OP *pChipOps = hc_get_chip_ops(pAd->hdev_ctrl);
@ -1284,42 +1527,28 @@ VOID MlmePeriodicExec(
{
ULONG TxTotalCnt;
RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)FunctionContext;
#ifdef RATE_PRIOR_SUPPORT
INT idx;
PMAC_TABLE_ENTRY pEntry = NULL;
PBLACK_STA pBlackSta = NULL, tmp;
#endif /*RATE_PRIOR_SUPPORT*/
#ifdef RACTRL_FW_OFFLOAD_SUPPORT
struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl);
#endif /* RACTRL_FW_OFFLOAD_SUPPORT */
struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(pAd->hdev_ctrl);
#ifdef NF_SUPPORT
#ifdef VENDOR10_CUSTOM_RSSI_FEATURE
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
INT32 ifIndex = pObj->ioctl_if;
struct wifi_dev *wdev;
if (IS_MT7615(pAd)) {
UINT8 NF_index = 0;
UINT32 Value = 0, value[11] = {0}, total = 0;
INT16 NF = 0;
INT16 NF_Power[] = {-92, -89, -86, -83, -80, -75, -70, -65, -60, -55, -52};
for (NF_index = 0; NF_index <= 10; NF_index++) {
MAC_IO_READ32(pAd, (0x12250 + 4 * NF_index), &value[NF_index]);
total += value[NF_index];
}
for (NF_index = 0; NF_index <= 10; NF_index++) {
NF += (NF_Power[NF_index] * (INT16)value[NF_index])/(INT16)total;
}
pAd->Avg_NFx16 = (pAd->Avg_NF != 0) ? (NF - pAd->Avg_NF + pAd->Avg_NFx16) : NF << 4;
pAd->Avg_NF = pAd->Avg_NFx16 >> 4;
if ((pObj->ioctl_if_type == INT_APCLI) && (ifIndex <= MAX_APCLI_NUM)) {
wdev = &pAd->ApCfg.MBSSID[ifIndex].wdev;
MTWF_LOG(DBG_CAT_RX, DBG_SUBCAT_ALL, DBG_LVL_TRACE,
("%s(): NF %d Avg_NF = %d \t Avg_NFx16 = %d\n", __FUNCTION__,
NF, pAd->Avg_NF, pAd->Avg_NFx16));
/* Reset */
HW_IO_READ32(pAd, PHY_RXTD_12, &Value);
Value |= (1 << B0IrpiSwCtrlResetOffset);
Value |= (1 << B0IrpiSwCtrlOnlyOffset);
HW_IO_WRITE32(pAd, PHY_RXTD_12, Value);
HW_IO_WRITE32(pAd, PHY_RXTD_12, Value);
/* Enable badn0 IPI control */
HW_IO_READ32(pAd, PHY_BAND0_PHYMUX_5, &Value);
Value |= (B0IpiEnableCtrlValue << B0IpiEnableCtrlOffset);
HW_IO_WRITE32(pAd, PHY_BAND0_PHYMUX_5, Value);
/* 100msec Periodic RSSI Update from WTBL */
if (wdev && IS_VENDOR10_RSSI_VALID(wdev))
Vendor10RssiUpdate(pAd, NULL, FALSE, 0);
}
#endif
@ -1335,6 +1564,61 @@ struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(pAd->hdev_ctrl);
#endif /* end ETSI_RX_BLOCKER_SUPPORT */
/* CFG MCC */
#ifdef OFFCHANNEL_SCAN_FEATURE
if (pAd->ScanCtrl.OffChScan_Band0 != TRUE) {
Calculate_NF(pAd, DBDC_BAND0);
} else {
if (pAd->ScanCtrl.OffChScan0_Ongoing != TRUE) {
pAd->ScanCtrl.OffChScan_Band0 = FALSE;
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("%s: Scan state set to IDLE and Register reset for Band 0 \n", __func__));
ResetEnable_NF_Registers(pAd, DBDC_BAND0);
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("%s: Register reset for Band 0 \n", __func__));
}
}
#ifdef DBDC_MODE
if (pAd->CommonCfg.dbdc_mode) {
if (pAd->ScanCtrl.OffChScan_Band1 != TRUE) {
Calculate_NF(pAd, DBDC_BAND1);
} else {
if (pAd->ScanCtrl.OffChScan1_Ongoing != TRUE) {
pAd->ScanCtrl.OffChScan_Band1 = FALSE;
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("%s: Scan state set to IDLE and Register reset for Band 1 \n", __func__));
ResetEnable_NF_Registers(pAd, DBDC_BAND1);
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("%s: Register reset for Band 1 \n", __func__));
}
}
}
#endif
#elif defined(NF_SUPPORT)
if (!ApScanRunning(pAd, NULL)) {
Calculate_NF(pAd, DBDC_BAND0);
#ifdef DBDC_MODE
if (pAd->CommonCfg.dbdc_mode)
Calculate_NF(pAd, DBDC_BAND1);
#endif
}
#endif /*OFFCHANNEL_SCAN_FEATURE , NF_SUPPORT*/
#if defined(OFFCHANNEL_SCAN_FEATURE) || defined(TR181_SUPPORT) || defined(TXRX_STAT_SUPPORT)
if ((!ApScanRunning(pAd, NULL))
#ifdef OFFCHANNEL_SCAN_FEATURE
&& (pAd->ScanCtrl.state == OFFCHANNEL_SCAN_INVALID)
#endif
#ifdef CUSTOMER_RSG_FEATURE
&& (pAd->EnableChannelStatsCheck && (pAd->ChannelStats.LastReadTime != 0))
#endif
)
ReadChannelStats(pAd);
#ifdef CUSTOMER_RSG_FEATURE
else if (pAd->EnableChannelStatsCheck && !(ApScanRunning(pAd, NULL)) && (pAd->ChannelStats.LastReadTime == 0)) {
ClearChannelStatsCr(pAd);
ReadChannelStats(pAd);
}
#endif
#endif
#ifdef MICROWAVE_OVEN_SUPPORT
/* update False CCA count to an array */
NICUpdateRxStatusCnt1(pAd, pAd->Mlme.PeriodicRound % 10);
@ -1494,6 +1778,9 @@ struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(pAd->hdev_ctrl);
}
}
#ifdef CONFIG_MAP_SUPPORT
map_rssi_status_check(pAd);
#endif
#ifdef SMART_ANTENNA
IF_DEV_CONFIG_OPMODE_ON_AP(pAd) {
@ -1517,10 +1804,54 @@ struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(pAd->hdev_ctrl);
}
#endif /* SMART_ANTENNA */
#ifdef CUSTOMER_DCC_FEATURE
pAd->EnableRssiReadDataPacket = pAd->EnableRssiReadDataPacket ? FALSE : TRUE;
#endif
/* Normal 1 second Mlme PeriodicExec.*/
if (pAd->Mlme.PeriodicRound % MLME_TASK_EXEC_MULTIPLE == 0) {
pAd->Mlme.OneSecPeriodicRound++;
#ifdef CUSTOMER_RSG_FEATURE
UpdateRadioStatCounters(pAd);
#else
#ifdef CUSTOMER_DCC_FEATURE
if (pAd->ApCfg.EntryClientCount)
Update_Wtbl_Counters(pAd);
#endif
#endif
#ifdef TXRX_STAT_SUPPORT
if (pAd->ApCfg.EntryClientCount
#ifndef VENDOR_FEATURE11_SUPPORT
&& pAd->EnableTxRxStats
#endif /* VENDOR_FEATURE11_SUPPORT */
) {
MtCmdGetPerStaTxStat(pAd, NULL, 0); /*bitmap and entryCount to be used in future*/
#ifndef VENDOR_FEATURE11_SUPPORT
Update_LastSec_TXRX_Stats(pAd);
#endif /* VENDOR_FEATURE11_SUPPORT */
}
#endif
#ifdef CONFIG_RECOVERY_ON_INTERRUPT_MISS
if ((pAd->tr_ctl.total_int_count == 0) || ((pAd->tr_ctl.rx_data_int_count == 0)
&& (pAd->tr_ctl.rx_cmd_int_count == 0))) {
MTWF_LOG(DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_OFF, ("interrupt miss from last 1 sec\n"));
MTWF_LOG(DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_OFF, ("Total %lu, rx_data %lu, rx_cmd %lu \n",
pAd->tr_ctl.total_int_count, pAd->tr_ctl.rx_data_int_count, pAd->tr_ctl.rx_cmd_int_count));
if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_ACTIVE)) {
MTWF_LOG(DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_OFF, ("Disabling interrupt\n"));
RTMP_ASIC_INTERRUPT_DISABLE(pAd);
}
MTWF_LOG(DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_OFF, ("Enabling interrupt\n"));
RTMP_ASIC_INTERRUPT_ENABLE(pAd);
}
pAd->tr_ctl.total_int_count = 0;
pAd->tr_ctl.rx_data_int_count = 0;
pAd->tr_ctl.rx_cmd_int_count = 0;
#endif
if (IS_ASIC_CAP(pAd, fASIC_CAP_WMM_PKTDETECT_OFFLOAD)) {
MtCmdCr4QueryBssAcQPktNum(pAd, CR4_GET_BSS_ACQ_PKT_NUM_CMD_DEFAULT);
} else {
@ -1595,6 +1926,9 @@ struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(pAd->hdev_ctrl);
/* QBSS_LoadUpdate from Mib_Bucket */
hotspot_update_ap_qload_to_bcn(pAd);
#endif /* AP_QLOAD_SUPPORT */
#ifdef WAPP_SUPPORT
wapp_bss_load_check(pAd);
#endif /* WAPP_SUPPORT */
#endif /* CONFIG_HOTSPOT_R2 */
APMlmePeriodicExec(pAd);
#ifdef BACKGROUND_SCAN_SUPPORT
@ -1672,7 +2006,21 @@ struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(pAd->hdev_ctrl);
}
}
}
#ifdef AP_SCAN_SUPPORT
if (pAd->ScanCtrl.PartialScan.bPeriodicPartialScan == TRUE) {
if ((pAd->ScanCtrl.PartialScan.TriggerCount % pAd->ScanCtrl.PartialScan.TriggerPeriod) == 0) {
pAd->ScanCtrl.PartialScan.pwdev = &pAd->ApCfg.MBSSID[0].wdev;
pAd->ScanCtrl.PartialScan.bScanning = TRUE;
MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE,
("%s(): bScanning = %u\n", __func__, pAd->ScanCtrl.PartialScan.bScanning));
pAd->ScanCtrl.PartialScan.TriggerCount = 0;
}
pAd->ScanCtrl.PartialScan.TriggerCount++;
}
#endif /* AP_SCAN_SUPPORT */
#endif /* CONFIG_AP_SUPPORT */
#ifdef WSC_INCLUDED
WSC_HDR_BTN_MR_HANDLE(pAd);
@ -1684,6 +2032,54 @@ struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(pAd->hdev_ctrl);
#endif
#endif /* WSC_INCLUDED */
pAd->bUpdateBcnCntDone = FALSE;
#ifdef RATE_PRIOR_SUPPORT
if (pAd->Mlme.PeriodicRound % MLME_TASK_EXEC_MULTIPLE == 0 && pAd->LowRateCtrl.RatePrior == 1) {
RTMP_SEM_LOCK(&pAd->LowRateCtrl.BlackListLock);
DlListForEach(pBlackSta, &pAd->LowRateCtrl.BlackList, BLACK_STA, List) {
if (time_after(jiffies, pBlackSta->Jiff + (pAd->LowRateCtrl.BlackListTimeout)*HZ)) {
MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF,
("Remove from blklist, %02x:%02x:%02x:%02x:%02x:%02x\n", PRINT_MAC(pBlackSta->Addr)));
tmp = pBlackSta;
pBlackSta = DlListEntry(pBlackSta->List.Prev, BLACK_STA, List);
DlListDel(&(tmp->List));
os_free_mem(tmp);
}
}
RTMP_SEM_UNLOCK(&pAd->LowRateCtrl.BlackListLock);
}
if (pAd->Mlme.PeriodicRound % (MLME_TASK_EXEC_MULTIPLE * pAd->LowRateCtrl.LowRateCountPeriod) == 0
&& pAd->LowRateCtrl.RatePrior == 1) {
for (idx = 1; idx < MAX_LEN_OF_MAC_TABLE; idx++) {
pEntry = &(pAd->MacTab.Content[idx]);
if (IS_ENTRY_CLIENT(pEntry)) {
if (pEntry->McsTotalRxCount > pAd->LowRateCtrl.TotalCntThreshold) {
if (pAd->LowRateCtrl.LowRateRatioThreshold * pEntry->McsTotalRxCount <
10 * pEntry->McsLowRateRxCount) {
MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF,
("LowRateRatio exceed Threshold!Send DEAUTH frame!!\n"));
os_alloc_mem(NULL, (UCHAR **)&pBlackSta, sizeof(BLACK_STA));
NdisZeroMemory(pBlackSta, sizeof(BLACK_STA));
NdisCopyMemory(pBlackSta->Addr, pEntry->Addr, MAC_ADDR_LEN);
pBlackSta->Jiff = jiffies;
RTMP_SEM_LOCK(&pAd->LowRateCtrl.BlackListLock);
DlListAdd(&pAd->LowRateCtrl.BlackList, &(pBlackSta->List));
RTMP_SEM_UNLOCK(&pAd->LowRateCtrl.BlackListLock);
MlmeDeAuthAction(pAd, pEntry, REASON_UNSPECIFY, FALSE);
}
}
pEntry->McsTotalRxCount = 0;
pEntry->McsLowRateRxCount = 0;
}
}
}
#endif /*RATE_PRIOR_SUPPORT*/
}
@ -1799,7 +2195,11 @@ VOID MlmeCalculateChannelQuality(
MaxRssi = RTMPMaxRssi(pAd, pRssiSample->LastRssi[0],
pRssiSample->LastRssi[1],
pRssiSample->LastRssi[2]);
pRssiSample->LastRssi[2]
#if defined(CUSTOMER_DCC_FEATURE) || defined(CONFIG_MAP_SUPPORT)
, pRssiSample->LastRssi[3]
#endif
);
/*
calculate TX packet error ratio and TX retry ratio - if too few TX samples,
skip TX related statistics
@ -2431,6 +2831,108 @@ VOID MlmeUpdateTxRates(RTMP_ADAPTER *pAd, BOOLEAN bLinkUp, UCHAR apidx)
wdev->rate.MlmeTransmit.field.MCS = OfdmRateToRxwiMCS[pAd->CommonCfg.MlmeRate];
}
#ifdef MIN_PHY_RATE_SUPPORT
if ((wdev->PhyMode == WMODE_B) && (wdev->channel <= 14) &&
(wdev->rate.DisableCCKRate == FALSE)) {
if (wdev->rate.MinPhyDataRateTransmit.field.MODE != MODE_CCK) {
wdev->rate.MinPhyDataRateTransmit.field.MODE = MODE_CCK;
wdev->rate.MinPhyDataRateTransmit.field.MCS = RATE_1;
}
if (wdev->rate.MinPhyBeaconRateTransmit.field.MODE != MODE_CCK) {
wdev->rate.MinPhyBeaconRateTransmit.field.MODE = MODE_CCK;
wdev->rate.MinPhyBeaconRateTransmit.field.MCS = RATE_1;
}
if (wdev->rate.MinPhyMgmtRateTransmit.field.MODE != MODE_CCK) {
wdev->rate.MinPhyMgmtRateTransmit.field.MODE = MODE_CCK;
wdev->rate.MinPhyMgmtRateTransmit.field.MCS = RATE_1;
}
if (wdev->rate.MinPhyBcMcRateTransmit.field.MODE != MODE_CCK) {
wdev->rate.MinPhyBcMcRateTransmit.field.MODE = MODE_CCK;
wdev->rate.MinPhyBcMcRateTransmit.field.MCS = RATE_1;
}
} else if (wdev->channel <= 14) {
if (wdev->rate.DisableCCKRate == TRUE) {
if (wdev->rate.MinPhyMgmtRateTransmit.field.MODE == MODE_CCK) {
if (wdev->rate.MinPhyMgmtRate < PHY_RATE_6) {
wdev->rate.MinPhyMgmtRate = PHY_RATE_6;
wdev->rate.MinPhyMgmtRateTransmit.field.MODE = MODE_OFDM;
wdev->rate.MinPhyMgmtRateTransmit.field.MCS = OfdmRateToRxwiMCS[RATE_6];
} else {
wdev->rate.MinPhyMgmtRate = PHY_RATE_12;
wdev->rate.MinPhyMgmtRateTransmit.field.MODE = MODE_OFDM;
wdev->rate.MinPhyMgmtRateTransmit.field.MCS = OfdmRateToRxwiMCS[RATE_12];
}
}
if (wdev->rate.MinPhyDataRateTransmit.field.MODE == MODE_CCK) {
if (wdev->rate.MinPhyDataRate < PHY_RATE_6) {
wdev->rate.MinPhyDataRate = PHY_RATE_6;
wdev->rate.MinPhyDataRateTransmit.field.MODE = MODE_OFDM;
wdev->rate.MinPhyDataRateTransmit.field.MCS = OfdmRateToRxwiMCS[RATE_6];
} else {
wdev->rate.MinPhyDataRate = PHY_RATE_12;
wdev->rate.MinPhyDataRateTransmit.field.MODE = MODE_OFDM;
wdev->rate.MinPhyDataRateTransmit.field.MCS = OfdmRateToRxwiMCS[RATE_12];
}
}
if (wdev->rate.MinPhyBcMcRateTransmit.field.MODE == MODE_CCK) {
if (wdev->rate.MinPhyBcMcRate < PHY_RATE_6) {
wdev->rate.MinPhyBcMcRate = PHY_RATE_6;
wdev->rate.MinPhyBcMcRateTransmit.field.MODE = MODE_OFDM;
wdev->rate.MinPhyBcMcRateTransmit.field.MCS = OfdmRateToRxwiMCS[RATE_6];
} else {
wdev->rate.MinPhyBcMcRate = PHY_RATE_12;
wdev->rate.MinPhyBcMcRateTransmit.field.MODE = MODE_OFDM;
wdev->rate.MinPhyBcMcRateTransmit.field.MCS = OfdmRateToRxwiMCS[RATE_12];
}
}
}
} else if (wdev->channel > 14) {
if (wdev->rate.MinPhyDataRateTransmit.field.MODE != MODE_OFDM) {
wdev->rate.MinPhyDataRateTransmit.field.MODE = MODE_OFDM;
wdev->rate.MinPhyDataRateTransmit.field.MCS = OfdmRateToRxwiMCS[RATE_6];
}
if (wdev->rate.MinPhyBeaconRateTransmit.field.MODE != MODE_OFDM) {
wdev->rate.MinPhyBeaconRateTransmit.field.MODE = MODE_OFDM;
wdev->rate.MinPhyBeaconRateTransmit.field.MCS = OfdmRateToRxwiMCS[RATE_6];
}
if (wdev->rate.MinPhyMgmtRateTransmit.field.MODE != MODE_OFDM) {
wdev->rate.MinPhyMgmtRateTransmit.field.MODE = MODE_OFDM;
wdev->rate.MinPhyMgmtRateTransmit.field.MCS = OfdmRateToRxwiMCS[RATE_6];
}
if (wdev->rate.MinPhyBcMcRateTransmit.field.MODE != MODE_OFDM) {
wdev->rate.MinPhyBcMcRateTransmit.field.MODE = MODE_OFDM;
wdev->rate.MinPhyBcMcRateTransmit.field.MCS = OfdmRateToRxwiMCS[RATE_6];
}
}
if (wdev->rate.MinPhyMgmtRate != 0) {
if (wdev->rate.MinPhyMgmtRateTransmit.field.MODE == MODE_CCK) {
pAd->CommonCfg.MlmeRate = wdev->rate.MinPhyMgmtRateTransmit.field.MCS;
pAd->CommonCfg.BasicMlmeRate = wdev->rate.MinPhyMgmtRateTransmit.field.MCS;
pAd->CommonCfg.RtsRate = wdev->rate.MinPhyMgmtRateTransmit.field.MCS;
wdev->rate.TxRate = wdev->rate.MinPhyMgmtRateTransmit.field.MCS;
wdev->rate.MlmeTransmit = wdev->rate.MinPhyMgmtRateTransmit;
} else if (wdev->rate.MinPhyMgmtRateTransmit.field.MODE == MODE_OFDM) {
UCHAR OfdmMcs = 0;
OfdmMcs = wdev->rate.MinPhyMgmtRateTransmit.field.MCS;
pAd->CommonCfg.MlmeRate = RxwiMCSToOfdmRate[OfdmMcs];
pAd->CommonCfg.BasicMlmeRate = RxwiMCSToOfdmRate[OfdmMcs];
pAd->CommonCfg.RtsRate = RxwiMCSToOfdmRate[OfdmMcs];
wdev->rate.TxRate = RxwiMCSToOfdmRate[OfdmMcs];
wdev->rate.MlmeTransmit = wdev->rate.MinPhyMgmtRateTransmit;
}
}
#endif /* MIN_PHY_RATE_SUPPORT */
/* Keep Basic Mlme Rate.*/
pAd->MacTab.Content[MCAST_WCID_TO_REMOVE].HTPhyMode.word = wdev->rate.MlmeTransmit.word;
@ -2445,6 +2947,9 @@ VOID MlmeUpdateTxRates(RTMP_ADAPTER *pAd, BOOLEAN bLinkUp, UCHAR apidx)
{
/* set default value if MCastPhyMode is not initialized */
HTTRANSMIT_SETTING tPhyMode, *pTransmit;
#ifdef MCAST_BCAST_RATE_SET_SUPPORT
HTTRANSMIT_SETTING *pBCastTransmit;
#endif /* MCAST_BCAST_RATE_SET_SUPPORT */
memset(&tPhyMode, 0, sizeof(HTTRANSMIT_SETTING));
pTransmit = (wdev->channel > 14) ? (&pAd->CommonCfg.MCastPhyMode_5G) : (&pAd->CommonCfg.MCastPhyMode);
@ -2452,6 +2957,10 @@ VOID MlmeUpdateTxRates(RTMP_ADAPTER *pAd, BOOLEAN bLinkUp, UCHAR apidx)
if (memcmp(pTransmit, &tPhyMode, sizeof(HTTRANSMIT_SETTING)) == 0) {
memmove(pTransmit, &pAd->MacTab.Content[MCAST_WCID_TO_REMOVE].HTPhyMode,
sizeof(HTTRANSMIT_SETTING));
#ifdef MCAST_BCAST_RATE_SET_SUPPORT
pBCastTransmit = (wdev->channel > 14) ? (&pAd->CommonCfg.BCastPhyMode_5G) : (&pAd->CommonCfg.BCastPhyMode);
NdisMoveMemory(pBCastTransmit, pTransmit, sizeof(HTTRANSMIT_SETTING));
#endif /* MCAST_BCAST_RATE_SET_SUPPORT */
}
/*
@ -2926,6 +3435,9 @@ VOID MlmeUpdateTxRatesWdev(RTMP_ADAPTER *pAd, BOOLEAN bLinkUp, struct wifi_dev *
{
/* set default value if MCastPhyMode is not initialized */
HTTRANSMIT_SETTING tPhyMode, *pTransmit;
#ifdef MCAST_BCAST_RATE_SET_SUPPORT
HTTRANSMIT_SETTING *pBCastTransmit;
#endif /* MCAST_BCAST_RATE_SET_SUPPORT */
memset(&tPhyMode, 0, sizeof(HTTRANSMIT_SETTING));
pTransmit = (wdev->channel > 14) ? (&pAd->CommonCfg.MCastPhyMode_5G) : (&pAd->CommonCfg.MCastPhyMode);
@ -2933,6 +3445,10 @@ VOID MlmeUpdateTxRatesWdev(RTMP_ADAPTER *pAd, BOOLEAN bLinkUp, struct wifi_dev *
if (memcmp(pTransmit, &tPhyMode, sizeof(HTTRANSMIT_SETTING)) == 0) {
memmove(pTransmit, &pAd->MacTab.Content[MCAST_WCID_TO_REMOVE].HTPhyMode,
sizeof(HTTRANSMIT_SETTING));
#ifdef MCAST_BCAST_RATE_SET_SUPPORT
pBCastTransmit = (wdev->channel > 14) ? (&pAd->CommonCfg.BCastPhyMode_5G) : (&pAd->CommonCfg.BCastPhyMode);
NdisMoveMemory(pBCastTransmit, pTransmit, sizeof(HTTRANSMIT_SETTING));
#endif /* MCAST_BCAST_RATE_SET_SUPPORT */
}
/*
@ -3156,7 +3672,7 @@ VOID MlmeRadioOn(RTMP_ADAPTER *pAd, struct wifi_dev *wdev)
wdev->fgRadioOnRequest = TRUE;
MTRadioOn(pAd, wdev);
RTMP_OS_NETDEV_START_QUEUE(wdev->if_dev);
#ifdef NF_SUPPORT
#if defined(NF_SUPPORT) || defined(OFFCHANNEL_SCAN_FEATURE)
if (IS_MT7615(pAd))
enable_nf_support(pAd);
#endif
@ -3686,12 +4202,11 @@ BOOLEAN MlmeEnqueueForRecv(
}
#ifdef CONFIG_AP_SUPPORT
#if defined(P2P_SUPPORT) || defined(RT_CFG80211_P2P_SUPPORT) || defined(CFG80211_MULTI_STA)
#if defined(P2P_SUPPORT) || defined(RT_CFG80211_P2P_SUPPORT) || defined(CFG80211_MULTI_STA) || defined(APCLI_CFG80211_SUPPORT)
if (OpMode == OPMODE_AP)
#else
IF_DEV_CONFIG_OPMODE_ON_AP(pAd)
#endif /* P2P_SUPPORT || RT_CFG80211_P2P_SUPPORT */
#endif /* P2P_SUPPORT || RT_CFG80211_P2P_SUPPORT || APCLI_CFG80211_SUPPORT */
{
#ifdef APCLI_SUPPORT
@ -3768,7 +4283,7 @@ BOOLEAN MlmeEnqueueForRecv(
}
#ifdef WDS_SUPPORT
if (WdsMsgTypeSubst(pAd, pFrame, &Machine, &MsgType)) {
if (wdev->wdev_type == WDEV_TYPE_WDS && WdsMsgTypeSubst(pAd, pFrame, &Machine, &MsgType)) {
/* wds case */
break;
}
@ -4305,6 +4820,10 @@ CHAR RTMPAvgRssi(RTMP_ADAPTER *pAd, RSSI_SAMPLE *pRssi)
rx_stream = pAd->Antenna.field.RxPath;
/* single chip dbdc only has 2 functional antennae*/
if (pAd->CommonCfg.dbdc_mode == TRUE && rx_stream == 4)
rx_stream = 2;
if (rx_stream == 4)
Rssi_temp = (pRssi->AvgRssi[0] + pRssi->AvgRssi[1] + pRssi->AvgRssi[2] + pRssi->AvgRssi[3]) >> 2;
else if (rx_stream == 3)
@ -4318,8 +4837,11 @@ CHAR RTMPAvgRssi(RTMP_ADAPTER *pAd, RSSI_SAMPLE *pRssi)
return Rssi;
}
#if defined(CUSTOMER_DCC_FEATURE) || defined(CONFIG_MAP_SUPPORT)
CHAR RTMPMaxRssi(RTMP_ADAPTER *pAd, CHAR Rssi0, CHAR Rssi1, CHAR Rssi2, CHAR Rssi3)
#else
CHAR RTMPMaxRssi(RTMP_ADAPTER *pAd, CHAR Rssi0, CHAR Rssi1, CHAR Rssi2)
#endif
{
CHAR larger = -127;
@ -4332,6 +4854,13 @@ CHAR RTMPMaxRssi(RTMP_ADAPTER *pAd, CHAR Rssi0, CHAR Rssi1, CHAR Rssi2)
if ((pAd->Antenna.field.RxPath == 3) && (Rssi2 != 0))
larger = max(larger, Rssi2);
#if defined(CUSTOMER_DCC_FEATURE) || defined(CONFIG_MAP_SUPPORT)
if (!pAd->CommonCfg.dbdc_mode) {
if ((pAd->Antenna.field.RxPath == 4) && (Rssi3 != 0))
larger = max(larger, Rssi3);
}
#endif
if (larger == -127)
larger = 0;

View File

@ -18,19 +18,30 @@
#include "rt_config.h"
/*Local definition*/
#define FIRST_AP_2G_PROFILE_PATH "/etc/wireless/mt7615/mt7615.1.2G.dat"
#define FIRST_AP_5G_PROFILE_PATH "/etc/wireless/mt7615/mt7615.1.5G.dat"
#define FIRST_AP_2G_PROFILE_PATH "/etc/Wireless/RT2860/RT2860_2G.dat"
#define FIRST_AP_5G_PROFILE_PATH "/etc/Wireless/RT2860/RT2860_5G.dat"
#define FIRST_AP_MERGE_PROFILE_PATH ""
#if defined(BB_SOC) && !defined(MULTI_INF_SUPPORT)
#define FIRST_AP_5G_DEVNAME "rai0"
#define FIRST_MBSSID_5G_DEVNAME "rai"
#define FIRST_APCLI_5G_DEVNAME "apclii"
#else
#define FIRST_AP_5G_DEVNAME "rax0"
#define FIRST_MBSSID_5G_DEVNAME "rax"
#define FIRST_APCLI_5G_DEVNAME "apclix"
#endif
#define SECOND_AP_2G_PROFILE_PATH "/etc/Wireless/iNIC/iNIC_ap_2G.dat"
#define SECOND_AP_5G_PROFILE_PATH "/etc/Wireless/iNIC/iNIC_ap_5G.dat"
#define SECOND_AP_MERGE_PROFILE_PATH ""
#if defined(BB_SOC) && !defined(MULTI_INF_SUPPORT)
#define SECOND_AP_5G_DEVNAME "ra0"
#define SECOND_MBSSID_5G_DEVNAME "ra"
#define SECOND_APCLI_5G_DEVNAME "apcli"
#else
#define SECOND_AP_5G_DEVNAME "ray0"
#define SECOND_MBSSID_5G_DEVNAME "ray"
#define SECOND_APCLI_5G_DEVNAME "apcliiy"
#endif
#define THIRD_AP_2G_PROFILE_PATH "/etc/Wireless/WIFI3/RT2870AP_2G.dat"
#define THIRD_AP_5G_PROFILE_PATH "/etc/Wireless/WIFI3/RT2870AP_5G.dat"
#define THIRD_AP_MERGE_PROFILE_PATH ""
@ -122,7 +133,7 @@ NDIS_STATUS update_mtb_value(struct _RTMP_ADAPTER *pAd, UCHAR profile_id, UINT_3
switch (profile_id) {
case MTB_2G_PROFILE:
if (strcmp(value, mtb[dev_idx].profile_2g)) {
strcpy(mtb[dev_idx].profile_2g, value);
strncpy(mtb[dev_idx].profile_2g, value, L2PROFILE_PATH_LEN - 1);
MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE,
("mtb[%d].profile_2g updated as %s!\n", dev_idx, mtb[dev_idx].profile_2g));
} else {
@ -132,7 +143,7 @@ NDIS_STATUS update_mtb_value(struct _RTMP_ADAPTER *pAd, UCHAR profile_id, UINT_3
break;
case MTB_5G_PROFILE:
if (strcmp(value, mtb[dev_idx].profile_5g)) {
strncpy(mtb[dev_idx].profile_5g, value, L2PROFILE_PATH_LEN);
strncpy(mtb[dev_idx].profile_5g, value, L2PROFILE_PATH_LEN - 1);
MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE,
("mtb[%d].profile_5g updated as %s!\n", dev_idx, mtb[dev_idx].profile_5g));
} else {
@ -197,7 +208,7 @@ static UCHAR *multi_profile_fname_get(struct _RTMP_ADAPTER *pAd, UCHAR profile_i
if (strlen(src) == 0) {
strncat(src, mtb[card_idx].profile_2g, count_depth(mtb[card_idx].profile_2g));
sprintf(src, "%sDBDC_card%d.dat", src, card_idx);
snprintf(src, L2PROFILE_PATH_LEN, "%sDBDC_card%d.dat", src, card_idx);
}
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF,
@ -931,7 +942,12 @@ static INT multi_profile_merge_country_region(
INT Status = FALSE;
CHAR value[TEMP_STR_SIZE] = "";
CHAR tmpbuf[TEMP_STR_SIZE] = "";
#ifdef DEFAULT_5G_PROFILE
Status = RTMPGetKeyParameter(parm, tmpbuf, TEMP_STR_SIZE, buf1, TRUE);
#else
Status = RTMPGetKeyParameter(parm, tmpbuf, TEMP_STR_SIZE, buf2, TRUE);
#endif
if (Status == TRUE) {
snprintf(value, sizeof(value), "%s", tmpbuf);
@ -958,6 +974,12 @@ static INT multi_profile_merge_mbss(
multi_profile_merge_perband(data, "FragThreshold", buf1, buf2, final);
/*merge DLSCapable*/
multi_profile_merge_separate("DLSCapable", buf1, buf2, final);
/* MAP config */
#ifdef CONFIG_MAP_SUPPORT
multi_profile_merge_separate("MapEnable", buf1, buf2, final);
multi_profile_merge_separate("MAP_Turnkey", buf1, buf2, final);
multi_profile_merge_separate("MAP_Ext", buf1, buf2, final);
#endif
/*merge WirelessMode*/
multi_profile_merge_wireless_mode(data, buf1, buf2, final);
/*merge Channel*/
@ -1002,6 +1024,11 @@ static INT multi_profile_merge_mbss(
multi_profile_merge_separate("MbssMaxStaNum", buf1, buf2, final);
/*merge APSDCapable*/
multi_profile_merge_separate("APSDCapable", buf1, buf2, final);
/*merge DscpQosMapping*/
#ifdef DSCP_QOS_MAP_SUPPORT
multi_profile_merge_separate("DscpQosMapEnable", buf1, buf2, final);
multi_profile_merge_separate("DscpQosMap", buf1, buf2, final);
#endif
/*merge APEdcaIdx*/
multi_profile_merge_apedca(data, buf1, buf2, final);
/*merge BSSEdcaIdx*/
@ -1061,7 +1088,8 @@ static INT multi_profile_merge_wsc(
for (i = 0, macptr = rstrtok(WscConMode, ";"); macptr; macptr = rstrtok(NULL, ";"), i++)
;/*do nothing*/
RTMPGetKeyParameter("WscV2Support", WscConMode, sizeof(WscConMode), buf1, TRUE);
if (RTMPGetKeyParameter("WscV2Support", WscConMode, sizeof(WscConMode), buf1, TRUE) != TRUE)
goto label_wsc_v2_done;
if (data->pf1_num > i) {/* need to append default value */
INT append_cnt = data->pf1_num - i;
@ -1081,7 +1109,8 @@ static INT multi_profile_merge_wsc(
for (i = 0, macptr = rstrtok(WscConMode2, ";"); macptr; macptr = rstrtok(NULL, ";"), i++)
;/*do nothing*/
RTMPGetKeyParameter("WscV2Support", WscConMode2, sizeof(WscConMode2), buf2, TRUE);
if (RTMPGetKeyParameter("WscV2Support", WscConMode2, sizeof(WscConMode2), buf2, TRUE) != TRUE)
goto label_wsc_v2_done;
if (data->pf2_num > i) {/* need to append default value */
INT append_cnt = data->pf2_num - i;
@ -1109,7 +1138,8 @@ label_wsc_v2_done:
for (i = 0, macptr = rstrtok(WscConMode, ";"); macptr; macptr = rstrtok(NULL, ";"), i++)
;/*do nothing*/
RTMPGetKeyParameter("WscConfMode", WscConMode, sizeof(WscConMode), buf1, TRUE);
if (RTMPGetKeyParameter("WscConfMode", WscConMode, sizeof(WscConMode), buf1, TRUE) != TRUE)
goto label_WscConfMode_done;
if (data->pf1_num > i) {/* need to append default value */
INT append_cnt = data->pf1_num - i;
@ -1129,7 +1159,8 @@ label_wsc_v2_done:
for (i = 0, macptr = rstrtok(WscConMode2, ";"); macptr; macptr = rstrtok(NULL, ";"), i++)
;/*do nothing*/
RTMPGetKeyParameter("WscConfMode", WscConMode2, sizeof(WscConMode2), buf2, TRUE);
if (RTMPGetKeyParameter("WscConfMode", WscConMode2, sizeof(WscConMode2), buf2, TRUE) != TRUE)
goto label_WscConfMode_done;
if (data->pf2_num > i) {/* need to append default value */
INT append_cnt = data->pf2_num - i;
@ -1154,7 +1185,8 @@ label_WscConfMode_done:
for (i = 0, macptr = rstrtok(WscConMode, ";"); macptr; macptr = rstrtok(NULL, ";"), i++)
;/*do nothing*/
RTMPGetKeyParameter("WscConfStatus", WscConMode, sizeof(WscConMode), buf1, TRUE);
if (RTMPGetKeyParameter("WscConfStatus", WscConMode, sizeof(WscConMode), buf1, TRUE) != TRUE)
goto label_WscConfStatus_done;
if (data->pf1_num > i) {/* need to append default value */
INT append_cnt = data->pf1_num - i;
@ -1590,21 +1622,25 @@ static INT multi_profile_merge_5g_only(
if (RTMPGetKeyParameter("MUTxRxEnable", tmpbuf, len, buf_mu, TRUE) == TRUE)
RTMPSetKeyParameter("MUTxRxEnable", tmpbuf, len, final, TRUE);
#ifdef DEFAULT_5G_PROFILE
buf_mu = buf1;
#endif
/*IEEE80211H*/
if (RTMPGetKeyParameter("IEEE80211H", tmpbuf, len, buf2, TRUE) == TRUE)
if (RTMPGetKeyParameter("IEEE80211H", tmpbuf, len, buf_mu, TRUE) == TRUE)
RTMPSetKeyParameter("IEEE80211H", tmpbuf, len, final, TRUE);
/*DFS related params is 5G only, use profile 2*/
#ifdef MT_DFS_SUPPORT
/*DfsEnable*/
if (RTMPGetKeyParameter("DfsEnable", tmpbuf, len, buf2, TRUE) == TRUE)
if (RTMPGetKeyParameter("DfsEnable", tmpbuf, len, buf_mu, TRUE) == TRUE)
RTMPSetKeyParameter("DfsEnable", tmpbuf, len, final, TRUE);
#endif
/*RDRegion*/
if (RTMPGetKeyParameter("RDRegion", tmpbuf, len, buf2, TRUE) == TRUE)
if (RTMPGetKeyParameter("RDRegion", tmpbuf, len, buf_mu, TRUE) == TRUE)
RTMPSetKeyParameter("RDRegion", tmpbuf, len, final, TRUE);
return NDIS_STATUS_SUCCESS;
@ -1666,6 +1702,10 @@ static INT multi_profile_merge_global_setting_only(CHAR *buf1, CHAR *buf2, CHAR
if (RTMPGetKeyParameter("GreenAP", tmpbuf, len, buf2, TRUE) == TRUE)
RTMPSetKeyParameter("GreenAP", tmpbuf, len, final, TRUE);
/*merge PcieAspm*/
if (RTMPGetKeyParameter("PcieAspm", tmpbuf, len, buf2, TRUE) == TRUE)
RTMPSetKeyParameter("PcieAspm", tmpbuf, len, final, TRUE);
/*DBDC_MODE*/
if (RTMPGetKeyParameter("DBDC_MODE", tmpbuf, len, buf2, TRUE) == TRUE)
RTMPSetKeyParameter("DBDC_MODE", tmpbuf, len, final, TRUE);
@ -1937,6 +1977,35 @@ static INT multi_profile_merge_wnm(
#endif
#ifdef DSCP_PRI_SUPPORT
INT multi_profile_merge_dscp_pri(
struct mpf_data *data,
CHAR *buf1,
CHAR *buf2,
CHAR *final)
{
INT8 i = 0;
CHAR tok_str[TEMP_STR_SIZE] = "";
CHAR tmpbuf[TEMP_STR_SIZE] = "";
if (!buf2)
return NDIS_STATUS_FAILURE;
for (i = 0; i < data->pf2_num; i++) {
snprintf(tok_str, sizeof(tok_str), "DscpPriMapBss%d", i);
if (RTMPGetKeyParameter(tok_str, tmpbuf, TEMP_STR_SIZE, buf2, TRUE)) {
snprintf(tok_str, sizeof(tok_str), "DscpPriMapBss%d", (data->pf1_num + i));
RTMPSetKeyParameter(tok_str, tmpbuf, TEMP_STR_SIZE, final, TRUE);
} else {
snprintf(tok_str, sizeof(tok_str), "DscpPriMapBss%d", (data->pf1_num + i));
RTMPSetKeyParameter(tok_str, "", TEMP_STR_SIZE, final, TRUE);
}
}
return NDIS_STATUS_SUCCESS;
}
#endif
/*
* set second profile and merge it.
*/
@ -2005,10 +2074,9 @@ static INT multi_profile_merge(
if (multi_profile_merge_ht_mode(data, buf1, buf2, final) != NDIS_STATUS_SUCCESS)
return retval;
#ifdef DEFAULT_5G_PROFILE
if (multi_profile_merge_5g_only(data, buf2, buf1, final) != NDIS_STATUS_SUCCESS)
if (multi_profile_merge_5g_only(data, buf1, buf2, final) != NDIS_STATUS_SUCCESS)
return retval;
#ifdef DEFAULT_5G_PROFILE
if (multi_profile_merge_2g_only(buf1, buf2, final) != NDIS_STATUS_SUCCESS)
return retval;
@ -2017,11 +2085,6 @@ static INT multi_profile_merge(
if (multi_profile_merge_global_setting_only(buf1, buf2, final) != NDIS_STATUS_SUCCESS)
return retval;
#else
if (multi_profile_merge_5g_only(data, buf1, buf2, final) != NDIS_STATUS_SUCCESS)
return retval;
#endif
#ifdef IGMP_SNOOP_SUPPORT
@ -2060,6 +2123,11 @@ static INT multi_profile_merge(
#endif
#ifdef DSCP_PRI_SUPPORT
if (multi_profile_merge_dscp_pri(data, buf1, buf2, final) != NDIS_STATUS_SUCCESS)
return retval;
#endif
data->enable = TRUE;
/*adjust specific device name*/
data->specific_dname = TRUE;
@ -2169,12 +2237,31 @@ INT multi_profile_apcli_devname_req(struct _RTMP_ADAPTER *ad, UCHAR *final_name,
if (*ifidx == 1) {
/* apcli1 is 2.4G, name is apclix0*/
sprintf(final_name, "%s", get_dbdcdev_name_prefix(ad, INT_APCLI));
snprintf(final_name, IFNAMSIZ, "%s", get_dbdcdev_name_prefix(ad, INT_APCLI));
}
return NDIS_STATUS_SUCCESS;
}
#ifdef DSCP_QOS_MAP_SUPPORT
INT multi_profile_get_bss_num(struct _RTMP_ADAPTER *ad, UINT8 profile_num)
{
struct mpf_data *data;
if (!ad->multi_pf_ctrl)
return 0;
data = (struct mpf_data *) ad->multi_pf_ctrl;
MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF,
("MultiProfile profile1 BssNum %d for profile2 BssNum %d \n",
data->pf1_num, data->pf2_num));
if (profile_num == 1)
return data->pf1_num;
else
return data->pf2_num;
}
#endif
/*
*
*/

View File

@ -104,9 +104,7 @@ REG_CLASS reg_class_ce[] = {
{1, 115, FREQ_5G00, BW_20, {36, 40, 44, 48, 0}, COMMON},
{2, 118, FREQ_5G00, BW_20, {52, 56, 60, 64, 0}, NOMADICBEHAVIOR},
{3, 121, FREQ_5G00, BW_20, {100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 0}, COMMON},
#ifdef SPECIAL_FREQUENCY
{4, 81, FREQ_2G407, BW_25, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0}, LICENSEEXEMPTBEHAVIOR},
#endif /* SPECIAL_FREQUENCY */
{5, 116, FREQ_5G00, BW_40, {36, 44, 0}, PRIMARYCHANNELLOWERBEHAVIOR},
{6, 119, FREQ_5G00, BW_40, {52, 60, 0}, PRIMARYCHANNELLOWERBEHAVIOR},
{7, 122, FREQ_5G00, BW_40, {100, 108, 116, 124, 132, 0}, PRIMARYCHANNELLOWERBEHAVIOR},
@ -115,10 +113,8 @@ REG_CLASS reg_class_ce[] = {
{10, 123, FREQ_5G00, BW_40, {104, 112, 120, 128, 136, 0}, PRIMARYCHANNELUPPERBEHAVIOR}, /* 10 */
{11, 83, FREQ_2G407, BW_40, {1, 2, 3, 4, 5, 6, 7, 8, 9, 0}, LICENSEEXEMPTBEHAVIOR | PRIMARYCHANNELLOWERBEHAVIOR},
{12, 84, FREQ_2G407, BW_40, {5, 6, 7, 8, 9, 10, 11, 12, 13, 0}, LICENSEEXEMPTBEHAVIOR | PRIMARYCHANNELUPPERBEHAVIOR},
#ifdef SPECIAL_FREQUENCY
{13, 0, FREQ_5G0025, BW_5, {171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 0}, ITS_NONMOBILE_OPERATIONS | ITS_MOBILE_OPERATIONS},
{14, 0, FREQ_5G00, BW_10, {171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 0}, ITS_NONMOBILE_OPERATIONS | ITS_MOBILE_OPERATIONS},
#endif /* SPECIAL_FREQUENCY */
{15, 0, FREQ_5G00, BW_20, {172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 0}, ITS_NONMOBILE_OPERATIONS | ITS_MOBILE_OPERATIONS},
{16, 0, FREQ_5G00, BW_20, {100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 0}, ITS_NONMOBILE_OPERATIONS | ITS_MOBILE_OPERATIONS},
{17, 125, FREQ_5G00, BW_20, {149, 153, 157, 161, 165, 169, 0}, COMMON},
@ -136,7 +132,6 @@ REG_CLASS reg_class_jp[] = {
{4, 112, FREQ_5G00, BW_20, {8, 12, 16, 0}, COMMON},
{5, 112, FREQ_5G00, BW_20, {8, 12, 16, 0}, COMMON},
{6, 112, FREQ_5G00, BW_20, {8, 12, 16, 0}, COMMON},
#ifdef SPECIAL_FREQUENCY
{7, 109, FREQ_4G00, BW_20, {184, 188, 192, 196, 0}, COMMON},
{8, 109, FREQ_4G00, BW_20, {184, 188, 192, 196, 0}, COMMON},
{9, 109, FREQ_4G00, BW_20, {184, 188, 192, 196, 0}, COMMON},
@ -162,7 +157,6 @@ REG_CLASS reg_class_jp[] = {
{29, 111, FREQ_4G0025, BW_5, {182, 183, 184, 185, 186, 187, 188, 189, 0}, COMMON},
{30, 81, FREQ_2G407, BW_25, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0}, LICENSEEXEMPTBEHAVIOR},
{31, 82, FREQ_2G414, BW_25, {14, 0}, LICENSEEXEMPTBEHAVIOR},
#endif /* SPECIAL_FREQUENCY */
{32, 118, FREQ_5G00, BW_20, {52, 56, 60, 64, 0}, COMMON},
{33, 118, FREQ_5G00, BW_20, {52, 56, 60, 64, 0}, COMMON},
{34, 121, FREQ_5G00, BW_20, {100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 0}, DFS_50_100_BEHAVIOR},
@ -177,7 +171,6 @@ REG_CLASS reg_class_jp[] = {
{43, 120, FREQ_5G00, BW_40, {56, 64, 0}, PRIMARYCHANNELUPPERBEHAVIOR},
{44, 123, FREQ_5G00, BW_40, {104, 112, 120, 128, 136, 0}, PRIMARYCHANNELUPPERBEHAVIOR | DFS_50_100_BEHAVIOR},
{45, 123, FREQ_5G00, BW_40, {104, 112, 120, 128, 136, 0}, PRIMARYCHANNELUPPERBEHAVIOR | DFS_50_100_BEHAVIOR},
#ifdef SPECIAL_FREQUENCY
{46, 104, FREQ_4G00, BW_40, {184, 192, 0}, PRIMARYCHANNELLOWERBEHAVIOR},
{47, 104, FREQ_4G00, BW_40, {184, 192, 0}, PRIMARYCHANNELLOWERBEHAVIOR},
{48, 104, FREQ_4G00, BW_40, {184, 192, 0}, PRIMARYCHANNELLOWERBEHAVIOR},
@ -188,7 +181,6 @@ REG_CLASS reg_class_jp[] = {
{53, 105, FREQ_4G00, BW_40, {188, 196, 0}, PRIMARYCHANNELUPPERBEHAVIOR},
{54, 105, FREQ_4G00, BW_40, {188, 196, 0}, PRIMARYCHANNELUPPERBEHAVIOR},
{55, 105, FREQ_4G00, BW_40, {188, 196, 0}, PRIMARYCHANNELUPPERBEHAVIOR},
#endif /* SPECIAL_FREQUENCY */
{56, 83, FREQ_2G407, BW_40, {1, 2, 3, 4, 5, 6, 7, 8, 9, 0}, LICENSEEXEMPTBEHAVIOR | PRIMARYCHANNELLOWERBEHAVIOR},
{57, 84, FREQ_2G407, BW_40, {5, 6, 7, 8, 9, 10, 11, 12, 13, 0}, LICENSEEXEMPTBEHAVIOR | PRIMARYCHANNELUPPERBEHAVIOR},
{58, 121, FREQ_5G00, BW_20, {100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 0}, NOMADICBEHAVIOR | LICENSEEXEMPTBEHAVIOR},
@ -203,9 +195,7 @@ REG_CLASS reg_class_cn[] = {
{4, 116, FREQ_5G00, BW_40, {36, 44, 0}, PRIMARYCHANNELLOWERBEHAVIOR | USEEIRPFORVHTTXPOWENV},
{5, 119, FREQ_5G00, BW_40, {52, 60, 0}, PRIMARYCHANNELLOWERBEHAVIOR | DFS_50_100_BEHAVIOR | USEEIRPFORVHTTXPOWENV},
{6, 126, FREQ_5G00, BW_40, {149, 157, 0}, PRIMARYCHANNELLOWERBEHAVIOR | USEEIRPFORVHTTXPOWENV},
#ifdef SPECIAL_FREQUENCY
{7, 81, FREQ_2G407, BW_25, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0}, LICENSEEXEMPTBEHAVIOR},
#endif /* SPECIAL_FREQUENCY */
{8, 83, FREQ_2G407, BW_40, {1, 2, 3, 4, 5, 6, 7, 8, 9, 0}, LICENSEEXEMPTBEHAVIOR | PRIMARYCHANNELLOWERBEHAVIOR},
{9, 84, FREQ_2G407, BW_40, {5, 6, 7, 8, 9, 10, 11, 12, 13, 0}, LICENSEEXEMPTBEHAVIOR | PRIMARYCHANNELUPPERBEHAVIOR},
{0, 0, 0, 0, {0}, 0} /* end */
@ -222,7 +212,6 @@ REG_CLASS_VHT reg_class_vht_fcc[] = {
{3, 124, FREQ_5G00, BW_20, {149, 153, 157, 161, 0}, {0}, NOMADICBEHAVIOR},
{4, 121, FREQ_5G00, BW_20, {100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 144, 0}, {0}, NOMADICBEHAVIOR | USEEIRPFORVHTTXPOWENV},
{5, 125, FREQ_5G00, BW_20, {149, 153, 157, 161, 165, 0}, {0}, LICENSEEXEMPTBEHAVIOR},
#ifdef SPECIAL_FREQUENCY
{6, 103, FREQ_4G9375, BW_5, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0}, {0}, COMMON},
{7, 103, FREQ_4G9375, BW_5, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0}, {0}, COMMON},
{8, 102, FREQ_4G89, BW_10, {11, 13, 15, 17, 19, 0}, {0}, COMMON},
@ -235,7 +224,6 @@ REG_CLASS_VHT reg_class_vht_fcc[] = {
{15, 96, FREQ_3G0025, BW_5, {131, 132, 133, 134, 135, 136, 137, 138, 0}, {0}, CCA_EDBEHAVIOR},
{16, 0, FREQ_5G0025, BW_5, {170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 0}, {0}, ITS_NONMOBILE_OPERATIONS | ITS_MOBILE_OPERATIONS},
{17, 0, FREQ_5G00, BW_10, {171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 0}, {0}, ITS_NONMOBILE_OPERATIONS | ITS_MOBILE_OPERATIONS},
#endif /* SPECIAL_FREQUENCY */
{18, 0, FREQ_5G00, BW_20, {172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 0}, {0}, ITS_NONMOBILE_OPERATIONS | ITS_MOBILE_OPERATIONS},
{22, 116, FREQ_5G00, BW_40, {36, 44, 0}, {0}, PRIMARYCHANNELLOWERBEHAVIOR},
{23, 119, FREQ_5G00, BW_40, {52, 60, 0}, {0}, PRIMARYCHANNELLOWERBEHAVIOR},
@ -264,9 +252,7 @@ REG_CLASS_VHT reg_class_vht_ce[] = {
{1, 115, FREQ_5G00, BW_20, {36, 40, 44, 48, 0}, {0}, COMMON},
{2, 118, FREQ_5G00, BW_20, {52, 56, 60, 64, 0}, {0}, NOMADICBEHAVIOR},
{3, 121, FREQ_5G00, BW_20, {100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 0}, {0}, COMMON},
#ifdef SPECIAL_FREQUENCY
{4, 81, FREQ_2G407, BW_25, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0}, {0}, LICENSEEXEMPTBEHAVIOR},
#endif /* SPECIAL_FREQUENCY */
{5, 116, FREQ_5G00, BW_40, {36, 44, 0}, {0}, PRIMARYCHANNELLOWERBEHAVIOR},
{6, 119, FREQ_5G00, BW_40, {52, 60, 0}, {0}, PRIMARYCHANNELLOWERBEHAVIOR},
{7, 122, FREQ_5G00, BW_40, {100, 108, 116, 124, 132, 0}, {0}, PRIMARYCHANNELLOWERBEHAVIOR},
@ -275,10 +261,8 @@ REG_CLASS_VHT reg_class_vht_ce[] = {
{10, 123, FREQ_5G00, BW_40, {104, 112, 120, 128, 136, 0}, {0}, PRIMARYCHANNELUPPERBEHAVIOR},
{11, 83, FREQ_2G407, BW_40, {1, 2, 3, 4, 5, 6, 7, 8, 9, 0}, {0}, LICENSEEXEMPTBEHAVIOR | PRIMARYCHANNELLOWERBEHAVIOR},
{12, 84, FREQ_2G407, BW_40, {5, 6, 7, 8, 9, 10, 11, 12, 13, 0}, {0}, LICENSEEXEMPTBEHAVIOR | PRIMARYCHANNELUPPERBEHAVIOR},
#ifdef SPECIAL_FREQUENCY
{13, 0, FREQ_5G0025, BW_5, {171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 0}, {0}, ITS_NONMOBILE_OPERATIONS | ITS_MOBILE_OPERATIONS},
{14, 0, FREQ_5G00, BW_10, {171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 0}, {0}, ITS_NONMOBILE_OPERATIONS | ITS_MOBILE_OPERATIONS},
#endif /* SPECIAL_FREQUENCY */
{15, 0, FREQ_5G00, BW_20, {172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 0}, {0}, ITS_NONMOBILE_OPERATIONS | ITS_MOBILE_OPERATIONS},
{16, 0, FREQ_5G00, BW_20, {100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 0}, {0}, ITS_NONMOBILE_OPERATIONS | ITS_MOBILE_OPERATIONS},
{17, 125, FREQ_5G00, BW_20, {149, 153, 157, 161, 165, 169, 0}, {0}, COMMON},
@ -299,7 +283,6 @@ REG_CLASS_VHT reg_class_vht_jp[] = {
{4, 112, FREQ_5G00, BW_20, {8, 12, 16, 0}, {0}, COMMON},
{5, 112, FREQ_5G00, BW_20, {8, 12, 16, 0}, {0}, COMMON},
{6, 112, FREQ_5G00, BW_20, {8, 12, 16, 0}, {0}, COMMON},
#ifdef SPECIAL_FREQUENCY
{7, 109, FREQ_4G00, BW_20, {184, 188, 192, 196, 0}, {0}, COMMON},
{8, 109, FREQ_4G00, BW_20, {184, 188, 192, 196, 0}, {0}, COMMON},
{9, 109, FREQ_4G00, BW_20, {184, 188, 192, 196, 0}, {0}, COMMON},
@ -325,7 +308,6 @@ REG_CLASS_VHT reg_class_vht_jp[] = {
{29, 111, FREQ_4G0025, BW_5, {182, 183, 184, 185, 186, 187, 188, 189, 0}, {0}, COMMON},
{30, 81, FREQ_2G407, BW_25, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0}, {0}, LICENSEEXEMPTBEHAVIOR},
{31, 82, FREQ_2G414, BW_25, {14, 0}, {0}, LICENSEEXEMPTBEHAVIOR},
#endif /* SPECIAL_FREQUENCY */
{32, 118, FREQ_5G00, BW_20, {52, 56, 60, 64, 0}, {0}, COMMON},
{33, 118, FREQ_5G00, BW_20, {52, 56, 60, 64, 0}, {0}, COMMON},
{34, 121, FREQ_5G00, BW_20, {100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 0}, {0}, DFS_50_100_BEHAVIOR},
@ -340,7 +322,6 @@ REG_CLASS_VHT reg_class_vht_jp[] = {
{43, 120, FREQ_5G00, BW_40, {56, 64, 0}, {0}, PRIMARYCHANNELUPPERBEHAVIOR},
{44, 123, FREQ_5G00, BW_40, {104, 112, 120, 128, 136, 0}, {0}, PRIMARYCHANNELUPPERBEHAVIOR | DFS_50_100_BEHAVIOR},
{45, 123, FREQ_5G00, BW_40, {104, 112, 120, 128, 136, 0}, {0}, PRIMARYCHANNELUPPERBEHAVIOR | DFS_50_100_BEHAVIOR},
#ifdef SPECIAL_FREQUENCY
{46, 104, FREQ_4G00, BW_40, {184, 192, 0}, {0}, PRIMARYCHANNELLOWERBEHAVIOR},
{47, 104, FREQ_4G00, BW_40, {184, 192, 0}, {0}, PRIMARYCHANNELLOWERBEHAVIOR},
{48, 104, FREQ_4G00, BW_40, {184, 192, 0}, {0}, PRIMARYCHANNELLOWERBEHAVIOR},
@ -351,7 +332,6 @@ REG_CLASS_VHT reg_class_vht_jp[] = {
{53, 105, FREQ_4G00, BW_40, {188, 196, 0}, {0}, PRIMARYCHANNELUPPERBEHAVIOR},
{54, 105, FREQ_4G00, BW_40, {188, 196, 0}, {0}, PRIMARYCHANNELUPPERBEHAVIOR},
{55, 105, FREQ_4G00, BW_40, {188, 196, 0}, {0}, PRIMARYCHANNELUPPERBEHAVIOR},
#endif /* SPECIAL_FREQUENCY */
{56, 83, FREQ_2G407, BW_40, {1, 2, 3, 4, 5, 6, 7, 8, 9, 0}, {0}, LICENSEEXEMPTBEHAVIOR | PRIMARYCHANNELLOWERBEHAVIOR},
{57, 84, FREQ_2G407, BW_40, {5, 6, 7, 8, 9, 10, 11, 12, 13, 0}, {0}, LICENSEEXEMPTBEHAVIOR | PRIMARYCHANNELUPPERBEHAVIOR},
{58, 121, FREQ_5G00, BW_20, {100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 0}, {0}, NOMADICBEHAVIOR | LICENSEEXEMPTBEHAVIOR},
@ -369,9 +349,7 @@ REG_CLASS_VHT reg_class_vht_cn[] = {
{4, 116, FREQ_5G00, BW_40, {36, 44, 0}, {0}, PRIMARYCHANNELLOWERBEHAVIOR | USEEIRPFORVHTTXPOWENV},
{5, 119, FREQ_5G00, BW_40, {52, 60, 0}, {0}, PRIMARYCHANNELLOWERBEHAVIOR | DFS_50_100_BEHAVIOR | USEEIRPFORVHTTXPOWENV},
{6, 126, FREQ_5G00, BW_40, {149, 157, 0}, {0}, PRIMARYCHANNELLOWERBEHAVIOR | USEEIRPFORVHTTXPOWENV},
#ifdef SPECIAL_FREQUENCY
{7, 81, FREQ_2G407, BW_25, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0}, {0}, LICENSEEXEMPTBEHAVIOR},
#endif /* SPECIAL_FREQUENCY */
{8, 83, FREQ_2G407, BW_40, {1, 2, 3, 4, 5, 6, 7, 8, 9, 0}, {0}, LICENSEEXEMPTBEHAVIOR | PRIMARYCHANNELLOWERBEHAVIOR},
{9, 84, FREQ_2G407, BW_40, {5, 6, 7, 8, 9, 10, 11, 12, 13, 0}, {0}, LICENSEEXEMPTBEHAVIOR | PRIMARYCHANNELUPPERBEHAVIOR},
{128, 128, FREQ_5G00, BW_80, {0}, {42, 58, 155, 0}, USEEIRPFORVHTTXPOWENV},
@ -716,6 +694,125 @@ INT Set_Reg_Domain_Proc(
return TRUE;
}
#ifdef CONFIG_MAP_SUPPORT
static UCHAR ChannelPreferredSanity(
IN PRTMP_ADAPTER pAd,
struct wifi_dev *wdev,
IN UCHAR channel)
{
int i;
UCHAR BandIdx = 0;
CHANNEL_CTRL *pChCtrl = NULL;
BandIdx = HcGetBandByWdev(wdev);
pChCtrl = hc_get_channel_ctrl(pAd->hdev_ctrl, BandIdx);
for (i = 0; i < pChCtrl->ChListNum; i++) {
if (channel == pChCtrl->ChList[i].Channel)
return 1;
}
return 0;
}
UCHAR map_set_op_class_info(
PRTMP_ADAPTER pAd,
struct wifi_dev *wdev,
wdev_op_class_info *op_class)
{
UCHAR i = 0, j = 0, k = 0, op_index = 0, seen = 0;
UCHAR chnNum = 0;
UCHAR PhyMode = wdev->PhyMode;
PREG_CLASS reg_class = NULL;
PREG_CLASS_VHT reg_class_vht = NULL;
if (WMODE_CAP_AC(PhyMode)) {
reg_class_vht = (PREG_CLASS_VHT)get_reg_table_by_country(pAd->CommonCfg.CountryCode, PhyMode);
} else if (WMODE_CAP_2G(PhyMode) || WMODE_CAP_5G(PhyMode)) {
reg_class = (PREG_CLASS)get_reg_table_by_country(pAd->CommonCfg.CountryCode, PhyMode);
} else
return 0;
for (i = 1;; i++) {
chnNum = 0;
seen = 0;
if (WMODE_CAP_AC(PhyMode)) {
if (reg_class_vht[i].reg_class == 0) {
/*End of Op Class Table Reached*/
break;
}
for (k = 0; k < op_index; k++) {
if (reg_class_vht[i].global_class == op_class->opClassInfo[k].op_class) {
/*This is a duplicate entry in opclass list*/
seen = 1;
break;
}
}
if (seen) {
continue;
}
if ((reg_class_vht[i].global_class >= 81 &&
reg_class_vht[i].global_class <= 84) ||
(reg_class_vht[i].global_class >= 115 &&
reg_class_vht[i].global_class <= 130)){
op_class->opClassInfo[op_index].op_class = reg_class_vht[i].global_class;
for (j = 0; j <= 14; j++) {
/*Check for 20Mhz and 40Mhz classes only, otherwise channel sanity will fail*/
if (op_class->opClassInfo[op_index].op_class <= 127) {
if (reg_class_vht[i].channel_set[j] != 0) {
if (ChannelPreferredSanity(pAd, wdev,
reg_class_vht[i].channel_set[j])) {
op_class->opClassInfo[op_index].ch_list[chnNum] =
reg_class_vht[i].channel_set[j];
chnNum++;
}
}
} else {
/*80Mhz centre frequencies*/
if (reg_class_vht[i].center_freq[j] != 0) {
op_class->opClassInfo[op_index].ch_list[chnNum] =
reg_class_vht[i].center_freq[j];
chnNum++;
}
}
}
}
} else if ((WMODE_CAP_2G(PhyMode) ||
WMODE_CAP_5G(PhyMode))) {
if (reg_class[i].reg_class == 0) {
break;
}
for (k = 0; k < op_index; k++) {
if (reg_class[i].global_class == op_class->opClassInfo[k].op_class) {
seen = 1;
break;
}
}
if (seen) {
continue;
}
if ((reg_class[i].global_class >= 115 &&
reg_class[i].global_class <= 130) ||
(reg_class[i].global_class >= 81 &&
reg_class[i].global_class <= 84)){
op_class->opClassInfo[op_index].op_class = reg_class[i].global_class;
for (j = 0; j <= 14; j++) {
if (reg_class[i].channel_set[j] != 0) {
if (ChannelPreferredSanity(pAd, wdev,
reg_class[i].channel_set[j])) {
op_class->opClassInfo[op_index].ch_list[chnNum] =
reg_class[i].channel_set[j];
chnNum++;
}
}
}
}
}
if (chnNum) {
op_class->opClassInfo[op_index].num_of_ch = chnNum;
op_index++;
}
}
return op_index;
}
#endif
#endif /* DOT11_N_SUPPORT */

View File

@ -493,7 +493,6 @@ static INT32 ge_dump_all_sw_queue(RTMP_ADAPTER *pAd)
INT cnt = 0;
INT i, j;
STA_TR_ENTRY *tr_entry = NULL;
UINT32 ent_type = ENTRY_NONE;
/* management sw queue */
RTMP_SEM_LOCK(&pAd->mgmt_que_lock);
@ -551,19 +550,9 @@ static INT32 ge_dump_all_sw_queue(RTMP_ADAPTER *pAd)
for (i = 0; VALID_WCID(i); i++) {
PMAC_TABLE_ENTRY pEntry = &pAd->MacTab.Content[i];
if ((ent_type == ENTRY_NONE)) {
/* dump all MacTable entries */
if (pEntry->EntryType == ENTRY_NONE)
continue;
} else {
/* dump MacTable entries which match the EntryType */
if (pEntry->EntryType != ent_type)
continue;
if ((IS_ENTRY_CLIENT(pEntry) || IS_ENTRY_APCLI(pEntry) || IS_ENTRY_REPEATER(pEntry))
&& (pEntry->Sst != SST_ASSOC))
continue;
}
/* dump all MacTable entries */
if (pEntry->EntryType == ENTRY_NONE)
continue;
tr_entry = &pAd->MacTab.tr_entry[i];
@ -982,10 +971,11 @@ static INT ge_deq_report(RTMP_ADAPTER *pAd, struct dequeue_info *info)
/* rtmp_sta_txq_dump(pAd, &pAd->MacTab.tr_entry[info->wcid], qidx); */
}
MTWF_LOG(DBG_CAT_TX, DBG_SUBCAT_ALL, DBG_LVL_INFO,
("After DeqReport, tx_swq D/EQIdx=%d/%d, deq_info.q_max_cnt/pkt_cnt=%d/%d\n",
pAd->tx_swq[qidx].deqIdx, pAd->tx_swq[qidx].enqIdx,
info->q_max_cnt[qidx], info->pkt_cnt));
if (qidx < WMM_NUM_OF_AC)
MTWF_LOG(DBG_CAT_TX, DBG_SUBCAT_ALL, DBG_LVL_INFO,
("After DeqReport, tx_swq D/EQIdx=%d/%d, deq_info.q_max_cnt/pkt_cnt=%d/%d\n",
pAd->tx_swq[qidx].deqIdx, pAd->tx_swq[qidx].enqIdx,
info->q_max_cnt[qidx], info->pkt_cnt));
return TRUE;
}

View File

@ -424,7 +424,8 @@ VOID RedCalForceRateRatio(UINT8 ucWcid, UINT16 u2N9ARCnt, UINT16 u2N9FRCnt, RTMP
/* TotalCnt = AutoRateCnt(N9) + ForceRateCnt(N9) + ForceRateCnt(Driver) */
u2TxTotalCnt = u2N9ARCnt + u2N9FRCnt + prRedSta->u2DriverFRCnt;
/* Ratio = [ForceRateCnt(N9) + ForceRateCnt(Driver)]/TotalCnt */
ucRatio = (u2N9FRCnt + prRedSta->u2DriverFRCnt) * 100 / u2TxTotalCnt;
if (u2TxTotalCnt > 0)
ucRatio = (u2N9FRCnt + prRedSta->u2DriverFRCnt) * 100 / u2TxTotalCnt;
if (ucRatio >= FORCE_RATIO_THRESHOLD)
prRedSta->i4MpduTime = -1;

View File

@ -423,6 +423,9 @@ PROUTING_ENTRY RoutingTabLookup(
if (bUpdateAliveTime) {
RoutingEntryRefresh(pAd, ifIndex, pRoutingEntry);
pRoutingEntry->Retry = 0;
#ifdef A4_CONN
pRoutingEntry->NeedRefresh = FALSE;
#endif
}
if (pWcid)
@ -567,11 +570,25 @@ VOID RoutingTabMaintain(
bCreateARP = FALSE;
bNeedDelete = FALSE;
pRoutingEntryNext = pRoutingEntry->pNext;
#ifdef A4_CONN
if (pAd->a4_need_refresh)
pRoutingEntry->NeedRefresh = TRUE;
#endif
/* Stage 1 Check*/
if (pRoutingEntry->Valid && RTMP_TIME_AFTER(Now, pRoutingEntry->KeepAliveTime) && pRoutingEntry->IPAddr != 0) {
if ((pRoutingEntry->Valid &&
RTMP_TIME_AFTER(Now, pRoutingEntry->KeepAliveTime) &&
(pRoutingEntry->IPAddr != 0))
#ifdef A4_CONN
|| pRoutingEntry->NeedRefresh
#endif
) {
if (bBridgeFound) {
/* Stage 2 Check*/
if (pRoutingEntry->Retry == 0 || RTMP_TIME_AFTER(Now, pRoutingEntry->RetryTime)) {
if (pRoutingEntry->Retry == 0 || RTMP_TIME_AFTER(Now, pRoutingEntry->RetryTime)
#ifdef A4_CONN
|| pRoutingEntry->NeedRefresh
#endif
) {
if (pRoutingEntry->Retry >= ROUTING_ENTRY_MAX_RETRY)
bNeedDelete = TRUE;
else {

View File

@ -615,7 +615,10 @@ VOID RRM_CfgInit(
pRrmCfg->bDot11kRRMEnable = FALSE; /* set to default off */
pRrmCfg->bDot11kRRMNeighborRepTSFEnable = FALSE;
#ifndef HOSTAPD_11K_SUPPORT
init_rrm_capabilities(pRrmCfg, &pAd->ApCfg.MBSSID[loop]);
#endif
}
return;
@ -752,13 +755,19 @@ VOID RRM_BeaconReportHandler(
IN struct wifi_dev *pWdev,
IN PRRM_BEACON_REP_INFO pBcnRepInfo,
IN LONG Length,
IN PMEASURE_REQ_ENTRY pDialogEntry)
IN PMEASURE_REQ_ENTRY pDialogEntry
#else
IN PRTMP_ADAPTER pAd,
IN struct wifi_dev *pWdev,
IN PRRM_BEACON_REP_INFO pBcnRepInfo,
IN LONG Length)
IN LONG Length
#endif /* CONFIG_11KV_API_SUPPORT */
#if defined(CUSTOMER_DCC_FEATURE) || defined(CONFIG_MAP_SUPPORT)
,
IN UCHAR *Snr,
IN CHAR *rssi
#endif
)
{
CHAR Rssi;
USHORT LenVIE = 0;
@ -884,7 +893,11 @@ VOID RRM_BeaconReportHandler(
if (bFrameBody) {
ie_list->FromBcnReport = TRUE;
Idx = BssTableSetEntry(pAd, &pAd->ScanTab, ie_list, Rssi, LenVIE, pVIE);
Idx = BssTableSetEntry(pAd, &pAd->ScanTab, ie_list, Rssi, LenVIE, pVIE
#if defined(CUSTOMER_DCC_FEATURE) || defined(CONFIG_MAP_SUPPORT)
, Snr, rssi
#endif /* CONFIG_AP_SUPPORT */
);
if (Idx != BSS_NOT_FOUND) {
BSS_ENTRY *pBssEntry = &pAd->ScanTab.BssEntry[Idx];
@ -929,6 +942,19 @@ VOID RRM_PeerMeasureRepAction(
BOOLEAN Cancelled;
PNET_DEV NetDev = NULL;
#endif /* CONFIG_11KV_API_SUPPORT */
#endif
#if defined(CUSTOMER_DCC_FEATURE) || defined(CONFIG_MAP_SUPPORT)
UCHAR Snr[4] = {0};
CHAR rssi[4] = {0};
Snr[0] = ConvertToSnr(pAd, Elem->rssi_info.raw_Snr[0]);
Snr[1] = ConvertToSnr(pAd, Elem->rssi_info.raw_Snr[1]);
Snr[2] = ConvertToSnr(pAd, Elem->rssi_info.raw_Snr[2]);
Snr[3] = ConvertToSnr(pAd, Elem->rssi_info.raw_Snr[3]);
rssi[0] = ConvertToRssi(pAd, &Elem->rssi_info, RSSI_IDX_0);
rssi[1] = ConvertToRssi(pAd, &Elem->rssi_info, RSSI_IDX_1);
rssi[2] = ConvertToRssi(pAd, &Elem->rssi_info, RSSI_IDX_2);
rssi[3] = ConvertToRssi(pAd, &Elem->rssi_info, RSSI_IDX_3);
#endif
MTWF_LOG(DBG_CAT_PROTO, CATPROTO_RRM, DBG_LVL_TRACE, ("%s::\n", __func__));
@ -1016,7 +1042,12 @@ VOID RRM_PeerMeasureRepAction(
pEntry->wdev,
pMeasureRep,
BcnRepLen,
pDialogEntry);
pDialogEntry
#if defined(CUSTOMER_DCC_FEATURE) || defined(CONFIG_MAP_SUPPORT)
, Snr, rssi
#endif
);
} else {
if (ReportMode.field.Refused) {
MTWF_LOG(DBG_CAT_PROTO, CATPROTO_RRM, DBG_LVL_TRACE,
@ -1042,9 +1073,13 @@ VOID RRM_PeerMeasureRepAction(
RRM_BeaconReportHandler(pAd,
pEntry->wdev,
pMeasureRep,
BcnRepLen);
BcnRepLen
#if defined(CUSTOMER_DCC_FEATURE) || defined(CONFIG_MAP_SUPPORT)
, Snr, rssi
#endif
);
#if defined(WAPP_SUPPORT)
wapp_send_bcn_report(pAd, pEntry, eid_ptr->Octet + 3, BcnRepLen);
wapp_send_bcn_report(pAd, pEntry, eid_ptr->Octet, eid_ptr->Len);
#endif
#endif /* CONFIG_11KV_API_SUPPORT */
}
@ -1070,6 +1105,7 @@ int rrm_MsgHandle(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *wrq)
{
p_rrm_command_t p_rrm_command = NULL;
int status = NDIS_STATUS_FAILURE;
unsigned long real_copy_len = 0;
os_alloc_mem(NULL, (UCHAR **)&p_rrm_command, wrq->u.data.length);
@ -1078,7 +1114,9 @@ int rrm_MsgHandle(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *wrq)
return NDIS_STATUS_FAILURE;
}
copy_from_user(p_rrm_command, wrq->u.data.pointer, wrq->u.data.length);
real_copy_len = copy_from_user(p_rrm_command, wrq->u.data.pointer, wrq->u.data.length);
if (real_copy_len != 0)
MTWF_LOG(DBG_CAT_PROTO, CATPROTO_RRM, DBG_LVL_OFF, ("(%s) %lu bytes that could not be copied", __func__, real_copy_len));
switch (p_rrm_command->command_id) {
case OID_802_11_RRM_CMD_ENABLE:
@ -1292,6 +1330,27 @@ int rrm_send_beacon_req(RTMP_ADAPTER *pAd, p_bcn_req_data_t p_bcn_req_data)
void init_rrm_capabilities(PRRM_CONFIG pRrmCfg, BSS_STRUCT *pMBss)
{
#ifdef HOSTAPD_11K_SUPPORT
pRrmCfg->max_rrm_capabilities.word = 0;
if (pRrmCfg->hstapd_nei_rep)
pRrmCfg->max_rrm_capabilities.field.NeighborRepCap = 1;
if (pRrmCfg->hstapd_lci) {
pRrmCfg->max_rrm_capabilities.field.LCIMeasureCap = 1;
pRrmCfg->max_rrm_capabilities.field.LCIAzimuthCap = 0;
}
pRrmCfg->max_rrm_capabilities.field.APChannelReportCap = 0;
pRrmCfg->max_rrm_capabilities.field.BeaconPassiveMeasureCap = 0;
pRrmCfg->max_rrm_capabilities.field.BeaconActiveMeasureCap = 0;
pRrmCfg->max_rrm_capabilities.field.BeaconTabMeasureCap = 0;
pRrmCfg->max_rrm_capabilities.field.APChannelReportCap = 0;
pRrmCfg->max_rrm_capabilities.field.BeaconMeasureReportCndCap = 0;
pRrmCfg->rrm_capabilities.word = pRrmCfg->max_rrm_capabilities.word;
#else
pRrmCfg->max_rrm_capabilities.word = 0;
pRrmCfg->max_rrm_capabilities.field.NeighborRepCap = 1;
pRrmCfg->max_rrm_capabilities.field.BeaconPassiveMeasureCap = 1;
@ -1299,6 +1358,7 @@ void init_rrm_capabilities(PRRM_CONFIG pRrmCfg, BSS_STRUCT *pMBss)
pRrmCfg->max_rrm_capabilities.field.BeaconTabMeasureCap = 1;
pRrmCfg->max_rrm_capabilities.field.APChannelReportCap = 1;
pRrmCfg->rrm_capabilities.word = pRrmCfg->max_rrm_capabilities.word;
#endif
}
extern int DebugLevel;
@ -2125,8 +2185,8 @@ void compose_rrm_BcnReq_ie(RTMP_ADAPTER *pAd,
TotalLen += (2 + 1);
if (p_beacon_req->detail == 1) {
RRM_InsertRequestIE(pAd, (pOutBuffer+FrameLen),
&FrameLen, p_beacon_req->request, p_beacon_req->request_len);
RRM_InsertRequestIE_11KV_API(pAd, (pOutBuffer+FrameLen),
&FrameLen, p_beacon_req->request_len, p_beacon_req->request);
TotalLen += (p_beacon_req->request_len + 2);
}

View File

@ -385,8 +385,8 @@ VOID RRM_InsertRequestIE(
IN PRTMP_ADAPTER pAd,
OUT PUCHAR pFrameBuf,
OUT PULONG pFrameLen,
IN UINT8 ie_num,
IN PUINT8 ie_list)
IN UINT8 ie_num,
IN PUINT8 ie_list)
{
ULONG TempLen;
UINT8 IEId = IE_802_11D_REQUEST;
@ -402,6 +402,28 @@ VOID RRM_InsertRequestIE(
return;
}
VOID RRM_InsertRequestIE_11KV_API(
IN PRTMP_ADAPTER pAd,
OUT PUCHAR pFrameBuf,
OUT PULONG pFrameLen,
IN PUCHAR pRequest,
IN UINT8 RequestLen)
{
ULONG TempLen = 0;
UINT8 IEId = IE_802_11D_REQUEST;
UINT8 Len = 0;
Len = RequestLen;
MakeOutgoingFrame(pFrameBuf, &TempLen,
1, &IEId,
1, &Len,
Len, pRequest,
END_OF_ARGS);
*pFrameLen = *pFrameLen + TempLen;
}
VOID RRM_InsertTxStreamReqIE(
IN PRTMP_ADAPTER pAd,
OUT PUCHAR pFrameBuf,
@ -541,7 +563,13 @@ VOID RRM_EnqueueBcnReq(
TotalLen += (FrameLen - FramelenTmp);
}
InsertBcnReportIndicationReqIE(pAd, (pOutBuffer + FrameLen), &FrameLen, 1);
{
/* Adjust TotalLen of the Measurement Req while inserting
* Bcn Report Indication*/
ULONG FramelenTmp = FrameLen;
InsertBcnReportIndicationReqIE(pAd, (pOutBuffer + FrameLen), &FrameLen, 1);
TotalLen += (FrameLen - FramelenTmp);
}
/* Insert Action header here. */
{
ULONG tmpLen = sizeof(HEADER_802_11);

View File

@ -1319,7 +1319,7 @@ CH_DESP Country_US_ChDesp[] = {
{ 1, 11, 27, BOTH, FALSE}, /*2402~2472MHz, Ch 1~11, Max BW: 40 */
{ 36, 4, 30, BOTH, FALSE}, /*5170~5250MHz, Ch 36~48, Max BW: 40 */
{ 52, 4, 24, BOTH, TRUE}, /*5250~5330MHz, Ch 52~64, Max BW: 40 */
{ 100, 5, 24, BOTH, TRUE}, /*5490~5600MHz, Ch 100~116, Max BW: 40 */
{ 100, 8, 24, BOTH, TRUE}, /*5490~5650MHz, Ch 100~128, Max BW: 40 */
{ 132, 4, 24, BOTH, TRUE}, /*5650~5710MHz, Ch 132~144, Max BW: 40 */
{ 149, 5, 30, BOTH, FALSE}, /*5735~5835MHz, Ch 149~165, Max BW: 40 */
{ 0}, /* end*/
@ -1603,18 +1603,25 @@ static UCHAR FillChList(
/*New FCC spec restrict the used channel under DFS */
#ifdef CONFIG_AP_SUPPORT
#ifndef RT_CFG80211_SUPPORT
if ((pAd->CommonCfg.bIEEE80211H == 1) &&
(pAd->CommonCfg.RDDurRegion == FCC) &&
(pAd->Dot11_H.bDFSIndoor == 1)) {
if (RESTRICTION_BAND_1(pAd, channel, bw))
continue;
} else if ((pAd->CommonCfg.bIEEE80211H == 1) &&
} else
#endif
if ((pAd->CommonCfg.bIEEE80211H == 1) &&
(pAd->CommonCfg.RDDurRegion == FCC) &&
(pAd->Dot11_H.bDFSIndoor == 0)) {
if ((channel >= 100) && (channel <= 140))
continue;
}
#ifndef RT_CFG80211_SUPPORT
(pAd->Dot11_H.bDFSIndoor == 0))
#else
(pAd->Dot11_H[BandIdx].bDFSIndoor == 0))
#endif
{
if ((channel >= 100) && (channel <= 140))
continue;
}
#endif /* CONFIG_AP_SUPPORT */
/* sachin - TODO */
@ -1663,8 +1670,15 @@ static UCHAR CeateChListByRf(RTMP_ADAPTER *pAd, UCHAR RfIC, PCH_REGION pChRegion
UCHAR ChType;
UCHAR increment;
UCHAR regulatoryDomain;
#ifdef RT_CFG80211_SUPPORT
UCHAR PhyMode;
#endif
BOOLEAN IsRfSupport = HcIsRfSupport(pAd, RfIC);
#ifdef RT_CFG80211_SUPPORT
PhyMode = HcGetRadioPhyMode(pAd);
#endif
if (IsRfSupport) {
ChBandCheck(RfIC, &ChType);
@ -1925,6 +1939,11 @@ static const UCHAR wfa_ht_ch_ext[] = {
VOID ht_ext_cha_adjust(RTMP_ADAPTER *pAd, UCHAR prim_ch, UCHAR *ht_bw, UCHAR *ext_cha, struct wifi_dev *wdev)
{
INT idx;
#ifdef CUSTOMER_DCC_FEATURE
#ifdef DOT11_VHT_AC
UCHAR cfg_vht_bw;
#endif /* DOT11_VHT_AC */
#endif
if (*ht_bw == HT_BW_40) {
if (prim_ch > 14) {
@ -1942,6 +1961,14 @@ VOID ht_ext_cha_adjust(RTMP_ADAPTER *pAd, UCHAR prim_ch, UCHAR *ht_bw, UCHAR *ex
if (wfa_ht_ch_ext[idx] == 0) {
*ht_bw = HT_BW_20;
*ext_cha = EXTCHA_NONE;
#ifdef CUSTOMER_DCC_FEATURE
#ifdef DOT11_VHT_AC
cfg_vht_bw = wlan_config_get_vht_bw(wdev);
if (WMODE_CAP_AC(wdev->PhyMode) && (cfg_vht_bw > VHT_BW_2040))
wlan_config_set_vht_bw(wdev, VHT_BW_2040);
#endif /* DOT11_VHT_AC */
#endif
}
} else {
do {

View File

@ -519,6 +519,10 @@ INT RTMPSetLED(RTMP_ADAPTER *pAd, UCHAR Status)
if (IS_PCI_INF(pAd) || IS_RBUS_INF(pAd)) {
#ifdef LED_CONTROL_SUPPORT
#ifdef CONFIG_INIT_RADIO_ONOFF //avoid setting LED status in case radio is off
// PEGATRON MODIFY START
if((pAd->ApCfg.bRadioOn) || ((Status == LED_FORCE_ON) || (Status == LED_FORCE_OFF)))
#endif
RTMPSetLEDStatus(pAd, Status);
#endif /* LED_CONTROL_SUPPORT */
}

View File

@ -21,6 +21,7 @@
#include "rt_os_util.h"
#include "rtmp_osabl.h"
#include "oid.h"
#include "oid_struct.h"
#include "rtmp_iface.h"

View File

@ -174,10 +174,11 @@ NDIS_STATUS RTMPAllocAdapterBlock(VOID *handle, VOID **ppAdapter)
wifi_sys_init(pAd);
/*allocate wpf related memory*/
wpf_config_init(pAd);
#ifndef INTELP6_SUPPORT
#ifdef MULTI_INF_SUPPORT
Status = multi_inf_adapt_reg((VOID *) pAd);
#endif /* MULTI_INF_SUPPORT */
#endif
MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\n== pAd = %p, size = %zu, Status=%x ==\n", pAd,
sizeof(RTMP_ADAPTER), Status));
return Status;
@ -813,6 +814,9 @@ VOID UserCfgExit(RTMP_ADAPTER *pAd)
/* Reset the CFG80211 Internal Flag */
RTMP_DRIVER_80211_RESET(pAd);
#endif /* RT_CFG80211_SUPPORT */
#ifdef RATE_PRIOR_SUPPORT
PBLACK_STA pBlackSta = NULL, tmp;
#endif /*RATE_PRIOR_SUPPORT*/
#ifdef DOT11_N_SUPPORT
BATableExit(pAd);
#endif /* DOT11_N_SUPPORT */
@ -855,6 +859,25 @@ VOID UserCfgExit(RTMP_ADAPTER *pAd)
#ifdef DOT11_SAE_SUPPORT
sae_cfg_deinit(pAd, &pAd->SaeCfg);
#endif /* DOT11_SAE_SUPPORT */
#if defined(DOT11_SAE_SUPPORT) || defined(CONFIG_OWE_SUPPORT)
group_info_bi_deinit();
#endif
#ifdef RATE_PRIOR_SUPPORT
RTMP_SEM_LOCK(&pAd->LowRateCtrl.BlackListLock);
DlListForEach(pBlackSta, &pAd->LowRateCtrl.BlackList, BLACK_STA, List) {
MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF,
("Remove from blklist, %02x:%02x:%02x:%02x:%02x:%02x\n", PRINT_MAC(pBlackSta->Addr)));
tmp = pBlackSta;
pBlackSta = DlListEntry(pBlackSta->List.Prev, BLACK_STA, List);
DlListDel(&(tmp->List));
os_free_mem(tmp);
}
RTMP_SEM_UNLOCK(&pAd->LowRateCtrl.BlackListLock);
NdisFreeSpinLock(&pAd->LowRateCtrl.BlackListLock);
#endif/*RATE_PRIOR_SUPPORT*/
}
@ -889,6 +912,11 @@ VOID UserCfgInit(RTMP_ADAPTER *pAd)
/*init wifi profile*/
wpf_init(pAd);
pAd->IndicateMediaState = NdisMediaStateDisconnected;
#ifdef CONFIG_AP_SUPPORT
#ifdef CONFIG_INIT_RADIO_ONOFF
pAd->ApCfg.bRadioOn = TRUE;
#endif /* CONFIG_INIT_RADIO_ONOFF */
#endif /* CONFIG_AP_SUPPORT */
#ifdef VENDOR_FEATURE7_SUPPORT
pAd->ApCfg.tx_retry_cnt = 0;
pAd->ApCfg.rts_retry_cnt = 0;
@ -1019,6 +1047,10 @@ VOID UserCfgInit(RTMP_ADAPTER *pAd)
pAd->bGenOneHCCA = FALSE;
pAd->CommonCfg.Dsifs = 10; /* in units of usec */
pAd->CommonCfg.TxPower = 100; /* mW*/
#ifdef WIFI_EAP_FEATURE
pAd->CommonCfg.mgmt_txpwr_force_on = FALSE;
pAd->CommonCfg.txd_txpwr_offset = 0;
#endif
pAd->CommonCfg.ucTxPowerPercentage[BAND0] = 100; /* AUTO*/
#ifdef DBDC_MODE
pAd->CommonCfg.ucTxPowerPercentage[BAND1] = 100; /* AUTO*/
@ -1151,6 +1183,11 @@ VOID UserCfgInit(RTMP_ADAPTER *pAd)
#ifdef MCAST_RATE_SPECIFIC
pAd->CommonCfg.MCastPhyMode.word = pAd->MacTab.Content[MCAST_WCID].HTPhyMode.word;
pAd->CommonCfg.MCastPhyMode_5G.word = pAd->MacTab.Content[MCAST_WCID].HTPhyMode.word;
#ifdef MCAST_BCAST_RATE_SET_SUPPORT
pAd->CommonCfg.McastType = MCAST_TYPE_BOTH_BCM_PKT;
pAd->CommonCfg.BCastPhyMode.word = pAd->CommonCfg.MCastPhyMode.word;
pAd->CommonCfg.BCastPhyMode_5G.word = pAd->CommonCfg.MCastPhyMode_5G.word;
#endif /* MCAST_BCAST_RATE_SET_SUPPORT */
#endif /* MCAST_RATE_SPECIFIC */
/* WFA policy - disallow TH rate in WEP or TKIP cipher */
pAd->CommonCfg.HT_DisallowTKIP = TRUE;
@ -1195,6 +1232,9 @@ VOID UserCfgInit(RTMP_ADAPTER *pAd)
for (j = BSS0; j < pAd->ApCfg.BssidNum; j++) {
BSS_STRUCT *mbss = &pAd->ApCfg.MBSSID[j];
struct wifi_dev *wdev = &pAd->ApCfg.MBSSID[j].wdev;
#ifdef CONFIG_MAP_SUPPORT
MAP_Init(pAd, wdev, WDEV_TYPE_AP);
#endif /* CONFIG_MAP_SUPPORT */
#ifdef DOT1X_SUPPORT
/* PMK cache setting*/
@ -1205,6 +1245,10 @@ VOID UserCfgInit(RTMP_ADAPTER *pAd)
mbss->PMKCachePeriod = (10 * 60 * OS_HZ); /* unit : tick(default: 10 minute)*/
#endif /* !R1KH_HARD_RETRY */
#ifdef DFS_VENDOR10_CUSTOM_FEATURE
SET_V10_OLD_CHNL_VALID((&mbss->wdev), FALSE);
#endif /* DFS_VENDOR10_CUSTOM_FEATURE*/
/* dot1x related per BSS */
mbss->wdev.SecConfig.radius_srv_num = 0;
mbss->wdev.SecConfig.NasIdLen = 0;
@ -1297,8 +1341,39 @@ VOID UserCfgInit(RTMP_ADAPTER *pAd)
#endif /* WSC_V2_SUPPORT */
}
#endif /* WSC_AP_SUPPORT */
#ifdef DOT11U_INTERWORKING_IE_SUPPORT
pAd->ApCfg.MBSSID[j].bEnableInterworkingIe = FALSE;
pAd->ApCfg.MBSSID[j].InterWorkingIe.AccessNwType = 15;
pAd->ApCfg.MBSSID[j].InterWorkingIe.Internet = 0;
pAd->ApCfg.MBSSID[j].InterWorkingIe.ASRA = 0;
pAd->ApCfg.MBSSID[j].InterWorkingIe.ESR = 0;
pAd->ApCfg.MBSSID[j].InterWorkingIe.UESA = 0;
#endif /* DOT11U_INTERWORKING_IE_SUPPORT */
for (i = 0; i < WLAN_MAX_NUM_OF_TIM; i++)
mbss->wdev.bcn_buf.TimBitmaps[i] = 0;
#ifdef CUSTOMER_VENDOR_IE_SUPPORT
pAd->ApCfg.MBSSID[j].ap_vendor_ie.length = 0;
pAd->ApCfg.MBSSID[j].ap_vendor_ie.pointer = NULL;
NdisAllocateSpinLock(pAd, &pAd->ApCfg.MBSSID[j].ap_vendor_ie.vendor_ie_lock);
#endif /* CUSTOMER_VENDOR_IE_SUPPORT */
#if defined(A4_CONN) && defined(IGMP_SNOOP_SUPPORT)
mbss->IGMPPeriodicQuerySent = FALSE;
mbss->MLDPeriodicQuerySent = FALSE;
mbss->IgmpQueryHoldTick = 0;
mbss->IgmpQueryHoldTickChanged = FALSE;
mbss->MldQueryHoldTick = 0;
mbss->MldQueryHoldTickChanged = FALSE;
mbss->MldQryChkSum = 0x0;
NdisZeroMemory(&mbss->ipv6LinkLocalSrcAddr[0], 16);
#endif
#ifdef MBSS_DTIM_SUPPORT
mbss->DtimCount = 0;
mbss->DtimPeriod = DEFAULT_DTIM_PERIOD;
#endif
}
#ifdef DOT1X_SUPPORT
@ -1349,9 +1424,20 @@ VOID UserCfgInit(RTMP_ADAPTER *pAd)
#ifdef BT_APCLI_SUPPORT
pAd->ApCfg.ApCliAutoBWBTSupport = FALSE;
#endif
#ifdef BW_VENDOR10_CUSTOM_FEATURE
pAd->ApCfg.ApCliAutoBWRules.majorPolicy.ApCliBWSyncBandSupport = 0;
pAd->ApCfg.ApCliAutoBWRules.majorPolicy.ApCliBWSyncDeauthSupport = FALSE;
pAd->ApCfg.ApCliAutoBWRules.minorPolicy.ApCliBWSyncHTSupport = 0;
pAd->ApCfg.ApCliAutoBWRules.minorPolicy.ApCliBWSyncVHTSupport = 0;
#endif
for (j = 0; j < MAX_APCLI_NUM; j++) {
APCLI_STRUCT *apcli_entry = &pAd->ApCfg.ApCliTab[j];
struct wifi_dev *wdev = &apcli_entry->wdev;
#ifdef CONFIG_MAP_SUPPORT
MAP_Init(pAd, wdev, WDEV_TYPE_APCLI);
#endif /* CONFIG_MAP_SUPPORT */
#ifdef APCLI_AUTO_CONNECT_SUPPORT
apcli_entry->AutoConnectFlag = FALSE;
#endif /* APCLI_AUTO_CONNECT_SUPPORT */
@ -1359,6 +1445,25 @@ VOID UserCfgInit(RTMP_ADAPTER *pAd)
wdev->DesiredTransmitSetting.field.MCS = MCS_AUTO;
apcli_entry->wdev.UapsdInfo.bAPSDCapable = FALSE;
apcli_entry->bBlockAssoc = FALSE;
#if defined(APCLI_CFG80211_SUPPORT) || defined(WPA_SUPPLICANT_SUPPORT)
apcli_entry->wdev.SecConfig.IEEE8021X = FALSE;
apcli_entry->wpa_supplicant_info.IEEE8021x_required_keys = FALSE;
apcli_entry->wpa_supplicant_info.bRSN_IE_FromWpaSupplicant = FALSE;
apcli_entry->wpa_supplicant_info.bLostAp = FALSE;
apcli_entry->bScanReqIsFromWebUI = FALSE;
apcli_entry->bConfigChanged = FALSE;
apcli_entry->wpa_supplicant_info.DesireSharedKeyId = 0;
apcli_entry->wpa_supplicant_info.WpaSupplicantUP = WPA_SUPPLICANT_DISABLE;
apcli_entry->wpa_supplicant_info.WpaSupplicantScanCount = 0;
apcli_entry->wpa_supplicant_info.pWpsProbeReqIe = NULL;
apcli_entry->wpa_supplicant_info.WpsProbeReqIeLen = 0;
apcli_entry->wpa_supplicant_info.pWpaAssocIe = NULL;
apcli_entry->wpa_supplicant_info.WpaAssocIeLen = 0;
apcli_entry->SavedPMKNum = 0;
#ifndef APCLI_CFG80211_SUPPORT
RTMPZeroMemory(apcli_entry->SavedPMK, (PMKID_NO * sizeof(BSSID_INFO)));
#endif/*APCLI_CFG80211_SUPPORT*/
#endif/*WPA_SUPPLICANT_SUPPORT*/
#ifdef APCLI_CONNECTION_TRIAL
apcli_entry->TrialCh = 0;/* if the channel is 0, AP will connect the rootap is in the same channel with ra0. */
#endif /* APCLI_CONNECTION_TRIAL */
@ -1372,6 +1477,13 @@ VOID UserCfgInit(RTMP_ADAPTER *pAd)
#endif /* APCLI_SUPPORT */
pAd->ApCfg.EntryClientCount = 0;
#if defined(A4_CONN) && defined(IGMP_SNOOP_SUPPORT)
pAd->bIGMPperiodicQuery = TRUE;
pAd->IgmpQuerySendTick = QUERY_SEND_PERIOD;
pAd->bMLDperiodicQuery = TRUE;
pAd->MldQuerySendTick = QUERY_SEND_PERIOD;
#endif
pAd->ApCfg.ObssGBandChanBitMap = 0;
}
#endif /* CONFIG_AP_SUPPORT */
/*
@ -1410,6 +1522,8 @@ VOID UserCfgInit(RTMP_ADAPTER *pAd)
pAd->RxAnt.Pair1SecondaryRxAnt = 1;
pAd->RxAnt.EvaluatePeriod = 0;
pAd->RxAnt.RcvPktNumWhenEvaluate = 0;
pAd->MaxTxPwr = 27;
#ifdef CONFIG_AP_SUPPORT
pAd->RxAnt.Pair1AvgRssiGroup1[0] = pAd->RxAnt.Pair1AvgRssiGroup1[1] = 0;
pAd->RxAnt.Pair1AvgRssiGroup2[0] = pAd->RxAnt.Pair1AvgRssiGroup2[1] = 0;
@ -1549,6 +1663,13 @@ VOID UserCfgInit(RTMP_ADAPTER *pAd)
pAd->Mlme.channel_1st_bw = 0;
pAd->Mlme.channel_2nd_bw = 0;
#endif /* CONFIG_MULTI_CHANNEL */
#ifdef SNIFFER_SUPPORT
for (i = 0; i < MONITOR_MAX_DEV_NUM; i++) {
pAd->monitor_ctrl[i].CurrentMonitorMode = 0;
pAd->monitor_ctrl[i].FrameType = FC_TYPE_RSVED;
pAd->monitor_ctrl[i].FilterSize = RX_BUFFER_AGGRESIZE + sizeof(struct mtk_radiotap_header);
}
#endif /* SNIFFER_SUPPORT */
pAd->bPS_Retrieve = 1;
pAd->CommonCfg.bTXRX_RXV_ON = 0;
pAd->parse_rxv_stat_enable = 0;
@ -1719,6 +1840,11 @@ VOID UserCfgInit(RTMP_ADAPTER *pAd)
os_zero_mem(pAd->pIQ_Array, Len);
}
#endif /* defined(INTERNAL_CAPTURE_SUPPORT) || defined(WIFI_SPECTRUM_SUPPORT) */
#if defined(CAL_BIN_FILE_SUPPORT) && defined(MT7615)
pAd->CalFileOffset = 0;
#endif /* CAL_BIN_FILE_SUPPORT */
/* ===================================================== */
#ifdef SMART_CARRIER_SENSE_SUPPORT
@ -1763,12 +1889,13 @@ VOID UserCfgInit(RTMP_ADAPTER *pAd)
#endif
#endif
pAd->MUMIMO_TxOP_Value = 0;
#ifndef DISABLE_MULTICLIENT_DYNAMIC_TXOP
for (i = 0; i < DBDC_BAND_NUM; i++) {
pAd->txop_ctl[i].multi_client_nums = 0;
pAd->txop_ctl[i].cur_wdev = NULL;
pAd->txop_ctl[i].multi_cli_txop_running = FALSE;
}
#endif
#ifdef PKT_BUDGET_CTRL_SUPPORT
pAd->pbc_bound[PBC_AC_BE] = PBC_WMM_UP_DEFAULT_BE;
pAd->pbc_bound[PBC_AC_BK] = PBC_WMM_UP_DEFAULT_BK;
@ -1790,9 +1917,13 @@ VOID UserCfgInit(RTMP_ADAPTER *pAd)
pAd->CommonCfg.ucEDCCACtrl[i] = TRUE; /* EDCCA default is ON. */
}
#ifdef DSCP_PRI_SUPPORT
for (i = 0; i < 64; i++) {
pAd->dscp_pri_map[DSCP_PRI_2G_MAP][i] = -1;
pAd->dscp_pri_map[DSCP_PRI_5G_MAP][i] = -1;
{
UINT8 bss_idx;
for (bss_idx = 0; bss_idx < HW_BEACON_MAX_NUM; bss_idx++) {
for (i = 0; i < 64; i++)
pAd->ApCfg.MBSSID[bss_idx].dscp_pri_map[i] = -1;
}
}
#endif
#ifdef AIR_MONITOR
@ -1801,6 +1932,20 @@ VOID UserCfgInit(RTMP_ADAPTER *pAd)
#ifdef MBO_SUPPORT
pAd->reg_domain = REG_GLOBAL;
#endif /* MBO_SUPPORT */
#ifdef WAPP_SUPPORT
for (i = 0; i < DBDC_BAND_NUM; i++)
pAd->bss_load_info.high_thrd[i] = MAX_BSSLOAD_THRD;
#endif /* WAPP_SUPPORT */
#ifdef PS_QUEUE_INC_SUPPORT
pAd->TotalStaCnt = 0;
#endif
#ifdef RATE_PRIOR_SUPPORT
DlListInit(&pAd->LowRateCtrl.BlackList);
NdisAllocateSpinLock(pAd, &pAd->LowRateCtrl.BlackListLock);
MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\n<--RATE_PRIOR AllocateSpinLock\n"));
#endif/*RATE_PRIOR_SUPPORT*/
MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("<-- UserCfgInit\n"));
}

View File

@ -29,6 +29,8 @@
#ifdef DOT11R_FT_SUPPORT
#include "ft.h"
#endif /* DOT11R_FT_SUPPORT */
/*enable_nf_support() uses macro from bgnd_scan_cmm.h*/
#include "bgnd_scan_cmm.h"
#define PROBE2LOAD_L1PROFILE /* Capable to be turned off if not required */
@ -116,6 +118,17 @@ INT rtmp_cfg_init(RTMP_ADAPTER *pAd, RTMP_STRING *pHostName)
__func__));
}
#ifdef MIN_PHY_RATE_SUPPORT
if (pAd->OpMode == OPMODE_AP) {
RTMPMinPhyDataRateCfg(pAd, "0");
RTMPMinPhyBeaconRateCfg(pAd, "0");
RTMPMinPhyMgmtRateCfg(pAd, "0");
RTMPMinPhyBcMcRateCfg(pAd, "0");
RTMPLimitClientSupportRateCfg(pAd, "0");
RTMPDisableCCKRateCfg(pAd, "0");
}
#endif
status = RTMPReadParametersHook(pAd);
if (status != NDIS_STATUS_SUCCESS) {
@ -223,6 +236,11 @@ static INT rtmp_sys_init(RTMP_ADAPTER *pAd, RTMP_STRING *pHostName)
status = tr_ctl_init(pAd);
#ifdef FQ_SCH_SUPPORT
if (pAd->fq_ctrl.enable & FQ_NEED_ON)
pAd->fq_ctrl.enable = FQ_ARRAY_SCH|FQ_NO_PKT_STA_KEEP_IN_LIST|FQ_EN;
#endif
/* QM init */
status = qm_init(pAd);
@ -232,14 +250,6 @@ static INT rtmp_sys_init(RTMP_ADAPTER *pAd, RTMP_STRING *pHostName)
if (status)
goto err2;
#ifdef FQ_SCH_SUPPORT
if (pAd->fq_ctrl.enable & FQ_NEED_ON) {
if (set_fq_enable(pAd, "4105-2") == FALSE)
goto err2;
}
#endif
return TRUE;
err2:
rtmp_cfg_exit(pAd);
@ -251,26 +261,6 @@ err0:
return FALSE;
}
#ifdef NF_SUPPORT
VOID enable_nf_support(VOID *pAdSrc)
{
RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)pAdSrc;
int Value;
pAd->Avg_NF = 0;
pAd->Avg_NFx16 = 0;
HW_IO_READ32(pAd, PHY_RXTD_12, &Value);
Value |= (1 << B0IrpiSwCtrlResetOffset);
Value |= (1 << B0IrpiSwCtrlOnlyOffset);
HW_IO_WRITE32(pAd, PHY_RXTD_12, Value);
HW_IO_WRITE32(pAd, PHY_RXTD_12, Value);
/* Enable badn0 IPI control */
HW_IO_READ32(pAd, PHY_BAND0_PHYMUX_5, &Value);
Value |= (B0IpiEnableCtrlValue << B0IpiEnableCtrlOffset);
HW_IO_WRITE32(pAd, PHY_BAND0_PHYMUX_5, Value);
}
#endif
/*
*
*/
@ -286,6 +276,49 @@ static void mt_sys_ready(struct _RTMP_ADAPTER *ad)
RTMP_SET_FLAG(ad, fRTMP_ADAPTER_START_UP);
}
/*
* Bring out of OFFCHANNEL_SCAN_FEATURE flag,
* to make it generic function, to be used as generic requirement
*/
VOID enable_nf_support(VOID *pAdSrc)
{
RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)pAdSrc;
int Value, i;
for (i = 0; i < DBDC_BAND_NUM; i++) {
pAd->Avg_NF[i] = 0;
pAd->Avg_NFx16[i] = 0;
/*band0*/
if (i == DBDC_BAND0) {
/*Turn on band 0 IPI*/
HW_IO_READ32(pAd, PHY_RXTD_12, &Value);
Value |= (1 << B0IrpiSwCtrlResetOffset);
Value |= (1 << B0IrpiSwCtrlOnlyOffset);
HW_IO_WRITE32(pAd, PHY_RXTD_12, Value);
HW_IO_WRITE32(pAd, PHY_RXTD_12, Value);
/* Enable badn0 IPI control */
HW_IO_READ32(pAd, PHY_BAND0_PHYMUX_5, &Value);
Value |= (B0IpiEnableCtrlValue << B0IpiEnableCtrlOffset);
HW_IO_WRITE32(pAd, PHY_BAND0_PHYMUX_5, Value);
} else {
HW_IO_READ32(pAd, PHY_RXTD2_10, &Value);
Value |= (1 << B1IrpiSwCtrlResetOffset);
Value |= (1 << B1IrpiSwCtrlOnlyOffset);
HW_IO_WRITE32(pAd, PHY_RXTD2_10, Value);
HW_IO_WRITE32(pAd, PHY_RXTD2_10, Value);
HW_IO_READ32(pAd, PHY_BAND1_PHYMUX_5, &Value);
Value |= (B1IpiEnableCtrlValue << B1IpiEnableCtrlOffset);
HW_IO_WRITE32(pAd, PHY_BAND1_PHYMUX_5, Value);
}
}
}
/*rename from rt28xx_init*/
int mt_wifi_init(VOID *pAdSrc, RTMP_STRING *pDefaultMac, RTMP_STRING *pHostName)
{
@ -310,6 +343,23 @@ int mt_wifi_init(VOID *pAdSrc, RTMP_STRING *pDefaultMac, RTMP_STRING *pHostName)
MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, ("[mt_wifi_init] wdev == NULL\n"));
return FALSE;
}
#ifdef CONFIG_RECOVERY_ON_INTERRUPT_MISS
#ifdef INTELP6_SUPPORT
/*To many continuous soft reboot on puma6 plateform makes HW to go in unstabe state and
* driver fails to communicate with FW. Reset PCI funtionality at first place
*/
{
struct pci_dev *pdev = NULL;
POS_COOKIE obj = (POS_COOKIE)pAd->OS_Cookie;
pdev = obj->pci_dev;
pci_reset_function(pdev);
pAd->ErrRecoveryCheck = 0;
}
#endif
#endif
BandIdx = HcGetBandByWdev(wdev);
pChCtrl = hc_get_channel_ctrl(pAd->hdev_ctrl, BandIdx);
pChCtrl_hwband1 = hc_get_channel_ctrl(pAd->hdev_ctrl, 1);
@ -358,13 +408,21 @@ int mt_wifi_init(VOID *pAdSrc, RTMP_STRING *pDefaultMac, RTMP_STRING *pHostName)
MtAsicSetMacTxRx(pAd, ASIC_MAC_TXRX_RXV, TRUE, 1);
}
#endif
#ifdef NF_SUPPORT
/* Enable Noise Histrogram */
if (IS_MT7615(pAd)) {
#if defined(OFFCHANNEL_SCAN_FEATURE) || defined(NF_SUPPORT)
MAC_IO_WRITE32(pAd, 0x12234, 0x07000000);
MAC_IO_WRITE32(pAd, PHY_BAND0_PHYMUX_5, 0x50DC10);
}
MAC_IO_WRITE32(pAd, PHY_BAND0_PHYMUX_5, 0x50DC10); /* Enabling IPI for Band 0 */
#ifdef DBDC_MODE
if (pAd->CommonCfg.dbdc_mode) {
MAC_IO_WRITE32(pAd, 0x12a2c, 0x00000020);
MAC_IO_WRITE32(pAd, PHY_BAND1_PHYMUX_5, 0x50DC10); /* Enabling IPI for Band 1 */
}
#endif
#endif
#ifdef OFFCHANNEL_SCAN_FEATURE
NdisAllocateSpinLock(pAd, &pAd->ScanCtrl.NF_Lock);
#endif
NICInitializeAsic(pAd);
#ifdef LED_CONTROL_SUPPORT
/* Send LED Setting to MCU */
@ -532,6 +590,9 @@ VOID RTMPDrvOpen(VOID *pAdSrc)
#endif /* RED_SUPPORT */
cp_support_is_enabled(pAd);
#ifdef PS_QUEUE_INC_SUPPORT
MtCmdSetPSQueueInc(pAd, HOST2CR4, TRUE);
#endif
#if defined(MT_DFS_SUPPORT) && defined(BACKGROUND_SCAN_SUPPORT)
@ -573,6 +634,10 @@ VOID RTMPDrvClose(VOID *pAdSrc, VOID *net_dev)
struct MCU_CTRL *prCtl = NULL;
struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl);
UINT8 num_of_tx_ring = GET_NUM_OF_TX_RING(cap);
#ifdef CUSTOMER_VENDOR_IE_SUPPORT
INT j;
struct customer_vendor_ie *ap_vendor_ie;
#endif /* CUSTOMER_VENDOR_IE_SUPPORT */
prCtl = &pAd->MCUCtrl;
#ifdef CONFIG_AP_SUPPORT
#ifdef BG_FT_SUPPORT
@ -720,6 +785,16 @@ VOID RTMPDrvClose(VOID *pAdSrc, VOID *net_dev)
/* Free BA reorder resource*/
ba_reordering_resource_release(pAd);
UserCfgExit(pAd); /* must after ba_reordering_resource_release */
#ifdef CUSTOMER_VENDOR_IE_SUPPORT
for (j = BSS0; j < pAd->ApCfg.BssidNum; j++) {
ap_vendor_ie = &pAd->ApCfg.MBSSID[j].ap_vendor_ie;
if (ap_vendor_ie->pointer != NULL)
os_free_mem(ap_vendor_ie->pointer);
ap_vendor_ie->pointer = NULL;
ap_vendor_ie->length = 0;
}
#endif /* CUSTOMER_VENDOR_IE_SUPPORT */
#ifdef MT_MAC
if (IS_HIF_TYPE(pAd, HIF_MT))
@ -804,15 +879,27 @@ VOID RTMPDrvClose(VOID *pAdSrc, VOID *net_dev)
pAd->Avg_LQ = 0;
pAd->Avg_LQx16 = 0;
#endif
#ifdef NF_SUPPORT
pAd->Avg_NF = 0;
pAd->Avg_NFx16 = 0;
pAd->Avg_NF[0] = 0;
pAd->Avg_NFx16[0] = 0;
#ifdef DBDC_MODE
if (pAd->CommonCfg.dbdc_mode) {
pAd->Avg_NF[1] = 0;
pAd->Avg_NF[1] = 0;
}
#endif
#ifdef LTF_SNR_SUPPORT
pAd->Avg_LTFSNR = 0;
pAd->Avg_LTFSNRx16 = 0;
#endif
#ifdef OFFCHANNEL_SCAN_FEATURE
pAd->Avg_NF[DBDC_BAND0] = pAd->Avg_NFx16[DBDC_BAND0] = 0;
if (pAd->CommonCfg.dbdc_mode)
pAd->Avg_NF[DBDC_BAND1] = pAd->Avg_NFx16[DBDC_BAND1] = 0;
NdisFreeSpinLock(&pAd->ScanCtrl.NF_Lock);
#endif
}
PNET_DEV RtmpPhyNetDevMainCreate(VOID *pAdSrc)
@ -834,6 +921,14 @@ PNET_DEV RtmpPhyNetDevMainCreate(VOID *pAdSrc)
MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_WARN, ("load l1profile failed!\n"));
#endif
dev_name = get_dev_name_prefix(pAd, INT_MAIN);
#ifdef INTELP6_SUPPORT
#ifdef CONFIG_RT_SECOND_CARD
if (pAd->dev_idx == 1)
pDevNew = RtmpOSNetDevCreate((INT32)MC_RowID, (UINT32 *)&IoctlIF,
INT_MAIN, MAX_MBSS_NUM, sizeof(struct mt_dev_priv), dev_name, FALSE);
else
#endif
#endif
pDevNew = RtmpOSNetDevCreate((INT32)MC_RowID, (UINT32 *)&IoctlIF,
INT_MAIN, 0, sizeof(struct mt_dev_priv), dev_name, FALSE);
#ifdef HOSTAPD_SUPPORT

View File

@ -131,6 +131,12 @@ BUILD_TIMER_FUNCTION(AutoChSelScanTimeout);
#endif/* CONFIG_AP_SUPPORT */
#ifdef CHANNEL_SWITCH_MONITOR_CONFIG
extern VOID ch_switch_monitor_timeout(IN PVOID system_specific1, IN PVOID function_context,
IN PVOID system_specific2, IN PVOID system_specific3);
BUILD_TIMER_FUNCTION(ch_switch_monitor_timeout);
#endif
#ifdef RTMP_TIMER_TASK_SUPPORT
static void RtmpTimerQHandle(RTMP_ADAPTER *pAd)
{

View File

@ -28,12 +28,15 @@
#ifdef SCAN_SUPPORT
INT scan_ch_restore(RTMP_ADAPTER *pAd, UCHAR OpMode, struct wifi_dev *pwdev)
{
INT bw, ch;
struct wifi_dev *wdev = pwdev;
#ifdef APCLI_SUPPORT
#ifdef WSC_AP_SUPPORT
INT idx;
struct wifi_dev *temp_wdev = NULL;
#endif /*WSC_AP_SUPPORT*/
#ifdef APCLI_CERT_SUPPORT
UCHAR ScanType = pAd->ScanCtrl.ScanType;
#endif /*APCLI_CERT_SUPPORT*/
@ -86,11 +89,31 @@ INT scan_ch_restore(RTMP_ADAPTER *pAd, UCHAR OpMode, struct wifi_dev *pwdev)
#endif /* defined(RT_CFG80211_SUPPORT) && defined(CONFIG_AP_SUPPORT) */
#endif /* CONFIG_MULTI_CHANNEL */
#ifdef OFFCHANNEL_SCAN_FEATURE
if (pAd->ScanCtrl.state != OFFCHANNEL_SCAN_INVALID) {
MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR,
("%s : restore channel selected from stored channel\n", __func__));
ch = wdev->restore_channel;
} else {
MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR,
("%s : restore channel done in non-offchannel scan path\n", __func__));
ch = wlan_operate_get_prim_ch(wdev);
}
#else
ch = wlan_operate_get_prim_ch(wdev);
#endif
ASSERT((ch != 0));
/*restore to original channel*/
#ifdef CONFIG_MAP_SUPPORT
if (IS_MAP_TURNKEY_ENABLE(pAd) && wdev->wdev_type == WDEV_TYPE_APCLI)
ch = wdev->channel;
#endif
wlan_operate_set_prim_ch(wdev, ch);
ch = wlan_operate_get_cen_ch_1(wdev);
#ifdef CONFIG_MAP_SUPPORT
if (IS_MAP_TURNKEY_ENABLE(pAd) && wdev->wdev_type == WDEV_TYPE_APCLI)
ch = wdev->channel;
#endif
bw = wlan_operate_get_bw(wdev);
MTWF_LOG(DBG_CAT_PROTO, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("%s,central ch=%d,bw=%d\n\r", __func__, ch, bw));
MTWF_LOG(DBG_CAT_PROTO, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("SYNC - End of SCAN, restore to %dMHz channel %d, Total BSS[%02d]\n",
@ -101,7 +124,7 @@ INT scan_ch_restore(RTMP_ADAPTER *pAd, UCHAR OpMode, struct wifi_dev *pwdev)
INT BssIdx;
INT MaxNumBss = pAd->ApCfg.BssidNum;
#ifdef APCLI_SUPPORT
if (wdev && wdev->wdev_type == WDEV_TYPE_APCLI) {
if (wdev->wdev_type == WDEV_TYPE_APCLI) {
#ifdef APCLI_AUTO_CONNECT_SUPPORT
if (pAd->ApCfg.ApCliAutoConnectRunning[wdev->func_idx] == TRUE &&
pAd->ScanCtrl.PartialScan.bScanning == FALSE) {
@ -116,10 +139,6 @@ INT scan_ch_restore(RTMP_ADAPTER *pAd, UCHAR OpMode, struct wifi_dev *pwdev)
pAd->Mlme.ApSyncMachine.CurrState = AP_SYNC_IDLE;
/* iwpriv set auto channel selection*/
/* scanned all channels*/
if (wdev == NULL)
return FALSE;
pDot11h = wdev->pDot11_H;
if (pDot11h == NULL)
@ -136,7 +155,8 @@ INT scan_ch_restore(RTMP_ADAPTER *pAd, UCHAR OpMode, struct wifi_dev *pwdev)
/* Enable beacon tx for all BSS */
for (BssIdx = 0; BssIdx < MaxNumBss; BssIdx++) {
wdev = &pAd->ApCfg.MBSSID[BssIdx].wdev;
if (wdev->channel != pwdev->channel)
continue;
if (wdev->bAllowBeaconing)
UpdateBeaconHandler(pAd, wdev, BCN_UPDATE_ENABLE_TX);
}
@ -147,25 +167,39 @@ INT scan_ch_restore(RTMP_ADAPTER *pAd, UCHAR OpMode, struct wifi_dev *pwdev)
/* Enable beacon tx for all BSS */
for (BssIdx = 0; BssIdx < MaxNumBss; BssIdx++) {
wdev = &pAd->ApCfg.MBSSID[BssIdx].wdev;
UCHAR csa_count;
wdev = &pAd->ApCfg.MBSSID[BssIdx].wdev;
if (wdev->channel != pwdev->channel)
continue;
csa_count = wdev->csa_count;
wdev->csa_count = 0;
if (wdev->bAllowBeaconing)
UpdateBeaconHandler(pAd, wdev, BCN_UPDATE_ENABLE_TX);
wdev->csa_count = csa_count;
}
}
#ifdef APCLI_SUPPORT
#ifdef WSC_AP_SUPPORT
if (wdev &&
for (idx = 0; idx < MAX_APCLI_NUM; idx++) {
temp_wdev = &pAd->ApCfg.ApCliTab[idx].wdev;
if (temp_wdev && pwdev) {
MTWF_LOG(DBG_CAT_PROTO, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("%s, temp_wdev->channel = %d, pwdev->channel = %d, idx = %d\n\r", __func__, temp_wdev->channel, pwdev->channel, idx));
if (HcGetBandByWdev(temp_wdev) == HcGetBandByWdev(pwdev))
break;
}
}
if (pwdev
#ifdef CON_WPS
/* In case of concurrent WPS, the request might have come from a non APCLI interface. */
((wdev->wdev_type == WDEV_TYPE_APCLI) || (pAd->ApCfg.ApCliTab[wdev->func_idx].wdev.WscControl.conWscStatus != CON_WPS_STATUS_DISABLED)) &&
/* In case of concurrent WPS, the request might have come from a non APCLI interface. */
&& ((pwdev->wdev_type == WDEV_TYPE_APCLI) || (pAd->ApCfg.ApCliTab[idx].wdev.WscControl.conWscStatus != CON_WPS_STATUS_DISABLED))
#else
(wdev->wdev_type == WDEV_TYPE_APCLI) &&
&& (pwdev->wdev_type == WDEV_TYPE_APCLI)
#endif
(wdev->func_idx < MAX_APCLI_NUM)) {
WSC_CTRL *pWpsCtrlTemp = &pAd->ApCfg.ApCliTab[wdev->func_idx].wdev.WscControl;
&& (pwdev->func_idx < MAX_APCLI_NUM)) {
WSC_CTRL *pWpsCtrlTemp = &pAd->ApCfg.ApCliTab[idx].wdev.WscControl;
if ((pWpsCtrlTemp->WscConfMode != WSC_DISABLE) &&
(pWpsCtrlTemp->bWscTrigger == TRUE) &&
@ -176,14 +210,19 @@ INT scan_ch_restore(RTMP_ADAPTER *pAd, UCHAR OpMode, struct wifi_dev *pwdev)
MTWF_LOG(DBG_CAT_PROTO, DBG_SUBCAT_ALL, DBG_LVL_TRACE,
("[%s] %s AP-Client WPS Partial Scan done!!!\n",
__func__, (ch > 14 ? "5G" : "2G")));
#ifdef CON_WPS
if (pWpsCtrlTemp->conWscStatus != CON_WPS_STATUS_DISABLED) {
MlmeEnqueue(pAd, AP_SYNC_STATE_MACHINE,
APMT2_MLME_SCAN_COMPLETE, 0, NULL, wdev->func_idx);
APMT2_MLME_SCAN_COMPLETE, 0, NULL, idx);
RTMP_MLME_HANDLER(pAd);
} else
#endif /* CON_WPS */
#if defined(CONFIG_MAP_SUPPORT)
if (IS_MAP_ENABLE(pAd) && IS_MAP_TURNKEY_ENABLE(pAd)) {
WscPBCBssTableSort(pAd, pWpsCtrlTemp);
wapp_send_wsc_scan_complete_notification(pAd, pwdev);
} else
#endif
{
if (!pWpsCtrlTemp->WscPBCTimerRunning) {
RTMPSetTimer(&pWpsCtrlTemp->WscPBCTimer, 1000);
@ -196,11 +235,21 @@ INT scan_ch_restore(RTMP_ADAPTER *pAd, UCHAR OpMode, struct wifi_dev *pwdev)
else {
if (pWpsCtrlTemp->conWscStatus != CON_WPS_STATUS_DISABLED) {
MlmeEnqueue(pAd, AP_SYNC_STATE_MACHINE, APMT2_MLME_SCAN_COMPLETE, 0,
NULL, wdev->func_idx);
NULL, idx);
RTMP_MLME_HANDLER(pAd);
}
}
#else
else
#endif /* CON_WPS*/
{
#if defined(CONFIG_MAP_SUPPORT)
if (IS_MAP_ENABLE(pAd) && IS_MAP_TURNKEY_ENABLE(pAd)) {
WscPBCBssTableSort(pAd, pWpsCtrlTemp);
wapp_send_wsc_scan_complete_notification(pAd, pwdev);
}
#endif
}
}
}
#endif /* WSC_AP_SUPPORT */
@ -229,6 +278,9 @@ INT scan_ch_restore(RTMP_ADAPTER *pAd, UCHAR OpMode, struct wifi_dev *pwdev)
#endif /* APCLI_CERT_SUPPORT */
#endif /* APCLI_SUPPORT */
#endif /* CONFIG_AP_SUPPORT */
#ifdef APCLI_CFG80211_SUPPORT
RTEnqueueInternalCmd(pAd, CMDTHREAD_SCAN_END, NULL, 0);
#endif /* APCLI_CFG80211_SUPPORT */
return TRUE;
}
@ -292,6 +344,13 @@ static INT scan_active(RTMP_ADAPTER *pAd, UCHAR OpMode, UCHAR ScanType, struct w
#endif
#endif
{/* search the first ap interface which use the same band */
#ifdef APCLI_SUPPORT
if ((wdev->wdev_type == WDEV_TYPE_APCLI)
&& (pAd->ApCfg.ApCliTab[wdev->func_idx].wdev.DevInfo.Active)) {
src_mac_addr = &pAd->ApCfg.ApCliTab[wdev->func_idx].wdev.if_addr[0];
} else
#endif /* APCLI_SUPPORT */
{/* search the first ap interface which use the same band */
INT IdBss = 0;
for (IdBss = 0; IdBss < pAd->ApCfg.BssidNum; IdBss++) {
@ -300,8 +359,8 @@ static INT scan_active(RTMP_ADAPTER *pAd, UCHAR OpMode, UCHAR ScanType, struct w
break;
}
}
src_mac_addr = &pAd->ApCfg.MBSSID[IdBss].wdev.bssid[0];
}
}
MgtMacHeaderInitExt(pAd, &Hdr80211, SUBTYPE_PROBE_REQ, 0, BROADCAST_ADDR,
@ -375,7 +434,7 @@ static INT scan_active(RTMP_ADAPTER *pAd, UCHAR OpMode, UCHAR ScanType, struct w
}
#ifdef APCLI_SUPPORT
static void FireExtraProbeReq(RTMP_ADAPTER *pAd, UCHAR OpMode, UCHAR ScanType,
void FireExtraProbeReq(RTMP_ADAPTER *pAd, UCHAR OpMode, UCHAR ScanType,
struct wifi_dev *wdev, UCHAR *desSsid, UCHAR desSsidLen)
{
UCHAR backSsid[MAX_LEN_OF_SSID];
@ -407,7 +466,30 @@ VOID ScanNextChannel(RTMP_ADAPTER *pAd, UCHAR OpMode, struct wifi_dev *pwdev)
BOOLEAN ScanPending = FALSE;
RALINK_TIMER_STRUCT *sc_timer = NULL;
UINT stay_time = 0;
#ifdef APCLI_SUPPORT
#ifdef CONFIG_MAP_SUPPORT
int index_map = 0;
#endif
#endif
struct wifi_dev *wdev = pwdev;
#ifdef OFFCHANNEL_SCAN_FEATURE
OFFCHANNEL_SCAN_MSG Rsp;
#endif
#ifdef APCLI_CFG80211_SUPPORT
if (pwdev->wdev_type == WDEV_TYPE_APCLI) {
CHAR apcli_index;
apcli_index = wdev->func_idx;
if (pAd->ApCfg.ApCliTab[apcli_index].MarkToClose) {
pAd->ScanCtrl.Channel = 0;
scan_ch_restore(pAd, OpMode, pwdev);
RTMP_OS_COMPLETE(&pAd->ApCfg.ApCliTab[apcli_index].scan_complete);
return;
}
}
#endif /* APCLI_CFG80211_SUPPORT */
/* TODO: Star, fix me when Scan is prepare to modify */
/* TODO: Star, fix me when Scan is prepare to modify */
#ifdef CONFIG_AP_SUPPORT
@ -449,14 +531,81 @@ VOID ScanNextChannel(RTMP_ADAPTER *pAd, UCHAR OpMode, struct wifi_dev *pwdev)
#ifdef RT_CFG80211_SUPPORT
//pAd->cfg80211_ctrl.Cfg80211CurChanIndex--;
#endif /* RT_CFG80211_SUPPORT */
#ifdef CONFIG_MAP_SUPPORT
wdev->MAPCfg.scan_bh_ssids.scan_channel_count = 0;
wapp_send_scan_complete_notification(pAd, wdev);
#endif
scan_ch_restore(pAd, OpMode, wdev);
#ifdef OFFCHANNEL_SCAN_FEATURE
if (pAd->ChannelInfo.bandidx == DBDC_BAND0) {
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("%s: Scan complete for band %d channel:%d pending:%d \n",
__FUNCTION__, pAd->ChannelInfo.bandidx, pAd->ScanCtrl.Channel, ScanPending));
pAd->ScanCtrl.OffChScan0_Ongoing = FALSE;
} else {
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("%s: Scan complete for band %d \n", __func__, pAd->ChannelInfo.bandidx));
pAd->ScanCtrl.OffChScan1_Ongoing = FALSE;
}
if (pAd->ScanCtrl.state == OFFCHANNEL_SCAN_COMPLETE) {
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE,
("[%s] in finish path channel no : %d : obss time :%d channel_idx = %d\n", __func__, pAd->ChannelInfo.ChannelNo, pAd->ChannelInfo.ChStats.Obss_Time, pAd->ApCfg.current_channel_index));
Rsp.Action = OFFCHANNEL_INFO_RSP;
memcpy(Rsp.ifrn_name, pAd->ScanCtrl.if_name, IFNAMSIZ);
Rsp.data.channel_data.channel_busy_time = pAd->ChannelInfo.chanbusytime[pAd->ApCfg.current_channel_index];
Rsp.data.channel_data.NF = pAd->ChannelInfo.AvgNF ;
Rsp.data.channel_data.channel = pAd->ChannelInfo.ChannelNo;
Rsp.data.channel_data.tx_time = pAd->ChannelInfo.ChStats.Tx_Time;
Rsp.data.channel_data.rx_time = pAd->ChannelInfo.ChStats.Rx_Time;
Rsp.data.channel_data.obss_time = pAd->ChannelInfo.ChStats.Obss_Time;
Rsp.data.channel_data.channel_idx = pAd->ApCfg.current_channel_index;
/* This value to be used by application to calculate channel busy percentage */
Rsp.data.channel_data.actual_measured_time = pAd->ScanCtrl.ScanTimeActualDiff;
RtmpOSWrielessEventSend(
pAd->net_dev,
RT_WLAN_EVENT_CUSTOM,
OID_OFFCHANNEL_INFO,
NULL,
(UCHAR *) &Rsp,
sizeof(OFFCHANNEL_SCAN_MSG));
pAd->MsMibBucket.Enabled = TRUE;
pAd->ScanCtrl.ScanTime[pAd->ScanCtrl.CurrentGivenChan_Index] = 0;
pAd->ScanCtrl.CurrentGivenChan_Index++;
pAd->ScanCtrl.state = OFFCHANNEL_SCAN_INVALID;
}
#endif
}
else {
{
#ifdef OFFCHANNEL_SCAN_FEATURE
/* For OffChannel scan command dont change the BW */
if (pAd->ScanCtrl.state == OFFCHANNEL_SCAN_START) {
#ifdef CONFIG_MAP_SUPPORT
if (IS_MAP_TURNKEY_ENABLE(pAd)) {
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE,
("%s Performing Scan in 20 Mhz\n", __func__));
wdev->restore_channel = wlan_operate_get_prim_ch(wdev);
wlan_operate_scan(wdev, pAd->ScanCtrl.Channel);
} else {
#endif
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE,
("%s : Performing Scan Without changing BW\n", __func__));
wdev->restore_channel = wlan_operate_get_prim_ch(wdev);
wlan_operate_set_prim_ch(wdev, pAd->ScanCtrl.Channel);
#ifdef CONFIG_MAP_SUPPORT
}
#endif
} else {
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE,
("%s Performing Scan in 20 Mhz\n", __func__));
wlan_operate_scan(wdev, pAd->ScanCtrl.Channel);
}
#else
wlan_operate_scan(wdev, pAd->ScanCtrl.Channel);
#endif
}
{
BOOLEAN bScanPassive = FALSE;
@ -528,8 +677,57 @@ VOID ScanNextChannel(RTMP_ADAPTER *pAd, UCHAR OpMode, struct wifi_dev *pwdev)
}
}
RTMPSetTimer(sc_timer, stay_time);
#ifdef CONFIG_AP_SUPPORT
#ifdef OFFCHANNEL_SCAN_FEATURE
if (pAd->ScanCtrl.state == OFFCHANNEL_SCAN_START) {
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE,
("offchannel scan setting stay time current state = %d\n", pAd->ScanCtrl.state));
stay_time = pAd->ScanCtrl.ScanTime[pAd->ScanCtrl.CurrentGivenChan_Index];
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE,
("[%s][%d] stay time configured of channel index = %d time = %d\n",
__func__, __LINE__, pAd->ScanCtrl.CurrentGivenChan_Index, stay_time));
}
#endif
#endif
#ifdef OFFCHANNEL_SCAN_FEATURE
if (pAd->ChannelInfo.bandidx == DBDC_BAND0) {
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("%s: setting Scan start and on going scan state for band %d \n", __func__, pAd->ChannelInfo.bandidx));
pAd->ScanCtrl.OffChScan_Band0 = TRUE;
pAd->ScanCtrl.OffChScan0_Ongoing = TRUE;
} else {
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("%s: setting Scan start and on going scan state for band %d \n", __func__, pAd->ChannelInfo.bandidx));
pAd->ScanCtrl.OffChScan_Band1 = TRUE;
pAd->ScanCtrl.OffChScan1_Ongoing = TRUE;
}
if (pAd->ScanCtrl.state == OFFCHANNEL_SCAN_START) {
ResetEnable_NF_Registers(pAd, pAd->ChannelInfo.bandidx);
pAd->ScanCtrl.ScanTimeActualStart = ktime_get();
AsicGetChBusyCnt(pAd, 0);
AsicGetCCACnt(pAd);
}
#endif
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, ("[%d][%s] : Stay Time : %u !! \n", __LINE__, __func__, stay_time));
RTMPSetTimer(sc_timer, stay_time);
#ifdef APCLI_SUPPORT
#ifdef CONFIG_MAP_SUPPORT
wdev->MAPCfg.FireProbe_on_DFS = FALSE;
if ((IS_MAP_TURNKEY_ENABLE(pAd)) &&
(!((pAd->CommonCfg.bIEEE80211H == 1) &&
RadarChannelCheck(pAd, pAd->ScanCtrl.Channel)))) {
while (index_map < MAX_BH_PROFILE_CNT) {
if (wdev->MAPCfg.scan_bh_ssids.scan_SSID_val[index_map].SsidLen > 0) {
FireExtraProbeReq(pAd, OpMode, SCAN_ACTIVE, wdev,
wdev->MAPCfg.scan_bh_ssids.scan_SSID_val[index_map].ssid,
wdev->MAPCfg.scan_bh_ssids.scan_SSID_val[index_map].SsidLen);
}
index_map++;
}
}
#endif
#endif
if (SCAN_MODE_ACT(ScanType)) {
#ifdef APCLI_SUPPORT
#endif
@ -544,7 +742,9 @@ VOID ScanNextChannel(RTMP_ADAPTER *pAd, UCHAR OpMode, struct wifi_dev *pwdev)
#ifdef APCLI_SUPPORT
PAPCLI_STRUCT pApCliEntry = NULL;
UINT index = 0;
#if defined(APCLI_AUTO_CONNECT_SUPPORT) || defined(AP_PARTIAL_SCAN_SUPPORT)
BOOLEAN needUnicastScan = FALSE;
#endif
#ifdef APCLI_AUTO_CONNECT_SUPPORT
needUnicastScan = pAd->ApCfg.ApCliAutoConnectRunning[wdev->func_idx];
#endif /* APCLI_AUTO_CONNECT_SUPPORT */
@ -552,14 +752,17 @@ VOID ScanNextChannel(RTMP_ADAPTER *pAd, UCHAR OpMode, struct wifi_dev *pwdev)
needUnicastScan |= pAd->ApCfg.bPartialScanning;
#endif /* AP_PARTIAL_SCAN_SUPPORT */
for (index = 0; index < MAX_APCLI_NUM; index++) {
pApCliEntry = &pAd->ApCfg.ApCliTab[index];
#if defined(APCLI_AUTO_CONNECT_SUPPORT) || defined(AP_PARTIAL_SCAN_SUPPORT)
if (needUnicastScan)
#endif
for (index = 0; index < MAX_APCLI_NUM; index++) {
pApCliEntry = &pAd->ApCfg.ApCliTab[index];
if (needUnicastScan && pApCliEntry->CfgSsidLen > 0) {
FireExtraProbeReq(pAd, OpMode, ScanType, wdev,
pApCliEntry->CfgSsid, pApCliEntry->CfgSsidLen);
if (pApCliEntry->CfgSsidLen > 0) {
FireExtraProbeReq(pAd, OpMode, ScanType, wdev,
pApCliEntry->CfgSsid, pApCliEntry->CfgSsidLen);
}
}
}
#endif /* APCLI_SUPPORT */
}
@ -679,7 +882,9 @@ INT PartialScanInit(RTMP_ADAPTER *pAd)
PartialScanCtrl->NumOfChannels = DEFLAUT_PARTIAL_SCAN_CH_NUM;
PartialScanCtrl->LastScanChannel = 0;
PartialScanCtrl->BreakTime = 0;
PartialScanCtrl->bPeriodicPartialScan = FALSE;
PartialScanCtrl->TriggerCount = 0;
PartialScanCtrl->TriggerPeriod = DEFAULT_PARTIAL_SCAN_TRIGGER_PERIOD;
return 0;
}

View File

@ -974,7 +974,7 @@ INT sa_init_train_entry(
offset = (unsigned int)(&(((RTMP_SA_TRAINING_PARAM *)NULL)->pMacEntry));
cleanLen = sizeof(RTMP_SA_TRAINING_PARAM) - offset;
NdisZeroMemory((PUCHAR)(&pTrainEntry->pMacEntry), cleanLen);
MTWF_LOG(DBG_CAT_HW, CATHW_SA, DBG_LVL_OFF, ("%s():sizeof(RTMP_SA_TRAINING_PARAM)=%d, offset=%d, cleanLen=%d!\n",
MTWF_LOG(DBG_CAT_HW, CATHW_SA, DBG_LVL_OFF, ("%s():sizeof(RTMP_SA_TRAINING_PARAM)=%zu, offset=%d, cleanLen=%d!\n",
__func__, sizeof(RTMP_SA_TRAINING_PARAM), offset, cleanLen));
/* some necessary defualt setting for TrainEntry */
pTrainEntry->trainStage = SA_INVALID_STAGE;
@ -1247,8 +1247,8 @@ int sa_train_db_init(
return FALSE;
}
MTWF_LOG(DBG_CAT_HW, CATHW_SA, DBG_LVL_OFF, ("AllocTrainMemDone(addr=0x%lx,entrySize=%d,totalSize=%d)\n",
(ULONG)pSAParam->pTrainMem,
MTWF_LOG(DBG_CAT_HW, CATHW_SA, DBG_LVL_OFF, ("AllocTrainMemDone(addr=0x%lx,entrySize=%zu,totalSize=%d)\n",
(ULONG) pSAParam->pTrainMem,
sizeof(RTMP_SA_TRAIN_LOG_ELEMENT),
memSize * SA_ENTRY_MAX_NUM));
/* Set new parameters */

View File

@ -33,6 +33,7 @@
#endif
#define IEEE80211_RADIOTAP_MT7615_RMAC 22
#endif /* SNIFFER_MT7615 */
UINT32 MT7615_CCK_Rate[] = {2, 4, 11, 22, 0, 4, 11, 22};
UINT32 MT7615_OFDM_Rate[] = {96, 48, 24, 12, 108, 72, 36, 18};
@ -41,6 +42,7 @@ UINT32 MT7615_OFDM_Rate[] = {96, 48, 24, 12, 108, 72, 36, 18};
/* For reference number of AMPDU Status */
static UINT32 ampdu_refno;
#ifdef SNIFFER_MT7615
void send_radiotap_mt7615_monitor_packets(
PNET_DEV pNetDev,
UCHAR *rmac_info,
@ -63,7 +65,7 @@ void send_radiotap_mt7615_monitor_packets(
#ifdef SNIFFER_MT7615_RMAC_INC
UCHAR *rmac_info_buffer;
#endif
MT7615_RMAC_STRUCT *rmac_str_info;
RMAC_STRUCT *rmac_str_info;
UINT32 MacHdrLen = 0;
UINT32 HdrOffset = 0;
UINT32 TxMode = 0;
@ -86,7 +88,7 @@ void send_radiotap_mt7615_monitor_packets(
UINT32 RxVSeq = 0;
UINT32 HtExtltf = 0;
UINT32 PayloadFmt = 0;
rmac_str_info = (MT7615_RMAC_STRUCT *)rmac_info;
rmac_str_info = (RMAC_STRUCT *)rmac_info;
MEM_DBG_PKT_FREE_INC(pRxPacket);
MacHdrLen = rmac_str_info->RxRMACBase.RxD1.MacHdrLen;
HdrOffset = rmac_str_info->RxRMACBase.RxD1.HdrOffset;
@ -581,6 +583,8 @@ err_free_sk_buff:
void send_radiotap_monitor_packets(
PNET_DEV pNetDev,
UINT8 AmsduState,
UCHAR *rmac_info,
PNDIS_PACKET pRxPacket,
VOID *fc_field,
UCHAR *pData,
@ -600,19 +604,22 @@ void send_radiotap_monitor_packets(
UCHAR CentralChannel,
UCHAR sideband_index,
CHAR MaxRssi,
UINT32 timestamp)
UINT32 timestamp,
UINT32 UP_value)
{
struct sk_buff *pOSPkt;
int rate_index = 0;
USHORT header_len = 0;
UCHAR temp_header[40] = {0};
struct mtk_radiotap_header *mtk_rt_hdr;
UINT32 varlen = 0, padding_len = 0;
UINT64 tmp64;
UINT32 tmp32;
UINT16 tmp16;
UCHAR *pos;
FC_FIELD fc = *((FC_FIELD *)fc_field);
RMAC_STRUCT *rmac_str_info;
rmac_str_info = (RMAC_STRUCT *)rmac_info;
MEM_DBG_PKT_FREE_INC(pRxPacket);
#ifdef RT_BIG_ENDIAN
fc = SWAP16((UINT16)fc);
@ -653,16 +660,25 @@ void send_radiotap_monitor_packets(
pData += header_len;
}
if (AmsduState) {
if (rmac_str_info->RxRMACBase.RxD1.HdrOffset == 1)
DataSize += 2;
}
if (DataSize < pOSPkt->len)
skb_trim(pOSPkt, DataSize);
else
skb_put(pOSPkt, (DataSize - pOSPkt->len));
if ((pData - pOSPkt->data) > 0) {
skb_put(pOSPkt, (pData - pOSPkt->data));
skb_pull(pOSPkt, (pData - pOSPkt->data));
}
if (AmsduState) {
if (rmac_str_info->RxRMACBase.RxD1.HdrOffset == 1) {
pOSPkt->data += 2;
}
}
if (skb_headroom(pOSPkt) < (sizeof(*mtk_rt_hdr) + header_len)) {
if (pskb_expand_head(pOSPkt, (sizeof(*mtk_rt_hdr) + header_len), 0, GFP_ATOMIC)) {
MTWF_LOG(DBG_CAT_RX, DBG_SUBCAT_ALL, DBG_LVL_ERROR,
@ -691,6 +707,9 @@ void send_radiotap_monitor_packets(
/* channel flags */
varlen += 2;
/* dBm ANT Signal */
varlen += 1;
/* MCS */
if ((PHYMODE == MODE_HTMIX) || (PHYMODE == MODE_HTGREENFIELD)) {
/* known */
@ -733,6 +752,7 @@ void send_radiotap_monitor_packets(
varlen += 2;
}
varlen += 8; /* MTK OUI */
mtk_rt_hdr = (struct mtk_radiotap_header *)skb_push(pOSPkt, sizeof(*mtk_rt_hdr) + varlen);
NdisZeroMemory(mtk_rt_hdr, sizeof(*mtk_rt_hdr) + varlen);
mtk_rt_hdr->rt_hdr.it_version = PKTHDR_RADIOTAP_VERSION;
@ -742,25 +762,25 @@ void send_radiotap_monitor_packets(
(1 << IEEE80211_RADIOTAP_TSFT) |
(1 << IEEE80211_RADIOTAP_FLAGS));
if (PHYMODE < MODE_HTMIX)
if (rmac_str_info->RxRMACGrp3.rxd_14.TxMode < MODE_HTMIX)
mtk_rt_hdr->rt_hdr.it_present |= cpu2le32(1 << IEEE80211_RADIOTAP_RATE);
mtk_rt_hdr->rt_hdr.it_present |= cpu2le32(1 << IEEE80211_RADIOTAP_CHANNEL);
mtk_rt_hdr->rt_hdr.it_present |= cpu2le32(1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL);
if ((PHYMODE == MODE_HTMIX) || (PHYMODE == MODE_HTGREENFIELD))
if ((rmac_str_info->RxRMACGrp3.rxd_14.TxMode == MODE_HTMIX) ||
(rmac_str_info->RxRMACGrp3.rxd_14.TxMode == MODE_HTGREENFIELD))
mtk_rt_hdr->rt_hdr.it_present |= cpu2le32(1 << IEEE80211_RADIOTAP_MCS);
if (AMPDU)
if (!(rmac_str_info->RxRMACBase.RxD2.NonAmpduFrm) || !(rmac_str_info->RxRMACBase.RxD2.NonAmpduSfrm))
mtk_rt_hdr->rt_hdr.it_present |= cpu2le32(1 << IEEE80211_RADIOTAP_AMPDU_STATUS);
if (PHYMODE == MODE_VHT)
if (rmac_str_info->RxRMACGrp3.rxd_14.TxMode == MODE_VHT)
mtk_rt_hdr->rt_hdr.it_present |= cpu2le32(1 << IEEE80211_RADIOTAP_VHT);
varlen = 0;
pos = mtk_rt_hdr->variable;
padding_len = ((varlen % 8) == 0) ? 0 : (8 - (varlen % 8));
pos += padding_len;
varlen += padding_len;
/* tsf */
tmp64 = timestamp;
NdisMoveMemory(pos, &tmp64, 8);
@ -768,19 +788,32 @@ void send_radiotap_monitor_packets(
varlen += 8;
/* flags */
*pos = 0;
/* Short Preamble */
if ((rmac_str_info->RxRMACGrp3.rxd_14.TxMode == MODE_CCK) &&
((rmac_str_info->RxRMACGrp3.rxd_14.TxRate & 0x07) > 4))
*pos |= IEEE80211_RADIOTAP_F_SHORTPRE;
/* Fragmentation */
if (rmac_str_info->RxRMACBase.RxD2.FragFrm)
*pos |= IEEE80211_RADIOTAP_F_FRAG;
/* Bad FCS */
if (rmac_str_info->RxRMACBase.RxD2.FcsErr)
*pos |= IEEE80211_RADIOTAP_F_BADFCS;
/* Short GI */
if (rmac_str_info->RxRMACGrp3.rxd_14.HtShortGi)
*pos |= IEEE80211_RADIOTAP_F_SHORTGI;
pos++;
varlen++;
/* rate */
if (PHYMODE == MODE_OFDM) {
rate_index = (UCHAR)(MCS) + 4;
*pos = ralinkrate[rate_index];
pos++;
if (rmac_str_info->RxRMACGrp3.rxd_14.TxMode == MODE_OFDM) {
*pos = (UCHAR)MT7615_OFDM_Rate[(rmac_str_info->RxRMACGrp3.rxd_14.TxRate & 0x07)];
pos++;
varlen++;
} else if (PHYMODE == MODE_CCK) {
rate_index = (UCHAR)(MCS);
*pos = ralinkrate[rate_index];
pos++;
} else if (rmac_str_info->RxRMACGrp3.rxd_14.TxMode == MODE_CCK) {
*pos = (UCHAR)MT7615_CCK_Rate[(rmac_str_info->RxRMACGrp3.rxd_14.TxRate & 0x07)];
pos++;
varlen++;
}
@ -792,15 +825,15 @@ void send_radiotap_monitor_packets(
(((x) <= 14) ? \
(((x) == 14) ? 2484 : ((x) * 5) + 2407) : \
((x) + 1000) * 5)
tmp16 = cpu2le16(ieee80211chan2mhz(Channel));
tmp16 = cpu2le16(ieee80211chan2mhz(rmac_str_info->RxRMACBase.RxD1.ChFreq));
NdisMoveMemory(pos, &tmp16, 2);
pos += 2;
varlen += 2;
if (Channel > 14)
if (rmac_str_info->RxRMACBase.RxD1.ChFreq > 14)
tmp16 = cpu2le16((IEEE80211_CHAN_OFDM | IEEE80211_CHAN_5GHZ));
else {
if (PHYMODE == MODE_CCK)
if (rmac_str_info->RxRMACGrp3.rxd_14.TxMode == MODE_CCK)
tmp16 = cpu2le16(IEEE80211_CHAN_CCK | IEEE80211_CHAN_2GHZ);
else
tmp16 = cpu2le16(IEEE80211_CHAN_OFDM | IEEE80211_CHAN_2GHZ);
@ -810,48 +843,68 @@ void send_radiotap_monitor_packets(
pos += 2;
varlen += 2;
/* dBm ANT Signal */
*pos = MaxRssi;
pos++;
varlen++;
/* HT MCS */
if ((PHYMODE == MODE_HTMIX) || (PHYMODE == MODE_HTGREENFIELD)) {
if ((rmac_str_info->RxRMACGrp3.rxd_14.TxMode == MODE_HTMIX) ||
(rmac_str_info->RxRMACGrp3.rxd_14.TxMode == MODE_HTGREENFIELD)) {
*pos = (IEEE80211_RADIOTAP_MCS_HAVE_BW |
IEEE80211_RADIOTAP_MCS_HAVE_MCS |
IEEE80211_RADIOTAP_MCS_HAVE_GI |
IEEE80211_RADIOTAP_MCS_HAVE_FMT |
IEEE80211_RADIOTAP_MCS_HAVE_FEC);
IEEE80211_RADIOTAP_MCS_HAVE_FEC |
IEEE80211_RADIOTAP_MCS_HAVE_STBC);
/* Ness Known */
*pos |= (1 << 6);
/* Ness data - bit 1 (MSB) of Number of extension spatial streams */
*pos |= (rmac_str_info->RxRMACGrp3.rxd_14.HtExtltf << 6) & 0x80;
pos++;
varlen++;
/* BW */
if (BW == 0)
if (rmac_str_info->RxRMACGrp3.rxd_14.FrMode == 0)
*pos = HT_BW(IEEE80211_RADIOTAP_MCS_BW_20);
else
*pos = HT_BW(IEEE80211_RADIOTAP_MCS_BW_40);
/* HT GI */
*pos |= HT_GI(ShortGI);
*pos |= HT_GI(rmac_str_info->RxRMACGrp3.rxd_14.HtShortGi);
/* HT format */
if (PHYMODE == MODE_HTMIX)
if (rmac_str_info->RxRMACGrp3.rxd_14.TxMode == MODE_HTMIX)
*pos |= HT_FORMAT(0);
else if (PHYMODE == MODE_HTGREENFIELD)
else if (rmac_str_info->RxRMACGrp3.rxd_14.TxMode == MODE_HTGREENFIELD)
*pos |= HT_FORMAT(1);
/* HT FEC type */
*pos |= HT_FEC_TYPE(LDPC);
*pos |= HT_FEC_TYPE(rmac_str_info->RxRMACGrp3.rxd_14.HtAdCode);
/* Number of STBC streams */
*pos |= ((rmac_str_info->RxRMACGrp3.rxd_14.HtStbc) << 5) & 0x60;
/* Ness data - bit 0 (LSB) of Number of extension spatial streams */
*pos |= (rmac_str_info->RxRMACGrp3.rxd_14.HtExtltf & 0x1) << 7;
pos++;
varlen++;
/* HT mcs index */
*pos = MCS;
*pos = rmac_str_info->RxRMACGrp3.rxd_14.TxRate;
pos++;
varlen++;
}
if (AMPDU) {
if (!(rmac_str_info->RxRMACBase.RxD2.NonAmpduFrm) || !(rmac_str_info->RxRMACBase.RxD2.NonAmpduSfrm)) {
/* reference number */
padding_len = ((varlen % 4) == 0) ? 0 : (4 - (varlen % 4));
varlen += padding_len;
pos += padding_len;
tmp32 = 0;
NdisMoveMemory(pos, &tmp32, 4);
ampdu_refno = rmac_str_info->RxRMACBase.RxD3.RxVSeq ?
rmac_str_info->RxRMACBase.RxD3.RxVSeq : ampdu_refno;
NdisMoveMemory(pos, &ampdu_refno, 4);
pos += 4;
varlen += 2;
/* flags */
@ -878,64 +931,127 @@ void send_radiotap_monitor_packets(
varlen += padding_len;
pos += padding_len;
tmp16 = cpu2le16(IEEE80211_RADIOTAP_VHT_KNOWN_STBC |
IEEE80211_RADIOTAP_VHT_KNOWN_TXOP_PS_NA |
IEEE80211_RADIOTAP_VHT_KNOWN_GI |
IEEE80211_RADIOTAP_VHT_KNOWN_SGI_NSYM_DIS |
IEEE80211_RADIOTAP_VHT_KNOWN_LDPC_EXTRA_OFDM_SYM |
IEEE80211_RADIOTAP_VHT_KNOWN_BANDWIDTH);
IEEE80211_RADIOTAP_VHT_KNOWN_BANDWIDTH |
IEEE80211_RADIOTAP_VHT_KNOWN_GROUP_ID);
if ((rmac_str_info->RxRMACGrp3.rxd_15.GroupId == 0) || (rmac_str_info->RxRMACGrp3.rxd_15.GroupId == 63))
tmp16 |= cpu2le16(IEEE80211_RADIOTAP_VHT_KNOWN_BEAMFORMED |
IEEE80211_RADIOTAP_VHT_KNOWN_PARTIAL_AID);
NdisMoveMemory(pos, &tmp16, 2);
pos += 2;
varlen += 2;
/* flags */
*pos = (STBC ? IEEE80211_RADIOTAP_VHT_FLAG_STBC : 0);
*pos |= (ShortGI ? IEEE80211_RADIOTAP_VHT_FLAG_SGI : 0);
*pos |= (LDPC_EX_SYM ? IEEE80211_RADIOTAP_VHT_FLAG_LDPC_EXTRA_OFDM_SYM : 0);
/* VHT STBC is present in HtStbc Bit 0 */
*pos = ((rmac_str_info->RxRMACGrp3.rxd_14.HtStbc & 0x1) ? IEEE80211_RADIOTAP_VHT_FLAG_STBC : 0);
/* TXOP PS Not Allowed */
*pos |= ((rmac_str_info->RxRMACGrp3.rxd_14.VHTA1_B22) ? IEEE80211_RADIOTAP_VHT_FLAG_TXOP_PS_NA : 0);
/* Short GI */
*pos |= (rmac_str_info->RxRMACGrp3.rxd_14.HtShortGi ? IEEE80211_RADIOTAP_VHT_FLAG_SGI : 0);
/* Short GI NSYM disambiguation (Present in Bit 0 of VHT_SIG_A2[B2:B1] */
*pos |= ((rmac_str_info->RxRMACGrp3.rxd_20.VHT_A2 & 0x1) ?
IEEE80211_RADIOTAP_VHT_FLAG_SGI_NSYM_M10_9 : 0);
/* LDPC Extra OFDM symbol (Present in Bit 0 of VHT_SIG_A2[B8:B3] */
*pos |= ((rmac_str_info->RxRMACGrp3.rxd_14.VHTA2_B8_B3 & 0x01) ?
IEEE80211_RADIOTAP_VHT_FLAG_LDPC_EXTRA_OFDM_SYM : 0);
/* Beamformed (For SU), (Present in Bit 5 of VHT_SIG_A2[B8:B3] */
if ((rmac_str_info->RxRMACGrp3.rxd_15.GroupId == 0) || (rmac_str_info->RxRMACGrp3.rxd_15.GroupId == 63))
*pos |= ((rmac_str_info->RxRMACGrp3.rxd_14.VHTA2_B8_B3 & 0x20) ?
IEEE80211_RADIOTAP_VHT_FLAG_BEAMFORMED : 0);
pos++;
varlen++;
/* bandwidth */
if (BW == 0)
if (rmac_str_info->RxRMACGrp3.rxd_14.FrMode == 0)
*pos = 0;
else if (BW == 1)
else if (rmac_str_info->RxRMACGrp3.rxd_14.FrMode == 1)
*pos = 1;
else if (BW == 2) {
else if (rmac_str_info->RxRMACGrp3.rxd_14.FrMode == 2)
*pos = 4;
} else
MTWF_LOG(DBG_CAT_RX, DBG_SUBCAT_ALL, DBG_LVL_ERROR, ("%s:unknow bw(%d)\n", __func__, BW));
else
*pos = 11;
/* mcs_nss */
pos++;
varlen++;
/* vht_mcs_nss[0] */
*pos = (GET_VHT_NSS(MCS) & 0x0f);
*pos |= ((GET_VHT_MCS(MCS) & 0x0f) << 4);
/* vht_mcs_nss[0] and MCS */
if ((rmac_str_info->RxRMACGrp3.rxd_15.GroupId == 0) ||
(rmac_str_info->RxRMACGrp3.rxd_15.GroupId == 63)) {
/* Nsts for SU Data */
*pos = (rmac_str_info->RxRMACGrp3.rxd_16.VHTA1_B21_B10 & 0x007) + 1;
/* MCS for SU Data */
*pos |= (GET_VHT_MCS(rmac_str_info->RxRMACGrp3.rxd_14.TxRate) << 4);
} else {
/* Nsts for MU Data */
*pos = (rmac_str_info->RxRMACGrp3.rxd_16.VHTA1_B21_B10 & 0x007);
/*
* TODO: MCS for MU-MIMO will be received in VHT-SIG-B,
* but this is not passed to RMAC/RXV, So, keeping MCS 0
*/
if (UP_value == 0)
*pos |= (GET_VHT_MCS(rmac_str_info->RxRMACGrp3.rxd_14.TxRate) << 4);
else
*pos |= 0;
}
pos++;
varlen++;
/* vht_mcs_nss[1] */
*pos = 0;
if ((rmac_str_info->RxRMACGrp3.rxd_15.GroupId > 0) && (rmac_str_info->RxRMACGrp3.rxd_15.GroupId < 63)) {
*pos = (rmac_str_info->RxRMACGrp3.rxd_16.VHTA1_B21_B10 & 0x038) >> 3;
if (UP_value == 1)
*pos |= (GET_VHT_MCS(rmac_str_info->RxRMACGrp3.rxd_14.TxRate) << 4);
else
*pos |= 0;
}
pos++;
varlen++;
/* vht_mcs_nss[2] */
*pos = 0;
if ((rmac_str_info->RxRMACGrp3.rxd_15.GroupId > 0) && (rmac_str_info->RxRMACGrp3.rxd_15.GroupId < 63)) {
*pos = (rmac_str_info->RxRMACGrp3.rxd_16.VHTA1_B21_B10 & 0x1c0) >> 6;
if (UP_value == 2)
*pos |= (GET_VHT_MCS(rmac_str_info->RxRMACGrp3.rxd_14.TxRate) << 4);
else
*pos |= 0;
/* TODO: MCS */
}
pos++;
varlen++;
/* vht_mcs_nss[3] */
*pos = 0;
if ((rmac_str_info->RxRMACGrp3.rxd_15.GroupId > 0) && (rmac_str_info->RxRMACGrp3.rxd_15.GroupId < 63)) {
*pos = (rmac_str_info->RxRMACGrp3.rxd_16.VHTA1_B21_B10 & 0xe00) >> 9;
if (UP_value == 3)
*pos |= (GET_VHT_MCS(rmac_str_info->RxRMACGrp3.rxd_14.TxRate) << 4);
else
*pos |= 0;
/* TODO: MCS */
}
pos++;
varlen++;
/* coding */
if (LDPC)
*pos = 1;
else
*pos = 0;
if (rmac_str_info->RxRMACGrp3.rxd_14.HtAdCode)
*pos |= 1;
if ((rmac_str_info->RxRMACGrp3.rxd_15.GroupId > 0) && (rmac_str_info->RxRMACGrp3.rxd_15.GroupId < 63))
*pos |= (rmac_str_info->RxRMACGrp3.rxd_14.VHTA2_B8_B3 & 0x0e);
pos++;
varlen++;
/* group_id */
*pos = 0;
*pos = rmac_str_info->RxRMACGrp3.rxd_15.GroupId;
pos++;
varlen++;
/* partial aid */
tmp16 = 0;
if ((rmac_str_info->RxRMACGrp3.rxd_15.GroupId == 0) || (rmac_str_info->RxRMACGrp3.rxd_15.GroupId == 63))
tmp16 = rmac_str_info->RxRMACGrp3.rxd_16.VHTA1_B21_B10;
NdisMoveMemory(pos, &tmp16, 2);
pos += 2;
varlen += 2;
@ -943,7 +1059,7 @@ void send_radiotap_monitor_packets(
#endif /* DOT11_VHT_AC */
pOSPkt->dev = pOSPkt->dev;
pOSPkt->mac_header = (UINT)pOSPkt->data;
pOSPkt->mac_header = pOSPkt->data;
pOSPkt->pkt_type = PACKET_OTHERHOST;
pOSPkt->protocol = __constant_htons(ETH_P_80211_RAW);
pOSPkt->ip_summed = CHECKSUM_NONE;
@ -959,20 +1075,25 @@ VOID Monitor_Init(RTMP_ADAPTER *pAd, RTMP_OS_NETDEV_OP_HOOK *pNetDevOps)
PNET_DEV new_dev_p;
INT idx = 0;
struct wifi_dev *wdev;
UINT32 MC_RowID = 0, IoctlIF = 0;
char *dev_name;
UINT32 MC_RowID = 0, IoctlIF = 0;
if (pAd->monitor_ctrl.bMonitorInitiated != FALSE) {
for (idx = 0; idx < MONITOR_MAX_DEV_NUM; idx++) {
if (pAd->monitor_ctrl[idx].bMonitorInitiated != FALSE) {
MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, ("monitor interface already initiated.\n"));
return;
}
MC_RowID = 0;
IoctlIF = 0;
#ifdef MULTIPLE_CARD_SUPPORT
MC_RowID = pAd->MC_RowID;
#endif /* MULTIPLE_CARD_SUPPORT */
dev_name = get_dev_name_prefix(pAd, INT_MONITOR);
/* dev_name = "mon"; */
new_dev_p = RtmpOSNetDevCreate(MC_RowID, &IoctlIF, INT_MONITOR, idx, sizeof(struct mt_dev_priv), dev_name);
new_dev_p = RtmpOSNetDevCreate(MC_RowID, &IoctlIF, INT_MONITOR, idx, sizeof(struct mt_dev_priv), dev_name, TRUE);
if (!new_dev_p) {
MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR,
@ -980,7 +1101,7 @@ VOID Monitor_Init(RTMP_ADAPTER *pAd, RTMP_OS_NETDEV_OP_HOOK *pNetDevOps)
return;
}
wdev = &pAd->monitor_ctrl.wdev;
wdev = &pAd->monitor_ctrl[idx].wdev;
wdev->sys_handle = (void *)pAd;
wdev->if_dev = new_dev_p;
RTMP_OS_NETDEV_SET_PRIV(new_dev_p, pAd);
@ -993,6 +1114,8 @@ VOID Monitor_Init(RTMP_ADAPTER *pAd, RTMP_OS_NETDEV_OP_HOOK *pNetDevOps)
return;
}
MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF,
("-->%s(): Create net_device for %s\n", __func__, wdev->if_dev));
/* init MAC address of virtual network interface */
COPY_MAC_ADDR(wdev->if_addr, pAd->CurrentAddress);
pNetDevOps->priv_flags = INT_MONITOR; /* we are virtual interface */
@ -1001,31 +1124,46 @@ VOID Monitor_Init(RTMP_ADAPTER *pAd, RTMP_OS_NETDEV_OP_HOOK *pNetDevOps)
NdisMoveMemory(pNetDevOps->devAddr, &wdev->if_addr[0], MAC_ADDR_LEN);
/* register this device to OS */
RtmpOSNetDevAttach(pAd->OpMode, new_dev_p, pNetDevOps);
pAd->monitor_ctrl.bMonitorInitiated = TRUE;
pAd->monitor_ctrl[idx].bMonitorInitiated = TRUE;
pAd->monitor_ctrl[idx].MacFilterOn = FALSE;
}
return;
}
VOID Monitor_Remove(RTMP_ADAPTER *pAd)
{
INT idx;
for (idx = 0; idx < MONITOR_MAX_DEV_NUM; idx++) {
struct wifi_dev *wdev;
wdev = &pAd->monitor_ctrl.wdev;
wdev = &pAd->monitor_ctrl[idx].wdev;
MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF,
("-->%s(): Remove net_device for %s\n", __func__, wdev->if_dev));
if (wdev->if_dev) {
RtmpOSNetDevProtect(1);
RtmpOSNetDevDetach(wdev->if_dev);
RtmpOSNetDevProtect(0);
wdev_deinit(pAd, wdev);
wdev_idx_unreg(pAd, wdev);
RtmpOSNetDevFree(wdev->if_dev);
wdev->if_dev = NULL;
pAd->monitor_ctrl.bMonitorInitiated = FALSE;
pAd->monitor_ctrl[idx].bMonitorInitiated = FALSE;
}
}
}
BOOLEAN Monitor_Open(RTMP_ADAPTER *pAd, PNET_DEV dev_p)
{
if (pAd->monitor_ctrl.wdev.if_dev == dev_p)
RTMP_OS_NETDEV_SET_TYPE(pAd->monitor_ctrl.wdev.if_dev, ARPHRD_IEEE80211_RADIOTAP);
INT idx;
for (idx = 0; idx < MONITOR_MAX_DEV_NUM; idx++) {
if (pAd->monitor_ctrl[idx].wdev.if_dev == dev_p) {
RTMP_OS_NETDEV_SET_TYPE(pAd->monitor_ctrl[idx].wdev.if_dev, ARPHRD_IEEE80211_RADIOTAP);
MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF,
("-->%s(): Open net_device for %s\n", __func__, dev_p));
}
}
return TRUE;
}
@ -1035,11 +1173,16 @@ BOOLEAN Monitor_Close(RTMP_ADAPTER *pAd, PNET_DEV dev_p)
#ifdef CONFIG_HW_HAL_OFFLOAD
struct _EXT_CMD_SNIFFER_MODE_T SnifferFWCmd;
#endif /* CONFIG_HW_HAL_OFFLOAD */
INT idx;
if (pAd->monitor_ctrl.wdev.if_dev == dev_p) {
for (idx = 0; idx < MONITOR_MAX_DEV_NUM; idx++) {
if (pAd->monitor_ctrl[idx].wdev.if_dev == dev_p) {
MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF,
("-->%s(): Close net_device for %s\n", __func__, dev_p));
/* RTMP_OS_NETDEV_STOP_QUEUE(dev_p); */
/* resume normal settings */
pAd->monitor_ctrl.bMonitorOn = FALSE;
pAd->monitor_ctrl[idx].bMonitorOn = FALSE;
#ifdef CONFIG_HW_HAL_OFFLOAD
SnifferFWCmd.ucDbdcIdx = 0;
SnifferFWCmd.ucSnifferEn = 0;
@ -1049,6 +1192,7 @@ BOOLEAN Monitor_Close(RTMP_ADAPTER *pAd, PNET_DEV dev_p)
#endif /* CONFIG_HW_HAL_OFFLOAD */
return TRUE;
}
}
return FALSE;
}

View File

@ -1836,7 +1836,11 @@ static VOID PeerTpcReqAction(RTMP_ADAPTER *pAd, MLME_QUEUE_ELEM *Elem)
/* of link margin.*/
RealRssi = RTMPMaxRssi(pAd, ConvertToRssi(pAd, &Elem->rssi_info, RSSI_IDX_0),
ConvertToRssi(pAd, &Elem->rssi_info, RSSI_IDX_1),
ConvertToRssi(pAd, &Elem->rssi_info, RSSI_IDX_2));
ConvertToRssi(pAd, &Elem->rssi_info, RSSI_IDX_2)
#if defined(CUSTOMER_DCC_FEATURE) || defined(CONFIG_MAP_SUPPORT)
, ConvertToRssi(pAd, &Elem->rssi_info, RSSI_IDX_3)
#endif
);
/* skip Category and action code.*/
pFramePtr += 2;
/* Dialog token.*/
@ -1958,6 +1962,27 @@ VOID PeerSpectrumAction(RTMP_ADAPTER *pAd, MLME_QUEUE_ELEM *Elem)
#endif /* TPC_SUPPORT */
case SPEC_CHANNEL_SWITCH:
#ifdef CONFIG_RCSA_SUPPORT
if (pAd->CommonCfg.DfsParameter.bRCSAEn) {
CSA_IE_INFO CsaInfo = {0};
struct wifi_dev *wdev = pAd->MacTab.Content[Elem->Wcid].wdev;
struct DOT11_H *pDot11h = wdev->pDot11_H;
if (ApCliPeerCsaSanity(Elem, &CsaInfo) == FALSE)
return;
CsaInfo.wcid = Elem->Wcid;
if (pAd->CommonCfg.DfsParameter.fUseCsaCfg == TRUE) {
if (CsaInfo.ChSwAnnIE.ChSwCnt)
pDot11h->CSPeriod = CsaInfo.ChSwAnnIE.ChSwCnt + 1;
else if (CsaInfo.ExtChSwAnnIE.ChSwCnt)
pDot11h->CSPeriod = CsaInfo.ExtChSwAnnIE.ChSwCnt + 1;
}
pAd->CommonCfg.DfsParameter.fSendRCSA = TRUE;
ChannelSwitchAction_1(pAd, &CsaInfo);
} else
#endif
{
#ifdef DOT11N_DRAFT3
{
SEC_CHA_OFFSET_IE Secondary;
@ -1977,6 +2002,7 @@ VOID PeerSpectrumAction(RTMP_ADAPTER *pAd, MLME_QUEUE_ELEM *Elem)
#endif /* DOT11N_DRAFT3 */
PeerChSwAnnAction(pAd, Elem);
}
break;
}
@ -2182,6 +2208,132 @@ INT Set_TpcEnable_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg)
#endif /* TPC_SUPPORT */
#ifdef CUSTOMER_DCC_FEATURE
#ifdef DOT11_N_SUPPORT
static VOID InsertSecondaryChOffsetIE(
IN PRTMP_ADAPTER pAd,
OUT PUCHAR pFrameBuf,
OUT PULONG pFrameLen,
IN UINT8 Offset)
{
ULONG TempLen;
ULONG Len = sizeof(SEC_CHA_OFFSET_IE);
UINT8 ElementID = IE_SECONDARY_CH_OFFSET;
SEC_CHA_OFFSET_IE SChOffIE;
SChOffIE.SecondaryChannelOffset = Offset;
MakeOutgoingFrame(pFrameBuf, &TempLen,
1, &ElementID,
1, &Len,
Len, &SChOffIE,
END_OF_ARGS);
*pFrameLen = *pFrameLen + TempLen;
return;
}
#endif
VOID InsertChSwAnnIENew(
IN PRTMP_ADAPTER pAd,
OUT PUCHAR pFrameBuf,
OUT PULONG pFrameLen,
IN UINT8 ChSwMode,
IN UINT8 NewChannel,
IN UINT8 ChSwCnt)
{
ULONG TempLen;
ULONG Len = sizeof(CH_SW_ANN_INFO);
UINT8 ElementID = IE_CHANNEL_SWITCH_ANNOUNCEMENT;
CH_SW_ANN_INFO ChSwAnnIE;
ChSwAnnIE.ChSwMode = ChSwMode;
ChSwAnnIE.Channel = NewChannel;
ChSwAnnIE.ChSwCnt = ChSwCnt;
MakeOutgoingFrame(pFrameBuf, &TempLen,
1, &ElementID,
1, &Len,
Len, &ChSwAnnIE,
END_OF_ARGS);
*pFrameLen = *pFrameLen + TempLen;
printk("%s \n", __func__);
return;
}
INT NotifyChSwAnnToConnectedSTAs(
IN PRTMP_ADAPTER pAd,
IN UINT8 ChSwMode,
IN UINT8 Channel,
struct wifi_dev *wdev)
{
UINT32 i;
MAC_TABLE_ENTRY *pEntry;
struct DOT11_H *pDot11h = wdev->pDot11_H;
pAd->CommonCfg.channelSwitch.CHSWMode = ChSwMode;
pAd->CommonCfg.channelSwitch.CHSWCount = 0;
pDot11h->CSPeriod = pAd->CommonCfg.channelSwitch.CHSWPeriod;
for (i = 0; i < MAX_LEN_OF_MAC_TABLE; i++) {
pEntry = &pAd->MacTab.Content[i];
if (pEntry && IS_ENTRY_CLIENT(pEntry) && (pEntry->Sst == SST_ASSOC)) {
EnqueueChSwAnnNew(pAd, pEntry->Addr, ChSwMode, Channel, pEntry->bssid, wdev);
}
}
if (HcUpdateCsaCntByChannel(pAd, Channel) != 0) {
return FALSE;
}
return TRUE;
}
VOID EnqueueChSwAnnNew(
IN PRTMP_ADAPTER pAd,
IN PUCHAR pDA,
IN UINT8 ChSwMode,
IN UINT8 NewCh,
IN PUCHAR pSA,
struct wifi_dev *wdev)
{
PUCHAR pOutBuffer = NULL;
NDIS_STATUS NStatus;
ULONG FrameLen;
HEADER_802_11 ActHdr;
/* build action frame header.*/
MgtMacHeaderInit(pAd, &ActHdr, SUBTYPE_ACTION, 0, pDA, pAd->CurrentAddress, pSA);
NStatus = MlmeAllocateMemory(pAd, (PVOID)&pOutBuffer); /*Get an unused nonpaged memory*/
if (NStatus != NDIS_STATUS_SUCCESS) {
MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("%s() allocate memory failed \n", __FUNCTION__));
return;
}
NdisMoveMemory(pOutBuffer, (PCHAR)&ActHdr, sizeof(HEADER_802_11));
FrameLen = sizeof(HEADER_802_11);
InsertActField(pAd, (pOutBuffer + FrameLen), &FrameLen, CATEGORY_SPECTRUM, SPEC_CHANNEL_SWITCH);
InsertChSwAnnIENew(pAd, (pOutBuffer + FrameLen), &FrameLen, ChSwMode, NewCh, pAd->CommonCfg.channelSwitch.CHSWPeriod);
#ifdef DOT11_N_SUPPORT
InsertSecondaryChOffsetIE(pAd, (pOutBuffer + FrameLen), &FrameLen, HcGetExtCha(pAd, wdev->channel));
#endif
MiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, FrameLen);
MlmeFreeMemory(pOutBuffer);
return;
}
#endif
#ifdef CONFIG_AP_SUPPORT
INT Set_PwrConstraint(RTMP_ADAPTER *pAd, RTMP_STRING *arg)
{
@ -2291,3 +2443,330 @@ VOID RguClass_BuildBcnChList(RTMP_ADAPTER *pAd, UCHAR *pBuf, ULONG *pBufLen, UCH
}
#endif /* CONFIG_AP_SUPPORT */
#ifdef CONFIG_RCSA_SUPPORT
static VOID InsertExtChSwAnnIE(
IN RTMP_ADAPTER * pAd,
OUT PUCHAR pFrameBuf,
OUT PULONG pFrameLen,
IN UINT8 ChSwMode,
IN UINT8 RegClass,
IN UINT8 NewChannel,
IN UINT8 ChSwCnt)
{
ULONG TempLen;
ULONG Len = sizeof(EXT_CH_SW_ANN_INFO);
UINT8 ElementID = IE_EXT_CHANNEL_SWITCH_ANNOUNCEMENT;
EXT_CH_SW_ANN_INFO ExtChSwAnnIE;
ExtChSwAnnIE.ChSwMode = ChSwMode;
ExtChSwAnnIE.RegClass = RegClass;
ExtChSwAnnIE.Channel = NewChannel;
ExtChSwAnnIE.ChSwCnt = ChSwCnt;
MakeOutgoingFrame(pFrameBuf, &TempLen,
1, &ElementID,
1, &Len,
Len, &ExtChSwAnnIE,
END_OF_ARGS);
*pFrameLen = *pFrameLen + TempLen;
}
#ifdef DOT11_VHT_AC
static VOID InsertWideBWChSwitchIE(
IN PRTMP_ADAPTER pAd,
IN struct wifi_dev *wdev,
IN UINT8 NewCh,
OUT PUCHAR pFrameBuf,
OUT PULONG pFrameLen)
{
ULONG TempLen;
ULONG Len = sizeof(WIDE_BW_CH_SWITCH_ELEMENT);
UINT8 ElementID = IE_WIDE_BW_CH_SWITCH;
WIDE_BW_CH_SWITCH_ELEMENT wb_info = {0};
UCHAR op_ht_bw = wlan_operate_get_ht_bw(wdev);
UCHAR vht_bw = wlan_config_get_vht_bw(wdev);
if (op_ht_bw == BW_40) {
switch (vht_bw) {
case VHT_BW_2040:
wb_info.new_ch_width = 0;
break;
case VHT_BW_80:
wb_info.new_ch_width = 1;
wb_info.center_freq_1 = vht_cent_ch_freq(NewCh, vht_bw);
wb_info.center_freq_2 = 0;
break;
case VHT_BW_160:
#ifdef DOT11_VHT_R2
wb_info.new_ch_width = 1;
wb_info.center_freq_1 = (vht_cent_ch_freq(wdev->channel, vht_bw) - 8);
wb_info.center_freq_2 = vht_cent_ch_freq(wdev->channel, vht_bw);
#else
wb_info.new_ch_width = 2;
wb_info.center_freq_1 = vht_cent_ch_freq(wdev->channel, vht_bw);
#endif /* DOT11_VHT_R2 */
break;
case VHT_BW_8080:
#ifdef DOT11_VHT_R2
wb_info.new_ch_width = 1;
wb_info.center_freq_1 = vht_cent_ch_freq(wdev->channel, vht_bw);
wb_info.center_freq_2 = wlan_operate_get_cen_ch_2(wdev);
#else
wb_info.new_ch_width = 3;
wb_info.center_freq_1 = vht_cent_ch_freq(wdev->channel, vht_bw);
wb_info.center_freq_2 = wlan_operate_get_cen_ch_2(wdev);
#endif /* DOT11_VHT_R2 */
break;
}
MakeOutgoingFrame(pFrameBuf, &TempLen,
1, &ElementID,
1, &Len,
Len, &wb_info,
END_OF_ARGS);
*pFrameLen = *pFrameLen + TempLen;
}
}
#endif
#ifdef DOT11_N_SUPPORT
static VOID InsertSecondaryChOffsetIE(
IN PRTMP_ADAPTER pAd,
OUT PUCHAR pFrameBuf,
OUT PULONG pFrameLen,
IN UINT8 Offset)
{
ULONG TempLen;
ULONG Len = sizeof(SEC_CHA_OFFSET_IE);
UINT8 ElementID = IE_SECONDARY_CH_OFFSET;
SEC_CHA_OFFSET_IE SChOffIE;
SChOffIE.SecondaryChannelOffset = Offset;
MakeOutgoingFrame(pFrameBuf, &TempLen,
1, &ElementID,
1, &Len,
Len, &SChOffIE,
END_OF_ARGS);
*pFrameLen = *pFrameLen + TempLen;
}
#endif
#ifdef APCLI_SUPPORT
VOID EnqueueChSwAnnApCli(
IN RTMP_ADAPTER * pAd,
IN struct wifi_dev *wdev,
IN UINT8 ifIndex,
IN UINT8 NewCh,
IN UINT8 ChSwMode)
{
PUCHAR pOutBuffer = NULL;
UCHAR ChSwCnt = 0, RegClass;
NDIS_STATUS NStatus;
ULONG FrameLen;
HEADER_802_11 ActHdr;
struct DOT11_H *pDot11h = wdev->pDot11_H;
/* build action frame header.*/
ApCliMgtMacHeaderInit(pAd, &ActHdr, SUBTYPE_ACTION, 0, pAd->ApCfg.ApCliTab[ifIndex].MlmeAux.Bssid,
pAd->ApCfg.ApCliTab[ifIndex].MlmeAux.Bssid, ifIndex);
NStatus = MlmeAllocateMemory(pAd, (PVOID)&pOutBuffer); /*Get an unused nonpaged memory*/
if (NStatus != NDIS_STATUS_SUCCESS) {
MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("%s() allocate memory failed\n", __func__));
return;
}
if (!wdev) {
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("%s() NULL wdev\n", __func__));
return;
}
ChSwCnt = pDot11h->CSPeriod - pDot11h->CSCount - 1;
NdisMoveMemory(pOutBuffer, (PCHAR)&ActHdr, sizeof(HEADER_802_11));
FrameLen = sizeof(HEADER_802_11);
InsertActField(pAd, (pOutBuffer + FrameLen), &FrameLen, CATEGORY_SPECTRUM, SPEC_CHANNEL_SWITCH);
InsertChSwAnnIE(pAd, (pOutBuffer + FrameLen), &FrameLen, ChSwMode, NewCh, ChSwCnt);
#ifdef DOT11_N_SUPPORT
InsertSecondaryChOffsetIE(pAd, (pOutBuffer + FrameLen), &FrameLen, wlan_config_get_ext_cha(wdev));
RegClass = get_regulatory_class(pAd, NewCh, wdev->PhyMode, wdev);
InsertExtChSwAnnIE(pAd, (pOutBuffer + FrameLen), &FrameLen, ChSwMode, RegClass, NewCh, ChSwCnt);
#endif
#ifdef DOT11_VHT_AC
InsertWideBWChSwitchIE(pAd, wdev, NewCh, (pOutBuffer + FrameLen), &FrameLen);
#endif
MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("I/F(apcli%d) %s::MiniportMMRequest\n",
ifIndex, __func__));
MiniportMMRequest(pAd, AC_BE, pOutBuffer, FrameLen);
MlmeFreeMemory(pOutBuffer);
MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("%s:: <--Exit\n", __func__));
}
#endif
INT NotifyChSwAnnToBackhaulAP(
IN PRTMP_ADAPTER pAd,
struct wifi_dev *wdev,
IN UINT8 Channel,
IN UINT8 ChSwMode)
{
INT8 inf_idx;
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("%s:Channel = %d, ChSwMode = %d\n", __func__, Channel, ChSwMode));
for (inf_idx = 0; inf_idx < MAX_APCLI_NUM; inf_idx++) {
if (pAd->ApCfg.ApCliTab[inf_idx].wdev.channel == wdev->channel) {
EnqueueChSwAnnApCli(pAd, wdev, inf_idx, Channel, ChSwMode);
return TRUE;
}
}
return FALSE;
}
INT ApCliPeerCsaSanity(
MLME_QUEUE_ELEM * Elem,
CSA_IE_INFO *CsaInfo)
{
UCHAR action, IE_ID, Length = 0, status = FALSE;
action = Elem->Msg[LENGTH_802_11 + 1];
if (action != SPEC_CHANNEL_SWITCH)
return FALSE;
Length = LENGTH_802_11 + 2;
while (Length < Elem->MsgLen) {
IE_ID = Elem->Msg[Length];
switch (IE_ID) {
case IE_CHANNEL_SWITCH_ANNOUNCEMENT:
RTMPMoveMemory(&CsaInfo->ChSwAnnIE, &Elem->Msg[Length+2], sizeof(CH_SW_ANN_INFO));
status = TRUE;
break;
case IE_SECONDARY_CH_OFFSET:
CsaInfo->SChOffIE.SecondaryChannelOffset = Elem->Msg[Length+2];
break;
case IE_EXT_CHANNEL_SWITCH_ANNOUNCEMENT:
RTMPMoveMemory(&CsaInfo->ExtChSwAnnIE, &Elem->Msg[Length+2], sizeof(EXT_CH_SW_ANN_INFO));
status = TRUE;
break;
case IE_WIDE_BW_CH_SWITCH:
RTMPMoveMemory(&CsaInfo->wb_info, &Elem->Msg[Length+2], sizeof(WIDE_BW_CH_SWITCH_ELEMENT));
break;
default:
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("%s: Unknown IE=%d\n", __func__, IE_ID));
break;
}
Length += Elem->Msg[Length+1] + 2;
}
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("%s: Dump parsed CSA action frame --->\n", __func__));
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("CSA: Channel:%d ChSwMode:%d CsaCnt:%d\n",
CsaInfo->ChSwAnnIE.Channel, CsaInfo->ChSwAnnIE.ChSwMode, CsaInfo->ChSwAnnIE.ChSwCnt));
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("SecChOffSet:%d\n", CsaInfo->SChOffIE.SecondaryChannelOffset));
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("ExtCSA: Channel:%d RegClass:%d ChSwMode:%d CsaCnt:%d\n",
CsaInfo->ExtChSwAnnIE.Channel, CsaInfo->ExtChSwAnnIE.RegClass, CsaInfo->ExtChSwAnnIE.ChSwMode, CsaInfo->ExtChSwAnnIE.ChSwCnt));
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("WB IE: ChWidth:%d CentFreq:%d CentFreq:%d\n",
CsaInfo->wb_info.new_ch_width, CsaInfo->wb_info.center_freq_1, CsaInfo->wb_info.center_freq_2));
return status;
}
VOID ChannelSwitchAction_1(
IN RTMP_ADAPTER * pAd,
IN CSA_IE_INFO *CsaInfo)
{
UINT8 BandIdx;
struct DOT11_H *pDot11h = NULL;
struct wifi_dev *wdev = pAd->MacTab.Content[CsaInfo->wcid].wdev;
if (ChannelSwitchSanityCheck(pAd, CsaInfo->wcid, CsaInfo->ChSwAnnIE.Channel, CsaInfo->SChOffIE.SecondaryChannelOffset) == FALSE) {
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE,
("%s(): Channel Sanity check:%d\n", __func__, __LINE__));
}
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("%s(): NewChannel=%d, Secondary=%d -->\n",
__func__, CsaInfo->ChSwAnnIE.Channel, CsaInfo->SChOffIE.SecondaryChannelOffset));
pDot11h = wdev->pDot11_H;
if (pDot11h == NULL) {
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, ("%s(): Return:%d\n", __func__, __LINE__));
return;
}
if ((pAd->CommonCfg.bIEEE80211H == 1) &&
CsaInfo->ChSwAnnIE.Channel != 0 &&
wdev->channel != CsaInfo->ChSwAnnIE.Channel &&
pDot11h->RDMode != RD_SWITCHING_MODE) {
MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE,
("[APCLI] Following root AP to switch channel to ch%u\n",
CsaInfo->ChSwAnnIE.Channel));
if ((pAd->CommonCfg.DfsParameter.fUseCsaCfg == FALSE) ||
(CsaInfo->ChSwAnnIE.ChSwMode == 1)) {
BandIdx = HcGetBandByWdev(wdev);
/* Inform FW(N9) about RDD on mesh network */
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE,
("[%s] inform N9 about RDD detect BandIdx:%d\n", __func__, BandIdx));
mtRddControl(pAd, RDD_DETECT_INFO, BandIdx, 0, 0);
}
/* Sync wdev settings as per CSA*/
if (pAd->CommonCfg.DfsParameter.fUseCsaCfg == TRUE) {
#ifdef DOT11_N_SUPPORT
wlan_config_set_ext_cha(wdev, CsaInfo->SChOffIE.SecondaryChannelOffset);
#endif
#ifdef DOT11_VHT_AC
wlan_config_set_vht_bw(wdev, CsaInfo->wb_info.new_ch_width);
wlan_config_set_cen_ch_2(wdev, CsaInfo->wb_info.center_freq_2);
#endif
}
pAd->CommonCfg.DfsParameter.ChSwMode = CsaInfo->ChSwAnnIE.ChSwMode;
#if defined(WAPP_SUPPORT) && defined(CONFIG_MAP_SUPPORT)
wapp_send_csa_event(pAd, RtmpOsGetNetIfIndex(wdev->if_dev), CsaInfo->ChSwAnnIE.Channel);
#endif
rtmp_set_channel(pAd, wdev, CsaInfo->ChSwAnnIE.Channel);
}
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("%s(): Exit:%d <---\n", __func__, __LINE__));
}
void RcsaRecovery(
IN PRTMP_ADAPTER pAd,
struct wifi_dev *wdev)
{
struct DOT11_H *pDot11h = NULL;
UCHAR BandIdx;
if ((wdev == NULL) || (pAd->CommonCfg.DfsParameter.bRCSAEn == FALSE))
return;
pDot11h = wdev->pDot11_H;
BandIdx = HcGetBandByWdev(wdev);
if (pDot11h && (pDot11h->RDMode == RD_SILENCE_MODE)) {
if (pAd->CommonCfg.DfsParameter.fCheckRcsaTxDone == TRUE) {
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("%s::Got TxDone PAUSE ALTX0\n", __func__));
mtRddControl(pAd, RDD_ALTX_CTRL, BandIdx, 0, 2);
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("%s() RESUME BF RDD_MODE:%d!!!\n", __func__, pDot11h->RDMode));
mtRddControl(pAd, RDD_RESUME_BF, BandIdx, 0, 0);
pAd->CommonCfg.DfsParameter.fCheckRcsaTxDone = FALSE;
}
}
}
#endif

Some files were not shown because too many files have changed in this diff Show More