diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c index 7d50ecfa19..2de8ee3ac2 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c @@ -207,6 +207,7 @@ switch_status_t mg_process_cli_cmd(const char *cmd, switch_stream_handle_t *stre /*******************************************************************/ /* mg show alltermstatus */ handle_all_term_status_cli_cmd(stream, profile); + /*******************************************************************/ }else if(!strcasecmp(argv[3], "termstatus")){ /*******************************************************************/ /* mg show termstatus */ @@ -214,6 +215,17 @@ switch_status_t mg_process_cli_cmd(const char *cmd, switch_stream_handle_t *stre goto usage; } handle_term_status_cli_cmd(stream, profile, argv[4]); + /*******************************************************************/ + }else if(!strcasecmp(argv[3], "stackmem")){ + /*******************************************************************/ + sng_mg_reg_info_show(); + /*******************************************************************/ +#ifdef LEAK_TEST + }else if(!strcasecmp(argv[3], "leak-report")){ + /*******************************************************************/ + mgPrntLeakReport(); + /*******************************************************************/ +#endif } else { /*******************************************************************/ stream->write_function(stream, "-ERR No such profile\n"); @@ -280,6 +292,7 @@ void megaco_cli_print_usage(switch_stream_handle_t *stream) stream->write_function(stream, "mg profile show activecalls \n"); stream->write_function(stream, "mg profile show termstatus \n"); stream->write_function(stream, "mg profile show alltermstatus \n"); + stream->write_function(stream, "mg profile show stackmem \n"); stream->write_function(stream, "Usage: Logging \n"); stream->write_function(stream, "mg logging enable \n"); diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c index eedd19a218..c29a38f474 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c @@ -307,7 +307,7 @@ switch_status_t mg_prc_descriptors(megaco_profile_t* mg_profile, MgMgcoCommand * return SWITCH_STATUS_FALSE; } - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"descriptors[%d] found in-coming megaco request \n", desc->dl.num.val); + //switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"descriptors[%d] found in-coming megaco request \n", desc->dl.num.val); if(NOTPRSNT == desc->dl.num.pres){ switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"No descriptor found in-coming megaco request \n"); @@ -316,7 +316,7 @@ switch_status_t mg_prc_descriptors(megaco_profile_t* mg_profile, MgMgcoCommand * for (descId = 0; descId < desc->dl.num.val; descId++) { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"descriptors[%d] type in-coming megaco request \n", desc->dl.descs[descId]->type.val); + //switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"descriptors[%d] type in-coming megaco request \n", desc->dl.descs[descId]->type.val); switch (desc->dl.descs[descId]->type.val) { case MGT_MEDIADESC: { @@ -381,26 +381,26 @@ switch_status_t mg_prc_descriptors(megaco_profile_t* mg_profile, MgMgcoCommand * case MGT_LCLCTL_MODE: { /* Mode Property */ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE,"MGT_LCLCTL_MODE - Mode value [%d]\n", lclParm->u.mode.val); + //switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE,"MGT_LCLCTL_MODE - Mode value [%d]\n", lclParm->u.mode.val); break; } case MGT_LCLCTL_RESVAL: { /* Reserve Value */ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE,"MGT_LCLCTL_RESVAL: Reserve Value[%d] \n", lclParm->u.resVal.val); + //switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE,"MGT_LCLCTL_RESVAL: Reserve Value[%d] \n", lclParm->u.resVal.val); break; } case MGT_LCLCTL_RESGRP: { /* Reserve group */ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE,"MGT_LCLCTL_RESGRP: Reserve Group[%d]\n", lclParm->u.resGrp.val); + //switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE,"MGT_LCLCTL_RESGRP: Reserve Group[%d]\n", lclParm->u.resGrp.val); break; } case MGT_LCLCTL_PROPPARM: { /* Properties (of a termination) */ /* Matt - See how we can apply this to a termination */ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE,"MGT_LCLCTL_PROPPARM: \n"); + //switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE,"MGT_LCLCTL_PROPPARM: \n"); break; } default: @@ -578,7 +578,7 @@ switch_status_t mg_prc_descriptors(megaco_profile_t* mg_profile, MgMgcoCommand * */ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *inc_cmd, MgMgcoContextId* new_ctxtId) { - switch_status_t ret; + switch_status_t ret; MgMgcoContextId *ctxtId; MgStr errTxt; MgMgcoInd *mgErr; @@ -597,7 +597,6 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i MgMgcoLocalDesc *local = NULL; /*CmSdpInfoSet *psdp = NULL;*/ - /* TODO - Kapil dummy line , will need to add with proper code */ inc_med_desc = &cmd->dl.descs[0]->u.media; @@ -771,6 +770,7 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i }else{ /* ADD request is for RTP term we need to create termination */ + /* Grow the list of reply parameters */ if (mgUtlGrowList((void ***)&rsp.u.mgCmdRsp[0]->u.add.termIdLst.terms, sizeof(MgMgcoTermId), &rsp.u.mgCmdRsp[0]->u.add.termIdLst.num, &rsp.u.mgCmdRsp[0]->memCp) != ROK) @@ -781,6 +781,7 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i out_termId = rsp.u.mgCmdRsp[0]->u.add.termIdLst.terms[rsp.u.mgCmdRsp[0]->u.add.termIdLst.num.val-1]; mg_fill_mgco_termid(out_termId, (char*)term->name, strlen((char*)term->name), &rsp.u.mgCmdRsp[0]->memCp); + } if(is_rtp){ @@ -796,6 +797,7 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i return SWITCH_STATUS_FALSE; } + /* copy media descriptor */ desc = rsp.u.mgCmdRsp[0]->u.add.audit.parms[rsp.u.mgCmdRsp[0]->u.add.audit.num.val-1]; desc->type.pres = PRSNT_NODEF; @@ -812,6 +814,7 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i } } + /* only for RTP */ if(SWITCH_STATUS_FALSE == mg_build_sdp(&desc->u.media, inc_med_desc, mg_profile, term, &rsp.u.mgCmdRsp[0]->memCp)) { if(term->mg_error_code && (*term->mg_error_code == MGT_MGCP_RSP_CODE_INCONSISTENT_LCL_OPT)){ @@ -821,6 +824,7 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i } } } + #if 0 if(is_rtp){ mg_build_sdp(desc, inc_med_desc, mg_profile, term, &rsp.u.mgCmdRsp[0]->memCp); @@ -1026,7 +1030,6 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i ret = sng_mgco_send_cmd( mg_profile->idx, &rsp); return ret; - } /* sample resp code -- end */ /*************************************************************************************************************************/ @@ -1038,7 +1041,6 @@ error: mg_build_mgco_err_request(&mgErr, txn_id, ctxtId, err_code, &errTxt)) { sng_mgco_send_err(mg_profile->idx, mgErr); } - mg_free_cmd(inc_cmd); switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR," ADD Request failed..releasing context/termination(if allocated) \n"); if(mg_ctxt){ megaco_release_context(mg_ctxt); @@ -1322,7 +1324,6 @@ error: mg_build_mgco_err_request(&mgErr, txn_id, ctxtId, err_code, &errTxt)) { sng_mgco_send_err(mg_profile->idx, mgErr); } - mg_free_cmd(inc_cmd); switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR," Modify Request failed..releasing context/termination \n"); if(mg_ctxt){ @@ -1538,7 +1539,6 @@ error: mg_build_mgco_err_request(&mgErr, txn_id, ctxtId, err_code, &errTxt)) { sng_mgco_send_err(mg_profile->idx, mgErr); } - mg_free_cmd(inc_cmd); return SWITCH_STATUS_FALSE; } @@ -1973,8 +1973,6 @@ error: sng_mgco_send_err(mg_profile->idx, mgErr); } - /* deallocate the msg */ - mg_free_cmd(auditReq); return SWITCH_STATUS_FALSE; } @@ -2588,7 +2586,7 @@ switch_status_t mg_send_service_change(SuId suId, const char* term_name, uint8_ svc = &request.u.mgCmdReq[0]->cmd.u.svc; - if(SWITCH_STATUS_FALSE == (ret = mg_fill_svc_change(&svc->parm, method, mg_service_change_reason[reason]))){ + if(SWITCH_STATUS_FALSE == (ret = mg_fill_svc_change(&svc->parm, method, mg_service_change_reason[reason], &request.u.mgCmdReq[0]->memCp))){ return ret; } diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h index bce041f6ac..785cfdff63 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h @@ -207,7 +207,7 @@ switch_status_t handle_pkg_audit( SuId suId, MgMgcoCommand *auditReq); switch_status_t mg_build_pkg_desc(MgMgcoPkgsDesc* pkg); switch_status_t mg_send_heartbeat_audit_rsp( SuId suId, MgMgcoCommand *auditReq); void mg_get_time_stamp(MgMgcoTimeStamp *timeStamp); -switch_status_t mg_fill_svc_change(MgMgcoSvcChgPar *srvPar, uint8_t method, const char *reason); +switch_status_t mg_fill_svc_change(MgMgcoSvcChgPar *srvPar, uint8_t method, const char *reason,CmMemListCp *memCp); void mg_fill_null_context(MgMgcoContextId* ctxt); switch_status_t mg_send_service_change(SuId suId, const char* term_name, uint8_t method, MgServiceChangeReason_e reason,uint8_t wild); switch_status_t mg_create_mgco_command(MgMgcoCommand *cmd, uint8_t apiType, uint8_t cmdType); diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_stack_alarms.c b/src/mod/endpoints/mod_media_gateway/media_gateway_stack_alarms.c index f392203db1..6cba35d7c9 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_stack_alarms.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_stack_alarms.c @@ -218,6 +218,7 @@ void handle_mg_alarm(Pst *pst, MgMngmt *usta) case LMG_EVENT_PEER_ENABLED: { len = len + sprintf(prBuf+len, "gateway enabled"); + /* gateway enabled now we can send termination service change for all terminations */ mgco_init_ins_service_change( usta->t.usta.alarmInfo.sapId ); break; diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c index 783e126ae4..766b948f48 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c @@ -15,8 +15,8 @@ switch_status_t mg_stack_alloc_mem( Ptr* _memPtr, Size _memSize ) { Mem sMem; - sMem.region = 0; - sMem.pool = 0; + sMem.region = S_REG; + sMem.pool = S_POOL; if ( _memSize <= 0 ) { @@ -119,8 +119,8 @@ S16 mg_fill_mgco_termid ( MgMgcoTermId *termId, char* term_str, int term_len, C termId->name.pres.pres = PRSNT_NODEF; termId->name.lcl.pres = PRSNT_NODEF; termId->name.lcl.len = term_len; - /*MG_GETMEM(termId->name.lcl.val, termId->name.lcl.len , memCp, ret);*/ - ret = mg_stack_alloc_mem((Ptr*)&termId->name.lcl.val,term_len); + MG_GETMEM(termId->name.lcl.val, termId->name.lcl.len , memCp, ret); + //ret = mg_stack_alloc_mem((Ptr*)&termId->name.lcl.val,term_len); if( ret != ROK) RETVALUE(ret); @@ -1554,8 +1554,9 @@ MgMgcoMediaDesc* get_default_media_desc(megaco_profile_t* mg_profile, MgMgcoTerm } /*****************************************************************************************************************************/ -switch_status_t mg_fill_svc_change(MgMgcoSvcChgPar *srvPar, uint8_t method, const char *reason) +switch_status_t mg_fill_svc_change(MgMgcoSvcChgPar *srvPar, uint8_t method, const char *reason, CmMemListCp *memCp) { + S16 ret = ROK; MG_SET_TKN_VAL_PRES(&srvPar->pres, 0, PRSNT_NODEF); MG_SET_TKN_VAL_PRES(&srvPar->meth.pres, 0, PRSNT_NODEF); MG_SET_TKN_VAL_PRES(&srvPar->meth.type, method, PRSNT_NODEF); @@ -1564,7 +1565,7 @@ switch_status_t mg_fill_svc_change(MgMgcoSvcChgPar *srvPar, uint8_t method, c srvPar->reason.pres = PRSNT_NODEF; srvPar->reason.len = cmStrlen((const U8 *)reason); - mg_stack_alloc_mem((Ptr*)&srvPar->reason.val, srvPar->reason.len); + MG_GETMEM(srvPar->reason.val, srvPar->reason.len , memCp, ret); if (NULL == srvPar->reason.val) { switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, "failed, memory alloc\n"); diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c index bcc3d3cdd8..e86f813b18 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c @@ -475,8 +475,10 @@ void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) int count; int err_code; megaco_profile_t* mg_profile; + char prnt_buf[128]; memset(&out_ctxt,0,sizeof(out_ctxt)); + memset(&prnt_buf,0,sizeof(prnt_buf)); inc_context = &cmd->contextId; memcpy(&out_ctxt, inc_context,sizeof(MgMgcoContextId)); @@ -486,7 +488,7 @@ void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) /*get mg profile associated with SuId */ if(NULL == (mg_profile = megaco_get_profile_by_suId(suId))){ - goto error1; + goto done; } /* first thing - restart ito timer */ @@ -555,7 +557,8 @@ void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) (MGT_TERMID_OTHER == termId->type.val) && (MGT_AUDITVAL != cmd->u.mgCmdInd[0]->cmd.type.val)){ if(SWITCH_STATUS_FALSE == mg_stack_termination_is_in_service(mg_profile, (char*)termId->name.lcl.val, termId->name.lcl.len)){ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Termination[%s] not in service \n", (char*)termId->name.lcl.val); + snprintf(prnt_buf,termId->name.lcl.len,"%s",(char*)termId->name.lcl.val); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Termination[%s] not in service \n",(strlen(prnt_buf))?prnt_buf:"NULL"); mg_util_set_term_string(&errTxt, termId); err_code = MGT_MGCO_RSP_CODE_UNKNOWN_TERM_ID; goto error; @@ -591,7 +594,6 @@ void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) /*mgAccEvntPrntMgMgcoCommand(cmd, stdout);*/ - switch(cmd->cmdType.val) { case CH_CMD_TYPE_IND: @@ -784,12 +786,12 @@ void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) /* END OF TXN received - means last command in txn to process. * Send response to peer */ - if(CH_CMD_TYPE_IND == cmd->cmdType.val){ + if(CH_CMD_TYPE_IND == cmd->cmdType.val){ /*if(CH_CMD_STATUS_END_OF_TXN == cmd->cmdStatus.val)*/ mg_send_end_of_axn(suId, &cmd->transId, &out_ctxt, &cmd->peerId); } - return; + goto done; ctxt_error: err_code = MGT_MGCO_RSP_CODE_UNKNOWN_CTXT; @@ -802,9 +804,13 @@ error: if(CH_CMD_STATUS_END_OF_TXN == cmd->cmdStatus.val){ mg_send_end_of_axn(suId, &cmd->transId, &out_ctxt, &cmd->peerId); } -error1: - mg_free_cmd(cmd); - return; +done: + if(CH_CMD_TYPE_IND == cmd->cmdType.val){ + mg_free_cmd(cmd->u.mgCmdReq[0]); + }else if(CH_CMD_TYPE_CFM == cmd->cmdType.val){ + mg_free_cmd(cmd->u.mgCmdCfm[0]); + } + return; } /*****************************************************************************************************************************/ @@ -822,6 +828,8 @@ void handle_mgco_txn_sta_ind(Pst *pst, SuId suId, MgMgcoInd* txn_sta_ind) /*dump information*/ mgAccEvntPrntMgMgcoInd(txn_sta_ind, stdout); + + mg_free_cmd(txn_sta_ind); } /*****************************************************************************************************************************/