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

📄 pgipm.c

📁 vt6528芯片交换机API函数和文档运行程序
💻 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 + -