#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;
}
