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.

发现z-stack一个重大bug,有关InterPAN通信(stub_aps.c)和MAC_MCPS_DATA_CNF消息的处理方式不正确。

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有什么区别?

    一般用的是哪个,一直搞不懂