blob: f2dae250c8aa5477f1c793fadcfd2d41b2ef6d66 [file] [log] [blame]
#include <Copyright.h>
/********************************************************************************
* hgVlan.c
*
* DESCRIPTION:
* Setup the VLAN table of QuaterDeck so that it can be used as a Home
* Gateway.
*
*
* DEPENDENCIES: None.
*
* FILE REVISION NUMBER:
*
*******************************************************************************/
#include "msSample.h"
static GT_STATUS sampleHomeGatewayVlan(GT_QD_DEV *dev,
GT_LPORT numOfPorts,
GT_LPORT cpuPort);
/*
* Get the required parameter from QuarterDeck driver.
* Notes: This routine should be called after QuarterDeck Driver has been initialized.
* (Refer to Initialization Sample)
*/
GT_STATUS sampleVlanSetup(GT_QD_DEV *dev)
{
sampleHomeGatewayVlan(dev,dev->numOfPorts, dev->cpuPortNum);
return GT_OK;
}
/*
* WAN Port (Port 0) and CPU Port (Port 5) are in VLAN 1 and
* all ports (including CPU Port) except WAN Port are in VLAN 2.
* 1) Set PVID for each port. (CPU port has PVID 2, which is the same as LAN)
* 2) Set Port Based VLAN Map for each port. (CPU port's VLAN Map is set for all LAN ports)
* Notes:
* 1) Trailer Mode
* When Ethernet Device, which is directly connected to CPU port, sends out a packet
* to WAN, DPV in Trailer Tag should have WAN port bit set (bit 0 in this case), and
* to LAN, Trailer Tag should be set to 0.
* Restriction : Only one group of VLAN can have multiple ports.
* 2) Header Mode
* When Ethernet Device, which is directly connected to CPU port, sends out a packet
* to WAN, VlanTable in Header Tag should have WAN ports bits set (bit 0 in this case), and
* to LAN, VlanTable in Header Tag should have LAN ports bits set (bit 1~4 and 6 in this case)
*/
static GT_STATUS sampleHomeGatewayVlan(GT_QD_DEV *dev,GT_LPORT numOfPorts, GT_LPORT cpuPort)
{
GT_STATUS status;
GT_LPORT index,port,portToSet;
GT_LPORT portList[MAX_SWITCH_PORTS];
/*
* set PVID for each port.
* the first port(port 0, WAN) has default VID 2 and all others has 1.
*/
if((status = gvlnSetPortVid(dev,0,2)) != GT_OK)
{
MSG_PRINT(("gprtSetPortVid returned fail.\n"));
return status;
}
for (port=1; port<numOfPorts; port++)
{
if((status = gvlnSetPortVid(dev,port,1)) != GT_OK)
{
MSG_PRINT(("gprtSetPortVid returned fail.\n"));
return status;
}
}
/*
* set Port VLAN Mapping.
* port 0 (WAN) and cpu port are in a vlan 2.
* And all the rest ports (LAN) and cpu port are in a vlan 1.
*/
/* port 0 : set cpuPort only */
portList[0] = cpuPort;
if((status = gvlnSetPortVlanPorts(dev,0,portList,1)) != GT_OK)
{
MSG_PRINT(("gvlnSetPortVlanPorts returned fail.\n"));
return status;
}
/* set all ports except port 0 and itself */
for (portToSet=1; portToSet<numOfPorts; portToSet++)
{
/* port 0 and cpuPort will be taken cared seperately. */
if (portToSet == cpuPort)
{
continue;
}
index = 0;
for (port=1; port<numOfPorts; port++)
{
if (port == portToSet)
{
continue;
}
portList[index++] = port;
}
if((status = gvlnSetPortVlanPorts(dev,portToSet,portList,index)) != GT_OK)
{
MSG_PRINT(("gvlnSetPortVlanPorts returned fail.\n"));
return status;
}
}
/* cpuPort : set all port except cpuPort and WAN port */
index = 0;
for (port=1; port<numOfPorts; port++)
{
if (port == cpuPort)
{
continue;
}
portList[index++] = port;
}
if((status = gvlnSetPortVlanPorts(dev,cpuPort,portList,index)) != GT_OK)
{
MSG_PRINT(("gvlnSetPortVlanPorts returned fail.\n"));
return status;
}
return GT_OK;
}