发现z-stack一个重大bug,有关InterPAN通信(stub_aps.c)和MAC_MCPS_DATA_CNF消息的处理方式不正确。
时间:10-02
整理:3721RD
点击:
bug描述:
MAC_CbackEvent中,消息MAC_MCPS_DATA_CNF返回的内容中,pData->dataCnf.pDataReq中的msdu,其实不是msdu,而是包含了mac header部分。msdu.len的长度是整个MAC包减去CRC的长度,msdu.p[0]和msdu[1]为MAC Frame Control域而非NWK Frame Control域。但是在StubAPS_ZMacCallback的处理中,直接把msdu.p当做网络层的域来处理,这是不对的。
uint8 StubAPS_ZMacCallback( uint8 *msgPtr )
{
uint16 nwk_fc;
uint8 aps_fc;
uint8 frameType;
uint8 *buf = NULL;
uint8 event = ((osal_event_hdr_t *)msgPtr)->event;
if ( event == MAC_MCPS_DATA_IND )
{
buf = ((macMcpsDataInd_t *)msgPtr)->msdu.p;
}
else if ( event == MAC_MCPS_DATA_CNF )
{
buf = ((macMcpsDataCnf_t *)msgPtr)->pDataReq->msdu.p;//这个是不正确的
}
测试了Home 1.2.2a和Mesh 1.0.0,都有这个现象。
影响结果:ZLL协议栈影响严重,ZLL采用跨PANID通信,confirm消息会失效。
解决方案,在函数ZMacCbackEventHdlr中加入以下代码
//fix the bug of msdu index erro when MAC_MCPS_DATA_CNF
if ( event == MAC_MCPS_DATA_CNF )
{
uint8 *originalMsdup = (uint8 *)pData->dataCnf.pDataReq + sizeof(macMcpsDataReq_t) + MAC_DATA_OFFSET;
pData->dataCnf.pDataReq->msdu.len -= (uint8)(originalMsdup - pData->dataCnf.pDataReq->msdu.p);
pData->dataCnf.pDataReq->msdu.p = originalMsdup;
}
多谢分享
多谢分享Aries Lord
解决方案,在函数ZMacCbackEventHdlr中加入以下代码
//fix the bug of msdu index erro when MAC_MCPS_DATA_CNF if ( event == MAC_MCPS_DATA_CNF ) { uint8 *originalMsdup = (uint8 *)pData->dataCnf.pDataReq + sizeof(macMcpsDataReq_t) + MAC_DATA_OFFSET; pData->dataCnf.pDataReq->msdu.len -= (uint8)(originalMsdup - pData->dataCnf.pDataReq->msdu.p); pData->dataCnf.pDataReq->msdu.p = originalMsdup; }
interPAN和extenedPAN有什么区别,能解释一下吗?
一般用的是哪个
vv大神你帮我解答一下 interPAN和extenedPAN有什么区别?
一般用的是哪个,一直搞不懂
