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

📄 swpmactb.c

📁 vt6528芯片交换机API函数和文档运行程序
💻 C
📖 第 1 页 / 共 2 页
字号:
        SWSRAM_vModifyBitsByBool(pbySlot, MAC_BIT_SMAC_REDIR_S, MAC_BIT_SMAC_REDIR_E, &pSEntry->bNotRedirSmac);    
        SWSRAM_vModifyBitsByBool(pbySlot, MAC_BIT_SMAC_PRI_S, MAC_BIT_SMAC_PRI_E, &pSEntry->bPriSmac);    
        SWSRAM_vModifyBitsByBool(pbySlot, MAC_BIT_CPU_INV_S, MAC_BIT_CPU_INV_E, &pSEntry->bCpuInv);    
        SWSRAM_vModifyBitsByBool(pbySlot, MAC_BIT_TRK_TYPE_S, MAC_BIT_TRK_TYPE_E, &pSEntry->bTrkGrp);
        SWSRAM_vModifyBitsByByte(pbySlot, MAC_BIT_SRC_ID_S, MAC_BIT_SRC_ID_E, &pSEntry->u8SrcId);   
    }
    else {
        // multicast, port mask table index
        SWSRAM_vModifyBits(pbySlot, MAC_BIT_MCST_IDX_S, MAC_BIT_MCST_IDX_E, (PUINT8)&pSEntry->u16McstIdx);
    }

    // Write into sram and return
    SWSRAM_bWriteEntry(u32InsAddr, abyEntryBuf);

    return TRUE;
}


BOOL SWMACTB_bDelEntry (PUINT8 abyMacAddr, UINT16 u16Fid)
{
    UINT16  u16Indx;


    // Search entry
    u16Indx = SWMACTB_wSearchEntry(abyMacAddr, u16Fid);
    // If search failed, return FALSE
    if (u16Indx == UINT16_MAX)
        return FALSE;

    // Delete MAC table entry
    SWMACTB_vDelEntryByIndx(u16Indx);

    return TRUE;
}


/*
 * Input : u16Indx: The index isn't a memory entry index, it is slot number(0~8191).
 */
void SWMACTB_vDelEntryByIndx(UINT16 u16Indx)
{
    UINT8  abyEntryBuf[SRAM_ENTRY_SIZE_16Byte];
    UINT8  bySlot;
    UINT32  u32SAddr, u32IndAddr;


    u32IndAddr = PMAC_INDEX_TO_SA(u16Indx);
    bySlot = GET_PMAC_SLOTID(u32IndAddr);
    u32SAddr = GET_PMAC_MEMENTRY_ADDR(u32IndAddr);
    SWSRAM_bReadEntry(u32SAddr, abyEntryBuf);
    STR_pvMemset(abyEntryBuf + (bySlot * 8), 0, SRAM_ENTRY_SIZE_8Byte);
    SWSRAM_bWriteEntry(u32SAddr, abyEntryBuf);
}


//
// index = (bucket_addr[11:0])
//
UINT16 SWMACTB_wHash(PUINT8 abyMacAddr, UINT16 u16Fid)
{
    return (s_wHash(abyMacAddr, u16Fid));
}


//
// Calculate MAC[11:0] = { SramAddr[15:4], TAG[35:0], FID[12:0] }
//           MAC[47:0] = TAG[35:0] + MAC[11:0] = MAC[47:12] + MAC[11:0]
//
/*
 * Input : u16Indx: The index is a memory entry index, not a slot number.
 */
void SWMACTB_vInvHash(UINT16 u16Index, UINT16 u16Fid, PUINT8 abyTag, PUINT8 abyMacAddr)
{
    UINT16  u16Mac;
    UINT8    byTmp;


    // Recognize MAC table hash algorithm, if CRC, use Inv hash
    u16Mac = u16Index;
    SWREG_vReadU8(FWDCTL_TBL_HASH, &byTmp);
    
    if ((byTmp & FWD_TBL_HASH_ALG_DIRECT) != FWD_TBL_HASH_ALG_DIRECT)
        u16Mac = s_wInvCRCHash(u16Mac, u16Fid, abyTag);

    //
    // MAC[47:0] = TAG[35:0] + MAC[11:0] = MAC[47:12] + MAC[11:0]
    //
    abyMacAddr[0] = (UINT8)(u16Mac);
    abyMacAddr[1] = (UINT8)(u16Mac >> 8);
    SWSRAM_vModifyBitsLtl(abyMacAddr, MAC_MAP_MACADDR_TO_TAG_S, MAC_MAP_MACADDR_TO_TAG_E, abyTag);
}


//
// Calculate SramAddr[15:4] = hash{ MAC[47:0], FID[11:0] }
//
static UINT16 s_wHash (PUINT8 abyMacAddr, UINT16 u16Fid)
{
    UINT16  u16HashResult;
    UINT8   uu;


    // Set mac address key value
    for (uu = 0; uu < MAC_ADDR_SIZE; uu++)
        SWREG_vWriteU8(FWDCTL_HASH_ARGU0 + uu, abyMacAddr[uu]);
    // Set FID key value, write last byte will trigger calculation
    SWREG_vWriteU16(FWDCTL_HASH_ARGU_FID, u16Fid);

    // Read hash result
    SWREG_vReadU16(FWDCTL_HASH_VALUE, &u16HashResult);
    // SramAddr[15:4] == bucket_addr[11:0]
    return u16HashResult;
}


//
// Calculate InvCRC = { Index[11:0], TAG[35:0], FID[12:0] }
//
static UINT16 s_wInvCRCHash (UINT16 u16Index, UINT16 u16Fid, PUINT8 abyTag)
{
    UINT8    abyTmpBuf[MAC_ADDR_SIZE];
    UINT16  u16HashResult;
    UINT8   uu;


    STR_pvMemset(abyTmpBuf, 0, MAC_ADDR_SIZE);
    abyTmpBuf[0] = (UINT8)(u16Index);
    abyTmpBuf[1] = (UINT8)(u16Index >> 8);
    SWSRAM_vModifyBitsLtl(abyTmpBuf, MAC_MAP_MACADDR_TO_TAG_S, MAC_MAP_MACADDR_TO_TAG_E, abyTag);
    
    // Set mac address key value
    for (uu = 0; uu < MAC_ADDR_SIZE; uu++)
        SWREG_vWriteU8(FWDCTL_INVS_HASH_ARGU0 + uu, abyTmpBuf[uu]);
    // Set FID key value, write last byte will trigger calculation
    SWREG_vWriteU16(FWDCTL_INVS_HASH_ARGU0 + MAC_ADDR_SIZE, u16Fid);

    // Read hash result
    SWREG_vReadU16(FWDCTL_INVS_HASH_VALUE, &u16HashResult);
    // SA[15:4] == bucket_addr[11:0]
    return u16HashResult;
    
}


/*
 * Input : u16Indx: The index is a memory entry index, not a slot number.
 */
static void s_vGetCommonField (UINT16 u16Indx, PUINT8 pbySlot, SMacEntry* pSEntry)
{
    UINT8  abyTagBuf[MAC_ADDR_SIZE];

    
    // Get fid field
    SWSRAM_vExtractBits(pbySlot, MAC_BIT_FID_S, MAC_BIT_FID_E, (PUINT8)&pSEntry->u16Fid);   
    
    // Get mac address
    SWSRAM_vExtractBitsLtl(pbySlot, MAC_BIT_TAG_S, MAC_BIT_TAG_E, abyTagBuf);
    SWMACTB_vInvHash(u16Indx, pSEntry->u16Fid, abyTagBuf, pSEntry->abyMacAddr);
    //
    SWSRAM_vExtractBitsByBool(pbySlot, MAC_BIT_STATIC_S, MAC_BIT_STATIC_E, &pSEntry->bStatic);                     
    SWSRAM_vExtractBitsByBool(pbySlot, MAC_BIT_CAST_TYPE_S, MAC_BIT_CAST_TYPE_E, &(pSEntry->bTypeMcst));
    //
    if (TRUE == pSEntry->bStatic) {
        // static
        SWSRAM_vExtractBitsByBool(pbySlot, MAC_BIT_SEC_DRP_EXCP_S, MAC_BIT_SEC_DRP_EXCP_E, &pSEntry->bSecDropExcp);   
        SWSRAM_vExtractBitsByBool(pbySlot, MAC_BIT_DMAC_PRI_S, MAC_BIT_DMAC_PRI_E, &pSEntry->bPriDmac);   
        SWSRAM_vExtractBitsByBool(pbySlot, MAC_BIT_DMAC_REDIR_S, MAC_BIT_DMAC_REDIR_E, &pSEntry->bNotRedirDmac);    
    }
    else {
        // dynamic
        SWSRAM_vExtractBitsByByte(pbySlot, MAC_BIT_AGE_COUNT_S, MAC_BIT_AGE_COUNT_E, &(pSEntry->u8AgeCnt));        
    }
}


