Example #1
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();
}
Example #2
0
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);
}
Example #3
0
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);
}
Example #4
0
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);
}
Example #5
0
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);
}
Example #6
0
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();
}