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

📄 cgi_set.c

📁 vt6528芯片交换机API函数和文档运行程序
💻 C
📖 第 1 页 / 共 3 页
字号:
    // save config
    if (WEBg_SCgiInfo.apszParaVal[0][0] == 'A')
        u8Tmp = PISMACGP_byInsGrp(WEBg_pSSMacPage);
    else
        u8Tmp = PISMACGP_byEditGrp(WEBg_pSSMacPage);

    // return message
    return WEB_wGenResultMsgPkt(g_aszErrMsg[u8Tmp]);
}


//Only in web case: for cgi ParaVal => the char ':' will transfer into "%3A", so it must parse "%3A" back to ':'
//for one char ':' will become 3 chars "%3A", so the max string len will become 27
static void s_vParseMacFromParaVal (char* pstrParaBuff, char* pstrMacBuff)
{
    UINT8    si = 0, u8Cnt = 0;
    
    while (si < 27) {
        if (pstrParaBuff[si] == '%') {
            si += 3;        
            pstrMacBuff[u8Cnt] = ':';
        }
        else {
            pstrMacBuff[u8Cnt] = pstrParaBuff[si];          
            si++;
        }
        u8Cnt ++;
    }        
}


// to set gmrp mode and delete gmrp groups
UINT16 CGI_wSetGMRPCfg (void)
{
    UINT8        byRes, u8Tmp;
    UINT16      si, u16Tmp;
    char        astrDelGrpMacList[SWITCH_GMRP_GRP_NUM*(MAC_STRING_LEN+1)];        
    UINT16      awDelGrpFidList[SWITCH_GMRP_GRP_NUM];                      

    if (WEBg_SCgiInfo.u16ParaNum == 0)
        return WEB_wGenResultMsgPkt(s_szParaNumErr);

    STR_pvMemset(astrDelGrpMacList, 0, SWITCH_GMRP_GRP_NUM*(MAC_STRING_LEN+1)*sizeof(char));
    STR_pvMemset(awDelGrpFidList, 0, SWITCH_GMRP_GRP_NUM*sizeof(UINT16));

    PIGMRP_vInitPage(WEBg_pSGMRPPage);

    // change gmrp mode
    u8Tmp = STR_u32StrDecToU32(WEBg_SCgiInfo.apszParaVal[0]);
    if (WEBg_pSGMRPPage->byMode != u8Tmp)
    {
        WEBg_pSGMRPPage->byMode = u8Tmp;
        PIGMRP_vSetGMRPMode(WEBg_pSGMRPPage);
        // reload gmrp.htm
        return WEB_wGenRedirectPkt("ShowGMRPCfg");
    }
    else {
        if (!u8Tmp)     //disable
            // reload gmrp.htm
            return WEB_wGenRedirectPkt("ShowGMRPCfg");
    }
        
    // delete selected gmrp groups
    if (WEBg_SCgiInfo.u16ParaNum == 1)
        return WEB_wGenResultMsgPkt("Nothing to delete");

    //firstly save orig del grp value in buffer 
    for (si=1; si<WEBg_SCgiInfo.u16ParaNum; si++) {
        u16Tmp = STR_u32StrDecToU32(WEBg_SCgiInfo.apszParaVal[si]);
        STR_iStrcpy(astrDelGrpMacList+(si-1)*(MAC_STRING_LEN+1), WEBg_pSGMRPPage->astrGrpMacList+u16Tmp*(MAC_STRING_LEN+1));
        awDelGrpFidList[si-1] = WEBg_pSGMRPPage->awValidGrpFidList[u16Tmp];                
    }

    for (si=1; si<WEBg_SCgiInfo.u16ParaNum; si++) {
        STR_iStrcpy(WEBg_pSGMRPPage->SCurGrp.azMacAddr, astrDelGrpMacList+(si-1)*(MAC_STRING_LEN+1));
        WEBg_pSGMRPPage->SCurGrp.u16Fid = awDelGrpFidList[si-1];        

        byRes = PIGMRP_byDelGrp(WEBg_pSGMRPPage);
        if (byRes != OP_OK) 
            return WEB_wGenResultMsgPkt(g_aszErrMsg[byRes]);
    }

    // return successive message
    return WEB_wGenResultMsgPkt(g_aszErrMsg[OP_OK]);
}


