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

📄 swsecu.c

📁 vt6528芯片交换机API函数和文档运行程序
💻 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:    swsecu.c
 *
 * Purpose: Security hardware accessing functions
 *
 * Author:  Henry Lin
 *
 * Date:    Apr 11, 2005
 *
 * Functions:
 *
 * Revision History:
 *
 */


#if !defined(__SWITCH_H__)
#include "switch.h"
#endif
#if !defined(__SWREG_H__)
#include "swreg.h"
#endif
#if !defined(__SWSECU_H__)
#include "swsecu.h"
#endif




/*---------------------  Static Definitions  ------------------------*/
//#define __DEBUG_API_SECU 1

/*---------------------  Static Types  ------------------------------*/

/*---------------------  Static Macros  -----------------------------*/

/*---------------------  Static Classes  ----------------------------*/

/*---------------------  Static Variables  --------------------------*/

/*---------------------  Static Functions  --------------------------*/

/*---------------------  Export Variables  --------------------------*/
BOOL SWSECU_bGetLearnEn(UINT8 byPortId)
{
    UINT32 u32Data;

    SWREG_vReadU32(FWDCTL_LEARN_EN, &u32Data);

    return (u32Data & (0x01 << byPortId));
}

void SWSECU_vSetLearnEn(UINT8 byPortId, BOOL bLearnEn)
{
    if (bLearnEn)
        SWREG_vSpecBitOn(FWDCTL_LEARN_EN, byPortId);
    else
        SWREG_vSpecBitOff(FWDCTL_LEARN_EN, byPortId);
}


void SWSECU_vSetSecuDetectEn(UINT8 byPortId, BOOL bSecuDetctEn)
{
    if (bSecuDetctEn)
        SWREG_vSpecBitOn(FWDCTL_SECURITY_DETECT_EN, byPortId);
    else
        SWREG_vSpecBitOff(FWDCTL_SECURITY_DETECT_EN, byPortId);
}


void SWSECU_vGetGlobalCfg(SGlobSecuCfg *psSecuCfg)
{
    UINT32 u32Data;

    SWREG_vReadU32(FWDCTL_GBL_SECURITY_CFG, &u32Data);

    switch(u32Data & GBL_SECU_SRC_INCON_BOTH)
    {
        case GBL_SECU_SRC_INCON_NOT_CARE:
            psSecuCfg->bySrcPortIncon = INCON_NOT_CARE;      break;
        case GBL_SECU_SRC_INCON_STATIC:
            psSecuCfg->bySrcPortIncon = INCON_STATIC_ENTRY;  break;
        case GBL_SECU_SRC_INCON_DYNAMIC:
            psSecuCfg->bySrcPortIncon = INCON_DYNAMIC_ENTRY; break;
        case GBL_SECU_SRC_INCON_BOTH:
            psSecuCfg->bySrcPortIncon = INCON_BOTH_ENTRY;    break;
    }
    psSecuCfg->bBcstMcstSMACDetect = (u32Data & GBL_SECU_BMCST_DETECT)!=0 ? TRUE : FALSE;
    psSecuCfg->bSMACSIPDetect = (u32Data & GBL_SECU_SMACSIP_DETECT)!=0 ? TRUE : FALSE;
    switch((u32Data & GBL_SECU_SV_FWD)>>8)
    {
        case 0:
            psSecuCfg->bySVFwdOpt = SV_FWD_DROP;     break;
        case 1:
            psSecuCfg->bySVFwdOpt = SV_FWD_NORMAL;   break;
        case 2:
            psSecuCfg->bySVFwdOpt = SV_FWD_ONLY_CPU; break;
    }
    psSecuCfg->bLogSVSMAC = (u32Data & GBL_SECU_LOG_SV_SMAC)!=0 ? TRUE : FALSE;
    psSecuCfg->byCtrlPktOpt = (u32Data & GBL_SECU_CTRL_PKT)!=0 ? CTRL_PKT_SV : CTRL_PKT_BYPASS;
}


