mt-wifi: bump to 5.0.4.0
This commit is contained in:
parent
41150dfc35
commit
cdc7152d2d
@ -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/
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
12
package/lean/mt-drivers/mt_wifi/files/l1profile.dat.dbdc
Normal file
12
package/lean/mt-drivers/mt_wifi/files/l1profile.dat.dbdc
Normal 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
|
@ -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
|
||||
|
@ -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=
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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];
|
@ -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
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -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)
|
||||
|
@ -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);
|
||||
|
@ -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); \
|
||||
|
@ -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;
|
||||
|
@ -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 *)¶m.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 *)¶m.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;
|
||||
|
@ -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;
|
||||
|
@ -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)));
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
File diff suppressed because it is too large
Load Diff
@ -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);
|
||||
|
@ -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 {
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -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
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -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;
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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 *)¶m, 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:
|
||||
|
@ -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",
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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 */
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -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)
|
||||
{
|
||||
|
@ -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,
|
||||
|
@ -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
|
||||
|
@ -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,
|
||||
|
@ -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];
|
||||
|
@ -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
|
||||
|
||||
}
|
||||
|
||||
{
|
||||
|
@ -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);
|
||||
|
@ -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 */
|
||||
|
@ -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
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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) {
|
||||
|
@ -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
|
||||
|
||||
|
@ -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 */
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -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 */
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -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)
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -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 */
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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
|
||||
|
@ -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));
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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)
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -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
|
||||
|
@ -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 */
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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
|
||||
/*
|
||||
*
|
||||
*/
|
||||
|
@ -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 */
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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 {
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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 {
|
||||
|
@ -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 */
|
||||
}
|
||||
|
@ -21,6 +21,7 @@
|
||||
#include "rt_os_util.h"
|
||||
#include "rtmp_osabl.h"
|
||||
#include "oid.h"
|
||||
#include "oid_struct.h"
|
||||
#include "rtmp_iface.h"
|
||||
|
||||
|
||||
|
@ -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"));
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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 */
|
||||
|
@ -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, &du_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;
|
||||
}
|
||||
|
@ -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
Loading…
x
Reference in New Issue
Block a user