UINT16 CGI_wSetGMRPGrp (void)
{
    UINT8    si, u8Tmp;
    char    astrBuff[28];

    if (WEBg_SCgiInfo.u16ParaNum != g_byLogIdNum+5)
        return WEB_wGenResultMsgPkt(s_szParaNumErr);

    PIGMRP_vInitPage(WEBg_pSGMRPPage);
    STR_pvMemset(&WEBg_pSGMRPPage->SCurGrp, 0, sizeof(SGmrpEntryPage));

    STR_pszStrcpy(astrBuff, WEBg_SCgiInfo.apszParaVal[1]);    
    s_vParseMacFromParaVal(astrBuff, WEBg_pSGMRPPage->SCurGrp.azMacAddr);
    WEBg_pSGMRPPage->SCurGrp.u16Fid = STR_u32StrDecToU32(WEBg_SCgiInfo.apszParaVal[2]);
    //for console ui, bool value must be 0x00000000 or 0x01000000 for Big-Endian
    (*((PUINT8)&WEBg_pSGMRPPage->SCurGrp.bHiPriDmac)) = (UINT8)STR_u32StrDecToU32(WEBg_SCgiInfo.apszParaVal[3]);
    (*((PUINT8)&WEBg_pSGMRPPage->SCurGrp.bHiPriSmac)) = (UINT8)STR_u32StrDecToU32(WEBg_SCgiInfo.apszParaVal[4]);

    // get member
    for (si=0; si<g_byLogIdNum; si++)
    {
        u8Tmp = STR_u32StrDecToU32(WEBg_SCgiInfo.apszParaVal[si+5]) & 0x01;
        WEBg_pSGMRPPage->SCurGrp.abyMbrMsk[si/8] |= (u8Tmp << (si%8));  // Beware of endian
    }

    // save config
    if (WEBg_SCgiInfo.apszParaVal[0][0] == 'A')
        u8Tmp = PIGMRP_byInsGrp(WEBg_pSGMRPPage);
    else
        u8Tmp = PIGMRP_byEditGrp(WEBg_pSGMRPPage);

    // return message
    return WEB_wGenResultMsgPkt(g_aszErrMsg[u8Tmp]);
}


UINT16 CGI_wSet8021XCfg (void)
{    
    UINT8 si, u8Tmp;
    
    if (WEBg_SCgiInfo.u16ParaNum < 2)
        return WEB_wGenResultMsgPkt(s_szParaNumErr);

    STR_pvMemset(WEBg_pS8021XPage, 0, sizeof(S8021XPageCfg));

    WEBg_pS8021XPage->byMode = STR_u32StrDecToU32(WEBg_SCgiInfo.apszParaVal[0]);
    for (si = 0; si < g_byLogIdNum; si++)
    {
        u8Tmp = STR_u32StrDecToU32(WEBg_SCgiInfo.apszParaVal[si+1]);
        WEBg_pS8021XPage->abySecPortMsk[si/8] |= (u8Tmp << (si%8));  // Beware of endian
    }

    u8Tmp = PI8021X_bySavePage(WEBg_pS8021XPage);

    return WEB_wGenResultMsgPkt(g_aszErrMsg[u8Tmp]);
}


UINT16 CGI_wSetPrvMiscCfg (void)
{

    if (WEBg_SCgiInfo.u16ParaNum != 2)
        return WEB_wGenResultMsgPkt(s_szParaNumErr);

    WEBg_pSPrvMiscPage->byLacpMode = STR_u32StrDecToU32(WEBg_SCgiInfo.apszParaVal[0]);
    WEBg_pSPrvMiscPage->byGVRPMode = STR_u32StrDecToU32(WEBg_SCgiInfo.apszParaVal[1]);

    PIPROVMISC_bySavePage(WEBg_pSPrvMiscPage);

    // return successive message
    return WEB_wGenResultMsgPkt(g_aszErrMsg[OP_OK]);

}