BOOL SWSECU_bSetGlobalCfg(SGlobSecuCfg sSecuCfg)
{
    UINT32 u32Data = 0;
    

    switch(sSecuCfg.bySrcPortIncon)
    {
        case INCON_NOT_CARE:
            u32Data |= GBL_SECU_SRC_INCON_NOT_CARE; break;
        case INCON_STATIC_ENTRY:
            u32Data |= GBL_SECU_SRC_INCON_STATIC;   break;
        case INCON_DYNAMIC_ENTRY:
            u32Data |= GBL_SECU_SRC_INCON_DYNAMIC;  break;
        case INCON_BOTH_ENTRY:
            u32Data |= GBL_SECU_SRC_INCON_BOTH;     break;
    }
    u32Data |= (sSecuCfg.bBcstMcstSMACDetect) ? GBL_SECU_BMCST_DETECT : 0;
    u32Data |= (sSecuCfg.bSMACSIPDetect) ? GBL_SECU_SMACSIP_DETECT : 0;
    switch(sSecuCfg.bySVFwdOpt)
    {
        case SV_FWD_DROP:
            u32Data |= (0x0<<8);    break;
        case SV_FWD_NORMAL:
            u32Data |= (0x1<<8);    break;
        case SV_FWD_ONLY_CPU:
            u32Data |= (0x2<<8);    break;
        default:
            return FALSE;
    }
    u32Data |= (sSecuCfg.bLogSVSMAC) ? GBL_SECU_LOG_SV_SMAC : 0;
    u32Data |= (sSecuCfg.byCtrlPktOpt)!=CTRL_PKT_BYPASS ? GBL_SECU_CTRL_PKT : 0;

    SWREG_vWriteU32(FWDCTL_GBL_SECURITY_CFG, u32Data);

    return TRUE;
}


/*
 * Input : byScopeId: vaule between 0 and 3
 */
void SWSECU_vGetFwdScope (UINT8 byScopeId, SSecuFwdScope *psSecuCfg)
{
    UINT8 u8Data;

    SWREG_vReadU8(ADVFWD_SCOPE0_OPT + byScopeId, &u8Data);
    psSecuCfg->bLkupMissFltEn = (u8Data & SCOPE_OPT_LOOKUP_MISS_DISCARD)!=0 ? TRUE : FALSE;
    psSecuCfg->bSVDetectEn = (u8Data & SCOPE_OPT_VIOLATOR_DETECT_EN)!=0 ? TRUE : FALSE;
    psSecuCfg->bSVProcEn = (u8Data & SCOPE_OPT_VIOLATOR_PROCS_EN)!=0 ? TRUE : FALSE;
}


/*
 * Input : byScopeId: vaule between 0 and 3
 */
void SWSECU_vSetFwdScope (UINT8 byScopeId, SSecuFwdScope sSecuCfg)
{
    UINT8 u8Data = 0;

    u8Data |= (sSecuCfg.bLkupMissFltEn) ? SCOPE_OPT_LOOKUP_MISS_DISCARD : 0;
    u8Data |= (sSecuCfg.bSVDetectEn) ? SCOPE_OPT_VIOLATOR_DETECT_EN : 0;
    u8Data |= (sSecuCfg.bSVProcEn) ? SCOPE_OPT_VIOLATOR_PROCS_EN : 0;
    SWREG_vWriteU8(ADVFWD_SCOPE0_OPT + byScopeId, u8Data);
}


void SWSECU_vSetPortFwdScopeId (UINT8 byPortId, UINT8 byScopeId)
{

    SWREG_vWriteU8(PORTCFG_FWD_SCOPE_ID_BASE + byPortId * PORTCFG_PORT_OFFSET, byScopeId);
}


/*
 * Input : byCfgId: vaule 0 or 1
 *         byTimeUnit: vaule is RATE_LIMIT_TIME_UINT_SEC/RATE_LIMIT_TIME_UINT_100MSEC/RATE_LIMIT_TIME_UINT_10MSEC
 */

BOOL SWSECU_bSetRateLimit (UINT8 byCfgId, UINT8 byTimeUnit, UINT8 byPktNum)
{
    UINT8 u8Data = 0;


    if (byCfgId > 1 || byTimeUnit > RATE_LIMIT_TIME_UINT_10MSEC || byPktNum > 15)
        return FALSE;
        
    u8Data |= (byTimeUnit<<4) | byPktNum;
    SWREG_vWriteU8(RESMGMT_PKT_RATE_LIMIT_CFG1 + byCfgId, u8Data);
    return TRUE;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -