提交 6b4dcb5f authored 作者: David Yat Sin's avatar David Yat Sin

Merge branch 'nsg-4.3' of ssh://git.sangoma.com/smg_freeswitch into nsg-4.3

...@@ -7,6 +7,6 @@ ifeq ($(ARCH),x86_64) ...@@ -7,6 +7,6 @@ ifeq ($(ARCH),x86_64)
endif endif
BASE=../../../.. BASE=../../../..
LOCAL_OBJS=media_gateway.o media_gateway_stack.o media_gateway_xml.o media_gateway_cli.o media_gateway_stack_alarms.o LOCAL_OBJS=media_gateway.o media_gateway_stack.o media_gateway_xml.o media_gateway_cli.o media_gateway_stack_alarms.o media_gateway_cmd_handler.o media_gateway_utils.o media_gateway_packages.o
LOCAL_LDFLAGS=-lsng_mg LOCAL_LDFLAGS=-lsng_mg
include $(BASE)/build/modmake.rules include $(BASE)/build/modmake.rules
/*
* Copyright (c) 2012, Sangoma Technologies
* Mathieu Rene <mrene@avgs.ca>
* All rights reserved.
*
* <Insert license here>
*/
#include "mod_media_gateway.h"
#include "media_gateway_stack.h"
MgPackage_t mg_pkg_list [] =
{
{ /* INDEX : 0 */
MGT_PKG_GENERIC, /* Package Id 1 : Generic package */
1, /* Version 1 */
"g", /* Package name */
},
{ /* INDEX : 1 */
MGT_PKG_ROOT,
2, /* Version 1 */
"root", /* Package name */
},
{ /* INDEX : 2 */
MGT_PKG_TONEDET, /*4*/
1, /* Version 1 */
"tonedet", /* Package name */
},
{ /* INDEX : 3 */
MGT_PKG_DTMFDET, /*6*/
1, /* Version 1 */
"dd", /* Package name */
},
{ /* INDEX : 4 */
MGT_PKG_NETWORK, /*11*/
1, /* Version 1 */
"nt", /* Package name */
},
{ /* INDEX : 5 */
MGT_PKG_RTP, /*12*/
1, /* Version 1 */
"rtp", /* Package name */
},
{ /* INDEX : 6 */
MGT_PKG_TDM_CKT, /*13*/
1, /* Version 1 */
"tdmc", /* Package name */
},
{ /* INDEX : 7 */
MGT_PKG_QTY_ALT, /*55*/
1, /* Version 1 */
"qac", /* Package name */
},
{ /* INDEX : 8 */
MGT_PKG_EN_ALERT, /*59*/
2, /* Version 2 */
"alert", /* Package name */
},
{ /* INDEX : 9 */
MGT_PKG_AN_DISP, /*60*/
2, /* Version 1 */
"andisp", /* Package name */
},
{ /* INDEX : 10 */
MGT_PKG_INACTTIMER, /*69*/
1, /* Version 1 */
"it", /* Package name */
},
{ /* INDEX : 11 */
MGT_PKG_STIMAL, /* 147 */
1, /* Version 1 */
"stimal ", /* Package name */
},
{ /* INDEX : 12 */
MGT_PKG_CALLPROGGEN, /* 7 */
1, /* Version 1 */
"cg", /* Package name */
},
{ /* INDEX : 13 */
MGT_PKG_GENERIC_ANNC, /* 29 */
1, /* Version 1 */
"an", /* Package name */
},
{ /* INDEX : 14 */
MGT_PKG_XD_CALPG_TNGN, /* 36 */
1, /* Version 1 */
"xcg", /* Package name */
},
{ /* INDEX : 15 */
MGT_PKG_BSC_SRV_TN, /* 37 */
1, /* Version 1 */
"srvtn", /* Package name */
},
{ /* INDEX : 16 */
MGT_PKG_ETSI_NR,
1, /* Version 1 */
"etsi_nr", /* Package name */
},
/* Add more packages */
};
/***************************************************************************************/
switch_status_t mg_build_pkg_desc(MgMgcoPkgsDesc* pkg)
{
uint16_t i = 0x00;
uint16_t num_of_pkgs = sizeof(mg_pkg_list)/sizeof(MgPackage_t);
printf("mg_build_pkg_desc: num_of_pkgs[%d]\n",num_of_pkgs);
for (i = 0; i < num_of_pkgs; i++) {
if (mgUtlGrowList((void ***)&pkg->items,
sizeof(MgMgcoPkgsItem), &pkg->num, NULLP) != ROK) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,"Package descriptor Grow List failed\n");
return SWITCH_STATUS_FALSE;
}
pkg->items[pkg->num.val - 1 ]->pres.pres = PRSNT_NODEF;
pkg->items[pkg->num.val - 1 ]->name.type.pres = PRSNT_NODEF;
pkg->items[pkg->num.val - 1 ]->name.type.val = MGT_GEN_TYPE_KNOWN;
pkg->items[pkg->num.val - 1 ]->name.u.val.pres = PRSNT_NODEF;
pkg->items[pkg->num.val - 1 ]->name.u.val.val = mg_pkg_list[i].package_id;
pkg->items[pkg->num.val - 1 ]->ver.pres = PRSNT_NODEF;
pkg->items[pkg->num.val - 1 ]->ver.val = mg_pkg_list[i].version;
printf("mg_build_pkg_desc: Inserted pkg_id[%d] with version[%d] into pkg list index[%d]\n",mg_pkg_list[i].package_id,mg_pkg_list[i].version,i);
}
return SWITCH_STATUS_SUCCESS;
}
/***************************************************************************************/
...@@ -43,6 +43,61 @@ typedef enum{ ...@@ -43,6 +43,61 @@ typedef enum{
(_val == SNG_MG_ENCODING_BINARY)?"SNG_MG_ENCODING_BINARY":\ (_val == SNG_MG_ENCODING_BINARY)?"SNG_MG_ENCODING_BINARY":\
"SNG_MG_ENCODING_NONE") "SNG_MG_ENCODING_NONE")
typedef struct _mgStr
{
U8 len;
U8 val[128];
} MgStr;
#define MAX_PACKAGE_NAME 128
typedef struct _mgPackage
{
uint8_t package_id;
uint16_t version;
uint8_t name[MAX_PACKAGE_NAME+1];
}MgPackage_t;
extern MgPackage_t mg_pkg_list[];
#define MG_TXN_INVALID 0
#define MG_ZERO(_buf, _size) {cmMemset((U8 *)(_buf), 0, _size);}
/* Set pres field */
#define MG_SET_PRES(_pres) \
(_pres) = PRSNT_NODEF;
/* Set token value */
#define MG_SET_VAL_PRES(tkn,_val) \
MG_SET_PRES((tkn).pres); \
(tkn).val = _val;
#define MG_MEM_COPY(_dst, _src, _len) \
cmMemcpy((U8*) (_dst), (const U8*) (_src), _len)
#define MG_INIT_TOKEN_VALUE(_tkn, _val) \
{ \
(_tkn)->pres = PRSNT_NODEF; \
(_tkn)->val = (_val); \
}
#define MG_GETMEM(_ptr,_len,_memCp,_ret) \
{ \
ret = cmGetMem((_memCp), (_len), (Ptr *)&(_ptr)); \
if( ret == ROK) \
cmMemset((U8 *)(_ptr), (U8)0, (PTR)(_len)); \
}
#define MG_INIT_TKNSTR(_tkn, _val, _len) \
{ \
(_tkn)->pres = PRSNT_NODEF; \
(_tkn)->len = (U8)(_len); \
cmMemcpy((U8 *)(_tkn)->val, (CONSTANT U8 *)(_val), (_len)); \
}
void handle_sng_log(uint8_t level, char *fmt, ...); void handle_sng_log(uint8_t level, char *fmt, ...);
void handle_mgco_sta_ind(Pst *pst, SuId suId, MgMgtSta* msg); void handle_mgco_sta_ind(Pst *pst, SuId suId, MgMgtSta* msg);
...@@ -62,6 +117,29 @@ switch_status_t sng_mgco_init(sng_mg_event_interface_t* event); ...@@ -62,6 +117,29 @@ switch_status_t sng_mgco_init(sng_mg_event_interface_t* event);
switch_status_t sng_mgco_stack_shutdown(void); switch_status_t sng_mgco_stack_shutdown(void);
int sng_mgco_mg_get_status(int elemId, MgMngmt* cfm, megaco_profile_t* mg_cfg, mg_peer_profile_t* mg_peer); int sng_mgco_mg_get_status(int elemId, MgMngmt* cfm, megaco_profile_t* mg_cfg, mg_peer_profile_t* mg_peer);
switch_status_t mg_send_end_of_axn(SuId suId, MgMgcoTransId* transId, MgMgcoContextId* ctxtId, TknU32* peerId);
void mgco_print_sdp(CmSdpInfoSet *sdp);
void mg_util_set_ctxt_string ( MgStr *errTxt, MgMgcoContextId *ctxtId);
switch_status_t handle_mg_add_cmd(MgMgcoAmmReq *addReq);
switch_status_t mg_stack_free_mem(MgMgcoMsg* msg);
switch_status_t mg_stack_free_mem(MgMgcoMsg* msg);
switch_status_t mg_stack_alloc_mem( Ptr* _memPtr, Size _memSize );
switch_status_t mg_send_add_rsp(SuId suId, MgMgcoCommand *req);
S16 mg_fill_mgco_termid ( MgMgcoTermId *termId, CONSTANT U8 *str, CmMemListCp *memCp);
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_send_audit_rsp(SuId suId, MgMgcoCommand *req);
switch_status_t handle_mg_audit_cmd(SuId suId, MgMgcoCommand *auditReq);
switch_status_t mg_send_modify_rsp(SuId suId, MgMgcoCommand *req);
switch_status_t mg_send_subtract_rsp(SuId suId, MgMgcoCommand *req);
void mg_util_set_term_string ( MgStr *errTxt, MgMgcoTermId *termId);
MgMgcoTermIdLst *mg_get_term_id_list(MgMgcoCommand *cmd);
switch_status_t handle_pkg_audit( SuId suId, MgMgcoCommand *auditReq);
switch_status_t mg_build_pkg_desc(MgMgcoPkgsDesc* pkg);
/****************************************************************************************************************/ /****************************************************************************************************************/
/* MG Stack defines */ /* MG Stack defines */
......
...@@ -153,7 +153,7 @@ static switch_xml_config_item_t *get_peer_instructions(mg_peer_profile_t *profil ...@@ -153,7 +153,7 @@ static switch_xml_config_item_t *get_peer_instructions(mg_peer_profile_t *profil
/* parameter name type reloadable pointer default value options structure */ /* parameter name type reloadable pointer default value options structure */
SWITCH_CONFIG_ITEM("ip", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE, &profile->ipaddr, "", &switch_config_string_strdup, "", "Peer IP"), SWITCH_CONFIG_ITEM("ip", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE, &profile->ipaddr, "", &switch_config_string_strdup, "", "Peer IP"),
SWITCH_CONFIG_ITEM("port", SWITCH_CONFIG_STRING, 0, &profile->port, "", &switch_config_string_strdup, "", "peer port"), SWITCH_CONFIG_ITEM("port", SWITCH_CONFIG_STRING, 0, &profile->port, "", &switch_config_string_strdup, "", "peer port"),
SWITCH_CONFIG_ITEM("encoding-scheme", SWITCH_CONFIG_STRING, 0, &profile->encoding_type, "TEXT", &switch_config_string_strdup, "", "peer encoding type"), SWITCH_CONFIG_ITEM("encoding-scheme", SWITCH_CONFIG_STRING, 0, &profile->encoding_type, "", &switch_config_string_strdup, "", "peer encoding type"),
SWITCH_CONFIG_ITEM("transport-type", SWITCH_CONFIG_STRING, 0, &profile->transport_type, "", &switch_config_string_strdup, "", "peer transport type "), SWITCH_CONFIG_ITEM("transport-type", SWITCH_CONFIG_STRING, 0, &profile->transport_type, "", &switch_config_string_strdup, "", "peer transport type "),
SWITCH_CONFIG_ITEM("message-identifier", SWITCH_CONFIG_STRING, 0, &profile->mid, "", &switch_config_string_strdup, "", "peer message identifier "), SWITCH_CONFIG_ITEM("message-identifier", SWITCH_CONFIG_STRING, 0, &profile->mid, "", &switch_config_string_strdup, "", "peer message identifier "),
SWITCH_CONFIG_ITEM_END() SWITCH_CONFIG_ITEM_END()
...@@ -215,23 +215,25 @@ static switch_xml_config_item_t *get_instructions(megaco_profile_t *profile) { ...@@ -215,23 +215,25 @@ static switch_xml_config_item_t *get_instructions(megaco_profile_t *profile) {
static switch_status_t modify_mid(char* mid) static switch_status_t modify_mid(char* mid)
{ {
char* dup = NULL; char dup[64];
char* val[10]; char* val[10];
int count; int count;
switch_assert(mid); switch_assert(mid);
memset(&dup[0],0,sizeof(dup));
/* If MID type is IP then add mid into [] brackets , /* If MID type is IP then add mid into [] brackets ,
* If MID type is domain then add mid into <> brackets * * If MID type is domain then add mid into <> brackets *
*/ */
dup = strdup(mid); strcpy(&dup[0],mid);
count = switch_split(dup, '.', val); count = switch_split(&dup[0], '.', val);
if(!count) { if(!count) {
/* Input string is not separated by '.', check if its separated by '-' as format could be xxx-xx-xxx/xxx-xx-xx-xxx */ /* Input string is not separated by '.', check if its separated by '-' as format could be xxx-xx-xxx/xxx-xx-xx-xxx */
free(dup); memset(&dup[0],0,sizeof(dup));
dup = strdup(mid); strcpy(&dup[0],mid);
if(0 == (count = switch_split(dup, '-', val))){ if(0 == (count = switch_split(dup, '-', val))){
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid input MID string[%s]\n",mid); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid input MID string[%s]\n",mid);
return SWITCH_STATUS_FALSE; return SWITCH_STATUS_FALSE;
...@@ -239,28 +241,27 @@ static switch_status_t modify_mid(char* mid) ...@@ -239,28 +241,27 @@ static switch_status_t modify_mid(char* mid)
} }
if(('<' == val[0][0]) || ('[' == val[0][0])){ if(('<' == val[0][0]) || ('[' == val[0][0])){
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "MID[%s] is already prefixed with proper brackets \n",mid); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "MID = %s is already prefixed with proper brackets \n",mid);
return SWITCH_STATUS_SUCCESS; return SWITCH_STATUS_SUCCESS;
} }
/*first check could be if count is 3 means domain name as generally we have xxx-xx-xxx/xxx.xx.xxx domain */ /*first check could be if count is 3 means domain name as generally we have xxx-xx-xxx/xxx.xx.xxx domain */
if(3 == count){ if(3 == count){
/* domain-type, add value into <> */ /* domain-type, add value into <> */
free(dup); memset(&dup[0],0,sizeof(dup));
dup = strdup(mid); strcpy(&dup[0],mid);
sprintf(mid,"<%s>",dup); sprintf(mid,"<%s>",dup);
}else if(4 == count){ }else if(4 == count){
/* IP address in xxx.xxx.xxx.xxx format */ /* IP address in xxx.xxx.xxx.xxx format */
free(dup); memset(&dup[0],0,sizeof(dup));
dup = strdup(mid); strcpy(&dup[0],mid);
sprintf(mid,"[%s]",dup); sprintf(mid,"[%s]",dup);
}else { }else {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid input MID string[%s]\n",mid); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid input MID string[%s]\n",mid);
free(dup);
return SWITCH_STATUS_FALSE; return SWITCH_STATUS_FALSE;
} }
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Added proper brackets to MID = %s \n",mid);
free(dup);
return SWITCH_STATUS_SUCCESS; return SWITCH_STATUS_SUCCESS;
} }
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论