/*************************************************************************//** * @brief Frame transmission confirmation handler * @param[in] frame Pointer to the sent frame *****************************************************************************/ static void nwkDataReqTxConf(NwkFrame_t *frame) { for (NWK_DataReq_t *req = nwkDataReqQueue; req; req = req->next) { if (req->frame == frame) { req->status = frame->tx.status; req->control = frame->tx.control; req->state = NWK_DATA_REQ_STATE_CONFIRM; break; } } nwkFrameFree(frame); }
/*************************************************************************//** *****************************************************************************/ void nwkRouteFrame(NwkFrame_t *frame) { NwkFrameHeader_t *header = &frame->header; if (NWK_ROUTE_UNKNOWN != NWK_RouteNextHop(header->nwkDstAddr, header->nwkFcf.multicast)) { frame->tx.confirm = NULL; frame->tx.control = NWK_TX_CONTROL_ROUTING; nwkTxFrame(frame); } else { nwkRouteSendRouteError(header->nwkSrcAddr, header->nwkDstAddr, header->nwkFcf.multicast); nwkFrameFree(frame); } }
/*************************************************************************//** @brief Rx Module task handler *****************************************************************************/ void nwkRxTaskHandler(void) { NwkFrame_t *frame = NULL; while (NULL != (frame = nwkFrameNext(frame))) { switch (frame->state) { case NWK_RX_STATE_RECEIVED: { nwkRxHandleReceivedFrame(frame); } break; #ifdef NWK_ENABLE_SECURITY case NWK_RX_STATE_DECRYPT: { nwkSecurityProcess(frame, false); } break; #endif case NWK_RX_STATE_INDICATE: { nwkRxHandleIndication(frame); } break; #ifdef NWK_ENABLE_ROUTING case NWK_RX_STATE_ROUTE: { nwkRouteFrame(frame); } break; #endif case NWK_RX_STATE_FINISH: { nwkFrameFree(frame); } break; } } }
/*************************************************************************//** * @brief Tx Module task handler *****************************************************************************/ void nwkTxTaskHandler(void) { NwkFrame_t *frame = NULL; while (NULL != (frame = nwkFrameNext(frame))) { switch (frame->state) { #ifdef NWK_ENABLE_SECURITY case NWK_TX_STATE_ENCRYPT: { nwkSecurityProcess(frame, true); } break; #endif case NWK_TX_STATE_DELAY: { if (frame->tx.timeout > 0) { frame->state = NWK_TX_STATE_WAIT_DELAY; SYS_TimerStart(&nwkTxDelayTimer); } else { frame->state = NWK_TX_STATE_SEND; } } break; case NWK_TX_STATE_SEND: { if (NULL == nwkTxPhyActiveFrame) { nwkTxPhyActiveFrame = frame; frame->state = NWK_TX_STATE_WAIT_CONF; PHY_DataReq(&(frame->size)); nwkIb.lock++; } } break; case NWK_TX_STATE_WAIT_CONF: break; case NWK_TX_STATE_SENT: { if (NWK_SUCCESS_STATUS == frame->tx.status) { if (frame->header.nwkSrcAddr == nwkIb.addr && frame->header.nwkFcf. ackRequest) { frame->state = NWK_TX_STATE_WAIT_ACK; frame->tx.timeout = NWK_ACK_WAIT_TIME / NWK_TX_ACK_WAIT_TIMER_INTERVAL + 1; SYS_TimerStart(&nwkTxAckWaitTimer); } else { frame->state = NWK_TX_STATE_CONFIRM; } } else { frame->state = NWK_TX_STATE_CONFIRM; } } break; case NWK_TX_STATE_WAIT_ACK: break; case NWK_TX_STATE_CONFIRM: { #ifdef NWK_ENABLE_ROUTING nwkRouteFrameSent(frame); #endif if (NULL == frame->tx.confirm) { nwkFrameFree(frame); } else { frame->tx.confirm(frame); } } break; default: break; } } }
static void nwkTxBroadcastConf(NwkFrame_t *frame) { nwkFrameFree(frame); }