881 lines
28 KiB
C++
881 lines
28 KiB
C++
/***************************************************************************
|
|
menu_new_device_configuration.cpp - description
|
|
-------------------
|
|
begin : Tue Mar 9 2004
|
|
copyright : (C) 2004 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 "text_box_help.h"
|
|
#include "text_box_yes_no.h"
|
|
#include "menu_new_device_configuration.h"
|
|
|
|
#include "menu_device_miscellaneous_options.h"
|
|
|
|
#include "menu_net_interfaces_list.h"
|
|
#include "menu_hardware_setup.h"
|
|
#include "net_interface_file_reader.h"
|
|
#include "menu_wan_channel_cfg.h"
|
|
|
|
#include "conf_file_writer.h"
|
|
|
|
char* new_dev_cfg_help_str =
|
|
"Hardware Setup\n"
|
|
"--------------\n"
|
|
"Select type of Sangoma card and\n"
|
|
"resources used by it.\n"
|
|
"\n"
|
|
"Protocol\n"
|
|
"--------\n"
|
|
"Select Communications Protocol.\n"
|
|
"Following protocols available for\n"
|
|
"S514 and S508 cards:\n"
|
|
" Frame Relay, PPP, CHDLC, HDLC Streaming\n"
|
|
"A101/102 cards:\n"
|
|
" MP Frame Relay, MP PPP, MP CHDLC, MP HDLC Streaming\n"
|
|
"\n"
|
|
"Interface Setup\n"
|
|
"---------------\n"
|
|
" -set Interface Name\n"
|
|
" -select Interface Operation Mode: WANPIPE, API, BRIDGE...\n"
|
|
" -set Interface IP information.\n"
|
|
" -configure per-Interface start/stop scripts.\n"
|
|
"\n"
|
|
"Advanced WANPIPE options\n"
|
|
"-----------------------------\n"
|
|
" -configure WANPIPE UDP debugging.\n"
|
|
" -configure per-WANPIPE start/stop scripts.\n";
|
|
|
|
char* logical_channel_setup_help_str =
|
|
"Timeslot Groups Configuration\n"
|
|
"-----------------------------\n"
|
|
" -Set Number of Timeslot Groups\n"
|
|
" -Set Configuration for each Timeslot Group\n";
|
|
|
|
enum NEW_DEV_CFG_OPTIONS{
|
|
HW_SETUP=100,
|
|
PROTOCOL_SETUP,
|
|
NET_IF_SETUP,
|
|
MISCELLANEOUS_OPTIONS,
|
|
EMPTY_LINE
|
|
};
|
|
|
|
#define DBG_MENU_NEW_DEVICE_CONFIG 1
|
|
|
|
menu_new_device_configuration::menu_new_device_configuration( IN char * lxdialog_path,
|
|
IN conf_file_reader** ptr_cfr)
|
|
{
|
|
Debug(DBG_MENU_NEW_DEVICE_CONFIG,
|
|
("menu_new_device_configuration::menu_new_device_configuration()\n"));
|
|
|
|
snprintf(this->lxdialog_path, MAX_PATH_LENGTH, "%s", lxdialog_path);
|
|
this->ptr_cfr = ptr_cfr;
|
|
cfr = *ptr_cfr;
|
|
|
|
wanrouter_rc_fr = NULL;
|
|
}
|
|
|
|
menu_new_device_configuration::~menu_new_device_configuration()
|
|
{
|
|
Debug(DBG_MENU_NEW_DEVICE_CONFIG,
|
|
("menu_new_device_configuration::~menu_new_device_configuration()\n"));
|
|
|
|
if(wanrouter_rc_fr != NULL){
|
|
delete wanrouter_rc_fr;
|
|
}
|
|
}
|
|
|
|
int menu_new_device_configuration::run(OUT int * selection_index)
|
|
{
|
|
string menu_str;
|
|
int rc, number_of_items;
|
|
int exit_dialog;
|
|
char tmp_buff[MAX_PATH_LENGTH];
|
|
char* interface_setup_completion_check;
|
|
unsigned int max_valid_number_of_logical_channels;
|
|
|
|
//help text box
|
|
text_box tb;
|
|
|
|
link_def_t* link_def;
|
|
wandev_conf_t* linkconf;
|
|
objects_list* obj_list = NULL;
|
|
list_element_chan_def* list_el_chan_def;
|
|
sdla_fe_cfg_t* fe_cfg;
|
|
|
|
again:
|
|
rc = YES;
|
|
exit_dialog = NO;
|
|
number_of_items = 0;
|
|
|
|
obj_list = cfr->main_obj_list;
|
|
link_def = cfr->link_defs;
|
|
linkconf = cfr->link_defs->linkconf;
|
|
fe_cfg = &link_def->linkconf->fe_cfg;
|
|
|
|
wanrouter_rc_fr = new wanrouter_rc_file_reader(cfr->wanpipe_number);
|
|
|
|
Debug(DBG_MENU_NEW_DEVICE_CONFIG, ("menu_new_device_configuration::run()\n"));
|
|
Debug(DBG_MENU_NEW_DEVICE_CONFIG, ("cfr->link_defs->name: %s\n", link_def->name));
|
|
Debug(DBG_MENU_NEW_DEVICE_CONFIG, ("linkconf->card_type: %d\n", linkconf->card_type));
|
|
Debug(DBG_MENU_NEW_DEVICE_CONFIG, ("link_def->card_version: %d\n", link_def->card_version));
|
|
Debug(DBG_MENU_NEW_DEVICE_CONFIG, ("linkconf->config_id: %d\n", linkconf->config_id));
|
|
Debug(DBG_MENU_NEW_DEVICE_CONFIG, ("fe_cfg->media: 0x%X\n", fe_cfg->media));
|
|
|
|
if(linkconf->card_type == NOT_SET){
|
|
//card type not known yet, go directly to hardware setup
|
|
goto display_hw_setup_dialog_label;
|
|
}
|
|
|
|
switch(fe_cfg->media)
|
|
{
|
|
case WAN_MEDIA_T1:
|
|
max_valid_number_of_logical_channels = NUM_OF_T1_CHANNELS;
|
|
break;
|
|
|
|
case WAN_MEDIA_E1:
|
|
max_valid_number_of_logical_channels = NUM_OF_E1_CHANNELS - 1; //32-1=31
|
|
break;
|
|
|
|
case WAN_MEDIA_NONE:
|
|
case WAN_MEDIA_56K:
|
|
case WAN_MEDIA_DS3:
|
|
case WAN_MEDIA_E3:
|
|
case WAN_MEDIA_SERIAL:
|
|
//for now only un-channelized TE3 supported
|
|
max_valid_number_of_logical_channels = 1;
|
|
break;
|
|
|
|
case WAN_MEDIA_FXOFXS:
|
|
max_valid_number_of_logical_channels = MAX_FXOFXS_CHANNELS;
|
|
break;
|
|
|
|
case WAN_MEDIA_BRI:
|
|
max_valid_number_of_logical_channels = MAX_BRI_TIMESLOTS;
|
|
break;
|
|
|
|
default:
|
|
ERR_DBG_OUT(("Invalid Media Type!! (0x%X)\n", fe_cfg->media));
|
|
return NO;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
menu_str = " ";
|
|
number_of_items = 5;
|
|
|
|
snprintf(tmp_buff, MAX_PATH_LENGTH, " \"%d\" ", HW_SETUP);
|
|
menu_str += tmp_buff;
|
|
//create the menu item
|
|
switch(linkconf->card_type)
|
|
{
|
|
case WANOPT_AFT:
|
|
switch(link_def->card_version)
|
|
{
|
|
case A101_ADPTR_1TE1:
|
|
snprintf(tmp_buff, MAX_PATH_LENGTH, " \"Hardware Setup--> %s (CPU: %s)\" ",
|
|
get_card_type_string(linkconf->card_type, link_def->card_version),
|
|
linkconf->S514_CPU_no);
|
|
break;
|
|
|
|
case A104_ADPTR_4TE1:
|
|
snprintf(tmp_buff, MAX_PATH_LENGTH, " \"Hardware Setup--> %s (Line No: %d)\" ",
|
|
get_card_type_string(linkconf->card_type, link_def->card_version), fe_cfg->line_no);
|
|
break;
|
|
|
|
case A200_ADPTR_ANALOG:
|
|
snprintf(tmp_buff, MAX_PATH_LENGTH, " \"Hardware Setup--> %s\" ",
|
|
get_card_type_string(linkconf->card_type, link_def->card_version));
|
|
break;
|
|
|
|
case AFT_ADPTR_56K:
|
|
snprintf(tmp_buff, MAX_PATH_LENGTH, " \"Hardware Setup--> %s\" ",
|
|
get_card_type_string(linkconf->card_type, link_def->card_version));
|
|
break;
|
|
|
|
case AFT_ADPTR_ISDN:
|
|
snprintf(tmp_buff, MAX_PATH_LENGTH, " \"Hardware Setup--> %s (Line No: %d)\" ",
|
|
get_card_type_string(linkconf->card_type, link_def->card_version), fe_cfg->line_no);
|
|
break;
|
|
|
|
default:
|
|
snprintf(tmp_buff, MAX_PATH_LENGTH, " \"Hardware Setup--> %s\" ",
|
|
get_card_type_string(linkconf->card_type, link_def->card_version));
|
|
}
|
|
break;
|
|
|
|
case WANOPT_S51X:
|
|
snprintf(tmp_buff, MAX_PATH_LENGTH, " \"Hardware Setup--> %s (CPU:%s, Port:%s)\" ",
|
|
get_card_type_string(linkconf->card_type, link_def->card_version),
|
|
linkconf->S514_CPU_no,
|
|
(linkconf->comm_port == WANOPT_PRI ? "Pri" : "Sec"));
|
|
break;
|
|
|
|
default:
|
|
snprintf(tmp_buff, MAX_PATH_LENGTH, " \"Hardware Setup--> %s\" ",
|
|
get_card_type_string(linkconf->card_type, link_def->card_version));
|
|
}
|
|
menu_str += tmp_buff;
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
Debug(DBG_MENU_NEW_DEVICE_CONFIG, ("number of objects in the list: %d\n", obj_list->get_size()));
|
|
number_of_items += obj_list->get_size();
|
|
|
|
create_logical_channels_list_str( menu_str,
|
|
max_valid_number_of_logical_channels,
|
|
obj_list);
|
|
|
|
Debug(DBG_MENU_NEW_DEVICE_CONFIG, ("create_logical_channels_list_str() - returned\n"));
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
if(linkconf->config_id != PROTOCOL_NOT_SET ){
|
|
|
|
snprintf(tmp_buff, MAX_PATH_LENGTH, " \"%d\" ", EMPTY_LINE);
|
|
menu_str += tmp_buff;
|
|
snprintf(tmp_buff, MAX_PATH_LENGTH, " \" \" ");
|
|
menu_str += tmp_buff;
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
snprintf(tmp_buff, MAX_PATH_LENGTH, " \"%d\" ", MISCELLANEOUS_OPTIONS);
|
|
menu_str += tmp_buff;
|
|
snprintf(tmp_buff, MAX_PATH_LENGTH, " \"Advanced WANPIPE options\" " );
|
|
menu_str += tmp_buff;
|
|
}else{
|
|
;//exit(0);
|
|
}
|
|
|
|
|
|
Debug(DBG_MENU_NEW_DEVICE_CONFIG, ("\nmenu_str:%s\n", menu_str.c_str()));
|
|
|
|
//create the explanation text for the menu
|
|
snprintf(tmp_buff, MAX_PATH_LENGTH,
|
|
"Configuration for Wan Device: %s\n\n", cfr->link_defs->name);
|
|
|
|
snprintf(&tmp_buff[strlen(tmp_buff)], MAX_PATH_LENGTH, "%s%s",
|
|
"------------------------------------------\n",
|
|
"Press ESC to Cancel/Exit Config");
|
|
|
|
//snprintf(&tmp_buff[strlen(tmp_buff)], MAX_PATH_LENGTH - strlen(tmp_buff), "%s", MENUINSTR_EXIT);
|
|
|
|
if(set_configuration( YES,//indicates to call V2 of the function
|
|
//MENU_BOX_BACK,
|
|
MENU_BOX_SELECT,//to see "Exit" button
|
|
lxdialog_path,
|
|
"WANPIPE CONFIGURATION",
|
|
WANCFG_PROGRAM_NAME,
|
|
tmp_buff,
|
|
MENU_HEIGTH, MENU_WIDTH,
|
|
(number_of_items > 8 ? 8 : number_of_items),
|
|
(char*)menu_str.c_str()
|
|
) == NO){
|
|
rc = NO;
|
|
goto cleanup;
|
|
}
|
|
|
|
if(show(selection_index) == NO){
|
|
Debug(DBG_MENU_NEW_DEVICE_CONFIG, ("menu_new_device_configuration.show() - failed!!\n"));
|
|
rc = NO;
|
|
goto cleanup;
|
|
}
|
|
|
|
exit_dialog = NO;
|
|
switch(*selection_index)
|
|
{
|
|
case MENU_BOX_BUTTON_SELECT:
|
|
Debug(DBG_MENU_NEW_DEVICE_CONFIG,
|
|
("option selected for editing: %s\n", get_lxdialog_output_string()));
|
|
|
|
switch(atoi(get_lxdialog_output_string()))
|
|
{
|
|
case EMPTY_LINE:
|
|
;//do nothing
|
|
break;
|
|
|
|
case HW_SETUP:
|
|
display_hw_setup_dialog_label:
|
|
{
|
|
menu_hardware_setup hardware_setup(lxdialog_path, cfr);
|
|
if(hardware_setup.run(selection_index) == YES){
|
|
|
|
if(linkconf->card_type == NOT_SET){
|
|
Debug(DBG_MENU_NEW_DEVICE_CONFIG,
|
|
("on return from 'menu_hardware_setup' linkconf->card_type == NOT_SET!!\n"));
|
|
//not an error - user just want to exit - exit the dialog
|
|
rc = YES;
|
|
exit_dialog = YES;
|
|
}else{
|
|
//do nothing
|
|
}
|
|
|
|
}else{
|
|
rc = NO;
|
|
exit_dialog = YES;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case NET_IF_SETUP:
|
|
{ //display list of network interfaces.
|
|
menu_net_interfaces_list
|
|
net_interfaces_list(lxdialog_path, (list_element_chan_def*)obj_list->get_first());
|
|
|
|
if(net_interfaces_list.run(selection_index) == NO){
|
|
rc = NO;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case PROTOCOL_SETUP:
|
|
{ //for single 'channels group' case
|
|
menu_wan_channel_cfg per_wan_channel_cfg( lxdialog_path,
|
|
cfr,
|
|
(list_element_chan_def*)obj_list->get_first());
|
|
|
|
rc = per_wan_channel_cfg.run( cfr->wanpipe_number, selection_index, obj_list->get_size());
|
|
if(rc == YES){
|
|
goto again;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case MISCELLANEOUS_OPTIONS:
|
|
{
|
|
menu_device_miscellaneous_options device_miscellaneous_options(lxdialog_path, cfr);
|
|
if(device_miscellaneous_options.run(selection_index) == NO){
|
|
rc = NO;
|
|
exit_dialog = YES;
|
|
}
|
|
}
|
|
break;
|
|
|
|
default:
|
|
|
|
Debug(DBG_MENU_NEW_DEVICE_CONFIG, ("default case selection: %d\n", *selection_index));
|
|
|
|
////////////////////////////////////////////////////////////
|
|
//general case for AFT: more than one Timeslot Group exist.
|
|
//one of the Timeslot Groups was selected for configuration
|
|
list_el_chan_def =
|
|
(list_element_chan_def*)obj_list->find_element(
|
|
remove_spaces_in_int_string(get_lxdialog_output_string()));
|
|
|
|
if(list_el_chan_def != NULL){
|
|
|
|
menu_wan_channel_cfg per_wan_channel_cfg( lxdialog_path,
|
|
cfr,
|
|
list_el_chan_def);
|
|
|
|
rc = per_wan_channel_cfg.run( cfr->wanpipe_number, selection_index, obj_list->get_size());
|
|
if(rc == YES){
|
|
goto again;
|
|
}
|
|
}else{
|
|
//error - failed to find the element
|
|
ERR_DBG_OUT(("Failed to find the element!! selection: %s\n",
|
|
get_lxdialog_output_string()));
|
|
rc = NO;
|
|
exit_dialog = YES;
|
|
}//if(list_el_chan_def != NULL)
|
|
}//witch(atoi(get_lxdialog_output_string()))
|
|
|
|
break;
|
|
|
|
case MENU_BOX_BUTTON_HELP:
|
|
|
|
switch(atoi(get_lxdialog_output_string()))
|
|
{
|
|
case HW_SETUP:
|
|
case PROTOCOL_SETUP:
|
|
case NET_IF_SETUP:
|
|
case MISCELLANEOUS_OPTIONS:
|
|
default:
|
|
tb.show_help_message(lxdialog_path, NO_PROTOCOL_NEEDED, new_dev_cfg_help_str);
|
|
break;
|
|
/*
|
|
case LOGICAL_CHANNELS_SETUP:
|
|
tb.show_help_message(lxdialog_path, NO_PROTOCOL_NEEDED, logical_channel_setup_help_str);
|
|
break;
|
|
*/
|
|
}
|
|
break;
|
|
|
|
case MENU_BOX_BUTTON_EXIT:
|
|
|
|
//run checks on the configuration here. notify user about errors.
|
|
if(linkconf->config_id == PROTOCOL_NOT_SET){
|
|
tb.show_error_message(lxdialog_path, NO_PROTOCOL_NEEDED,
|
|
"Protocol is NOT selected!!");
|
|
rc = YES;
|
|
exit_dialog = YES;
|
|
break;
|
|
}
|
|
|
|
if(check_aft_timeslot_groups_cfg() == NO){
|
|
|
|
//tb.show_error_message(lxdialog_path, NO_PROTOCOL_NEEDED,
|
|
// "Error(s) found in configuration.");
|
|
break;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////
|
|
//check configuration of each interface
|
|
interface_setup_completion_check = check_configuration_of_interfaces(cfr->main_obj_list);
|
|
if(interface_setup_completion_check != NULL){
|
|
|
|
replace_new_line_with_space(interface_setup_completion_check);
|
|
|
|
tb.show_error_message(lxdialog_path, NO_PROTOCOL_NEEDED,
|
|
interface_setup_completion_check);
|
|
break;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////
|
|
//if no errors found ask confirmation to save to file.
|
|
///////////////////////////////////////////////////////////
|
|
snprintf(tmp_buff, MAX_PATH_LENGTH, "Do you want to save '%s.conf' configuration file?",
|
|
cfr->link_defs->name);
|
|
|
|
if(yes_no_question( selection_index,
|
|
lxdialog_path,
|
|
NO_PROTOCOL_NEEDED,
|
|
tmp_buff) == NO){
|
|
//error displaying dialog
|
|
rc = NO;
|
|
goto cleanup;
|
|
}
|
|
|
|
switch(*selection_index)
|
|
{
|
|
case YES_NO_TEXT_BOX_BUTTON_YES:
|
|
{
|
|
conf_file_writer cf_writer(cfr);
|
|
cf_writer.write();
|
|
}
|
|
break;
|
|
|
|
case YES_NO_TEXT_BOX_BUTTON_NO:
|
|
break;
|
|
}
|
|
///////////////////////////////////////////////////////////
|
|
//check if this wanpipe is in wanrouter.rc->WAN_DEVICES list
|
|
if(wanrouter_rc_fr->search_and_update_boot_start_device_setting() == NO){
|
|
|
|
snprintf(tmp_buff, MAX_PATH_LENGTH, "Do you want to add '%s' to\n 'wanrouter start' sequence?",
|
|
cfr->link_defs->name);
|
|
|
|
if(yes_no_question( selection_index,
|
|
lxdialog_path,
|
|
NO_PROTOCOL_NEEDED,
|
|
tmp_buff) == NO){
|
|
//error displaying dialog
|
|
rc = NO;
|
|
goto cleanup;
|
|
}
|
|
|
|
switch(*selection_index)
|
|
{
|
|
case YES_NO_TEXT_BOX_BUTTON_YES:
|
|
wanrouter_rc_fr->update_wanrouter_rc_file();
|
|
break;
|
|
case YES_NO_TEXT_BOX_BUTTON_NO:
|
|
break;
|
|
}
|
|
///////////////////////////////////////////////////////////
|
|
}
|
|
|
|
rc = YES;
|
|
exit_dialog = YES;
|
|
break;
|
|
|
|
}//switch(*selection_index)
|
|
|
|
|
|
if(exit_dialog == NO){
|
|
goto again;
|
|
}
|
|
|
|
cleanup:
|
|
return rc;
|
|
////////////////////////////////////////////////////
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////
|
|
//recursevly check configuration of all interface belonging to a list
|
|
char* menu_new_device_configuration::check_configuration_of_interfaces(objects_list * obj_list)
|
|
{
|
|
char* return_str;
|
|
chan_def_t* chandef;
|
|
|
|
Debug(DBG_MENU_NEW_DEVICE_CONFIG, ("check_configuration_of_interfaces()\n"));
|
|
|
|
if(obj_list == NULL){
|
|
ERR_DBG_OUT(("ip_address_configuration_complete(): obj_list == NULL!!\n"));
|
|
snprintf(err_buf, MAX_PATH_LENGTH,
|
|
"ip_address_configuration_complete(): obj_list == NULL!!\n");
|
|
return err_buf;
|
|
}
|
|
|
|
return_str = ip_address_configuration_complete(obj_list);
|
|
if(return_str != NULL){
|
|
//a check failed
|
|
return return_str;
|
|
}
|
|
|
|
list_element_chan_def* list_el_chan_def = (list_element_chan_def*)obj_list->get_first();
|
|
|
|
while(list_el_chan_def != NULL){
|
|
chandef = &list_el_chan_def->data;
|
|
|
|
Debug(DBG_MENU_NEW_DEVICE_CONFIG, ("device name->: %s\n",chandef->name ));
|
|
|
|
if(list_el_chan_def->next_objects_list != NULL){
|
|
|
|
Debug(DBG_MENU_NEW_DEVICE_CONFIG, ("-------- next level -------\n" ));
|
|
|
|
//recursive call
|
|
return_str = check_configuration_of_interfaces((objects_list*)list_el_chan_def->next_objects_list);
|
|
if(return_str != NULL){
|
|
//a check failed
|
|
return return_str;
|
|
}
|
|
|
|
Debug(DBG_MENU_NEW_DEVICE_CONFIG, ("-------- end of next level -------\n"));
|
|
}
|
|
|
|
list_el_chan_def = (list_element_chan_def*)obj_list->get_next_element(list_el_chan_def);
|
|
}//while()
|
|
|
|
return NULL;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
char* menu_new_device_configuration::ip_address_configuration_complete(objects_list * obj_list)
|
|
{
|
|
#if 1
|
|
Debug(DBG_MENU_NEW_DEVICE_CONFIG, ("ip_address_configuration_complete()\n"));
|
|
|
|
if(obj_list == NULL){
|
|
ERR_DBG_OUT(("ip_address_configuration_complete(): obj_list == NULL!!\n"));
|
|
snprintf(err_buf, MAX_PATH_LENGTH,
|
|
"ip_address_configuration_complete(): obj_list == NULL!!\n");
|
|
return err_buf;
|
|
}
|
|
|
|
list_element_chan_def* list_el_chan_def = (list_element_chan_def*)obj_list->get_first();
|
|
|
|
while(list_el_chan_def != NULL){
|
|
|
|
Debug(DBG_MENU_NEW_DEVICE_CONFIG,
|
|
("list_el_chan_def->data.addr: %s\n", list_el_chan_def->data.addr));
|
|
|
|
switch(list_el_chan_def->data.usedby)
|
|
{
|
|
case WANPIPE:
|
|
case BRIDGE_NODE:
|
|
{
|
|
Debug(DBG_MENU_NEW_DEVICE_CONFIG,
|
|
("attempting to read 'net interface file' for %s\n", list_el_chan_def->data.addr));
|
|
|
|
net_interface_file_reader interface_file_reader(list_el_chan_def->data.name);
|
|
|
|
if(interface_file_reader.parse_net_interface_file() == NO){
|
|
Debug(DBG_MENU_NEW_DEVICE_CONFIG, ("parse_net_interface_file() FAILED!!\n"));
|
|
|
|
snprintf(err_buf, MAX_PATH_LENGTH,
|
|
"Failed to parse 'Net Interface' file for %s!!\n", list_el_chan_def->data.name);
|
|
return err_buf;
|
|
}
|
|
/////////////////////////////////////////////////////////////////
|
|
//file was parsed, check the contents is complete
|
|
if( strlen(interface_file_reader.if_config.ipaddr) < MIN_IP_ADDR_STR_LEN ||
|
|
strlen(interface_file_reader.if_config.point_to_point_ipaddr) < MIN_IP_ADDR_STR_LEN){
|
|
// v NO SPACE HERE!!
|
|
snprintf(err_buf, MAX_PATH_LENGTH, "IP Setup for %s is Incomplete!\n\n",
|
|
interface_file_reader.if_config.device);
|
|
|
|
return err_buf;
|
|
|
|
}else{
|
|
//ip cfg is complete
|
|
//snprintf(tmp_buff, MAX_PATH_LENGTH, " \"IP Address Setup---> Complete\" ");
|
|
}
|
|
}
|
|
break;
|
|
|
|
default:
|
|
Debug(DBG_MENU_NEW_DEVICE_CONFIG,
|
|
("NO NEED to read 'net interface file' for %s\n", list_el_chan_def->data.addr));
|
|
break;
|
|
}
|
|
|
|
list_el_chan_def =
|
|
(list_element_chan_def*)obj_list->get_next_element(list_el_chan_def);
|
|
|
|
}//while()
|
|
#endif
|
|
return NULL;
|
|
}
|
|
|
|
int menu_new_device_configuration::create_logical_channels_list_str(
|
|
string& menu_str,
|
|
unsigned int max_valid_number_of_logical_channels,
|
|
objects_list* obj_list)
|
|
{
|
|
char tmp_buff[MAX_PATH_LENGTH];
|
|
list_element_chan_def* list_el_chan_def;
|
|
chan_def_t* chandef;
|
|
chan_def_t* this_level_chandef;
|
|
|
|
if(obj_list->get_size() > 0 && obj_list->get_size() <= max_valid_number_of_logical_channels){
|
|
|
|
list_el_chan_def = (list_element_chan_def*)obj_list->get_first();
|
|
|
|
while(list_el_chan_def != NULL){
|
|
|
|
this_level_chandef = &list_el_chan_def->data;
|
|
|
|
snprintf(tmp_buff, MAX_PATH_LENGTH, " \"%s\" ", this_level_chandef->addr);
|
|
menu_str += tmp_buff;
|
|
|
|
Debug(DBG_MENU_NEW_DEVICE_CONFIG, ("this_level_chandef->name: %s\n",
|
|
this_level_chandef->name));
|
|
|
|
Debug(DBG_MENU_NEW_DEVICE_CONFIG, ("this_level_chandef->addr: %s\n",
|
|
this_level_chandef->addr));
|
|
|
|
Debug(DBG_MENU_NEW_DEVICE_CONFIG, ("config_id: %d\n", this_level_chandef->chanconf->config_id));
|
|
|
|
if(this_level_chandef->chanconf->config_id != PROTOCOL_NOT_SET){
|
|
|
|
objects_list* next_level_obj_list = (objects_list*)list_el_chan_def->next_objects_list;
|
|
list_element_chan_def* next_level_list_el_chan_def = NULL;
|
|
|
|
if(next_level_obj_list != NULL){
|
|
|
|
if(next_level_obj_list->get_size() == 0){
|
|
//empty!!
|
|
#if defined(__LINUX__) && !BSD_DEBG
|
|
ERR_DBG_OUT(("The Protocol layer interface list is empty!!\n\
|
|
Usually means the name of an interface does NOT start with name of it's 'parent' STACK device.\n\
|
|
For example: if name of 'parent' STACK device is 'w1g1', name of PPP interface running above it\n\
|
|
should be 'w1g1ppp' or 'w1g1?' where '?' is alphanumerical, up to 8 characters.\n"));
|
|
#elif (defined __FreeBSD__) || (defined __OpenBSD__) || defined(__NetBSD__) || BSD_DEBG
|
|
ERR_DBG_OUT(("The Protocol layer interface list is empty!!\n\
|
|
Usually means the name of an interface does NOT start with name of it's 'parent' STACK device.\n\
|
|
For example: if name of 'parent' STACK device is 'waga', name of PPP interface running above it\n\
|
|
should be 'wagappp0' or 'waga?#' where '?' is alphabetical and '#' is numerical.\n"));
|
|
#endif
|
|
return NO;
|
|
}
|
|
|
|
next_level_list_el_chan_def = (list_element_chan_def*)next_level_obj_list->get_first();
|
|
chandef = &next_level_list_el_chan_def->data;
|
|
|
|
}else{
|
|
Debug(DBG_MENU_NEW_DEVICE_CONFIG, ("-- 1.2\n"));
|
|
chandef = &list_el_chan_def->data;
|
|
}
|
|
|
|
if(chandef == NULL){
|
|
ERR_DBG_OUT(("Invalid 'chandef' pointer!!\n"));
|
|
return NO;
|
|
}
|
|
|
|
if(obj_list->get_size() > 1){
|
|
|
|
Debug(DBG_MENU_NEW_DEVICE_CONFIG, ("-- 3\n"));
|
|
|
|
//General case - more than one logical channel.
|
|
//Usually AFT groups of channels because protocols are in the LIP layer.
|
|
|
|
if(chandef->chanconf->config_id == WANCONFIG_AFT ||
|
|
chandef->chanconf->config_id == WANCONFIG_AFT_TE3){
|
|
|
|
snprintf(tmp_buff, MAX_PATH_LENGTH, " \"%s %s: %s\" ",
|
|
TIME_SLOT_GROUP_STR, list_el_chan_def->data.addr,
|
|
"HDLC Streaming");
|
|
}else{
|
|
snprintf(tmp_buff, MAX_PATH_LENGTH, " \"%s %s: %s\" ",
|
|
TIME_SLOT_GROUP_STR, list_el_chan_def->data.addr,
|
|
get_protocol_string(chandef->chanconf->config_id));
|
|
}
|
|
menu_str += tmp_buff;
|
|
|
|
}else{
|
|
|
|
Debug(DBG_MENU_NEW_DEVICE_CONFIG, ("-- 4\n"));
|
|
|
|
//Special case - exactly one logical channel.
|
|
if(chandef->chanconf->config_id == WANCONFIG_AFT ||
|
|
chandef->chanconf->config_id == WANCONFIG_AFT_TE3){
|
|
|
|
snprintf(tmp_buff, MAX_PATH_LENGTH, " \"%s %s\" ",
|
|
"Protocol-------->",
|
|
"HDLC Streaming");
|
|
}else{
|
|
|
|
snprintf(tmp_buff, MAX_PATH_LENGTH, " \"%s %s\" ",
|
|
"Protocol-------->",
|
|
get_protocol_string(chandef->chanconf->config_id));
|
|
}
|
|
menu_str += tmp_buff;
|
|
|
|
snprintf(tmp_buff, MAX_PATH_LENGTH, " \"%d\" ", NET_IF_SETUP);
|
|
menu_str += tmp_buff;
|
|
|
|
if(next_level_obj_list != NULL){
|
|
|
|
//create the menu item
|
|
if(next_level_obj_list->get_size()){
|
|
snprintf(tmp_buff, MAX_PATH_LENGTH, " \"Interface Setup-> %d Defined\" ",
|
|
next_level_obj_list->get_size());
|
|
}else{
|
|
snprintf(tmp_buff, MAX_PATH_LENGTH, " \"Interface Setup-> Undefined\" ");
|
|
}
|
|
menu_str += tmp_buff;
|
|
}else{
|
|
|
|
//create the menu item
|
|
if(obj_list->get_size()){
|
|
snprintf(tmp_buff, MAX_PATH_LENGTH, " \"Interface Setup-> %d Defined\" ",
|
|
obj_list->get_size());
|
|
}else{
|
|
snprintf(tmp_buff, MAX_PATH_LENGTH, " \"Interface Setup-> Undefined\" ");
|
|
}
|
|
menu_str += tmp_buff;
|
|
|
|
}//if(next_level_obj_list != NULL)
|
|
|
|
}//if(obj_list->get_size() > 1)
|
|
}else{
|
|
|
|
//new configuration - NO protocol yet
|
|
if(obj_list->get_size() > 1){
|
|
FUNC_DBG();
|
|
|
|
//general case - more than one
|
|
snprintf(tmp_buff, MAX_PATH_LENGTH, " \"%s %s: %s\" ",
|
|
TIME_SLOT_GROUP_STR,
|
|
this_level_chandef->addr,
|
|
get_protocol_string(this_level_chandef->chanconf->config_id));
|
|
menu_str += tmp_buff;
|
|
|
|
}else{
|
|
|
|
//special case - exactly one
|
|
snprintf(tmp_buff, MAX_PATH_LENGTH, " \"Protocol--------> Not Configured\" ");
|
|
menu_str += tmp_buff;
|
|
}
|
|
}//if(this_level_chandef->chanconf->config_id != PROTOCOL_NOT_SET)
|
|
|
|
list_el_chan_def =
|
|
(list_element_chan_def*)obj_list->get_next_element(list_el_chan_def);
|
|
}//while()
|
|
|
|
}else{
|
|
ERR_DBG_OUT(("Invalid number of %s: %d!!\n", TIME_SLOT_GROUPS_STR, obj_list->get_size()));
|
|
return NO;
|
|
}
|
|
|
|
return YES;
|
|
}
|
|
|
|
//all Timeslot Groups check
|
|
int menu_new_device_configuration::check_aft_timeslot_groups_cfg()
|
|
{
|
|
objects_list * obj_list = cfr->main_obj_list;
|
|
list_element_chan_def* list_el_chan_def = NULL;
|
|
list_element_chan_def* first_list_el_chan_def = NULL;
|
|
chan_def_t* chandef;
|
|
text_box tb;
|
|
char tmp_buff[MAX_PATH_LENGTH];
|
|
wan_tdmv_conf_t* tdmv_conf=&cfr->link_defs->linkconf->tdmv_conf;
|
|
char local_is_there_a_voice_if = NO;
|
|
|
|
Debug(DBG_MENU_NEW_DEVICE_CONFIG,
|
|
("int menu_new_device_configuration::check_aft_timeslot_groups_cfg()\n"));
|
|
|
|
first_list_el_chan_def = list_el_chan_def = (list_element_chan_def*)obj_list->get_first();
|
|
|
|
if(list_el_chan_def != NULL){
|
|
chandef = &list_el_chan_def->data;
|
|
}
|
|
|
|
//int i = 0;
|
|
while(list_el_chan_def != NULL){
|
|
|
|
Debug(DBG_MENU_NEW_DEVICE_CONFIG,
|
|
("list_el_chan_def->data.addr: %s\n", list_el_chan_def->data.addr));
|
|
|
|
chandef = &list_el_chan_def->data;
|
|
|
|
Debug(DBG_MENU_NEW_DEVICE_CONFIG, ("chandef->usedby: %d, tdmv_span_no: %d\n",
|
|
chandef->usedby,tdmv_conf->span_no));
|
|
|
|
//some special checks may be needed, depending how 'group' is actually used.
|
|
switch(chandef->usedby)
|
|
{
|
|
case TDM_VOICE:
|
|
case TDM_VOICE_API:
|
|
local_is_there_a_voice_if = YES;
|
|
|
|
if(tdmv_conf->span_no == 0){
|
|
//user must initialize the span_no!
|
|
snprintf(tmp_buff, MAX_PATH_LENGTH, "Error: Span Number not set!\n\
|
|
Must be a non-zero number.\n\
|
|
Can be set under \"Interface Setup\" \n\
|
|
for any of TDM Voice interfaces.");
|
|
tb.show_error_message(lxdialog_path, NO_PROTOCOL_NEEDED, tmp_buff);
|
|
return NO;
|
|
}
|
|
break;
|
|
}//switch()
|
|
|
|
list_el_chan_def =
|
|
(list_element_chan_def*)obj_list->get_next_element(list_el_chan_def);
|
|
}
|
|
|
|
is_there_a_voice_if = local_is_there_a_voice_if;
|
|
|
|
return YES;
|
|
}
|
|
|
|
//FIXME: make sure it is done when user trying to exit this menu
|
|
/*
|
|
int menu_new_device_configuration::check_all_groups_of_channels_configured()
|
|
{
|
|
int rc = YES;
|
|
char tmp_buff[MAX_PATH_LENGTH];
|
|
//help text box
|
|
text_box tb;
|
|
|
|
objects_list * obj_list = cfr->main_obj_list;
|
|
list_element_chan_def* list_el_chan_def = (list_element_chan_def*)obj_list->get_first();
|
|
|
|
while(list_el_chan_def != NULL){
|
|
|
|
if(list_el_chan_def->data.chanconf->protocol == PROTOCOL_NOT_SET){
|
|
snprintf(tmp_buff, MAX_PATH_LENGTH,
|
|
"Error:\nConfiguration of \"%s %s\" is incomplete!\nProtocol is not set.",
|
|
TIME_SLOT_GROUP_STR, list_el_chan_def->data.addr);
|
|
tb.show_error_message(lxdialog_path, NO_PROTOCOL_NEEDED, tmp_buff);
|
|
|
|
rc = NO;
|
|
break;
|
|
}
|
|
list_el_chan_def = (list_element_chan_def*)obj_list->get_next_element(list_el_chan_def);
|
|
}
|
|
|
|
return rc;
|
|
}
|
|
*/
|