ti-15.4 config过程和dataCnfCB、dataIndCB函数的问题

在跟踪调试config过程有些不理解的地方,请教下面几个问题:

1.我在查看了generateConfigRequests();有如下部分,不是很明白其中的处理

/* Clear any timed out transactions */
for(x = 0; x < CONFIG_MAX_DEVICES; x++)
{
    if((Cllc_associatedDevList[x].shortAddr != CSF_INVALID_SHORT_ADDR)
    && (Cllc_associatedDevList[x].status & CLLC_ASSOC_STATUS_ALIVE))
    {
        if((Cllc_associatedDevList[x].status &
               (ASSOC_CONFIG_SENT | ASSOC_CONFIG_RSP))
                     == (ASSOC_CONFIG_SENT | ASSOC_CONFIG_RSP))
           {
                  Cllc_associatedDevList[x].status &= ~(ASSOC_CONFIG_SENT
                        | ASSOC_CONFIG_RSP);
               }
    }
}

不知道Cllc_associatedDevList[x].status什么时候被置为CLLC_ASSOC_STATUS_ALIVE,才使得进入上面的判断?

我向前查找,在入网过程assocIndCb()中找到与Cllc_associatedDevList相关的部分,"maintainAssocTable(&devInfo, &pData->capabilityInformation, 1, 0,(false));",但该函数是将status置0并不是CLLC_ASSOC_STATUS_ALIVE。

2.

通过wireshark抓包看到的数据包的交互过程,我的理解是config过程是collector应用层发送了一个包,sensor接收该包后进行处理后回复ConfigResponse包。

config包是上面部分的generateConfigRequests函数中发送,ConfigResponse包是在dataIndCB中将收到处理,如下:

static void dataIndCB(ApiMac_mcpsDataInd_t *pDataInd)
{
   if((pDataInd != NULL) && (pDataInd->msdu.p != NULL)
     && (pDataInd->msdu.len > 0))
      {
         Smsgs_cmdIds_t cmdId = (Smsgs_cmdIds_t)*(pDataInd->msdu.p);

.....

            switch(cmdId)
           {
                    case Smsgs_cmdIds_configRsp:
                    processConfigResponse(pDataInd);
                    break;

                    case Smsgs_cmdIds_trackingRsp:
                    processTrackingResponse(pDataInd);
                    break;

.....

}

但我看到collector.c文件中static void dataCnfCB(ApiMac_mcpsDataCnf_t *pDataCnf);函数有如下部分:

if(pDataCnf->msduHandle & APP_MARKER_MSDU_HANDLE)
{
         /* What message type was the original request? */
            if(pDataCnf->msduHandle & APP_CONFIG_MSDU_HANDLE)
            {
                 /* Config Request */
                 Cllc_associated_devices_t *pDev;
                 pDev = findDeviceStatusBit(ASSOC_CONFIG_MASK, ASSOC_CONFIG_SENT);
                 if(pDev != NULL)
                 {
                      if(pDataCnf->status != ApiMac_status_success)
                      {
                          /* Try to send again */
                          pDev->status &= ~ASSOC_CONFIG_SENT;
                          Csf_setConfigClock(CONFIG_DELAY);
                          }
                          else
                          {
                          pDev->status |= ASSOC_CONFIG_SENT;
                          pDev->status |= ASSOC_CONFIG_RSP;
                          pDev->status |= CLLC_ASSOC_STATUS_ALIVE;
                          Csf_setConfigClock(CONFIG_RESPONSE_DELAY);
                          }
           }

/* Update stats */
if(pDataCnf->status == ApiMac_status_success)
{
Collector_statistics.configReqRequestSent++;
}
}

....

}

猜测这部分应该与1.的问题相关,该函数dataCnfCB的作用是什么?什么情况下会回调到它?这个与dataIndCB的关系是什么,ConfigResponse在dataIndCB中处理了,这里处理config相关的代码又是在操作什么?

望不吝赐教,谢谢!

1 个回复

  • dataIndCB()是无线接收最终进到的Callback, if((pDataInd != NULL) && (pDataInd->msdu.p != NULL) 这个pDataInd就是你无线接收的数据,pDataInd->msdu.p就是具体的Payload。
    dataCnfCB()是无线发送最终进到的Callback,pDataCnf->status != ApiMac_status_success 这个status就是发送返回的状态,ApiMac_status_success,就是发送成功,你可以看下还有其他的很多状态Noack啊等等。
    如果有兴趣可以查下“网络原语”就是4个单词,—— request / indication / response / confirm TI的这套就是基于网络原语的。整个的TI15.4协议栈你会看到很多这4个单词相关的。 Ind就是 indication Cnf就是confirm

    Lucifer