This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CC2530:bugfix:NWK 帧计数器在复位时不会递增

Guru**** 2587365 points
Other Parts Discussed in Thread: SIMPLELINK-CC13X2-26X2-SDK, Z-STACK

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/zigbee-thread-group/zigbee-and-thread/f/zigbee-thread-forum/956096/cc2530-bugfix-the-nwk-frame-counter-not-incremented-on-reset

器件型号:CC2530
主题中讨论的其他器件:SIMPLELINK-CC13X2-26X2-SDKZ-STACK

您好!

ZStack 版本3.0.2

问题:在每个重置 协调器上,网络帧计数器将设置为1250,  

路由器将停止响应来自协调器的数据包、帧计数  器的值低于最后处理的消息。

   根据 Toby Pan 在本帖子中的建议、我尝试调试并在以下函数中发现一个错误:

void ZDUP_RestoreNwkSecMaterial (void)
{
uint8 found = false;
uint8 i;
nwkSecMaterialDesc_t nwkSecMaterialDesc;
uint8 UpdateFrameCounter = false;

//搜索此网络是否有安全材料
(i = 0;i < GMAX_NwSEC_entries;{_SEC_itue_entions_table+)

OSAL_NV_READ (ZCD_NV_NWK_SEC_material_table_start + I、0、sizeof (nwkSecMaterialDesc_t)、_nwkSecMaterialDesc_t);
{
if (osal_memcmp (_nib.extendedPANID、nwkSecMaterialDesc.extendedPanID、Z_EXTADDR_LEN))
{
UpdateFrameCounter = true;
找到= true;
中断;
}
}

//检查我们是否在通用
if (!found)
{中存储了帧计数器
//读取的最后一个条目包含通用项,因此不需要再次读取它
if (nwkSecMaterialDesc.FrameCounter)
{
UpdateFrameCounter = true;
}
}

if (UpdateFrameCounter &&(!FrameCounterUpdated)
){
FrameCounterUpdated = true;

//递增存储在 nv 中的帧计数器
nwkSecMaterialDesc.FrameCounter +=(MAX_NWK_FRAMECOUNTER_Changes +
NWK_FRAMECOUNTER_Changes_restore_Delta);

nwkFrameCounter = nwkSecMaterialDesc.FrameCounter;

OSAL_NV_WRITE (ZCD_NV_NWK_SEC_material_table_start + I、0、sizeof (nwkSecMaterialDesc_t)、_nwkSecMaterialDescs);// <<<< ----

nwkFrameCounterChanges = 0;
}
return;
} 

在 for 循环中、此函数中的"i"递增至"GMAX_NWK_SEC_materie_table_entries "   

因此、osal_nv_write (第41行)会对未初始化的 nV ID 执行、但会失败、并且每次复位时帧计数器都保持不变

错误修复:

非易失性写入应针对包含通用安全材料的表的最后一个元素完成、即"ZCD_NV_NWK_SEC_materie_table_start + i - 1"

如下所示

OSAL_NV_WRITE (ZCD_NV_NWK_SEC_material_table_start + i - 1、0、sizeof (nwkMaterialDesc_t)、_nwkSecMaterialDesc_t); 

它对我很有用。

是否正确、或者我在这里遗漏了什么?

谢谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、AViral、

    很好的结果、这已经在 SIMPLELINK-CC13X2-26X2-SDK Z-Stack 解决方案中得到解决、但未传播到 Z-Stack 3.0.2、您的解决方案是合适的、但建议的修复方法如下:

    //检查我们是否在通用
    if (!found)
    {中存储了帧计数器
    //如果我们没有在 nv 中找到当前网络,请覆盖通用条目,
    //这是表中的最后一个条目。
    if (nwkSecMaterialDesc.FrameCounter)
    {
    UpdateFrameCounter = true;
    I =(GMAX_NWK_SEC_materie_table_entries - 1);//添加此行
    }
    } 

    我已更新 Z-Stack 3.0.2 已知问题并修复了 E2E 帖子 、以包含此信息。

    此致、
    Ryan