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