📄 swpmactb.c
字号:
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 + -