wanpipe/util/wancfg/menu_hardware_probe.cpp

1036 lines
31 KiB
C++

/***************************************************************************
menu_hardware_probe.cpp - description
-------------------
begin : Wed Mar 31 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. *
* *
***************************************************************************/
/*
* old
-------------------------------
| Wanpipe Hardware Probe Info |
-------------------------------
1 . S514-2-PCI : SLOT=4 : BUS=0 : IRQ=18 : CPU=A : PORT=PRI
2 . S514-2-PCI : SLOT=4 : BUS=0 : IRQ=18 : CPU=A : PORT=SEC
3 . S514-2-PCI : SLOT=4 : BUS=0 : IRQ=18 : CPU=B : PORT=PRI
4 . S514-2-PCI : SLOT=4 : BUS=0 : IRQ=18 : CPU=B : PORT=SEC
5 . S514-7-PCI : SLOT=3 : BUS=1 : IRQ=21 : CPU=A : PORT=PRI
6 . S514-7-PCI : SLOT=3 : BUS=1 : IRQ=21 : CPU=B : PORT=PRI
7 . AFT-A102 : SLOT=2 : BUS=1 : IRQ=22 : CPU=A : PORT=PRI
8 . AFT-A102 : SLOT=2 : BUS=1 : IRQ=22 : CPU=B : PORT=PRI
9 . AFT-A104 : SLOT=6 : BUS=0 : IRQ=16 : CPU=A : LINE=0
10. AFT-A104 : SLOT=6 : BUS=0 : IRQ=16 : CPU=A : LINE=1
11. AFT-A104 : SLOT=6 : BUS=0 : IRQ=16 : CPU=A : LINE=2
12. AFT-A104 : SLOT=6 : BUS=0 : IRQ=16 : CPU=A : LINE=3
Card Cnt: S508=0 S514X=2 S518=0 AFT=2
------------------------------------------------------------------
new1:
-------------------------------
| Wanpipe Hardware Probe Info |
-------------------------------
1 . S514-2-PCI : SLOT=4 : BUS=0 : IRQ=18 : CPU=A : PORT=PRI
2 . S514-2-PCI : SLOT=4 : BUS=0 : IRQ=18 : CPU=A : PORT=SEC
3 . S514-2-PCI : SLOT=4 : BUS=0 : IRQ=18 : CPU=B : PORT=PRI
4 . S514-2-PCI : SLOT=4 : BUS=0 : IRQ=18 : CPU=B : PORT=SEC
5 . S514-7-PCI : SLOT=3 : BUS=1 : IRQ=21 : CPU=A : PORT=PRI
6 . S514-7-PCI : SLOT=3 : BUS=1 : IRQ=21 : CPU=B : PORT=PRI
7 . AFT-A102 : SLOT=2 : BUS=1 : IRQ=22 : CPU=A : PORT=PRI
8 . AFT-A102 : SLOT=2 : BUS=1 : IRQ=22 : CPU=B : PORT=PRI
9 . AFT-A104 : SLOT=6 : BUS=0 : IRQ=16 : CPU=A : PORT=0
10. AFT-A104 : SLOT=6 : BUS=0 : IRQ=16 : CPU=A : PORT=1
11. AFT-A104 : SLOT=6 : BUS=0 : IRQ=16 : CPU=A : PORT=2
12. AFT-A104 : SLOT=6 : BUS=0 : IRQ=16 : CPU=A : PORT=3
new2:
-------------------------------
| Wanpipe Hardware Probe Info |
-------------------------------
1 . S514-2-PCI : SLOT=4 : BUS=0 : IRQ=177 : CPU=A : PORT=PRI
2 . S514-2-PCI : SLOT=4 : BUS=0 : IRQ=177 : CPU=A : PORT=SEC
3 . S514-2-PCI : SLOT=4 : BUS=0 : IRQ=177 : CPU=B : PORT=PRI
4 . S514-2-PCI : SLOT=4 : BUS=0 : IRQ=177 : CPU=B : PORT=SEC
5 . S514-7-PCI : SLOT=3 : BUS=1 : IRQ=217 : CPU=A : PORT=PRI
6 . S514-7-PCI : SLOT=3 : BUS=1 : IRQ=217 : CPU=B : PORT=PRI
7 . AFT-A104-SH : SLOT=6 : BUS=0 : IRQ=193 : CPU=A : PORT=1
8 . AFT-A104-SH : SLOT=6 : BUS=0 : IRQ=193 : CPU=A : PORT=2
9 . AFT-A104-SH : SLOT=6 : BUS=0 : IRQ=193 : CPU=A : PORT=3
10. AFT-A104-SH : SLOT=6 : BUS=0 : IRQ=193 : CPU=A : PORT=4
11. AFT-A102c : SLOT=2 : BUS=1 : IRQ=209 : CPU=A : PORT=PRI
12. AFT-A102c : SLOT=2 : BUS=1 : IRQ=209 : CPU=B : PORT=PRI
13. AFT-A104u : SLOT=5 : BUS=0 : IRQ=185 : CPU=A : PORT=1
14. AFT-A104u : SLOT=5 : BUS=0 : IRQ=185 : CPU=A : PORT=2
15. AFT-A104u : SLOT=5 : BUS=0 : IRQ=185 : CPU=A : PORT=3
16. AFT-A104u : SLOT=5 : BUS=0 : IRQ=185 : CPU=A : PORT=4
Card Cnt: S508=0 S514X=2 S518=0 A101-2=1 A104=2 A300=0
new3
-------------------------------
| Wanpipe Hardware Probe Info |
-------------------------------
1 . S514-2-PCI : SLOT=3 : BUS=0 : IRQ=177 : CPU=A : PORT=PRI
2 . S514-2-PCI : SLOT=3 : BUS=0 : IRQ=177 : CPU=A : PORT=SEC
3 . S514-2-PCI : SLOT=3 : BUS=0 : IRQ=177 : CPU=B : PORT=PRI
4 . S514-2-PCI : SLOT=3 : BUS=0 : IRQ=177 : CPU=B : PORT=SEC
5 . S514-7-PCI : SLOT=3 : BUS=1 : IRQ=225 : CPU=A : PORT=PRI
6 . S514-7-PCI : SLOT=3 : BUS=1 : IRQ=225 : CPU=B : PORT=PRI
7 . AFT-A104-SHc : SLOT=4 : BUS=0 : IRQ=185 : CPU=A : PORT=1 : HWEC=128
8 . AFT-A104-SHc : SLOT=4 : BUS=0 : IRQ=185 : CPU=A : PORT=2 : HWEC=128
9 . AFT-A104-SHc : SLOT=4 : BUS=0 : IRQ=185 : CPU=A : PORT=3 : HWEC=128
10. AFT-A104-SHc : SLOT=4 : BUS=0 : IRQ=185 : CPU=A : PORT=4 : HWEC=128
11. AFT-A200-SH : SLOT=6 : BUS=0 : IRQ=201 : CPU=A : PORT=PRI : HWEC=16
12. AFT-A102c : SLOT=2 : BUS=1 : IRQ=217 : CPU=A : PORT=PRI
13. AFT-A102c : SLOT=2 : BUS=1 : IRQ=217 : CPU=B : PORT=PRI
14. AFT-A104u : SLOT=5 : BUS=0 : IRQ=193 : CPU=A : PORT=1
15. AFT-A104u : SLOT=5 : BUS=0 : IRQ=193 : CPU=A : PORT=2
16. AFT-A104u : SLOT=5 : BUS=0 : IRQ=193 : CPU=A : PORT=3
17. AFT-A104u : SLOT=5 : BUS=0 : IRQ=193 : CPU=A : PORT=4
Card Cnt: S508=0 S514X=2 S518=0 A101-2=1 A104=2 A300=0 A200=1
new March 1, 2006 - A108
-------------------------------
| Wanpipe Hardware Probe Info |
-------------------------------
1 . S514-7-PCI : SLOT=3 : BUS=1 : IRQ=217 : CPU=A : PORT=PRI
2 . S514-7-PCI : SLOT=3 : BUS=1 : IRQ=217 : CPU=B : PORT=PRI
3 . AFT-A108-SH : SLOT=4 : BUS=0 : IRQ=177 : CPU=A : PORT=1 : HWEC=0
4 . AFT-A108-SH : SLOT=4 : BUS=0 : IRQ=177 : CPU=A : PORT=2 : HWEC=0
5 . AFT-A108-SH : SLOT=4 : BUS=0 : IRQ=177 : CPU=A : PORT=3 : HWEC=0
6 . AFT-A108-SH : SLOT=4 : BUS=0 : IRQ=177 : CPU=A : PORT=4 : HWEC=0
7 . AFT-A108-SH : SLOT=4 : BUS=0 : IRQ=177 : CPU=A : PORT=5 : HWEC=0
8 . AFT-A108-SH : SLOT=4 : BUS=0 : IRQ=177 : CPU=A : PORT=6 : HWEC=0
9 . AFT-A108-SH : SLOT=4 : BUS=0 : IRQ=177 : CPU=A : PORT=7 : HWEC=0
10. AFT-A108-SH : SLOT=4 : BUS=0 : IRQ=177 : CPU=A : PORT=8 : HWEC=0
11. AFT-A200-SH : SLOT=6 : BUS=0 : IRQ=193 : CPU=A : PORT=PRI : HWEC=0
12. AFT-A102c : SLOT=2 : BUS=1 : IRQ=209 : CPU=A : PORT=PRI
13. AFT-A102c : SLOT=2 : BUS=1 : IRQ=209 : CPU=B : PORT=PRI
14. AFT-A104u : SLOT=5 : BUS=0 : IRQ=185 : CPU=A : PORT=1
15. AFT-A104u : SLOT=5 : BUS=0 : IRQ=185 : CPU=A : PORT=2
16. AFT-A104u : SLOT=5 : BUS=0 : IRQ=185 : CPU=A : PORT=3
17. AFT-A104u : SLOT=5 : BUS=0 : IRQ=185 : CPU=A : PORT=4
Card Cnt: S508=0 S514X=1 S518=0 A101-2=1 A104=1 A300=0 A200=1 A108=1
*/
#include "menu_hardware_probe.h"
#include "text_box_help.h"
char* no_sangoma_cards_detected_str = "No Sangoma cards detected!";
char* hw_probe_help_str =
"Select a card for WANPIPE device\n"
"from a list of cards detected on the system.";
//PCI
int get_slot_from_str(char * str_buff, unsigned* PCI_slot_no);
int get_bus_from_str(char * str_buff, unsigned* pci_bus_no);
int get_cpu_from_str(char * str_buff, char* S514_CPU_no);
//ISA
int get_io_port_from_str(char * str_buff, unsigned* ioport);
#define DBG_MENU_HARDWARE_PROBE 1
#define DBG_CARD_LIST 1
static unsigned int longest_line_in_hwprobe_output = MENU_WIDTH+2;
menu_hardware_probe::menu_hardware_probe( IN char * lxdialog_path,
IN conf_file_reader* ptr_cfr)
{
Debug(DBG_MENU_HARDWARE_PROBE, ("menu_hardware_probe::menu_hardware_probe()\n"));
snprintf(this->lxdialog_path, MAX_PATH_LENGTH, "%s", lxdialog_path);
this->cfr = ptr_cfr;
#if defined(ZAPTEL_PARSER)
sang_card_list = NULL;
#endif
}
menu_hardware_probe::~menu_hardware_probe()
{
Debug(DBG_MENU_HARDWARE_PROBE, ("menu_hardware_probe::~menu_hardware_probe()\n"));
}
#if defined(ZAPTEL_PARSER)
menu_hardware_probe::menu_hardware_probe( IN sangoma_card_list *sang_card_list)
{
Debug(DBG_MENU_HARDWARE_PROBE,
("menu_hardware_probe::menu_hardware_probe(IN sangoma_card_list *sang_card_list)\n"));
this->sang_card_list = sang_card_list;
}
#endif
int menu_hardware_probe::run(OUT int * selection_index)
{
int rc;
char tmp_buff[MAX_PATH_LENGTH];
unsigned int option_selected;
char exit_dialog;
int number_of_items;
//help text box
text_box tb;
link_def_t * link_def;
wandev_conf_t *linkconf;
sdla_fe_cfg_t* fe_cfg;
Debug(DBG_MENU_HARDWARE_PROBE, ("menu_net_interface_setup::run()\n"));
again:
number_of_items = 6;
rc = YES;
option_selected = 0;
exit_dialog = NO;
link_def = cfr->link_defs;
linkconf = cfr->link_defs->linkconf;
fe_cfg = &linkconf->fe_cfg;
Debug(DBG_MENU_HARDWARE_PROBE, ("cfr->link_defs->name: %s\n", link_def->name));
Debug(DBG_MENU_HARDWARE_PROBE, ("current card_type: DEC:%d, HEX: 0x%X\n",
linkconf->card_type, linkconf->card_type));
menu_str = " ";
if(hardware_probe() == NO){
return NO;
}
Debug(DBG_MENU_HARDWARE_PROBE, ("returned from: hardware_probe()\n"));
//////////////////////////////////////////////////////////////////////////////////////
//create the explanation text for the menu
snprintf(tmp_buff, MAX_PATH_LENGTH,
"\nSelect card from the list of detected cards.");
if(set_configuration( YES,//indicates to call V2 of the function
MENU_BOX_BACK,//MENU_BOX_SELECT,
lxdialog_path,
"SELECT CARD FROM LIST",
WANCFG_PROGRAM_NAME,
tmp_buff,
MENU_HEIGTH,
//MENU_WIDTH+2,//some strings are very long, like for A104D-SH....
//MENU_WIDTH+5,//some strings are very long, like for A104D-SH....
//MENU_WIDTH+10,//some strings are very long, like for A104D-SH....
longest_line_in_hwprobe_output+6,
number_of_items,
(char*)menu_str.c_str()
) == NO){
rc = NO;
goto cleanup;
}
if(show(selection_index) == NO){
rc = NO;
goto cleanup;
}
//////////////////////////////////////////////////////////////////////////////////////
exit_dialog = NO;
switch(*selection_index)
{
case MENU_BOX_BUTTON_SELECT:
Debug(DBG_MENU_HARDWARE_PROBE,
("hardware_setup: option selected for editing: %s\n", get_lxdialog_output_string()));
//if no cards detected, return
if(strcmp(replace_new_line_with_zero_term(get_lxdialog_output_string()),
no_sangoma_cards_detected_str) == 0){
rc = YES;
goto cleanup;
}
if(parse_selected_card_line(
replace_new_line_with_zero_term(get_lxdialog_output_string()),
&linkconf->card_type,
&link_def->card_version,
&link_def->card_sub_version) == NO){
ERR_DBG_OUT(("Failed to get Card Type from selected card line!! line: %s\n",
get_lxdialog_output_string()));
rc = NO;
goto cleanup;
}
//get card location
if(get_card_location_from_hwprobe_line(linkconf,
link_def,
replace_new_line_with_zero_term(get_lxdialog_output_string())) == NO){
ERR_DBG_OUT(("Failed to get Card Location from selected card line!! line: %s\n",
get_lxdialog_output_string()));
rc = NO;
goto cleanup;
}
linkconf->auto_hw_detect = WANOPT_NO;
rc = YES;
exit_dialog = YES;
break;
case MENU_BOX_BUTTON_HELP:
tb.show_help_message(lxdialog_path, NO_PROTOCOL_NEEDED, hw_probe_help_str);
break;
case MENU_BOX_BUTTON_EXIT:
exit_dialog = YES;
break;
}//switch(*selection_index)
if(exit_dialog == NO){
goto again;
}
cleanup:
return rc;
}
int menu_hardware_probe::hardware_probe()
{
int system_rc;
FILE * hwprobe_file_tmp;
char str_buff[MAX_PATH_LENGTH];
char shell_command_line[MAX_PATH_LENGTH];
char* tmp_hwprobe_file_full_path = "/tmp/tmp_hwprobe_file";
int probed_cards_count=0;
string local_menu_str;
local_menu_str = " ";
snprintf(shell_command_line, MAX_PATH_LENGTH, "wanrouter hwprobe > %s", tmp_hwprobe_file_full_path);
Debug(DBG_MENU_HARDWARE_PROBE, ("hardware_probe(): shell_command_line : %s\n",
shell_command_line));
system_rc = system(shell_command_line);
if(system_rc){
ERR_DBG_OUT(
("The hardware probe command failed! Check WANPIPE is installed properly.(system_rc : 0x%X)\n",
system_rc));
return NO;
}
if(verify_hwprobe_command_is_successfull() == NO){
ERR_DBG_OUT(("Hardware probe failed!! Check wanpipe installation.\n"));
return NO;
}
hwprobe_file_tmp = fopen(tmp_hwprobe_file_full_path, "r+");
if(hwprobe_file_tmp == NULL){
ERR_DBG_OUT(("Failed to open %s file for reading!!\n", tmp_hwprobe_file_full_path));
return NO;
}
do{
fgets(str_buff, MAX_PATH_LENGTH, hwprobe_file_tmp);
if(!feof(hwprobe_file_tmp)){
Debug(DBG_MENU_HARDWARE_PROBE, ("%s\n", str_buff));
//skip irrelevant lines
//only lines starting with numbers (0 not allowed) should be displayed.
if(atoi(&str_buff[0]) != 0){
//this pointer skips the the line number by searching for first dot '.'
char* tmp_str = strchr(str_buff, '.');
if(tmp_str == NULL){
ERR_DBG_OUT(("Invalid format of 'hwprobe' output line!! (not '.' found)\n"));
return NO;
}
tmp_str += 2;
//tokens separated by ':' chars and UNKNOWN number of ' ' (space) chars.
//remove all ' ' chars, so only ':' will remain.
tokenize_string(tmp_str, " ", shell_command_line, MAX_PATH_LENGTH);
//now replace each ':' with a single ' ' (space), so it will be
//displayed nicely in the dialog.
replace_char_with_other_char_in_str(shell_command_line, ':', ' ');
memcpy(str_buff, shell_command_line, MAX_PATH_LENGTH);
replace_new_line_with_zero_term(str_buff);
if(longest_line_in_hwprobe_output < strlen(str_buff)){
longest_line_in_hwprobe_output = strlen(str_buff);
}
//tag and item strings are the same.
snprintf(shell_command_line, MAX_PATH_LENGTH, " \"%s\" ", str_buff);
Debug(DBG_MENU_HARDWARE_PROBE, ("1.shell_command_line: %s\n", shell_command_line));
local_menu_str += shell_command_line;
snprintf(shell_command_line, MAX_PATH_LENGTH, " \"%s\" ", str_buff);
Debug(DBG_MENU_HARDWARE_PROBE, ("2.shell_command_line: %s\n", shell_command_line));
local_menu_str += shell_command_line;
probed_cards_count++;
#if defined(ZAPTEL_PARSER)
if(sang_card_list != NULL){
add_card_to_list(shell_command_line);
}
#endif
}
}
}while(!feof(hwprobe_file_tmp));
fclose(hwprobe_file_tmp);
snprintf(shell_command_line, MAX_PATH_LENGTH, "rm -rf %s", tmp_hwprobe_file_full_path);
system_rc = system(shell_command_line);
if(system_rc){
ERR_DBG_OUT(("Failed to remove temporary file: %s! (system_rc : 0x%X)\n",
tmp_hwprobe_file_full_path, system_rc));
}
if(probed_cards_count == 0){
local_menu_str = " ";
snprintf(shell_command_line, MAX_PATH_LENGTH, " \"%s\" ", no_sangoma_cards_detected_str);
local_menu_str += shell_command_line;
snprintf(shell_command_line, MAX_PATH_LENGTH, " \"%s\" ", no_sangoma_cards_detected_str);
local_menu_str += shell_command_line;
}
menu_str = local_menu_str.c_str();
Debug(DBG_MENU_HARDWARE_PROBE, ("returning from hardware_probe()\n"));
return YES;
}
int menu_hardware_probe::parse_selected_card_line(char *selected_card_line,
unsigned int *card_type,
unsigned int *card_version,
unsigned int *card_sub_version)
{
char * tmp;
int rc = NO;
//
//S514 cards:
//
tmp = strstr(selected_card_line, "S514-1");
if(tmp != NULL){
rc = YES;
*card_type = WANOPT_S51X;
*card_version = S5141_ADPTR_1_CPU_SERIAL;
goto done;
}
tmp = strstr(selected_card_line, "S514-2");
if(tmp != NULL){
rc = YES;
//used the same way as S5141
*card_type = WANOPT_S51X;
*card_version = S5141_ADPTR_1_CPU_SERIAL;
goto done;
}
tmp = strstr(selected_card_line, "S514-3");
if(tmp != NULL){
rc = YES;
//FT1 is the same as Serial S5141
*card_type = WANOPT_S51X;
*card_version = S5141_ADPTR_1_CPU_SERIAL;
goto done;
}
tmp = strstr(selected_card_line, "S514-4");
if(tmp != NULL){
rc = YES;
*card_type = WANOPT_S51X;
*card_version = S5144_ADPTR_1_CPU_T1E1;
goto done;
}
tmp = strstr(selected_card_line, "S514-5");
if(tmp != NULL){
rc = YES;
*card_type = WANOPT_S51X;
*card_version = S5145_ADPTR_1_CPU_56K;
goto done;
}
tmp = strstr(selected_card_line, "S514-7");
if(tmp != NULL){
rc = YES;
//the same as S5144
*card_type = WANOPT_S51X;
*card_version = S5144_ADPTR_1_CPU_T1E1;
goto done;
}
tmp = strstr(selected_card_line, "S514-8");
if(tmp != NULL){
rc = YES;
//the same as S5144
*card_type = WANOPT_S51X;
*card_version = S5144_ADPTR_1_CPU_T1E1;
goto done;
}
//
//POS card treated as S5141
//
tmp = strstr(selected_card_line, "S515");
if(tmp != NULL){
rc = YES;
//the same as S5141
*card_type = WANOPT_S51X;
*card_version = S5144_ADPTR_1_CPU_T1E1;
goto done;
}
//
//S508 card:
//
tmp = strstr(selected_card_line, "S508");
if(tmp != NULL){
rc = YES;
*card_type = WANOPT_S50X;
*card_version = NOT_SET;
goto done;
}
//
//ADSL card
//
tmp = strstr(selected_card_line, "S518");
if(tmp != NULL){
rc = YES;
*card_type = WANOPT_ADSL;
*card_version = NOT_SET;
goto done;
}
//
//A104 (AFT) quad port T1/E1 card. A108 handled the same way as A104.
//August 11, 2006: added A101/A102 Shark
if( strstr(selected_card_line, "AFT-A104") != NULL ||
strstr(selected_card_line, "AFT-A108") != NULL ||
strstr(selected_card_line, "AFT-A116") != NULL ||
strstr(selected_card_line, "AFT-A101-SH") != NULL ||
strstr(selected_card_line, "AFT-A102-SH") != NULL){
Debug(DBG_MENU_HARDWARE_PROBE, ("found \"AFT-A104\" string\n"));
rc = YES;
*card_type = WANOPT_AFT;
*card_version = A104_ADPTR_4TE1;//indicates A104 and A101/A102 Shark
char *hw_ec_max_num_ptr = strstr(selected_card_line, "HWEC=");
if(hw_ec_max_num_ptr != NULL){
char *max_ec_str = strdup(hw_ec_max_num_ptr);
char *max_ec_ptr = max_ec_str;
char *tmp_str = strstr(max_ec_str, ":");
if (tmp_str != NULL) {
*(tmp_str-1)='\0';
}
Debug(DBG_MENU_HARDWARE_PROBE, ("hw_ec_max_num_ptr: %s\n", hw_ec_max_num_ptr));
max_ec_str += strlen("HWEC=");
//valid values are: 0, 32, 128, 256.
//0 (zero) means there is no HWEC on the card.
global_hw_ec_max_num = atoi(max_ec_str);
Debug(DBG_MENU_HARDWARE_PROBE, ("global_hw_ec_max_num: %d\n", global_hw_ec_max_num));
free(max_ec_ptr);
}
#if defined(ZAPTEL_PARSER)
if( strstr(selected_card_line, "SH") != NULL){
Debug(DBG_MENU_HARDWARE_PROBE, ("*card_sub_version = A104D\n"));
*card_sub_version = A104D;
}else{
Debug(DBG_MENU_HARDWARE_PROBE, ("*card_sub_version = A104\n"));
*card_sub_version = A104;
}
#endif
goto done;
}
//
//Old (original) A101/2 (AFT) T1/E1 card
//
if( strstr(selected_card_line, "A100") != NULL ||
strstr(selected_card_line, "AFT-A101") != NULL ||
strstr(selected_card_line, "AFT-A102") != NULL ){
rc = YES;
*card_type = WANOPT_AFT;
*card_version = A101_ADPTR_1TE1;//WAN_MEDIA_T1;//indicates A101
goto done;
}
//
//A105 (AFT) T3/E3 card
//
if( strstr(selected_card_line, "A105-1-PCI") != NULL ||
strstr(selected_card_line, "A105-2-PCI") != NULL ||
strstr(selected_card_line, "AFT-A301") != NULL ||
strstr(selected_card_line, "AFT-A300") != NULL){
rc = YES;
*card_type = WANOPT_AFT;
*card_version = A300_ADPTR_U_1TE3;//WAN_MEDIA_DS3;//indicates A105
goto done;
}
//
//Analog card
//
if( strstr(selected_card_line, "AFT-A200-SH") != NULL ||
strstr(selected_card_line, "AFT-A400-SH") != NULL ){
rc = YES;
*card_type = WANOPT_AFT;
*card_version = A200_ADPTR_ANALOG;
global_card_type = WANOPT_AFT;
global_card_version = A200_ADPTR_ANALOG;
char *hw_ec_max_num_ptr = strstr(selected_card_line, "HWEC=");
if(hw_ec_max_num_ptr != NULL){
Debug(DBG_MENU_HARDWARE_PROBE, ("hw_ec_max_num_ptr: %s\n", hw_ec_max_num_ptr));
hw_ec_max_num_ptr += strlen("HWEC=");
//valid values are: 0, 32, 128.
//0 (zero) means there is no HWEC on the card.
global_hw_ec_max_num = atoi(hw_ec_max_num_ptr);
Debug(DBG_MENU_HARDWARE_PROBE, ("global_hw_ec_max_num: %d\n", global_hw_ec_max_num));
}
goto done;
}
//
//A056 (AFT) 56k DDS card
//
if( strstr(selected_card_line, "AFT-A056-SH") != NULL){
rc = YES;
*card_type = WANOPT_AFT;
*card_version = AFT_ADPTR_56K;
goto done;
}
//
//ISDN BRI card
//
if( strstr(selected_card_line, "AFT-A500-SH") != NULL ||
strstr(selected_card_line, "AFT-A500-SH") != NULL ){
rc = YES;
*card_type = WANOPT_AFT;
*card_version = AFT_ADPTR_ISDN;
global_card_type = WANOPT_AFT;
global_card_version = AFT_ADPTR_ISDN;
char *hw_ec_max_num_ptr = strstr(selected_card_line, "HWEC=");
if(hw_ec_max_num_ptr != NULL){
Debug(DBG_MENU_HARDWARE_PROBE, ("hw_ec_max_num_ptr: %s\n", hw_ec_max_num_ptr));
hw_ec_max_num_ptr += strlen("HWEC=");
//valid values are: 0, 32, 128.
//0 (zero) means there is no HWEC on the card.
global_hw_ec_max_num = atoi(hw_ec_max_num_ptr);
Debug(DBG_MENU_HARDWARE_PROBE, ("global_hw_ec_max_num: %d\n", global_hw_ec_max_num));
}
goto done;
}
//
//A14X (AFT) Serial card
//
if( strstr(selected_card_line, "AFT-A142-SH") != NULL ||
strstr(selected_card_line, "AFT-A144-SH") != NULL){
rc = YES;
*card_type = WANOPT_AFT;
*card_version = AFT_ADPTR_2SERIAL_V35X21;
global_card_type = WANOPT_AFT;
global_card_version = AFT_ADPTR_2SERIAL_V35X21;
goto done;
}
done:
if(global_hw_ec_max_num == 1){
//it is default value! it means the card does NOT have HWEC.
global_hw_ec_max_num = 0;
}
return rc;
}
int menu_hardware_probe::get_card_location_from_hwprobe_line( wandev_conf_t* linkconf,
link_def_t * link_def,
char* selected_card_line)
{
text_box tb;
sdla_fe_cfg_t* fe_cfg;
fe_cfg = &linkconf->fe_cfg;
switch(linkconf->card_type)
{
case WANOPT_S50X:
//get ISA stuff. only IO port is detected
if(get_io_port_from_str(selected_card_line, &linkconf->ioport) == NO){
ERR_DBG_OUT(("Failed to get 'ioport' from line: %s!\n",
selected_card_line));
return NO;
}
break;
case WANOPT_S51X:
case WANOPT_ADSL:
case WANOPT_AFT:
//get PCI stuff
if(get_slot_from_str(selected_card_line, &linkconf->PCI_slot_no) == NO){
ERR_DBG_OUT(("Failed to get 'PCI_slot_no' from line: %s!\n",
selected_card_line));
return NO;
}
if(get_bus_from_str(selected_card_line, &linkconf->pci_bus_no) == NO){
ERR_DBG_OUT(("Failed to get 'pci_bus_no' from line: %s!\n",
selected_card_line));
return NO;
}
//ADSL card always have only one CPU. But check anyway
if(get_cpu_from_str(selected_card_line, linkconf->S514_CPU_no) == NO &&
linkconf->card_type == WANOPT_S51X){
ERR_DBG_OUT(("Failed to get 'S514_CPU_no' from line: %s!\n",
selected_card_line));
return NO;
}
break;
default:
ERR_DBG_OUT(("Unsupported card type selected %d!\n",
linkconf->card_type));
tb.show_error_message(lxdialog_path, NO_PROTOCOL_NEEDED,
"Unsupported card type selected");
return NO;
}
if( (link_def->card_version != A104_ADPTR_4TE1) &&
(link_def->card_version != AFT_ADPTR_ISDN) &&
(link_def->card_version != AFT_ADPTR_2SERIAL_V35X21)){
//get the port
return get_port_from_str(selected_card_line, &linkconf->comm_port);
}else{
//get line_no
return get_line_number_from_str(selected_card_line, &fe_cfg->line_no);
}
}
int get_slot_from_str(char * str_buff, unsigned* PCI_slot_no)
{
char * tmp;
int i_tmp;
tmp = strstr(str_buff, "SLOT=");
if(tmp == NULL){
return NO;
}
tmp += strlen("SLOT=");
i_tmp = atoi(tmp);
Debug(DBG_MENU_HARDWARE_PROBE, ("get_slot_from_str() : slot : %d\n", i_tmp));
*PCI_slot_no = i_tmp;
return YES;
}
int get_bus_from_str(char * str_buff, unsigned* pci_bus_no)
{
char * tmp;
int i_tmp;
tmp = strstr(str_buff, "BUS=");
if(tmp == NULL){
return NO;
}
tmp += strlen("BUS=");
i_tmp = atoi(tmp);
Debug(DBG_MENU_HARDWARE_PROBE, ("get_bus_from_str() : bus : %d\n", i_tmp));
*pci_bus_no = i_tmp;
return YES;
}
int get_cpu_from_str(char * str_buff, char* S514_CPU_no)
{
char * tmp;
int i_tmp;
tmp = strstr(str_buff, "CPU=");
if(tmp == NULL){
return NO;
}
tmp += strlen("CPU=");
i_tmp = *tmp;
Debug(DBG_MENU_HARDWARE_PROBE,
("get_cpu_from_str() : CPU : %c\n", (i_tmp == 'A') ? 'A' : 'B'));
//*S514_CPU_no = i_tmp;
S514_CPU_no[0] = i_tmp;
return YES;
}
int menu_hardware_probe::get_port_from_str(char * str_buff, unsigned int* comm_port)
{
char * tmp = str_buff;
link_def_t * link_def;
wandev_conf_t *linkconf;
link_def = cfr->link_defs;
linkconf = cfr->link_defs->linkconf;
Debug(DBG_MENU_HARDWARE_PROBE, ("get_port_from_str(): str_buff: %s\n", str_buff));
//for ISA card the 'ioport' is displayed first,
//it may fail the 'comms port' parsing. skip past the 'ioport'.
if(linkconf->card_type == WANOPT_S50X){
tmp = strstr(str_buff, "IOPORT=");
if(tmp == NULL){
Debug(DBG_MENU_HARDWARE_PROBE, ("get_port_from_str(): failed to find IOPORT str.\n"));
return NO;
}
Debug(DBG_MENU_HARDWARE_PROBE, ("get_port_from_str(): skipping past IOPORT...\n"));
tmp += strlen("IOPORT=");
}
tmp = strstr(tmp, "PORT=");
if(tmp == NULL){
return NO;
}
tmp += strlen("PORT=");
/*
if(strcmp(tmp, "PRI") == 0){
*comm_port = 0;
Debug(DBG_MENU_HARDWARE_PROBE, ("get_port_from_str(): PORT : PRI\n"));
}else if(strcmp(tmp, "SEC") == 0){
*comm_port = 1;
Debug(DBG_MENU_HARDWARE_PROBE, ("get_port_from_str(): PORT : SEC\n"));
}else{
Debug(DBG_MENU_HARDWARE_PROBE, ("get_port_from_str(): Invalid Port!!\n"));
ERR_DBG_OUT(("Failed to get 'comm_port' from line: %s!\n", str_buff));
return NO;
}
*/
if(strstr(tmp, "PRI") != NULL){
*comm_port = 0;
Debug(DBG_MENU_HARDWARE_PROBE, ("get_port_from_str(): PORT : PRI\n"));
}else if(strstr(tmp, "SEC") != NULL){
*comm_port = 1;
Debug(DBG_MENU_HARDWARE_PROBE, ("get_port_from_str(): PORT : SEC\n"));
}else{
*comm_port = 0;
}
return YES;
}
int get_io_port_from_str(char * str_buff, unsigned* ioport)
{
char * tmp;
tmp = strstr(str_buff, "IOPORT");
if(tmp == NULL){
return NO;
}
//skip past '='
tmp = strstr(str_buff, "=");
if(tmp == NULL){
return NO;
}
tmp += strlen("=");
*ioport = strtoul(tmp, NULL, 16);
Debug(DBG_MENU_HARDWARE_PROBE, ("get_port_from_str(): IOPORT: 0x%X\n", *ioport));
return YES;
}
//original 'LINE=' was changed to 'PORT=' in the 'hwprobe'
int menu_hardware_probe::get_line_number_from_str(char * str_buff, unsigned int* line_no)
{
char * tmp = str_buff;
Debug(DBG_MENU_HARDWARE_PROBE, ("get_line_number_from_str(): str_buff: %s\n", str_buff));
//tmp = strstr(tmp, "LINE=");
tmp = strstr(tmp, "PORT=");
if(tmp == NULL){
return NO;
}
//tmp += strlen("LINE=");
tmp += strlen("PORT=");
*line_no = atoi(tmp);
Debug(DBG_MENU_HARDWARE_PROBE, ("got line_no: %d\n", *line_no));
return YES;
}
int menu_hardware_probe::verify_hwprobe_command_is_successfull()
{
char* expected_str = "Wanpipe Hardware Probe Info";
FILE * hwprobe_file_tmp;
char str_buff[MAX_PATH_LENGTH];
char* tmp_hwprobe_file_full_path = "/tmp/tmp_hwprobe_file";
char rc = NO;
hwprobe_file_tmp = fopen(tmp_hwprobe_file_full_path, "r+");
if(hwprobe_file_tmp == NULL){
ERR_DBG_OUT(("Failed to open %s file for reading!!\n", tmp_hwprobe_file_full_path));
return NO;
}
do{
fgets(str_buff, MAX_PATH_LENGTH, hwprobe_file_tmp);
if(!feof(hwprobe_file_tmp)){
Debug(DBG_MENU_HARDWARE_PROBE, ("%s\n", str_buff));
//search for the 'expected_str'
if(strstr(str_buff, expected_str)){
//exit(0);
rc = YES;
break;
}
}
}while(!feof(hwprobe_file_tmp));
fclose(hwprobe_file_tmp);
return rc;
}
#if defined(ZAPTEL_PARSER)
int menu_hardware_probe::add_card_to_list(IN char *hw_probe_output_line)
{
int rc = YES, key;
unsigned int card_type;
int card_version = 0, card_sub_version = 0;
unsigned int line_no, PCI_slot_no, pci_bus_no;
char S514_CPU_no[10];
list_element_sangoma_card *sangoma_card, *last_in_list_card;
if(parse_selected_card_line(
replace_new_line_with_zero_term(hw_probe_output_line),
(unsigned int*)&card_type,
(unsigned int*)&card_version,
(unsigned int*)&card_sub_version) == NO){
ERR_DBG_OUT(("Failed to get Card Type from from Hardware Proble output line!! line: %s\n",
hw_probe_output_line));
rc = NO;
goto cleanup;
}
switch(sang_card_list->get_list_card_type())
{
case CARD_TYPE_ANY:
//caller needs ALL detected cards
break;
case WANOPT_AFT:
//caller needs only TE1 cards
if(card_type == WANOPT_AFT && (card_version == A101_ADPTR_1TE1 || card_version == A104_ADPTR_4TE1)){
break;
}else{
rc = YES;
goto cleanup;
}
case WANOPT_AFT_ANALOG:
//caller needs only Analog cards
if(card_type == WANOPT_AFT && card_version == A200_ADPTR_ANALOG){
break;
}else{
rc = YES;
goto cleanup;
}
default:
//not interested in other cards
rc = YES;
goto cleanup;
}
if(get_line_number_from_str(hw_probe_output_line, &line_no) == NO){
ERR_DBG_OUT(("Failed to get Line Number (Port) from Hardware Proble output line!! line: %s\n",
hw_probe_output_line));
rc = NO;
goto cleanup;
}
if(get_slot_from_str(hw_probe_output_line, &PCI_slot_no) == NO){
ERR_DBG_OUT(("Failed to get 'PCI_slot_no' from line: %s!\n",
hw_probe_output_line));
return NO;
}
if(get_bus_from_str(hw_probe_output_line, &pci_bus_no) == NO){
ERR_DBG_OUT(("Failed to get 'pci_bus_no' from line: %s!\n",
hw_probe_output_line));
return NO;
}
//ADSL card always have only one CPU. But check anyway
if(get_cpu_from_str(hw_probe_output_line, S514_CPU_no) == NO){
ERR_DBG_OUT(("Failed to get 'S514_CPU_no' from line: %s!\n",
hw_probe_output_line));
return NO;
}
Debug(DBG_CARD_LIST, ("%s(): adding card_type: %d, card_version: %d\n\
line_no: %d, PCI_slot_no: %d, pci_bus_no: %d, CPU: %c\n",
__FUNCTION__, card_type, card_version, line_no, PCI_slot_no, pci_bus_no,
S514_CPU_no[0]));
sangoma_card = new list_element_sangoma_card( card_type, card_version,
line_no, PCI_slot_no, pci_bus_no,
S514_CPU_no[0], card_sub_version);
if((last_in_list_card = (list_element_sangoma_card*)sang_card_list->get_last()) == NULL){
key = 1;
}else{
key = last_in_list_card->get_key() + 1;
}
sangoma_card->set_key(key);
sang_card_list->insert((list_element*)sangoma_card);
cleanup:
return rc;
}
#endif