/** * @brief Builds the data frame for transmission * * This function builds the data frame for transmission. * The NWK layer has supplied the parameters. * The frame_info_t data type is constructed and filled in. * Also the FCF is constructed based on the parameters passed. * * @param msg Pointer to the MCPS-DATA.request parameter */ void mcps_data_request(uint8_t *msg) { retval_t status = FAILURE; mcps_data_req_t mdr; memcpy(&mdr, BMM_BUFFER_POINTER((buffer_t *)msg), sizeof(mcps_data_req_t)); if ((mdr.TxOptions & WPAN_TXOPT_INDIRECT) == 0) { /* * Data Requests for a coordinator using direct transmission are * accepted in all non-transient states (no polling and no scanning * is ongoing). */ if ((MAC_POLL_IDLE != mac_poll_state) || (MAC_SCAN_IDLE != mac_scan_state) ) { mac_gen_mcps_data_conf((buffer_t *)msg, (uint8_t)MAC_CHANNEL_ACCESS_FAILURE, #ifdef ENABLE_TSTAMP mdr.msduHandle, 0); #else mdr.msduHandle); #endif /* ENABLE_TSTAMP */ return; } }
/* * @brief Process tal_tx_frame_done_cb status * * This function is called, if an ACK is requested in the last transmitted frame. * According to the frame type that has previously been sent, the * corresponding actions are taken and the MAC returns to its standard state. * * @param tx_status Status of transmission * @param frame Pointer to the transmitted frame */ static void mac_process_tal_tx_status(retval_t tx_status, frame_info_t *frame) { switch (frame->msg_type) { case MCPS_MESSAGE: #if (MAC_INDIRECT_DATA_FFD == 1) if (frame->indirect_in_transit) { // Clear indirect in transmit flag frame->indirect_in_transit = false; if ((tx_status == MAC_SUCCESS) || (tx_status == TAL_FRAME_PENDING)) { remove_frame_from_indirect_q(frame); buffer_t *mcps_buf = frame->buffer_header; /* Create the MCPS DATA confirmation message */ mac_gen_mcps_data_conf((buffer_t *)mcps_buf, (uint8_t)tx_status, #ifdef ENABLE_TSTAMP frame->msduHandle, frame->time_stamp); #else frame->msduHandle); #endif /* ENABLE_TSTAMP */ } }