void ftdf_process_purge_request(ftdf_purge_request_t *purge_request) { ftdf_handle_t msdu_handle = purge_request->msdu_handle; ftdf_status_t status = FTDF_INVALID_HANDLE; int n; for (n = 0; n < FTDF_NR_OF_REQ_BUFFERS; n++) { ftdf_msg_buffer_t *request = ftdf_dequeue_by_handle(msdu_handle, &ftdf_tx_pending_list[n].queue); if (request) { ftdf_data_request_t *data_request = (ftdf_data_request_t*) request; if (data_request->indirect_tx == FTDF_TRUE) { ftdf_remove_tx_pending_timer(request); #if FTDF_FP_BIT_MODE == FTDF_FP_BIT_MODE_AUTO if (ftdf_tx_pending_list[n].addr_mode == FTDF_SHORT_ADDRESS) { uint8_t entry, shortAddrIdx; ftdf_boolean_t found = ftdf_fppr_lookup_short_address( ftdf_tx_pending_list[n].addr.short_address, &entry, &shortAddrIdx); ASSERT_WARNING(found); ftdf_fppr_set_short_address_valid(entry, shortAddrIdx, FTDF_FALSE); } else if (ftdf_tx_pending_list[n].addr_mode == FTDF_EXTENDED_ADDRESS) { uint8_t entry; ftdf_boolean_t found = ftdf_fppr_lookup_ext_address( ftdf_tx_pending_list[n].addr.ext_address, &entry); ASSERT_WARNING(found); ftdf_fppr_set_ext_address_valid(entry, FTDF_FALSE); } else { ASSERT_WARNING(0); } #endif /* FTDF_FP_BIT_MODE == FTDF_FP_BIT_MODE_AUTO */ if (ftdf_is_queue_empty(&ftdf_tx_pending_list[n].queue)) { ftdf_tx_pending_list[n].addr_mode = FTDF_NO_ADDRESS; } } FTDF_REL_DATA_BUFFER(data_request->msdu); FTDF_REL_MSG_BUFFER((ftdf_msg_buffer_t*) data_request); status = FTDF_SUCCESS; break; } } ftdf_purge_confirm_t *purge_confirm = (ftdf_purge_confirm_t*) FTDF_GET_MSG_BUFFER(sizeof(ftdf_purge_confirm_t)); purge_confirm->msg_id = FTDF_PURGE_CONFIRM; purge_confirm->msdu_handle = msdu_handle; purge_confirm->status = status; FTDF_REL_MSG_BUFFER((ftdf_msg_buffer_t*) purge_request); FTDF_RCV_MSG((ftdf_msg_buffer_t*) purge_confirm); }
/* This data copy could/should be optimized using DMA */ *tx_ptr++ = frame_length; int n; for (n = 0; n < frame_length; n++) { *tx_ptr++ = *fp++; } ftdf_critical_var(); ftdf_enter_critical(); ftdf_nr_of_retries = 0; ftdf_exit_critical(); ftdf_send_transparent_frame(frame_length, frame, channel, pti, csma_suppress); return FTDF_SUCCESS; } #else /* !FTDF_PHY_API */ void ftdf_process_transparent_request(ftdf_transparent_request_t *transparent_request) { ftdf_data_length_t frame_length = transparent_request->frame_length; if ((frame_length > 127) || (ftdf_transparent_mode != FTDF_TRUE)) { FTDF_SEND_FRAME_TRANSPARENT_CONFIRM(transparent_request->handle, FTDF_INVALID_PARAMETER); FTDF_REL_MSG_BUFFER((ftdf_msg_buffer_t*) transparent_request); return; } if (ftdf_req_current == NULL) { ftdf_req_current = (ftdf_msg_buffer_t*) transparent_request; } else { #ifndef FTDF_LITE if (ftdf_queue_req_head((ftdf_msg_buffer_t*) transparent_request, &ftdf_req_queue) == FTDF_TRANSACTION_OVERFLOW) { #endif /* !FTDF_LITE */ FTDF_SEND_FRAME_TRANSPARENT_CONFIRM(transparent_request->handle, FTDF_TRANSPARENT_OVERFLOW); FTDF_REL_MSG_BUFFER((ftdf_msg_buffer_t*) transparent_request); #ifndef FTDF_LITE } #endif /* !FTDF_LITE */ return; } ftdf_octet_t *tx_ptr = (ftdf_octet_t*) &FTDF->FTDF_TX_FIFO_0_0_REG + (FTDF_BUFFER_LENGTH * FTDF_TX_DATA_BUFFER); *tx_ptr++ = frame_length; ftdf_octet_t *frame = transparent_request->frame; int n; for (n = 0; n < frame_length; n++) { *tx_ptr++ = *frame++; } ftdf_send_transparent_frame(frame_length, transparent_request->frame, transparent_request->channel, transparent_request->pti, transparent_request->cmsa_suppress); ftdf_nr_of_retries = 0; }
void ftdf_send_data_confirm(ftdf_data_request_t *data_request, ftdf_status_t status, ftdf_time_t timestamp, ftdf_sn_t dsn, ftdf_num_of_backoffs_t num_of_backoffs, ftdf_ie_list_t *ack_payload) { FTDF_REL_DATA_BUFFER(data_request->msdu); ftdf_data_confirm_t *data_confirm = (ftdf_data_confirm_t*) FTDF_GET_MSG_BUFFER(sizeof(ftdf_data_confirm_t)); data_confirm->msg_id = FTDF_DATA_CONFIRM; data_confirm->msdu_handle = data_request->msdu_handle; data_confirm->status = status; data_confirm->timestamp = timestamp; data_confirm->num_of_backoffs = num_of_backoffs; data_confirm->dsn = dsn; data_confirm->ack_payload = ack_payload; if (ftdf_req_current == (ftdf_msg_buffer_t*)data_request) { ftdf_req_current = NULL; } FTDF_REL_MSG_BUFFER((ftdf_msg_buffer_t*) data_request); FTDF_RCV_MSG((ftdf_msg_buffer_t*) data_confirm); #if FTDF_FP_BIT_MODE == FTDF_FP_BIT_MODE_AUTO ftdf_fp_fsm_clear_pending(); #endif /* FTDF_FP_BIT_MODE == FTDF_FP_BIT_MODE_AUTO */ ftdf_process_next_request(); }
void ftdf_send_poll_confirm(ftdf_poll_request_t *poll_request, ftdf_status_t status) { ftdf_poll_confirm_t *poll_confirm = (ftdf_poll_confirm_t*) FTDF_GET_MSG_BUFFER(sizeof(ftdf_poll_confirm_t)); poll_confirm->msg_id = FTDF_POLL_CONFIRM; poll_confirm->status = status; if (ftdf_req_current == (ftdf_msg_buffer_t*)poll_request) { ftdf_req_current = NULL; } FTDF_REL_MSG_BUFFER((ftdf_msg_buffer_t*) poll_request); FTDF_RCV_MSG((ftdf_msg_buffer_t*) poll_confirm); ftdf_process_next_request(); }
void FTDF_sndMsg(FTDF_MsgBuffer *msgBuf) { switch (msgBuf->msgId) { #ifndef FTDF_LITE case FTDF_DATA_REQUEST: FTDF_processDataRequest((FTDF_DataRequest *) msgBuf); break; case FTDF_PURGE_REQUEST: FTDF_processPurgeRequest((FTDF_PurgeRequest *) msgBuf); break; case FTDF_ASSOCIATE_REQUEST: FTDF_processAssociateRequest((FTDF_AssociateRequest *) msgBuf); break; case FTDF_ASSOCIATE_RESPONSE: FTDF_processAssociateResponse((FTDF_AssociateResponse *) msgBuf); break; case FTDF_DISASSOCIATE_REQUEST: FTDF_processDisassociateRequest((FTDF_DisassociateRequest *) msgBuf); break; #endif /* !FTDF_LITE */ case FTDF_GET_REQUEST: FTDF_processGetRequest((FTDF_GetRequest *) msgBuf); break; case FTDF_SET_REQUEST: FTDF_processSetRequest((FTDF_SetRequest *) msgBuf); break; #ifndef FTDF_LITE case FTDF_ORPHAN_RESPONSE: FTDF_processOrphanResponse((FTDF_OrphanResponse *) msgBuf); break; #endif /* !FTDF_LITE */ case FTDF_RESET_REQUEST: FTDF_processResetRequest((FTDF_ResetRequest *) msgBuf); break; case FTDF_RX_ENABLE_REQUEST: FTDF_processRxEnableRequest((FTDF_RxEnableRequest *) msgBuf); break; #ifndef FTDF_LITE case FTDF_SCAN_REQUEST: FTDF_processScanRequest((FTDF_ScanRequest *) msgBuf); break; case FTDF_START_REQUEST: FTDF_processStartRequest((FTDF_StartRequest *) msgBuf); break; case FTDF_POLL_REQUEST: FTDF_processPollRequest((FTDF_PollRequest *) msgBuf); break; #ifndef FTDF_NO_TSCH case FTDF_SET_SLOTFRAME_REQUEST: FTDF_processSetSlotframeRequest((FTDF_SetSlotframeRequest *) msgBuf); break; case FTDF_SET_LINK_REQUEST: FTDF_processSetLinkRequest((FTDF_SetLinkRequest *) msgBuf); break; case FTDF_TSCH_MODE_REQUEST: FTDF_processTschModeRequest((FTDF_TschModeRequest *) msgBuf); break; case FTDF_KEEP_ALIVE_REQUEST: FTDF_processKeepAliveRequest((FTDF_KeepAliveRequest *) msgBuf); break; #endif /* FTDF_NO_TSCH */ case FTDF_BEACON_REQUEST: FTDF_processBeaconRequest((FTDF_BeaconRequest *) msgBuf); break; #endif /* !FTDF_LITE */ case FTDF_TRANSPARENT_ENABLE_REQUEST: FTDF_enableTransparentMode(((FTDF_TransparentEnableRequest *) msgBuf)->enable, ((FTDF_TransparentEnableRequest *) msgBuf)->options); FTDF_REL_MSG_BUFFER(msgBuf); break; case FTDF_TRANSPARENT_REQUEST: FTDF_processTransparentRequest((FTDF_TransparentRequest *) msgBuf); break; case FTDF_SLEEP_REQUEST: FTDF_SLEEP_CALLBACK(((FTDF_SleepRequest *)msgBuf)->sleepTime); FTDF_REL_MSG_BUFFER(msgBuf); break; #ifndef FTDF_LITE case FTDF_REMOTE_REQUEST: FTDF_processRemoteRequest((FTDF_RemoteRequest *)msgBuf); break; #endif /* !FTDF_LITE */ #if FTDF_DBG_BUS_ENABLE case FTDF_DBG_MODE_SET_REQUEST: FTDF_setDbgMode(((FTDF_DbgModeSetRequest *) msgBuf)->dbgMode); FTDF_REL_MSG_BUFFER(msgBuf); break; #endif /* FTDF_DBG_BUS_ENABLE */ #if dg_configBLACK_ORCA_IC_REV != BLACK_ORCA_IC_REV_A case FTDF_FPPR_MODE_SET_REQUEST: FTDF_fpprSetMode(((FTDF_FpprModeSetRequest *) msgBuf)->matchFp, ((FTDF_FpprModeSetRequest *) msgBuf)->fpOverride, ((FTDF_FpprModeSetRequest *) msgBuf)->fpForce); FTDF_REL_MSG_BUFFER(msgBuf); break; #endif /* dg_configBLACK_ORCA_IC_REV != BLACK_ORCA_IC_REV_A */ default: // Silenty release the message buffer FTDF_REL_MSG_BUFFER(msgBuf); break; } }