From cffe95a97881ae62f23e0278ae6490a98fcb9f8b Mon Sep 17 00:00:00 2001 From: kapil Date: Mon, 4 Jun 2012 17:23:33 +0530 Subject: [PATCH] adding "xmlstatus" CLI command to dump MEGACO Stack data --- src/mod/endpoints/mod_megaco/megaco_stack.c | 275 ++++++++++++++++++++ src/mod/endpoints/mod_megaco/megaco_stack.h | 1 + src/mod/endpoints/mod_megaco/megaco_xml.c | 2 + src/mod/endpoints/mod_megaco/mod_megaco.c | 11 +- 4 files changed, 288 insertions(+), 1 deletion(-) diff --git a/src/mod/endpoints/mod_megaco/megaco_stack.c b/src/mod/endpoints/mod_megaco/megaco_stack.c index e5572c19ef..f3a2015016 100644 --- a/src/mod/endpoints/mod_megaco/megaco_stack.c +++ b/src/mod/endpoints/mod_megaco/megaco_stack.c @@ -37,6 +37,8 @@ int sng_mgco_mg_app_ssap_stop(int idx); switch_status_t sng_mgco_stack_gen_cfg(); +void get_peer_xml_buffer(char* prntBuf, MgPeerSta* cfm); + /******************************************************************************/ /* FUNCTIONS ******************************************************************/ @@ -1764,6 +1766,7 @@ switch_status_t megaco_profile_status(switch_stream_handle_t *stream, const char return SWITCH_STATUS_FALSE; } + /*stream->write_function(stream, "Collecting MG Profile[%s] status... \n",profilename);*/ /* Fetch data from Trillium MEGACO Stack * @@ -1813,3 +1816,275 @@ switch_status_t megaco_profile_status(switch_stream_handle_t *stream, const char return SWITCH_STATUS_SUCCESS; } /******************************************************************************/ +switch_status_t megaco_profile_xmlstatus(switch_stream_handle_t *stream, const char* profilename) +{ + int idx = 0x00; + int len = 0x00; + MgMngmt cfm; + char* xmlhdr = ""; + char prntBuf[10024]; + sng_mg_cfg_t* mgCfg = NULL; + sng_mg_peer_t* mgPeer = NULL; + int i = 0x00; + + switch_assert(profilename); + + memset((U8 *)&cfm, 0, sizeof(cfm)); + memset((char *)&prntBuf, 0, sizeof(prntBuf)); + + GET_MG_CFG_IDX(profilename, idx); + + if(!idx || (idx == MAX_MG_PROFILES)){ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR," No MG configuration found against profilename[%s]\n",profilename); + return SWITCH_STATUS_FALSE; + } + + mgCfg = &megaco_globals.g_mg_cfg.mgCfg[idx]; + mgPeer = &megaco_globals.g_mg_cfg.mgPeer.peers[mgCfg->peer_id]; + + + len = len + sprintf(&prntBuf[0] + len,"%s\n",xmlhdr); + + + len = len + sprintf(&prntBuf[0] + len,"\n"); + len = len + sprintf(&prntBuf[0] + len,"%s\n",mgCfg->name); + len = len + sprintf(&prntBuf[0] + len,"%s\n",profilename); +/****************************************************************************************************************/ +/* Print Peer Information ***************************************************************************************/ + + /* TODO - as of now supporting only one peer .. need to add logic to iterate through all the peers associated with this profile..*/ + + len = len + sprintf(&prntBuf[0] + len,"\n"); + len = len + sprintf(&prntBuf[0] + len,"\n",mgPeer->name); + + /* send request to MEGACO Trillium stack to get peer information*/ + sng_mgco_mg_get_status(STGCPENT, &cfm, idx); + + get_peer_xml_buffer(&prntBuf[0] + len, &cfm.t.ssta.s.mgPeerSta); + + len = len + sprintf(&prntBuf[0] + len,"\n"); + len = len + sprintf(&prntBuf[0] + len,"\n"); + + +/****************************************************************************************************************/ +/* Print MG SAP Information ***************************************************************************************/ + + len = len + sprintf(&prntBuf[0] + len,"\n"); + + /* MG SAP Information */ + sng_mgco_mg_get_status(STSSAP, &cfm, idx); + + len = len + sprintf(prntBuf+len, " %s \n", PRNT_SAP_STATE((int)(cfm.t.ssta.s.mgSSAPSta.state))); + len = len + sprintf(prntBuf+len, " %u \n", (unsigned int)(cfm.t.ssta.s.mgSSAPSta.numAssocPeer)); + len = len + sprintf(prntBuf+len, " %u \n", (unsigned int)(cfm.t.ssta.s.mgSSAPSta.numServers)); + len = len + sprintf(&prntBuf[0] + len,"\n"); + for (i = 0; i < cfm.t.ssta.s.mgSSAPSta.numAssocPeer; i++) + { + len = len + sprintf(&prntBuf[0] + len,"\n"); + if(cfm.t.ssta.s.mgSSAPSta.peerInfo[i].dname.namePres.pres == PRSNT_NODEF) + { + len = len + sprintf(prntBuf+len, " %s \n", (char *)(cfm.t.ssta.s.mgSSAPSta.peerInfo[i].dname.name)); + } + switch(cfm.t.ssta.s.mgSSAPSta.peerInfo[i].dname.netAddr.type) + { + case CM_NETADDR_IPV4: + { + len = len + sprintf(prntBuf+len, "%lu\n", (long unsigned int)(cfm.t.ssta.s.mgSSAPSta.peerInfo[i].dname.netAddr.u.ipv4NetAddr)); + break; + } + default: + len = len + sprintf(prntBuf+len, "invalid type \n"); + break; + } + +#ifdef GCP_MGCO + if (PRSNT_NODEF == cfm.t.ssta.s.mgSSAPSta.peerInfo[i].mid.pres) + { + len = len + sprintf(prntBuf+len, " %s \n", (char *)(cfm.t.ssta.s.mgSSAPSta.peerInfo[i].mid.val)); + } +#endif /* GCP_MGCO */ + len = len + sprintf(&prntBuf[0] + len,"\n"); + } + len = len + sprintf(&prntBuf[0] + len,"\n"); + + len = len + sprintf(&prntBuf[0] + len,"\n"); + +/****************************************************************************************************************/ +/* Print MG Transport SAP Information ***************************************************************************************/ + + len = len + sprintf(&prntBuf[0] + len,"\n"); + /* MG Transport SAP Information */ + sng_mgco_mg_get_status(STTSAP, &cfm, idx); + len = len + sprintf(&prntBuf[0] + len," %s \n", PRNT_SAP_STATE(cfm.t.ssta.s.mgTSAPSta.state)); + len = len + sprintf(&prntBuf[0] + len," %u \n", (unsigned int)(cfm.t.ssta.s.mgTSAPSta.numServers)); + len = len + sprintf(&prntBuf[0] + len,"\n"); + +/****************************************************************************************************************/ +/* Print MG Transport Server Information ***************************************************************************************/ + + if(sng_mgco_mg_get_status(STSERVER, &cfm, idx)){ + len = len + sprintf(&prntBuf[0] + len," no established server found \n"); + } + else { + len = len + sprintf(&prntBuf[0] + len,"\n"); + len = len + sprintf(&prntBuf[0] + len," %s \n", PRNT_SAP_STATE(cfm.t.ssta.s.mgTptSrvSta.state)); + len = len + sprintf(prntBuf+len, ""); + + switch (cfm.t.ssta.s.mgTptSrvSta.tptAddr.type) + { + case CM_TPTADDR_NOTPRSNT: + { + len = len + sprintf(prntBuf+len, "none"); + break; + } + case CM_TPTADDR_IPV4: + { + len = len + sprintf(prntBuf+len, "IPv4 IP address #%lu, port %u", + (unsigned long)(cfm.t.ssta.s.mgTptSrvSta.tptAddr.u.ipv4TptAddr.address), + (unsigned int)(cfm.t.ssta.s.mgTptSrvSta.tptAddr.u.ipv4TptAddr.port)); + + break; + } + default: + len = len + sprintf(prntBuf+len, "unknown"); + break; + } + len = len + sprintf(prntBuf+len, "\n"); + len = len + sprintf(&prntBuf[0] + len,"\n"); + } + +/****************************************************************************************************************/ + len = len + sprintf(&prntBuf[0] + len,"\n"); + + stream->write_function(stream, "\n%s\n",&prntBuf[0]); + + return SWITCH_STATUS_SUCCESS; +} + +/******************************************************************************/ + +void get_peer_xml_buffer(char* prntBuf, MgPeerSta* cfm) +{ + int len = 0x00; + int i = 0x00; + if(PRSNT_NODEF == cfm->namePres.pres) + { + len = len + sprintf(prntBuf+len, " %s \n", (char *)(cfm->name)); + } + else + { + len = len + sprintf(prntBuf+len, " Not Present \n"); + } + + /* + * Print all IP addresses in the IP addr table + */ + for(i=0; ipeerAddrTbl.count; i++) + { + switch (cfm->peerAddrTbl.netAddr[i].type) + { + case CM_NETADDR_IPV4: + { + len = len + sprintf(prntBuf+len, "%lu\n", (unsigned long) + (cfm->peerAddrTbl.netAddr[i].u.ipv4NetAddr)); + break; + } + case CM_NETADDR_IPV6: + { + char ipv6_buf[128]; + int len1= 0; + int j = 0; + memset(&ipv6_buf[0], 0, sizeof(ipv6_buf)); + len1 = len1 + sprintf(ipv6_buf+len1, "IP V6 address : %2x", (unsigned int) + (cfm->peerAddrTbl.netAddr[i].u.ipv6NetAddr[0])); + + for (j = 1; j < CM_IPV6ADDR_SIZE; j++) + { + len1 = len1 + sprintf(ipv6_buf+len1, ":%2x", (unsigned int) + (cfm->peerAddrTbl.netAddr[i].u.ipv6NetAddr[j])); + } + len1 = len1 + sprintf(ipv6_buf+len1, "\n"); + len = len + sprintf(prntBuf+len, "%s\n", ipv6_buf); + break; + } + default: + { + len = len + sprintf(prntBuf+len, " Invalid address type[%d]\n", cfm->peerAddrTbl.netAddr[i].type); + break; + } + } + } /* End of for */ + + len = len + sprintf(prntBuf+len," %lu \n",(unsigned long)(cfm->numPendOgTxn)); + len = len + sprintf(prntBuf+len," %lu \n",(unsigned long)(cfm->numPendIcTxn)); + len = len + sprintf(prntBuf+len," %lu \n",(unsigned long)(cfm->rttEstimate)); + + switch(cfm->protocol) + { + case LMG_PROTOCOL_MGCP: + len = len + sprintf(prntBuf+len," MGCP \n"); + break; + + case LMG_PROTOCOL_MGCO: + len = len + sprintf(prntBuf+len," MEGACO \n"); + break; + + case LMG_PROTOCOL_NONE: + len = len + sprintf(prntBuf+len," MGCP/MEGACO \n"); + break; + + default: + len = len + sprintf(prntBuf+len," invalid \n"); + break; + } + + switch(cfm->transportType) + { + case LMG_TPT_UDP: + len = len + sprintf(prntBuf+len, "UDP\n"); + break; + + case LMG_TPT_TCP: + len = len + sprintf(prntBuf+len, "TCP\n"); + break; + + case LMG_TPT_NONE: + len = len + sprintf(prntBuf+len, "UDP/TCP\n"); + break; + + default: + len = len + sprintf(prntBuf+len, "invalid\n"); + break; + } +#ifdef GCP_MGCO + switch(cfm->encodingScheme) + { + case LMG_ENCODE_BIN: + len = len + sprintf(prntBuf+len, "BINARY\n"); + break; + + case LMG_ENCODE_TXT: + len = len + sprintf(prntBuf+len, "TEXT\n"); + break; + + case LMG_ENCODE_NONE: + len = len + sprintf(prntBuf+len, "TEXT/BINARY\n"); + break; + + default: + len = len + sprintf(prntBuf+len, "invalid\n"); + break; + } + + if(LMG_VER_PROF_MGCO_H248_1_0 == cfm->version){ + len = len + sprintf(prntBuf+len, "1.0 \n"); + } else if(LMG_VER_PROF_MGCO_H248_2_0 == cfm->version){ + len = len + sprintf(prntBuf+len, "2.0 \n"); + }else if(LMG_VER_PROF_MGCO_H248_3_0 == cfm->version){ + len = len + sprintf(prntBuf+len, "3.0 \n"); + } else{ + len = len + sprintf(prntBuf+len, "invalid \n"); + } +#endif + +} diff --git a/src/mod/endpoints/mod_megaco/megaco_stack.h b/src/mod/endpoints/mod_megaco/megaco_stack.h index d8a1b55e47..8e1bc12bc1 100644 --- a/src/mod/endpoints/mod_megaco/megaco_stack.h +++ b/src/mod/endpoints/mod_megaco/megaco_stack.h @@ -114,6 +114,7 @@ switch_status_t sng_mgco_stop(const char* profilename); switch_status_t sng_mgco_stack_shutdown(void); int sng_mgco_mg_get_status(int elemId, MgMngmt* cfm, int mg_cfg_idx); switch_status_t megaco_profile_status(switch_stream_handle_t *stream, const char* profilename); +switch_status_t megaco_profile_xmlstatus(switch_stream_handle_t *stream, const char* profilename); /*****************************************************************************************************/ diff --git a/src/mod/endpoints/mod_megaco/megaco_xml.c b/src/mod/endpoints/mod_megaco/megaco_xml.c index a886546b9b..23ff23468d 100644 --- a/src/mod/endpoints/mod_megaco/megaco_xml.c +++ b/src/mod/endpoints/mod_megaco/megaco_xml.c @@ -225,6 +225,8 @@ switch_status_t sng_parse_mg_peer_profile(switch_xml_t mg_peer_profile) } } + strcpy((char*)&megaco_globals.g_mg_cfg.mgPeer.peers[i].name[0], prof_name); + megaco_globals.g_mg_cfg.mgPeer.total_peer++; return SWITCH_STATUS_SUCCESS; } diff --git a/src/mod/endpoints/mod_megaco/mod_megaco.c b/src/mod/endpoints/mod_megaco/mod_megaco.c index 7bc6320df9..f8fa65a8ee 100644 --- a/src/mod/endpoints/mod_megaco/mod_megaco.c +++ b/src/mod/endpoints/mod_megaco/mod_megaco.c @@ -16,7 +16,7 @@ SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_megaco_shutdown); SWITCH_MODULE_DEFINITION(mod_megaco, mod_megaco_load, mod_megaco_shutdown, NULL); -#define MEGACO_FUNCTION_SYNTAX "profile [name] [start | stop] [status]" +#define MEGACO_FUNCTION_SYNTAX "profile [name] [start | stop] [status] [xmlstatus]" SWITCH_STANDARD_API(megaco_function) { int argc; @@ -63,7 +63,15 @@ SWITCH_STANDARD_API(megaco_function) } else { stream->write_function(stream, "-ERR No such profile\n"); } + }else if(!strcmp(argv[2], "xmlstatus")) { + megaco_profile_t *profile = megaco_profile_locate(argv[1]); + if (profile) { + megaco_profile_xmlstatus(stream, profile->name); + } else { + stream->write_function(stream, "-ERR No such profile\n"); + } } + } goto done; @@ -123,6 +131,7 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_megaco_load) switch_console_set_complete("add megaco profile ::megaco::list_profiles start"); switch_console_set_complete("add megaco profile ::megaco::list_profiles stop"); switch_console_set_complete("add megaco profile ::megaco::list_profiles status"); + switch_console_set_complete("add megaco profile ::megaco::list_profiles xmlstatus"); switch_console_add_complete_func("::megaco::list_profiles", list_profiles);