/*************************************************************************** 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