📄 tclcmd.c
字号:
STR_pvMemset(&SEntry, 0, sizeof(STcamEntry));
SEntry.u8DmacType = STR_u32StrDecToU32(aszArgus[3]); // bit 127~126
SEntry.bTcpSynBit = STR_u32StrDecToU32(aszArgus[4]); // bit 125
SEntry.bVlanTag = STR_u32StrDecToU32(aszArgus[5]); // bit 124
SEntry.u16Vid = STR_u32StrDecToU32(aszArgus[6]); // bit 123~112
SEntry.bIpv4 = STR_u32StrHexToU32(aszArgus[7]); // bit 111
SEntry.bIpHd20Oct = STR_u32StrDecToU32(aszArgus[8]); // bit 110
SEntry.bIpFrag = STR_u32StrDecToU32(aszArgus[9]); // bit 109
SEntry.u8PortId = STR_u32StrDecToU32(aszArgus[10]); // bit 108~104
SEntry.UCfg13B.SIpv4Fld.u8IpProto = STR_u32StrHexToU32(aszArgus[11]); // bit 103~96
SEntry.UCfg13B.SIpv4Fld.u32SrcIp = STR_u32StrHexToU32(aszArgus[12]); // bit 95~64
SEntry.UCfg13B.SIpv4Fld.u32DstIp = STR_u32StrHexToU32(aszArgus[13]); // bit 63~32
SEntry.UCfg13B.SIpv4Fld.u32IpOption = STR_u32StrHexToU32(aszArgus[14]); // bit 31~0
SWTCAM_bInsEntry(u8EntryIdx, &SEntry, 0);
TTY_vPutStr("success.\r");
}
else if (0 == STR_iStrcmp("del", pszOp))
{
SWTCAM_bDelEntry(u8EntryIdx);
TTY_vPutStr("success.\r");
}
} /* end s_vTcam */
/************************************************************************
* TCAM_MASK table command.
* param[01] : read/write/del
* param[02] : entry index (hex)
* param[03] (write): dmac type
* param[04] (write): tcp syn
* param[05] (write): vlan tag
* param[06] (write): vid (dec)
* param[07] (write): ipv4
* param[08] (write): ipv4 length
* param[09] (write): ip fragment
* param[10] (write): port id (dec)
* param[11] (write): ip protocol (hex)
* param[12] (write): source ip
* param[13] (write): destination ip
* param[14] (write): ip option
************************************************************************/
static void
s_vTcamMask (char aszArgus[][ARGU_SIZE])
{
char aszOutBuf[MAX_BUF_SIZE];
char *pszOp, *pszBuf = aszOutBuf;
UINT8 u8EntryIdx;
STcamEntry SEntry;
//BOOL bIsIpv4 = TRUE;
// check arguments
if (!s_bCheckArgus(&aszArgus[1], 2)) {
return;
}
pszOp = aszArgus[1];
u8EntryIdx = STR_u32StrHexToU32(aszArgus[2]);
if (0 == STR_iStrcmp("read", pszOp)) {
if (FALSE == SWTCAM_bGetEntry(u8EntryIdx, &SEntry, 1))
{
TTY_vPutStr("fail: entry invalid.\r");
return;
}
else {
STR_pvMemset(pszBuf, 0, MAX_BUF_SIZE);
pszBuf += STR_iU32ToStrDec(pszBuf, SEntry.u8DmacType); APPEND_SPACE(pszBuf); // bit 127~126
pszBuf += STR_iU32ToStrDec(pszBuf, SEntry.bTcpSynBit); APPEND_SPACE(pszBuf); // bit 125
pszBuf += STR_iU32ToStrDec(pszBuf, SEntry.bVlanTag); APPEND_SPACE(pszBuf); // bit 124
pszBuf += STR_iU32ToStrDec(pszBuf, SEntry.u16Vid); APPEND_SPACE(pszBuf); // bit 123~112
pszBuf += STR_iU32ToStrDec(pszBuf, SEntry.bIpv4); APPEND_SPACE(pszBuf); // bit 111
pszBuf += STR_iU32ToStrDec(pszBuf, SEntry.bIpHd20Oct); APPEND_SPACE(pszBuf); // bit 110
pszBuf += STR_iU32ToStrDec(pszBuf, SEntry.bIpFrag); APPEND_SPACE(pszBuf); // bit 109
pszBuf += STR_iU32ToStrDec(pszBuf, SEntry.u8PortId); APPEND_SPACE(pszBuf); // bit 108~104
pszBuf += STR_iU32ToStrHexPad(pszBuf, SEntry.UCfg13B.SIpv4Fld.u8IpProto, 2);APPEND_SPACE(pszBuf); // bit 103~96
pszBuf += STR_iU32ToStrHexPad(pszBuf, SEntry.UCfg13B.SIpv4Fld.u32SrcIp, 8); APPEND_SPACE(pszBuf); // bit 95~64
pszBuf += STR_iU32ToStrHexPad(pszBuf, SEntry.UCfg13B.SIpv4Fld.u32DstIp, 8); APPEND_SPACE(pszBuf); // bit 63~32
pszBuf += STR_iU32ToStrHexPad(pszBuf, SEntry.UCfg13B.SIpv4Fld.u32IpOption, 8); // bit 31~0
TTY_vPutStr(STR_pszStrcatchr(aszOutBuf, '\r'));
}
}
else if (0 == STR_iStrcmp("write", pszOp)) {
// check arguments
if (!s_bCheckArgus(&aszArgus[1], 14)) {
return;
}
STR_pvMemset(&SEntry, 0, sizeof(STcamEntry));
SEntry.u8DmacType = STR_u32StrDecToU32(aszArgus[3]); // bit 127~126
SEntry.bTcpSynBit = STR_u32StrDecToU32(aszArgus[4]); // bit 125
SEntry.bVlanTag = STR_u32StrDecToU32(aszArgus[5]); // bit 124
SEntry.u16Vid = STR_u32StrDecToU32(aszArgus[6]); // bit 123~112
SEntry.bIpv4 = STR_u32StrHexToU32(aszArgus[7]); // bit 111
SEntry.bIpHd20Oct = STR_u32StrDecToU32(aszArgus[8]); // bit 110
SEntry.bIpFrag = STR_u32StrDecToU32(aszArgus[9]); // bit 109
SEntry.u8PortId = STR_u32StrDecToU32(aszArgus[10]); // bit 108~104
SEntry.UCfg13B.SIpv4Fld.u8IpProto = STR_u32StrHexToU32(aszArgus[11]); // bit 103~96
SEntry.UCfg13B.SIpv4Fld.u32SrcIp = STR_u32StrHexToU32(aszArgus[12]); // bit 95~64
SEntry.UCfg13B.SIpv4Fld.u32DstIp = STR_u32StrHexToU32(aszArgus[13]); // bit 63~32
SEntry.UCfg13B.SIpv4Fld.u32IpOption = STR_u32StrHexToU32(aszArgus[14]); // bit 31~0
SWTCAM_bInsEntry(u8EntryIdx, &SEntry, 1);
TTY_vPutStr("success.\r");
}
else if (0 == STR_iStrcmp("del", pszOp))
{
SWTCAM_bDelEntry(u8EntryIdx);
TTY_vPutStr("success.\r");
}
} /* end s_vTcamMask */
#else /* #if (NEW_TCAM_CMD) */
// TCAM table command.
// 1st param : read/write/del
// 2nd param : 0 is rule table, 1 is mask table
// 3rd param : entry index (hex)
// 4th param (write): dmac type
// 5th param (write): tcp syn
// 6th param (write): vlan tag
// 7th param (write): vid (dec)
// 8th param (write): ipv4
// 9th param (write): ipv4 length
// 10th param (write): ip fragment
// 11th param (write): port id (dec)
// 12th param (write): ip protocol (hex)
// 13th param (write): source ip
// 14th param (write): destination ip
// 15th param (write): ip option
static void s_vTcamTb (char aszArgus[][ARGU_SIZE])
{
char aszOutBuf[MAX_BUF_SIZE];
char *pszOp, *pszBuf = aszOutBuf;
BOOL bMaskTbl;
UINT8 u8EntryIdx;
STcamEntry SEntry;
//BOOL bIsIpv4 = TRUE;
// check arguments
if (!s_bCheckArgus(&aszArgus[1], 3)) {
return;
}
pszOp = aszArgus[1];
bMaskTbl = STR_u32StrHexToU32(aszArgus[2]);
u8EntryIdx = STR_u32StrHexToU32(aszArgus[3]);
if (0 == STR_iStrcmp("read", pszOp)) {
#if 0
if (!bMaskTbl)
TTY_vPutStr("1,0,0,0,1,1,1,0,1,0080,11223344,77889900,AABBCCDD\r");
else
TTY_vPutStr("0,0,0,1,1,1,0,1,0080,11223344,77889900,AABBCCDD\r");
#endif
if (FALSE == SWTCAM_bGetEntry(u8EntryIdx, &SEntry, bMaskTbl)) {
TTY_vPutStr("fail: entry invalid.\r");
return;
}
else {
STR_pvMemset(pszBuf, 0, MAX_BUF_SIZE);
pszBuf += STR_iU32ToStrDec(pszBuf, SEntry.u8DmacType); APPEND_SPACE(pszBuf); // bit 127~126
pszBuf += STR_iU32ToStrDec(pszBuf, SEntry.bTcpSynBit); APPEND_SPACE(pszBuf); // bit 125
pszBuf += STR_iU32ToStrDec(pszBuf, SEntry.bVlanTag); APPEND_SPACE(pszBuf); // bit 124
pszBuf += STR_iU32ToStrDec(pszBuf, SEntry.u16Vid); APPEND_SPACE(pszBuf); // bit 123~112
pszBuf += STR_iU32ToStrDec(pszBuf, SEntry.bIpv4); APPEND_SPACE(pszBuf); // bit 111
pszBuf += STR_iU32ToStrDec(pszBuf, SEntry.bIpHd20Oct); APPEND_SPACE(pszBuf); // bit 110
pszBuf += STR_iU32ToStrDec(pszBuf, SEntry.bIpFrag); APPEND_SPACE(pszBuf); // bit 109
pszBuf += STR_iU32ToStrDec(pszBuf, SEntry.u8PortId); APPEND_SPACE(pszBuf); // bit 108~104
pszBuf += STR_iU32ToStrHexPad(pszBuf, SEntry.UCfg13B.SIpv4Fld.u8IpProto, 2);APPEND_SPACE(pszBuf); // bit 103~96
pszBuf += STR_iU32ToStrHexPad(pszBuf, SEntry.UCfg13B.SIpv4Fld.u32SrcIp, 8); APPEND_SPACE(pszBuf); // bit 95~64
pszBuf += STR_iU32ToStrHexPad(pszBuf, SEntry.UCfg13B.SIpv4Fld.u32DstIp, 8); APPEND_SPACE(pszBuf); // bit 63~32
pszBuf += STR_iU32ToStrHexPad(pszBuf, SEntry.UCfg13B.SIpv4Fld.u32IpOption, 8); // bit 31~0
TTY_vPutStr(STR_pszStrcatchr(aszOutBuf, '\r'));
}
}
else if (0 == STR_iStrcmp("write", pszOp)) {
// check arguments
if (!s_bCheckArgus(&aszArgus[4], 12)) {
return;
}
STR_pvMemset(&SEntry, 0, sizeof(STcamEntry));
SEntry.u8DmacType = STR_u32StrDecToU32(aszArgus[4]); // bit 127~126
SEntry.bTcpSynBit = STR_u32StrDecToU32(aszArgus[5]); // bit 125
SEntry.bVlanTag = STR_u32StrDecToU32(aszArgus[6]); // bit 124
SEntry.u16Vid = STR_u32StrDecToU32(aszArgus[7]); // bit 123~112
SEntry.bIpv4 = STR_u32StrHexToU32(aszArgus[8]); // bit 111
SEntry.bIpHd20Oct = STR_u32StrDecToU32(aszArgus[9]); // bit 110
SEntry.bIpFrag = STR_u32StrDecToU32(aszArgus[10]); // bit 109
SEntry.u8PortId = STR_u32StrDecToU32(aszArgus[11]); // bit 108~104
SEntry.UCfg13B.SIpv4Fld.u8IpProto = STR_u32StrHexToU32(aszArgus[12]); // bit 103~96
SEntry.UCfg13B.SIpv4Fld.u32SrcIp = STR_u32StrHexToU32(aszArgus[13]); // bit 95~64
SEntry.UCfg13B.SIpv4Fld.u32DstIp = STR_u32StrHexToU32(aszArgus[14]); // bit 63~32
SEntry.UCfg13B.SIpv4Fld.u32IpOption = STR_u32StrHexToU32(aszArgus[15]); // bit 31~0
#if 0 //test API SWTCAM_vMskEntry() SWTCAM_vUnMskEntry() for IPv4 entry.
SWTCAM_vMskEntry(&SEntry, bIsIpv4, MSK_DMAC_TYPE|MSK_TCP_SYN|MSK_VLAN_TYPE|MSK_IP_FRG|MSK_IP_PROTO|MSK_DST_IP, 0);
//TYPE 1 2 3 4 5 6 7 8 9 10 11 12
//Msk x x x x x x
//Value 0 0 0 0 0 00000000
SWTCAM_vUnMskEntry(&SEntry, bIsIpv4, MSK_VID|MSK_IPV4|MSK_IPV4_LEN|MSK_PORT_ID|MSK_SRC_IP|MSK_L4, 0);
//TYPE 1 2 3 4 5 6 7 8 9 10 11 12
//UnMsk x x x x x x
//Value FFF 1 1 1F FFFFFFFF FFFFFFFF
#endif
SWTCAM_bInsEntry(u8EntryIdx, &SEntry, bMaskTbl);
TTY_vPutStr("success.\r");
}
else if (0 == STR_iStrcmp("del", pszOp)) {
SWTCAM_bDelEntry(u8EntryIdx);
TTY_vPutStr("success.\r");
}
}
#endif /* #if (NEW_TCAM_CMD) */
// TCAM table command.(test for not IPv4 entry)
// 1st param : read/write/del
// 2nd param : 0 is rule table, 1 is mask table
// 3rd param : entry index
// 4th param (write): valid (always 1, Weipin test case has this field)
// 5th param (write): dmac type
// 6th param (write): tcp syn
// 7th param (write): vlan tag
// 8th param (write): vid (dec)
// 9th param (write): ipv4
// 10th param (write): ipv4 length
// 11th param (write): ip fragment
// 12th param (write): port id (dec)
// 13th param (write): 1st byte(hex)
// 14th param (write): 2nd byte(hex)
// 15th param (write): 3rd byte(hex)
// 16th param (write): 4th byte(hex)
// 17th param (write): 5th byte(hex)
// 18th param (write): 6th byte(hex)
// 19th param (write): 7th byte(hex)
// 20th param (write): 8th byte(hex)
// 21th param (write): 9th byte(hex)
// 22th param (write): 10th byte(hex)
// 23th param (write): 11th byte(hex)
// 24th param (write): 12th byte(hex)
// 25th param (write): 13th byte(hex)
static void s_vTcamTbNonIpv4 (char aszArgus[][ARGU_SIZE])
{
char aszOutBuf[MAX_BUF_SIZE];
char *pszOp, *pszBuf = aszOutBuf;
BOOL bMaskTbl;
UINT8 u8EntryIdx, uu;
STcamEntry SEntry;
//BOOL bIsIpv4 = FALSE;
// check arguments
if (!s_bCheckArgus(&aszArgus[1], 3)) {
return;
}
pszOp = aszArgus[1];
bMaskTbl = STR_u32StrHexToU32(aszArgus[2]);
u8EntryIdx = STR_u32StrHexToU32(aszArgus[3]);
if (0 == STR_iStrcmp("read", pszOp)) {
if (FALSE == SWTCAM_bGetEntry(u8EntryIdx, &SEntry, bMaskTbl)) {
TTY_vPutStr("fail: entry invalid.\r");
return;
}
else {
STR_pvMemset(pszBuf, 0, MAX_BUF_SIZE);
pszBuf += STR_iU32ToStrDec(pszBuf, SEntry.u8DmacType); APPEND_SPACE(pszBuf); // bit 127~126
pszBuf += STR_iU32ToStrDec(pszBuf, SEntry.bTcpSynBit); APPEND_SPACE(pszBuf); // bit 125
pszBuf += STR_iU32ToStrDec(pszBuf, SEntry.bVlanTag); APPEND_SPACE(pszBuf); // bit 124
pszBuf += STR_iU32ToStrDec(pszBuf, SEntry.u16Vid); APPEND_SPACE(pszBuf); // bit 123~112
pszBuf += STR_iU32ToStrDec(pszBuf, SEntry.bIpv4); APPEND_SPACE(pszBuf); // bit 111
pszBuf += STR_iU32ToStrDec(pszBuf, SEntry.bIpHd20Oct); APPEND_SPACE(pszBuf); // bit 110
pszBuf += STR_iU32ToStrDec(pszBuf, SEntry.bIpFrag); APPEND_SPACE(pszBuf); // bit 109
pszBuf += STR_iU32ToStrDec(pszBuf, SEntry.u8PortId); APPEND_SPACE(pszBuf); // bit 108~104
#if defined(__LITTLE_ENDIAN)
SWSRAM_vEndianConvert(&SEntry.UCfg13B.au8AftSV[1],4);
SWSRAM_vEndianConvert(&SEntry.UCfg13B.au8AftSV[5],4);
SWSRAM_vEndianConvert(&SEntry.UCfg13B.au8AftSV[9],4);
#endif
for (uu=0 ; uu < 13 ; uu++)
pszBuf += STR_iU32ToStrHexPad(pszBuf, SEntry.UCfg13B.au8AftSV[uu], 2); // bit 103~0
TTY_vPutStr(STR_pszStrcatchr(aszOutBuf, '\r'));
}
}
else if (0 == STR_iStrcmp("write", pszOp)) {
// check arguments
if (!s_bCheckArgus(&aszArgus[4], 22)) {
return;
}
STR_pvMemset(&SEntry, 0, sizeof(SVlanEntry));
SEntry.u8DmacType = STR_u32StrDecToU32(aszArgus[5]); // bit 127~126
SEntry.bTcpSynBit = STR_u32StrDecToU32(aszArgus[6]); // bit 125
SEntry.bVlanTag = STR_u32StrDecToU32(aszArgus[7]); // bit 124
SEntry.u16Vid = STR_u32StrDecToU32(aszArgus[8]); // bit 123~112
SEntry.bIpv4 = STR_u32StrHexToU32(aszArgus[9]); // bit 111
SEntry.bIpHd20Oct = STR_u32StrDecToU32(aszArgus[10]); // bit 110
SEntry.bIpFrag = STR_u32StrDecToU32(aszArgus[11]); // bit 109
SEntry.u8PortId = STR_u32StrDecToU32(aszArgus[12]); // bit 108~104
for (uu=0 ; uu < 13 ; uu++)
SEntry.UCfg13B.au8AftSV[uu] = STR_u32StrHexToU32(aszArgus[uu+13]);// bit 103~0
#if defined(__LITTLE_ENDIAN)
SWSRAM_vEndianConvert(&SEntry.UCfg13B.au8AftSV[1],4);
SWSRAM_vEndianConvert(&SEntry.UCfg13B.au8AftSV[5],4);
SWSRAM_vEndianConvert(&SEntry.UCfg13B.au8AftSV[9],4);
#endif
#if 0 //test API SWTCAM_vMskEntry() SWTCAM_vUnMskEntry() for not IPv4 entry.
SWTCAM_vMskEntry(&SEntry, bIsIpv4, MSK_DMAC_TYPE|MSK_TCP_SYN|MSK_VLAN_TYPE|MSK_IP_FRG, 0x0587);
//TYPE 1 2 3 4 5 6 7 8
//Msk x x x x
//Value 0 0 0 0
//Msk Byte Number: byte0,1,2,7,8,10
SWTCAM_vUnMskEntry(&SEntry, bIsIpv4, MSK_VID|MSK_IPV4|MSK_IPV4_LEN|MSK_PORT_ID, 0x1A78);
//TYPE 1 2 3 4 5 6 7 8
//UnMsk x
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -