⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 swl2ptb.c

📁 vt6528芯片交换机API函数和文档运行程序
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
 * 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 + -