OpenCores
URL https://opencores.org/ocsvn/funbase_ip_library/funbase_ip_library/trunk

Subversion Repositories funbase_ip_library

[/] [funbase_ip_library/] [trunk/] [TUT/] [ip.swp.api/] [openmcapi/] [1.0/] [test/] [func/] [backend.c] - Rev 145

Compare with Previous | Blame | View Log

/*
 * Copyright (c) 2011, Mentor Graphics Corporation
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * 1. Redistributions of source code must retain the above copyright notice,
 *    this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright notice,
 *    this list of conditions and the following disclaimer in the documentation
 *    and/or other materials provided with the distribution.
 * 3. Neither the name of the <ORGANIZATION> nor the names of its contributors
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */
 
#include <stdio.h>
#include <mcapi.h>
#include "fts_defs.h"
#include "support_suite/mcapid_support.h"
#include "mcapid.h"
 
MCAPID_STRUCT   MCAPID_Reg_Struct, MCAPID_Mgmt_Struct, MCAPID_Echo_Struct[4];
 
unsigned        MCAPID_Failures = 0;
 
/************************************************************************
*
*   FUNCTION
*
*       MCAPI_FTS_Msg_Server
*
*   DESCRIPTION
*
*       Listen on an endpoint for incoming messages, and echo back the
*       data.
*
*************************************************************************/
MCAPI_THREAD_ENTRY(MCAPI_FTS_Msg_Echo_Server)
{
    MCAPID_STRUCT       *mcapi_struct = (MCAPID_STRUCT*)argv;
    char                buffer[MCAPID_MSG_LEN];
    size_t              rx_len;
    mcapi_status_t      status;
 
    for (;;)
    {
        /* Wait for a message. */
        mcapi_msg_recv(mcapi_struct->local_endp, buffer, MCAPID_MSG_LEN, &rx_len,
                       &status);
 
        if (status == MCAPI_SUCCESS)
        {
            /* Echo the message. */
            mcapi_msg_send(mcapi_struct->local_endp,
                           mcapi_get32((unsigned char*)buffer, MCAPID_MGMT_LOCAL_ENDP_OFFSET),
                           buffer, MCAPID_MSG_LEN,
                           MCAPI_DEFAULT_PRIO, &status);
        }
    }
 
} /* MCAPI_FTS_Msg_Echo_Server */
 
/************************************************************************
*
*   FUNCTION
*
*       MCAPI_FTS_Pkt_Server
*
*   DESCRIPTION
*
*       Open the receive side of a connection, wait for a connection,
*       listen on an endpoint for incoming messages.
*
*************************************************************************/
MCAPI_THREAD_ENTRY(MCAPI_FTS_Pkt_Server)
{
    MCAPID_STRUCT               *mcapi_struct = (MCAPID_STRUCT*)argv;
    char                        *buffer;
    size_t                      rx_len;
 
    for (;;)
    {
        /* Wait for a connection to be established. */
        mcapi_wait(&mcapi_struct->request, &rx_len, &mcapi_struct->status,
                   MCAPI_TIMEOUT_INFINITE);
 
        for (;;)
        {
            /* Wait for an incoming message. */
            mcapi_pktchan_recv(mcapi_struct->pkt_rx_handle, (void**)&buffer,
                               &rx_len, &mcapi_struct->status);
 
            /* If data was received. */
            if (mcapi_struct->status == MCAPI_SUCCESS)
            {
                /* Free the buffer. */
                mcapi_pktchan_free(buffer, &mcapi_struct->status);
            }
 
            /* If the connection has been closed. */
            else
            {
                /* Close the receive side. */
                mcapi_packetchan_recv_close_i(mcapi_struct->pkt_rx_handle,
                                              &mcapi_struct->request,
                                              &mcapi_struct->status);
 
                break;
            }
        }
 
        /* Open the local endpoint back up as the receiver. */
        mcapi_open_pktchan_recv_i(&mcapi_struct->pkt_rx_handle,
                                  mcapi_struct->local_endp,
                                  &mcapi_struct->request, &mcapi_struct->status);
    }
 
} /* MCAPI_FTS_Pkt_Server */
 
