📄 pitrunk.c
字号:
static void s_vTransPortCfgToGrpCfg (STrkPageCfg *pSPageBuf, PUINT32 adwTrkGrpMbr)
{
UINT8 byCfg, si;
UINT16 u16ValidGrpMsk = *((PUINT16)pSPageBuf);
// Clear trunk group buffer
for (si = 0; si < SWITCH_TRUNK_GRP_NUM; si++)
adwTrkGrpMbr[si] = 0;
// Transfer per-port config into group config (valid group only)
for (si = 0; si < SWITCH_TRUNKABLE_PORT_NUM; si++) {
SWSRAM_vExtractBitsByByte( pSPageBuf->abyCfgBuf, (UINT8)(si*TRUNK_GRP_ID_BIT_NUM),
(UINT8)((si+1)*TRUNK_GRP_ID_BIT_NUM-1), &byCfg );
if ((byCfg != 0) && ( (u16ValidGrpMsk >> (byCfg-MIN_TRK_GRP_ID)) & 0x01 ) )
adwTrkGrpMbr[byCfg-MIN_TRK_GRP_ID] |= PIPORTMP_dwLogIdToPhyMsk(si);
}
}
// Used only in this function
#define SHIFT_BUF_32_BIT 0x00000001
typedef struct tagSPortCfgBuf {
// BEWARE: it should be modify when per port config size is not 1 Byte.
UINT16 wOldPortCfg;
UINT16 wNewPortCfg;
UINT8 byOldPortQosCfg;
UINT8 byNewPortQosCfg;
UINT8 byMbrCnt;
// for rate control
UINT16 wOldRateCfg;
UINT16 wNewRateCfg;
} SPortCfgBuf;
static UINT8 s_byCheckIfCfgValid (PUINT32 adwTrkGrpMbr, PUINT16 pwFailGrpId)
{
union // For reducing stack usage
{
SVlanGrp SVlanBuf;
SSniffCfg SSnifBuf;
SPortCfgBuf SPortBuf;
SVlanIngrFilterPageCfg SVifBuf;
} UCfgBuf;
UINT8 byTrkId, byTmp, si;
UINT8 bySMACFltMode; //If mode is permit, check whether trunk a security port
// check port config consistency
for (byTrkId = 0; byTrkId < SWITCH_TRUNK_GRP_NUM; byTrkId++)
{
//check portmbr valid : mega port can not trunk with giga port
if ((adwTrkGrpMbr[byTrkId] & 0x03000000) && (adwTrkGrpMbr[byTrkId] & 0x00ffffff) ) {
byTmp = TRK_OP_MBR_DIFF_TRK_CFG;
goto CfgCheckFail;
}
UCfgBuf.SPortBuf.byMbrCnt = 0;
for (si = 0; si < SWITCH_TRUNKABLE_PORT_NUM; si++)
{
if ((adwTrkGrpMbr[byTrkId]>>si) & 0x00000001)
{
// for Qos
PIEEP_vGetCfgFromEep( (EEP_ADDR_PORT_QOS + EEP_SIZE_QOS_PORT_OFFSET*si),
EEP_SIZE_QOS_PORT_OFFSET,
(PUINT8)(&UCfgBuf.SPortBuf.byNewPortQosCfg) );
if (si < SWITCH_GIGA_PORT_ID_BASE)
PIEEP_vGetCfgFromEep( (EEP_ADDR_MEGA_PORT_CFG + EEP_SIZE_MEGA_PORT_OFFSET*si),
EEP_SIZE_MEGA_PORT_OFFSET,
(PUINT8)(&UCfgBuf.SPortBuf.wNewPortCfg) );
else //module port
PIEEP_vGetCfgFromEep( (EEP_ADDR_GIGA_PORT_CFG + EEP_SIZE_GIGA_PORT_OFFSET*(si-SWITCH_GIGA_PORT_ID_BASE)),
EEP_SIZE_GIGA_PORT_OFFSET,
(PUINT8)(&UCfgBuf.SPortBuf.wNewPortCfg) );
// for rate control
if (si < SWITCH_GIGA_PORT_ID_BASE)
PIEEP_vGetCfgFromEep( (EEP_ADDR_RATE_CFG + EEP_SIZE_RATE_PORT_BYTE_OFFSET*si),
EEP_SIZE_RATE_PORT_BYTE_OFFSET,
(PUINT8)(&UCfgBuf.SPortBuf.wNewRateCfg) );
if (UCfgBuf.SPortBuf.byMbrCnt == 0)
{
UCfgBuf.SPortBuf.wOldPortCfg = UCfgBuf.SPortBuf.wNewPortCfg;
UCfgBuf.SPortBuf.byOldPortQosCfg = UCfgBuf.SPortBuf.byNewPortQosCfg;
UCfgBuf.SPortBuf.wOldRateCfg = UCfgBuf.SPortBuf.wNewRateCfg;
}
else
{
if (UCfgBuf.SPortBuf.wOldPortCfg != UCfgBuf.SPortBuf.wNewPortCfg ||
UCfgBuf.SPortBuf.byOldPortQosCfg != UCfgBuf.SPortBuf.byNewPortQosCfg)
{
byTmp = TRK_OP_MBR_DIFF_PORT_CFG;
goto CfgCheckFail;
}
if ((UCfgBuf.SPortBuf.wOldRateCfg != UCfgBuf.SPortBuf.wNewRateCfg) &&
(si < SWITCH_GIGA_PORT_ID_BASE))
{
byTmp = TRK_OP_MBR_DIFF_RATE_CFG;
goto CfgCheckFail;
}
}
UCfgBuf.SPortBuf.byMbrCnt++;
}
}
}
// Check 802.1Q vlan ingress filter consistency
PIVLAN_vGetVlanMode(&byTmp);
if ((byTmp == VLAN_MODE_8021Q) || (byTmp == VLAN_MODE_PROTOBASE) )
{
UINT32 dwMbrMsk1=0, dwMbrMsk2=0;
PIEEP_vGetCfgFromEep(EEP_ADDR_VLAN_INGRS_FILTER, EEP_SIZE_VLAN_INGRS_FILTER, UCfgBuf.SVifBuf.abyCfg);
// extract 3B to 2 dword mask
for (byTrkId = 0; byTrkId < SWITCH_PORT_NUM; byTrkId++)
{
if (UCfgBuf.SVifBuf.abyCfg[byTrkId*2/8] & (0x01<<(byTrkId*2)%8) )
dwMbrMsk1 |= (SHIFT_BUF_32_BIT<<byTrkId);
if (UCfgBuf.SVifBuf.abyCfg[(byTrkId*2+1)/8] & (0x01<<(byTrkId*2+1)%8) )
dwMbrMsk2 |= (SHIFT_BUF_32_BIT<<byTrkId);
}
for (byTrkId = 0; byTrkId < SWITCH_TRUNK_GRP_NUM; byTrkId++)
{
if ((((adwTrkGrpMbr[byTrkId] & dwMbrMsk1) != 0) &&
((adwTrkGrpMbr[byTrkId] & dwMbrMsk1) != adwTrkGrpMbr[byTrkId])) ||
(((adwTrkGrpMbr[byTrkId] & dwMbrMsk2) != 0) &&
((adwTrkGrpMbr[byTrkId] & dwMbrMsk2) != adwTrkGrpMbr[byTrkId])) ) {
byTmp = TRK_OP_MBR_DIFF_8021Q_INGS;
goto CfgCheckFail;
}
}
}
// Check vlan constraint (trunk member cannot belong to different VLANs)
// (We use the format of vlan EEPROM content => 2B VID + 3B Untagged Phy Msk + 3B Tagged Phy Msk
if (byTmp != VLAN_MODE_DISABLE)
{
for (si = 0; si < SWITCH_VLAN_GRP_NUM; si++)
{
PIEEP_vGetCfgFromEep( (EEP_ADDR_VLAN_GROUP + si*EEP_SIZE_VLAN_TBL_ENTRY),
EEP_SIZE_VLAN_TBL_ENTRY, (PUINT8)&UCfgBuf.SVlanBuf);
if (UCfgBuf.SVlanBuf.u16Vid != 0) {
UINT32 dwMbrBuf = 0;
for (byTrkId = 0; byTrkId < SWITCH_TRUNK_GRP_NUM; byTrkId++) {
// Check if tagged member consistent
STR_pvMemcpy( (PUINT8)(&dwMbrBuf)+BYTE_OFFSET_IN_DWORD_OF_CFGMASK,
UCfgBuf.SVlanBuf.abyMbrMsk, BYTE_NUM_OF_CFGBUF_BIT_MASK );
if (((adwTrkGrpMbr[byTrkId] & dwMbrBuf) != 0) &&
((adwTrkGrpMbr[byTrkId] & dwMbrBuf) != adwTrkGrpMbr[byTrkId]) ) {
byTmp = TRK_OP_MBR_DIFF_VLAN_CFG;
goto CfgCheckFail;
}
// Check if untagged member consistent
STR_pvMemcpy( (PUINT8)(&dwMbrBuf)+BYTE_OFFSET_IN_DWORD_OF_CFGMASK,
UCfgBuf.SVlanBuf.abyMbrMsk+BYTE_NUM_OF_CFGBUF_BIT_MASK, BYTE_NUM_OF_CFGBUF_BIT_MASK );
if (((adwTrkGrpMbr[byTrkId] & dwMbrBuf) != 0) &&
((adwTrkGrpMbr[byTrkId] & dwMbrBuf) != adwTrkGrpMbr[byTrkId]) ) {
byTmp = TRK_OP_MBR_DIFF_VLAN_CFG;
goto CfgCheckFail;
}
}
}
}
}
// Check sniffer constraint
SWSNF_vGetSniffCfg(&UCfgBuf.SSnifBuf);
if (UCfgBuf.SSnifBuf.byMode != SNIFF_MODE_DISABLE)
{
for (byTrkId = 0; byTrkId < SWITCH_TRUNK_GRP_NUM; byTrkId++) {
// Check if trunk cross sniffer source port and non sniffer source port
if ((adwTrkGrpMbr[byTrkId] & (SHIFT_BUF_32_BIT << UCfgBuf.SSnifBuf.bySrcPort)) != 0 )
{
byTmp = TRK_OP_MBR_DIFF_MONITORED;
goto CfgCheckFail;
}
// Check if trunk member include sniffer destination port
if ((adwTrkGrpMbr[byTrkId] & (SHIFT_BUF_32_BIT << UCfgBuf.SSnifBuf.byDestPort)) != 0 ) {
byTmp = TRK_OP_MBR_IS_MONITORING;
goto CfgCheckFail;
}
}
}
//Check Security constraint
PIMACFLT_vGetSMacFltMode(&bySMACFltMode);
if (bySMACFltMode == MACFLT_MODE_SMAC_PERMIT) {
for (byTrkId = 0; byTrkId < SWITCH_TRUNK_GRP_NUM; byTrkId++) {
for (si = 0; si < SWITCH_TRUNKABLE_PORT_NUM; si++) {
// Check if trunk member include security port
if ( (adwTrkGrpMbr[byTrkId] & (SHIFT_BUF_32_BIT << si)) != 0 ) {
if (SWSECU_bGetLearnEn(si) == FALSE) {
byTmp = TRK_OP_MBR_IS_SECURITY;
goto CfgCheckFail;
}
}
}
}
}
*pwFailGrpId = UINT16_MAX;
return OP_OK;
CfgCheckFail:
*pwFailGrpId = PORTMAP_BASE_TRKGRP_LOG_ID + byTrkId;
return byTmp;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -