大家好
在分析了 HostCmd_CMD_802_11_ASSOCIATE 命令后,我得出结论,在作为一个站连接到接入点时,有一些字段没有设置,而是发送了随机数据。
这涉及到全局例程wlan_cmd_802_11 _associate():
第一个位置位于
/* 设置监听间隔 */
passo->监听间隔= wlan_cpu_to_le16(pmpriv-)>listen_interval);
/* 设置信标周期 */
通过>信标周期= wlan_cpu_too_le16(pbss_desc-)>信标周期);
在这里,监听和信标周期被插入报文头,但还有一个名为
t_u8dtim_period;
的字段没有填写,因此有一个随机值(取决于缓冲区中原来使用的值)
第二个位置位于
pss_tlv = (MrvlIEtypes_SsParamSet_t *)(void *)pos;
pss_tlv->header.type = wlan_cpu_too_le16(TLV_TYPE_CF);
pss_tlv->header.len = sizeof(pss_tlv->cf_ibss.cf_param_set);
pos += sizeof(pss_tlv->header) + pss_tlv->header.len;
可以看出,插入了一个类型为 TLV_TYPE_CF 的条目,其固定长度为 6 字节,但是 6 字节未写入,因此具有随机值(取决于原始缓冲区内容)。
看起来,如果收到 CF_PARAM_SET ID,cf_param_set 的内容可以选择由扫描数据填充。如果没有收到,最好不要插入存档数据,但如果已经收到,将数据复制到这里可能是正确的。
欢迎提出意见。
Regards
Mark
嗨,Christine
,我同意这份报告--这正是我所理解(和看到的)的问题。
Regards
Mark
谢谢您的答复,好的,我明白了。
您能帮忙确认一下我们的理解是否与您一致吗?
============
根本原因
===========
顺祝商祺!
Christine。
你好 Christine
我用的是嵌入式艺术家板:https://www.embeddedartists.com/products/imx-rt1062-oem/
为了使用它,我使用了 EVK-MIMXRT1060 的 SDK_2.14.0 以及 Embedded Artists 提供的补丁,以便在他们的硬件上运行。
WiFi 部分没有补丁,只是从 SDK 中获取。
因此,我相信我已经有了最新的 WiFi 库代码。
Regards
Mark
1.首先,请确认我们的理解是否与您一致。
2. 我想你提到过你在使用:SDK_2.14.0_EVK-MIMXRT1060,但你不太确定。因此,请先检查一下你手中的板是什么,或者给我拍张照片。这样我就可以帮你检查一下。还要让我知道你是否在板上做过任何硬件重做。这样我就能更好地了解你在使用哪个板。
3. 你可以从这里获得我们的最新版本:
https://mcuxpresso.nxp.com/select
选择你正在使用的板。
友情提醒
我们有 MIMXRT1060-EVKB/MIMXRT1060-EVKC和 EVK-MIMXRT1060
请手里拿着板选择正确的棋子。
如果你使用的是:EVK-MIMXRT1060,那么 SDK_2.14.0 是最新的 SDK 版本。
如果你使用的是 MIMXRT1060-EVKB 或 MIMXRT1060-EVKC ,最新的 SDK 版本是:SDK 25.09 作为我的屏幕截图 。
顺祝商祺!
Christine。
你好 Christine
不幸的是,我不知道在哪里可以找到我正在使用的版本号,也不知道在哪里可以访问新版本,比如参考的 v25.09.00。
你知道它在哪里吗?
此致
Mark
请参阅下文,了解我们内部团队的反馈意见,并确认我们的理解。
根本原因
为了帮助缩小问题范围,请帮助使用最新版本 (v25.09.00) 进行测试,并确认该版本中是否存在相同的行为。
致以最诚挚的问候
Christine。
从我个人的理解来看,我认为你是对的。
但我需要向我们内部的 SDK 专家团队报告,以进行仔细检查,而且我也没有直接修改 SDK 的权限。
一旦得到内部团队的反馈,我们将及时更新。
感谢您与我们分享这些信息,这确实有助于我们改进产品。
顺祝商祺!
Christine。
嗨,Christine
以下是显示该问题的调试屏幕截图。
1.我在
wlan_cmd_802_11_associate()[此函数准备关联命令]
中的
cmd->command = wlan_cpu_to_le16(HostCmd_CMD_802_11_ASSOCIATE);
,当工作站连接到接入点时就会出现中断。
2. 我将缓冲区(cmd)设置为初始模式,这样就可以看到例程填写了哪些元素:
3.我让函数完成(现在可以发送内容了),然后再次检查缓冲区的内容。
从缓冲区中可以看出,有 7 个字节没有更改(初始值仍为 0x55)。
(请注意,缓冲区开头的其他一些值也没有改变,但它们是最低一级驱动程序传输内容时填充的长度值)
4. 我现在重复一次,但将 0xAA 设置为初始缓冲区模式。
然后,我让缓冲区再次填满:
这验证了 0x55/0xAA 不是真实值,并确认缓冲区没有完全写入。
第一个单字节是 dtim_period 的位置,通过在代码中添加 p
asso-> dtim_period = pbss_desc-> dtim_period; 可以很容易地纠正这个位置。
接下来的 6 个缺失字节是 mrvlieTypes_ssparamset_T 的联合 cf_ibss 的内容应该所在的位置。我不知道它们是从哪里来的,所以没有尝试修改代码。
下面是一个真实连接尝试的示例,缓冲区从之前使用过的内容开始。
填写之前:
填写后
因此,它 "随机 "拥有这些位置上缓冲区中的任何值,这些值可能有效,也可能无效,这取决于它们实际控制的内容和它们碰巧拥有的值。当然,代码的更改或缓冲区使用顺序的改变会导致原始缓冲区内容的不同,从而可能导致整体行为的改变。
我希望我能充分说明这个错误,以便在项目中加以纠正。
Regards
Mark
当然,请帮助发送截图,以便我们更好地理解您的意思。
顺祝商祺!
Christine。
嗨,克里斯蒂娜
cmd
是一个输出缓冲区,原本是空的,在例程中被填满,因此 cmd 不会传递任何值。
下次使用调试器时,我会给你发送调试器屏幕截图来说明问题。
Regards
Mark
Regards
Mark
我下载了相同版本的 SDK,并检查了你提到的内容。
参数通过 IN HostCmd_DS_COMMAND *cmd 传递。
请参见下文:
HostCmd_DS_802_11_ASSOCIATE *passo = &cmd->params.associate;
如果我的理解有误,请告诉我。
或者您可以提供调试器截图,以便我更好地理解您的疑虑。
顺祝商祺!
Christine。
你好,克里斯蒂娜
我正在使用 MCUXpresso SDK 中包含的恩智浦 WiFi 库开发 i.MX RT 1062。
MCUXpresso IDE v11.9.1 [内部版本 2170] [2024-04-19]
我不确定 SDK 的版本号,但该项目最初是在 26.8.2024 上安装的。但是我的 SDK 生成器仪表板显示了
下面是显示其 mlan 文件和第一个代码问题的屏幕截图,其中 dtim_period 条目没有添加到它生成的命令中;我在命令缓冲区中的相关字节位置看到随机数据,这些数据是在使用调试器查看时创建的。
此致
马克
您是在 RTOS 还是 Linux 上使用 88W8801?
如果使用 RTOS,能否告诉我您的主机平台名称?是我们的 I.MX RT 系列吗?您的 SDK 版本和 IDE 版本是什么?
如果使用 Linux,能否告诉我您的主机平台名称?是我们的 I.MX 6、7、8、9 系列吗?你的 Linux 内核版本是什么?你的 Wi-Fi 驱动程序版本是什么?
您有相关日志吗? 或者您如何检测到这个问题?
请帮忙介绍一下这个问题的更多背景,然后我们可以进一步讨论。
谢谢!
Christine。
我们检查了最新的 MCUXpresso SDK(v2.16.0)代码,并将其与您报告的问题进行了对比。我们的分析确认了以下字段 dtim_period 和 cf_param_set 字段未被初始化。
作为可能的修复方法,我们已准备了一个补丁。能否就此向我们提供反馈意见?
该补丁解决了以下问题:
同时,我们将继续评估未来版本中是否可以提供更稳定、更永久的修复程序。
顺祝商祺!
Christine。
Hi Christine
我没有修改代码,只是在内存窗口中显示缓冲区,并手动设置其内容,这样我就能看到哪些内容被写入,哪些没有被写入。
如果您想通过修改代码来进行测试,可以按照您展示的方法进行。
此致
Mark
现在我需要你们在 Wi-Fi 端所做的修改,以确认所报告的问题。
请确认以下几点?
您是否在函数 wlan_cmd_802_11_associate () 中初始化了 passo 变量? 中初始化 passo 变量了吗?
memset(passo, 0x55, sizeof(HostCmd_DS_802_11_ASSOCIATE));
顺祝商祺!
Christine。
你好,Christine
事实上,在开始填充之前,我已经将"complete" cmd 缓冲区全部设置为零(这对所有可能的信息都有效)。这是一种很好的做法,因为它可以确保任何未设置的字段都有一个定义为 0 的值(甚至可以省去将其清零的代码,因为它知道它们已经是这样了)。
如果只将缓冲区的一部分设置为零,就只能处理一部分缓冲区,我不会这样做,因为这样并不能解决数据丢失的问题。
passo->dtim_period = pbss_desc->dtim_period ?pbss_desc->dtim_period : 0;
是正确的,但可以简化为(因为对 0 的检查是多余的)。
passo->dtim_period = pbss_desc->dtim_period;
pbss_desc->dtim_period 必须在每次使用前初始化为 0,因为它是由扫描结果选择性填写的 - 参见:
情况 DTIM_PARAM_SET:<----------------
pdtim_param_set = (IEEEtypes_DtimParamSet_t*)(void*)pcurrent_ptr;
pbss_entry->dtim_period= pdtim_param_set->dtim_period;<-------------
打破;
如果是 pss_tlv->cf_ibss.cf_param_set我认为不应该设置零,因为这是一个可以选择从接入点接收的字段 - 参见
情况 CF_PARAM_SET:<---------------------
pcf_param_set = (IEEEtypes_CfParamSet_t*)(void*)pcurrent_ptr;
(void)__memcpy(pmadapter、&pbss_entry->ss_param_set.cf_param_set, pcf_param_set,<-----------
MIN(total_ie_len、 sizeof(IEEEtypes_CfParamSet_t)));
pbss_entry->ss_param_set.cf_param_set.len=
MIN(element_len, (sizeof(IEEEtypes_CfParamSet_t) - sizeof(IEEEtypes_Header_t)));
打破;
按照这种写法,它不一定是一个有固定长度的字段。如果可以假定长度固定,则可以使用
memcpy(&pss_tlv->cf_ibss.cf_param_set、& pbss_entry-> ss_param_set. cf_param_set 、sizeof(pss_tlv->cf_ibss.cf_param_set));
否则,只需复制有效长度,TLV 的长度也需要修改。
不过,我认为解决方案取决于您的开发团队,因为他们才是专家。我只是想指出明显不正确的地方,以便专家们能正确修正。
此致
Mark
我们的内部团队仍在根据您的反馈意见对补丁进行审核,一旦得出结论,我们会及时更新。
顺祝商祺!
Christine。
嗨克里斯汀
,这很有道理。
谢谢
Mark
请参阅以下内部团队的反馈意见:
附上修改后的更新补丁。
根源分析
建议
根据问题分析和客户反馈:
DTIM 期间:
用于 CF 参数集:
影响
根据上述数据,根据从 AP 收到的数据,这两个值似乎都是强制性的,也可以是可选的,这就是未设置这两个参数的原因。
请注意,由于这两个参数是可选的,不会造成任何其他问题(在其他位置),因此其他芯片组和代码库不需要进行这些更改,您可能需要对其进行测试并将更改保留在您的端。
如果您对此案有任何其他关切,请告诉我。
如果没有其他问题,请将我的回答标记为解决方案,以便我们结案。
如果您在使用我们的产品过程中遇到任何其他问题,请随时向我们提交新的案例。
顺祝商祺!
Christine。