rtl8852ce: realtek driver update to v126-16

----------------------------------
rtl8852ce release notes for Nvidia
----------------------------------

v1.19.16_nv-126-16-gbf1934e39.20250910_Certified_Module_beta
* fix scan issue in roaming test

==================================================================
v1.19.16_nv-126-15-ge5204803f.20250827_Certified_Module_beta
* Fix bug of 802.11d CC scan mechanism
[Description]
The 11d CC scan result may sometimes be overwritten by other scans.

==================================================================
v1.19.16_nv-126-14-g196875f8d.20250821_Certified_Module_beta
* fix 6G MBSSID disconnect problem
[Description]
Fix the issue where RSSI was not updated in non-transmitted BSSID, which could
cause disconnection due to incorrect RSSI values.

==================================================================

v1.19.16_nv-126-13-g7a2b96406.20250813_Certified_Module_beta
* fix 6G Enhanced open mode not work
[Description]
(1) Parse capabilities in MBSSID
    e.g. Vendor Specific OUI WMM IE
         Non-Inheritance IE
(2) Handle MBSSID sets
(3) Adjust MAX IE size from 768 to 1840 defined in WIFI Alliance

Bug 5422314
Bug 5226667

Change-Id: I63802c34fdc6e189566843d11992ff64b8e404fa
Signed-off-by: Narayana Reddy P <narayanr@nvidia.com>
Reviewed-on: https://git-master.nvidia.com/r/c/linux-nv-oot/+/3450784
Reviewed-by: Shobek Attupurath <sattupurath@nvidia.com>
GVS: buildbot_gerritrpt <buildbot_gerritrpt@nvidia.com>
Reviewed-by: Bitan Biswas <bbiswas@nvidia.com>
This commit is contained in:
Narayana Reddy P
2025-09-10 14:20:56 +00:00
committed by mobile promotions
parent 5ef68aa58f
commit 232b194aec
22 changed files with 487 additions and 257 deletions

View File

