📄 swsecu.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 + -