492 lines
15 KiB
C++
492 lines
15 KiB
C++
/***************************************************************************
|
|
menu_atm_interface_configuration.cpp - description
|
|
-------------------
|
|
begin : Tue Oct 11 2005
|
|
copyright : (C) 2005 by David Rokhvarg
|
|
email : davidr@sangoma.com
|
|
***************************************************************************/
|
|
|
|
/***************************************************************************
|
|
* *
|
|
* This program is free software; you can redistribute it and/or modify *
|
|
* it under the terms of the GNU General Public License as published by *
|
|
* the Free Software Foundation; either version 2 of the License, or *
|
|
* (at your option) any later version. *
|
|
* *
|
|
***************************************************************************/
|
|
|
|
#include "menu_atm_interface_configuration.h"
|
|
#include "text_box.h"
|
|
#include "input_box.h"
|
|
#include "menu_adsl_encapsulation.h"//reusing for AFT ATM
|
|
#include "text_box_yes_no.h"
|
|
|
|
#define DBG_MENU_ATM_INTERFACE_CONFIGURATION 1
|
|
|
|
#define MAX_VPI_VCI_NUMBER 60000
|
|
#define MAX_UCHAR_VALUE 256
|
|
|
|
enum {
|
|
SET_VPI_NUMBER=1,
|
|
SET_VCI_NUMBER,
|
|
ENCAPSULATION_MODE,
|
|
|
|
ATM_OAM_LOOPBACK, //atm_oam_loopback
|
|
ATM_OAM_LOOPBACK_INTERVAL, //atm_oam_loopback_intr
|
|
|
|
ATM_OAM_CONTINUITY_CHECK, //atm_oam_continuity
|
|
ATM_OAM_CONTINUITY_CHECK_INTERVAL,//atm_oam_continuity_intr
|
|
|
|
ATM_ARP, //atm_arp
|
|
ATM_ARP_INTERVAL, //atm_arp_intr
|
|
|
|
MTU,
|
|
EMPTY_LINE
|
|
};
|
|
|
|
menu_atm_interface_configuration::
|
|
menu_atm_interface_configuration(IN char * lxdialog_path,
|
|
IN objects_list* obj_list,
|
|
IN list_element_atm_interface *atm_if)
|
|
{
|
|
Debug(DBG_MENU_ATM_INTERFACE_CONFIGURATION,
|
|
("menu_atm_interface_configuration::menu_atm_interface_configuration()\n"));
|
|
|
|
snprintf(this->lxdialog_path, MAX_PATH_LENGTH, "%s", lxdialog_path);
|
|
|
|
this->obj_list = obj_list;
|
|
this->atm_if = atm_if;
|
|
}
|
|
|
|
menu_atm_interface_configuration::~menu_atm_interface_configuration()
|
|
{
|
|
Debug(DBG_MENU_ATM_INTERFACE_CONFIGURATION,
|
|
("menu_atm_interface_configuration::~menu_atm_interface_configuration()\n"));
|
|
}
|
|
|
|
int menu_atm_interface_configuration::run( OUT int *selection_index,
|
|
IN char *name_of_underlying_layer)
|
|
{
|
|
string menu_str;
|
|
int rc, exit_dialog = NO, tmp;
|
|
char tmp_buff[MAX_PATH_LENGTH];
|
|
int num_of_visible_items;
|
|
wan_atm_conf_if_t *atm_if_cfg;
|
|
|
|
Debug(DBG_MENU_ATM_INTERFACE_CONFIGURATION,
|
|
("menu_atm_interface_configuration::run()\n"));
|
|
|
|
again:
|
|
rc = YES;
|
|
|
|
if(atm_if == NULL){
|
|
ERR_DBG_OUT(("ATM interface configuration pointer is NULL (atm_if) !!!\n"));
|
|
rc = NO;
|
|
goto cleanup;
|
|
}
|
|
|
|
menu_str = " ";
|
|
atm_if_cfg = (wan_atm_conf_if_t*)&atm_if->data.chanconf->u;
|
|
|
|
snprintf(tmp_buff, MAX_PATH_LENGTH, " \"%d\" ", ENCAPSULATION_MODE);
|
|
menu_str += tmp_buff;
|
|
snprintf(tmp_buff, MAX_PATH_LENGTH, " \"EncapMode-> %s\" ",
|
|
ADSL_ENCAPSULATION_DECODE(atm_if_cfg->encap_mode));
|
|
menu_str += tmp_buff;
|
|
|
|
snprintf(tmp_buff, MAX_PATH_LENGTH, " \"%d\" ", SET_VPI_NUMBER);
|
|
menu_str += tmp_buff;
|
|
snprintf(tmp_buff, MAX_PATH_LENGTH, " \"VPI number--> %d\" ", atm_if_cfg->vpi);
|
|
menu_str += tmp_buff;
|
|
|
|
snprintf(tmp_buff, MAX_PATH_LENGTH, " \"%d\" ", SET_VCI_NUMBER);
|
|
menu_str += tmp_buff;
|
|
snprintf(tmp_buff, MAX_PATH_LENGTH, " \"VCI number--> %d\" ", atm_if_cfg->vci);
|
|
menu_str += tmp_buff;
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////
|
|
snprintf(tmp_buff, MAX_PATH_LENGTH, " \"%d\" ", ATM_OAM_LOOPBACK);
|
|
menu_str += tmp_buff;
|
|
snprintf(tmp_buff, MAX_PATH_LENGTH, " \"OAM Loopback--> %s\" ",
|
|
(atm_if_cfg->atm_oam_loopback == WANOPT_YES ? "Yes" : "No"));
|
|
menu_str += tmp_buff;
|
|
|
|
if(atm_if_cfg->atm_oam_loopback == WANOPT_YES){
|
|
snprintf(tmp_buff, MAX_PATH_LENGTH, " \"%d\" ", ATM_OAM_LOOPBACK_INTERVAL);
|
|
menu_str += tmp_buff;
|
|
snprintf(tmp_buff, MAX_PATH_LENGTH, " \"OAM Loopback Interval--> %d\" ",
|
|
atm_if_cfg->atm_oam_loopback_intr);
|
|
menu_str += tmp_buff;
|
|
}
|
|
//////////////////////////////////////////////////////////////////////////////////////
|
|
snprintf(tmp_buff, MAX_PATH_LENGTH, " \"%d\" ", ATM_OAM_CONTINUITY_CHECK);
|
|
menu_str += tmp_buff;
|
|
snprintf(tmp_buff, MAX_PATH_LENGTH, " \"OAM Continuity Check--> %s\" ",
|
|
(atm_if_cfg->atm_oam_continuity == WANOPT_YES ? "Yes" : "No"));
|
|
menu_str += tmp_buff;
|
|
|
|
if(atm_if_cfg->atm_oam_continuity == WANOPT_YES){
|
|
snprintf(tmp_buff, MAX_PATH_LENGTH, " \"%d\" ", ATM_OAM_CONTINUITY_CHECK_INTERVAL);
|
|
menu_str += tmp_buff;
|
|
snprintf(tmp_buff, MAX_PATH_LENGTH, " \"OAM Continuity Check Interval--> %d\" ",
|
|
atm_if_cfg->atm_oam_continuity_intr);
|
|
menu_str += tmp_buff;
|
|
}
|
|
//////////////////////////////////////////////////////////////////////////////////////
|
|
snprintf(tmp_buff, MAX_PATH_LENGTH, " \"%d\" ", EMPTY_LINE);
|
|
menu_str += tmp_buff;
|
|
snprintf(tmp_buff, MAX_PATH_LENGTH, " \" \" ");
|
|
menu_str += tmp_buff;
|
|
//////////////////////////////////////////////////////////////////////////////////////
|
|
if(atm_if_cfg->encap_mode == RFC_MODE_ROUTED_IP_LLC){
|
|
snprintf(tmp_buff, MAX_PATH_LENGTH, " \"%d\" ", ATM_ARP);
|
|
menu_str += tmp_buff;
|
|
snprintf(tmp_buff, MAX_PATH_LENGTH, " \"ATM ARP--> %s\" ",
|
|
(atm_if_cfg->atm_arp == WANOPT_YES ? "Yes" : "No"));
|
|
menu_str += tmp_buff;
|
|
|
|
if(atm_if_cfg->atm_arp == WANOPT_YES){
|
|
snprintf(tmp_buff, MAX_PATH_LENGTH, " \"%d\" ", ATM_ARP_INTERVAL);
|
|
menu_str += tmp_buff;
|
|
snprintf(tmp_buff, MAX_PATH_LENGTH, " \"ATM ARP Interval--> %d\" ",
|
|
atm_if_cfg->atm_arp_intr);
|
|
menu_str += tmp_buff;
|
|
}
|
|
}//if(atm_if_cfg->encap_mode == RFC_MODE_ROUTED_IP_LLC)
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////
|
|
//create the explanation text for the menu
|
|
snprintf(tmp_buff, MAX_PATH_LENGTH,
|
|
"------------------------------------------\
|
|
\nSet per - ATM interface cofiguration.");
|
|
|
|
num_of_visible_items = 8;
|
|
|
|
if(set_configuration( YES,//indicates to call V2 of the function
|
|
MENU_BOX_BACK,//MENU_BOX_SELECT,
|
|
lxdialog_path,
|
|
"ATM INTERFACE CONFIGURATION",
|
|
WANCFG_PROGRAM_NAME,
|
|
tmp_buff,
|
|
MENU_HEIGTH, MENU_WIDTH,
|
|
num_of_visible_items,//number of visible items in the menu
|
|
(char*)menu_str.c_str()
|
|
) == NO){
|
|
rc = NO;
|
|
goto cleanup;
|
|
}
|
|
|
|
if(show(selection_index) == NO){
|
|
rc = NO;
|
|
goto cleanup;
|
|
}
|
|
|
|
switch(*selection_index)
|
|
{
|
|
case MENU_BOX_BUTTON_SELECT:
|
|
Debug(DBG_MENU_ATM_INTERFACE_CONFIGURATION,("option selected for editing: %s\n",
|
|
get_lxdialog_output_string()));
|
|
|
|
switch(atoi(get_lxdialog_output_string()))
|
|
{
|
|
case SET_VPI_NUMBER:
|
|
set_vpi_number(atm_if_cfg);
|
|
break;
|
|
|
|
case SET_VCI_NUMBER:
|
|
set_vci_number(atm_if_cfg);
|
|
break;
|
|
|
|
case ENCAPSULATION_MODE:
|
|
{
|
|
wan_adsl_conf_t adsl_cfg;
|
|
menu_adsl_encapsulation adsl_encapsulation(lxdialog_path, &adsl_cfg);
|
|
if(adsl_encapsulation.run(selection_index) == NO){
|
|
rc = NO;
|
|
exit_dialog = YES;
|
|
}else{
|
|
atm_if_cfg->encap_mode = adsl_cfg.EncapMode;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case ATM_OAM_LOOPBACK: //atm_oam_loopback
|
|
snprintf(tmp_buff, MAX_PATH_LENGTH, "Do you want to %s ATM OAM Loopback?",
|
|
(atm_if_cfg->atm_oam_loopback == WANOPT_NO ? "Enable" : "Disable"));
|
|
|
|
if(yes_no_question( selection_index, lxdialog_path,
|
|
NO_PROTOCOL_NEEDED, tmp_buff) == NO){
|
|
return NO;
|
|
}
|
|
|
|
switch(*selection_index)
|
|
{
|
|
case YES_NO_TEXT_BOX_BUTTON_YES:
|
|
if(atm_if_cfg->atm_oam_loopback == WANOPT_NO){
|
|
//was disabled - enable
|
|
atm_if_cfg->atm_oam_loopback = WANOPT_YES;
|
|
}else{
|
|
//was enabled - disable
|
|
atm_if_cfg->atm_oam_loopback = WANOPT_NO;
|
|
}
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case ATM_OAM_LOOPBACK_INTERVAL: //atm_oam_loopback_intr
|
|
if(get_user_numeric_input(
|
|
&atm_if_cfg->atm_oam_loopback_intr,
|
|
(char*)"OAM Loopback Interval",
|
|
MAX_UCHAR_VALUE,
|
|
1,
|
|
&tmp,
|
|
sizeof(atm_if_cfg->atm_oam_loopback_intr)
|
|
) == 0){
|
|
atm_if_cfg->atm_oam_loopback_intr = tmp;
|
|
}
|
|
break;
|
|
|
|
case ATM_OAM_CONTINUITY_CHECK: //atm_oam_continuity
|
|
snprintf(tmp_buff, MAX_PATH_LENGTH, "Do you want to %s ATM OAM Loopback?",
|
|
(atm_if_cfg->atm_oam_loopback == WANOPT_NO ? "Enable" : "Disable"));
|
|
|
|
if(yes_no_question( selection_index, lxdialog_path,
|
|
NO_PROTOCOL_NEEDED, tmp_buff) == NO){
|
|
return NO;
|
|
}
|
|
|
|
switch(*selection_index)
|
|
{
|
|
case YES_NO_TEXT_BOX_BUTTON_YES:
|
|
if(atm_if_cfg->atm_oam_loopback == WANOPT_NO){
|
|
//was disabled - enable
|
|
atm_if_cfg->atm_oam_loopback = WANOPT_YES;
|
|
}else{
|
|
//was enabled - disable
|
|
atm_if_cfg->atm_oam_loopback = WANOPT_NO;
|
|
}
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case ATM_OAM_CONTINUITY_CHECK_INTERVAL://atm_oam_continuity_intr
|
|
if(get_user_numeric_input(
|
|
&atm_if_cfg->atm_oam_continuity_intr,
|
|
(char*)"OAM Continuity Check Interval",
|
|
MAX_UCHAR_VALUE,
|
|
1,
|
|
&tmp,
|
|
sizeof(atm_if_cfg->atm_oam_continuity_intr)
|
|
) == 0){
|
|
atm_if_cfg->atm_oam_continuity_intr = tmp;
|
|
}
|
|
break;
|
|
|
|
case ATM_ARP: //atm_arp
|
|
snprintf(tmp_buff, MAX_PATH_LENGTH, "Do you want to %s ATM ARP?",
|
|
(atm_if_cfg->atm_arp == WANOPT_NO ? "Enable" : "Disable"));
|
|
|
|
if(yes_no_question( selection_index, lxdialog_path,
|
|
NO_PROTOCOL_NEEDED, tmp_buff) == NO){
|
|
return NO;
|
|
}
|
|
|
|
switch(*selection_index)
|
|
{
|
|
case YES_NO_TEXT_BOX_BUTTON_YES:
|
|
if(atm_if_cfg->atm_arp == WANOPT_NO){
|
|
//was disabled - enable
|
|
atm_if_cfg->atm_arp = WANOPT_YES;
|
|
}else{
|
|
//was enabled - disable
|
|
atm_if_cfg->atm_arp = WANOPT_NO;
|
|
}
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case ATM_ARP_INTERVAL:
|
|
if(get_user_numeric_input(
|
|
&atm_if_cfg->atm_arp_intr,
|
|
(char*)"ATM ARP Interval",
|
|
MAX_UCHAR_VALUE,
|
|
1,
|
|
&tmp,
|
|
sizeof(atm_if_cfg->atm_arp_intr)
|
|
) == 0){
|
|
atm_if_cfg->atm_arp_intr = tmp;
|
|
}
|
|
break;
|
|
|
|
default:
|
|
ERR_DBG_OUT(("Invalid option selected for editing!! selection: %s\n",
|
|
get_lxdialog_output_string()));
|
|
rc = NO;
|
|
}
|
|
break;
|
|
|
|
case MENU_BOX_BUTTON_HELP:
|
|
{
|
|
text_box tb;
|
|
|
|
Debug(DBG_MENU_ATM_INTERFACE_CONFIGURATION,("HELP option selected: %s\n",
|
|
get_lxdialog_output_string()));
|
|
|
|
switch(atoi(get_lxdialog_output_string()))
|
|
{
|
|
default:
|
|
tb.show_help_message(lxdialog_path, WANCONFIG_LIP_ATM,
|
|
option_not_implemented_yet_help_str);
|
|
break;
|
|
}
|
|
goto again;
|
|
}
|
|
break;
|
|
|
|
case MENU_BOX_BUTTON_EXIT:
|
|
//no check is done here because each menu item checks
|
|
//the input separatly.
|
|
rc = YES;
|
|
exit_dialog = YES;
|
|
break;
|
|
}//switch(*selection_index)
|
|
|
|
if(exit_dialog == NO){
|
|
goto again;
|
|
}
|
|
|
|
cleanup:
|
|
Debug(DBG_MENU_ATM_INTERFACE_CONFIGURATION,
|
|
("menu_atm_interface_configuration::run(): rc: %d\n", rc));
|
|
|
|
return rc;
|
|
}
|
|
|
|
int menu_atm_interface_configuration::set_vpi_number(wan_atm_conf_if_t *atm_if_cfg)
|
|
{
|
|
int tmp;
|
|
if(get_user_numeric_input(
|
|
&atm_if_cfg->vpi, //IN int *initial_value,
|
|
(char*)"VPI number", //IN char *explanation_text_ptr,
|
|
MAX_VPI_VCI_NUMBER, //IN int max_value,
|
|
0, //IN int min_value,
|
|
&tmp, //OUT int *new_value
|
|
sizeof(atm_if_cfg->vpi) //IN int size_of_numeric_type //char, short, int
|
|
) == 0){
|
|
atm_if_cfg->vpi = tmp;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
int menu_atm_interface_configuration::set_vci_number(wan_atm_conf_if_t *atm_if_cfg)
|
|
{
|
|
int tmp;
|
|
if(get_user_numeric_input(
|
|
&atm_if_cfg->vci, //IN int *initial_value,
|
|
(char*)"VCI number", //IN char *explanation_text_ptr,
|
|
MAX_VPI_VCI_NUMBER, //IN int max_value,
|
|
0, //IN int min_value,
|
|
&tmp, //OUT int *new_value
|
|
sizeof(atm_if_cfg->vci) //IN int size_of_numeric_type //char, short, int
|
|
) == 0){
|
|
atm_if_cfg->vci = tmp;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
int menu_atm_interface_configuration::get_user_numeric_input(
|
|
IN void *initial_value_ptr,
|
|
IN char *explanation_text_ptr,
|
|
IN int max_value,
|
|
IN int min_value,
|
|
OUT void *new_value_ptr,
|
|
IN int size_of_numeric_type //char, short, int
|
|
)
|
|
{
|
|
int tmp, selection_index, rc=0, initial_value;
|
|
input_box inb;
|
|
char backtitle[MAX_PATH_LENGTH];
|
|
char explanation_text[MAX_PATH_LENGTH];
|
|
char initial_text[MAX_PATH_LENGTH];
|
|
text_box tb;
|
|
|
|
snprintf(backtitle, MAX_PATH_LENGTH, "WANPIPE Configuration Utility: ");
|
|
snprintf(&backtitle[strlen(backtitle)], MAX_PATH_LENGTH,
|
|
"%s Setup", get_protocol_string(WANCONFIG_LIP_ATM));
|
|
|
|
again:
|
|
switch(size_of_numeric_type)
|
|
{
|
|
case sizeof(char):
|
|
initial_value = *(unsigned char*)initial_value_ptr;
|
|
break;
|
|
|
|
case sizeof(short):
|
|
initial_value = *(unsigned short*)initial_value_ptr;
|
|
break;
|
|
|
|
case sizeof(int):
|
|
initial_value = *(unsigned int*)initial_value_ptr;
|
|
break;
|
|
|
|
default:
|
|
initial_value = *(unsigned char*)initial_value_ptr;
|
|
}
|
|
|
|
snprintf(explanation_text, MAX_PATH_LENGTH, "Please specify %s", explanation_text_ptr);
|
|
snprintf(initial_text, MAX_PATH_LENGTH, "%d", initial_value);
|
|
|
|
inb.set_configuration( lxdialog_path,
|
|
backtitle,
|
|
explanation_text,
|
|
INPUT_BOX_HIGTH,
|
|
INPUT_BOX_WIDTH,
|
|
initial_text);
|
|
inb.show(&selection_index);
|
|
|
|
switch(selection_index)
|
|
{
|
|
case INPUT_BOX_BUTTON_OK:
|
|
Debug(DBG_MENU_ATM_INTERFACE_CONFIGURATION, ("num of atm interfaces str: %s\n",
|
|
inb.get_lxdialog_output_string()));
|
|
|
|
tmp = atoi(remove_spaces_in_int_string(inb.get_lxdialog_output_string()));
|
|
|
|
if(tmp < min_value || tmp > max_value){
|
|
tb.show_error_message(lxdialog_path, WANCONFIG_LIP_ATM,
|
|
"Invalid input for\n\n%s\n", explanation_text_ptr);
|
|
rc = 1;
|
|
goto done;
|
|
}else{
|
|
switch(size_of_numeric_type)
|
|
{
|
|
case sizeof(char):
|
|
*(unsigned char*)new_value_ptr = tmp;
|
|
break;
|
|
|
|
case sizeof(short):
|
|
*(unsigned short*)new_value_ptr = tmp;
|
|
break;
|
|
|
|
case sizeof(int):
|
|
*(unsigned int*)new_value_ptr = tmp;
|
|
break;
|
|
|
|
default:
|
|
*(unsigned char*)new_value_ptr = tmp;
|
|
}
|
|
rc = 0;
|
|
goto done;
|
|
}
|
|
break;
|
|
|
|
case INPUT_BOX_BUTTON_HELP:
|
|
tb.show_help_message(lxdialog_path, WANCONFIG_LIP_ATM, option_not_implemented_yet_help_str);
|
|
goto again;
|
|
}//switch(selection_index)
|
|
|
|
done:
|
|
return rc;
|
|
}
|
|
|