/************************************************************************
*
*   FUNCTION
*
*       MCAPI_FTS_Scl_Server
*
*   DESCRIPTION
*
*       Open the receive side of a connection, wait for a connection,
*       listen on an endpoint for incoming messages.
*
*************************************************************************/
MCAPI_THREAD_ENTRY(MCAPI_FTS_Scl_Server)
{
    MCAPID_STRUCT   *mcapi_struct = (MCAPID_STRUCT*)argv;
    size_t          rx_len;
    char            buffer[MCAPID_MGMT_PKT_LEN];
    mcapi_uint32_t  type;
    mcapi_uint64_t  recv_64;
    mcapi_uint32_t  recv_32;
    mcapi_uint16_t  recv_16;
    mcapi_uint8_t   recv_8;
    mcapi_status_t  status;
 
    for (;;)
    {
        /* Wait for a message indicating the type of receive to perform. */
        mcapi_msg_recv(mcapi_struct->local_endp, buffer, MCAPID_MGMT_PKT_LEN,
                       &rx_len, &mcapi_struct->status);
 
        if (mcapi_struct->status == MCAPI_SUCCESS)
        {
            type = mcapi_get32((unsigned char*)buffer, MCAPID_MGMT_TYPE_OFFSET);
 
            /* Check the receive type to ensure it is valid. */
            if ( (type == MCAPID_RX_64_BIT_SCL) ||
                 (type == MCAPID_RX_32_BIT_SCL) ||
                 (type == MCAPID_RX_16_BIT_SCL) ||
                 (type == MCAPID_RX_8_BIT_SCL) )
            {
                /* Send a successful status. */
                status = MCAPI_SUCCESS;
            }
 
            else
            {
                /* Send an error, but continue with opening the receive
                 * side and closing in case the other side wants to send
                 * data over a closed connection.
                 */
                status = -1;
            }
 
            /* Put the status in the packet. */
            mcapi_put32((unsigned char*)buffer, MCAPID_MGMT_STATUS_OFFSET, status);
 
            /* Send the response. */
            mcapi_msg_send(mcapi_struct->local_endp,
                           mcapi_get32((unsigned char*)buffer, MCAPID_MGMT_LOCAL_ENDP_OFFSET),
                           buffer, rx_len, MCAPI_DEFAULT_PRIO,
                           &mcapi_struct->status);
 
            /* Open the local endpoint up as the receiver. */
            mcapi_open_sclchan_recv_i(&mcapi_struct->scl_rx_handle,
                                      mcapi_struct->local_endp,
                                      &mcapi_struct->request,
                                      &mcapi_struct->status);
 
            /* Wait for a connection to be established. */
            mcapi_wait(&mcapi_struct->request, &rx_len, &mcapi_struct->status,
                       MCAPI_TIMEOUT_INFINITE);
 
            if (mcapi_struct->status == MCAPI_SUCCESS)
            {
                switch (type)
                {
                    case MCAPID_RX_64_BIT_SCL:
 
                        /* Wait for an incoming message. */
                        recv_64 = mcapi_sclchan_recv_uint64(mcapi_struct->scl_rx_handle,
                                                            &mcapi_struct->status);
 
                        if ( (mcapi_struct->status == MCAPI_SUCCESS) &&
                             (recv_64 != MCAPI_FTS_64BIT_SCALAR) )
                        {
                            MCAPID_Failures ++;
                        }
 
                        /* Close the receive side. */
                        mcapi_sclchan_recv_close_i(mcapi_struct->scl_rx_handle,
                                                   &mcapi_struct->request,
                                                   &mcapi_struct->status);
 
                        break;
 
                    case MCAPID_RX_32_BIT_SCL:
 
                        /* Wait for an incoming message. */
                        recv_32 = mcapi_sclchan_recv_uint32(mcapi_struct->scl_rx_handle,
                                                            &mcapi_struct->status);
 
                        if ( (mcapi_struct->status == MCAPI_SUCCESS) &&
                             (recv_32 != MCAPI_FTS_32BIT_SCALAR) )
                        {
                            MCAPID_Failures ++;
                        }
 
                        /* Close the receive side. */
                        mcapi_sclchan_recv_close_i(mcapi_struct->scl_rx_handle,
                                                   &mcapi_struct->request,
                                                   &mcapi_struct->status);
 
                        break;
 
                    case MCAPID_RX_16_BIT_SCL:
 
                        /* Wait for an incoming message. */
                        recv_16 = mcapi_sclchan_recv_uint16(mcapi_struct->scl_rx_handle,
                                                            &mcapi_struct->status);
 
                        if ( (mcapi_struct->status == MCAPI_SUCCESS) &&
                             (recv_16 != MCAPI_FTS_16BIT_SCALAR) )
                        {
                            MCAPID_Failures ++;
                        }
 
                        /* Close the receive side. */
                        mcapi_sclchan_recv_close_i(mcapi_struct->scl_rx_handle,
                                                   &mcapi_struct->request,
                                                   &mcapi_struct->status);
 
                        break;
 
                    case MCAPID_RX_8_BIT_SCL:
 
                        /* Wait for an incoming message. */
                        recv_8 = mcapi_sclchan_recv_uint8(mcapi_struct->scl_rx_handle,
                                                          &mcapi_struct->status);
 
                        if ( (mcapi_struct->status == MCAPI_SUCCESS) &&
                             (recv_8 != MCAPI_FTS_8BIT_SCALAR) )
                        {
                            MCAPID_Failures ++;
                        }
 
                        /* Close the receive side. */
                        mcapi_sclchan_recv_close_i(mcapi_struct->scl_rx_handle,
                                                   &mcapi_struct->request,
                                                   &mcapi_struct->status);
 
                        break;
 
                    default:
 
                        /* Close the receive side. */
                        mcapi_sclchan_recv_close_i(mcapi_struct->scl_rx_handle,
                                                   &mcapi_struct->request,
                                                   &mcapi_struct->status);
 
                        break;
                }
 
                /* Put the status in the packet. */
                mcapi_put32((unsigned char*)buffer, MCAPID_MGMT_STATUS_OFFSET, mcapi_struct->status);
 
                /* Send the response. */
                mcapi_msg_send(mcapi_struct->local_endp,
                               mcapi_get32((unsigned char*)buffer, MCAPID_MGMT_LOCAL_ENDP_OFFSET),
                               buffer, rx_len, MCAPI_DEFAULT_PRIO,
                               &mcapi_struct->status);
            }
 
            else
            {
                /* Close the receive side. */
                mcapi_sclchan_recv_close_i(mcapi_struct->scl_rx_handle,
                                           &mcapi_struct->request,
                                           &mcapi_struct->status);
            }
        }
    }
 
} /* MCAPI_FTS_Scl_Server */
 
