Exemple #1
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);
}
Exemple #2
0
        /* 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;
}
Exemple #3
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();
}
Exemple #4
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();
}
Exemple #5
0
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;
    }
}