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

📄 pitrunk.c

📁 vt6528芯片交换机API函数和文档运行程序
💻 C
📖 第 1 页 / 共 2 页
字号:


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 + -