//Added by Tim Feng
#define pSCurGrp (&WEBg_pSACLPage->SCurGrp)

#define WEB_ACL_L4PROTO_PARAM_START_INDEX  14
#define WEB_ACL_L4PROTO_PARAM_END_INDEX  21

UINT16 CGI_wSetACLCfg(void)
{
    UINT8     si;
    UINT8     byTmp = 0;
    UINT16    u16Tmp;
    BOOL      bIsOpDel=0;
    BOOL      byErrCode;
    char      aszTmpBuf[] = "RL4Proto"; 
        
    
    PIACL_vInitPage(WEBg_pSACLPage, TRUE, FALSE);   //Get all  groups of ACL from eeprom

    if (WEBg_SCgiInfo.apszParaVal[WEBg_SCgiInfo.u16ParaNum-1][0] == 'D') {     //Delete operation
        if (WEBg_SCgiInfo.u16ParaNum < 22)
            return WEB_wGenResultMsgPkt(s_szParaNumErr);
        
        bIsOpDel = TRUE;
        pSCurGrp->u8GrpId=(UINT8)STR_u32StrDecToU32(WEBg_SCgiInfo.apszParaVal[21]);
    }
    else if (WEBg_SCgiInfo.apszParaVal[WEBg_SCgiInfo.u16ParaNum-1][0] == 'A') {   //Add operation
        if (WEBg_SCgiInfo.u16ParaNum < 21)
            return WEB_wGenResultMsgPkt(s_szParaNumErr);     

        bIsOpDel = FALSE;
    }
    else
        return WEB_wGenResultMsgPkt(s_szParaNumErr);

    
    if (bIsOpDel) {     //If Delete a Group
        byErrCode = PIACL_byDelGrp(WEBg_pSACLPage);
        //return Operation result message.
        return WEB_wGenResultMsgPkt(g_aszErrMsg[byErrCode]);
    }
    else {    //Add a new Group
        STR_pvMemset(pSCurGrp, 0, sizeof(SACLGrpPageCfg));
        
        //First get Group id. Here must check weather the Group Id of new group bigger than UINT8_MAX 
        //because the memory for Group id in struct SACLIpv4GrpPageCfg is 1 byte.
        u16Tmp = (UINT16)STR_u32StrDecToU32(WEBg_SCgiInfo.apszParaVal[0]);
        if (u16Tmp > UINT8_MAX)
            return WEB_wGenResultMsgPkt(g_aszErrMsg[ACL_OP_GID_INVALID]);
        else
            pSCurGrp->u8GrpId = (UINT8)u16Tmp;

        //Get action
        pSCurGrp->bFilter = (BOOL)STR_u32StrDecToU32(WEBg_SCgiInfo.apszParaVal[1]);

        //Get VidEn
        pSCurGrp->bVidEn = (BOOL)STR_u32StrDecToU32(WEBg_SCgiInfo.apszParaVal[2]); 

        //Get Vid
        pSCurGrp->u16Vid = (UINT16)STR_u32StrDecToU32(WEBg_SCgiInfo.apszParaVal[3]); 

        //Get packet type
        pSCurGrp->bIsIpv4 = (BOOL)STR_u32StrDecToU32(WEBg_SCgiInfo.apszParaVal[4]); 

        //Handle Ipv4 Group configuration and Non-Ipv4 Group configuration
        if (pSCurGrp->bIsIpv4) {
            struct SACLIpv4GrpPageCfg*  pSACLIpv4GrpPgBuf = (struct SACLIpv4GrpPageCfg*)&pSCurGrp->UACLPageCfgBuf;

            //Get Src IP and Mask
            pSACLIpv4GrpPgBuf->bSIpEn = (BOOL)STR_u32StrDecToU32(WEBg_SCgiInfo.apszParaVal[5]);
            STR_pszStrcpy(pSACLIpv4GrpPgBuf->szSIp, WEBg_SCgiInfo.apszParaVal[6]);
            STR_pszStrcpy(pSACLIpv4GrpPgBuf->szSIpMsk, WEBg_SCgiInfo.apszParaVal[7]);

            ////Get Dst IP and Mask. Something to be note:Param[8] and Param[9] is for the Ehter Type Because of UI.
            pSACLIpv4GrpPgBuf->bDIpEn = (BOOL)STR_u32StrDecToU32(WEBg_SCgiInfo.apszParaVal[10]);
            STR_pszStrcpy(pSACLIpv4GrpPgBuf->szDIp , WEBg_SCgiInfo.apszParaVal[11]);
            STR_pszStrcpy(pSACLIpv4GrpPgBuf->szDIpMsk , WEBg_SCgiInfo.apszParaVal[12]);

            //Get Ip fragment
            pSACLIpv4GrpPgBuf->bFragCheck = (BOOL)STR_u32StrDecToU32(WEBg_SCgiInfo.apszParaVal[13]);

            //Get L4 protocol
            u16Tmp = sizeof(aszTmpBuf) - 1;
            for (si = WEB_ACL_L4PROTO_PARAM_START_INDEX; si < WEB_ACL_L4PROTO_PARAM_END_INDEX; si++) {
                if (0 == STR_iMemcmp(WEBg_SCgiInfo.apszParaVal[si], aszTmpBuf, u16Tmp) ) {
                    byTmp = WEBg_SCgiInfo.apszParaVal[si][u16Tmp];//Get next char of "RL4Proto" to decide configuration is TCP,UDP or Other L4 proto
                    break;
                }
            }   
            switch (byTmp) {
                case 'O':    
                    pSACLIpv4GrpPgBuf->byL4ProtoIndex = (UINT8)STR_u32StrDecToU32(WEBg_SCgiInfo.apszParaVal[si+1]);     
                    pSACLIpv4GrpPgBuf->u16L4Proto = (UINT16)STR_u32StrDecToU32(WEBg_SCgiInfo.apszParaVal[si+2]);;
                    break;

                case 'T':                                    
                    pSACLIpv4GrpPgBuf->u16L4Proto = L4_PROTOCOL_TCP ;
                                
                    pSACLIpv4GrpPgBuf->byTcpPortIndex = (UINT8)STR_u32StrDecToU32(WEBg_SCgiInfo.apszParaVal[si+1]);
                    pSACLIpv4GrpPgBuf->u32TcpPort = (UINT32)STR_u32StrDecToU32(WEBg_SCgiInfo.apszParaVal[si+2]);
                    break;     

                case 'U':  
                    pSACLIpv4GrpPgBuf->u16L4Proto = L4_PROTOCOL_UDP ;
                            
                    pSACLIpv4GrpPgBuf->byUdpPortIndex = (UINT8)STR_u32StrDecToU32(WEBg_SCgiInfo.apszParaVal[si+1]);
                    pSACLIpv4GrpPgBuf->u32UdpPort = (UINT32)STR_u32StrDecToU32(WEBg_SCgiInfo.apszParaVal[si+2]);
                    break;
                    
                default:
                    return WEB_wGenResultMsgPkt(s_szParaNumErr);
            }    
            
        }
        
        else {  
            struct SACLNonIpv4GrpPageCfg*  pSACLNonIpv4GrpPgBuf = (struct SACLNonIpv4GrpPageCfg*)&pSCurGrp->UACLPageCfgBuf;


            pSACLNonIpv4GrpPgBuf->byEthProtoIndex = (UINT8)STR_u32StrDecToU32(WEBg_SCgiInfo.apszParaVal[8]);
            pSACLNonIpv4GrpPgBuf->wEthType = (UINT16)STR_u32StrHexToU32(WEBg_SCgiInfo.apszParaVal[9]);
        }

        byErrCode = PIACL_byInsGrp(WEBg_pSACLPage);

        //return Operation result message.
        return WEB_wGenResultMsgPkt(g_aszErrMsg[byErrCode]);
    }
}