static void s_vSetCommonField (SMacEntry* pSEntry, PUINT8 pbySlot)
{
    UINT8    abyTagBuf[MAC_ADDR_SIZE];


    // Set tag field from mac address with all little endian
    SWSRAM_vExtractBitsLtl(pSEntry->abyMacAddr, 
                           MAC_MAP_MACADDR_TO_TAG_S,
                           MAC_MAP_MACADDR_TO_TAG_E,
                           abyTagBuf);
    
    SWSRAM_vModifyBitsLtl(pbySlot, MAC_BIT_TAG_S, MAC_BIT_TAG_E,
                          abyTagBuf);
    // Set static
    SWSRAM_vModifyBitsByBool(pbySlot, MAC_BIT_STATIC_S, MAC_BIT_STATIC_E, &pSEntry->bStatic);
    // Set cast type
    SWSRAM_vModifyBitsByBool(pbySlot, MAC_BIT_CAST_TYPE_S, MAC_BIT_CAST_TYPE_E, &pSEntry->bTypeMcst);
    //
    if (pSEntry->bStatic) {
        // static
        SWSRAM_vModifyBitsByBool(pbySlot, MAC_BIT_SEC_DRP_EXCP_S, MAC_BIT_SEC_DRP_EXCP_E, &pSEntry->bSecDropExcp);    
        SWSRAM_vModifyBitsByBool(pbySlot, MAC_BIT_DMAC_PRI_S, MAC_BIT_DMAC_PRI_E, &pSEntry->bPriDmac);    
        SWSRAM_vModifyBitsByBool(pbySlot, MAC_BIT_DMAC_REDIR_S, MAC_BIT_DMAC_REDIR_E, &pSEntry->bNotRedirDmac);
    }    
    else {
        // dynamic
        SWSRAM_vModifyBitsByByte(pbySlot, MAC_BIT_AGE_COUNT_S, MAC_BIT_AGE_COUNT_E, &pSEntry->u8AgeCnt);           
    }
    
    // Set FID field
    SWSRAM_vModifyBits(pbySlot, MAC_BIT_FID_S, MAC_BIT_FID_E, (PUINT8)&pSEntry->u16Fid);
}


static BOOL s_bCheckEmpty (PUINT8 pbySlot)
{
    // Check if dynamic entry
    if (!((pbySlot[3] & 0x08) == 0))
        return FALSE;   //entry is static
    
    // Entry is dynamic, then check if age-count is 0
    if (!((pbySlot[1] & 0xE0) == 0))    //age-count is not 0
        return FALSE;

    return TRUE;    
}

/************************************************************************
 * Find an available slot for insertion of PMAC slot
 * For each slot of the pbyEntryBuf, Check the following:
 * Static  bIsOverwirte
 * ----------------------------------------------
 *  0       0               Return this slot
 *  0       1               Return this slot
 *  1       0               Check next slot
 *  1       1               Return this slot
 ************************************************************************/
static BOOL s_bFindInsSlot (PUINT8 pbyEntryBuf, BOOL bIsOverWrite, UINT8 *pbySlotId)
{   
    BOOL bStatic;

    
    *pbySlotId = 0;
    // choose the slot 0 or slot 1
    SWSRAM_vExtractBitsByBool(pbyEntryBuf, MAC_BIT_STATIC_S, MAC_BIT_STATIC_E, &bStatic);    
    // check slot 0
    if (bStatic && !bIsOverWrite) {
        (*pbySlotId)++;
        SWSRAM_vExtractBitsByBool(pbyEntryBuf + (*pbySlotId) * 8, MAC_BIT_STATIC_S, MAC_BIT_STATIC_E, &bStatic);    
        // check slot 1
        if (bStatic && !bIsOverWrite)       
            return FALSE;
    }
    return TRUE;    
}


BOOL SWMACTB_bClearTblNonStaticEntry(void)
{
    BOOL        bRet;


    SWREG_vWriteU16(FWDCTL_SCAN_CMD_MV_FRM_FID, 0);
    SWREG_vWriteU8(FWDCTL_SCAN_CMD_MV_FRM_PORT, 0);
    SWREG_vWriteU8(FWDCTL_SCAN_CMD, SCAN_CMD_SELECT_CLR);
    bRet = SWREG_bWaitStatus(FWDCTL_SCAN_STATUS, SCAN_STATUS_BUSY, FALSE);

    return bRet;
}

⌨️ 快捷键说明

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