#include <Copyright.h>
/********************************************************************************
* macAddr.c
*
* DESCRIPTION:
*    This sample will demonstrate how to add/delete a static MAC Address
*    into/from the QuaterDeck MAC Address Data Base.
*
* DEPENDENCIES:   None.
*
* FILE REVISION NUMBER:
*
*******************************************************************************/
#include "msSample.h"

/*
 *    Add the CPU MAC address into the QuaterDeck MAC Address database.
 *    Input - None
*/
GT_STATUS sampleAddCPUMac(GT_QD_DEV *dev)
{
    GT_STATUS status;
    GT_ATU_ENTRY macEntry;

    /*
     *    Assume that Ethernet address for the CPU MAC is
     *    00-50-43-00-01-02.
    */
    macEntry.macAddr.arEther[0] = 0x00;
    macEntry.macAddr.arEther[1] = 0x50;
    macEntry.macAddr.arEther[2] = 0x43;
    macEntry.macAddr.arEther[3] = 0x00;
    macEntry.macAddr.arEther[4] = 0x01;
    macEntry.macAddr.arEther[5] = 0x02;

    macEntry.portVec = 1 << dev->cpuPortNum;     /* CPU Port number. 7bits are used for portVector. */

    macEntry.prio = 0;            /* Priority (2bits). When these bits are used they override
                                any other priority determined by the frame's data. This value is
                                meaningful only if the device does not support extended priority
                                information such as MAC Queue Priority and MAC Frame Priority */

    macEntry.exPrio.macQPri = 0;    /* If device doesnot support MAC Queue Priority override,
                                    this field is ignored. */
    macEntry.exPrio.macFPri = 0;    /* If device doesnot support MAC Frame Priority override,
                                    this field is ignored. */
    macEntry.exPrio.useMacFPri = 0;    /* If device doesnot support MAC Frame Priority override,
                                    this field is ignored. */

    macEntry.entryState.ucEntryState = GT_UC_STATIC;
                                /* This address is locked and will not be aged out.
                                Refer to GT_ATU_UC_STATE in msApiDefs.h for other option. */

    /*
     *    Add the MAC Address.
     */
    if((status = gfdbAddMacEntry(dev,&macEntry)) != GT_OK)
    {
        MSG_PRINT(("gfdbAddMacEntry returned fail.\n"));
        return status;
    }

    return GT_OK;
}


/*
 *    Delete the CPU MAC address from the QuaterDeck MAC Address database.
 *    Input - None
*/
GT_STATUS sampleDelCPUMac(GT_QD_DEV *dev)
{
    GT_STATUS status;
    GT_ATU_ENTRY macEntry;

    /*
     *    Assume that Ethernet address for the CPU MAC is
     *    00-50-43-00-01-02.
    */
    macEntry.macAddr.arEther[0] = 0x00;
    macEntry.macAddr.arEther[1] = 0x50;
    macEntry.macAddr.arEther[2] = 0x43;
    macEntry.macAddr.arEther[3] = 0x00;
    macEntry.macAddr.arEther[4] = 0x01;
    macEntry.macAddr.arEther[5] = 0x02;

    /*
     *    Delete the CPU MAC Address.
     */
    if((status = gfdbDelMacEntry(dev,&macEntry.macAddr)) != GT_OK)
    {
        MSG_PRINT(("gfdbDelMacEntry returned fail.\n"));
        return status;
    }

    return GT_OK;
}