#define MAC_SIZE_IN_WEB_PARAM    (27)
UINT16 CGI_wSetSMACFltCfg (void)
{
    char    astrBuff[MAC_SIZE_IN_WEB_PARAM + 1];
    UINT8  bySMACFltMode;
    UINT8  byErrCode;
    UINT8    byParamIdx = 0;


    PIMACFLT_vInitPage(WEBg_pSMacFltPage);

    if (WEBg_SCgiInfo.u16ParaNum  == 1) {         
        bySMACFltMode = (UINT8)STR_u32StrDecToU32(WEBg_SCgiInfo.apszParaVal[0]);
        if (bySMACFltMode == WEBg_pSMacFltPage->bySMACFltMode)
            return WEB_wGenRedirectPkt("ShowSMACFltCfg"); 

        WEBg_pSMacFltPage->bySMACFltMode = bySMACFltMode;
        PIMACFLT_vSetSMACFltMode(WEBg_pSMacFltPage);
        return WEB_wGenResultMsgPkt(g_aszErrMsg[OP_OK]);
    }
    
    if (WEBg_SCgiInfo.apszParaVal[WEBg_SCgiInfo.u16ParaNum - 1][0] == 'A') {    //Operation is add a group
        
        STR_pszStrcpy(astrBuff, WEBg_SCgiInfo.apszParaVal[byParamIdx ++]);    
        s_vParseMacFromParaVal(astrBuff, WEBg_pSMacFltPage->SCurGrp.azMacAddr);
        
        WEBg_pSMacFltPage->SCurGrp.u16Fid = (UINT16)STR_u32StrDecToU32(WEBg_SCgiInfo.apszParaVal[byParamIdx ++]);
        if (WEBg_pSMacFltPage->bySMACFltMode == MACFLT_MODE_SMAC_PERMIT)
            WEBg_pSMacFltPage->SCurGrp.bySrcId = (UINT8)STR_u32StrDecToU32(WEBg_SCgiInfo.apszParaVal[byParamIdx ++]);
        
        byErrCode = PIMACFLTGP_byInsGrp(WEBg_pSMacFltPage);
    }   
    else if (WEBg_SCgiInfo.apszParaVal[WEBg_SCgiInfo.u16ParaNum - 1][0] == 'D')  {    //Operation is delete a group
        byErrCode = MACFLT_OP_GRP_NOT_EXIST;

        //When Filter mode is permit, Web Param base index of Address List checkbox is 3, If deny, based index is 2
        byParamIdx = WEBg_pSMacFltPage->bySMACFltMode == MACFLT_MODE_SMAC_PERMIT ? 3:2;
        for (; byParamIdx < WEBg_SCgiInfo.u16ParaNum -1 ; byParamIdx ++) {
            STR_pvMemcpy(astrBuff, WEBg_SCgiInfo.apszParaVal[byParamIdx], MAC_SIZE_IN_WEB_PARAM); 
            astrBuff[MAC_SIZE_IN_WEB_PARAM] = '\0';
            s_vParseMacFromParaVal(astrBuff, WEBg_pSMacFltPage->SCurGrp.azMacAddr);
            
            WEBg_pSMacFltPage->SCurGrp.u16Fid = (UINT8)STR_u32StrDecToU32(&WEBg_SCgiInfo.apszParaVal[byParamIdx][MAC_SIZE_IN_WEB_PARAM]);

            byErrCode = PIMACFLTGP_byDelGrp(WEBg_pSMacFltPage);
            if (byErrCode != OP_OK)
                return WEB_wGenResultMsgPkt(g_aszErrMsg[byErrCode]);
        }
    }
    else
        return WEB_wGenResultMsgPkt(s_szParaNumErr); 
            
    // return message
    return WEB_wGenResultMsgPkt(g_aszErrMsg[byErrCode]);    
}

⌨️ 快捷键说明

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