コード例 #1
0
/*************************************************************************//**
*****************************************************************************/
static bool nwkRxRejectDuplicate(NwkFrameHeader_t *header)
{
  NwkDuplicateRejectionEntry_t *entry;
  NwkDuplicateRejectionEntry_t *freeEntry = NULL;

  for (uint8_t i = 0; i < NWK_DUPLICATE_REJECTION_TABLE_SIZE; i++)
  {
    entry = &nwkRxDuplicateRejectionTable[i];

    if (entry->ttl && header->nwkSrcAddr == entry->src)
    {
      uint8_t diff = (int8_t)entry->seq - header->nwkSeq;

      if (diff < 8)
      {
        if (entry->mask & (1 << diff))
        {
        #ifdef NWK_ENABLE_ROUTING
          if (nwkIb.addr == header->macDstAddr)
            nwkRouteRemove(header->nwkDstAddr, header->nwkFcf.multicast);
        #endif
          return true;
        }

        entry->mask |= (1 << diff);
        return false;
      }
      else
      {
        uint8_t shift = -(int8_t)diff;

        entry->seq = header->nwkSeq;
        entry->mask = (entry->mask << shift) | 1;
        entry->ttl = DUPLICATE_REJECTION_TTL;
        return false;
      }
    }

    if (0 == entry->ttl)
      freeEntry = entry;
  }

  if (NULL == freeEntry)
    return true;

  freeEntry->src = header->nwkSrcAddr;
  freeEntry->seq = header->nwkSeq;
  freeEntry->mask = 1;
  freeEntry->ttl = DUPLICATE_REJECTION_TTL;

  SYS_TimerStart(&nwkRxDuplicateRejectionTimer);

  return false;
}
コード例 #2
0
ファイル: nwkRoute.c プロジェクト: keeepcool/Backup
/*************************************************************************//**
*****************************************************************************/
bool nwkRouteErrorReceived(NWK_DataInd_t *ind)
{
	NwkCommandRouteError_t *command = (NwkCommandRouteError_t *)ind->data;

	if (sizeof(NwkCommandRouteError_t) != ind->size) {
		return false;
	}

	nwkRouteRemove(command->dstAddr, command->multicast);

	return true;
}