@@ -14,9 +14,6 @@ EXTRA_CFLAGS += -Wno-unused-label
#EXTRA_CFLAGS += -Wno-unused-function
EXTRA_CFLAGS += -Wno-unused
#EXTRA_CFLAGS += -Wno-uninitialized
EXTRA_CFLAGS += -Wno-missing-prototypes
EXTRA_CFLAGS += -Wno-missing-declarations
EXTRA_CFLAGS += -Wno-enum-conversion
############ ANDROID COMMON KERNEL ############
# clang
@@ -38,8 +35,7 @@ ifeq ($(GCC_VER_49),1)
EXTRA_CFLAGS += -Wno-date-time # Fix compile error && warning on gcc 4.9 and later
endif
SOURCETREE = $(srctree.nvidia-oot)/drivers/net/wireless/realtek/rtl8852ce
EXTRA_CFLAGS += -I$(SOURCETREE)/include
EXTRA_CFLAGS += -I$(src)/include
EXTRA_LDFLAGS += --strip-debug
@@ -165,8 +161,8 @@ endif
CONFIG_RTW_DEBUG = y
# default log level is _DRV_INFO_ = 4,
# please refer to "How_to_set_driver_debug_log_level.doc" to set the available level.
CONFIG_RTW_LOG_LEVEL = 0
CONFIG_RTW_PHL_LOG_LEVEL = 0
CONFIG_RTW_LOG_LEVEL = 4
CONFIG_RTW_PHL_LOG_LEVEL = 3
# CONFIG_RTW_APPEND_LOGLEVEL decide if append kernel log level to each messages.
# default "n" for don't append.
@@ -242,8 +238,7 @@ CONFIG_ROAMING_FLAG = 0x3f
CONFIG_ROAM_SCAN_ORDER = 526
###################### Platform Related #######################
CONFIG_PLATFORM_TEGRA = y
CONFIG_PLATFORM_I386_PC = n
CONFIG_PLATFORM_I386_PC = y
CONFIG_PLATFORM_RTL8198D = n
CONFIG_PLATFORM_ANDROID_X86 = n
CONFIG_PLATFORM_ANDROID_INTEL_X86 = n
@@ -773,16 +768,6 @@ ifeq ($(CONFIG_DBG_AX_CAM), y)
EXTRA_CFLAGS += -DCONFIG_DBG_AX_CAM
endif
ifeq ($(CONFIG_PLATFORM_TEGRA), y)
ARCH = arm64
KVER := $(shell uname -r)
KSRC := /lib/modules/$(KVER)/build
EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN
EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT
EXTRA_CFLAGS += -Wno-error=date-time
MODULE_NAME = rtl8852ce
endif
ifeq ($(CONFIG_I386_BUILD_VERIFY), y)
EXTRA_CFLAGS += -DCONFIG_I386_BUILD_VERIFY
endif
@@ -799,18 +784,8 @@ endif
include $(wildcard $(DRV_PATH)/platform/*.mk)
# Import platform specific compile options
EXTRA_CFLAGS += -I$(SOURCETREE)/platform
EXTRA_CFLAGS += -I$(src)/platform
#_PLATFORM_FILES := platform/platform_ops.o
ifeq ($(CONFIG_PCI_HCI), y)
EXTRA_CFLAGS += -DCONFIG_PLATFORM_OPS
_PLATFORM_FILES := platform/platform_linux_pc_pci.o
OBJS += $(_PLATFORM_FILES)
# Core Config
CONFIG_MSG_NUM = 128
EXTRA_CFLAGS += -DCONFIG_MSG_NUM=$(CONFIG_MSG_NUM)
#EXTRA_CFLAGS += -DCONFIG_TX_SKB_ORPHAN
endif
_PLATFORM_FILES += platform/platform_ops.o
OBJS += $(_PLATFORM_FILES)
########### CUSTOMER ################################
@@ -830,7 +805,7 @@ endif
ifneq ($(KERNELRELEASE),)
########### COMMON #################################
include $(SOURCETREE)/common.mk
include $(src)/common.mk
EXTRA_CFLAGS += -DPHL_PLATFORM_LINUX
EXTRA_CFLAGS += -DCONFIG_PHL_ARCH
@@ -851,10 +826,11 @@ ifeq ($(DIRTY_FOR_WORK), y)
EXTRA_CFLAGS += -DDIRTY_FOR_WORK
endif
include $(SOURCETREE)/phl/phl.mk
include $(src)/phl/phl.mk
obj-m := $(MODULE_NAME).o
obj-$(CONFIG_RTL8852CE) := $(MODULE_NAME).o
obj-$(CONFIG_RTL8852CE) := $(MODULE_NAME).o
$(MODULE_NAME)-y = $(OBJS)
############# MEMORY MANAGMENT #############

View File

@@ -99,7 +99,7 @@ _CORE_FILES := core/rtw_fsm.o \
_CORE_FILES += core/rtw_phl.o \
core/rtw_phl_cmd.o
EXTRA_CFLAGS += -I$(SOURCETREE)/core/crypto
EXTRA_CFLAGS += -I$(src)/core/crypto
_CORE_FILES += core/crypto/aes-internal.o \
core/crypto/aes-internal-enc.o \
core/crypto/aes-gcm.o \

View File

@@ -1487,11 +1487,12 @@ static const enum rtw_env_t _reg_info_to_env[] = {
#define reg_info_to_env(reg_info) (((reg_info) >= CIS_6G_REG_NUM) ? _reg_info_to_env[CIS_6G_REG_NUM] : _reg_info_to_env[(reg_info)])
#endif
static void cis_scan_stat_clr(struct cis_scan_stat_t *stat)
static void cis_scan_stat_clr(struct cis_scan_stat_t *stat, bool lock)
{
_list *list, *head;
struct cis_scan_stat_ent *ent;
if (lock)
_rtw_mutex_lock(&stat->lock);
head = &stat->ent;
@@ -1506,6 +1507,7 @@ static void cis_scan_stat_clr(struct cis_scan_stat_t *stat)
stat->ent_num = 0;
CIS_SCAN_STAT_SET_MAJORITY(stat, NULL);
if (lock)
_rtw_mutex_unlock(&stat->lock);
}
@@ -1559,12 +1561,12 @@ check_order:
}
#if CONFIG_80211D_ENV_BSS_MAJORITY
static struct cis_scan_stat_ent *cis_scan_stat_update_majority(struct cis_scan_stat_t *stat, bool disable)
static void cis_scan_stat_update_majority(struct cis_scan_stat_t *stat)
{
_list *list, *head;
struct cis_scan_stat_ent *ent, *m = NULL;
if (stat->ent_num == 0 || disable)
if (stat->ent_num == 0)
goto update;
head = &stat->ent;
@@ -1581,7 +1583,6 @@ static struct cis_scan_stat_ent *cis_scan_stat_update_majority(struct cis_scan_s
update:
CIS_SCAN_STAT_SET_MAJORITY(stat, m);
return CIS_SCAN_STAT_GET_MAJORITY(stat);
}
#endif
@@ -1595,15 +1596,19 @@ static void cis_scan_stat_init(struct cis_scan_stat_t *stat)
static void cis_scan_stat_deinit(struct cis_scan_stat_t *stat)
{
cis_scan_stat_clr(stat);
cis_scan_stat_clr(stat, true);
_rtw_mutex_free(&stat->lock);
}
static void dump_cis_scan_stat(void *sel, struct cis_scan_stat_t *stat)
static void dump_cis_scan_stat(void *sel, struct rf_ctl_t *rfctl)
{
struct cis_scan_stat_t *stat = &rfctl->cis_scan_stat;
_list *list, *head;
struct cis_scan_stat_ent *ent;
RTW_PRINT_SEL(sel, "ENV_BSS (updated %u sec ago)\n"
, rtw_get_passing_time_ms(rfctl->cis_scan_last_complete_time) / 1000);
_rtw_mutex_lock(&stat->lock);
head = &stat->ent;
@@ -1612,7 +1617,7 @@ static void dump_cis_scan_stat(void *sel, struct cis_scan_stat_t *stat)
ent = LIST_CONTAINOR(list, struct cis_scan_stat_ent, list);
list = get_next(list);
RTW_PRINT_SEL(sel, "%c"ALPHA2_FMT" %u\n"
, stat->majority == ent ? '*' : ' '
, RFCTL_GET_CIS_MAJORITY(rfctl) == ent ? '*' : ' '
, ALPHA2_ARG(ent->cisr.alpha2), ent->count);
}
@@ -1682,8 +1687,8 @@ void dump_country_ie_slave_records(void *sel, struct rf_ctl_t *rfctl, bool skip_
#endif
if (rfctl->cis_flags & CISF_ENV_BSS) {
RTW_PRINT_SEL(sel, "\nENV_BSS\n");
dump_cis_scan_stat(sel, &rfctl->cis_scan_stat);
RTW_PRINT_SEL(sel, "\n");
dump_cis_scan_stat(sel, rfctl);
}
}
@@ -2511,7 +2516,7 @@ static bool rtw_rfctl_update_extra_alpha2_req(struct rf_ctl_t *rfctl, const char
static bool rtw_rfctl_extra_alpha2_req_needed(struct rf_ctl_t *rfctl)
{
if (CIS_SCAN_STAT_GET_MAJORITY(&rfctl->cis_scan_stat))
if (RFCTL_GET_CIS_MAJORITY(rfctl))
return false;
if (rfctl->regd_src == REGD_SRC_RTK_PRIV) {
@@ -3368,60 +3373,28 @@ static bool rtw_regd_req_list_add_country_ie_req_from_per_link_cisr(struct rf_ct
return effected;
}
static bool rtw_regd_req_list_add_country_ie_req_from_scanned_network_cisr(_adapter *adapter)
static bool rtw_regd_req_list_add_country_ie_req_from_scan_stat_cisr(struct rf_ctl_t *rfctl)
{
struct rf_ctl_t *rfctl = adapter_to_rfctl(adapter);
struct mlme_priv *mlme = &adapter->mlmepriv;
_queue *queue = &mlme->scanned_queue;
_list *list, *head;
struct wlan_network *scanned;
bool effected = false;
struct cis_scan_stat_t *stat = &rfctl->cis_scan_stat;
#if CONFIG_80211D_ENV_BSS_MAJORITY
struct cis_scan_stat_ent *majority;
#endif
_list *list, *head;
struct cis_scan_stat_ent *ent;
bool effected = false;
_rtw_mutex_lock(&stat->lock);
_rtw_spinlock_bh(&queue->lock);
/* loop scan queue for stat */
head = get_list_head(queue);
list = get_next(head);
while (!rtw_end_of_queue_search(head, list)) {
scanned = LIST_CONTAINOR(list, struct wlan_network, list);
list = get_next(list);
if (scanned->cisr.status == COUNTRY_IE_SLAVE_NOCOUNTRY
|| scanned->cisr.status == COUNTRY_IE_SLAVE_UNKNOWN)
continue;
cis_scan_stat_add(stat, &scanned->cisr);
}
#if CONFIG_80211D_ENV_BSS_MAJORITY
majority = cis_scan_stat_update_majority(stat, !(rfctl->cis_flags & CISF_ENV_BSS_MAJ));
if (majority) {
/* single majority exist, follow */
effected |= rtw_regd_req_list_add_country_ie_req(rfctl, &majority->cisr, false);
} else
#endif
{
/* follow all ENV BSS */
head = get_list_head(queue);
head = &stat->ent;
list = get_next(head);
while (!rtw_end_of_queue_search(head, list)) {
scanned = LIST_CONTAINOR(list, struct wlan_network, list);
ent = LIST_CONTAINOR(list, struct cis_scan_stat_ent, list);
list = get_next(list);
if (scanned->cisr.status == COUNTRY_IE_SLAVE_NOCOUNTRY
|| scanned->cisr.status == COUNTRY_IE_SLAVE_UNKNOWN)
if (ent->cisr.status == COUNTRY_IE_SLAVE_NOCOUNTRY
|| ent->cisr.status == COUNTRY_IE_SLAVE_UNKNOWN)
continue;
effected |= rtw_regd_req_list_add_country_ie_req(rfctl, &scanned->cisr, false);
effected |= rtw_regd_req_list_add_country_ie_req(rfctl, &ent->cisr, false);
}
}
_rtw_spinunlock_bh(&queue->lock);
_rtw_mutex_unlock(&stat->lock);
@@ -3500,15 +3473,16 @@ static bool rtw_chplan_rtk_priv_req_prehdl_country_ie(_adapter *adapter, struct
}
if (rfctl->regd_src == REGD_SRC_RTK_PRIV) {
cis_scan_stat_clr(&rfctl->cis_scan_stat);
rtw_regd_req_list_clear_ref_cnt_by_inr(rfctl, RTW_REGD_SET_BY_COUNTRY_IE);
if (rfctl->cis_enabled) {
if (rfctl->cis_flags & CISF_ENV_BSS)
effected |= rtw_regd_req_list_add_country_ie_req_from_scanned_network_cisr(adapter);
if (!CIS_SCAN_STAT_GET_MAJORITY(&rfctl->cis_scan_stat))
if (RFCTL_GET_CIS_MAJORITY(rfctl))
effected |= rtw_regd_req_list_add_country_ie_req(rfctl, &RFCTL_GET_CIS_MAJORITY(rfctl)->cisr, false);
else {
effected |= rtw_regd_req_list_add_country_ie_req_from_per_link_cisr(rfctl);
if (rfctl->cis_flags & CISF_ENV_BSS)
effected |= rtw_regd_req_list_add_country_ie_req_from_scan_stat_cisr(rfctl);
}
}
effected |= rtw_regd_req_list_clear_zero_ref_req_by_inr(rfctl, RTW_REGD_SET_BY_COUNTRY_IE);
@@ -5010,11 +4984,52 @@ void rtw_cis_scan_idle_check(struct rf_ctl_t *rfctl)
}
}
static bool rtw_cis_scan_stat_update(_adapter *adapter)
{
struct rf_ctl_t *rfctl = adapter_to_rfctl(adapter);
struct mlme_priv *mlme = &adapter->mlmepriv;
_queue *queue = &mlme->scanned_queue;
_list *list, *head;
struct wlan_network *scanned;
bool effected = false;
struct cis_scan_stat_t *stat = &rfctl->cis_scan_stat;
_rtw_mutex_lock(&stat->lock);
cis_scan_stat_clr(stat, false);
_rtw_spinlock_bh(&queue->lock);
/* loop scan queue for stat */
head = get_list_head(queue);
list = get_next(head);
while (!rtw_end_of_queue_search(head, list)) {
scanned = LIST_CONTAINOR(list, struct wlan_network, list);
list = get_next(list);
if (scanned->cisr.status == COUNTRY_IE_SLAVE_NOCOUNTRY
|| scanned->cisr.status == COUNTRY_IE_SLAVE_UNKNOWN)
continue;
cis_scan_stat_add(stat, &scanned->cisr);
}
#if CONFIG_80211D_ENV_BSS_MAJORITY
cis_scan_stat_update_majority(stat);
#endif
_rtw_spinunlock_bh(&queue->lock);
_rtw_mutex_unlock(&stat->lock);
return effected;
}
void rtw_cis_scan_complete_hdl(_adapter *adapter)
{
struct rf_ctl_t *rfctl = adapter_to_rfctl(adapter);
if (rfctl->cis_enabled && (rfctl->cis_flags & CISF_ENV_BSS)) {
rtw_cis_scan_stat_update(adapter);
rfctl->cis_scan_last_complete_time = rtw_get_current_time();
/* 802.11d scan has done complete, trigger regulation selection */

View File

@@ -502,7 +502,7 @@ u8 rtw_ies_update_ie(u8 *ies, uint *ies_len, uint ies_offset, u8 eid, const u8 *
search_len = *ies_len - ies_offset;
target_ie = rtw_get_ie(start, eid, &target_ielen, search_len);
if (target_ie && target_ielen) {
if (target_ie) {
if (target_ielen != content_len) {
remain_ies = target_ie + 2 + target_ielen;
remain_len = search_len - (remain_ies - start);

View File

@@ -177,8 +177,8 @@ sint _rtw_init_mlme_priv(_adapter *padapter)
#else
#define RTW_ROAM_SCAN_RESULT_EXP_MS (10*1000)
#endif
#define RTW_ROAM_SCAN_INTERVAL (2) /* 5*(2 second)*/
#define RTW_ROAM_RSSI_THRESHOLD 45
#define RTW_ROAM_SCAN_INTERVAL (5) /* 5*(2 second)*/
#define RTW_ROAM_RSSI_THRESHOLD 30
#define RTW_ROAM_RSSI_IDLE_TH RTW_ROAM_RSSI_THRESHOLD
#define RTW_ROAM_RSSI_BUSY_TH RTW_ROAM_RSSI_THRESHOLD + 5

View File

@@ -5797,9 +5797,16 @@ u8 *rtw_build_probersp_ies(_adapter *padapter, struct _ADAPTER_LINK *padapter_li
u8 *ssid_ie;
sint ssid_ielen;
sint ssid_ielen_diff;
u8 buf[MAX_IE_SZ];
u8 *buf;
u8 *ies = pframe_start;
buf = rtw_zmalloc(MAX_IE_SZ);
if(!buf) {
RTW_ERR(FUNC_ADPT_FMT" buffer alloc fail\n",
FUNC_ADPT_ARG(padapter));
return NULL;
}
ssid_ie = rtw_get_ie(ies + _FIXED_IE_LENGTH_, _SSID_IE_, &ssid_ielen,
(pframe - ies) - _FIXED_IE_LENGTH_);
@@ -5824,6 +5831,7 @@ u8 *rtw_build_probersp_ies(_adapter *padapter, struct _ADAPTER_LINK *padapter_li
pframe += ssid_ielen_diff;
pattrib->pktlen += ssid_ielen_diff;
}
rtw_mfree((void *)buf, MAX_IE_SZ);
}
#ifdef CONFIG_APPEND_VENDOR_IE_ENABLE
@@ -9738,7 +9746,7 @@ void report_survey_event(_adapter *padapter, union recv_frame *precv_frame)
struct cmd_priv *pcmdpriv;
struct survey_event *psurvey_evt;
#else
struct survey_event psurvey_evt;
struct survey_event *psurvey_evt;
#endif
WLAN_BSSID_EX *bssid;
struct mlme_ext_priv *pmlmeext;
@@ -9790,13 +9798,21 @@ void report_survey_event(_adapter *padapter, union recv_frame *precv_frame)
psurvey_evt = (struct survey_event *)(pevtcmd + sizeof(struct rtw_evt_header));
bssid = (WLAN_BSSID_EX *)&psurvey_evt->bss;
#else
bssid = (WLAN_BSSID_EX *)&psurvey_evt.bss;
psurvey_evt = (struct survey_event *)rtw_zmalloc(sizeof(struct survey_event));
if (!psurvey_evt) {
RTW_ERR(FUNC_ADPT_FMT" buffer alloc fail\n", FUNC_ADPT_ARG(padapter));
return;
}
bssid = (WLAN_BSSID_EX *)&psurvey_evt->bss;
#endif
if (collect_bss_info(padapter, precv_frame, bssid) == _FAIL) {
#ifdef CONFIG_SCAN_REPORT_ENQUEUE
rtw_mfree((u8 *)pcmd_obj, sizeof(struct cmd_obj));
rtw_mfree((u8 *)pevtcmd, cmdsz);
#else
rtw_mfree((void *)psurvey_evt, sizeof(struct survey_event));
#endif
return;
}
@@ -9839,6 +9855,7 @@ void report_survey_event(_adapter *padapter, union recv_frame *precv_frame)
rtw_enqueue_cmd(pcmdpriv, pcmd_obj);
#else
rtw_survey_event_callback(padapter, (u8 *)bssid);
rtw_mfree((void *)psurvey_evt, sizeof(struct survey_event));
#endif
pmlmeext->sitesurvey_res.bss_cnt++;

View File

@@ -559,7 +559,7 @@ static void init_mp_data(_adapter *padapter)
u32 mp_join(_adapter *padapter, u8 mode)
{
WLAN_BSSID_EX bssid;
WLAN_BSSID_EX *bssid;
struct sta_info *psta;
u32 length;
s32 res = _SUCCESS;
@@ -577,31 +577,37 @@ u32 mp_join(_adapter *padapter, u8 mode)
void *phl = GET_PHL_INFO(adapter_to_dvobj(padapter));
/* 1. initialize a new WLAN_BSSID_EX */
_rtw_memset(&bssid, 0, sizeof(WLAN_BSSID_EX));
bssid = (WLAN_BSSID_EX *)rtw_zmalloc(sizeof(WLAN_BSSID_EX));
if (!bssid) {
RTW_ERR(FUNC_ADPT_FMT" buffer alloc fail\n", FUNC_ADPT_ARG(padapter));
res = _FAIL;
return res;
}
RTW_INFO("%s ,pmppriv->network_macaddr=%x %x %x %x %x %x\n", __func__,
pmppriv->network_macaddr[0], pmppriv->network_macaddr[1], pmppriv->network_macaddr[2], pmppriv->network_macaddr[3], pmppriv->network_macaddr[4],
pmppriv->network_macaddr[5]);
_rtw_memcpy(bssid.MacAddress, pmppriv->network_macaddr, ETH_ALEN);
_rtw_memcpy(bssid->MacAddress, pmppriv->network_macaddr, ETH_ALEN);
if (mode == WIFI_FW_ADHOC_STATE) {
bssid.Ssid.SsidLength = strlen("mp_pseudo_adhoc");
_rtw_memcpy(bssid.Ssid.Ssid, (u8 *)"mp_pseudo_adhoc", bssid.Ssid.SsidLength);
bssid.InfrastructureMode = Ndis802_11IBSS;
bssid.IELength = 0;
bssid.Configuration.DSConfig = pmppriv->channel;
bssid->Ssid.SsidLength = strlen("mp_pseudo_adhoc");
_rtw_memcpy(bssid->Ssid.Ssid, (u8 *)"mp_pseudo_adhoc", bssid->Ssid.SsidLength);
bssid->InfrastructureMode = Ndis802_11IBSS;
bssid->IELength = 0;
bssid->Configuration.DSConfig = pmppriv->channel;
} else if (mode == WIFI_FW_STATION_STATE) {
bssid.Ssid.SsidLength = strlen("mp_pseudo_STATION");
_rtw_memcpy(bssid.Ssid.Ssid, (u8 *)"mp_pseudo_STATION", bssid.Ssid.SsidLength);
bssid.InfrastructureMode = Ndis802_11Infrastructure;
bssid.IELength = 0;
bssid->Ssid.SsidLength = strlen("mp_pseudo_STATION");
_rtw_memcpy(bssid->Ssid.Ssid, (u8 *)"mp_pseudo_STATION", bssid->Ssid.SsidLength);
bssid->InfrastructureMode = Ndis802_11Infrastructure;
bssid->IELength = 0;
}
length = get_WLAN_BSSID_EX_sz(&bssid);
length = get_WLAN_BSSID_EX_sz(bssid);
if (length % 4)
bssid.Length = ((length >> 2) + 1) << 2; /* round up to multiple of 4 bytes. */
bssid->Length = ((length >> 2) + 1) << 2; /* round up to multiple of 4 bytes. */
else
bssid.Length = length;
bssid->Length = length;
_rtw_spinlock_bh(&pmlmepriv->lock);
@@ -642,14 +648,14 @@ u32 mp_join(_adapter *padapter, u8 mode)
if (psta)
rtw_free_mld_stainfo(padapter, psta->phl_sta->mld);
/* ToDo CONFIG_RTW_MLD: MLD MAC Address */
pmld = rtw_phl_alloc_mld(GET_PHL_INFO(adapter_to_dvobj(padapter)), padapter->phl_role, bssid.MacAddress, DTYPE);
pmld = rtw_phl_alloc_mld(GET_PHL_INFO(adapter_to_dvobj(padapter)), padapter->phl_role, bssid->MacAddress, DTYPE);
if (pmld == NULL) {
init_fwstate(pmlmepriv, pmppriv->prev_fw_state);
res = _FAIL;
goto end_of_mp_start_test;
}
/* main_id is don't care for self */
psta = rtw_alloc_stainfo(&padapter->stapriv, bssid.MacAddress, DTYPE, 0, padapter_link->wrlink->id, PHL_CMD_DIRECTLY);
psta = rtw_alloc_stainfo(&padapter->stapriv, bssid->MacAddress, DTYPE, 0, padapter_link->wrlink->id, PHL_CMD_DIRECTLY);
if (psta == NULL) {
/*pmlmepriv->fw_state = pmppriv->prev_fw_state;*/
init_fwstate(pmlmepriv, pmppriv->prev_fw_state);
@@ -664,7 +670,7 @@ u32 mp_join(_adapter *padapter, u8 mode)
tgt_network->join_res = 1;
tgt_network->aid = psta->phl_sta->aid = 1;
_rtw_memcpy(&padapter->registrypriv.dev_network, &bssid, length);
_rtw_memcpy(&padapter->registrypriv.dev_network, bssid, length);
rtw_update_registrypriv_dev_network(padapter);
_rtw_memcpy(&tgt_network->network, &padapter->registrypriv.dev_network, padapter->registrypriv.dev_network.Length);
_rtw_memcpy(pnetwork, &padapter->registrypriv.dev_network, padapter->registrypriv.dev_network.Length);
@@ -693,6 +699,7 @@ end_of_mp_start_test:
}
}
rtw_mfree((void *)bssid, sizeof(WLAN_BSSID_EX));
return res;
}
/* This function initializes the DUT to the MP test mode */

View File

@@ -1258,126 +1258,316 @@ static inline void rtw_gen_new_bssid(const u8 *bssid, u8 max_bssid_ind,
/*RTW_INFO("%s, %02x,%02x,%02x,%02x,%02x,%02x \n", __func__, new_bssid[0], new_bssid[1], new_bssid[2], new_bssid[3], new_bssid[4], new_bssid[5]);*/
}
void add_mbssid_network(_adapter *padapter, WLAN_BSSID_EX *ref_bss)
static inline u8 rtw_find_nt_bssid(WLAN_BSSID_EX *ref_bss, u16 *mbssid_addr,
u16 *mbssid_len, u16 *mbssid_total_len)
{
u16 shift = 0;
u8 mbssid_count = 0;
sint mbssid_len_tmp = 0;
u8 *mbssid_ie;
while (1) {
mbssid_ie = rtw_get_ie(ref_bss->IEs + _BEACON_IE_OFFSET_ + shift,
WLAN_EID_MULTIPLE_BSSID,
&mbssid_len_tmp,
(ref_bss->IELength - _BEACON_IE_OFFSET_ - shift));
RTW_DBG("%s, mbssid_len_tmp=%d\n", __func__, mbssid_len_tmp);
if (!mbssid_ie || mbssid_count >= MBSSID_MAX_CNT) {
RTW_DBG("%s, mbssid_ie is NULL or mbssid_count exceeds \n", __func__);
break;
} else {
/*RTW_DBG("%s, ref_bss->IEs = %llx \n", __func__, ref_bss->IEs);*/
/*RTW_DBG("%s, mbssid_ie = %llx \n", __func__, mbssid_ie);*/
mbssid_addr[mbssid_count] = mbssid_ie - ref_bss->IEs;
RTW_DBG("%s, mbssid_addr=%d\n", __func__, mbssid_addr[mbssid_count]);
shift = mbssid_ie - ref_bss->IEs - _BEACON_IE_OFFSET_ + mbssid_len_tmp + 2;
RTW_DBG("%s, shift=%d\n", __func__, shift);
mbssid_len[mbssid_count] = mbssid_len_tmp;
mbssid_count++;
*mbssid_total_len = *mbssid_total_len + mbssid_len_tmp + 2;
}
}
return mbssid_count;
}
static inline void rtw_gen_pure_ref_bss(WLAN_BSSID_EX *prbss, WLAN_BSSID_EX *ref_bss,
u16 *mbssid_addr, u16 mbssid_total_len)
{
_rtw_memcpy(prbss, ref_bss, sizeof(WLAN_BSSID_EX));
_rtw_memset(prbss->IEs, 0, MAX_IE_SZ);
/* cpy the remaining ie before mbssid */
_rtw_memcpy(prbss->IEs, ref_bss->IEs, mbssid_addr[0]);
/* cpy the remaining ie */
_rtw_memcpy(prbss->IEs + mbssid_addr[0],
ref_bss->IEs + mbssid_addr[0] + mbssid_total_len,
ref_bss->IELength - mbssid_total_len - mbssid_addr[0]);
prbss->IELength = ref_bss->IELength - mbssid_total_len;
RTW_DBG_DUMP("A ref_bss->IEs: ", (const u8 *)ref_bss->IEs, ref_bss->IELength);
RTW_DBG_DUMP("B prbss->IEs: ", (const u8 *)prbss->IEs, prbss->IELength);
}
static inline void rtw_update_ntbss_ie(WLAN_BSSID_EX *ntbss, PNDIS_802_11_VARIABLE_IEs sub_pie)
{
RTW_DBG("%s, sub_pie->Length=%d\n", __func__, sub_pie->Length);
RTW_DBG_DUMP("WLAN_EID: ", (const u8 *)sub_pie->data, sub_pie->Length);
RTW_DBG_DUMP("B ntbss->IEs: ", (const u8 *)ntbss->IEs, ntbss->IELength);
/* update ie in ntbss, or append to the end */
if (!rtw_ies_update_ie(ntbss->IEs, &ntbss->IELength,
_BEACON_IE_OFFSET_, sub_pie->ElementID,
sub_pie->data, sub_pie->Length)) {
_rtw_memcpy(ntbss->IEs + ntbss->IELength,
&sub_pie->ElementID, sub_pie->Length + 2);
ntbss->IELength = ntbss->IELength + sub_pie->Length + 2;
}
RTW_DBG_DUMP("C ntbss->IEs: ", (const u8 *)ntbss->IEs, ntbss->IELength);
}
static inline void rtw_update_ntbss_ext_ie(WLAN_BSSID_EX *ntbss, PNDIS_802_11_VARIABLE_IEs sub_pie)
{
u8 i, j;
RTW_DBG_DUMP("WLAN_EID_EXTENSION: ", (const u8 *)sub_pie->data, sub_pie->Length);
RTW_DBG_DUMP("B ntbss->IEs: ", (const u8 *)ntbss->IEs, ntbss->IELength);
/**
* remove non inheritance ie
* | Element ID extension | Ext. tag length | Ext. tag number: Non-Inherence|
* | Element ID List (Length, Element ID 1~n)|
* | Element ID Extension List (Length, Element ID Extension 1~n)|
* Note: The minimum Ext. tag length is 3 (Length, 0, 0)
*/
if (sub_pie->data[0] == WLAN_EID_EXT_NON_INHERITANCE && sub_pie->Length > 3) {
for (i = 1; i <= sub_pie->data[1]; i++)
rtw_ies_remove_ie(ntbss->IEs, &ntbss->IELength, _BEACON_IE_OFFSET_,
sub_pie->data[1 + i], NULL, 0);
for (j = 1; j <= sub_pie->data[1 + i]; j++)
rtw_ies_remove_ie(ntbss->IEs, &ntbss->IELength, _BEACON_IE_OFFSET_,
WLAN_EID_EXTENSION, &sub_pie->data[1 + i + j], 1);
/* update ext ie in ntbss, or append to the end */
} else if (!rtw_ies_update_ie_ex(ntbss->IEs, &ntbss->IELength,
_BEACON_IE_OFFSET_, sub_pie->data[0],
&sub_pie->ElementID, sub_pie->Length + 2)) {
_rtw_memcpy(ntbss->IEs + ntbss->IELength,
&sub_pie->ElementID, sub_pie->Length + 2);
ntbss->IELength = ntbss->IELength + sub_pie->Length + 2;
}
RTW_DBG_DUMP("C ntbss->IEs: ", (const u8 *)ntbss->IEs, ntbss->IELength);
}
static inline void rtw_update_ntbss_vendor_ie(WLAN_BSSID_EX *ntbss, PNDIS_802_11_VARIABLE_IEs sub_pie)
{
RTW_DBG_DUMP("WLAN_EID_VENDOR_SPECIFIC: ", (const u8 *)sub_pie->data, sub_pie->Length);
RTW_DBG_DUMP("B ntbss->IEs: ", (const u8 *)ntbss->IEs, ntbss->IELength);
/* update wmm ie and oui ie in ntbss */
if (RTW_GET_BE24(sub_pie->data) == OUI_MICROSOFT)
rtw_ies_remove_ie(ntbss->IEs, &ntbss->IELength, _BEACON_IE_OFFSET_,
WLAN_EID_VENDOR_SPECIFIC, sub_pie->data, 4);
else
rtw_ies_remove_ie(ntbss->IEs, &ntbss->IELength, _BEACON_IE_OFFSET_,
WLAN_EID_VENDOR_SPECIFIC, sub_pie->data, sub_pie->Length);
_rtw_memcpy(ntbss->IEs + ntbss->IELength, &sub_pie->ElementID, sub_pie->Length + 2);
ntbss->IELength = ntbss->IELength + sub_pie->Length + 2;
RTW_DBG_DUMP("C ntbss->IEs: ", (const u8 *)ntbss->IEs, ntbss->IELength);
}
static inline u8 __rtw_gen_ntbss(_adapter *padapter, WLAN_BSSID_EX *prbss, WLAN_BSSID_EX *ref_bss,
WLAN_BSSID_EX **ntbss, PNDIS_802_11_VARIABLE_IEs pIE, u8 max_bssid_indicator)
{
WLAN_BSSID_EX *pbss;
u32 sub_ies_len;
u8 *mbssid_ie_ptr = NULL;
PNDIS_802_11_VARIABLE_IEs pIE, sub_pie;
u8 max_bssid_indicator;
int i,j;
u8* mbssid_ie;
sint mbssid_len;
u8 mbssid_index;
u8 copy_ie_offset;
int j;
PNDIS_802_11_VARIABLE_IEs sub_pie;
u32 copy_ie_len = 0;
u8 copy_ie_offset;
u8 mbssid_index;
struct wlan_network *pnetwork = NULL;
struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
mbssid_ie = rtw_get_ie(ref_bss->IEs + _BEACON_IE_OFFSET_
, WLAN_EID_MULTIPLE_BSSID
, &mbssid_len
, (ref_bss->IELength- _BEACON_IE_OFFSET_));
if (!mbssid_ie)
return;
#if 0
else
RTW_PRINT_DUMP("mbssid_ie: ", (const u8 *)mbssid_ie, mbssid_len);
#endif
mbssid_ie_ptr = mbssid_ie;
max_bssid_indicator = GET_MBSSID_MAX_BSSID_INDOCATOR(mbssid_ie_ptr);
/*RTW_INFO("%s, max_bssid_indicator=%d\n", __func__, max_bssid_indicator);*/
mbssid_ie_ptr = mbssid_ie_ptr + MBSSID_MAX_BSSID_INDICATOR_OFFSET;
for (i = 0; i + 1 < mbssid_len;) {
pIE = (PNDIS_802_11_VARIABLE_IEs)(mbssid_ie_ptr + i);
switch (pIE->ElementID) {
case MBSSID_NONTRANSMITTED_BSSID_PROFILE_ID:
sub_ies_len = pIE->Length;
pbss = (WLAN_BSSID_EX *)rtw_zmalloc(sizeof(WLAN_BSSID_EX));
if (pbss) {
_rtw_memcpy(pbss, ref_bss, sizeof(WLAN_BSSID_EX));
_rtw_memset(pbss->IEs, 0, MAX_IE_SZ);
copy_ie_len = _TIMESTAMP_ + _BEACON_ITERVAL_;
_rtw_memcpy(pbss->IEs, ref_bss->IEs, copy_ie_len);
} else {
return;
}
RTW_DBG("%s, sub_ies_len=%d\n", __func__, sub_ies_len);
for (j = 0; j + 1 < sub_ies_len;) {
sub_pie = (PNDIS_802_11_VARIABLE_IEs)(pIE->data + j);
RTW_DBG("%s, sub_pie->ElementID=%d\n", __func__, sub_pie->ElementID);
switch (sub_pie->ElementID) {
case WLAN_EID_NON_TX_BSSID_CAP:
/*RTW_INFO("%s, sub_pie->Length=%d\n", __func__, sub_pie->Length);*/
/*RTW_PRINT_DUMP("WLAN_EID_NON_TX_BSSID_CAP: ", (const u8 *)sub_pie->data, sub_pie->Length);*/
/* with mbssid and need to add_network */
*ntbss = (WLAN_BSSID_EX *)rtw_zmalloc(sizeof(WLAN_BSSID_EX));
if (!*ntbss)
return _FALSE;
_rtw_memcpy(*ntbss, prbss, sizeof(WLAN_BSSID_EX));
_rtw_memset((*ntbss)->IEs, 0, MAX_IE_SZ);
copy_ie_len = _TIMESTAMP_ + _BEACON_ITERVAL_;
_rtw_memcpy((*ntbss)->IEs, prbss->IEs, copy_ie_len);
(*ntbss)->is_mbssid = _TRUE;
RTW_DBG_DUMP("B ntbss->IEs: ", (const u8 *)(*ntbss)->IEs, (*ntbss)->IELength);
RTW_DBG("%s, sub_pie->Length=%d\n", __func__, sub_pie->Length);
RTW_DBG_DUMP("WLAN_EID_NON_TX_BSSID_CAP: ", (const u8 *)sub_pie->data, sub_pie->Length);
copy_ie_offset = _TIMESTAMP_ + _BEACON_ITERVAL_;
_rtw_memcpy(pbss->IEs + copy_ie_offset, sub_pie->data, sub_pie->Length);
_rtw_memcpy((*ntbss)->IEs + copy_ie_offset, sub_pie->data, sub_pie->Length);
copy_ie_offset = copy_ie_offset + _CAPABILITY_;
_rtw_memcpy((*ntbss)->IEs + copy_ie_offset, prbss->IEs + copy_ie_offset, prbss->IELength - copy_ie_offset);
RTW_DBG_DUMP("C ntbss->IEs: ", (const u8 *)(*ntbss)->IEs, (*ntbss)->IELength);
break;
case WLAN_EID_SSID:
/*RTW_PRINT_DUMP("WLAN_EID_SSID: ", (const u8 *)sub_pie->data, sub_pie->Length);*/
/*RTW_INFO("%s, ref_bss->IELength=%d\n", __func__, ref_bss->IELength);*/
/*RTW_PRINT_DUMP("A ref_bss->IEs: ", (const u8 *)ref_bss->IEs, ref_bss->IELength);*/
copy_ie_offset = _TIMESTAMP_ + _BEACON_ITERVAL_ + _CAPABILITY_;
copy_ie_len = WLAN_IE_ID_LEN + WLAN_IE_LEN_LEN;
_rtw_memcpy(pbss->IEs + copy_ie_offset, sub_pie, copy_ie_len);
copy_ie_offset = copy_ie_offset + WLAN_IE_ID_LEN + WLAN_IE_LEN_LEN;
_rtw_memcpy(pbss->IEs + copy_ie_offset, sub_pie->data, sub_pie->Length);
_rtw_memcpy(pbss->IEs + copy_ie_offset + sub_pie->Length
, ref_bss->IEs + copy_ie_offset + ref_bss->Ssid.SsidLength
, ref_bss->IELength - (copy_ie_offset + ref_bss->Ssid.SsidLength));
pbss->IELength = ref_bss->IELength + (sub_pie->Length - ref_bss->Ssid.SsidLength);
/*RTW_INFO("%s, ref_bss->Ssid.SsidLength=%d\n", __func__, ref_bss->Ssid.SsidLength);*/
/*RTW_INFO("%s, sub_pie->Length=%d\n", __func__, sub_pie->Length);*/
/*RTW_INFO("%s, pbss->IELength=%d\n", __func__, pbss->IELength);*/
/*RTW_PRINT_DUMP("B pbss->IEs: ", (const u8 *)pbss->IEs, pbss->IELength);*/
_rtw_memset(pbss->Ssid.Ssid, 0, pbss->Ssid.SsidLength);
_rtw_memcpy(pbss->Ssid.Ssid, sub_pie->data, sub_pie->Length);
pbss->Ssid.SsidLength = sub_pie->Length;
RTW_DBG_DUMP("WLAN_EID_SSID: ", (const u8 *)sub_pie->data, sub_pie->Length);
RTW_DBG("%s, ref_bss->IELength=%d\n", __func__, ref_bss->IELength);
RTW_DBG_DUMP("A ref_bss->IEs: ", (const u8 *)ref_bss->IEs, ref_bss->IELength);
rtw_ies_update_ie((*ntbss)->IEs, &(*ntbss)->IELength,
_BEACON_IE_OFFSET_, WLAN_EID_SSID,
sub_pie->data, sub_pie->Length);
RTW_DBG_DUMP("B ntbss->IEs: ", (const u8 *)(*ntbss)->IEs, (*ntbss)->IELength);
_rtw_memset((*ntbss)->Ssid.Ssid, 0, (*ntbss)->Ssid.SsidLength);
_rtw_memcpy((*ntbss)->Ssid.Ssid, sub_pie->data, sub_pie->Length);
(*ntbss)->Ssid.SsidLength = sub_pie->Length;
break;
case WLAN_EID_MULTI_BSSID_IDX:
/*RTW_INFO("%s, sub_pie->Length=%d\n", __func__, sub_pie->Length);*/
/*RTW_PRINT_DUMP("WLAN_EID_MULTI_BSSID_IDX: ", (const u8 *)sub_pie->data, sub_pie->Length);*/
RTW_DBG("%s, sub_pie->Length=%d\n", __func__, sub_pie->Length);
RTW_DBG_DUMP("WLAN_EID_MULTI_BSSID_IDX: ", (const u8 *)sub_pie->data, sub_pie->Length);
mbssid_index = GET_MULTIPLE_BSSID_IDX_INDEX((u8 *)sub_pie);
/*RTW_INFO("%s,mbssid_index=%d\n", __func__, mbssid_index);*/
rtw_gen_new_bssid(ref_bss->MacAddress, max_bssid_indicator
, mbssid_index, pbss->MacAddress);
pbss->mbssid_index = mbssid_index;
_rtw_memcpy(pbss->mbsMacAddress, ref_bss->MacAddress, ETH_ALEN);
RTW_DBG("%s,mbssid_index=%d\n", __func__, mbssid_index);
rtw_gen_new_bssid(ref_bss->MacAddress, max_bssid_indicator,
mbssid_index, (*ntbss)->MacAddress);
(*ntbss)->mbssid_index = mbssid_index;
_rtw_memcpy((*ntbss)->mbsMacAddress, ref_bss->MacAddress, ETH_ALEN);
break;
case WLAN_EID_EXTENSION:
rtw_update_ntbss_ext_ie(*ntbss, sub_pie);
break;
case WLAN_EID_VENDOR_SPECIFIC:
rtw_update_ntbss_vendor_ie(*ntbss, sub_pie);
break;
default:
rtw_update_ntbss_ie(*ntbss, sub_pie);
break;
}
j += (sub_pie->Length + WLAN_IE_ID_LEN + WLAN_IE_LEN_LEN);
/*RTW_INFO("%s, j=%d\n", __func__, j);*/
RTW_DBG("%s(%d), j=%d\n", __func__, __LINE__, j);
}
pbss->is_mbssid = _TRUE;
pnetwork = add_network(padapter, pbss);
/* detects that there are no more ie for the current or last mbssid, so add network */
RTW_DBG_DUMP("pIE->data: ", (const u8 *)(pIE->data + j), 6);
if (*(pIE->data + j) == WLAN_EID_MULTIPLE_BSSID &&
*(pIE->data + j + 3) == MBSSID_NONTRANSMITTED_BSSID_PROFILE_ID &&
*(pIE->data + j + 5) != WLAN_EID_NON_TX_BSSID_CAP)
goto exit;
if (*(pIE->data + j) == MBSSID_NONTRANSMITTED_BSSID_PROFILE_ID &&
*(pIE->data + j + 2) != WLAN_EID_NON_TX_BSSID_CAP)
goto exit;
if ((*ntbss)->is_mbssid == _TRUE) {
RTW_DBG_DUMP("Add ntbss->IEs: ", (const u8 *)(*ntbss)->IEs, (*ntbss)->IELength);
pnetwork = add_network(padapter, (*ntbss));
#ifdef CONFIG_RTW_FSM_BTM
if (padapter->fsmpriv.btmpriv.btm && pnetwork) {
/* check SSID */
if ((pbss->Ssid.SsidLength == pmlmepriv->dev_cur_network.network.Ssid.SsidLength) &&
_rtw_memcmp(pbss->Ssid.Ssid, pmlmepriv->dev_cur_network.network.Ssid.Ssid,
pbss->Ssid.SsidLength))
if (((*ntbss)->Ssid.SsidLength == pmlmepriv->dev_cur_network.network.Ssid.SsidLength) &&
_rtw_memcmp((*ntbss)->Ssid.Ssid, pmlmepriv->dev_cur_network.network.Ssid.Ssid,
(*ntbss)->Ssid.SsidLength))
rtw_btm_notify_scan_found_candidate(padapter->fsmpriv.btmpriv.btm, pnetwork);
}
#endif
rtw_mfree((u8 *)pbss, sizeof(WLAN_BSSID_EX));
break;
case MBSSID_VENDOR_SPECIFIC_ID:
rtw_mfree((void *)*ntbss, sizeof(WLAN_BSSID_EX));
}
exit:
return _SUCCESS;
}
static inline u8 _rtw_gen_ntbss(_adapter *padapter, WLAN_BSSID_EX *prbss, WLAN_BSSID_EX *ref_bss,
WLAN_BSSID_EX **ntbss, u16 *mbssid_addr, u16 *mbssid_len, int idx)
{
int i;
bool ret = _SUCCESS;
PNDIS_802_11_VARIABLE_IEs pIE;
u8 max_bssid_indicator;
for (i = 0; i + 1 < mbssid_len[idx];) {
max_bssid_indicator = GET_MBSSID_MAX_BSSID_INDOCATOR(ref_bss->IEs + mbssid_addr[idx]);
pIE = (PNDIS_802_11_VARIABLE_IEs)(ref_bss->IEs + mbssid_addr[idx] + i + MBSSID_MAX_BSSID_INDICATOR_OFFSET);
switch (pIE->ElementID) {
case MBSSID_NONTRANSMITTED_BSSID_PROFILE_ID:
ret = __rtw_gen_ntbss(padapter, prbss, ref_bss, ntbss, pIE, max_bssid_indicator);
break;
default:
break;
}
if (!ret)
return ret;
RTW_DBG("%s, pIE->ElementID=%d\n", __func__, pIE->ElementID);
i += (pIE->Length + WLAN_IE_ID_LEN + WLAN_IE_LEN_LEN);
/*RTW_INFO("%s, i=%d\n", __func__, i);*/
RTW_DBG("%s(%d), i=%d\n", __func__, __LINE__, i);
}
return ret;
}
static inline u8 rtw_gen_ntbss(_adapter *padapter, WLAN_BSSID_EX *prbss, WLAN_BSSID_EX *ref_bss,
u8 mbssid_count, u16 *mbssid_addr, u16 *mbssid_len)
{
int idx;
bool ret = _SUCCESS;
WLAN_BSSID_EX *ntbss = NULL;
for (idx = 0; idx < mbssid_count; idx++) {
RTW_DBG("%s, Multiple BSSID IDX=%d\n", __func__, idx);
ret = _rtw_gen_ntbss(padapter, prbss, ref_bss, &ntbss, mbssid_addr, mbssid_len, idx);
if (!ret)
return ret;
}
return ret;
}
u8 add_mbssid_network(_adapter *padapter, WLAN_BSSID_EX *ref_bss)
{
WLAN_BSSID_EX *prbss;
u8 mbssid_count = 0;
u16 mbssid_addr[MBSSID_MAX_CNT];
u16 mbssid_len[MBSSID_MAX_CNT];
bool ret = _FALSE;
u16 mbssid_total_len = 0;
/* find all nontransmitted bssids */
mbssid_count = rtw_find_nt_bssid(ref_bss, mbssid_addr, mbssid_len,
&mbssid_total_len);
RTW_DBG("%s, Multiple BSSID total length=%d\n", __func__, mbssid_total_len);
if (!mbssid_count)
return _FALSE;
/* generate a pure reference bss and add network */
prbss = (WLAN_BSSID_EX *)rtw_zmalloc(sizeof(WLAN_BSSID_EX));
if(!prbss)
return _FALSE;
rtw_gen_pure_ref_bss(prbss, ref_bss, mbssid_addr, mbssid_total_len);
add_network(padapter, prbss);
/* parsing nontransmitted bssid in mbssid set */
ret = rtw_gen_ntbss(padapter, prbss, ref_bss, mbssid_count, mbssid_addr, mbssid_len);
if (!ret)
return _FALSE;
RTW_DBG("%s, ret=%d\n", __func__, ret);
rtw_mfree((void *)prbss, sizeof(WLAN_BSSID_EX));
return _TRUE;
}
#endif
@@ -1428,6 +1618,10 @@ void rtw_survey_event_callback(_adapter *adapter, u8 *pbuf)
if ((check_fwstate(pmlmepriv, WIFI_UNDER_LINKING)) == _FALSE) {
struct wlan_network *pnetwork;
#ifdef CONFIG_STA_MULTIPLE_BSSID
if (add_mbssid_network(adapter, bss) == _FALSE)
#endif
{
if (bss->Ssid.Ssid[0] == 0)
bss->Ssid.SsidLength = 0;
@@ -1438,10 +1632,8 @@ void rtw_survey_event_callback(_adapter *adapter, u8 *pbuf)
+= rtw_process_beacon_hint(adapter_to_rfctl(adapter), pnetwork);
}
}
}
#ifdef CONFIG_STA_MULTIPLE_BSSID
add_mbssid_network(adapter, bss);
#endif
#ifdef CONFIG_RTW_FSM_BTM
if (adapter->fsmpriv.btmpriv.btm) {
/* check SSID */

View File

@@ -1519,9 +1519,15 @@ void rtw_absorb_ssid_ifneed(_adapter *padapter, WLAN_BSSID_EX *bssid, u8 *pframe
u8 *mac;
sint ssid_len_ori;
u32 remain_len = 0;
u8 backupIE[MAX_IE_SZ];
u8 *backupIE;
u16 subtype;
backupIE = rtw_zmalloc(MAX_IE_SZ);
if(!backupIE) {
RTW_ERR(FUNC_ADPT_FMT" buffer alloc fail\n", FUNC_ADPT_ARG(padapter));
return;
}
mac = get_addr2_ptr(pframe);
subtype = get_frame_sub_type(pframe);
@@ -1545,6 +1551,7 @@ void rtw_absorb_ssid_ifneed(_adapter *padapter, WLAN_BSSID_EX *bssid, u8 *pframe
_rtw_spinlock_bh(&padapter->mlmepriv.scanned_queue.lock);
scanned = _rtw_find_network(&padapter->mlmepriv.scanned_queue, mac);
if (!scanned) {
rtw_mfree((void *)backupIE, MAX_IE_SZ);
_rtw_spinunlock_bh(&padapter->mlmepriv.scanned_queue.lock);
return;
}
@@ -1554,6 +1561,7 @@ void rtw_absorb_ssid_ifneed(_adapter *padapter, WLAN_BSSID_EX *bssid, u8 *pframe
if (hidden_ssid_ap(snetwork) && !hidden_ssid_ap(bssid)) {
p = rtw_get_ie(snetwork->IEs+ie_offset, _SSID_IE_, &ssid_len_ori, snetwork->IELength-ie_offset);
if (!p) {
rtw_mfree((void *)backupIE, MAX_IE_SZ);
_rtw_spinunlock_bh(&padapter->mlmepriv.scanned_queue.lock);
return;
}
@@ -1569,6 +1577,7 @@ void rtw_absorb_ssid_ifneed(_adapter *padapter, WLAN_BSSID_EX *bssid, u8 *pframe
_rtw_memcpy(p+2+bssid->Ssid.SsidLength, backupIE, remain_len);
snetwork->IELength += bssid->Ssid.SsidLength;
}
rtw_mfree((void *)backupIE, MAX_IE_SZ);
_rtw_spinunlock_bh(&padapter->mlmepriv.scanned_queue.lock);
}

View File

@@ -1146,6 +1146,12 @@ struct rf_ctl_t {
#define RFCTL_REG_EN_11BE(rfctl) false
#endif
#ifdef CONFIG_80211D
#define RFCTL_GET_CIS_MAJORITY(rfctl) (((rfctl)->cis_flags & CISF_ENV_BSS_MAJ) ? CIS_SCAN_STAT_GET_MAJORITY(&(rfctl)->cis_scan_stat) : NULL)
#else
#define RFCTL_GET_CIS_MAJORITY(rfctl) NULL
#endif
#if defined(CONFIG_80211D) && CONFIG_IEEE80211_BAND_6GHZ
#define RFCTL_RECV_6G_REG_INFO(rfctl, iface_id, alink_id) ((rfctl)->recv_6g_reg_info[iface_id][alink_id])
#else

View File

@@ -1 +1 @@
#define DRIVERVERSION "v1.19.16_nv-126-10-g6784793e9.20250808_Certified_Module_beta"
#define DRIVERVERSION "v1.19.16_nv-126-16-gbf1934e39.20250910_Certified_Module_beta"

View File

@@ -1304,6 +1304,7 @@ struct rtw_regulatory {
LE_BITS_TO_1BYTE((_pEleStart) + 2, 0, 8)
#define MBSSID_MAX_BSSID_INDICATOR_OFFSET 3
#define MBSSID_MAX_CNT 10
#define GET_MULTIPLE_BSSID_IDX_INDEX(_pEleStart) \
LE_BITS_TO_1BYTE((_pEleStart) + 2, 0, 8)

View File

@@ -16,7 +16,7 @@
#define __WLAN_BSSDEF_H__
#define MAX_IE_SZ 768
#define MAX_IE_SZ 1840 /* mbssid in beacon defined in WIFI Alliance */
#ifdef PLATFORM_LINUX

View File

@@ -688,7 +688,7 @@ exit:
return ret;
}
#define MAX_BSSINFO_LEN 1000
#define MAX_BSSINFO_LEN 2072 /* MAX_IE_SZ + 232 */
struct cfg80211_bss *rtw_cfg80211_inform_bss(_adapter *padapter, struct wlan_network *pnetwork)
{
struct ieee80211_channel *notify_channel;
@@ -2898,22 +2898,22 @@ void rtw_cfg80211_unlink_bss(_adapter *padapter, struct wlan_network *pnetwork)
struct wireless_dev *pwdev = padapter->rtw_wdev;
struct wiphy *wiphy = pwdev->wiphy;
struct cfg80211_bss *bss = NULL;
WLAN_BSSID_EX select_network = pnetwork->network;
WLAN_BSSID_EX *select_network = &pnetwork->network;
bss = cfg80211_get_bss(wiphy, NULL/*notify_channel*/,
select_network.MacAddress, select_network.Ssid.Ssid,
select_network.Ssid.SsidLength,
select_network->MacAddress, select_network->Ssid.Ssid,
select_network->Ssid.SsidLength,
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 0)
select_network.InfrastructureMode == Ndis802_11Infrastructure?IEEE80211_BSS_TYPE_ESS:IEEE80211_BSS_TYPE_IBSS,
IEEE80211_PRIVACY(select_network.Privacy));
select_network->InfrastructureMode == Ndis802_11Infrastructure?IEEE80211_BSS_TYPE_ESS:IEEE80211_BSS_TYPE_IBSS,
IEEE80211_PRIVACY(select_network->Privacy));
#else
select_network.InfrastructureMode == Ndis802_11Infrastructure?WLAN_CAPABILITY_ESS:WLAN_CAPABILITY_IBSS,
select_network.InfrastructureMode == Ndis802_11Infrastructure?WLAN_CAPABILITY_ESS:WLAN_CAPABILITY_IBSS);
select_network->InfrastructureMode == Ndis802_11Infrastructure?WLAN_CAPABILITY_ESS:WLAN_CAPABILITY_IBSS,
select_network->InfrastructureMode == Ndis802_11Infrastructure?WLAN_CAPABILITY_ESS:WLAN_CAPABILITY_IBSS);
#endif
if (bss) {
cfg80211_unlink_bss(wiphy, bss);
RTW_INFO("%s(): cfg80211_unlink %s!!\n", __func__, select_network.Ssid.Ssid);
RTW_INFO("%s(): cfg80211_unlink %s!!\n", __func__, select_network->Ssid.Ssid);
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0)
cfg80211_put_bss(padapter->rtw_wdev->wiphy, bss);
#else
@@ -3503,8 +3503,15 @@ bypass_p2p_chk:
ret = -EBUSY;
goto check_need_indicate_scan_done;
case SS_DENY_SELF_AP_UNDER_SURVEY:
case SS_DENY_SELF_STA_UNDER_SURVEY:
#ifdef CONFIG_RTW_FSM_BTM
if (padapter->fsmpriv.btmpriv.btm) {
ret = -EBUSY;
goto exit;
}
fallthrough;
#endif
case SS_DENY_SELF_AP_UNDER_SURVEY:
if (rtw_cfg80211_scan_via_auto_scan(padapter, request) == _FALSE)
need_indicate_scan_done = _TRUE;
goto check_need_indicate_scan_done;

View File

@@ -7,10 +7,10 @@
ifeq ($(CONFIG_PHL_ARCH), y)
phl_path := phl/$(HAL)
phl_path_d1 := $(SOURCETREE)/phl/$(HAL)
phl_path_d1 := $(src)/phl/$(HAL)
else
phl_path := $(HAL)
phl_path_d1 := $(SOURCETREE)/$(HAL)
phl_path_d1 := $(src)/$(HAL)
endif
# Base directory

View File

@@ -2,10 +2,10 @@
ifeq ($(CONFIG_PHL_ARCH), y)
phl_path := phl/
phl_path_d1 := $(SOURCETREE)/phl/$(HAL)
phl_path_d1 := $(src)/phl/$(HAL)
else
phl_path :=
phl_path_d1 := $(SOURCETREE)/$(HAL)
phl_path_d1 := $(src)/$(HAL)
endif
_HAL_FILES := $(phl_path)$(HAL)/hal_api_mac.o \

View File

@@ -7,10 +7,10 @@ HAL = hal_g6
ifeq ($(CONFIG_PHL_ARCH), y)
phl_path := phl/hal_g6
phl_path_d1 := $(SOURCETREE)/phl/$(HAL)
phl_path_d1 := $(src)/phl/$(HAL)
else
phl_path := hal_g6
phl_path_d1 := $(SOURCETREE)/$(HAL)
phl_path_d1 := $(src)/$(HAL)
endif
# Base directory

View File

@@ -7,10 +7,10 @@
ifeq ($(CONFIG_PHL_ARCH), y)
phl_path := phl/$(HAL)
phl_path_d1 := $(SOURCETREE)/phl/$(HAL)
phl_path_d1 := $(src)/phl/$(HAL)
else
phl_path := $(HAL)
phl_path_d1 := $(SOURCETREE)/$(HAL)
phl_path_d1 := $(src)/$(HAL)
endif
# Base directory

View File

@@ -7,10 +7,10 @@
ifeq ($(CONFIG_PHL_ARCH), y)
phl_path := phl/$(HAL)
phl_path_d1 := $(SOURCETREE)/phl/$(HAL)
phl_path_d1 := $(src)/phl/$(HAL)
else
phl_path := $(HAL)
phl_path_d1 := $(SOURCETREE)/$(HAL)
phl_path_d1 := $(src)/$(HAL)
endif
# Base directory

View File

@@ -11,10 +11,10 @@ endif
ifeq ($(CONFIG_PHL_ARCH), y)
phl_path := phl/
phl_path_d1 := $(SOURCETREE)/phl/$(HAL)
phl_path_d1 := $(src)/phl/$(HAL)
else
phl_path :=
phl_path_d1 := $(SOURCETREE)/$(HAL)
phl_path_d1 := $(src)/$(HAL)
endif
_PHL_FILES := $(phl_path)phl_init.o \

View File

@@ -343,12 +343,12 @@ next_ch:
goto next_ch;
}
else {
PHL_INFO("%s: scan done\n", __func__);
printk("%s: scan done\n", __func__);
return NULL;
}
param->done_num = param->ch_num - sctrl->chlist.cnt;
PHL_INFO("%s:[%d] idx=%d, r=%d, ch=%d, p=%d\n", __func__,
printk("%s:[%d] idx=%d, r=%d, ch=%d, p=%d\n", __func__,
band_idx, sctrl->ch_idx, sctrl->chlist.cnt, sctrl->scan_ch->channel,
phl_get_passing_time_ms(param->start_time));

View File

@@ -26,14 +26,14 @@
#define __PHL_GIT_INFO_H__
/*@--------------------------[Define] ---------------------------------------*/
#define RTK_CORE_SHA1 "6784793e97c8520c94a2fb213397e109827325ec"
#define RTK_CORE_SHA1 "bf1934e39d7842ed35fa61ef726cc2d4b7b2029e"
#define RTK_PHL_SHA1 "981191b0a91d583e48282299b55d86f768f4b98b"
#define RTK_HALMAC_SHA1 "a8003e258e7ceec767c2e329732e7e3b63934473"
#define RTK_HALBB_SHA1 "8f07cd65ef4ef6867255f3a95706e417c8d31bf3"
#define RTK_HALRF_SHA1 "01c1864e02ade0c1d1482c85d6bb0fa0f4799651"
#define RTK_BTC_SHA1 "33bcdb9f10f24aa8b92ee86a7076f89faf6ccbed"
#define RTK_CORE_TAGINFO "v1.19.16_nv-126-10-g6784793e9"
#define RTK_CORE_TAGINFO "v1.19.16_nv-126-16-gbf1934e39"
#define RTK_PHL_TAGINFO "PHL_1_19_111_0100-94-g981191b0a"
#define RTK_HALMAC_TAGINFO "HALMAC_0_29_95_0-1-ga8003e258e"
#define RTK_HALBB_TAGINFO "HALBB_029_167_15-2-g8f07cd65"