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);