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

📄 tclcmd.c

📁 vt6528芯片交换机API函数和文档运行程序
💻 C
📖 第 1 页 / 共 5 页
字号:
        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 + -