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_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); }
void FTDF_sendFrameTransparentConfirm(void *handle, FTDF_Bitmap32 status) { FTDF_TransparentConfirm *confirm = (FTDF_TransparentConfirm *) FTDF_GET_MSG_BUFFER(sizeof(FTDF_TransparentConfirm)); confirm->msgId = FTDF_TRANSPARENT_CONFIRM; confirm->handle = handle; confirm->status = status; FTDF_RCV_MSG((FTDF_MsgBuffer *) confirm); }
void ftdf_send_data_indication(ftdf_frame_header_t *frame_header, ftdf_security_header *security_header, ftdf_ie_list_t *payload_ie_list, ftdf_data_length_t msdu_length, ftdf_octet_t *msdu, ftdf_link_quality_t mpdu_link_quality, ftdf_time_t timestamp) { ftdf_data_indication_t *data_indication = (ftdf_data_indication_t*) FTDF_GET_MSG_BUFFER(sizeof(ftdf_data_indication_t)); ftdf_octet_t *msdu_buf = FTDF_GET_DATA_BUFFER(msdu_length); ftdf_octet_t *buf_ptr = msdu_buf; int n; for (n = 0; n < msdu_length; n++) { *msdu_buf++ = *msdu++; } data_indication->msg_id = FTDF_DATA_INDICATION; data_indication->src_addr_mode = frame_header->src_addr_mode; data_indication->src_pan_id = frame_header->src_pan_id; data_indication->src_addr = frame_header->src_addr; data_indication->dst_addr_mode = frame_header->dst_addr_mode; data_indication->dst_pan_id = frame_header->dst_pan_id; data_indication->dst_addr = frame_header->dst_addr; data_indication->msdu_length = msdu_length; data_indication->msdu = buf_ptr; data_indication->mpdu_link_quality = mpdu_link_quality; data_indication->dsn = frame_header->sn; data_indication->timestamp = timestamp; data_indication->security_level = security_header->security_level; data_indication->key_id_mode = security_header->key_id_mode; data_indication->key_index = security_header->key_index; data_indication->payload_ie_list = payload_ie_list; if (data_indication->key_id_mode == 0x2) { for (n = 0; n < 4; n++) { data_indication->key_source[n] = security_header->key_source[n]; } } else if (data_indication->key_id_mode == 0x3) { for (n = 0; n < 8; n++) { data_indication->key_source[n] = security_header->key_source[n]; } } FTDF_RCV_MSG((ftdf_msg_buffer_t*) data_indication); }
void FTDF_rcvFrameTransparent(FTDF_DataLength frameLength, FTDF_Octet *frame, FTDF_Bitmap32 status) { FTDF_TransparentIndication *indication = (FTDF_TransparentIndication *) FTDF_GET_MSG_BUFFER(sizeof(FTDF_TransparentIndication)); indication->msgId = FTDF_TRANSPARENT_INDICATION; indication->frameLength = frameLength; indication->status = status; indication->frame = FTDF_GET_DATA_BUFFER(frameLength); memcpy(indication->frame, frame, frameLength); FTDF_RCV_MSG((FTDF_MsgBuffer *) indication); }
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(); }