📄 pgipm.c
字号:
/*
* Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
* All rights reserved.
*
* This software is copyrighted by and is the sole property of
* VIA Networking Technologies, Inc. This software may only be used
* in accordance with the corresponding license agreement. Any unauthorized
* use, duplication, transmission, distribution, or disclosure of this
* software is expressly forbidden.
*
* This software is provided by VIA Networking Technologies, Inc. "as is"
* and any express or implied warranties, including, but not limited to, the
* implied warranties of merchantability and fitness for a particular purpose
* are disclaimed. In no event shall VIA Networking Technologies, Inc.
* be liable for any direct, indirect, incidental, special, exemplary, or
* consequential damages.
*
*
* File: pgipm.c
*
* Purpose: Ip multicast module UI definitions
*
* Author: Freeya Lin
*
* Date: Dec 16, 2003
*
* Functions:
*
* Revision History:
*
*/
#include "eng_act.h"
#include "allpages.h"
#include "pigencfg.h"
#include "cfgstr.h"
#include "gen_act.h"
#include "pimsg.h"
#include "key.h"
#include "str.h"
#include "tty.h"
#include "eng_io.h"
#include "piportmp.h"
#include "pgipm.h"
#include "piipmmod.h"
#include "piipmgrp.h"
#define IGMP_DUMMY_STR_NUM 10
#define IGMP_POS_COL_OFFSET 27
UINT8 g_byIGMPTotalPageNum;
UINT8 g_byIGMPLineNumPerPage;
static void s_vUpdateGrpNumPerPage(void);
// assign fix label
SFixLabel aSFixLabelIGMPCfg[] = {
{{2,31}, g_strProvIGMP, 0},
{{3,31}, "=", 26},
{{4,2}, "IGMP Mode :", 0},
{{24,2}, g_strHelpMsg, 0},
{{6,2}, "IGMP Group List :", 0},
{{7,2}, "IP ----- VID IP ----- VID IP ----- VID", 0},
{{8,2}, "-", 76},
};
// assign var item
SItemListbox SIListboxIGMPMode = {
&g_UCfgBuf.SPageCfg_IGMP.byMode,
0, 7, 0,
g_aszEnDisCfg, 2
};
SItemString SIStrIGMPIpGrpStr = {
(char*)g_UCfgBuf.SPageCfg_IGMP.astrGrpIpList,
IP_STRING_LEN
};
SItemNum SIDecIGMPGrpID = {
(PUINT8)&g_UCfgBuf.SPageCfg_IGMP.awValidGrpIdList[0],
2, 4, 2
};
// all items
SVarLabel aSVarLabelIGMPGrpVidList[] = {
{{9,19}, &SIDecIGMPGrpID, "", ITEM_DECNUM, REPEAT_TYPE_RECT_SINGLE, LINK_TYPE_EDITPAGE, ROW_NUM_IN_3_FIELD, IGMP_POS_COL_OFFSET}
};
SItem aSItemIGMPGrpList[] = {
{{4,14}, &SIListboxIGMPMode, g_strChgModeMsg, ITEM_LISTBOX, REPEAT_TYPE_NONE, LINK_TYPE_LISTBOX},
{{9,2}, &SIStrIGMPIpGrpStr, g_strEditGrpMsg, ITEM_STRING, REPEAT_TYPE_RECT_SINGLE, LINK_TYPE_EDITPAGE, ROW_NUM_IN_3_FIELD, IGMP_POS_COL_OFFSET}
};
// action
SActItem aSActionIGMPMode[] = {
{{22, 12}, g_strActionQuit, PAACT_bQuit},
{{22, 22}, g_strActionEdit, PAIGMP_bEditIGMPMode},
};
SActItem aSActionIGMPGrpList[] = {
{{22, 12}, g_strActionQuit, PAACT_bQuit},
{{22, 22}, g_strActionEdit, PAIGMP_bEditIGMPMode},
{{22, 32}, g_strActionAdd, PAIGMP_bAddIGMPMode},
{{22, 42}, g_strActionDel, PAIGMP_bDelIGMPMode},
{{22, 55}, "<NextPage>", PAIGMP_bNextPage}
};
// assign page
SPage g_SPageIGMPMode = {
aSFixLabelIGMPCfg, 4,
NULL, 0,
aSItemIGMPGrpList, 1,
aSActionIGMPMode, 2,
PAIGMP_bLoadIGMPMode
};
SPage g_SPageIGMPGrpList = {
aSFixLabelIGMPCfg, 7,
aSVarLabelIGMPGrpVidList, 1,
aSItemIGMPGrpList, 2,
aSActionIGMPGrpList, 5,
PAIGMP_bLoadIGMPMode
};
// assign fix label
char strTitleIGMPAdd[] = "Add ";
char strTitleIGMPEdit[] = "Edit";
char strTitleIGMP[] = "a IP Multicast Group";
SFixLabel aSFixLabelIGMPGrpAdd[] = {
{{2,27}, strTitleIGMPAdd, 0},
{{2,31}, strTitleIGMP, 0},
{{3,27}, "=", 24},
{{4,13}, "VID :", 0},
{{5,13}, "IP Address :", 0},
{{6,13}, "Static :", 0},
{{7,13}, "CPU :", 0},
{{8,13}, "Dp:", 0},
{{9,13}, "Group Member :", 0},
{{10,13}, "-", 53},
{{24,2}, g_strHelpMsg, 0}
};
SFixLabel aSFixLabelIGMPGrpEdit[] = {
{{2,27}, strTitleIGMPEdit, 0},
{{2,32}, strTitleIGMP, 0},
{{3,27}, "=", 25},
{{4,13}, "VID :", 0},
{{5,13}, "IP Address :", 0},
{{6,13}, "Static :", 0},
{{7,13}, "CPU :", 0},
{{8,13}, "Dp:", 0},
{{9,13}, "Group Member :", 0},
{{10,13}, "-", 53},
{{24,2}, g_strHelpMsg, 0}
};
char astrInputIpStrBuff[IGMP_DUMMY_STR_NUM*(IP_STRING_LEN+1)];
// assign var label
SItemString SIStrIGMPIpConf = {
(char*)astrInputIpStrBuff,
IP_STRING_LEN
};
SItemNum SIDecNumIGMPVID = {
(PUINT8)&g_UCfgBuf.SPageCfg_IGMP.SCurGrp.u16Vid,
2, 4, 0
};
SItemListbox aSIListboxIGMPGrp[] = {
{(PUINT8)&g_UCfgBuf.SPageCfg_IGMP.SCurGrp.bStatic, 0, 0, 0, g_aszEnDisCfg, 2},
{(PUINT8)&g_UCfgBuf.SPageCfg_IGMP.SCurGrp.bCpu, 0, 0, 0, g_aszEnDisCfg, 2},
{(PUINT8)&g_UCfgBuf.SPageCfg_IGMP.SCurGrp.bDp, 0, 0, 0, g_aszEnDisCfg, 2},
{(PUINT8)&g_UCfgBuf.SPageCfg_IGMP.SCurGrp.abyMbrMsk, 0, 0, 1, g_aszMbrNotCfg, 2}
};
SVarLabel aSVarLabelIGMPGrp[] = {
{{ 5,26}, &SIStrIGMPIpConf, "", ITEM_STRING, REPEAT_TYPE_NONE, LINK_TYPE_NONE},
{{ 4,22}, &SIDecNumIGMPVID, "", ITEM_DECNUM, REPEAT_TYPE_NONE, LINK_TYPE_NONE},
{{11,13}, &g_SIListboxLogPortName, "", ITEM_LISTBOX, REPEAT_TYPE_RECT_SINGLE, LINK_TYPE_NONE, ROW_NUM_IN_3_FIELD, 20}
};
SItem aSItemIGMPGrp[] = {
{{ 4,22}, &SIDecNumIGMPVID, "", ITEM_DECNUM, REPEAT_TYPE_NONE, LINK_TYPE_NONE},
{{ 5,26}, &SIStrIGMPIpConf, "", ITEM_STRING, REPEAT_TYPE_NONE, LINK_TYPE_NONE},
{{ 6,22}, aSIListboxIGMPGrp, "", ITEM_LISTBOX, REPEAT_TYPE_NONE, LINK_TYPE_LISTBOX},
{{ 7,22}, aSIListboxIGMPGrp+1, "", ITEM_LISTBOX, REPEAT_TYPE_NONE, LINK_TYPE_LISTBOX},
{{ 8,22}, aSIListboxIGMPGrp+2, "", ITEM_LISTBOX, REPEAT_TYPE_NONE, LINK_TYPE_LISTBOX},
{{11,20}, aSIListboxIGMPGrp+3, "", ITEM_LISTBOX, REPEAT_TYPE_RECT_SINGLE, LINK_TYPE_NONE, ROW_NUM_IN_3_FIELD, 20}
};
// action
SActItem aSActionIGMPGrpEdit[] = {
{{22, 12}, g_strActionQuit, PAACT_bQuit},
{{22, 22}, g_strActionEdit, PAACT_bEdit},
{{22, 32}, g_strActionSave, PAIGMP_bSaveIGMPGrpEdit}
};
// assign page
SPage g_SPageIGMPGrpEdit = {
aSFixLabelIGMPGrpEdit, 11,
aSVarLabelIGMPGrp, 3,
aSItemIGMPGrp+2, 4,
aSActionIGMPGrpEdit, 3,
PAIGMP_bLoadIGMPGrpEdit
};
//// add a igmp group
SActItem aSActionIGMPGrpAdd[] = {
{{22, 12}, g_strActionQuit, PAACT_bQuit},
{{22, 22}, g_strActionEdit, PAACT_bEdit},
{{22, 32}, g_strActionSave, PAIGMP_bSaveIGMPGrpAdd},
};
SPage g_SPageIGMPGrpAdd = {
aSFixLabelIGMPGrpAdd, 11,
aSVarLabelIGMPGrp+2, 1,
aSItemIGMPGrp, 6,
aSActionIGMPGrpAdd, 3,
PAIGMP_bLoadIGMPGrpAdd
};
SPage g_SPageIGMPGrpAddNoVid = {
aSFixLabelIGMPGrpAdd, 11,
aSVarLabelIGMPGrp+1, 2,
aSItemIGMPGrp+1, 5,
aSActionIGMPGrpAdd, 3,
PAIGMP_bLoadIGMPGrpAdd
};
/////////////////////////////////////////////////////////////////////////////////////
#define g_pSPageIGMP (&g_UCfgBuf.SPageCfg_IGMP)
#define g_byIGMPMode (g_UCfgBuf.SPageCfg_IGMP.byMode)
#define g_wIGMPValidEntryNum (g_UCfgBuf.SPageCfg_IGMP.wValidEntryNum)
#define g_pSIGMPCurGrp (&g_UCfgBuf.SPageCfg_IGMP.SCurGrp)
UINT8 s_abyIGMPModePageId[] = {PAGE_PROV_IGMP_MODE_DIS, PAGE_PROV_IGMP_LIST};
BOOL PAIGMP_bNextPage(void)
{
g_byMultiPageNo ++;
g_byMultiPageNo %= g_byIGMPTotalPageNum;
return RELOAD_PAGE; // reload cfg and print whole page
}
static void s_vUpdateGrpNumPerPage(void)
{
g_byIGMPLineNumPerPage = ((80/IGMP_POS_COL_OFFSET + ((80%IGMP_POS_COL_OFFSET) ? 1 : 0))*ROW_NUM_IN_3_FIELD);
if (g_wIGMPValidEntryNum) {
if (g_wIGMPValidEntryNum % g_byIGMPLineNumPerPage) {
g_byIGMPTotalPageNum = ((g_wIGMPValidEntryNum / g_byIGMPLineNumPerPage) + 1);
g_wTotalLineNum = ((g_byMultiPageNo < (g_byIGMPTotalPageNum-1)) ? g_byIGMPLineNumPerPage : (g_wIGMPValidEntryNum % g_byIGMPLineNumPerPage));
}
else {
g_byIGMPTotalPageNum = (g_wIGMPValidEntryNum / g_byIGMPLineNumPerPage);
g_wTotalLineNum = g_byIGMPLineNumPerPage;
}
}
else { //grp num = 0
g_byIGMPTotalPageNum = 1;
g_wTotalLineNum = 0;
}
}
BOOL PAIGMP_bChangeModePage(void)
{
if (g_byCurPageID != s_abyIGMPModePageId[g_byIGMPMode])
{
// confirm and set igmp mode
char cKey = ENGcPrintMessage("Change mode will clear original IGMP setting! Continue? [y/N]", PRINT_THEN_PAUSE);
if (cKey == 'y' || cKey == 'Y')
{
ENGcPrintMessage("Changing mode...", PRINT_THEN_RETURN);
PIIGMP_vSetIGMPMode(g_pSPageIGMP);
PIMSG_vPutMsgThenPause(OP_OK);
g_byCurPageID = s_abyIGMPModePageId[g_byIGMPMode];
g_bDataDirty = 0;
if (g_byIGMPMode) //igmp enable
s_vUpdateGrpNumPerPage();
}
// restore to current igmp mode in HW
PIIGMP_vGetIGMPMode(&g_byIGMPMode);
return RELOAD_PAGE;
}
return DONT_RELOAD_PAGE;
}
BOOL PAIGMP_bLoadIGMPMode(void)
{
PIIGMP_vInitPage(g_pSPageIGMP);
if (g_byIGMPMode) //enable
{
g_byCurPageID = s_abyIGMPModePageId[g_byIGMPMode]; // it may not be reloaded and reprinted
s_vUpdateGrpNumPerPage();
}
return DONT_RELOAD_PAGE;
}
BOOL PAIGMP_bEditIGMPMode(void)
{
if (PAACT_bEdit())
return RELOAD_PAGE;
// deal with dynamic page
if (PAIGMP_bChangeModePage())
ENGvPrintPage(); // in this page, changing page may not reload config, just re-print page only
// deal with LINK_TYPE_EDITPAGE
else if (g_byCurKey == MK_ENTER && g_SCurItem.f2LinkType == LINK_TYPE_EDITPAGE)
{
if (g_byCurPageID == PAGE_PROV_IGMP_LIST)
g_byCurPageID = PAGE_PROV_IGMP_EDIT;
return RELOAD_PAGE; // reload cfg and print whole page
}
return DONT_RELOAD_PAGE;
}
BOOL PAIGMP_bAddIGMPMode(void)
{
UINT8 byVlanMode;
if (g_byCurPageID == PAGE_PROV_IGMP_LIST) {
PIVLAN_vGetVlanMode(&byVlanMode);
if (byVlanMode != VLAN_MODE_DISABLE)
g_byCurPageID = PAGE_PROV_IGMP_ADD;
else //disable
g_byCurPageID = PAGE_PROV_IGMP_ADD_NOVID;
}
return RELOAD_PAGE; // reload cfg and print whole page
}
BOOL PAIGMP_bDelIGMPMode(void)
{
UINT8 u8OldTmp;
// continue if nothing to del
if (g_wTotalLineNum)
{
if (PAACT_bEdit())
return RELOAD_PAGE;
if (PAIGMP_bChangeModePage())
ENGvPrintPage(); // in this page, changing page may not reload config, just re-print page only
else if (g_byCurKey == MK_ENTER && g_SCurItem.f2LinkType == LINK_TYPE_EDITPAGE)
{
char cKey = ENGcPrintMessage("Continue deleting? [y/N]", PRINT_THEN_PAUSE);
if (cKey == 'y' || cKey == 'Y')
{
UINT8 byRes;
ENGcPrintMessage("Deleting...", PRINT_THEN_RETURN);
STR_iStrcpy(g_pSIGMPCurGrp->szIp, g_pSPageIGMP->astrGrpIpList+(g_wCurLineID+g_byMultiPageNo*g_byIGMPLineNumPerPage)*(IP_STRING_LEN+1));
g_pSIGMPCurGrp->u16Vid = g_pSPageIGMP->awValidGrpIdList[(g_wCurLineID+g_byMultiPageNo*g_byIGMPLineNumPerPage)];
byRes = PIIGMP_byDelGrp(g_pSPageIGMP);
PIMSG_vPutExtMsgThenPause( byRes, UINT16_MAX, PUT_MSG_WITH_PORT_NAME );
//for deleting all grps in this page, so we must go back to previous page automatically
u8OldTmp = g_byIGMPTotalPageNum;
s_vUpdateGrpNumPerPage();
if (u8OldTmp != g_byIGMPTotalPageNum) {
g_byMultiPageNo --;
g_byMultiPageNo %= g_byIGMPTotalPageNum;
}
ENGvPrintPage(); // just reprint
}
}
}
return DONT_RELOAD_PAGE;
}
// igmp group edit
// load config
BOOL PAIGMP_bLoadIGMPGrpEdit(void)
{
UINT8 byErrCode;
//load ui ip string to current grp ip string
STR_iStrcpy(g_pSIGMPCurGrp->szIp, g_pSPageIGMP->astrGrpIpList+(g_wCurLineID+g_byMultiPageNo*g_byIGMPLineNumPerPage)*(IP_STRING_LEN+1));
g_pSIGMPCurGrp->u16Vid = g_pSPageIGMP->awValidGrpIdList[(g_wCurLineID+g_byMultiPageNo*g_byIGMPLineNumPerPage)];
byErrCode = PIIGMP_byGetGrp(g_pSPageIGMP);
//load current grp ip string to ui string array[0]
STR_iStrcpy(astrInputIpStrBuff, g_pSIGMPCurGrp->szIp);
if (byErrCode != OP_OK)
{
PIMSG_vPutMsgThenPause(byErrCode);
g_byCurPageID = g_abyPreviousPageID[g_byCurPageID]; // jump to previous page
return RELOAD_PAGE;
}
g_wTotalLineNum = g_byLogIdNum;
return DONT_RELOAD_PAGE;
}
// save config
static UINT8 s_bySaveIGMPGrpMsg(UINT8 byErrCode)
{
PIMSG_vPutMsgThenPause(byErrCode);
if (byErrCode == OP_OK)
{
g_byCurPageID = g_abyPreviousPageID[g_byCurPageID]; // jump to previous page
return RELOAD_PAGE;
}
return DONT_RELOAD_PAGE;
}
BOOL PAIGMP_bSaveIGMPGrpEdit(void)
{
UINT8 byErrCode;
PIMSG_vPutSavingMsg();
byErrCode = PIIGMP_byEditGrp(g_pSPageIGMP);
return s_bySaveIGMPGrpMsg(byErrCode);
}
// igmp group add
// load config
BOOL PAIGMP_bLoadIGMPGrpAdd(void)
{
STR_pvMemset(g_pSIGMPCurGrp, 0, sizeof(SIpmEntryPage));
STR_iStrcpy(g_pSIGMPCurGrp->szIp, "0.0.0.0");
//load current grp ip string to ui string array[0]
STR_iStrcpy(astrInputIpStrBuff, g_pSIGMPCurGrp->szIp);
g_wTotalLineNum = g_byLogIdNum;
return DONT_RELOAD_PAGE;
}
// save config
BOOL PAIGMP_bSaveIGMPGrpAdd(void)
{
UINT8 byErrCode;
PIMSG_vPutSavingMsg();
//load ui string array[0] to current grp ip string
STR_iStrcpy(g_pSIGMPCurGrp->szIp, astrInputIpStrBuff);
byErrCode = PIIGMP_byInsGrp(g_pSPageIGMP);
return s_bySaveIGMPGrpMsg(byErrCode);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -