📄 swvlantb.c
字号:
UINT32 u32Addr;
// Convert index to SRAM acture address
u32Addr = SWVLANTB_dwVidToSramAddr(u16Indx);
// Write sram data, because we want to clear [127]
au8EntryBuf[15] = 0;
// write entry
if (!SWSRAM_bWriteEntry(u32Addr, au8EntryBuf))
return FALSE;
return TRUE;
}
BOOL SWVLANTB_bIsEntryInvalid(UINT16 u16Indx)
{
UINT8 au8EntryBuf[VLAN_ENTRY_SIZE];
UINT32 u32Addr;
// Convert index to SRAM acture address
u32Addr = SWVLANTB_dwVidToSramAddr(u16Indx);
// read entry
SWSRAM_bReadEntry(u32Addr, au8EntryBuf);
// Check if bit[127] is not 0
if ((au8EntryBuf[15] & VLAN_BPTN_VALID_VLAN) != 0)
return FALSE;
return TRUE;
}
void SWVLANTB_vSetIngrsFilter(UINT8 u8PortId, UINT8 u8Cfg)
{
SWREG_vWriteU8(PORTCFG_INGRS_FLTR_BASE + (u8PortId * PORTCFG_PORT_OFFSET), sg_au8IngrsFilterPtn[u8Cfg]);
}
void SWVLANTB_vPortBaseClearAllGrp(void)
{
UINT uu;
// Clear group of each port
for (uu = 0; uu < SWITCH_PORT_NUM; uu++)
SWVLANTB_bDelEntry( PORTBASE_ID_TO_VID(uu) );
// Clear unused group
SWVLANTB_bDelEntry( PORTBASE_VLAN_UNSET_GRP_VID );
}
void SWVLANTB_vPortBaseAddGrp (UINT32 u32MbrMsk)
{
SVlanEntry SEntryBuf;
UINT32 u32ShftBuf = 0x00000001;
UINT8 u8PortId;
STR_pvMemset(&SEntryBuf, 0, sizeof(SVlanEntry));
// Set vlan group of each member port
for (u8PortId = 0; u8PortId < SWITCH_PORT_NUM; u8PortId++) {
// Update members in current group
if ((u32MbrMsk & u32ShftBuf) != 0) {
// If entry not exist, insert one
if (!SWVLANTB_bGetEntry( PORTBASE_ID_TO_VID(u8PortId), &SEntryBuf )) {
SEntryBuf.u16Vid = PORTBASE_ID_TO_VID(u8PortId);
SEntryBuf.u16Fid = PORTBASE_VLAN_FID;
SEntryBuf.u32EgrsMbrPortMsk = u32MbrMsk;
SEntryBuf.u32IngrsMbrPortMsk = u32MbrMsk;
SEntryBuf.u32TagPortMsk = 0;
}
// If entry exists, modify member
else {
SEntryBuf.u32EgrsMbrPortMsk |= u32MbrMsk;
SEntryBuf.u32IngrsMbrPortMsk |= u32MbrMsk;
}
// Update vlan table entry
SWVLANTB_bSetEntry(&SEntryBuf);
}
u32ShftBuf <<= 1;
}
}
void SWVLANTB_vPortBaseSetCfgForAllGrp (void)
{
SVlanEntry SEntryBuf;
UINT32 u32MskBuf, u32EgrsMskBuf = 0, u32IngrsMskBuf = 0;
UINT8 u8PortId;
STR_pvMemset(&SEntryBuf, 0, sizeof(SVlanEntry));
// Set PVID to each port and statistic existing member ports
for (u8PortId = 0; u8PortId < SWITCH_PORT_NUM; u8PortId++) {
SWVLANTB_vPvidSet( u8PortId, PORTBASE_ID_TO_VID(u8PortId) );
if (SWVLANTB_bGetEntry( PORTBASE_ID_TO_VID(u8PortId), &SEntryBuf) ){
u32EgrsMskBuf |= SEntryBuf.u32EgrsMbrPortMsk;
u32IngrsMskBuf |= SEntryBuf.u32IngrsMbrPortMsk;
}
}
// Set unset-group from member port statistic result
SEntryBuf.u16Vid = PORTBASE_VLAN_UNSET_GRP_VID;
SEntryBuf.u16Fid = PORTBASE_VLAN_FID;
SEntryBuf.u32EgrsMbrPortMsk = ~u32EgrsMskBuf;
SEntryBuf.u32IngrsMbrPortMsk = ~u32IngrsMskBuf;
SEntryBuf.u32TagPortMsk = 0;
SWVLANTB_bSetEntry(&SEntryBuf);
// Set Pvid of unused ports
u32MskBuf = 0x00000001;
for (u8PortId = 0; u8PortId < SWITCH_PORT_NUM; u8PortId++) {
if ((SEntryBuf.u32EgrsMbrPortMsk & u32MskBuf) != 0)
SWVLANTB_vPvidSet(u8PortId, PORTBASE_VLAN_UNSET_GRP_VID);
u32MskBuf <<= 1;
}
}
//
// Output: pu16Pvid: 0~4095 means refers to a 802.1Q VLAN, 4096~4223 means refer to an internal VLAN
//
void SWVLANTB_vPvidGet (UINT8 u8PortId, PUINT16 pu16Pvid)
{
UINT16 u16Tmp;
SWREG_vReadU16(PORTCFG_VLAN_CFG_BASE + (u8PortId * PORTCFG_PORT_OFFSET), &u16Tmp);
*pu16Pvid = (u16Tmp & VLAN_CFG_INT_PVID_MSK);
}
//
// Input: u16Pvid: 0~4095 means refers to a 802.1Q VLAN, 4096~4223 means refer to an internal VLAN
//
void SWVLANTB_vPvidSet (UINT8 u8PortId, UINT16 u16Pvid)
{
UINT16 u16Tmp;
SWREG_vReadU16(PORTCFG_VLAN_CFG_BASE + (u8PortId * PORTCFG_PORT_OFFSET), &u16Tmp);
u16Tmp &= ~(VLAN_CFG_INT_PVID_MSK);
u16Tmp |= u16Pvid;
SWREG_vWriteU16(PORTCFG_VLAN_CFG_BASE + (u8PortId * PORTCFG_PORT_OFFSET), u16Tmp);
}
BOOL SWVLANTB_bIsIntEntryValid(UINT16 u16Vid)
{
UINT8 u8Cfg, u8Offset;
u8Offset = u16Vid - VID_NUM_8021Q;
SWREG_vReadU8(FWDCTL_TBL_CFG, &u8Cfg);
u8Cfg &= 0x3;
if (u8Cfg == FWD_TBL_INTERNAL_VLAN_0)
return FALSE;
else if (u8Cfg == FWD_TBL_INTERNAL_VLAN_32){
if (u8Offset >= 32)
return FALSE;
}
else if (u8Cfg == FWD_TBL_INTERNAL_VLAN_64){
if (u8Offset >= 64)
return FALSE;
}
else{//128 entry
if (u8Offset >= 128)
return FALSE;
}
return TRUE;
}
UINT32 SWVLANTB_dwVidToSramAddr(UINT16 u16Vid)
{
UINT32 dwAddr;
if (u16Vid < VID_NUM_8021Q)
dwAddr = SRAM_VLAN_TBL_BASE_ADDR + (u16Vid << SHIFT_NUM_SIZE_16Byte);
else{
// max vid number = 4096 + 128 = 4224; vid range is 0~4223
if (u16Vid >= (INTER_VLAN_MAX_NUM + VID_NUM_8021Q))
return UINT32_MAX;
dwAddr = SRAM_PMAC_TBL_BASE_ADDR + ((u16Vid - VID_NUM_8021Q) << SHIFT_NUM_SIZE_16Byte);
}
return dwAddr;
}
UINT16 SWVLANTB_wSramAddrToVid(UINT32 u32SramAddr)
{
UINT16 u16Vid;
// is internal vid?
if ((u32SramAddr >= SRAM_VLAN_TBL_BASE_ADDR) && (u32SramAddr < (SRAM_VLAN_TBL_BASE_ADDR+ SRAM_VLAN_TBL_SIZE) ))
u16Vid = (u32SramAddr - SRAM_VLAN_TBL_BASE_ADDR) >> SHIFT_NUM_SIZE_16Byte;
else if ((u32SramAddr >= SRAM_PMAC_TBL_BASE_ADDR) && (u32SramAddr < (SRAM_PMAC_TBL_BASE_ADDR+ INTER_VLAN_TBL_SIZE) ))
u16Vid = ((u32SramAddr - SRAM_PMAC_TBL_BASE_ADDR) >> SHIFT_NUM_SIZE_16Byte) + VID_NUM_8021Q;
else
return UINT16_MAX;
return u16Vid;
}
void SWVLANTB_vSetClassMethod(UINT16 u16Method)
{
UINT8 uu;
UINT16 u16VlanCfg;
for (uu = 0; uu < SWITCH_PORT_NUM; uu++){
SWREG_vReadU16(PORTCFG_VLAN_CFG_BASE + (uu * PORTCFG_PORT_OFFSET), &u16VlanCfg);
u16VlanCfg &= ~(VLAN_CFG_CLASS_MSK);
u16VlanCfg |= u16Method;
SWREG_vWriteU16(PORTCFG_VLAN_CFG_BASE + (uu * PORTCFG_PORT_OFFSET), u16VlanCfg);
}
}
void SWVLANTB_vSetVerbatimMode(UINT8 u8PortId, BOOL bEn)
{
if (bEn)
SWREG_vBitsOnU8(PORTCFG_VLAN_MODE_BASE + (u8PortId * PORTCFG_PORT_OFFSET), VLAN_CFG_VERBATIM_MODE);
else
SWREG_vBitsOffU8(PORTCFG_VLAN_MODE_BASE + (u8PortId * PORTCFG_PORT_OFFSET), VLAN_CFG_VERBATIM_MODE);
}
void SWVLANTB_vPvidSetPage (UINT8 u8PvidPageNo)
{
}
BOOL SWVLANTB_bIsPvidOutOfPage (UINT16 u16Pvid)
{
return FALSE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -