/*************************************************************************//** *****************************************************************************/ 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; }
/*************************************************************************//** *****************************************************************************/ 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; }