提交 642b1a2e authored 作者: kapil's avatar kapil

adding code for sending termination service change and respective CLI

command
上级 de70e3c0
...@@ -94,6 +94,28 @@ switch_status_t mg_process_cli_cmd(const char *cmd, switch_stream_handle_t *stre ...@@ -94,6 +94,28 @@ switch_status_t mg_process_cli_cmd(const char *cmd, switch_stream_handle_t *stre
} else { } else {
stream->write_function(stream, "-ERR No such profile\n"); stream->write_function(stream, "-ERR No such profile\n");
} }
/**********************************************************************************/
}else if(!strcmp(argv[2], "send")) {
/**********************************************************************************/
/* mg profile <profile-name> send sc <term-id> <method> <reason>*/
printf("count = %d \n",argc);
if(argc < 7){
goto usage;
}
if(zstr(argv[3]) || zstr(argv[4]) || zstr(argv[5]) || zstr(argv[6])){
goto usage;
}
if (profile) {
printf("Input to Send Service Change command : "
"Profile Name[%s], term-id[%s] method[%s] reason[%s] \n",
profile->name, argv[4], argv[5], argv[6]);
megaco_profile_release(profile);
mg_send_service_change(profile->idx, argv[4], atoi(argv[5]), atoi(argv[6]));
} else {
stream->write_function(stream, "-ERR No such profile\n");
}
/**********************************************************************************/ /**********************************************************************************/
}else { }else {
/**********************************************************************************/ /**********************************************************************************/
......
...@@ -9,6 +9,15 @@ ...@@ -9,6 +9,15 @@
#include "mod_media_gateway.h" #include "mod_media_gateway.h"
#include "media_gateway_stack.h" #include "media_gateway_stack.h"
U32 outgoing_txn_id;
/*****************************************************************************************************************************/
const char *mg_service_change_reason[] = {
"\"NOT USED\"",
"\"900 ServiceRestored\"",
"\"905 Termination taken out of service\"",
0
};
/*****************************************************************************************************************************/ /*****************************************************************************************************************************/
...@@ -134,7 +143,7 @@ switch_status_t mg_send_add_rsp(SuId suId, MgMgcoCommand *req) ...@@ -134,7 +143,7 @@ switch_status_t mg_send_add_rsp(SuId suId, MgMgcoCommand *req)
#else #else
termId = &(cmd.u.mgCmdRsp[0]->u.add.termId); termId = &(cmd.u.mgCmdRsp[0]->u.add.termId);
#endif #endif
mg_fill_mgco_termid(termId, (CONSTANT U8*)"term1",&req->u.mgCmdRsp[0]->memCp); /*mg_fill_mgco_termid(termId, (char*)"term1",&req->u.mgCmdRsp[0]->memCp);*/
/* We will always send one command at a time..*/ /* We will always send one command at a time..*/
cmd.cmdStatus.pres = PRSNT_NODEF; cmd.cmdStatus.pres = PRSNT_NODEF;
...@@ -197,7 +206,7 @@ switch_status_t mg_send_end_of_axn(SuId suId, MgMgcoTransId* transId, MgMgcoCont ...@@ -197,7 +206,7 @@ switch_status_t mg_send_end_of_axn(SuId suId, MgMgcoTransId* transId, MgMgcoCont
switch_status_t mg_build_mgco_err_request(MgMgcoInd **errcmd,U32 trans_id, MgMgcoContextId *ctxt_id, U32 err, MgStr *errTxt) switch_status_t mg_build_mgco_err_request(MgMgcoInd **errcmd,U32 trans_id, MgMgcoContextId *ctxt_id, U32 err, MgStr *errTxt)
{ {
MgMgcoInd *mgErr; MgMgcoInd *mgErr = NULL;
S16 ret; S16 ret;
mgErr = NULLP; mgErr = NULLP;
...@@ -584,6 +593,8 @@ switch_status_t mg_send_heartbeat_audit_rsp( SuId suId, MgMgcoCommand *auditReq) ...@@ -584,6 +593,8 @@ switch_status_t mg_send_heartbeat_audit_rsp( SuId suId, MgMgcoCommand *auditReq)
} }
/*****************************************************************************************************************************/ /*****************************************************************************************************************************/
#if 0
/* Kapil - Not using any more */
switch_status_t handle_media_audit( SuId suId, MgMgcoCommand *auditReq) switch_status_t handle_media_audit( SuId suId, MgMgcoCommand *auditReq)
{ {
switch_status_t ret; switch_status_t ret;
...@@ -788,7 +799,10 @@ switch_status_t handle_pkg_audit( SuId suId, MgMgcoCommand *auditReq) ...@@ -788,7 +799,10 @@ switch_status_t handle_pkg_audit( SuId suId, MgMgcoCommand *auditReq)
} }
#endif
/*****************************************************************************************************************************/ /*****************************************************************************************************************************/
#if 0
/* Kapil - Not using any more */
switch_status_t mg_send_audit_rsp(SuId suId, MgMgcoCommand *req) switch_status_t mg_send_audit_rsp(SuId suId, MgMgcoCommand *req)
{ {
MgMgcoCommand cmd; MgMgcoCommand cmd;
...@@ -858,6 +872,7 @@ switch_status_t mg_send_audit_rsp(SuId suId, MgMgcoCommand *req) ...@@ -858,6 +872,7 @@ switch_status_t mg_send_audit_rsp(SuId suId, MgMgcoCommand *req)
return ret; return ret;
} }
#endif
/*****************************************************************************************************************************/ /*****************************************************************************************************************************/
switch_status_t mg_send_modify_rsp(SuId suId, MgMgcoCommand *req) switch_status_t mg_send_modify_rsp(SuId suId, MgMgcoCommand *req)
...@@ -897,7 +912,7 @@ switch_status_t mg_send_modify_rsp(SuId suId, MgMgcoCommand *req) ...@@ -897,7 +912,7 @@ switch_status_t mg_send_modify_rsp(SuId suId, MgMgcoCommand *req)
#else #else
termId = &(cmd.u.mgCmdRsp[0]->u.mod.termId); termId = &(cmd.u.mgCmdRsp[0]->u.mod.termId);
#endif #endif
mg_fill_mgco_termid(termId, (CONSTANT U8*)"term1",&req->u.mgCmdRsp[0]->memCp); /*mg_fill_mgco_termid(termId, (char*)"term1",&req->u.mgCmdRsp[0]->memCp);*/
/* We will always send one command at a time..*/ /* We will always send one command at a time..*/
cmd.cmdStatus.pres = PRSNT_NODEF; cmd.cmdStatus.pres = PRSNT_NODEF;
...@@ -958,7 +973,7 @@ switch_status_t mg_send_subtract_rsp(SuId suId, MgMgcoCommand *req) ...@@ -958,7 +973,7 @@ switch_status_t mg_send_subtract_rsp(SuId suId, MgMgcoCommand *req)
#else #else
termId = &(cmd.u.mgCmdRsp[0]->u.sub.termId); termId = &(cmd.u.mgCmdRsp[0]->u.sub.termId);
#endif #endif
mg_fill_mgco_termid(termId, (CONSTANT U8*)"term1",&req->u.mgCmdRsp[0]->memCp); /*mg_fill_mgco_termid(termId, (char *)"term1",&req->u.mgCmdRsp[0]->memCp);*/
/* We will always send one command at a time..*/ /* We will always send one command at a time..*/
cmd.cmdStatus.pres = PRSNT_NODEF; cmd.cmdStatus.pres = PRSNT_NODEF;
...@@ -979,3 +994,94 @@ switch_status_t mg_send_subtract_rsp(SuId suId, MgMgcoCommand *req) ...@@ -979,3 +994,94 @@ switch_status_t mg_send_subtract_rsp(SuId suId, MgMgcoCommand *req)
return ret; return ret;
} }
/*****************************************************************************************************************************/
U32 get_txn_id(){
outgoing_txn_id++;
return outgoing_txn_id;
}
/*****************************************************************************************************************************/
/* Note : API to send Service Change */
/* INPUT :
* method - Service change method type (can be MGT_SVCCHGMETH_RESTART/MGT_SVCCHGMETH_FORCED (please refer to sng_ss7/cm/mgt.h for more values))
* MgServiceChangeReason_e - Service Change reason
* SuId - Service User ID for MG SAP - it will be same like mg_profile_t->idx (refer to media_gateway_xml.c->mg_sap_id)
* term_name - String format defined termination name
*/
switch_status_t mg_send_service_change(SuId suId, const char* term_name, uint8_t method, MgServiceChangeReason_e reason)
{
MgMgcoSvcChgPar srvPar;
MgMgcoTermId* termId;
switch_status_t ret;
MgMgcoCommand request;
MgMgcoSvcChgReq *svc;
MG_ZERO(&srvPar, sizeof(MgMgcoSvcChgPar));
MG_ZERO(&request, sizeof(request));
if(SWITCH_STATUS_FALSE == (ret = mg_create_mgco_command(&request, CH_CMD_TYPE_REQ, MGT_SVCCHG))){
goto err;
}
/*fill txn id */
request.transId.pres = PRSNT_NODEF;
request.transId.val = get_txn_id();
request.contextId.type.pres = PRSNT_NODEF;
request.contextId.type.val = MGT_CXTID_NULL;
#if 0
/* TODO - fill of below fields */
#ifdef GCP_MGCO
#ifdef GCP_VER_2_1
MgMgcoSegNum segNum;
MgMgcoSegCmpl segCmpl;
#endif
#endif /* GCP_MGCO */
#endif
request.cmdStatus.pres = PRSNT_NODEF;
request.cmdStatus.val = CH_CMD_STATUS_END_OF_TXN;
request.cmdType.pres = PRSNT_NODEF;
request.cmdType.val = CH_CMD_TYPE_REQ;
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]))){
return ret;
}
/*mgUtlCpyMgMgcoSvcChgPar(&svc->parm, &srvPar, &request.u.mgCmdReq[0]->memCp);*/
printf("reason[%p = %s], len[%d]\n",svc->parm.reason.val, svc->parm.reason.val, svc->parm.reason.len);
if (mgUtlGrowList((void ***)&svc->termIdLst.terms, sizeof(MgMgcoTermIdLst),
&svc->termIdLst.num, &request.u.mgCmdReq[0]->memCp) != ROK)
{
switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n");
return SWITCH_STATUS_FALSE;
}
#ifdef GCP_VER_2_1
termId = svc->termIdLst.terms[0];
#else
termId = &(svc->termId);
#endif
mg_fill_mgco_termid(termId, (char*)term_name ,strlen(term_name), &request.u.mgCmdReq[0]->memCp);
printf("reason[%p = %s], len[%d]\n",svc->parm.reason.val, svc->parm.reason.val, svc->parm.reason.len);
sng_mgco_send_cmd(suId, &request);
return SWITCH_STATUS_SUCCESS;
err:
mgUtlDelMgMgcoSvcChgPar(&srvPar);
return ret;
}
/*****************************************************************************************************************************/
...@@ -60,6 +60,13 @@ typedef struct _mgPackage ...@@ -60,6 +60,13 @@ typedef struct _mgPackage
extern MgPackage_t mg_pkg_list[]; extern MgPackage_t mg_pkg_list[];
/* Service change Reason */
typedef enum {
MG_SVC_REASON_NOTUSED = 0,
MG_SVC_REASON_900_RESTORED = 1,
MG_SVC_REASON_905_TERM_OOS = 2,
MG_SVC_REASON_LAST = 4
} MgServiceChangeReason_e;
#define MG_TXN_INVALID 0 #define MG_TXN_INVALID 0
...@@ -74,6 +81,12 @@ extern MgPackage_t mg_pkg_list[]; ...@@ -74,6 +81,12 @@ extern MgPackage_t mg_pkg_list[];
MG_SET_PRES((tkn).pres); \ MG_SET_PRES((tkn).pres); \
(tkn).val = _val; (tkn).val = _val;
#define MG_SET_TKN_VAL_PRES(_tkn, _val, _pres) \
{ \
(_tkn)->val = _val; \
(_tkn)->pres = _pres; \
}
#define MG_MEM_COPY(_dst, _src, _len) \ #define MG_MEM_COPY(_dst, _src, _len) \
cmMemcpy((U8*) (_dst), (const U8*) (_src), _len) cmMemcpy((U8*) (_dst), (const U8*) (_src), _len)
...@@ -126,7 +139,7 @@ switch_status_t mg_stack_alloc_mem( Ptr* _memPtr, Size _memSize ); ...@@ -126,7 +139,7 @@ switch_status_t mg_stack_alloc_mem( Ptr* _memPtr, Size _memSize );
MgMgcoMediaDesc* get_default_media_desc(void); MgMgcoMediaDesc* get_default_media_desc(void);
switch_status_t handle_media_audit( SuId suId, MgMgcoCommand *auditReq); switch_status_t handle_media_audit( SuId suId, MgMgcoCommand *auditReq);
switch_status_t mg_send_add_rsp(SuId suId, MgMgcoCommand *req); switch_status_t mg_send_add_rsp(SuId suId, MgMgcoCommand *req);
S16 mg_fill_mgco_termid ( MgMgcoTermId *termId, CONSTANT U8 *str, CmMemListCp *memCp); S16 mg_fill_mgco_termid ( MgMgcoTermId *termId, char* term_str, int term_len, CmMemListCp *memCp);
void mg_util_set_txn_string(MgStr *errTxt, U32 *txnId); void mg_util_set_txn_string(MgStr *errTxt, U32 *txnId);
switch_status_t mg_build_mgco_err_request(MgMgcoInd **errcmd,U32 trans_id, MgMgcoContextId *ctxt_id, U32 err, MgStr *errTxt); switch_status_t mg_build_mgco_err_request(MgMgcoInd **errcmd,U32 trans_id, MgMgcoContextId *ctxt_id, U32 err, MgStr *errTxt);
switch_status_t mg_send_audit_rsp(SuId suId, MgMgcoCommand *req); switch_status_t mg_send_audit_rsp(SuId suId, MgMgcoCommand *req);
...@@ -139,6 +152,11 @@ MgMgcoTermIdLst *mg_get_term_id_list(MgMgcoCommand *cmd); ...@@ -139,6 +152,11 @@ MgMgcoTermIdLst *mg_get_term_id_list(MgMgcoCommand *cmd);
switch_status_t handle_pkg_audit( SuId suId, MgMgcoCommand *auditReq); switch_status_t handle_pkg_audit( SuId suId, MgMgcoCommand *auditReq);
switch_status_t mg_build_pkg_desc(MgMgcoPkgsDesc* pkg); switch_status_t mg_build_pkg_desc(MgMgcoPkgsDesc* pkg);
switch_status_t mg_send_heartbeat_audit_rsp( SuId suId, MgMgcoCommand *auditReq); 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);
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);
switch_status_t mg_create_mgco_command(MgMgcoCommand *cmd, uint8_t apiType, uint8_t cmdType);
......
...@@ -208,6 +208,9 @@ void handle_mg_alarm(Pst *pst, MgMngmt *usta) ...@@ -208,6 +208,9 @@ void handle_mg_alarm(Pst *pst, MgMngmt *usta)
case LMG_EVENT_PEER_ENABLED: case LMG_EVENT_PEER_ENABLED:
{ {
len = len + sprintf(prBuf+len, "gateway enabled"); len = len + sprintf(prBuf+len, "gateway enabled");
/* gateway enabled now we can send termination service change */
/*TODO - probably we cannt immediate send Service change - we have to find proper place */
/*mg_send_service_change(0x01, "A01", MGT_SVCCHGMETH_RESTART,MG_SVC_REASON_900_RESTORED );*/
break; break;
} }
case LMG_EVENT_PEER_DISCOVERED: case LMG_EVENT_PEER_DISCOVERED:
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论