/*************************************************************************//** *****************************************************************************/ void nwkRouteDiscoveryRequest(NwkFrame_t *frame) { NwkFrameHeader_t *header = &frame->header; NwkRouteDiscoveryTableEntry_t *entry; entry = nwkRouteDiscoveryFindEntry(nwkIb.addr, header->nwkDstAddr, header->nwkFcf.multicast); if (entry) { frame->state = NWK_RD_STATE_WAIT_FOR_ROUTE; return; } entry = nwkRouteDiscoveryNewEntry(); if (entry) { entry->srcAddr = nwkIb.addr; entry->dstAddr = header->nwkDstAddr; entry->multicast = header->nwkFcf.multicast; entry->senderAddr = NWK_BROADCAST_ADDR; if (nwkRouteDiscoverySendRequest(entry, NWK_ROUTE_DISCOVERY_BEST_LINK_QUALITY)) { frame->state = NWK_RD_STATE_WAIT_FOR_ROUTE; return; } } nwkTxConfirm(frame, NWK_NO_ROUTE_STATUS); }
/*************************************************************************//** *****************************************************************************/ static void nwkTxAckWaitTimerHandler(SYS_Timer_t *timer) { NwkFrame_t *frame = NULL; bool restart = false; while (NULL != (frame = nwkFrameNext(frame))) { if (NWK_TX_STATE_WAIT_ACK == frame->state) { restart = true; if (0 == --frame->tx.timeout) { nwkTxConfirm(frame, NWK_NO_ACK_STATUS); } } } if (restart) { SYS_TimerStart(timer); } }
/*************************************************************************//** *****************************************************************************/ static void nwkRouteDiscoveryDone(NwkRouteDiscoveryTableEntry_t *entry, bool status) { NwkFrame_t *frame = NULL; while (NULL != (frame = nwkFrameNext(frame))) { if (NWK_RD_STATE_WAIT_FOR_ROUTE != frame->state) continue; if (entry->dstAddr != frame->header.nwkDstAddr || entry->multicast != frame->header.nwkFcf.multicast) continue; if (status) nwkTxFrame(frame); else nwkTxConfirm(frame, NWK_NO_ROUTE_STATUS); } }