#ifdef LCL_MGMT_UNBROKEN
/************************************************************************
*
*   FUNCTION
*
*       MCAPI_FTS_Local_Services
*
*   DESCRIPTION
*
*       This function processes incoming packets instructing the node
*       to create an endpoint, delete an endpoint, etc.
*
*************************************************************************/
MCAPI_THREAD_ENTRY(MCAPI_FTS_Local_Services)
{
    size_t          rx_len;
    MCAPID_STRUCT   *mcapi_struct = (MCAPID_STRUCT*)argv;
    char            buffer[MCAPID_MGMT_PKT_LEN];
 
    for (;;)
    {
        /* Wait for a message. */
        mcapi_msg_recv(mcapi_struct->local_endp, buffer, MCAPID_MGMT_PKT_LEN,
                       &rx_len, &mcapi_struct->status);
 
        if (mcapi_struct->status == MCAPI_SUCCESS)
        {
            /* Sleep the appropriate amount of time - this gives the other side
             * time to issue a command before the management task causes an
             * action.
             */
            MCAPID_Sleep(mcapi_get32((unsigned char*)buffer, MCAPID_MGMT_PAUSE_OFFSET));
 
            /* Determine the type of message. */
            switch (mcapi_get32((unsigned char*)buffer, MCAPID_MGMT_TYPE_OFFSET))
            {
                case MCAPID_CANCEL_REQUEST:
 
                    /* Cancel the pending local request. */
                    mcapi_cancel((mcapi_request_t*)(mcapi_get32((unsigned char*)buffer, MCAPID_MGMT_STATUS_OFFSET)),
                                 &mcapi_struct->status);
 
                    break;
 
                case MCAPID_WAIT_REQUEST:
 
                    /* Wait for the specified request. */
                    mcapi_wait((mcapi_request_t*)(mcapi_get32((unsigned char*)buffer, MCAPID_MGMT_STATUS_OFFSET)),
                               &rx_len, &mcapi_struct->status, MCAPI_TIMEOUT_INFINITE);
 
                    break;
 
                default:
 
                    mcapi_struct->status = -1;
                    break;
            }
 
            /* Put the status in the packet. */
            mcapi_put32((unsigned char*)buffer, MCAPID_MGMT_STATUS_OFFSET, mcapi_struct->status);
 
            /* Send the response using the specified priority. */
            mcapi_msg_send(mcapi_struct->local_endp,
                           mcapi_get32((unsigned char*)buffer, MCAPID_MGMT_LOCAL_ENDP_OFFSET),
                           buffer, rx_len, mcapi_get32((unsigned char*)buffer, MCAPID_MGMT_PRIO_OFFSET),
                           &mcapi_struct->status);
        }
    }
 
} /* MCAPI_FTS_Local_Services */
#endif
 
int mcapi_test_start(int argc, char *argv[])
{
    mcapi_status_t status;
    mcapi_version_t version;
 
    /* Initialize MCAPI on the node. */
    mcapi_initialize(FUNC_BACKEND_NODE_ID, &version, &status);
 
    /* If an error occurred, the demo has failed. */
    if (status != MCAPI_SUCCESS) {
        printf("%s\n", "mcapi_initialize() failed!");
        MCAPID_Failures++;
        goto out;
    }
 
    /* Start the registration server. */
    MCAPID_Create_Thread(&MCAPID_Registration_Server, &MCAPID_Reg_Struct);
 
    /* Let the registration server come up. */
    MCAPID_Sleep(2000);
 
    /* The management service. */
    MCAPID_Mgmt_Struct.type = MCAPI_MSG_RX_TYPE;
    MCAPID_Mgmt_Struct.node = FUNC_BACKEND_NODE_ID;
    MCAPID_Mgmt_Struct.local_port = MCAPI_PORT_ANY;
    MCAPID_Mgmt_Struct.service = "mgmt_svc";
    MCAPID_Mgmt_Struct.thread_entry = MCAPID_Mgmt_Service;
    MCAPID_Create_Service(&MCAPID_Mgmt_Struct);
 
    /* The message echo service. */
    MCAPID_Echo_Struct[0].type = MCAPI_MSG_RX_TYPE;
    MCAPID_Echo_Struct[0].node = FUNC_BACKEND_NODE_ID;
    MCAPID_Echo_Struct[0].local_port = MCAPI_PORT_ANY;
    MCAPID_Echo_Struct[0].service = "msg_echo_svr";
    MCAPID_Echo_Struct[0].thread_entry = MCAPI_FTS_Msg_Echo_Server;
    MCAPID_Create_Service(&MCAPID_Echo_Struct[0]);
 
    /* The packet discard service. */
    MCAPID_Echo_Struct[1].type = MCAPI_CHAN_PKT_RX_TYPE;
    MCAPID_Echo_Struct[1].node = FUNC_BACKEND_NODE_ID;
    MCAPID_Echo_Struct[1].local_port = MCAPI_PORT_ANY;
    MCAPID_Echo_Struct[1].service = "pkt_svr";
    MCAPID_Echo_Struct[1].thread_entry = MCAPI_FTS_Pkt_Server;
    MCAPID_Create_Service(&MCAPID_Echo_Struct[1]);
 
    /* The scalar discard service. */
    MCAPID_Echo_Struct[2].type = MCAPI_MSG_RX_TYPE;
    MCAPID_Echo_Struct[2].node = FUNC_BACKEND_NODE_ID;
    MCAPID_Echo_Struct[2].local_port = MCAPI_PORT_ANY;
    MCAPID_Echo_Struct[2].service = "scl_svr";
    MCAPID_Echo_Struct[2].thread_entry = MCAPI_FTS_Scl_Server;
    MCAPID_Create_Service(&MCAPID_Echo_Struct[2]);
 
#ifdef LCL_MGMT_UNBROKEN
    /* The local services service. */
    MCAPID_Echo_Struct[3].type = MCAPI_MSG_RX_TYPE;
    MCAPID_Echo_Struct[3].node = FUNC_BACKEND_NODE_ID;
    MCAPID_Echo_Struct[3].local_port = MCAPI_PORT_ANY;
    MCAPID_Echo_Struct[3].service = "lcl_mgmt";
    MCAPID_Echo_Struct[3].thread_entry = MCAPI_FTS_Local_Services;
    MCAPID_Create_Service(&MCAPID_Echo_Struct[3]);
#endif
 
    while (1); /* XXX */
 
out:
    return MCAPID_Failures;
}
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.