/* TCAP monitor c file */ /* Written by Liu Zhiguo 2002-05-06 */ /* Version 1.0 */ /* ----------------------------------- */ #include "../../public/src/include/pub_include.h" #include "../../sccp/src/include/sccp.h" #include "../../debug/src/include/debug.h" #include "../../snmp/src/include/snmp.h" #include "../../snmp/src/include/heartbeat.h" #include "./include/tcap_public.h" #include "./include/tcap_struct.h" #include "./include/idmanage.h" /*@ignore@*/ #define LED_GREEN 9 #define LED_YELLOW 10 #define LED_RED 11 #define MAX_PAGE 8 #define MAX_LINE 22 #define STATE_LINE 20 #define TCAP_CSTA_INTERVAL 15 // tcap CDR interval time:15 minutes #define TCAP_PREOBJ_LEN 12 // tcap prefix object id length #define TCAP_HBOBJ_LEN 14 // tcap heartbeat led object id length #define TCAP_ID_LEN 15 #define TCAP_TITLE_LEN 16 #define TCAP_LINE_LEN 17 #define TCAP_PAGE_POINT 14 #define TCAP_LINE_POINT 15 #define TCAP_VERSION_LEN 3 static struct tcapdebug_struct *debug_ptr; extern u32 tcap_dlg_stats[MAX_DIALOGUEID]; static u8 tcap_1s_flag; static u8 tcap_10s_flag; static u8 sec_page; static u8 *disp_ptr; static u8 tcap_status = 1; static u32 tcap_object_id[] = {1,3,6,1,4,1,1373,1,3,2,2,4}; static u32 tcap_status_id[] = {1,3,6,1,4,1,1373,1,3,2,3,1,2,TCAP_MODULE_ID + 2,1}; static u32 tcap_version_id[] = {1,3,6,1,4,1,1373,1,3,2,3,1,2,TCAP_MODULE_ID + 2,2}; static u32 tcap_ascin_id[] = {1,3,6,1,4,1,1373,1,3,2,3,1,2,TCAP_MODULE_ID + 2,3}; static u32 tcap_ascout_id[] = {1,3,6,1,4,1,1373,1,3,2,3,1,2,TCAP_MODULE_ID + 2,4}; static u32 tcap_page_title[] = {1,3,6,1,4,1,1373,1,3,2,3,1,2,TCAP_MODULE_ID + 2,5,1}; static u32 tcap_page_line[] = {1,3,6,1,4,1,1373,1,3,2,3,1,2,TCAP_MODULE_ID + 2,5,2,2}; //static u8 tcap_ver[] = {6,5,10}; static u8 tcap_ver[] = {9,0,6}; static u8 title1[] = {"Page 01\t\tTCAP module information\r\n\nStart time\r\nCurrent time\r\nInvoke timer\r\nReject timer\r\nMonitor did\r\nTcap status\r\n"}; static u8 title2[] = {"Page 02\t\tTCAP watch_dog page\r\n\t\t 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15\r\n"}; static u8 title3[] = {"Page 03\t\tTCAP CSTA information\r\n\t\t 00\t 01\t 02\t 03\t 04\r\nSection page\r\n"}; static u8 ascii[16] = {0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37, 0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46}; void HexToDisplay(u8 *to_asc, u8 *from_hex, u8 from_len) { int i, j = 0; for (i = 0; i < from_len; i++) { to_asc[j] = ascii[from_hex[i] >> 4]; j++; to_asc[j] = ascii[from_hex[i] & 0x0f]; j++; to_asc[j] = ' '; j++; } to_asc[j] = '\0'; } void tcap_send_ascout(char *asc_str) { if (debug_ptr->send_control == 1) return; if ((strlen(asc_str) + strlen(debug_ptr->ascout_buf)) > TCAP_ASCOUT_LEN/2) // buffer is full { debug_ptr->send_control = 1; // strcat(debug_ptr->ascout_buf,"\r\n--\r\n"); // strcpy(debug_ptr->ascout_buf,asc_str); } else strcat(debug_ptr->ascout_buf,asc_str); } void tcap_send_error(char *err_str) { char info_str[1024]; if (debug_ptr->error_switch == 0 || debug_ptr->send_control == 1) return; sprintf(info_str,"\33[31m%s\33[0m\n\r\n\r",err_str); tcap_send_ascout(info_str); } void tcap_send_info(char *info) { char info_str[1024]; if (debug_ptr->sccp_switch == 0 || debug_ptr->send_control == 1) return; sprintf(info_str,"%s\n\r",info); tcap_send_ascout(info_str); } u8 tcap_disp_line(u8 page,u8 line) { u8 line_len=0; u32 ii; disp_ptr = tcap_ver; switch (page) { case 1: // page 1 switch (line) { case 0: disp_ptr = debug_ptr->start_time; line_len = 6; break; case 1: disp_ptr = debug_ptr->current_time; line_len = 6; break; case 2: // invoke time disp_ptr = &debug_ptr->default_invtime; line_len = 1; break; case 3: // reject time disp_ptr = &debug_ptr->default_rejtime; line_len = 1; break; case 4: // monitor dialogue id disp_ptr = (u8 *) &debug_ptr->monitor_did; line_len = 4; break; case 5: // heartbeat status disp_ptr = debug_ptr->hb_status; line_len = TCAP_HB_LEN; break; case 6: line_len = 8; disp_ptr = (u8 *)&debug_ptr->local_ip; break; default: line_len = 0; break; } break; case 2: // page 2 if (line < 16) { disp_ptr = debug_ptr->watch_dog + line * 16; line_len = 16; } break; case 3: // page 3 if (line == 0) { disp_ptr = &sec_page; line_len = 1; } else if (line < TCAP_UTILIZE_LEN/5+1) { ii = sec_page % (TCAP_UTILIZE_COUNT-1); disp_ptr = (char *)&debug_ptr->tc_utilize[ii][(line-1)*5]; line_len = 20; } break; case 4: // tcap state if (line < STATE_LINE) { ii = (sec_page * STATE_LINE + line) % (tcap_ptr->grantdid); disp_ptr = (u8 *) &tcap_ptr->tcapvm_data[ii].peer_tid; line_len = 20; } else if (line == STATE_LINE+1) { disp_ptr = &sec_page; line_len = 1; } break; case 5: // ism state if (line < MAX_TEMPINVOKEID) { ii = sec_page % (tcap_ptr->grantdid); disp_ptr = (u8 *) &tcap_ptr->tcapvm_data[ii].ism_data[line].used_flag; line_len = 20; } else if (line == MAX_TEMPINVOKEID+1) { disp_ptr = &sec_page; line_len = 1; } break; default: line_len = 0; break; } return line_len; } void tcap_disp_page(u8 page) { u8 line; u8 line_len; tcap_page_line[TCAP_PAGE_POINT] = page + 5; for (line = 0;line < MAX_LINE;line ++) { line_len = tcap_disp_line(page,line); tcap_page_line[TCAP_LINE_POINT] = line + 2; debug_set_response(TCAP_LINE_LEN,tcap_page_line,disp_ptr,line_len); } } int tcap_snmp_set(u8 oid_len,u32 *oid,u8 *data_buf,u16 data_len) { u8 ii; ii = TCAP_PREOBJ_LEN; if (oid_len < ii+2) return -1; switch (oid[ii]) { case 2: // set timer switch (oid[ii+1]) { case 1: // set invoke timer if (data_len == 1) // only one octet { debug_ptr->default_invtime = data_buf[0]; return 1; } break; case 2: // set reject timer if (data_len == 1) { debug_ptr->default_rejtime = data_buf[0]; return 1; } break; case 3: // set monitor switch switch (oid[ii+2]) { case 1: // monitor SCCP if (data_len == 1) { debug_ptr->sccp_switch = data_buf[0]; return 1; } break; case 2: // monitor tcu if (data_len == 1) { debug_ptr->tcu_switch = data_buf[0]; return 1; } break; case 3: // monitor error if (data_len == 1) { debug_ptr->error_switch = data_buf[0]; return 1; } break; case 4: // monitor dialogue id if (data_len <= 4) { debug_ptr->monitor_did = bcdtou32(data_buf,data_len); return data_len; } break; default: break; } break; default: break; } break; default: break; } return -1; // set fail } int tcap_snmp_get(u8 oid_len,u32 *oid,u8 *data_buf,u8 *data_type) { u8 ii,jj,kk; int data_len=-1; ii = TCAP_PREOBJ_LEN; if (oid_len <= ii+1) return -1; switch (oid[ii]) // judge object id { case 1: // measure if (oid_len != ii + 2) // reach instance, get total measure data return -1; // not support if (oid[ii+1] > TCAP_UTILIZE_COUNT-2) return -1; if (oid[ii+1] == debug_ptr->current_csta) return -1; jj = oid[ii+1]; if (debug_ptr->csta_time[jj] == 0) return 0; u32tobyte(data_buf,debug_ptr->csta_time[jj]); data_len = 4; for (kk = 0;kk < TCAP_UTILIZE_LEN;kk ++) u32tobyte(data_buf+(kk+1)*4,debug_ptr->tc_utilize[jj][kk]); data_len += TCAP_UTILIZE_LEN * 4; *data_type = 4; break; case 2: // configure switch (oid[ii+1]) { case 1: // invoke timer data_len = 1; data_buf[0] = debug_ptr->default_invtime; *data_type = 2; break; case 2: // reject timer data_len = 1; data_buf[0] = debug_ptr->default_rejtime; *data_type = 2; break; case 3: // monitro switch switch (oid[ii+2]) { case 1: // sccp switch data_buf[0] = debug_ptr->sccp_switch; data_len = 1; *data_type = 2; break; case 2: // tcu switch data_buf[0] = debug_ptr->tcu_switch; data_len = 1; *data_type = 2; break; case 3: // error switch data_buf[0] = debug_ptr->error_switch; data_len = 1; *data_type = 2; break; case 4: // dialogue id switch u32tobyte(data_buf,debug_ptr->monitor_did); data_len = 4; *data_type = 4; break; default: break; } break; default: break; } break; case 3: // status switch (oid[ii+1]) { case 1: // get version data_len = TCAP_VERSION_LEN; memcpy(data_buf,tcap_ver,data_len); *data_type = 4; break; case 2: // get tcap status data_len = TCAP_HB_LEN; memcpy(data_buf,debug_ptr->hb_status,data_len); *data_type = 4; break; default: break; } break; default: // can not recognize object id break; } return data_len; // get fail } void init_m(void) { u8 page,ii; char info_str[1024]; char temp_str[256]; char *cur_time; u32 str_len; debug_ptr = (tcapdebug_struct *) &tcap_ptr->tcap_debug; tcap_1s_flag = 0; tcap_10s_flag = 0; sec_page = 0; GetCurrentTime(debug_ptr->start_time); debug_ptr->ascin_buf[0] = '\0'; debug_ptr->ascout_buf[0] = '\0'; debug_set_response(TCAP_ID_LEN,tcap_status_id,&tcap_status,1); // set status id sprintf(info_str,"R%dV%d_%02d",tcap_ver[0],tcap_ver[1],tcap_ver[2]); debug_set_response(TCAP_ID_LEN,tcap_version_id,info_str,strlen(info_str)); // set module description debug_set_response(TCAP_ID_LEN,tcap_ascin_id,debug_ptr->ascin_buf,TCAP_ASCIN_LEN); debug_set_response(TCAP_ID_LEN,tcap_ascout_id,debug_ptr->ascout_buf,TCAP_ASCOUT_LEN); for (page = 1;page < MAX_PAGE;page ++) { switch (page) { case 1: sprintf(info_str,"Version:R%dV%dT%d\t%s",tcap_ver[0],tcap_ver[1],tcap_ver[2],title1); str_len = strlen(info_str); break; case 2: sprintf(info_str,"Version:R%dV%dT%d\t%s",tcap_ver[0],tcap_ver[1],tcap_ver[2],title2); for (ii = 0;ii < 16;ii ++) { sprintf(temp_str,"watch_dog%d\r\n",ii*16); strcat(info_str,temp_str); } str_len = strlen(info_str); break; case 3: sprintf(info_str,"Version:R%dV%dT%d\t%s",tcap_ver[0],tcap_ver[1],tcap_ver[2],title3); for (ii = 0;ii < TCAP_UTILIZE_LEN/5;ii ++) { sprintf(temp_str,"Data%d--%d\r\n",ii*5,ii*5+4); strcat(info_str,temp_str); } str_len = strlen(info_str); break; case 4: sprintf(info_str,"Version:R%dV%dT%d\tTCAP state\r\n\n",tcap_ver[0],tcap_ver[1],tcap_ver[2]); for (ii = 0;ii < STATE_LINE;ii ++) { sprintf(temp_str,"TCAP %d\r\n",ii); strcat(info_str,temp_str); } strcat(info_str,"\nCurrent_page\r\n"); str_len = strlen(info_str); break; case 5: sprintf(info_str,"Version:R%dV%dT%d\tISM state\r\n\n",tcap_ver[0],tcap_ver[1],tcap_ver[2]); for (ii = 0;ii < MAX_TEMPINVOKEID;ii ++) { sprintf(temp_str,"ISM %d\r\n",ii); strcat(info_str,temp_str); } strcat(info_str,"\nCurrent_page\r\n"); str_len = strlen(info_str); break; default: strcpy(info_str,title1); str_len = 0; break; } tcap_page_title[TCAP_PAGE_POINT] = page + 5; debug_set_response(TCAP_TITLE_LEN,tcap_page_title,info_str,str_len); tcap_disp_page(page); } // init snmp portion // heartbeat_init(TCAP_SYSTEM_ID); // register tcap heartbeat inquire_setmsg(TCAP_PREOBJ_LEN,tcap_object_id,tcap_snmp_set); inquire_getmsg(TCAP_PREOBJ_LEN,tcap_object_id,tcap_snmp_get); debug_ptr->default_invtime = INVOKE_TIMER; debug_ptr->default_rejtime = REJECT_TIMER; cur_time = GetAsciiTime(); sprintf(info_str,"TCAP init process completed. Init time is:%s\r",cur_time); tcap_send_ascout(info_str); // init_paralport(); // init parallel port // write_paralport(TCAP_LED_CODE,1); } void tcap_monitor(void) { // u8 page_n; u32 ii,jj; u8 *time_ptr; u16 used_id; char info_str[1024],temp_info[1024]; debug_ptr->send_control = 0; if (strlen(debug_ptr->ascin_buf) > 0) // has command { if (strcmp(debug_ptr->ascin_buf+1,"clear") == 0) { memset(debug_ptr->watch_dog,0,256); memset(tcap_dlg_stats, 0, sizeof(u32) * MAX_DIALOGUEID); clrcount_did_max(); } else if (strncmp(debug_ptr->ascin_buf+1,"go to ",6) == 0) // change section page { ii = atol(debug_ptr->ascin_buf+7); sec_page = ii; } else if (strncmp(debug_ptr->ascin_buf+1,"log port ",9) == 0) // monitor the did { ii = atol(debug_ptr->ascin_buf+10); if (ii >= (tcap_ptr->grantdid)) tcap_send_ascout("The appointed dialogue id is not expected\r\n"); else debug_ptr->monitor_did = ii; } else if (strcmp(debug_ptr->ascin_buf+1,"list para") == 0)// display parameter { tcap_send_ascout("The TCAP system parameters are:\r\n"); sprintf(info_str,"Invoke timer:%d s\r\nReject timer:%d s\r\n",debug_ptr->default_invtime,debug_ptr->default_rejtime); tcap_send_ascout(info_str); } else if (strcmp(debug_ptr->ascin_buf+1,"log none") == 0)// close all switch { debug_ptr->error_switch = 0; debug_ptr->sccp_switch = 0; debug_ptr->tcu_switch = 0; } else if (strcmp(debug_ptr->ascin_buf+1,"log error on") == 0) { debug_ptr->error_switch = 1; } else if (strcmp(debug_ptr->ascin_buf+1,"log error off") == 0) { debug_ptr->error_switch = 0; } else if (strcmp(debug_ptr->ascin_buf+1,"log all") == 0) { debug_ptr->error_switch = 1; debug_ptr->sccp_switch = 1; debug_ptr->tcu_switch = 1; } else if (strcmp(debug_ptr->ascin_buf+1,"log sccp") == 0) { debug_ptr->sccp_switch = 1; tcap_send_ascout("tcap monitoring sccp message switch open\n\r"); } else if (strcmp(debug_ptr->ascin_buf+1,"log tcu") == 0) { debug_ptr->tcu_switch = 1; } else if (strncmp(debug_ptr->ascin_buf+1,"help",6) == 0) // display help message { sprintf(temp_info,"%d-%02d-%02d %02d:%02d:%02d",debug_ptr->start_time[0]+2000,debug_ptr->start_time[1],debug_ptr->start_time[2],debug_ptr->start_time[3],debug_ptr->start_time[4],debug_ptr->start_time[5]); sprintf(info_str,"TCAP module R%dV%d_%02d, start time: %s\r\n\n",tcap_ver[0],tcap_ver[1],tcap_ver[2],temp_info); tcap_send_ascout(info_str); tcap_send_ascout("Command list:\r\n"); tcap_send_ascout("log all --------- Turn on all log items\r\n"); tcap_send_ascout("log none --------- Turn off all log items\r\n"); tcap_send_ascout("log error on/off --------- Turn on/off error log item\r\n"); tcap_send_ascout("log tcu --------- Turn on TCAP<->TCUser log item\r\n"); tcap_send_ascout("log sccp --------- Turn on TCAP<->SCCP log item\r\n"); tcap_send_ascout("log port [did] ---- Monitor the specified dialogue id\r\n"); tcap_send_ascout("list para --------- Display TCAP system parameters\r\n"); } debug_ptr->ascin_buf[0] = '\0'; } /* for (page_n = 1;page_n < MAX_PAGE;page_n ++) tcap_disp_page(page_n);*/ if (++tcap_1s_flag > 24) tcap_1s_flag = 0; if (tcap_1s_flag == 0) { GetCurrentTime(debug_ptr->current_time); time_ptr = debug_ptr->current_time; jj = (time_ptr[3]*60+time_ptr[4])/TCAP_CSTA_INTERVAL; for (ii = 0;ii < TCAP_UTILIZE_LEN;ii ++) { if ((time_ptr[4] % TCAP_CSTA_INTERVAL)==0 && time_ptr[5]==0) // clear CDR { debug_ptr->tc_utilize[jj][ii] = 0; debug_ptr->csta_time[jj] = time(NULL); debug_ptr->current_csta = jj; } debug_ptr->tc_utilize[jj][ii] += debug_ptr->tc_utilize[TCAP_UTILIZE_COUNT-1][ii]; debug_ptr->tc_utilize[TCAP_UTILIZE_COUNT-1][ii] = 0; } used_id = chkcount_did_occupied(); debug_ptr->tc_utilize[jj][21] += used_id; if (debug_ptr->tc_utilize[jj][23] < used_id) debug_ptr->tc_utilize[jj][23] = used_id; if (++tcap_10s_flag > 9) tcap_10s_flag = 0; if (tcap_10s_flag == 0) // 10s timer, set tcap status { set_led(TCAP_LED_CODE,LED_GREEN); memcpy(debug_ptr->hb_status,tcap_ver,TCAP_VERSION_LEN); debug_ptr->hb_status[TCAP_VERSION_LEN] = tcap_status; debug_ptr->hb_status[TCAP_VERSION_LEN+1] = used_id >> 8; debug_ptr->hb_status[TCAP_VERSION_LEN+2] = used_id; used_id = chkcount_did_max(); debug_ptr->hb_status[TCAP_VERSION_LEN+3] = used_id >> 8; debug_ptr->hb_status[TCAP_VERSION_LEN+4] = used_id; set_status(TCAP_MODULE_ID,TCAP_HB_LEN,debug_ptr->hb_status); //clrcount_did_max(); } } } void tcap_send_alarm(u8 alarm_code,u8 alarm_level) { if (alarm_level == 1) // mini alarm set_led(TCAP_LED_CODE,LED_YELLOW); else if (alarm_level == 2) // critical alarm set_led(TCAP_LED_CODE,LED_RED); set_alarm(TCAP_MODULE_ID,alarm_code); } /*@end@*/