/*
 *    Add a multicast MAC address into the QuaterDeck MAC Address database,
 *    where address is 01-00-18-1a-00-00 and frames with this destination has
 *    to be forwarding to Port 1, Port 2 and Port 4 (port starts from Port 0)
 *    Input - None
*/
GT_STATUS sampleAddMulticastAddr(GT_QD_DEV *dev)
{
    GT_STATUS status;
    GT_ATU_ENTRY macEntry;

    /*
     *    Assume that we want to add the following multicast address
     *    01-50-43-00-01-02.
    */
    macEntry.macAddr.arEther[0] = 0x01;
    macEntry.macAddr.arEther[1] = 0x50;
    macEntry.macAddr.arEther[2] = 0x43;
    macEntry.macAddr.arEther[3] = 0x00;
    macEntry.macAddr.arEther[4] = 0x01;
    macEntry.macAddr.arEther[5] = 0x02;

    /*
     *     Assume that a packet needs to be forwarded to the second Port (port 1),
     *    the third Port (port 2) and cpu Port, if the frame has destination of
     *    01-00-18-1a-00-00.
    */
    macEntry.portVec =     (1<<1) | /* the second port */
                (1<<2) | /* the third port */
                (1<<dev->cpuPortNum);

    macEntry.prio = 0;            /* Priority (2bits). When these bits are used they override
                                any other priority determined by the frame's data. This value is
                                meaningful only if the device does not support extended priority
                                information such as MAC Queue Priority and MAC Frame Priority */

    macEntry.exPrio.macQPri = 0;    /* If device doesnot support MAC Queue Priority override,
                                    this field is ignored. */
    macEntry.exPrio.macFPri = 0;    /* If device doesnot support MAC Frame Priority override,
                                    this field is ignored. */
    macEntry.exPrio.useMacFPri = 0;    /* If device doesnot support MAC Frame Priority override,
                                    this field is ignored. */

    macEntry.entryState.ucEntryState = GT_MC_STATIC;
                                /* This address is locked and will not be aged out.
                                Refer to GT_ATU_MC_STATE in msApiDefs.h for other option.*/

    /*
     *    Add the MAC Address.
     */
    if((status = gfdbAddMacEntry(dev,&macEntry)) != GT_OK)
    {
        MSG_PRINT(("gfdbAddMacEntry returned fail.\n"));
        return status;
    }

    return GT_OK;
}


/*
 *    Delete the Multicast MAC address of 01-00-18-1a-00-00.
 *    Input - None
*/
GT_STATUS sampleDelMulticastAddr(GT_QD_DEV *dev)
{
    GT_STATUS status;
    GT_ATU_ENTRY macEntry;

    /*
     *    Assume that Ethernet address for the CPU MAC is
     *    01-50-43-00-01-02.
    */
    macEntry.macAddr.arEther[0] = 0x01;
    macEntry.macAddr.arEther[1] = 0x50;
    macEntry.macAddr.arEther[2] = 0x43;
    macEntry.macAddr.arEther[3] = 0x00;
    macEntry.macAddr.arEther[4] = 0x01;
    macEntry.macAddr.arEther[5] = 0x02;

    /*
     *    Delete the given Multicast Address.
     */
    if((status = gfdbDelMacEntry(dev,&macEntry.macAddr)) != GT_OK)
    {
        MSG_PRINT(("gfdbDelMacEntry returned fail.\n"));
        return status;
    }

    return GT_OK;
}


/*
 *    This sample function will show how to display all the MAC address
 *    in the ATU.
*/
GT_STATUS sampleShowMacEntry(GT_QD_DEV *dev)
{
    GT_STATUS status;
    GT_ATU_ENTRY tmpMacEntry;

    MSG_PRINT(("ATU List:\n"));
    memset(&tmpMacEntry,0,sizeof(GT_ATU_ENTRY));

    while(1)
    {
        /* Get the sorted list of MAC Table. */
        if((status = gfdbGetAtuEntryNext(dev,&tmpMacEntry)) != GT_OK)
        {
            return status;
        }

        MSG_PRINT(("(%02x-%02x-%02x-%02x-%02x-%02x) PortVec %#x\n",
                tmpMacEntry.macAddr.arEther[0],
                tmpMacEntry.macAddr.arEther[1],
                tmpMacEntry.macAddr.arEther[2],
                tmpMacEntry.macAddr.arEther[3],
                tmpMacEntry.macAddr.arEther[4],
                tmpMacEntry.macAddr.arEther[5],
                tmpMacEntry.portVec));
    }
    return GT_OK;
}
