📄 swl2ptb.c
字号:
/*
* Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
* All rights reserved.
*
* This software is copyrighted by and is the sole property of
* VIA Networking Technologies, Inc. This software may only be used
* in accordance with the corresponding license agreement. Any unauthorized
* use, duplication, transmission, distribution, or disclosure of this
* software is expressly forbidden.
*
* This software is provided by VIA Networking Technologies, Inc. "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 VIA Networking Technologies, Inc.
* be liable for any direct, indirect, incidental, special, exemplary, or
* consequential damages.
*
*
* File: swl2ptb.c
*
* Purpose: L2+ table operation functions
*
* Author: Henry Lin
*
* Date: Dec 10, 2004
*
* Functions:
*
* Revision History:
*
*/
#if !defined(__STR_H__)
#include "str.h"
#endif
#if !defined(__SWITCH_H__)
#include "switch.h"
#endif
#if !defined(__SWREG_H__)
#include "swreg.h"
#endif
#if !defined(__SWSRAM_H__)
#include "swsram.h"
#endif
#if !defined(__SWPMACTB_H__)
#include "swpmactb.h"
#endif
#if !defined(__SWL2PTB_H__)
#include "swl2ptb.h"
#endif
/*--------------------- Static Definitions ------------------------*/
#define TCAM_ENTRY_SIZE SRAM_ENTRY_SIZE_16Byte
/*--------------------- Static Types ------------------------------*/
/*--------------------- Static Macros -----------------------------*/
#define TCAM_INDEX_TO_TCAMVALID_SA(indx) (SRAM_TCAM_VLD_BASE_ADDR + (indx<<SHIFT_NUM_SIZE_16Byte))
/*--------------------- Static Classes ----------------------------*/
/*--------------------- Static Variables --------------------------*/
/*--------------------- Static Functions --------------------------*/
static BOOL s_bIsTcamValid(UINT8 u8EntryIdx);
static void s_vSetTcamValid(UINT8 u8EntryIdx);
static UINT32 s_dwMapAddr (UINT32 u32TcamActAddr);
/*--------------------- Export Variables --------------------------*/
static BOOL s_bIsTcamValid(UINT8 u8EntryIdx)
{
UINT8 abyEntryBuf[TCAM_ENTRY_SIZE];
UINT32 u32EntryAddr = TCAM_INDEX_TO_TCAMVALID_SA(u8EntryIdx);
SWSRAM_bReadEntry(u32EntryAddr, abyEntryBuf);
// Check if bit[0],[64] is 1 of Valid array
if (((abyEntryBuf[0] & L2_BPTN_VALID) != 0)
&& ((abyEntryBuf[8] & L2_BPTN_VALID) != 0) )
return TRUE;
return FALSE;
}
static void s_vSetTcamValid (UINT8 u8EntryIdx)
{
UINT8 abyEntryBuf[TCAM_ENTRY_SIZE];
UINT32 u32EntryAddr = TCAM_INDEX_TO_TCAMVALID_SA(u8EntryIdx);
// Write sram data, we want to set bit[0][64]
abyEntryBuf[0] = 1;
abyEntryBuf[8] = 1;
SWSRAM_bWriteEntry(u32EntryAddr, abyEntryBuf);
}
BOOL SWL2PTB_bIsEntryValid (UINT32 u32Addr)
{
UINT8 abyEntryBuf[TCAM_ENTRY_SIZE];
u32Addr = s_dwMapAddr(u32Addr);
// read entry
SWSRAM_bReadEntry(u32Addr, abyEntryBuf);
// Check if bit[0],[64] is 1 of Valid array
if (((abyEntryBuf[0] & L2_BPTN_VALID) != 0)
&& ((abyEntryBuf[8] & L2_BPTN_VALID) != 0) )
return TRUE;
return FALSE;
}
BOOL SWL2PTB_bIsEntryValidByIndex (UINT8 u8EntryIdx)
{
UINT8 abyEntryBuf[TCAM_ENTRY_SIZE];
UINT32 u32Addr;
u32Addr = TCAM_INDEX_TO_TCAMVALID_SA(u8EntryIdx);
// read entry
SWSRAM_bReadEntry(u32Addr, abyEntryBuf);
// Check if bit[0],[64] is 1 of Valid array
if (((abyEntryBuf[0] & L2_BPTN_VALID) != 0)
&& ((abyEntryBuf[8] & L2_BPTN_VALID) != 0) )
return TRUE;
return FALSE;
}
void SWL2PTB_vSetEntryValid(UINT32 u32Addr)
{
UINT8 abyEntryBuf[TCAM_ENTRY_SIZE];
u32Addr = s_dwMapAddr(u32Addr);
// Write sram data, we want to set bit[0][64]
abyEntryBuf[0] = 1;
abyEntryBuf[8] = 1;
// write entry
SWSRAM_bWriteEntry(u32Addr, abyEntryBuf);
}
void SWL2PTB_vSetEntryInValid(UINT32 u32Addr)
{
UINT8 abyEntryBuf[TCAM_ENTRY_SIZE];
u32Addr = s_dwMapAddr(u32Addr);
// Write sram data, we want to set bit[0][64]
abyEntryBuf[0] = 0;
abyEntryBuf[8] = 0;
// write entry
SWSRAM_bWriteEntry(u32Addr, abyEntryBuf);
}
void SWL2PTB_vSetEntryInValidByIndex(UINT8 u8EntryIdx)
{
UINT32 u32Addr;
UINT8 abyEntryBuf[TCAM_ENTRY_SIZE];
u32Addr = SRAM_TCAM_VLD_BASE_ADDR + (u8EntryIdx*TCAM_ENTRY_SIZE);
// Write sram data, we want to set bit[0][64]
abyEntryBuf[0] = 0;
abyEntryBuf[8] = 0;
// write entry
SWSRAM_bWriteEntry(u32Addr, abyEntryBuf);
}
UINT16 SWL2PTB_u16FindEmptyEntry(void)
{
UINT16 u16Idx;
for (u16Idx = 0 ; u16Idx < TCAM_ENTRY_NUM; u16Idx++)
{
if (!SWL2PTB_bIsEntryValidByIndex(u16Idx))
return u16Idx;
}
return UINT16_MAX;
}
/*
* Description : Get T-CAM value or mask array format.
* Input : u8EntryIdx: vaule between 0 and 255.
*/
BOOL SWTCAM_bGetEntry (UINT8 u8EntryIdx, STcamEntry* pSEntry, BOOL bMaskTbl)
{
UINT8 abyEntryBuf[TCAM_ENTRY_SIZE];
UINT32 u32EntryAddr;
if (FALSE == s_bIsTcamValid(u8EntryIdx)) {
// entry is invalid
return FALSE;
}
if (!bMaskTbl) // rule table
u32EntryAddr = SRAM_TCAM_VALUE_BASE_ADDR + (u8EntryIdx * TCAM_ENTRY_SIZE);
else // mask table
u32EntryAddr = SRAM_TCAM_MASK_BASE_ADDR + (u8EntryIdx * TCAM_ENTRY_SIZE);
// get table fields
SWSRAM_bReadEntry(u32EntryAddr, abyEntryBuf);
SWSRAM_vExtractBitsByByte(abyEntryBuf, TCAM_BIT_DMAC_TYPE_S, TCAM_BIT_DMAC_TYPE_E, &(pSEntry->u8DmacType));
SWSRAM_vExtractBitsByBool(abyEntryBuf, TCAM_BIT_TCP_SYN_S, TCAM_BIT_TCP_SYN_E, &(pSEntry->bTcpSynBit));
SWSRAM_vExtractBitsByBool(abyEntryBuf, TCAM_BIT_VLAN_TYPE_S, TCAM_BIT_VLAN_TYPE_E, &(pSEntry->bVlanTag));
SWSRAM_vExtractBits(abyEntryBuf, TCAM_BIT_VID_S, TCAM_BIT_VID_E, (PUINT8)&(pSEntry->u16Vid));
SWSRAM_vExtractBitsByBool(abyEntryBuf, TCAM_BIT_IPV4_S, TCAM_BIT_IPV4_E, &(pSEntry->bIpv4));
SWSRAM_vExtractBitsByBool(abyEntryBuf, TCAM_BIT_IPLEN_S, TCAM_BIT_IPLEN_E, &(pSEntry->bIpHd20Oct));
SWSRAM_vExtractBitsByBool(abyEntryBuf, TCAM_BIT_IPFRG_S, TCAM_BIT_IPFRG_E, &(pSEntry->bIpFrag));
SWSRAM_vExtractBitsByByte(abyEntryBuf, TCAM_BIT_SRC_ID_S, TCAM_BIT_SRC_ID_E, &(pSEntry->u8PortId));
SWSRAM_vExtractBitsByByte(abyEntryBuf, TCAM_BIT_IPPRO_S, TCAM_BIT_IPPRO_E, (PUINT8)&(pSEntry->UCfg13B.SIpv4Fld.u8IpProto));
SWSRAM_vExtractBits(abyEntryBuf, TCAM_BIT_SRCIP_S, TCAM_BIT_SRCIP_E, (PUINT8)&(pSEntry->UCfg13B.SIpv4Fld.u32SrcIp));
SWSRAM_vExtractBits(abyEntryBuf, TCAM_BIT_DSTIP_S, TCAM_BIT_DSTIP_E, (PUINT8)&(pSEntry->UCfg13B.SIpv4Fld.u32DstIp));
SWSRAM_vExtractBits(abyEntryBuf, TCAM_BIT_IPOPT_S, TCAM_BIT_IPOPT_E, (PUINT8)&(pSEntry->UCfg13B.SIpv4Fld.u32IpOption));
return TRUE;
}
/*
* Description : Insert T-CAM value or mask array format.
* If entry already exist, then update entry.
* If entry not exist, then create a new entry.
* Input : u8EntryIdx: vaule between 0 and 255.
*/
BOOL SWTCAM_bInsEntry (UINT8 u8EntryIdx, STcamEntry* pSEntry, BOOL bMaskTbl)
{
UINT8 abyEntryBuf[TCAM_ENTRY_SIZE];
UINT32 u32EntryAddr;
if (!bMaskTbl) { // rule table
u32EntryAddr = SRAM_TCAM_VALUE_BASE_ADDR + (u8EntryIdx * TCAM_ENTRY_SIZE);
}
else // mask table
u32EntryAddr = SRAM_TCAM_MASK_BASE_ADDR + (u8EntryIdx * TCAM_ENTRY_SIZE);
STR_pvMemset(abyEntryBuf, 0, TCAM_ENTRY_SIZE);
SWSRAM_vModifyBitsByByte(abyEntryBuf, TCAM_BIT_DMAC_TYPE_S, TCAM_BIT_DMAC_TYPE_E, &(pSEntry->u8DmacType));
SWSRAM_vModifyBitsByBool(abyEntryBuf, TCAM_BIT_TCP_SYN_S, TCAM_BIT_TCP_SYN_E, &(pSEntry->bTcpSynBit));
SWSRAM_vModifyBitsByBool(abyEntryBuf, TCAM_BIT_VLAN_TYPE_S, TCAM_BIT_VLAN_TYPE_E, &(pSEntry->bVlanTag));
SWSRAM_vModifyBits(abyEntryBuf, TCAM_BIT_VID_S, TCAM_BIT_VID_E, (PUINT8)&(pSEntry->u16Vid));
SWSRAM_vModifyBitsByBool(abyEntryBuf, TCAM_BIT_IPV4_S, TCAM_BIT_IPV4_E, &(pSEntry->bIpv4));
SWSRAM_vModifyBitsByBool(abyEntryBuf, TCAM_BIT_IPLEN_S, TCAM_BIT_IPLEN_E, &(pSEntry->bIpHd20Oct));
SWSRAM_vModifyBitsByBool(abyEntryBuf, TCAM_BIT_IPFRG_S, TCAM_BIT_IPFRG_E, &(pSEntry->bIpFrag));
SWSRAM_vModifyBitsByByte(abyEntryBuf, TCAM_BIT_SRC_ID_S, TCAM_BIT_SRC_ID_E, &(pSEntry->u8PortId));
SWSRAM_vModifyBitsByByte(abyEntryBuf, TCAM_BIT_IPPRO_S, TCAM_BIT_IPPRO_E, (PUINT8)&pSEntry->UCfg13B.SIpv4Fld.u8IpProto);
SWSRAM_vModifyBits(abyEntryBuf, TCAM_BIT_SRCIP_S, TCAM_BIT_SRCIP_E, (PUINT8)&(pSEntry->UCfg13B.SIpv4Fld.u32SrcIp));
SWSRAM_vModifyBits(abyEntryBuf, TCAM_BIT_DSTIP_S, TCAM_BIT_DSTIP_E, (PUINT8)&(pSEntry->UCfg13B.SIpv4Fld.u32DstIp));
SWSRAM_vModifyBits(abyEntryBuf, TCAM_BIT_IPOPT_S, TCAM_BIT_IPOPT_E, (PUINT8)&(pSEntry->UCfg13B.SIpv4Fld.u32IpOption));
SWSRAM_bWriteEntry(u32EntryAddr, abyEntryBuf);
// set valid table
s_vSetTcamValid(u8EntryIdx);
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -