init ems server code

This commit is contained in:
2024-09-27 15:39:34 +08:00
parent 9d4009aaca
commit 9930e4e58f
1551 changed files with 110216 additions and 102864 deletions

View File

@@ -0,0 +1,449 @@
#ifndef _MGC_H
#define _MGC_H
#define MGC_MAX_NUM_OF_SAP 5
#define MGC_MAX_USER_NAME_LEN 32
#define MGC_MAX_DOMAIN_LEN 64
#define MGC_MAX_PHY_PORT_PER_MG 32
#define MGC_MAX_CHNL_NUM_PER_PHY 1024
#define MGC_MAX_NUM_OF_CHNL_CON 512
#define MGC_MAX_NUM_OF_CON 8192
#define MGC_MAX_OPER_STEPS_NUM 15
#define MGC_MAX_NUM_OF_MG 1024
#define MGC_MAX_NUM_OF_PHY_PORT 1024
#define MGC_MAX_NUM_OF_CHNL 9424
#define MGC_MAX_NUM_OF_PORT 8192
#define MGC_MAX_NUM_OF_SESS 1024
#define MGC_MAX_NUM_OF_RTP_PROXY_SESS 4096
#define MGC_MGCF_TIMER_50MS 5
#define MGC_MGCF_TIMER_20MS 2
#define MGC_MGCF_TIMER_1S 100
#define MGC_MGCF_TIMER_10S 10 * MGC_MGCF_TIMER_1S
#define MGC_MGCF_TIMER_20S 20 * MGC_MGCF_TIMER_1S
#define MGC_MGCF_TIMER_1H 3600 * MGC_MGCF_TIMER_1S
#define MGC_CHNL_NUM_INTERNAL_PER_PORT 1024
#define MGC_CHNL_NUM_AALN_PER_PORT 1
#define MGC_CHNL_NUM_ANN_PER_TYPE 200
#define MGC_CHNL_NUM_DS_PER_PORT 32
#define MGC_CHNL_NUM_TANDEM_PER_TYPE 1024
#define MGC_CHNL_NUM_SERVEILLANCE_PER_TYPE 1024
#define MGC_HOLD_MUSIC 7
#define MGC_TONE_RING 8
#define MGC_TONE_BUSY 9
#define MGC_TONE_WARN 10
#define MGC_MGCP_MGC_PORT 2727
#define MGC_MGCP_MG_PORT 2427
#define MGC_MG_NETWORK_PORT 4967
#define MGC_MGC_NETWORK_PORT 4966
#define MGC_OPERA_NO_DELAY 0
#define MGC_CONNECT_SILENT_TONE 0x01
#define MGC_MAX_NUM_OF_TANDEM 4096
#define MGC_MAX_NUM_OF_RTP_PROXY_NUM 2
#define MGC_MAX_NUM_OF_TANDEM_CONN (MGC_MAX_NUM_OF_TANDEM*2)
#define MGC_MAX_NUM_OF_TANDEM_CHNL (MGC_MAX_NUM_OF_TANDEM)
#define MGC_TANDEM_CONN_STAR_ID (MGC_MAX_NUM_OF_CON)
#define MGC_TANDEM_CHNL_STAR_ID (MGC_MAX_NUM_OF_CHNL)
#define MGC_TANDEM_PHY_PORT_STAR_ID (MGC_MAX_NUM_OF_PHY_PORT)
#define MGC_MAX_NUM_OF_SURVEILLANCE_NUM 2
#define MGC_MAX_NUM_OF_SURVEILLANCE_CONN 1024
#define MGC_MAX_NUM_OF_SURVEILLANCE_NODE (MGC_MAX_NUM_OF_SURVEILLANCE_CONN)
#define MGC_MAX_NUM_OF_SURVEILLIANCE_CHNL (MGC_MAX_NUM_OF_SURVEILLANCE_CONN)
#define MGC_SURVEILLIANCE_CONN_STAR_ID (MGC_TANDEM_CONN_STAR_ID+MGC_MAX_NUM_OF_TANDEM_CONN)
#define MGC_SURVEILLIANCE_CHNL_STAR_ID (MGC_TANDEM_CHNL_STAR_ID+MGC_MAX_NUM_OF_TANDEM_CHNL)
#define MGC_SURVEILLIANCE_PHY_PORT_STAR_ID (MGC_TANDEM_PHY_PORT_STAR_ID+ MGC_MAX_NUM_OF_RTP_PROXY_NUM)
#include "../../../public/src/include/includes.h"
#include "../../../public/src/include/public.h"
#include "../../../public/src/include/license_id.h"
#include "../../../public/src/include/pub_sdp.h"
//#include "../../../mgcp/src/include/mgcp.h"
typedef enum
{
MGC_RESULT_LACK_PARA = -4,
MGC_RESULT_NO_RES = -3 ,
MGC_RESULT_INPUT_ILLEGAL = -2,
MGC_RESULT_FAILURE = -1,
MGC_RESULT_OK = 0,
MGC_RESULT_8ECP_OK = 1
}MGC_RESULT;
typedef enum{
MGC_DTMF_1 = 1,
MGC_DTMF_2 = 2,
MGC_DTMF_3 = 3,
MGC_DTMF_4 = 4,
MGC_DTMF_5 = 5,
MGC_DTMF_6 = 6,
MGC_DTMF_7 = 7,
MGC_DTMF_8 = 8,
MGC_DTMF_9 = 9,
MGC_DTMF_0 = 10,
MGC_DTMF_START = 11,
MGC_DTMF_POUND = 12
}MGC_DTMF_DEF;
typedef enum{
MGC_PKG_L = 0,
MGC_PKG_D = 1,
MGC_PKG_G = 2
}MGC_PKG_TYPE;
typedef enum
{
MGC_USER_TYPE_UNDEF = -1,
MGC_USER_TYPE_MGC = 0,
MGC_USER_TYPE_MG = 1
}MGC_USER_TYPE;
typedef enum
{
MGC_CONNECT_STATUS_UNDEF = -1,
MGC_CONNECT_STATUS_IDLE ,
MGC_CONNECT_STATUS_CREATING ,
MGC_CONNECT_STATUS_CREATE,
MGC_CONNECT_STATUS_CREATED
}MGC_CONNECT_STATUS;
typedef enum
{
MGC_CON_MODE_UNDEF = -1,
MGC_CON_MODE_INACTIVE ,
MGC_CON_MODE_RECVONLY ,
MGC_CON_MODE_SENDONLY ,
MGC_CON_MODE_SENDRECV ,
MGC_CON_MODE_OWN
}MGC_CON_MODE;
typedef enum
{
MGC_CHNL_INFO_STATUS_UNDEF = -1,
MGC_CHNL_INFO_STATUS_IDLE,
MGC_CHNL_INFO_STATUS_USED
}MGC_CHNL_INFO_STATUS;
typedef enum
{
MGC_PHY_PORT_STATUS_UNDEF = -1,
MGC_PHY_PORT_STATUS_OFF_LINE,
MGC_PHY_PORT_STATUS_ON_LINE
}MGC_PHY_PORT_STATUS;
typedef enum
{
MGC_PHY_PORT_TYPE_UNDEF = -1,
MGC_PHY_PORT_TYPE_E1 = 1 ,
MGC_PHY_PORT_TYPE_T1 = 2 ,
MGC_PHY_PORT_TYPE_ANALOG ,
MGC_PHY_VIRTUAL_TYPE_ANN,
MGC_PHY_VIRTUAL_TYPE_INTERNAL,
MGC_PHY_VIRTUAL_TYPE_TANDEM,
MGC_PHY_VIRTUAL_TYPE_SURVEILLANCE
}MGC_PHY_PORT_TYPE;
typedef enum
{
MGC_MG_CTRL_TYPE_UNDEF = -1,
MGC_MG_CTRL_TYPE_MGCP,
MGC_MG_CTRL_TYPE_8ECP
}MGC_MG_CTRL_TYPE;
typedef enum
{
MGC_MG_TYPE_UNDEF = -1,
MGC_MG_TYPE_INTERNAL = 0 ,
MGC_MG_TYPE_AudioCoder = 1 ,
MGC_MG_TYPE_LGC_MG = 2,
MGC_MG_TYPE_SSW_CSS = 3 ,
MGC_MG_TYPE_IPBSS =4 ,
MGC_MG_TYPE_ANALOG = 11 ,
MGC_MG_TYPE_TANDEM = 20,
MGC_MG_TYPE_ANN =21
}MGC_MG_TYPE;
typedef enum
{
MGC_OPER_ID_UNDEF =-1,
MGC_OPER_ID_CONNECT_CHNL = 1,
MGC_OPER_ID_CONNECT_DTMF = 2,
MGC_OPER_ID_CONNECT_TONE =3,
MGC_OPER_ID_CRCX = 4,
MGC_OPER_ID_MDCX = 5,
MGC_OPER_ID_DLCX = 6,
MGC_OPER_ID_RQNT = 7,
MGC_OPER_ID_AUEP = 8,
MGC_OPER_ID_CONNECT_AAS = 9,
MGC_OPER_ID_TANDEM_CREATE,
MGC_OPER_ID_TANDEM_SET_TAR,
MGC_OPER_ID_TANDEM_UNSET_TAR,
MGC_OPER_ID_TANDEM_CLEAR,
MGC_OPER_ID_TANDEM_FORK_CHNL,
MGC_OPER_ID_CREATE_VIRTUAL_CHNL,
MGC_OPER_ID_RELEASE_VIRTUAL_CHNL,
MGC_OPER_ID_UPDATE_CHNL_MEDIA,
MGC_OPER_ID_IND
}MGC_MG_OPER_ID_TYPE;
typedef enum
{
MGC_CMD_UNDEF = -1,
MGC_CMD_CRCX = 1,
MGC_CMD_MDCX ,
MGC_CMD_DLCX ,
MGC_CMD_RQNT ,
MGC_CMD_NTFY ,
MGC_CMD_AUEP ,
MGC_CMD_RSIP ,
MGC_CMD_NOP //do noting
}MGC_CMD_TYPE;
typedef enum
{
MGCP_OPER_STEP_UNDEF =-1,
MGCP_OPER_STEP_REQUEST,
MGCP_OPER_STEP_REQUEST_SENT,
MGCP_OPER_STEP_RESPONSE_GET,
/***************************************************
* up status is used for MGC , following status is used for MG
*****************************************************/
MGCP_OPER_STEP_IND,
MGCP_OPER_STEP_IND_SENT,
MGCP_OPER_STEP_RESPONSE
}MGCP_OPER_STEP_STATUS;
typedef enum
{
MGC_OPER_FAILURE = 0,
MGC_OPER_SUCCESS = 1
}MGC_OPER_RESULT;
typedef enum
{
MGC_VCTYPE_PCMA = 0 ,
MGC_VCTYPE_PCMU = 1,
MGC_VCTYPE_GSM =2 ,
MGC_VCTYPE_GSM_EFR = 3,
MGC_VCTYPE_AMR_12_2 = 4,
MGC_VCTYPE_G729B = 5,
MGC_VCTYPE_AMR_10_2 = 6,
MGC_VCTYPE_AMR_7_95 = 7,
MGC_VCTYPE_AMR_7_4 = 8,
MGC_VCTYPE_AMR_6_7 = 9,
MGC_VCTYPE_AMR_5_15 = 10,
MGC_VCTYPE_AMR_5_9 = 11,
MGC_VCTYPE_AMR_4_75 = 12,
MGC_VCTYPE_NUM,
MGC_VCTYPE_UNSUPPORT
}MGC_VCTYPE;
typedef enum
{
MGC_TANDEM_STATUS_UNDEF = -1,
MGC_TANDEM_STATUS_IDLE,
MGC_TANDEM_STATUS_USED
}MGC_TANDEM_STATUS;
typedef struct _MGC_ESCCD
{
char domain[MGC_MAX_DOMAIN_LEN];
WORD port;
}MGC_ESCCD;
typedef struct _OPER_REC
{
MGC_MG_OPER_ID_TYPE operaId;
BYTE tone;
WORD duration;
WORD times;
}OPER_REC;
typedef struct _CHNL
{
WORD mgNo; // mg No.
BYTE portNo; // local physical port No. of that mg
WORD chlNo; // local channel No. of that trunk
WORD connectNo;
}CHNL;
typedef struct _MGC_CODEC_LIST
{
BYTE num; // num of codecs
WORD priority; // priority level, used when comparing different codec list
MGC_VCTYPE codec[MGC_VCTYPE_NUM]; // codec ID number, high priority codec first
}MGC_CODEC_LIST;
typedef struct _MG_ATTR
{
BYTE ptime; // ptime, in ms
MGC_MG_TYPE mgType; // non-virtual/ann
MGC_MG_CTRL_TYPE ctrlType; // 8ecp or mgcp
BYTE epDes; // endpoint description method: structured or unstructured
BYTE toneCap; // Tone generation capability
BYTE maxPorts; // maximum physical ports of this MG
WORD maxChnls; // maximum channels of this MG, only applicable to virtual MG.
DWORD ip; // IP address of the MG
char domain[MGC_MAX_DOMAIN_LEN]; // domain name of the mg
BYTE e1cardNo;
DWORD auditTimer;
MGC_CODEC_LIST codecList; // list of codecs that the MG supports
}MG_ATTR;
typedef struct _PKG_EVENT
{
BYTE pkg; // package name
BYTE event; // event name
}PKG_EVENT;
typedef struct _PKG_SIGNAL
{
BYTE pkg; // package name
BYTE signal; // signal name
}PKG_SIGNAL;
typedef struct _PKG_REQ
{
BYTE pkg; // package name
BYTE req; // request name
}PKG_REQ;
#define MGC_MEDIA_PARA_FLAG_EC 0x0001
#define MGC_MEDIA_PARA_FLAG_SS 0x0002
#define MGC_MEDIA_PARA_FLAG_VT 0x0004
#define MGC_MEDIA_PARA_FLAG_CM 0x0008
#define MGC_MEDIA_PARA_FLAG_PT 0x0010
typedef struct _MEDIA_PARA
{
WORD flag; // which media attribute is affected
BYTE ecDisable; // echo canceller disable or enable
BYTE ssDisable; // silence suppression disable or enable;
BYTE conMode; // connect mode
BYTE ptime; // packetization period
MGC_CODEC_LIST vocoderType; // vocoder type
}MEDIA_PARA;
typedef struct _MEDIA_ATTR
{
BYTE ecDisable; // echo canceller disable or enable
BYTE ssDisable; // silence suppression disable or enable
MGC_VCTYPE vocoderType; // vocoder type
MGC_CON_MODE conMode; // connect mode
char callId[33]; // call Id
char conId[33]; // connection id
BYTE ptime; // packetization period
PKG_EVENT pkgEvent; // package + event
PKG_SIGNAL pkgSignal; // package + signal
PKG_REQ pkgReq;
PUB_SDP_MSG sdp; // media info of this channel
}MEDIA_ATTR;
typedef int (*mgc_ind_callback)(CHNL chnl, MGC_CMD_TYPE cmd, WORD *usrPort, WORD mgcPort, MEDIA_ATTR *mediaAttr);
typedef int (*mgc_cnf_callback)(WORD usrPort, WORD mgcPort, MGC_MG_OPER_ID_TYPE operId, MGC_OPER_RESULT success, WORD cause);
typedef struct _MGC_SAP
{
int id; //internal used , should not be modified by up layer
char usrName[MGC_MAX_USER_NAME_LEN]; // user name
MGC_USER_TYPE usrType; // user acts as a mg or mgc
mgc_ind_callback ind_func;
mgc_cnf_callback cnf_func;
}MGC_SAP;
void mgc_init(DWORD systemId, DWORD localIp, DWORD peerIp);
int mgc_bind(MGC_SAP *pSap);
int mgc_unbind(MGC_SAP *pSap, BYTE sapIndex);
void mgc_timer(void);
int mgc_create_MG(BYTE sapIndex, MG_ATTR *pMgAttr);
int mgc_delete_MG(BYTE sapIndex, WORD mgNo);
int mgc_modify_MG(BYTE sapIndex, WORD mgNo, MG_ATTR *pMgAttr);
int mgc_add_port(BYTE sapIndex, WORD mgNo, BYTE portNo, MGC_PHY_PORT_TYPE portType);
int mgc_delete_port(BYTE sapIndex, WORD mgNo, BYTE portNo);
int mgc_crcx_chnl(WORD usrPort, CHNL chnl);
int mgc_mdcx_chnl(WORD usrPort, CHNL chnl, MEDIA_PARA *pMediaPara);
int mgc_dlcx_chnl(WORD usrPort, CHNL chnl);
int mgc_rqnt_chnl(WORD usrPort, CHNL chnl, PKG_EVENT *pPkgEvent, PKG_SIGNAL *pPkgSig);
int mgc_connect_chnl(WORD usrPort, CHNL orgChnl, CHNL destChnl, BYTE flag);
int mgc_connect_dtmf(WORD usrPort, CHNL chnl,CHNL dstChnl, BYTE dtmfNo);
int mgc_recvonly_chnl(WORD usrPort, CHNL orgChnl, CHNL destChnl);
int mgc_connect_AAS(WORD usrPort, CHNL orgChnl, CHNL destChnl, BYTE toneNo, WORD duration, WORD times);
int mgc_connect_tone(WORD usrPort, CHNL orgChnl, CHNL destChnl, BYTE toneNo, WORD duration);
int mgc_query_mg_status(WORD mgNo);
int mgc_query_port_status(WORD mgNo, BYTE portNo);
int mgc_query_channel_status(CHNL chnl);
int mgc_create_virtual_chnl(WORD usrPort, CHNL *pChnl);
int mgc_release_virtual_chnl(WORD usrPort,CHNL chnl);
int mgc_query_chnl_media(WORD usrPort, CHNL chnl, PUB_SDP_MSG **ppMediaInfo, BYTE *pMgPayloads, BYTE *pMgPlNum);
int mgc_update_chnl_media(WORD usrPort, CHNL chnl, PUB_SDP_MSG *pMediaInfo);
int mgc_chnl_codec_update(CHNL chnl , MGC_CODEC_LIST codecList);
OPER_REC *mgc_query_chnl_oper_rec(CHNL chnl);
int mgc_license_ctrl(WORD maxMgNum, WORD maxChnlNum);
int mgc_rsp(BYTE cmd, WORD usrPort, WORD port, WORD retCode, MEDIA_ATTR *pMediaAttr);
int mgc_get_idle_tandem_id(void);
int mgc_bind_chnl_to_tandem(WORD usrPort , CHNL tarChnl , DWORD tandId);
int mgc_create_tandem(WORD usrPort , DWORD tandId);
int mgc_unbind_chnl_from_tandem(WORD usrPort , CHNL tarChnl , DWORD tandId);
int mgc_delete_tandem(WORD usrPort , DWORD tandemId);
int mgc_get_tandem_near_end(DWORD tandem_id, CHNL *pChnl);
int mgc_get_tandem_far_end(DWORD tandem_id, CHNL *pChnl);
int mgc_fork_chnl(WORD usrPort , CHNL parent, CHNL *pChild);
char *mgc_print_failure_reason(int ret);
#endif

View File

@@ -0,0 +1,17 @@
#ifndef _MGC_8ECP_H
#define _MGC_8ECP_H
#include "mgc_struct.h"
#define MGC_8ECP_MAX_TRK_PER_MG 8
int mgc_bind_8ecp_setup(void);
int mgc_8ecp_update_trk_status(BYTE mgNo, BYTE trkNo, BYTE status);
int mgc_8ecp_update_mg_status(BYTE mgNo, BYTE status);
BOOL mgc_8ecp_create(MG_INFO *pMgInfo , MG_ATTR *pMgAttr);
BOOL mgc_8ecp_delete(MG_INFO *pMgInfo);
BOOL mgc_8ecp_dlcx_chnl(CHNL chnl);
BOOL mgc_8ecp_connect_chnl(CHNL orgChnl, CHNL destChnl, BYTE flag);
BOOL mgc_8ecp_connect_dtmf(CHNL orgChnl, CHNL destChnl, BYTE digit);
BOOL mgc_8ecp_connect_tone(CHNL orgChnl, CHNL destChnl, BYTE tone , BYTE duration);
#endif

View File

@@ -0,0 +1,32 @@
#ifndef _MGC_CHNL_INFO_H
#define _MGC_CHNL_INFO_H
#include "mgc_struct.h"
void mgc_chnl_info_setup(void);
void mgc_chnl_info_init(CHNL_INFO *pChnlInfo , int id);
void mgc_chnl_info_clear(CHNL_INFO *pChnlInfo);
void mgc_chnl_info_status_set(CHNL_INFO *pChnlInfo , MGC_CHNL_INFO_STATUS status);
CHNL_INFO *mgc_chnl_info_get_unused_chnl(void);
CHNL_INFO *mgc_chnl_info_get_chnl(CHNL chnl);
BOOL mgc_chnl_info_attach_to_phy_port(CHNL_INFO *pChnlInfo , PHY_PORT_INFO *pPhyPort);
CHNL_INFO *mgc_chnl_info_find_chnl_of_phy(PHY_PORT_INFO *pPhyPort , int chnlNo);
int mgc_chnl_info_get_chnl_no_of_phy(CHNL_INFO *pChnlInfo , PHY_PORT_INFO *pPhyPort);
BOOL mgc_chnl_info_attach_connect(CHNL_INFO *pChnlInfo , CONNECT_INFO *pConnect , int connNo);
BOOL mgc_chnl_info_detach_connect(CHNL_INFO *pChnlInfo , CONNECT_INFO *pConnect);
CONNECT_INFO *mgc_chnl_info_assign_connect(CHNL_INFO *pChnlInfo , int connNo);
CONNECT_INFO *mgc_chnl_info_assign_idle_connect(CHNL_INFO *pChnlInfo);
void mgc_chnl_info_set_mon(int id, BOOL enable);
BYTE *mgc_chnl_info_get_res_addr(void);
char *mgc_chnl_info_print_status(CHNL_INFO *pChnlInfo);
char *mgc_chnl_info_print_remote(CHNL_INFO *pChnlInfo);
char *mgc_chnl_info_print_mode(CHNL_INFO *pChnlInfo);
char *mgc_chnl_info_print_codec(CHNL_INFO *pChnlInfo);
#endif

View File

@@ -0,0 +1,71 @@
#ifndef _MGC_CONNECT_H
#define _MGC_CONNECT_H
#include "mgc_struct.h"
void mgc_connect_setup(void);
void mgc_connect_init(CONNECT_INFO *pConnect , int id);
CONNECT_INFO *mgc_connect_get_unused(void);
void mgc_connect_set_status(CONNECT_INFO *pConnect , MGC_CONNECT_STATUS status);
MGC_CONNECT_STATUS mgc_connect_get_status(CONNECT_INFO *pConnect);
char *mgc_connect_print_statuts(MGC_CONNECT_STATUS status);
void mgc_connect_codec_list_init(MGC_CODEC_LIST *pList);
/*fuplayers and downlayer operation*/
CHNL_INFO *mgc_connect_get_own_chnl_info(CONNECT_INFO *pConnect);
PHY_PORT_INFO *mgc_connect_get_own_phy_port_info(CONNECT_INFO *pConnect);
MGC_SAP *mgc_connect_get_conn_report_sap(CONNECT_INFO *pConnect);
MG_INFO *mgc_connect_get_own_mg_info(CONNECT_INFO *pConnect);
CONNECT_INFO *mgc_connect_find_connect_of_chnl(CHNL_INFO *pChnlInfo , int connNo);
BOOL mgc_connect_attach_connect_to_chnl(CONNECT_INFO *pConnect , CHNL_INFO *pChnlInfo);
int mgc_connect_get_connNo_of_chnl_info(CONNECT_INFO *pConnect , CHNL_INFO *pChnlInfo);
/*attr*/
BOOL mgc_connect_set_conn_mode(CONNECT_INFO *pConnect , MGC_CON_MODE mode);
MGC_CON_MODE mgc_connect_get_conn_mode(CONNECT_INFO *pConnect);
void mgc_connect_attr_init(CONNECT_INFO *pConnect);
BOOL mgc_connect_attr_negotiate(CONNECT_INFO *pConnect);
BOOL mgc_connect_set_dtmf(CONNECT_INFO *pConnect , BYTE dtmfNo);
BOOL mgc_connect_set_tone(CONNECT_INFO *pConnect , BYTE toneNo);
BOOL mgc_connect_clear_tone(CONNECT_INFO *pConnect);
BOOL mgc_connect_set_req(CONNECT_INFO *pConnect , BYTE pkg , BYTE req);
/*operate */
BOOL mgc_connect_attach_step_info(CONNECT_INFO *pConnect , MGCF_OPER_STEP *pOperStep);
BOOL mgc_connect_dettach_step_info(CONNECT_INFO *pConnect);
MGCF_OPER_STEP *mgc_connect_get_step_info(CONNECT_INFO *pConnect);
/*para create*/
BOOL mgc_connect_auep_para_create(CONNECT_INFO *pConnect , MGCP_PARA *pPara);
BOOL mgc_connect_crcx_para_create(CONNECT_INFO *pConnect , MGCP_PARA *pPara);
BOOL mgc_connect_mdcx_para_create(CONNECT_INFO *pConnect , MGCP_PARA *pPara);
BOOL mgc_connect_dlcx_para_create(CONNECT_INFO *pConnect , MGCP_PARA *pPara);
BOOL mgc_connect_crcx_resp_parse_para(CONNECT_INFO *pConnect , MGCP_PARA *pPara);
BOOL mgc_connect_mdcx_resp_parse_para(CONNECT_INFO *pConnect , MGCP_PARA *pPara);
BOOL mgc_connect_rqnt_para_create(CONNECT_INFO *pConnect , MGCP_PARA *pPara);
BOOL mgc_connect_is_conn_need_update(CONNECT_INFO *pConnect , MGCP_PARA *pPara);
/*para parse*/
CONNECT_INFO *mgc_connect_assign_conn_by_para(MGCP_PARA *pPara);
CONNECT_INFO *mgc_connect_find_conn_by_conid(MGCP_PARA *pPara);
BOOL mgc_connect_crcx_req_parse_para(CONNECT_INFO *pConnect , MGCP_PARA *pPara);
BOOL mgc_connect_mdcx_req_parse_para(CONNECT_INFO *pConnect , MGCP_PARA *pPara);
BOOL mgc_connect_req_parse_para(CONNECT_INFO *pConnect , MGCP_PARA *pPara);
BOOL mgc_connect_add_auep(CONNECT_INFO *pConnect, PORT_INFO *pPortInfo);
BOOL mgc_connect_add_crcx(CONNECT_INFO *pConnect, PORT_INFO *pPortInfo);
BOOL mgc_connect_add_crcx_with_mode(CONNECT_INFO *pConnect, MGC_CON_MODE mode ,PORT_INFO *pPortInfo);
BOOL mgc_connect_add_crcx_aas(CONNECT_INFO *pConnect, CONNECT_INFO *pPeerConnect, PORT_INFO *pPortInfo);
BOOL mgc_connect_add_mdcx_aas(CONNECT_INFO *pConnect, CONNECT_INFO *pPeerConnect,PORT_INFO *pPortInfo);
BOOL mgc_connect_add_dlcx(CONNECT_INFO *pConnect, PORT_INFO *pPortInfo);
BOOL mgc_connect_add_mdcx(CONNECT_INFO *pConnect, CONNECT_INFO *pPeerConnect , MGC_CON_MODE mode, PORT_INFO *pPortInfo);
BOOL mgc_connect_add_nop_with_delay(CONNECT_INFO *pConnect, DWORD delay ,PORT_INFO *pPortInfo);
BOOL mgc_connect_add_nop(CONNECT_INFO *pConnect, PORT_INFO *pPortInfo);
BOOL mgc_connect_add_rqnt(CONNECT_INFO *pConnect, PKG_EVENT *pPkgEvent, PKG_SIGNAL *pPkgSig, PORT_INFO *pPortInfo);
BOOL mgc_connect_add_rqnt_with_delay(CONNECT_INFO *pConnect, WORD delay, PKG_EVENT *pPkgEvent, PKG_SIGNAL *pPkgSig, PORT_INFO *pPortInfo);
CONNECT_INFO *mgc_connect_dup_attr(CONNECT_INFO *pConnect);
#endif

View File

@@ -0,0 +1,16 @@
#ifndef _MGC_CTL_H
#define _MGC_CTL_H
#include "mgc_struct.h"
void mgc_ctl_num_init(WORD sysId , WORD localIp , WORD peerIp);
BOOL mgc_ctl_is_mg_full(void);
void mgc_ctl_mg_add_one(void);
void mgc_ctl_mg_remove_one(void);
BOOL mgc_ctl_is_chnl_full(void);
void mgc_ctl_chnl_add_one(void);
void mgc_ctl_chnl_remove_one(void);
int mgc_ctl_set_mg_max_num(int num);
int mgc_ctl_set_chnl_max_num(int num);
#endif

View File

@@ -0,0 +1,67 @@
#ifndef _MGC_DEBUG_H
#define _MGC_DEBUG_H
#include "mgc_struct.h"
//#define MGC_TEST_DEBUG
#define MGC_MAX_LINE_LENGTH 256
#define MGC_MAX_ASCIIIN_LEN 4096
#define MGC_MAX_ASCIIOUT_LEN (4096*2)
#define MGC_MAX_ASCITMP_LEN 4096
#define MGC_MONITOR_NONE 0x0000
#define MGC_MONITOR_DEBUG 0x0001
#define MGC_MONITOR_ERROR 0x0010
#define MGC_MONITOR_WARN 0x0100
#define MGC_MONITOR_INFO 0x1000
#define MGC_MONITOR_ALL 0xffff
#ifdef MGC_TEST_DEBUG
#define MGC_DEBUG(msg...) printf("\33[37m DEBUG: [%s:%d]",__FILE__ ,__LINE__ );printf(msg);printf("\n \33[37m")
#define MGC_WARN(msg...) printf("\33[33m WARN: [%s:%d]",__FILE__ ,__LINE__ );printf(msg);printf("\n \33[37m")
#define MGC_ERROR(msg...) printf("\33[31m ERROR: [%s:%d]",__FILE__ ,__LINE__ );printf(msg);printf("\n \33[37m")
#define MGC_INFO(msg...) printf("\33[32m INFO: [%s:%d]",__FILE__ ,__LINE__ );printf(msg);printf("\n \33[37m")
#else
void MGC_DEBUG(char *msg,...);
void MGC_WARN(char *msg,...);
void MGC_ERROR(char *msg,...);
void MGC_INFO(char *msg,...);
#endif
/*
#define NONE "\033[m"
#define RED "\033[0;32;31m"
#define LIGHT_RED "\033[1;31m"
#define GREEN "\033[0;32;32m"
#define LIGHT_GREEN "\033[1;32m"
#define BLUE "\033[0;32;34m"
#define LIGHT_BLUE "\033[1;34m"
#define DARY_GRAY "\033[1;30m"
#define CYAN "\033[0;36m"
#define LIGHT_CYAN "\033[1;36m"
#define PURPLE "\033[0;35m"
#define LIGHT_PURPLE "\033[1;35m"
#define BROWN "\033[0;33m"
#define YELLOW "\033[1;33m"
#define LIGHT_GRAY "\033[0;37m"
#define WHITE "\033[1;37m"
*/
BYTE mgcAsciInBuf[MGC_MAX_ASCIIIN_LEN];
BYTE mgcAsciOutBuf[MGC_MAX_ASCIIOUT_LEN];
BYTE mgcAsciTempBuf[MGC_MAX_ASCITMP_LEN];
WORD mgcMonitorFg;
void mgc_mon(void);
int mgc_debug_set(void);
int mgc_asciout_proc(BYTE *out_str);
int mgc_hex_to_ascii(BYTE *from_hex, BYTE from_len, BYTE *to_asc);
int mgc_log_err(char *err_msg);
int mgc_log_procedure(WORD mgNo, WORD portIndex, WORD chnlIndex, char *msg);
#endif

View File

@@ -0,0 +1,32 @@
#ifndef _MGC_INTERNAL_H
#define _MGC_INTERNAL_H
#include "mgc_struct.h"
#define ITL_OPERA_NUM 1024
#define ITL_OPERA_PORT_NO 127
#define ITL_MG_INFO_PORT_NO 37
typedef enum
{
ITL_OPERA_STATE_UNDEF =-1 ,
ITL_OPERA_STATE_IDLE,
ITL_OPERA_STATE_REQUEST ,
ITL_OPERA_STATE_RESPONSE
}ITL_OPERA_STATE;
typedef struct _ITL_OPERA_STRUCT
{
int userPort;
ITL_OPERA_STATE status;
CHNL chnl;
}ITL_OPERA_STRUCT;
BOOL mgc_internal_sap_bind(void);
BOOL mgc_internal_mg_create(void);
BOOL mgc_internal_opera_auep_request(MG_INFO *pMgInfo);
int mgc_internal_get_sap_index(void);
#endif

View File

@@ -0,0 +1,30 @@
#ifndef _MGC_MG_INFO_H
#define _MGC_MG_INFO_H
#include "mgc_struct.h"
void mgc_mg_info_setup(void);
void mgc_mg_info_init(MG_INFO *pMgInfo , int id);
void mgc_mg_info_clear(MG_INFO *pMgInfo);
int mgc_mg_info_attached_phy_port_num(MG_INFO *pMgInfo);
BOOL mgc_mg_info_attach_phy_port(MG_INFO *pMgInfo , PHY_PORT_INFO *pPhyPort, MGC_SAP *pSap);
void mgc_mg_info_dettach_phy_port(MG_INFO *pMgInfo , PHY_PORT_INFO *pPhyPort);
MG_INFO *mgc_mg_info_get_unused_mg(void);
MG_INFO *mgc_mg_info_get_index_mg(int index);
BOOL mgc_mg_info_assign_attr(MG_INFO *pMgInfo , MG_ATTR *pMgAttr);
void mgc_mg_info_update_mg_status(MG_INFO *pMgInfo , BOOL status);
MG_INFO *mgc_mg_info_check_mg_is_exsit(MG_ATTR *pMgAttr);
void mgc_mg_info_state_check(MG_INFO *pMgInfo);
CHNL_INFO *mgc_mg_info_find_idle_chnl_info(MG_INFO *pMgInfo);
BOOL mgc_mg_info_is_port_already_exist(MG_INFO *pMgInfo , int portNo , MGC_SAP *pSap);
MG_INFO *mgc_mg_info_find_available_mg(MGC_MG_TYPE mgType);
CONNECT_INFO *mgc_mg_info_assign_idle_connection(MG_INFO *pMgInfo);
CONNECT_INFO *mgc_mg_info_assign_aas_tone_connection(BYTE toneNo);
PHY_PORT_INFO *mgc_mg_info_find_port_by_name(char *name ,WORD localPort);
PHY_PORT_INFO *mgc_mg_info_find_port_by_name_and_portNo(char *name , BYTE portNo ,WORD localPort);
MG_INFO *mgc_mg_info_find_mg_by_name(char *name);
void mgc_mg_info_set_mon(int id , BOOL enable );
BYTE *mgc_mg_info_get_res_addr(void);
void mgc_mg_info_print_info(MG_INFO *pMgInfo);
#endif

View File

@@ -0,0 +1,41 @@
#ifndef _MGC_MGCP_H
#define _MGC_MGCP_H
#include "mgc_struct.h"
#include "../../../mgcp/src/include/mgcp.h"
int mgc_mgcp_get_sap_index(void);
int mgc_mgcp_match_codec_list(MGC_CODEC_LIST *dest, MGC_CODEC_LIST *aParty, MGC_CODEC_LIST *bParty);
BOOL mgc_mgcp_check_codec_valid(MGC_VCTYPE codec);
int mgc_bind_mgcp_setup(void);
int mgc_mgcp_print_vc_num(MGC_VCTYPE vcCodec);
char *mgc_mgcp_print_vc_codec(MGC_VCTYPE vcCodec);
BYTE mgc_mgcp_convert_cmd_to_mgcp(MGC_CMD_TYPE mgcCmd);
MGC_CMD_TYPE mgc_mgcp_convert_mgcp_to_cmd(BYTE mgcpCmd);
MGC_CON_MODE mgc_mgcp_convert_to_mgc_mode(BYTE mode);
BYTE mgc_mgcp_conver_to_mgcp_mode(MGC_CON_MODE mode);
char *mgc_mgcp_print_mgc_mode(MGC_CON_MODE mode);
char *mgc_mgcp_print_ip(DWORD addr);
BOOL mgc_mgcp_create_connect_dest_ip(CONNECT_INFO *pConnect , MGCP_PARA *pPara);
BOOL mgc_mgcp_create_connect_port(CONNECT_INFO *pConnect , MGCP_PARA *pPara);
BOOL mgc_mgcp_create_connect_req_start_line(CONNECT_INFO *pConnect , MGCP_PARA *pPara);
BOOL mgc_mgcp_create_connect_con_mode(CONNECT_INFO *pConnect , MGCP_PARA *pPara);
BOOL mgc_mgcp_create_connect_con_id(CONNECT_INFO *pConnect , MGCP_PARA *pPara);
BOOL mgc_mgcp_create_connect_call_id(CONNECT_INFO *pConnect , MGCP_PARA *pPara);
BOOL mgc_mgcp_create_connect_local_opt(CONNECT_INFO *pConnect , MGCP_PARA *pPara);
BOOL mgc_mgcp_create_connect_pkg_sig(CONNECT_INFO *pConnect , MGCP_PARA *pPara);
BOOL mgc_mgcp_create_connect_pkg_req(CONNECT_INFO *pConnect , MGCP_PARA *pPara);
BOOL mgc_mgcp_create_connect_sdp(CONNECT_INFO *pConnect , MGCP_PARA *pPara);
BOOL mgc_mgcp_create_connect_resp_start_line(CONNECT_INFO *pConnect , MGCP_PARA *pPara);
BOOL mgc_mgcp_response_msg(CONNECT_INFO *pConnect , MGCP_PARA *pPara, int retCode);
BOOL mgc_mgcp_parse_connect_sdp(CONNECT_INFO *pConnect , MGCP_PARA *pPara);
BOOL mgc_mgcp_parse_connect_pkg_sig(CONNECT_INFO *pConnect , MGCP_PARA *pPara);
BOOL mgc_mgcp_parse_connect_pkg_event(CONNECT_INFO *pConnect , MGCP_PARA *pPara);
BOOL mgc_mgcp_parse_connect_call_id(CONNECT_INFO *pConnect , MGCP_PARA *pPara);
BOOL mgc_mgcp_parse_connect_mode(CONNECT_INFO *pConnect , MGCP_PARA *pPara);
BOOL mgc_mgcp_parse_connect_local_opt(CONNECT_INFO *pConnect , MGCP_PARA *pPara);
#endif

View File

@@ -0,0 +1,24 @@
#ifndef _MGC_PHY_PORT_H
#define _MGC_PHY_PORT_H
#include "mgc_struct.h"
void mgc_phy_port_setup(void);
void mgc_phy_port_init(PHY_PORT_INFO *pPhyPort , int id);
void mgc_phy_port_clear(PHY_PORT_INFO *pPhyPort);
PHY_PORT_INFO *mgc_phy_port_get_unused_phy(void);
PHY_PORT_INFO *mgc_phy_port_find_port_of_mg(MG_INFO *pMgInfo , int portNo);
PHY_PORT_INFO *mgc_phy_port_find_port_of_mg_by_index(MG_INFO *pMgInfo , int index);
void mgc_phy_port_set_chnl_num(PHY_PORT_INFO *pPhyPort , MGC_PHY_PORT_TYPE portType);
BOOL mgc_phy_port_attach_chnl(PHY_PORT_INFO *pPhyPort);
void mgc_phy_port_update_status(PHY_PORT_INFO *pPhyPort , BOOL status);
CHNL_INFO *mgc_phy_port_find_idle_chnl(PHY_PORT_INFO *pPhyPort);
CONNECT_INFO *mgc_phy_port_assign_idle_connection(PHY_PORT_INFO *pPhyPort);
void mgc_phy_port_set_mon(int id, BOOL enalbe);
BYTE *mgc_phy_port_get_res_addr(void);
void mgc_phy_port_print(PHY_PORT_INFO *pPhyPort);
#endif

View File

@@ -0,0 +1,38 @@
#ifndef _MGC_PORT_INFO_H
#define _MGC_PORT_INFO_H
#include "mgc_struct.h"
void mgc_port_info_setup(void);
void mgc_port_info_init(PORT_INFO *pPortInfo , int id);
void mgc_port_info_clear(PORT_INFO *pPortInfo);
PORT_INFO *mgc_port_info_get_unused_port(void);
void mgc_port_info_fsm(PORT_INFO *pPortInfo);
void mgc_port_info_oper_failure_report(PORT_INFO *pPortInfo , MGC_SAP *pMgcSap);
void mgc_port_info_oper_success_report(PORT_INFO *pPortInfo , MGC_SAP *pMgcSap);
PORT_INFO *mgc_port_info_find_port_by_id(int id);
PORT_INFO *mgc_port_info_get_step_port(MGCF_OPER_STEP *pOperStep);
BOOL mgc_port_info_add_opera_to_port(PORT_INFO *pPortInfo , CONNECT_INFO *pConnect , MGCF_STEP_INFO *pStepInfo);
BOOL mgc_port_info_add_ind_to_port(PORT_INFO *pPortInfo , CONNECT_INFO *pConnect , MGC_CMD_TYPE cmd , int hdlPort , DWORD remoteIp);
int mgc_port_info_cnf(PORT_INFO *pPortInfo , BYTE cmd, WORD hdlPort, WORD retCode, MGCP_PARA *pPara);
MGCF_OPER_STEP *mgc_port_info_get_unused_oper_step(PORT_INFO *pPortInfo);
void mgc_port_info_set_step_to_start(PORT_INFO *pPortInfo);
BOOL mgc_port_info_set_step_to_next(PORT_INFO *pPortInfo);
void mgc_port_info_set_oper_id(PORT_INFO *pPortInfo , MGC_MG_OPER_ID_TYPE operId);
void mgc_port_info_set_fsm_time(PORT_INFO *pPortInfo , WORD timer);
BOOL mgc_port_info_set_oper_step(MGCF_OPER_STEP *pMgcfOperStep , CONNECT_INFO *pConnect , MGCF_STEP_INFO *pStepInfo);
BOOL mgc_port_info_oper_step_cnf(MGCF_OPER_STEP *pMgcOperStep , MGCP_PARA *pPara);
void mgc_port_info_set_step_info(MGCF_STEP_INFO *pStepInfo , MGC_CMD_TYPE cmd , CONNECT_INFO *pPeerConn ,
WORD delay, MGC_CON_MODE mode, PKG_EVENT *pPkgEvent, PKG_SIGNAL *pPkgSig , PKG_REQ *pPkgReq);
BYTE *mgc_port_info_get_res_addr(void);
char *mgc_port_info_print_cmd(MGC_CMD_TYPE cmd);
char *mgc_port_info_print_opera_id(MGC_MG_OPER_ID_TYPE operaId);
BOOL mgc_port_info_insert_dlcx_req(PORT_INFO *pPortInfo , CONNECT_INFO *pConnect);
BOOL mgc_port_info_mv_step_into_new_port(PORT_INFO *pPortInfo , MGCF_OPER_STEP *pOperStep);
#endif

View File

@@ -0,0 +1,10 @@
#ifndef _MGC_PORT_LIST_H
#define _MGC_PORT_LIST_H
#include "mgc_struct.h"
void mgc_port_active_list_proc(void);
BOOL mgc_port_list_remove_from_active_list(PORT_INFO *pPortInfo);
MGC_PORT_NODE *mgc_port_list_add_to_active_list(PORT_INFO *pPortInfo);
void mgc_port_list_setup(void);
#endif

View File

@@ -0,0 +1,8 @@
#ifndef _MGC_PUB__H
#define _MGC_PUB__H
#include "../../../public/src/include/includes.h"
#include "../../../public/src/include/public.h"
#endif

View File

@@ -0,0 +1,17 @@
#ifndef _MGC_SNMP_H
#define _MGC_SNMP_H
const BYTE MGC_AC_LINE_STATUS_IDLEN = 12;
DWORD MGC_AC_LINE_STATUS_OID[20] =
{
1,3,6,1,2,1,10,18,6,1,10,0
};
const BYTE MGC_LGC_MG_STATUS_IDLEN = 13;
DWORD MGC_LGC_MG_STATUS_OID[20] =
{
1,3,6,1,4,1,1373,2,2,30,2,1,0
};
#endif

View File

@@ -0,0 +1,196 @@
#ifndef _MGC_STRUCT_H
#define _MGC_STRUCT_H
#include "mgc.h"
#include "../../../mgcp/src/include/mgcp.h"
#include "../../../8ecp/src/include/8ecp.h"
#define MGC_PORT_LIST_EN
#define MGC_REC_PORT
typedef struct _MGCP_REC_TAG
{
PUB_SDP_MEDIA m;
PUB_SDP_C c;
MGCP_M mode;
char esCci[32];
}MGCP_REC_TAG;
typedef struct _CONNECT_INFO
{
int id;
DWORD flag;
struct _MGCF_OPER_STEP *pOperStep;
#ifdef MGC_REC_PORT
struct _PORT_INFO *pPrePortInfo;
#endif
struct _CHNL_INFO *pChnlInfo;
MGC_CONNECT_STATUS status;
MGC_CODEC_LIST codecList;
MEDIA_ATTR mediaAttr;
OPER_REC operRec;
MGCP_REC_TAG mgcpRec;
struct _MGC_TANDEM_INFO *pTandem;
}CONNECT_INFO;
typedef struct _CHNL_INFO
{
int id;
BOOL monFlag; // monitor flag
MGC_CHNL_INFO_STATUS status;
struct _PHY_PORT_INFO *pPhyPort; //chnl's owner
WORD connectNum; //how many connection is attached
WORD maxConnectNum; //max connection num could be attached to the chnl accroding to chnl's owner
struct _CONNECT_INFO *pConnection[MGC_MAX_NUM_OF_CHNL_CON]; //Media Index
}CHNL_INFO;
typedef struct _PHY_PORT_INFO
{
int id;
int portNo; // mg local physical port No. ??
MGC_SAP *pMgcSap; // sap index, indicating which user creates this port
BOOL monFlag;
MGC_PHY_PORT_STATUS status; // physical port status: online/offline
MGC_PHY_PORT_TYPE portType; // port type: E1/T1/analogue
struct _MG_INFO *pMgInfo; // mg No. this port resides on ??
WORD chnlNum; // depend on mg type
struct _CHNL_INFO *pChnlInfo[MGC_MAX_CHNL_NUM_PER_PHY];
}PHY_PORT_INFO;
typedef struct _MG_INFO
{
int id; //internal used
BOOL created; // created flag;
BOOL enable; // MG status: available/unavailable
BOOL monFlag;
MG_ATTR mgAttr; // MG attributes
PHY_PORT_INFO *pPhyPort[MGC_MAX_PHY_PORT_PER_MG];
DWORD requestId; // SNMP request id
DWORD auditTimer;
}MG_INFO;
typedef struct _MGCF_STEP_INFO
{
struct _CONNECT_INFO *pPeerConn;
int delay;
MGC_CON_MODE mode;
MGC_CMD_TYPE cmd;
MGC_CODEC_LIST codecList;
PKG_SIGNAL pkgSig;
BOOL sigEn;
PKG_EVENT pkgEvent;
BOOL eventEn;
PKG_REQ pkgReq;
BOOL reqEn;
DWORD remoteIp; //only used for MG
}MGCF_STEP_INFO;
typedef struct _MGCF_OPER_STEP
{
int id;
struct _CONNECT_INFO *pConnect; //chnl connectIndex
struct _PORT_INFO *pPortInfo;
MGCF_STEP_INFO stepInfo;
MGCP_OPER_STEP_STATUS status;
WORD hdlPort; // lower layer port
WORD llCmd; // lower layer command or response
}MGCF_OPER_STEP;
typedef struct _PORT_INFO{
int id;
BOOL assigned;
WORD usrPort;
WORD mgcfTimer; // mgcf timer
MGC_MG_OPER_ID_TYPE mgcfOperId;
WORD cause; //reason to tell uplayer
struct _MGCF_OPER_STEP *pMgcOperCurrent;
struct _MGCF_OPER_STEP mgcfOperSteps[MGC_MAX_OPER_STEPS_NUM]; // max 8 steps
}
PORT_INFO;
typedef struct _MGC_8ECP_SAP
{
struct _8ECP_SAP sap8ecp;
int sapIndex;
}MGC_8ECP_SAP;
typedef struct _MGC_MGCP_SAP
{
struct _MGCP_SAP sapMgcp;
int sapIndex;
}MGC_MGCP_SAP;
typedef struct _MGC_CTL
{
WORD sysId;
WORD localIp;
WORD peerIp; //???
WORD mgcMaxMgNo;
WORD mgcMaxChlNo;
WORD mgcMgCreated;
WORD mgcChlAssigned;
}MGC_CTL;
typedef struct _MGC_INTERNAL_SAP
{
MGC_SAP mgcSap;
int mgcSapIndex;
int mgNoITL;
}MGC_INTERNAL_SAP;
typedef struct _MGC_SUR_INFO_NODE
{
int id;
struct _CONNECT_INFO *pConn;
struct _MGC_SUR_INFO_NODE *pPrior;
struct _MGC_SUR_INFO_NODE *pNext;
}MGC_SUR_INFO_NODE;
typedef struct _MGC_SUR_INFO_LIST
{
struct _MGC_SUR_INFO_NODE *pHead;
WORD len;
}MGC_SUR_INFO_LIST;
typedef struct _MGC_TANDEM_INFO
{
int id;
char escci[32];
struct _MGC_SUR_INFO_LIST list;
MGC_TANDEM_STATUS status;
CONNECT_INFO *pTconn; //pointer to target
CONNECT_INFO *pTxconn; //pointer to where target conn to send
CONNECT_INFO *pRxconn; //pointer to where targe conn to recieve from
CONNECT_INFO *pAconn; // pointer to associator
}MGC_TANDEM_INFO;
typedef struct _MGC_PORT_LIST
{
struct _MGC_PORT_NODE *pHead;
WORD len;
}MGC_PORT_LIST;
typedef struct _MGC_PORT_NODE
{
int id;
struct _PORT_INFO *pPortInfo;
struct _MGC_PORT_NODE *pPrior;
struct _MGC_PORT_NODE *pNext;
struct _MGC_PORT_LIST *pList;
}MGC_PORT_NODE;
#endif

View File

@@ -0,0 +1,19 @@
#ifndef _MGC_SUR_INFO_H
#define _MGC_SUR_INFO_H
#include "mgc_struct.h"
void mgc_sur_info_list_init(MGC_SUR_INFO_LIST *pList);
BOOL mgc_sur_info_add_conn_to_list(MGC_SUR_INFO_LIST *pList , CONNECT_INFO *pConn);
BOOL mgc_sur_info_remove_conn_to_list(MGC_SUR_INFO_LIST *pList , CONNECT_INFO *pConn);
MGC_SUR_INFO_NODE *mgc_sur_info_find_conn_in_list(MGC_SUR_INFO_LIST *pList , CONNECT_INFO *pConn);
MGC_SUR_INFO_NODE *mgc_sur_info_get_list_tail(MGC_SUR_INFO_LIST *pList);
MGC_SUR_INFO_NODE *mgc_sur_info_get_list_node(MGC_SUR_INFO_LIST *pList , WORD index);
BOOL mgc_sur_info_add_survillance_res(BYTE sapIndex, WORD mgNo);
void mgc_sur_info_setup(void);
void mgc_sur_info_clear_list(MGC_SUR_INFO_LIST *pList);
CONNECT_INFO *mgc_sur_info_find_sur_conn_in_mg(MG_INFO *pMgInfo);
#endif

View File

@@ -0,0 +1,37 @@
#ifndef _MGC_TANDEM_INFO_H
#define _MGC_TANDEM_INFO_H
#include "mgc_struct.h"
typedef enum
{
MGC_TANDEM_CONN_POS_UNDEF = -1,
MGC_TANDEM_CONN_POS_TAR,
MGC_TANDEM_CONN_POS_TX,
MGC_TANDEM_CONN_POS_RX,
MGC_TANDEM_CONN_POS_AOR,
MGC_TANDEM_CONN_POS_SUR
}MGC_TANDEM_CONN_POS;
BOOL mgc_tandem_info_unset_conn(MGC_TANDEM_INFO *pTandem , CONNECT_INFO *pConnect);
BOOL mgc_tandem_info_set_conn(MGC_TANDEM_INFO *pTandem , CONNECT_INFO *pConn, MGC_TANDEM_CONN_POS pos);
MGC_TANDEM_CONN_POS mgc_tandem_info_get_conn_pos(MGC_TANDEM_INFO *pTandem , CONNECT_INFO *pConn);
MGC_TANDEM_INFO *mgc_tandem_info_get_tandem_by_id(DWORD id);
MGC_TANDEM_INFO *mgc_tandem_info_get_idle_tandem(void);
void mgc_tandem_info_setup(void);
BOOL mgc_tandem_info_add_tandem_res(BYTE sapIndex, WORD mgNo);
BOOL mgc_tandem_info_set_esccd_info(MGC_TANDEM_INFO *pTandem , MGCP_ESCCD rxEsccd , MGCP_ESCCD txEsccd);
BOOL mgc_tandem_info_create_tar_tandem(CONNECT_INFO *pConnect, PORT_INFO *pPortInfo);
BOOL mgc_tandem_info_create_tandem(MGC_TANDEM_INFO *pTandem , PORT_INFO *pPortInfo);
BOOL mgc_tandem_info_stop_tandem_send_to_tar(CONNECT_INFO *pConnect, PORT_INFO *pPortInfo);
BOOL mgc_tandem_info_stop_tandem_send_to_aor(CONNECT_INFO *pConnect, PORT_INFO *pPortInfo);
MGC_TANDEM_STATUS mgc_tandem_info_get_status(MGC_TANDEM_INFO *pTandem);
BOOL mgc_tandem_info_dettach_aor_related_tandem(CONNECT_INFO *pConnect, CONNECT_INFO *pPeerConnect, PORT_INFO *pPortInfo);
BOOL mgc_tandem_info_connect(CONNECT_INFO *pConnect, CONNECT_INFO *pPeerConnect, MGC_CON_MODE mode , PORT_INFO *pPortInfo);
BOOL mgc_tandem_info_remove_connection_from_tandem(CONNECT_INFO *pConnect, PORT_INFO *pPortInfo);
BOOL mgc_tandem_info_mdcx(CONNECT_INFO *pConnect , PORT_INFO *pPortInfo);
BOOL mgc_tandem_info_add_crcx_aas(CONNECT_INFO *pAasConnect, CONNECT_INFO *pPeerConnect, PORT_INFO *pPortInfo);
BOOL mgc_tandem_info_add_mdcx_aas(CONNECT_INFO *pConnect, CONNECT_INFO *pAasConnect, PORT_INFO *pPortInfo);
BOOL mgc_tandem_info_clear(MGC_TANDEM_INFO *pTandem, PORT_INFO *pPortInfo);
#endif

2633
plat/mgc_v2/src/mgc.c Normal file

File diff suppressed because it is too large Load Diff

326
plat/mgc_v2/src/mgc_8ecp.c Normal file
View File

@@ -0,0 +1,326 @@
/*
*********************************************************************************
* *
* NOTICE: *
* *
*********************************************************************************
* do not support now
*/
/*********************************************************************************
* <mgc_8ecp.c>
* This file should include 8ecp related APIs used in MGC module, but now is not supported!!!!
*
*
* Author Date
* ------ ------
* Sam Yao Aug 2008
*********************************************************************************/
/*-----------------------------------------------------------------------*/
/* INCLUDE HEADER FILES */
/*-----------------------------------------------------------------------*/
#include "./include/mgc_8ecp.h"
#include "./include/mgc_mg_info.h"
#include "./include/mgc_phy_port.h"
#include "./include/mgc_debug.h"
static WORD mgc_e1card0_mgNo;
static WORD mgc_e1card1_mgNo;
static WORD mgc_8k_tone_card_silent;
static MGC_8ECP_SAP mgc8ecpSap;
/*-----------------------------------------------------------------------
MGC - 8ECP M A N A G E R
------------------------------------------------------------------------*/
int mgc_8ecp_update_mg_status(BYTE mgNo, BYTE status)
{
MG_INFO *pMgInfo = NULL ;
MG_INFO *pMgInfoE1 = NULL;
pMgInfo = mgc_mg_info_get_index_mg(mgNo);
pMgInfoE1 = mgc_mg_info_get_index_mg(mgc_e1card0_mgNo);
if((pMgInfo == NULL)||(pMgInfoE1 == NULL))
return -1;
if(pMgInfo->created == FALSE)
{
MGC_ERROR("%s : mg[%d] not created" , __FUNCTION__, pMgInfo->id);
return -1;
}
pMgInfo->enable = status;
if(pMgInfo->mgAttr.e1cardNo == 1)
{
if((status == 1)&&((0 == mgc_e1card0_mgNo)||(0 == pMgInfoE1->enable)))
{
mgc_8k_tone_card_silent = 1;
}
else
{
mgc_8k_tone_card_silent = 0;
}
}
else if(pMgInfo->mgAttr.e1cardNo == 0)
{
if ((0 == status)
&& (0 != mgc_e1card1_mgNo) && (1 == pMgInfoE1->enable))
{
mgc_8k_tone_card_silent = 1;
}
else
{
mgc_8k_tone_card_silent = 0;
}
}
return 0;
}
int mgc_8ecp_update_trk_status(BYTE mgNo, BYTE trkNo, BYTE status)
{
MG_INFO *pMgInfo = NULL;
PHY_PORT_INFO *pPhyPort = NULL;
pMgInfo = mgc_mg_info_get_index_mg(mgNo);
if(pMgInfo == NULL)
return -1;
if(pMgInfo->created == FALSE)
{
MGC_ERROR("%s : mg[%d] not created" , __FUNCTION__, pMgInfo->id);
return -1;
}
if (trkNo >= MGC_8ECP_MAX_TRK_PER_MG)
{
MGC_ERROR("%s : invalid trkNo, trkNo = %d" , __FUNCTION__ , trkNo);
return -1;
}
pPhyPort = mgc_phy_port_find_port_of_mg(pMgInfo, trkNo);
if(pPhyPort == NULL)
return -1;
pPhyPort->status = status;
return 0;
}
static int mgc_bind_8ecp(MGC_8ECP_SAP *pSap)
{
if(pSap == NULL)
return -1;
sprintf(pSap->sap8ecp.name, "MGC");
pSap->sap8ecp.update_mg_status = mgc_8ecp_update_mg_status;
pSap->sap8ecp.update_trk_status = mgc_8ecp_update_trk_status;
pSap->sapIndex= _8ecp_bind(&pSap->sap8ecp);
if(pSap->sapIndex < 0)
{
MGC_ERROR("8ecp %s bind failed!" , pSap->sap8ecp.name);
return -1;
}
mgc_8k_tone_card_silent = 0;
mgc_e1card0_mgNo = 0;
mgc_e1card1_mgNo = 0;
return pSap->sapIndex;
}
int mgc_bind_8ecp_setup(void)
{
MGC_8ECP_SAP *pSap = NULL;
pSap = &mgc8ecpSap;
if(mgc_bind_8ecp(pSap)<0)
return -1;
return 0;
}
BOOL mgc_8ecp_create(MG_INFO *pMgInfo , MG_ATTR *pMgAttr)
{
BYTE cardNo;
if((pMgInfo == NULL)||(pMgAttr == NULL))
return FALSE;
if(pMgAttr->ctrlType != MGC_MG_CTRL_TYPE_8ECP)
return FALSE;
cardNo = atoi(pMgAttr->domain);
if(cardNo > 31)
return FALSE;
_8ecp_createMG(pMgInfo->id, pMgAttr->ip, cardNo);
if (0 == cardNo)
{
mgc_e1card0_mgNo = pMgInfo->id;
}
else if (1 == cardNo)
{
mgc_e1card1_mgNo = pMgInfo->id;
}
memcpy(&pMgInfo->mgAttr , pMgAttr , sizeof(MG_ATTR));
return TRUE;
}
BOOL mgc_8ecp_delete(MG_INFO *pMgInfo)
{
BYTE cardNo;
if(pMgInfo == NULL)
return FALSE;
if(pMgInfo->mgAttr.ctrlType != MGC_MG_CTRL_TYPE_8ECP)
return FALSE;
cardNo = atoi(pMgInfo->mgAttr.domain);
if(cardNo > 31)
return FALSE;
_8ecp_deleteMG(pMgInfo->id, pMgInfo->mgAttr.ip, cardNo);
if (0 == cardNo)
{
mgc_e1card0_mgNo = 0;
}
else if (1 == cardNo)
{
mgc_e1card1_mgNo = 0;
}
return TRUE;
}
BOOL mgc_8ecp_dlcx_chnl(CHNL chnl)
{
MG_INFO *pMgInfo = NULL;
WORD org, dest;
pMgInfo = mgc_mg_info_get_index_mg(chnl.mgNo);
if(pMgInfo == NULL)
return FALSE;
if(pMgInfo->mgAttr.ctrlType != MGC_MG_CTRL_TYPE_8ECP)
return FALSE;
org = (pMgInfo->mgAttr.e1cardNo*8 + chnl.portNo)*32 + chnl.chlNo;
dest = (mgc_8k_tone_card_silent * 8 + 7) * 32 + 31;
_8ecp_connect_chnl(org, dest, 0);
return TRUE;
}
BOOL mgc_8ecp_connect_chnl(CHNL orgChnl, CHNL destChnl, BYTE flag)
{
MG_INFO *pOrgMgInfo = NULL;
MG_INFO *pDestMgInfo = NULL;
WORD org, dest;
pOrgMgInfo = mgc_mg_info_get_index_mg(orgChnl.mgNo);
pDestMgInfo = mgc_mg_info_get_index_mg(destChnl.mgNo);
if((pOrgMgInfo == NULL)||(pDestMgInfo == NULL))
return FALSE;
if(pOrgMgInfo->mgAttr.ctrlType != MGC_MG_CTRL_TYPE_8ECP)
return FALSE;
if(pDestMgInfo->mgAttr.ctrlType != MGC_MG_CTRL_TYPE_8ECP)
return FALSE;
org = (pOrgMgInfo->mgAttr.e1cardNo*8 + orgChnl.portNo)*32 + orgChnl.chlNo;
dest= (pDestMgInfo->mgAttr.e1cardNo*8 + destChnl.portNo)*32 + destChnl.chlNo;
if((flag & MGC_CONNECT_SILENT_TONE) == MGC_CONNECT_SILENT_TONE)
dest = (mgc_8k_tone_card_silent * 8 + 7) * 32 + 31;
_8ecp_connect_chnl(org, dest, 0);
return TRUE;
}
BOOL mgc_8ecp_connect_dtmf(CHNL orgChnl, CHNL destChnl, BYTE digit)
{
MG_INFO *pOrgMgInfo = NULL;
MG_INFO *pDestMgInfo = NULL;
WORD org, dest;
pOrgMgInfo = mgc_mg_info_get_index_mg(orgChnl.mgNo);
pDestMgInfo = mgc_mg_info_get_index_mg(destChnl.mgNo);
if((pOrgMgInfo == NULL)||(pDestMgInfo == NULL))
return FALSE;
if(pOrgMgInfo->mgAttr.ctrlType != MGC_MG_CTRL_TYPE_8ECP)
return FALSE;
if(pDestMgInfo->mgAttr.ctrlType != MGC_MG_CTRL_TYPE_8ECP)
return FALSE;
org = (pOrgMgInfo->mgAttr.e1cardNo*8 + orgChnl.portNo)*32 + orgChnl.chlNo;
dest= (pDestMgInfo->mgAttr.e1cardNo*8 + destChnl.portNo)*32 + destChnl.chlNo;
if(digit == 0)
digit = 10;
_8ecp_connect_chnl(org, dest, digit);
return TRUE;
}
BOOL mgc_8ecp_connect_tone(CHNL orgChnl, CHNL destChnl, BYTE tone , BYTE duration)
{
MG_INFO *pOrgMgInfo = NULL;
MG_INFO *pDestMgInfo = NULL;
WORD org, dest;
pOrgMgInfo = mgc_mg_info_get_index_mg(orgChnl.mgNo);
pDestMgInfo = mgc_mg_info_get_index_mg(destChnl.mgNo);
if((pOrgMgInfo == NULL)||(pDestMgInfo == NULL))
return FALSE;
if(pOrgMgInfo->mgAttr.ctrlType != MGC_MG_CTRL_TYPE_8ECP)
return FALSE;
if(pDestMgInfo->mgAttr.ctrlType != MGC_MG_CTRL_TYPE_8ECP)
return FALSE;
org = (pOrgMgInfo->mgAttr.e1cardNo*8 + orgChnl.portNo)*32 + orgChnl.chlNo;
dest= (pDestMgInfo->mgAttr.e1cardNo*8 + destChnl.portNo)*32 + destChnl.chlNo;
_8ecp_connect_tone(org, dest, tone ,duration);
return TRUE;
}

View File

@@ -0,0 +1,613 @@
/*
*********************************************************************************
* *
* NOTICE: *
* *
*********************************************************************************
* mgcPhyPort <---------- mgcChnls <-----------mgcConnections
*/
/*********************************************************************************
* <mgc_chnl_info.c>
* This file should provide CHNL_INFO APIs used in MGC module. Every chnl should be attached to
*a phyport if used, and could contain servral connections
*
* Author Date
* ------ ------
* Sam Yao Aug 2008
*********************************************************************************/
/*-----------------------------------------------------------------------*/
/* INCLUDE HEADER FILES */
/*-----------------------------------------------------------------------*/
#include "./include/mgc_chnl_info.h"
#include "./include/mgc_debug.h"
#include "./include/mgc_conn_info.h"
#include "./include/mgc_phy_port.h"
#include "./include/mgc_mg_info.h"
#include "./include/mgc_mgcp.h"
static CHNL_INFO mgcChnl[MGC_MAX_NUM_OF_CHNL];
/*-----------------------------------------------------------------------
CHNL_INFO M A N A G E R
------------------------------------------------------------------------*/
/***************************************************************************
* mgc_chnl_info_init
* ------------------------------------------------------------------------
* General: init CHNL_INFO structure objcet
* Return Value: void.
* ------------------------------------------------------------------------
* Arguments:
* Input: pChnlInfo- the pointer of the CHNL_INFO object which should be init
* id - the id of the CHNL_INFO object
***************************************************************************/
void mgc_chnl_info_init(CHNL_INFO *pChnlInfo , int id)
{
int i;
if((pChnlInfo == NULL)||(id < 0))
return;
pChnlInfo->id = id;
pChnlInfo->status = MGC_CHNL_INFO_STATUS_UNDEF;
pChnlInfo->pPhyPort = NULL;
pChnlInfo->connectNum = 0;
pChnlInfo->monFlag = 0;
pChnlInfo->maxConnectNum = 0;
for(i=0 ; i<MGC_MAX_NUM_OF_CHNL_CON ; i++)
{
pChnlInfo->pConnection[i] = NULL;
}
return;
}
void mgc_chnl_info_setup(void)
{
int i;
CHNL_INFO *pChnlInfo = NULL;
for(i=0 ; i<MGC_MAX_NUM_OF_CHNL ; i++)
{
pChnlInfo = &mgcChnl[i];
mgc_chnl_info_init(pChnlInfo, i);
}
return;
}
/***************************************************************************
* mgc_chnl_info_clear
* ------------------------------------------------------------------------
* General: clear and init CHNL_INFO structure objcet , if any connection is created in this chnl,
* DLCX will be sent out
* Return Value: void.
* ------------------------------------------------------------------------
* Arguments:
* Input: pChnlInfo- the pointer of the CHNL_INFO object which should be init
***************************************************************************/
void mgc_chnl_info_clear(CHNL_INFO *pChnlInfo)
{
int i;
CONNECT_INFO *pConnect = NULL;
MGCP_PARA mgcpPara;
if(pChnlInfo == NULL)
return;
for(i=0 ; i<MGC_MAX_NUM_OF_CHNL_CON ; i++)
{
pConnect = pChnlInfo->pConnection[i];
if(pConnect == NULL)
continue;
if((mgc_connect_get_status(pConnect) == MGC_CONNECT_STATUS_CREATED)||(mgc_connect_get_status(pConnect) == MGC_CONNECT_STATUS_CREATE))
{
if(mgc_connect_dlcx_para_create(pConnect , &mgcpPara) == TRUE)
MGCP_req(mgc_mgcp_get_sap_index(), MGCP_CMD_DLCX , 0xFFFF , &mgcpPara);
}
mgc_connect_init(pConnect , pConnect->id);
}
mgc_chnl_info_init(pChnlInfo , pChnlInfo->id);
return;
}
/***************************************************************************
* mgc_chnl_info_get_unused_chnl
* ------------------------------------------------------------------------
* General: get a unused CHNL_INFO structure
* Return Value: if failure return NULL , else return a pointer
* ------------------------------------------------------------------------
* Arguments:
* Input: void
***************************************************************************/
CHNL_INFO *mgc_chnl_info_get_unused_chnl(void)
{
int i;
CHNL_INFO *pChnlInfo = NULL;
for(i=0 ; i<MGC_MAX_NUM_OF_CHNL ; i++)
{
pChnlInfo = &mgcChnl[i];
if(pChnlInfo->pPhyPort != NULL)
continue;
return pChnlInfo;
}
return NULL;
}
/***************************************************************************
* mgc_chnl_info_attach_to_phy_port
* ------------------------------------------------------------------------
* General: record the owner phyPort of the chnl
* Return Value: if failure return FALSE , else return TRUE
* ------------------------------------------------------------------------
* Arguments:
* Input: pChnlInfo - the pointer of the CHNL_INFO object which need to record it's own phyPort
* pPhyPort - the pointer of the PHY_PORT_INFO object which is the owner of the chnl
***************************************************************************/
BOOL mgc_chnl_info_attach_to_phy_port(CHNL_INFO *pChnlInfo , PHY_PORT_INFO *pPhyPort)
{
if((pChnlInfo == NULL) || (pPhyPort == NULL))
return FALSE;
if(pChnlInfo->status != MGC_CHNL_INFO_STATUS_UNDEF)
return FALSE;
switch(pPhyPort->portType)
{
case MGC_PHY_PORT_TYPE_E1:
case MGC_PHY_PORT_TYPE_T1:
case MGC_PHY_PORT_TYPE_ANALOG:
case MGC_PHY_VIRTUAL_TYPE_INTERNAL:
pChnlInfo->maxConnectNum = 1;
break;
case MGC_PHY_VIRTUAL_TYPE_TANDEM:
pChnlInfo->maxConnectNum = 2;
break;
case MGC_PHY_VIRTUAL_TYPE_SURVEILLANCE:
pChnlInfo->maxConnectNum = 1;
break;
case MGC_PHY_VIRTUAL_TYPE_ANN:
pChnlInfo->maxConnectNum = MGC_MAX_NUM_OF_CHNL_CON;
break;
default:
pChnlInfo->maxConnectNum = 0;
break;
}
pChnlInfo->pPhyPort = pPhyPort;
return TRUE;
}
/***************************************************************************
* mgc_chnl_info_status_set
* ------------------------------------------------------------------------
* General: set the status of the CHNL_INFO object
* Return Value: void
* ------------------------------------------------------------------------
* Arguments:
* Input: pChnlInfo - the pointer of the CHNL_INFO object which need to be set
* status - the status of the CHNL_INFO object
***************************************************************************/
void mgc_chnl_info_status_set(CHNL_INFO *pChnlInfo , MGC_CHNL_INFO_STATUS status)
{
if(pChnlInfo == NULL)
return;
pChnlInfo->status = status;
return;
}
/***************************************************************************
* mgc_chnl_info_find_chnl_of_phy
* ------------------------------------------------------------------------
* General: get the CHNL_INFO object in the phyPort according to the chnl id
* Return Value: if failure return NULL , else return the pointor of the object
* ------------------------------------------------------------------------
* Arguments:
* Input: pPhyPort - the pointer of the phyPort which contain the CHNL_INFO objects pointers
* chnlNo - the CHNL_INFO object id
***************************************************************************/
CHNL_INFO *mgc_chnl_info_find_chnl_of_phy(PHY_PORT_INFO *pPhyPort , int chnlNo)
{
if(pPhyPort == NULL)
return NULL;
if(chnlNo > MGC_MAX_CHNL_NUM_PER_PHY)
return NULL;
if(chnlNo >= pPhyPort->chnlNum)
{
MGC_WARN("chnlNo is out of suppose to be ");
}
return pPhyPort->pChnlInfo[chnlNo];
}
/***************************************************************************
* mgc_chnl_info_get_chnl
* ------------------------------------------------------------------------
* General: get the CHNL_INFO object according to the CHNL parameters
* Return Value: if failure return NULL , else return the pointor of the object
* ------------------------------------------------------------------------
* Arguments:
* Input: chnl - CHNL object which contain mgNo , chnlNo, connectNo and phyPort No
***************************************************************************/
CHNL_INFO *mgc_chnl_info_get_chnl(CHNL chnl)
{
MG_INFO *pMgInfo = NULL;
PHY_PORT_INFO *pPhyPort = NULL;
CHNL_INFO *pChnlInfo = NULL;
pMgInfo = mgc_mg_info_get_index_mg(chnl.mgNo);
if(pMgInfo == NULL)
return NULL;
pPhyPort = mgc_phy_port_find_port_of_mg(pMgInfo , chnl.portNo);
if(pPhyPort == NULL)
return NULL;
pChnlInfo = mgc_chnl_info_find_chnl_of_phy(pPhyPort , chnl.chlNo);
if(pChnlInfo == NULL)
return NULL;
return pChnlInfo;
}
/***************************************************************************
* mgc_chnl_info_attach_connect
* ------------------------------------------------------------------------
* General: record a connection in the assgined place
* Return Value: if failure return FALSE , else return TRUE
* ------------------------------------------------------------------------
* Arguments:
* Input: pChnlInfo - the pointer of the CHNL_INFO object which need to record the connect
* pConnect - the pointer of the CONNECT_INFO object
* connNo - the place where the CONNECT_INFO should be record in
***************************************************************************/
BOOL mgc_chnl_info_attach_connect(CHNL_INFO *pChnlInfo , CONNECT_INFO *pConnect , int connNo)
{
if((pChnlInfo == NULL)||(pConnect == NULL))
return FALSE;
if(connNo >= MGC_MAX_NUM_OF_CHNL_CON)
return FALSE;
if(mgc_connect_get_status(pConnect)!= MGC_CONNECT_STATUS_UNDEF)
return FALSE;
if(pChnlInfo->pConnection[connNo] != NULL)
return FALSE;
if(pChnlInfo->connectNum >= pChnlInfo->maxConnectNum)
return FALSE;
if(mgc_connect_attach_connect_to_chnl(pConnect , pChnlInfo) == FALSE)
return FALSE;
pChnlInfo->pConnection[connNo] = pConnect;
pChnlInfo->connectNum++;
mgc_connect_set_status(pConnect , MGC_CONNECT_STATUS_IDLE);
mgc_chnl_info_status_set(pChnlInfo , MGC_CHNL_INFO_STATUS_USED);
return TRUE;
}
/***************************************************************************
* mgc_chnl_info_detach_connect
* ------------------------------------------------------------------------
* General: remove a connect info from the CHNL_INFO object
* Return Value: if failure return FALSE , else return TRUE
* ------------------------------------------------------------------------
* Arguments:
* Input: pChnlInfo - the pointer of the CHNL_INFO object which need to remove connect info
* pConnect - the pointer of the CONNECT_INFO object which need to be remove
***************************************************************************/
BOOL mgc_chnl_info_detach_connect(CHNL_INFO *pChnlInfo , CONNECT_INFO *pConnect)
{
int i;
if((pChnlInfo == NULL)||(pConnect == NULL))
return FALSE;
for(i=0 ; i<MGC_MAX_NUM_OF_CHNL_CON ; i++)
{
if(pConnect != pChnlInfo->pConnection[i])
continue;
pChnlInfo->pConnection[i] = NULL;
pChnlInfo->connectNum--;
mgc_connect_init(pConnect, pConnect->id);
// MGC_DEBUG("conn[%d] detach from chnlInfo[%d], as connNo %d" , pConnect->id , pChnlInfo->id , i);
return TRUE;
}
return FALSE;
}
/***************************************************************************
* mgc_chnl_info_get_chnl_no_of_phy
* ------------------------------------------------------------------------
* General: find the record place of the CHNL_INFO object in it's owner phyPort
* Return Value: if failure return -1 , else return the place number
* ------------------------------------------------------------------------
* Arguments:
* Input: pChnlInfo - the pointer of the CHNL_INFO object which need to be find
* pPhyPort - the pointer of the PHY_PORT_INFO object which contain the CHNL_INFO
***************************************************************************/
int mgc_chnl_info_get_chnl_no_of_phy(CHNL_INFO *pChnlInfo , PHY_PORT_INFO *pPhyPort)
{
int i;
if((pChnlInfo == NULL)||(pPhyPort == NULL))
return -1;
for(i=0 ; i<MGC_MAX_CHNL_NUM_PER_PHY ; i++)
{
if(pChnlInfo != pPhyPort->pChnlInfo[i])
continue;
return i;
}
return -1;
}
/***************************************************************************
* mgc_chnl_info_assign_connect
* ------------------------------------------------------------------------
* General: assgin a connection on the assigned place
* Return Value: if failure return NULL, else return the pointer of the connect
* ------------------------------------------------------------------------
* Arguments:
* Input: pChnlInfo - the pointer of the CHNL_INFO object which need to assign
* connNo - the assgined place NO
***************************************************************************/
CONNECT_INFO *mgc_chnl_info_assign_connect(CHNL_INFO *pChnlInfo , int connNo)
{
CONNECT_INFO *pConnect = NULL;
if(pChnlInfo == NULL)
return NULL;
pConnect = mgc_connect_find_connect_of_chnl(pChnlInfo, connNo);
if(pConnect != NULL)
{
//MGC_DEBUG("chnlInfo[%d] already have conn[%d], as connNo %d" , pChnlInfo->id , pConnect->id , connNo);
return pConnect;
}
if(pChnlInfo->connectNum >= pChnlInfo->maxConnectNum)
return FALSE;
pConnect = mgc_connect_get_unused();
if(pConnect == NULL)
return NULL;
if(mgc_chnl_info_attach_connect(pChnlInfo , pConnect , connNo) == FALSE)
return NULL;
//MGC_DEBUG("assign unused conn[%d] to chnlInfo[%d]connNo[%d]" , pConnect->id , pChnlInfo->id, connNo);
return pConnect;
}
/***************************************************************************
* mgc_chnl_info_assign_idle_connect
* ------------------------------------------------------------------------
* General: assgin a connection on the CHNL_INFO object
* Return Value: if failure return NULL, else return the pointer of the connect
* ------------------------------------------------------------------------
* Arguments:
* Input: pChnlInfo - the pointer of the CHNL_INFO object which need to assign
***************************************************************************/
CONNECT_INFO *mgc_chnl_info_assign_idle_connect(CHNL_INFO *pChnlInfo)
{
int i;
CONNECT_INFO *pConnect = NULL;
CONNECT_INFO *pConnectTmp = NULL;
if(pChnlInfo == NULL)
return NULL;
//MGC_DEBUG("func %s " , __FUNCTION__);
for(i=0 ; i<MGC_MAX_NUM_OF_CHNL_CON ; i++)
{
pConnect = pChnlInfo->pConnection[i];
if(pConnect != NULL)
{
if(mgc_connect_get_status(pConnect) != MGC_CONNECT_STATUS_IDLE)
continue;
return pConnect;
}
pConnectTmp = mgc_chnl_info_assign_connect(pChnlInfo , i);
if(pConnectTmp == NULL)
continue;
return pConnectTmp;
}
return NULL;
}
void mgc_chnl_info_set_mon(int id, BOOL enable)
{
if((id < 0) || (id > MGC_MAX_NUM_OF_CHNL))
return;
mgcChnl[id].monFlag = enable;
}
BYTE *mgc_chnl_info_get_res_addr(void)
{
return (BYTE *)mgcChnl;
}
char *mgc_chnl_info_print_codec(CHNL_INFO *pChnlInfo)
{
int i;
CONNECT_INFO *pConnect = NULL;
if(pChnlInfo == NULL)
return "UNKNOWN";
if(pChnlInfo->maxConnectNum > 1)
return "UNKNOWN";
for(i=0 ; i<pChnlInfo->maxConnectNum ; i++)
{
pConnect = pChnlInfo->pConnection[i];
if(pConnect != NULL)
break;
}
if(pConnect == NULL)
return "UNKNOWN";
return mgc_mgcp_print_vc_codec(pConnect->mediaAttr.vocoderType);
}
char *mgc_chnl_info_print_remote(CHNL_INFO *pChnlInfo)
{
int i;
CONNECT_INFO *pConnect = NULL;
PUB_SDP_MEDIA *pMedia = NULL;
PUB_SDP_MSG *pSdp = NULL;
static char buf[32];
sprintf(buf , "0.0.0.0:0");
if(pChnlInfo == NULL)
return buf;
if(pChnlInfo->maxConnectNum > 1)
return buf;
for(i=0 ; i<pChnlInfo->maxConnectNum ; i++)
{
pConnect = pChnlInfo->pConnection[i];
if(pConnect != NULL)
break;
}
if(pConnect == NULL)
return buf;
pSdp = &pConnect->mediaAttr.sdp;
pMedia = &pSdp->medias.medias[0];
if((pMedia->m.port != 0)||(strlen(pSdp->c.addr) != 0))
sprintf(buf , "%s:%d" , pSdp->c.addr, pMedia->m.port);
return buf;
}
char *mgc_chnl_info_print_mode(CHNL_INFO *pChnlInfo)
{
int i;
CONNECT_INFO *pConnect = NULL;
if(pChnlInfo == NULL)
return "INACTIVE";
if(pChnlInfo->maxConnectNum > 1)
return "INACTIVE";
for(i=0 ; i<pChnlInfo->maxConnectNum ; i++)
{
pConnect = pChnlInfo->pConnection[i];
if(pConnect != NULL)
break;
}
if(pConnect == NULL)
return "INACTIVE";
switch(mgc_connect_get_conn_mode(pConnect))
{
case MGC_CON_MODE_INACTIVE:
return "INACTIVE";
case MGC_CON_MODE_RECVONLY:
return "RECVONLY";
case MGC_CON_MODE_SENDONLY:
return "SENDONLY";
case MGC_CON_MODE_SENDRECV:
return "SENDRECV";
default:
break;
}
return "INACTIVE";
}
char *mgc_chnl_info_print_status(CHNL_INFO *pChnlInfo)
{
int i;
CONNECT_INFO *pConnect = NULL;
if(pChnlInfo == NULL)
return "UNDEF";
if(pChnlInfo->maxConnectNum > 1)
return "UNDEF";
for(i=0 ; i<pChnlInfo->maxConnectNum ; i++)
{
pConnect = pChnlInfo->pConnection[i];
if(pConnect != NULL)
break;
}
if(pConnect == NULL)
return "IDLE";
switch(mgc_connect_get_status(pConnect))
{
case MGC_CONNECT_STATUS_IDLE:
return "IDLE";
case MGC_CONNECT_STATUS_CREATE:
return "CREATE";
case MGC_CONNECT_STATUS_CREATED:
return "CONNECT";
case MGC_CONNECT_STATUS_CREATING:
return "CREATING";
default:
break;
}
return "UNDEF";
}
#ifdef MGC_TEST_ENABLE
int mgc_chnl_info_assigned_num(void)
{
int i , num;
CHNL_INFO *pChnlInfo = NULL;
num = 0;
for(i=0 ; i<MGC_MAX_NUM_OF_CHNL ; i++)
{
pChnlInfo = &mgcChnl[i];
if(pChnlInfo->pPhyPort != NULL)
num++;
}
return num;
}
#endif

File diff suppressed because it is too large Load Diff

146
plat/mgc_v2/src/mgc_ctl.c Normal file
View File

@@ -0,0 +1,146 @@
/*
*********************************************************************************
* *
* NOTICE: *
* *
*********************************************************************************
*/
/*********************************************************************************
* <mgc_ctl.c>
* This file contain global variable control
*
* Author Date
* ------ ------
* Sam Yao Aug 2008
*********************************************************************************/
/*-----------------------------------------------------------------------*/
/* INCLUDE HEADER FILES */
/*-----------------------------------------------------------------------*/
#include "./include/mgc_ctl.h"
MGC_CTL mgcCtl;
void mgc_ctl_num_init(WORD sysId , WORD localIp , WORD peerIp)
{
MGC_CTL *pMgcCtl = NULL;
pMgcCtl = &mgcCtl;
pMgcCtl->mgcChlAssigned = 0;
pMgcCtl->mgcMgCreated = 0;
pMgcCtl->mgcMaxChlNo = MGC_MAX_NUM_OF_CHNL;
pMgcCtl->mgcMaxMgNo = MGC_MAX_NUM_OF_MG;
pMgcCtl->sysId = sysId;
pMgcCtl->localIp = localIp;
pMgcCtl->peerIp = peerIp;
return;
}
BOOL mgc_ctl_is_mg_full(void)
{
MGC_CTL *pMgcCtl = NULL;
pMgcCtl = &mgcCtl;
if((pMgcCtl->mgcMgCreated + 1) > pMgcCtl->mgcMaxMgNo)
return TRUE;
return FALSE;
}
void mgc_ctl_mg_add_one(void)
{
MGC_CTL *pMgcCtl = NULL;
pMgcCtl = &mgcCtl;
pMgcCtl->mgcMgCreated++;
return;
}
void mgc_ctl_mg_remove_one(void)
{
MGC_CTL *pMgcCtl = NULL;
pMgcCtl = &mgcCtl;
pMgcCtl->mgcMgCreated--;
return;
}
BOOL mgc_ctl_is_chnl_full(void)
{
MGC_CTL *pMgcCtl = NULL;
pMgcCtl = &mgcCtl;
if((pMgcCtl->mgcChlAssigned+ 1) > pMgcCtl->mgcMaxChlNo)
return TRUE;
return FALSE;
}
void mgc_ctl_chnl_add_one(void)
{
MGC_CTL *pMgcCtl = NULL;
pMgcCtl = &mgcCtl;
pMgcCtl->mgcChlAssigned++;
return;
}
void mgc_ctl_chnl_remove_one(void)
{
MGC_CTL *pMgcCtl = NULL;
pMgcCtl = &mgcCtl;
pMgcCtl->mgcChlAssigned--;
return;
}
int mgc_ctl_set_mg_max_num(int num)
{
MGC_CTL *pMgcCtl = NULL;
pMgcCtl = &mgcCtl;
if((num <= 0)||(num>MGC_MAX_NUM_OF_MG))
return -1;
pMgcCtl->mgcMaxMgNo = num;
return num;
}
int mgc_ctl_set_chnl_max_num(int num)
{
MGC_CTL *pMgcCtl = NULL;
pMgcCtl = &mgcCtl;
if((num <= 0)||( num > MGC_MAX_NUM_OF_CHNL))
return -1;
pMgcCtl->mgcMaxChlNo = num;
return num;
}
#ifdef MGC_TEST_ENABLE
int mgc_ctl_chnl_num(void)
{
MGC_CTL *pMgcCtl;
pMgcCtl = &mgcCtl;
return pMgcCtl->mgcChlAssigned;
}
int mgc_ctl_mg_num(void)
{
MGC_CTL *pMgcCtl;
pMgcCtl = &mgcCtl;
return pMgcCtl->mgcMgCreated;
}
#endif

779
plat/mgc_v2/src/mgc_debug.c Normal file
View File

@@ -0,0 +1,779 @@
#include "./include/mgc_debug.h"
#include "./include/mgc_mg_info.h"
#include "./include/mgc_phy_port.h"
#include "./include/mgc_chnl_info.h"
#include "./include/mgc_port_info.h"
#include "../../debug/src/include/debug.h"
#define MGC_DEBUG_ID 18
#define MGC_VER_DEBUG "R9V0_07"
static char ascii[16] = {0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46};
static BYTE log_help[] = {
"MGC Debug Monitor Help:\n\r\
\n\r\
1.[help] display help menu\n\r\
2.[log info on/off] display info logs\n\r\
3.[log error on/off] display error logs \n\r\
4.[log warn on/off] display warn logs \n\r\
5.[log all/none] display all/none logs\n\r\
6.[log record -f FILENAME] write debug message to FILENAME \n\r\
7.[print mg ID/Domain] print mg[ID]/Domain info \n\r\
"
};
static WORD disp_page[10];
static BYTE *disp_ptr = (BYTE *) disp_page;
static DWORD debug_status_id[20] =
{
1,3,6,1,4,1,1373,1,1,2,3,1,2,MGC_DEBUG_ID + 2,1
};
static BYTE debug_status = 1;
static DWORD debug_name_id[20] =
{
1,3,6,1,4,1,1373,1,1,2,3,1,2,MGC_DEBUG_ID + 2,2
};
static DWORD debug_ascin_id[20] =
{
1,3,6,1,4,1,1373,1,1,2,3,1,2,MGC_DEBUG_ID + 2,3
};
static DWORD debug_ascout_id[20] =
{
1,3,6,1,4,1,1373,1,1,2,3,1,2,MGC_DEBUG_ID + 2,4
};
static DWORD debug_page_title[20] =
{
1,3,6,1,4,1,1373,1,1,2,3,1,2,MGC_DEBUG_ID + 2,1,1
};
static DWORD debug_page_line[20] =
{
1,3,6,1,4,1,1373,1,1,2,3,1,2,MGC_DEBUG_ID + 2,1,2,1
};
const static BYTE MGC_BASE_ID_LEN = 15;
const static BYTE MGC_PAGE_POINT = 14;
const static BYTE MGC_LINE_POINT = 15;
static BYTE title1_p[] =
{
" MGC Page 01 MG Info\n\r\
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15\n\r\
Subpage\n\r\
MG_Info\n\r"
};
static BYTE title2_p[] =
{
" MGC Page 02 Phy Port Info\n\r\
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15\n\r\
Subpage\n\r\
Phy_Port\n\r"
};
static BYTE title3_p[] =
{
" MGC Page 03 Channel Info\n\r\
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15\n\r\
Subpage\n\r\
Chnl_Info\n\r"
};
static BYTE title4_p[] =
{
" MGC Page 04 Port Info\n\r\
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15\n\r\
Port_Info\n\r"
};
#define FILENAMELEN 128
static char fileName[FILENAMELEN];
BYTE mgc_disp_line(BYTE page, BYTE line)
{
BYTE disp_length;
disp_length = 16;
disp_ptr = (BYTE *) disp_page;
switch (page)
{
case 1: // Page 1: MG Info
if (line == 0)
{
disp_ptr = (BYTE *) &disp_page[page];
disp_length = 2;
}
else
disp_ptr = (BYTE *) mgc_mg_info_get_res_addr() + disp_page[page] * sizeof(MG_INFO) + (line - 1) * 16;
break;
case 2: // Page 2: Phy Port Info
if (line == 0)
{
disp_ptr = (BYTE *) &disp_page[page];
disp_length = 2;
}
else
disp_ptr = (BYTE *) mgc_phy_port_get_res_addr() + disp_page[page] * sizeof(PHY_PORT_INFO) + (line - 1) * 16;
break;
case 3: // Page 3: Channel Info
if (line == 0)
{
disp_ptr = (BYTE *) &disp_page[page];
disp_length = 2;
}
else
disp_ptr = (BYTE *) mgc_chnl_info_get_res_addr + disp_page[page] * sizeof(CHNL_INFO) + (line - 1) * 16;
break;
case 4: // Page 4: Software Port Info
if (line == 0)
{
disp_ptr = (BYTE *) &disp_page[page];
disp_length = 2;
}
else
disp_ptr = (BYTE *) mgc_port_info_get_res_addr + disp_page[page] * sizeof(PORT_INFO) + (line - 1) * 16;
break;
default:
disp_length = 0;
break;
}
return disp_length;
}
void mgc_disp_page(BYTE page)
{
BYTE disp_line;
BYTE disp_length;
debug_page_line[MGC_PAGE_POINT] = page + 5;
for (disp_line = 0; disp_line < 22; disp_line++)
{
disp_length = mgc_disp_line(page, disp_line);
debug_page_line[MGC_LINE_POINT] = disp_line + 2;
debug_page_line[MGC_LINE_POINT + 1] = 2; // Data Pointer
debug_set_response(MGC_BASE_ID_LEN + 2, debug_page_line, disp_ptr, disp_length);
}
}
int mgc_debug_set(void)
{
BYTE page;
BYTE data[10];
BYTE *ptr;
time_t timep;
struct tm *p;
bzero(disp_page, 20);
ptr = data;
debug_set_response(MGC_BASE_ID_LEN, debug_status_id, &debug_status, 1);
debug_set_response(MGC_BASE_ID_LEN, debug_name_id, MGC_VER_DEBUG, 10);
debug_set_response(MGC_BASE_ID_LEN, debug_ascin_id, mgcAsciInBuf, 4096);
debug_set_response(MGC_BASE_ID_LEN, debug_ascout_id, mgcAsciOutBuf, MGC_MAX_ASCIIOUT_LEN);
for (page = 1; page < 5; page++)
{
switch (page)
{
case 1: //page 1
ptr = title1_p;
break;
case 2: //page 2
ptr = title2_p;
break;
case 3: //page 3
ptr = title3_p;
break;
case 4: //page 4
ptr = title4_p;
break;
default:
break;
}
debug_page_title[MGC_PAGE_POINT] = 5 + page;
debug_set_response(MGC_BASE_ID_LEN + 1, debug_page_title, ptr, strlen(ptr));
mgc_disp_page(page);
}
// mkdir("mgc_log" , 777);
time(&timep);
p = gmtime(&timep);
memset(fileName , 0 , FILENAMELEN);
//sprintf(fileName , "mgc_log/mgc_log_%d_%d_%d_%d.txt", p->tm_mday, p->tm_hour, p->tm_min, p->tm_sec);
return 1;
}
BOOL mgc_debug_parse_print_info(char *pAscin)
{
char *ptr = NULL;
char *ptrTmp = NULL;
MG_INFO *pMgInfo = NULL;
int id = -1;
if(pAscin == NULL)
return FALSE;
if(strstr(pAscin , "print") == NULL)
return FALSE;
ptr = strstr(pAscin , "mg");
if(ptr == NULL)
return FALSE;
ptr = ptr+2;
while(*ptr != '\n')
{
if(*ptr != ' ')
{
ptrTmp = ptr;
break;
}
ptr++;
}
if(ptrTmp == NULL)
return FALSE;
pMgInfo = mgc_mg_info_find_mg_by_name(ptrTmp);
if(pMgInfo == NULL)
{
id = atoi(ptrTmp);
pMgInfo = mgc_mg_info_get_index_mg(id);
}
if(pMgInfo == NULL)
return FALSE;
mgc_mg_info_print_info(pMgInfo);
return TRUE;
}
BOOL mgc_debug_parse_log_file(char *pAscin)
{
char *ptr = NULL;
char *ptrTmp = NULL;
int i=0;
FILE *fp;
if(pAscin == NULL)
return FALSE;
if(strstr(pAscin , "log record") == NULL)
return FALSE;
ptr = strstr(pAscin , "-f");
if(ptr == NULL)
return FALSE;
memset(fileName , 0 , FILENAMELEN);
ptr = ptr+2;
while(*ptr != '\n')
{
if(*ptr != ' ')
{
ptrTmp = ptr;
break;
}
ptr++;
}
if(ptrTmp == NULL)
return FALSE;
while(*ptr != '\0')
{
ptr++;
i++;
if(i>=FILENAMELEN)
break;
}
if(i>=FILENAMELEN)
return FALSE;
memcpy(fileName, ptrTmp , ptr-ptrTmp);
fp = fopen(fileName , "w+");
if(fp == NULL)
return FALSE;
fclose(fp);
return TRUE;
}
BOOL mgc_debug_write_file(char *msg , int len)
{
FILE *fp = NULL;
if(strlen(fileName) == 0)
return FALSE;
fp = fopen(fileName , "a");
if(fp == NULL)
return FALSE;
if(fwrite(msg, sizeof(char) , len , fp) < len)
return FALSE;
fclose(fp);
return TRUE;
}
int mgc_asciout_proc(BYTE *out_str)
{
int out_len;
out_len = strlen(out_str);
if (out_len + strlen(mgcAsciOutBuf) > MGC_MAX_ASCIIOUT_LEN - 2)
{
strcpy(mgcAsciOutBuf, out_str);
}
else
strcat(mgcAsciOutBuf, out_str);
return 1;
}
void mgc_log_all()
{
WORD i;
for (i = 0; i < MGC_MAX_NUM_OF_MG; i++)
mgc_mg_info_set_mon(i , TRUE);
for (i = 0; i < MGC_MAX_NUM_OF_PHY_PORT; i++)
mgc_phy_port_set_mon(i, TRUE);
for (i = 0; i < MGC_MAX_NUM_OF_CHNL; i++)
mgc_chnl_info_set_mon(i, TRUE);
}
void mgc_log_none()
{
WORD i;
for (i = 0; i < MGC_MAX_NUM_OF_MG; i++)
mgc_mg_info_set_mon(i , FALSE);
for (i = 0; i < MGC_MAX_NUM_OF_PHY_PORT; i++)
mgc_phy_port_set_mon(i, FALSE);
for (i = 0; i < MGC_MAX_NUM_OF_CHNL; i++)
mgc_chnl_info_set_mon(i, FALSE);
memset(fileName , 0 , FILENAMELEN);
}
void mgc_mon(void)
{
BYTE in_page, err_fg = 0;
BYTE *ascii_in_ptr = NULL;
BYTE *str_start = NULL;
WORD str_len;
WORD num;
// WORD mgNo, chlNo , portNo;
//PHY_PORT_INFO *pPhyPort;
//CHNL_INFO *pChnlInfo;
if ((str_len = strlen(mgcAsciInBuf)) > 0)
{
in_page = mgcAsciInBuf[0] - 1;
ascii_in_ptr = mgcAsciInBuf + 1;
if (in_page > 4)
err_fg = 1;
else if (strcmp(ascii_in_ptr,"log error on") == 0)
{
mgcMonitorFg = mgcMonitorFg | MGC_MONITOR_ERROR;
}
else if (strcmp(ascii_in_ptr,"log error off") == 0)
{
mgcMonitorFg = mgcMonitorFg & (~MGC_MONITOR_ERROR);
}
else if (strcmp(ascii_in_ptr,"log warn on") == 0)
{
mgcMonitorFg = mgcMonitorFg | MGC_MONITOR_WARN;
}
else if (strcmp(ascii_in_ptr,"log warn off") == 0)
{
mgcMonitorFg = mgcMonitorFg & (~MGC_MONITOR_WARN);
}
else if (strcmp(ascii_in_ptr,"log info on") == 0)
{
mgcMonitorFg = mgcMonitorFg | MGC_MONITOR_INFO;
}
else if (strcmp(ascii_in_ptr,"log info off") == 0)
{
mgcMonitorFg = mgcMonitorFg & (~MGC_MONITOR_INFO);
}
else if (strcmp(ascii_in_ptr,"log all") == 0)
{
mgcMonitorFg = MGC_MONITOR_ALL;
mgc_log_all();
}
else if (strcmp(ascii_in_ptr,"log none") == 0)
{
mgcMonitorFg = MGC_MONITOR_NONE;
mgc_log_none();
}
else if (strcmp(ascii_in_ptr,"help") == 0)
{
mgc_asciout_proc(log_help);
}
else if(strstr(ascii_in_ptr, "log record") != NULL)
{
if(mgc_debug_parse_log_file(ascii_in_ptr) == FALSE)
err_fg = 1;
}
else if(strstr(ascii_in_ptr, "print") != NULL)
{
if(mgc_debug_parse_print_info(ascii_in_ptr) == FALSE)
err_fg = 1;
}
#if 0
else if (strstr(ascii_in_ptr, "log mg") != NULL)
{
if ((str_start = strstr(ascii_in_ptr, "-")) != NULL)
{
mgNo = strtoul(str_start + 1, NULL, 10);
if (mgNo >= MGC_MAX_NUM_OF_MG)
err_fg = 1;
else if (strstr(ascii_in_ptr, "on") != NULL)
mgcMgInfo[mgNo].monFlag = 1;
else if (strstr(ascii_in_ptr, "off") != NULL)
mgcMgInfo[mgNo].monFlag = 0;
else
err_fg = 1;
}
else
err_fg = 1;
}
else if (strstr(ascii_in_ptr, "log port") != NULL)
{
if ((str_start = strstr(ascii_in_ptr, "-")) != NULL)
{
mgNo = strtoul(str_start + 1, NULL, 10);
if (mgNo >= MGC_MAX_NUM_OF_MG)
err_fg = 1;
if ((str_start = strstr(str_start + 1, "-")) != NULL)
{
portNo = strtoul(str_start + 1, NULL, 10);
if (portNo >= MGC_MAX_PHY_PORT_PER_MG)
err_fg = 1;
pPhyPort = mgc_phy_port_find_port_of_mg(&(mgcMgInfo[mgNo]), portNo);
if (pPhyPort == NULL)
err_fg = 2;
else
{
if (strstr(str_start + 1, "on") != NULL)
pPhyPort->monFlag = 1;
else if (strstr(ascii_in_ptr, "off") != NULL)
pPhyPort->monFlag = 0;
else
err_fg = 1;
}
}
}
else
err_fg = 1;
}
else if (strstr(ascii_in_ptr, "log chnl") != NULL)
{
if ((str_start = strstr(ascii_in_ptr, "-")) != NULL)
{
mgNo = strtoul(str_start + 1, NULL, 10);
if (mgNo >= MGC_MAX_NUM_OF_MG)
err_fg = 1;
if ((str_start = strstr(str_start + 1, "-")) != NULL)
{
portNo = strtoul(str_start + 1, NULL, 10);
if (portNo >= MGC_MAX_PHY_PORT_PER_MG)
err_fg = 1;
pPhyPort = mgc_phy_port_find_port_of_mg(&mgcMgInfo[mgNo], portNo);
if (pPhyPort == NULL)
err_fg = 2;
else
{
if ((str_start = strstr(str_start + 1, "-")) != NULL)
{
chlNo = strtoul(str_start + 1, NULL, 10);
pChnlInfo = mgc_chnl_info_find_chnl_of_phy(pPhyPort, chlNo);
if (strstr(str_start + 1, "on") != NULL)
pChnlInfo->monFlag = 1;
else if (strstr(ascii_in_ptr, "off") != NULL)
pChnlInfo->monFlag = 0;
else
err_fg = 1;
}
}
}
}
else
err_fg = 1;
}
#endif
else if (isdigit(ascii_in_ptr[0]))
{
num = strtoul(ascii_in_ptr, NULL, 10);
disp_page[in_page] = num;
mgc_disp_page(in_page);
}
else if ((str_start = strstr(ascii_in_ptr, ">")) != NULL)
{
num = strtoul(str_start + 1, NULL, 10);
disp_page[in_page] += num;
mgc_disp_page(in_page);
}
else if ((str_start = strstr(ascii_in_ptr, "<"))!= NULL)
{
num = strtoul(str_start + 1, NULL, 10);
disp_page[in_page] -= num;
mgc_disp_page(in_page);
}
else
err_fg = 1;
if (err_fg == 0)
mgc_asciout_proc("Command OK!\n\r");
else if (err_fg == 2)
mgc_asciout_proc("MG port not created!\n\r");
else
mgc_asciout_proc("Command Error!\n\r");
strcpy(mgcAsciInBuf, "\0");
}
}
int mgc_hex_to_ascii(BYTE *from_hex, BYTE from_len, BYTE *to_asc)
{
int i, j;
j = 0;
for (i = 0; i< from_len; i++)
{
to_asc[j] = ascii[from_hex[i] >> 4];
j++;
to_asc[j] = ascii[from_hex[i] & 0x0F];
j++;
to_asc[j] = ' ';
j++;
}
to_asc[j] = '\0';
return 1;
}
int mgc_log_err(char *err_msg)
{
if ((mgcMonitorFg & MGC_MONITOR_ERROR) == MGC_MONITOR_ERROR)
{
mgc_asciout_proc("\33[31m");
if (strlen(err_msg) >= MGC_MAX_ASCITMP_LEN)
sprintf(mgcAsciTempBuf, "log msg is too long!\n\r");
else
sprintf(mgcAsciTempBuf, "%s", err_msg);
strcat(mgcAsciTempBuf, "\33[37m");
mgc_asciout_proc(mgcAsciTempBuf);
}
return 1;
}
int mgc_log_warn(char *err_msg)
{
if ((mgcMonitorFg & MGC_MONITOR_WARN) == MGC_MONITOR_WARN)
{
mgc_asciout_proc("\33[33m");
if (strlen(err_msg) >= MGC_MAX_ASCITMP_LEN)
sprintf(mgcAsciTempBuf, "log msg is too long!\n\r");
else
sprintf(mgcAsciTempBuf, "%s", err_msg);
strcat(mgcAsciTempBuf, "\33[37m");
mgc_asciout_proc(mgcAsciTempBuf);
}
return 1;
}
int mgc_log_info(char *err_msg)
{
if ((mgcMonitorFg & MGC_MONITOR_INFO) == MGC_MONITOR_INFO)
{
mgc_asciout_proc("\33[32m");
if (strlen(err_msg) >= MGC_MAX_ASCITMP_LEN)
sprintf(mgcAsciTempBuf, "log msg is too long!\n\r");
else
sprintf(mgcAsciTempBuf, "%s", err_msg);
strcat(mgcAsciTempBuf, "\33[37m");
mgc_asciout_proc(mgcAsciTempBuf);
}
return 1;
}
int mgc_log_procedure(WORD mgNo, WORD portIndex, WORD chnlIndex, char *msg)
{
/*
BYTE monFlag = 0;
if ((mgNo < MGC_MAX_NUM_OF_MG) && (mgcMgInfo[mgNo].monFlag == 1))
monFlag = 1;
else if ((portIndex < MGC_MAX_NUM_OF_PHY_PORT) && (mgcPhyPort[portIndex].monFlag == 1))
monFlag = 1;
else if ((chnlIndex < MGC_MAX_NUM_OF_CHNL) && (mgcChnl[chnlIndex].monFlag == 1))
monFlag = 1;
if (monFlag == 1)
{
if (strlen(msg) >= MGC_MAX_ASCITMP_LEN)
sprintf(mgcAsciTempBuf, "log msg is too long!\n\r");
else
sprintf(mgcAsciTempBuf, "%s\n\r", msg);
mgc_asciout_proc(mgcAsciTempBuf);
return 0;
}
*/
return -1;
}
#ifndef MGC_TEST_DEBUG
void MGC_DEBUG(char *msg,...)
{
char printedMessage[MGC_MAX_LINE_LENGTH];
char* ptr;
va_list v;
ptr = printedMessage;
memset(ptr , 0 , MGC_MAX_LINE_LENGTH);
sprintf(ptr, "DEBUG:");
ptr = ptr+strlen(ptr);
/* Format the given line with the arguments */
va_start(v, msg);
vsprintf(ptr, msg, v);
va_end(v);
ptr = ptr+strlen(ptr);
sprintf(ptr, "\r\n");
ptr = printedMessage;
if((mgcMonitorFg&MGC_MONITOR_DEBUG) != MGC_MONITOR_DEBUG)
return;
mgc_debug_write_file(ptr, strlen(ptr));
mgc_asciout_proc(ptr);
return;
}
void MGC_WARN(char *msg,...)
{
char printedMessage[MGC_MAX_LINE_LENGTH];
char* ptr;
va_list v;
ptr = printedMessage;
memset(ptr , 0 , MGC_MAX_LINE_LENGTH);
sprintf(ptr, "WARN:");
ptr = ptr+strlen(ptr);
/* Format the given line with the arguments */
va_start(v, msg);
vsprintf(ptr, msg, v);
va_end(v);
ptr = ptr+strlen(ptr);
sprintf(ptr, "\r\n");
ptr = printedMessage;
if((mgcMonitorFg&MGC_MONITOR_WARN) != MGC_MONITOR_WARN)
return;
mgc_debug_write_file(ptr, strlen(ptr));
mgc_log_warn(ptr);
return;
}
void MGC_INFO(char *msg,...)
{
char printedMessage[MGC_MAX_LINE_LENGTH];
char* ptr;
va_list v;
ptr = printedMessage;
memset(ptr , 0 , MGC_MAX_LINE_LENGTH);
sprintf(ptr, "INFO:");
ptr = ptr+strlen(ptr);
/* Format the given line with the arguments */
va_start(v, msg);
vsprintf(ptr, msg, v);
va_end(v);
ptr = ptr+strlen(ptr);
sprintf(ptr, "\r\n");
ptr = printedMessage;
if((mgcMonitorFg&MGC_MONITOR_INFO) != MGC_MONITOR_INFO)
return;
mgc_debug_write_file(ptr, strlen(ptr));
mgc_log_info(ptr);
return;
}
void MGC_ERROR(char *msg,...)
{
char printedMessage[MGC_MAX_LINE_LENGTH];
char* ptr;
va_list v;
ptr = printedMessage;
memset(ptr , 0 , MGC_MAX_LINE_LENGTH);
sprintf(ptr, "ERROR:");
ptr = ptr+strlen(ptr);
/* Format the given line with the arguments */
va_start(v, msg);
vsprintf(ptr, msg, v);
va_end(v);
ptr = ptr+strlen(ptr);
sprintf(ptr, "\r\n");
ptr = printedMessage;
if((mgcMonitorFg&MGC_MONITOR_ERROR) != MGC_MONITOR_ERROR)
return;
mgc_debug_write_file(ptr, strlen(ptr));
mgc_log_err(ptr);
return;
}
#endif

View File

@@ -0,0 +1,377 @@
/*
*********************************************************************************
* *
* NOTICE: *
* *
*********************************************************************************
*/
/*********************************************************************************
* <mgc_interanl.c>
* This file should is internal interface to do misc operation. So far, only AUEP is used
* Author Date
* ------ ------
* Sam Yao Aug 2008
*********************************************************************************/
/*-----------------------------------------------------------------------*/
/* INCLUDE HEADER FILES */
/*-----------------------------------------------------------------------*/
#include "./include/mgc_internal.h"
#include "./include/mgc_debug.h"
#include "./include/mgc_mg_info.h"
static MGC_INTERNAL_SAP mgcItlSap;
static ITL_OPERA_STRUCT opera[ITL_OPERA_NUM];
extern int mgc_update_phy_port_status(CHNL chnl, BOOL status);
extern int mgc_auep_chnl(WORD usrPort, CHNL chnl);
void mgc_internal_opera_init(ITL_OPERA_STRUCT *pOpera , int usrPort);
BOOL mgc_internal_get_local_ip(char *ipAddr)
{
struct hostent *host;
char localName[50];
if(ipAddr == NULL)
return FALSE;
if (gethostname(localName , 50) == -1)
{
return FALSE;
}
if ((host = gethostbyname(localName)) == NULL)
{
return FALSE;
}
sprintf(ipAddr, "%d.%d.%d.%d",
(BYTE)host->h_addr_list[0][0],
(BYTE)host->h_addr_list[0][1],
(BYTE)host->h_addr_list[0][2],
(BYTE)host->h_addr_list[0][3]);
return TRUE;
}
char *mgc_internal_print_opera_id(MGC_MG_OPER_ID_TYPE operaId)
{
switch(operaId)
{
case MGC_OPER_ID_CONNECT_CHNL:
return "MGC_OPER_ID_CONNECT_CHNL";
case MGC_OPER_ID_CONNECT_DTMF:
return "MGC_OPER_ID_CONNECT_DTMF";
case MGC_OPER_ID_CONNECT_TONE:
return "MGC_OPER_ID_CONNECT_TONE";
case MGC_OPER_ID_CRCX:
return "MGC_OPER_ID_CRCX";
case MGC_OPER_ID_MDCX:
return "MGC_OPER_ID_MDCX";
case MGC_OPER_ID_DLCX:
return "MGC_OPER_ID_DLCX";
case MGC_OPER_ID_RQNT:
return "MGC_OPER_ID_RQNT";
case MGC_OPER_ID_AUEP:
return "MGC_OPER_ID_AUEP";
case MGC_OPER_ID_CONNECT_AAS:
return "MGC_OPER_ID_CONNECT_AAS";
case MGC_OPER_ID_UNDEF:
return "MGC_OPER_ID_UNDEF";
case MGC_OPER_ID_IND:
return "MGC_OPER_ID_IND";
case MGC_OPER_ID_TANDEM_CREATE:
return "MGC_OPER_ID_TANDEM_CREATE";
case MGC_OPER_ID_TANDEM_CLEAR:
return "MGC_OPER_ID_TANDEM_CLEAR";
case MGC_OPER_ID_TANDEM_SET_TAR:
return "MGC_OPER_ID_TANDEM_SET_TAR";
case MGC_OPER_ID_TANDEM_UNSET_TAR:
return "MGC_OPER_ID_TANDEM_UNSET_TAR";
default:
break;
}
return "MGC_OPERA_ID_UNSUPPORTED";
}
int mgc_internal_get_sap_index(void)
{
return mgcItlSap.mgcSapIndex;
}
ITL_OPERA_STRUCT *mgc_internal_find_owne_opera(int usrPort)
{
ITL_OPERA_STRUCT *pOpera = NULL;
int i;
for(i=0; i<ITL_OPERA_NUM ; i++)
{
pOpera = &opera[i];
if(pOpera->userPort != usrPort)
continue;
return pOpera;
}
return NULL;
}
int mgc_internal_ind_callback(CHNL chnl, MGC_CMD_TYPE cmd, WORD *usrPort, WORD mgcPort, MEDIA_ATTR *mediaAttr)
{
return 0;
}
int mgc_internal_cnf_callback(WORD usrPort, WORD mgcPort, MGC_MG_OPER_ID_TYPE operId, MGC_OPER_RESULT success, WORD cause)
{
ITL_OPERA_STRUCT *pOpera = NULL;
MG_INFO *pMgInfo = NULL;
BOOL status = FALSE;
pOpera = mgc_internal_find_owne_opera(usrPort);
if(pOpera == NULL)
{
MGC_WARN("internal usrport[%d] lost owner" , usrPort);
return -1;
}
if(pOpera->status != ITL_OPERA_STATE_REQUEST)
{
mgc_internal_opera_init(pOpera, pOpera->userPort);
return -1;
}
// MGC_DEBUG("opera[%d] operate %s" , pOpera->userPort , success?"success" : "failure");
switch(operId)
{
case MGC_OPER_ID_AUEP:
pMgInfo = mgc_mg_info_get_index_mg(pOpera->chnl.mgNo);
if(success == MGC_OPER_SUCCESS)
{
status = TRUE;
}
mgc_mg_info_update_mg_status(pMgInfo, status);
mgc_delete_port(mgc_internal_get_sap_index(), pOpera->chnl.mgNo, pOpera->chnl.portNo);
break;
default:
MGC_WARN("internal opera do not support %s" , mgc_internal_print_opera_id(operId));
break;
}
mgc_internal_opera_init(pOpera, pOpera->userPort);
return 0;
}
ITL_OPERA_STRUCT *mgc_internal_get_idle_opera(void)
{
ITL_OPERA_STRUCT *pOpera = NULL;
int i;
for(i=0 ; i<ITL_OPERA_NUM ; i++)
{
pOpera = &opera[i];
if(pOpera->status != ITL_OPERA_STATE_IDLE)
continue;
return pOpera;
}
return NULL;
}
void mgc_internal_opera_init(ITL_OPERA_STRUCT *pOpera , int usrPort)
{
if(pOpera == NULL)
return;
pOpera->userPort = usrPort;
pOpera->status = ITL_OPERA_STATE_IDLE;
memset(&pOpera->chnl , 0 ,sizeof(CHNL));
return;
}
void mgc_internal_opera_clear(void)
{
int i;
ITL_OPERA_STRUCT *pOpera = NULL;
for(i=0 ; i<ITL_OPERA_NUM ; i++)
{
pOpera = &opera[i];
if(pOpera->status == ITL_OPERA_STATE_IDLE)
continue;
mgc_delete_port(mgc_internal_get_sap_index(), pOpera->chnl.mgNo, pOpera->chnl.portNo);
mgc_internal_opera_init(pOpera, pOpera->userPort);
}
return;
}
/***************************************************************************
* mgc_internal_opera_auep_request
* ------------------------------------------------------------------------
* General: inferace to be used for auep detection
* Return Value: if failure return FALSE, else return TRUE
* ------------------------------------------------------------------------
* Arguments:
* Input: pMgInfo - the pointer of the MG_INFO object which need to send auep
***************************************************************************/
BOOL mgc_internal_opera_auep_request(MG_INFO *pMgInfo)
{
ITL_OPERA_STRUCT *pOpera = NULL;
int i,ret;
PHY_PORT_INFO *pPhyPort = NULL;
if(pMgInfo == NULL)
return FALSE;
if((pMgInfo->created == FALSE)||(pMgInfo->mgAttr.ctrlType != MGC_MG_CTRL_TYPE_MGCP))
return FALSE;
if(pMgInfo->mgAttr.mgType ==MGC_MG_TYPE_INTERNAL)
{
pMgInfo->enable = TRUE;
return TRUE;
}
for(i=0 ; i< MGC_MAX_PHY_PORT_PER_MG ; i++)
{
pPhyPort = pMgInfo->pPhyPort[i];
pOpera = mgc_internal_get_idle_opera();
if(pOpera == NULL)
{
MGC_ERROR("internal opera is no more resource!");
mgc_internal_opera_clear();
continue;
}
if(pPhyPort == NULL)
continue;
if(pPhyPort->pMgcSap == NULL)
continue;
if(pPhyPort->pMgcSap->usrType != MGC_USER_TYPE_MGC)
continue;
ret = mgc_add_port(mgc_internal_get_sap_index(), pMgInfo->id, ITL_OPERA_PORT_NO , MGC_PHY_PORT_TYPE_E1);
if(ret < 0)
{
mgc_delete_port(mgc_internal_get_sap_index(),pMgInfo->id,ITL_OPERA_PORT_NO);
mgc_internal_opera_init(pOpera, pOpera->userPort);
return FALSE;
}
pOpera->chnl.mgNo = pMgInfo->id;
pOpera->chnl.portNo = ITL_OPERA_PORT_NO;
pOpera->chnl.chlNo = 0;
pOpera->chnl.connectNo = 0;
pOpera->status = ITL_OPERA_STATE_REQUEST;
if(MGC_RESULT_OK != mgc_auep_chnl(pOpera->userPort , pOpera->chnl))
mgc_internal_opera_init(pOpera, pOpera->userPort);
break;
}
return TRUE;
}
/***************************************************************************
* mgc_internal_sap_bind
* ------------------------------------------------------------------------
* General: inferace to be called in mgc_init
* Return Value: if failure return FALSE, else return TRUE
* ------------------------------------------------------------------------
* Arguments:
* Input: void
***************************************************************************/
BOOL mgc_internal_sap_bind(void)
{
MGC_INTERNAL_SAP *pSap = NULL;
ITL_OPERA_STRUCT *pOpera = NULL;
MGC_SAP *pMgcSap = NULL;
int ret , i;
pSap = &mgcItlSap;
if(pSap == NULL)
return FALSE;
pSap->mgcSapIndex = -1;
pMgcSap = &(pSap->mgcSap);
sprintf(pMgcSap->usrName , "%s" , "MGC_ITL_SAP");
pMgcSap->cnf_func = mgc_internal_cnf_callback;
pMgcSap->ind_func = mgc_internal_ind_callback;
pMgcSap->usrType = MGC_USER_TYPE_MGC;
ret = mgc_bind(pMgcSap);
if(ret < 0)
return FALSE;
pSap->mgcSapIndex = ret;
for(i=0 ; i<ITL_OPERA_NUM ; i++)
{
pOpera = &opera[i];
mgc_internal_opera_init(pOpera, i);
}
return TRUE;
}
/***************************************************************************
* mgc_internal_mg_create
* ------------------------------------------------------------------------
* General: inferace to be called in mgc_init to create internal mg
* Return Value: if failure return FALSE, else return TRUE
* ------------------------------------------------------------------------
* Arguments:
* Input: void
***************************************************************************/
BOOL mgc_internal_mg_create(void)
{
MGC_INTERNAL_SAP *pSap = NULL;
MG_ATTR mgAttr;
char localIp[33];
int ret;
pSap = &mgcItlSap;
if(pSap->mgcSapIndex < 0)
return FALSE;
memset(&mgAttr , 0 , sizeof(MG_ATTR));
mgAttr.mgType = MGC_MG_TYPE_INTERNAL;
mgAttr.ctrlType = MGC_MG_CTRL_TYPE_MGCP;
mgAttr.epDes = MGCP_EP_NAME_UNSTRUCTURED;
mgAttr.ptime = 20;
sprintf(mgAttr.domain , "InternalMG");
mgc_internal_get_local_ip(localIp);
mgAttr.ip = inet_addr(localIp);
ret = mgc_create_MG(pSap->mgcSapIndex , &mgAttr);
if(ret < 0)
return FALSE;
pSap->mgNoITL = ret;
ret = mgc_add_port(pSap->mgcSapIndex, pSap->mgNoITL , ITL_MG_INFO_PORT_NO , MGC_PHY_VIRTUAL_TYPE_INTERNAL);
if(ret < 0)
return FALSE;
return TRUE;
}

View File

@@ -0,0 +1,937 @@
/*
*********************************************************************************
* *
* NOTICE: *
* *
*********************************************************************************
*
*
*
* mgcSap <---------mgcPhyPorts --------> mgcMgInfo
*
*
*/
/*********************************************************************************
* <mgc_mg_info.c>
* This file should provide MG_INFO object APIs
*
* Author Date
* ------ ------
* Sam Yao Aug 2008
*********************************************************************************/
/*-----------------------------------------------------------------------*/
/* INCLUDE HEADER FILES */
/*-----------------------------------------------------------------------*/
#include "./include/mgc_mg_info.h"
#include "./include/mgc_phy_port.h"
#include "./include/mgc_8ecp.h"
#include "./include/mgc_internal.h"
#include "./include/mgc_chnl_info.h"
#include "./include/mgc_debug.h"
#include "./include/mgc_mgcp.h"
#include "./include/mgc_conn_info.h"
static MG_INFO mgcMgInfo[MGC_MAX_NUM_OF_MG];
extern int mgc_get_non_virtual_trk_status(MG_INFO *pMgInfo);
/*-----------------------------------------------------------------------
MG_INFO M A N A G E R
------------------------------------------------------------------------*/
/***************************************************************************
* mgc_mg_info_init
* ------------------------------------------------------------------------
* General: init MG_INFO structure objcet
* Return Value: void.
* ------------------------------------------------------------------------
* Arguments:
* Input: pMgInfo- the pointer of the MG_INFO object which should be init
* id - the id of the MG_INFO object
***************************************************************************/
void mgc_mg_info_init(MG_INFO *pMgInfo , int id)
{
int i;
if((pMgInfo == NULL)||(id < 0))
return ;
pMgInfo->id = id;
pMgInfo->requestId = 0;
pMgInfo->created = FALSE;
pMgInfo->enable = FALSE;
memset(&pMgInfo->mgAttr , 0 , sizeof(MG_ATTR));
pMgInfo->mgAttr.ctrlType = MGC_MG_CTRL_TYPE_UNDEF;
pMgInfo->mgAttr.mgType= MGC_MG_TYPE_UNDEF;
pMgInfo->auditTimer = 0;
for(i=0 ; i<MGC_MAX_PHY_PORT_PER_MG ; i++)
{
pMgInfo->pPhyPort[i] = NULL ;
}
return;
}
void mgc_mg_info_setup(void)
{
int i;
MG_INFO *pMgInfo = NULL;
for(i=0 ; i<MGC_MAX_NUM_OF_MG ;i++)
{
pMgInfo = &mgcMgInfo[i];
mgc_mg_info_init(pMgInfo, i);
}
return;
}
/***************************************************************************
* mgc_mg_info_clear
* ------------------------------------------------------------------------
* General: clear MG_INFO structure objcet
* Return Value: void.
* ------------------------------------------------------------------------
* Arguments:
* Input: pMgInfo- the pointer of the MG_INFO object which should be cleared
***************************************************************************/
void mgc_mg_info_clear(MG_INFO *pMgInfo)
{
int i;
PHY_PORT_INFO *pPhyPort = NULL;
for(i=0 ; i<MGC_MAX_PHY_PORT_PER_MG ; i++)
{
pPhyPort = pMgInfo->pPhyPort[i];
if(pPhyPort == NULL)
continue;
mgc_phy_port_clear(pPhyPort);
}
mgc_mg_info_init(pMgInfo, pMgInfo->id);
return;
}
/***************************************************************************
* mgc_mg_info_attached_phy_port_num
* ------------------------------------------------------------------------
* General: calculate how many phyPort is attached on the MG_INFO objec
* Return Value: the number of attached phyPort.
* ------------------------------------------------------------------------
* Arguments:
* Input: pMgInfo- the pointer of the MG_INFO object
***************************************************************************/
int mgc_mg_info_attached_phy_port_num(MG_INFO *pMgInfo)
{
int num , i;
if(pMgInfo == NULL)
return 0;
num = 0;
for(i=0 ; i<MGC_MAX_PHY_PORT_PER_MG ; i++)
{
if(pMgInfo->pPhyPort[i] != NULL)
num++;
}
return num;
}
/***************************************************************************
* mgc_mg_info_is_port_already_exist
* ------------------------------------------------------------------------
* General: check whether the phyport is already attached on this MG_INFO object
* Return Value: if already attached return TRUE, else return FALSE
* ------------------------------------------------------------------------
* Arguments:
* Input: pMgInfo- the pointer of the MG_INFO object
* portNo - the phyPort number
***************************************************************************/
BOOL mgc_mg_info_is_port_already_exist(MG_INFO *pMgInfo , int portNo , MGC_SAP *pSap)
{
int i;
if(pMgInfo == NULL)
return FALSE;
for(i=0 ; i<MGC_MAX_PHY_PORT_PER_MG ; i++)
{
if(pMgInfo->pPhyPort[i] == NULL)
continue;
if(pMgInfo->pPhyPort[i]->pMgcSap != pSap)
continue;
if(pMgInfo->pPhyPort[i]->portNo != portNo)
continue;
if(portNo != ITL_OPERA_PORT_NO)
{
MGC_WARN("mg[%d] already have Port[%d]" , pMgInfo->id , portNo);
}
return TRUE;
}
return FALSE;
}
/***************************************************************************
* mgc_mg_info_attach_phy_port
* ------------------------------------------------------------------------
* General: attach a phyport on the MG_INFO object
* Return Value: if failure return FALSE, else return TRUE
* ------------------------------------------------------------------------
* Arguments:
* Input: pMgInfo- the pointer of the MG_INFO object
* pPhyPort - the pointer of the phyPort
***************************************************************************/
BOOL mgc_mg_info_attach_phy_port(MG_INFO *pMgInfo , PHY_PORT_INFO *pPhyPort , MGC_SAP *pSap)
{
int i;
if((pMgInfo == NULL)||(pPhyPort == NULL))
return FALSE;
if(mgc_mg_info_is_port_already_exist(pMgInfo , pPhyPort->portNo , pSap) == TRUE)
return FALSE;
for(i=0 ; i<MGC_MAX_PHY_PORT_PER_MG ; i++)
{
if(pMgInfo->pPhyPort[i] != NULL)
continue;
pMgInfo->pPhyPort[i] = pPhyPort;
return TRUE;
}
return FALSE;
}
/***************************************************************************
* mgc_mg_info_dettach_phy_port
* ------------------------------------------------------------------------
* General: remove a phyport from the MG_INFO object
* Return Value: void
* ------------------------------------------------------------------------
* Arguments:
* Input: pMgInfo- the pointer of the MG_INFO object
* pPhyPort - the pointer of the phyPort
***************************************************************************/
void mgc_mg_info_dettach_phy_port(MG_INFO *pMgInfo , PHY_PORT_INFO *pPhyPort)
{
int i;
if((pMgInfo == NULL)||(pPhyPort == NULL))
return;
for(i=0 ; i<MGC_MAX_PHY_PORT_PER_MG ; i++)
{
if(pMgInfo->pPhyPort[i] != pPhyPort)
continue;
pMgInfo->pPhyPort[i] = NULL;
//MGC_DEBUG("mgcMgInfo[%d] dettach phyport[%d]" , pMgInfo->id , pPhyPort->id);
return;
}
return ;
}
/***************************************************************************
* mgc_mg_info_get_unused_mg
* ------------------------------------------------------------------------
* General: get unused MG_INFO object
* Return Value: if failure return FALSE, else return TRUE
* ------------------------------------------------------------------------
* Arguments:
* Input: void
***************************************************************************/
MG_INFO *mgc_mg_info_get_unused_mg(void)
{
int i;
MG_INFO *pMgInfo = NULL;
for(i=0 ; i<MGC_MAX_NUM_OF_MG ; i++)
{
pMgInfo = &mgcMgInfo[i];
if(pMgInfo->created == TRUE)
continue;
return pMgInfo;
}
return NULL;
}
/***************************************************************************
* mgc_mg_info_get_index_mg
* ------------------------------------------------------------------------
* General: get the pointer of the MG_INFO object by index
* Return Value: if failure return NULL , else return the pointer
* ------------------------------------------------------------------------
* Arguments:
* Input: index - index of the MG_INFO
***************************************************************************/
MG_INFO *mgc_mg_info_get_index_mg(int index)
{
if((index < 0)||(index >= MGC_MAX_NUM_OF_MG))
return NULL;
return &mgcMgInfo[index];
}
BOOL mgc_mg_info_check_codec_list(MG_INFO *pMgInfo)
{
int i;
MGC_CODEC_LIST codecList;
MGC_CODEC_LIST *pList = NULL;
if(pMgInfo == NULL)
return FALSE;
mgc_connect_codec_list_init(&codecList);
pList = &pMgInfo->mgAttr.codecList;
for(i = 0 ; i<pList->num ; i++)
{
if(mgc_mgcp_check_codec_valid(pList->codec[i]) != TRUE)
continue;
codecList.codec[codecList.num] = pList->codec[i];
codecList.num++;
}
if(pList->num != codecList.num)
{
MGC_WARN("mg[%d] codeclist rec wrong" , pMgInfo->id);
}
if(codecList.num > 0)
memcpy(pList , &codecList , sizeof(MGC_CODEC_LIST));
return TRUE;
}
/***************************************************************************
* mgc_mg_info_assign_attr
* ------------------------------------------------------------------------
* General: give MG_INFO object attribute
* Return Value: if failure return FALSE, else return TRUE
* ------------------------------------------------------------------------
* Arguments:
* Input: pMgInfo - the pointer of the MG_INFO object
* pMgAttr - the pointer of the attribute descprition
***************************************************************************/
BOOL mgc_mg_info_assign_attr(MG_INFO *pMgInfo , MG_ATTR *pMgAttr)
{
if((pMgInfo == NULL)||(pMgAttr == NULL))
return FALSE;
if(strlen(pMgAttr->domain) == 0)
return FALSE;
switch(pMgAttr->ctrlType)
{
case MGC_MG_CTRL_TYPE_8ECP:
mgc_8ecp_create(pMgInfo , pMgAttr);
break;
case MGC_MG_CTRL_TYPE_MGCP:
memcpy(&pMgInfo->mgAttr , pMgAttr , sizeof(MG_ATTR));
if(pMgInfo->mgAttr.auditTimer == 0)
{
pMgInfo->mgAttr.auditTimer = MGC_MGCF_TIMER_10S;
}
else
{
pMgInfo->mgAttr.auditTimer = pMgInfo->mgAttr.auditTimer*MGC_MGCF_TIMER_1S;
}
break;
default:
MGC_ERROR("unsupport ctrlType %d" , pMgAttr->ctrlType);
return FALSE;
}
mgc_mg_info_check_codec_list(pMgInfo);
pMgInfo->auditTimer = pMgInfo->mgAttr.auditTimer;
pMgInfo->created = TRUE;
return TRUE;
}
/***************************************************************************
* mgc_mg_info_state_check
* ------------------------------------------------------------------------
* General: check MG status
* Return Value: void
* ------------------------------------------------------------------------
* Arguments:
* Input: pMgInfo - the pointer of the MG_INFO object
***************************************************************************/
void mgc_mg_info_state_check(MG_INFO *pMgInfo)
{
if(pMgInfo == NULL)
return;
if(pMgInfo->created == FALSE)
return;
if(++pMgInfo->auditTimer < pMgInfo->mgAttr.auditTimer)
return;
switch(pMgInfo->mgAttr.ctrlType)
{
case MGC_MG_CTRL_TYPE_MGCP:
mgc_internal_opera_auep_request(pMgInfo);
mgc_get_non_virtual_trk_status(pMgInfo);
break;
case MGC_MG_CTRL_TYPE_8ECP:
break;
default:
break;
}
pMgInfo->auditTimer = 0;
return;
}
/***************************************************************************
* mgc_mg_info_update_mg_status
* ------------------------------------------------------------------------
* General: update MG_INFO object status
* Return Value: void
* ------------------------------------------------------------------------
* Arguments:
* Input: pMgInfo - the pointer of the MG_INFO object
* status - TRUE stand for enable, FALSE stand for disable
***************************************************************************/
void mgc_mg_info_update_mg_status(MG_INFO *pMgInfo , BOOL status)
{
int i;
PHY_PORT_INFO *pPhyPort = NULL;
if(pMgInfo == NULL)
return;
pMgInfo->enable = status;
if(pMgInfo->mgAttr.mgType == MGC_MG_TYPE_AudioCoder)
return;
for(i=0 ; i<MGC_MAX_PHY_PORT_PER_MG ; i++)
{
pPhyPort = pMgInfo->pPhyPort[i];
if(pPhyPort == NULL)
continue;
if(status == TRUE)
pPhyPort->status = MGC_PHY_PORT_STATUS_ON_LINE;
if(status == FALSE)
pPhyPort->status = MGC_PHY_PORT_STATUS_OFF_LINE;
}
return;
}
/***************************************************************************
* mgc_mg_info_check_mg_is_exsit
* ------------------------------------------------------------------------
* General: check MG_INFO object is already be created
* Return Value: if already created return the pointer , else return NULL
* ------------------------------------------------------------------------
* Arguments:
* Input: pMgAttr - the pointer of the MG attribute description
***************************************************************************/
MG_INFO *mgc_mg_info_check_mg_is_exsit(MG_ATTR *pMgAttr)
{
int i;
MG_INFO *pMgInfo= NULL;
if(pMgAttr == NULL)
return NULL;
for(i=0 ; i<MGC_MAX_NUM_OF_MG ; i++)
{
pMgInfo = &mgcMgInfo[i];
if(pMgInfo->created == FALSE)
continue;
if(strcmp(pMgInfo->mgAttr.domain , pMgAttr->domain) != 0)
continue;
if(pMgInfo->mgAttr.ip != pMgAttr->ip)
continue;
return pMgInfo;
}
return NULL;
}
/***************************************************************************
* mgc_mg_info_find_port_by_name
* ------------------------------------------------------------------------
* General: find the phyPort by mg name and local port
* Return Value: if failure return NUL , else return the pointer of the phyPort
* ------------------------------------------------------------------------
* Arguments:
* Input: name - the name of the mg
* localPort - the local MGCP port
***************************************************************************/
PHY_PORT_INFO *mgc_mg_info_find_port_by_name_and_portNo(char *name , BYTE portNo ,WORD localPort)
{
int i , j;
MG_INFO *pMgInfo = NULL;
PHY_PORT_INFO *pPhyPort = NULL;
MGC_USER_TYPE usrType ;
if(localPort == MGC_MG_NETWORK_PORT)
{
usrType = MGC_USER_TYPE_MG;
}
else if(localPort == MGC_MGC_NETWORK_PORT)
{
usrType = MGC_USER_TYPE_MGC;
}
else
{
return NULL;
}
for(i=0 ; i<MGC_MAX_NUM_OF_MG ; i++)
{
pMgInfo = &mgcMgInfo[i];
if(strcmp(pMgInfo->mgAttr.domain , name) != 0)
continue;
for(j=0 ; j<MGC_MAX_PHY_PORT_PER_MG ; j++)
{
pPhyPort = pMgInfo->pPhyPort[j];
if(pPhyPort == NULL)
continue;
if(pPhyPort->pMgcSap->usrType != usrType)
continue;
if(pPhyPort->portNo != portNo)
continue;
return pPhyPort;
}
}
return NULL;
}
PHY_PORT_INFO *mgc_mg_info_find_port_by_name(char *name ,WORD localPort)
{
int i , j;
MG_INFO *pMgInfo = NULL;
PHY_PORT_INFO *pPhyPort = NULL;
MGC_USER_TYPE usrType ;
if(localPort == MGC_MG_NETWORK_PORT)
{
usrType = MGC_USER_TYPE_MG;
}
else if(localPort == MGC_MGC_NETWORK_PORT)
{
usrType = MGC_USER_TYPE_MGC;
}
else
{
return NULL;
}
for(i=0 ; i<MGC_MAX_NUM_OF_MG ; i++)
{
pMgInfo = &mgcMgInfo[i];
if(strcmp(pMgInfo->mgAttr.domain , name) != 0)
continue;
for(j=0 ; j<MGC_MAX_PHY_PORT_PER_MG ; j++)
{
pPhyPort = pMgInfo->pPhyPort[j];
if(pPhyPort == NULL)
continue;
if(pPhyPort->pMgcSap->usrType != usrType)
continue;
return pPhyPort;
}
}
return NULL;
}
MG_INFO *mgc_mg_info_find_mg_by_name(char *name)
{
int i ;
MG_INFO *pMgInfo = NULL;
for(i=0 ; i<MGC_MAX_NUM_OF_MG ; i++)
{
pMgInfo = &mgcMgInfo[i];
if(strcmp(pMgInfo->mgAttr.domain , name) != 0)
continue;
return pMgInfo;
}
return NULL;
}
/***************************************************************************
* mgc_mg_info_find_available_mg
* ------------------------------------------------------------------------
* General: find a MG_INFO object which is enabled according to the mgType
* Return Value: if failure return NUL , else return the pointer of the MG_INFO object
* ------------------------------------------------------------------------
* Arguments:
* Input: mgType - the Type of MG
***************************************************************************/
MG_INFO *mgc_mg_info_find_available_mg(MGC_MG_TYPE mgType)
{
int i;
MG_INFO *pMgInfo = NULL;
if(mgType == MGC_MG_TYPE_UNDEF)
return NULL;
for(i=0 ; i<MGC_MAX_NUM_OF_MG ; i++)
{
pMgInfo = &mgcMgInfo[i];
if(pMgInfo->mgAttr.mgType != mgType)
continue;
if(pMgInfo->enable == FALSE)
continue;
return pMgInfo;
}
return NULL;
}
/***************************************************************************
* mgc_mg_info_assign_idle_connection
* ------------------------------------------------------------------------
* General: assign a idle connection of the specific MG_INFO objcet
* Return Value: if failure return NUL , else return the pointer of the connection
* ------------------------------------------------------------------------
* Arguments:
* Input: pMgInfo - the pointer of the MG_INFO
***************************************************************************/
CONNECT_INFO *mgc_mg_info_assign_idle_connection(MG_INFO *pMgInfo)
{
int i;
PHY_PORT_INFO *pPhyPort = NULL;
CONNECT_INFO *pConnect = NULL;
if(pMgInfo == NULL)
return NULL;
for(i=0 ; i<MGC_MAX_PHY_PORT_PER_MG ; i++)
{
pPhyPort = pMgInfo->pPhyPort[i];
if(pPhyPort == NULL)
continue;
pConnect = mgc_phy_port_assign_idle_connection(pPhyPort);
if(pConnect == NULL)
continue;
return pConnect;
}
return NULL;
}
/***************************************************************************
* mgc_mg_info_find_idle_chnl_info
* ------------------------------------------------------------------------
* General: find a idle chnl which is not attached by any connection in the specific MG_INFO object
* Return Value: if failure return NUL , else return the pointer of the CHNL_INFO
* ------------------------------------------------------------------------
* Arguments:
* Input: pMgInfo - the pointer of the MG_INFO
***************************************************************************/
CHNL_INFO *mgc_mg_info_find_idle_chnl_info(MG_INFO *pMgInfo)
{
int i;
PHY_PORT_INFO *pPhyPort = NULL;
CHNL_INFO *pChnlInfo = NULL;
if(pMgInfo == NULL)
return NULL;
for(i=0 ; i<MGC_MAX_PHY_PORT_PER_MG ; i++)
{
pPhyPort = pMgInfo->pPhyPort[i];
if(pPhyPort == NULL)
continue;
pChnlInfo = mgc_phy_port_find_idle_chnl(pPhyPort);
if(pChnlInfo == NULL)
continue;
return pChnlInfo;
}
return NULL;
}
/***************************************************************************
* mgc_mg_info_assign_aas_tone_connection
* ------------------------------------------------------------------------
* General: assign a idle connection according to the Tone
* Return Value: if failure return NUL , else return the pointer of the connection
* ------------------------------------------------------------------------
* Arguments:
* Input: toneNo - tone id
***************************************************************************/
CONNECT_INFO *mgc_mg_info_assign_aas_tone_connection(BYTE toneNo)
{
int i;
MG_INFO *pMgInfo = NULL;
CHNL_INFO *pChnlInfo = NULL;
PHY_PORT_INFO *pPhyPort = NULL;
CONNECT_INFO *pConnect = NULL;
pMgInfo = mgc_mg_info_find_available_mg(MGC_MG_TYPE_ANN);
if(pMgInfo == NULL)
return NULL;
for(i=0 ; i<MGC_MAX_PHY_PORT_PER_MG ; i++)
{
pPhyPort = pMgInfo->pPhyPort[i];
if(pPhyPort == NULL)
continue;
if(pPhyPort->pMgcSap->usrType != MGC_USER_TYPE_MGC)
continue;
break;
}
if(pPhyPort == NULL)
return NULL;
pChnlInfo = mgc_chnl_info_find_chnl_of_phy(pPhyPort, toneNo);
if(pChnlInfo == NULL)
return NULL;
pConnect = mgc_chnl_info_assign_idle_connect(pChnlInfo);
if(pConnect == NULL)
return NULL;
MGC_DEBUG("aas phyPort[%d] assign chnl[%d] conn[%d] to send tone" , pPhyPort->id, toneNo, pConnect->id);
return pConnect;
}
void mgc_mg_info_set_mon(int id , BOOL enable )
{
MG_INFO *pMgInfo = NULL;
pMgInfo = mgc_mg_info_get_index_mg(id);
if(pMgInfo == NULL)
return;
pMgInfo->monFlag = enable;
}
BYTE *mgc_mg_info_get_res_addr(void)
{
return (BYTE *)mgcMgInfo;
}
static char *mgc_mg_info_print_mg_type(MGC_MG_TYPE type)
{
switch(type)
{
case MGC_MG_TYPE_INTERNAL:
return "MGC_MG_TYPE_INTERNAL";
case MGC_MG_TYPE_AudioCoder:
return "MGC_MG_TYPE_AudioCoder";
case MGC_MG_TYPE_LGC_MG:
return "MGC_MG_TYPE_LGC_MG";
case MGC_MG_TYPE_SSW_CSS:
return "MGC_MG_TYPE_SSW_CSS";
case MGC_MG_TYPE_IPBSS:
return "MGC_MG_TYPE_IPBSS";
case MGC_MG_TYPE_ANALOG:
return "MGC_MG_TYPE_ANALOG";
case MGC_MG_TYPE_TANDEM:
return "MGC_MG_TYPE_TANDEM";
case MGC_MG_TYPE_ANN:
return "MGC_MG_TYPE_ANN";
default:
break;
}
return "MGC_MG_TYPE_UNDEF";
}
static char *mgc_mg_info_print_ip(DWORD addr)
{
struct sockaddr_in sin;
sin.sin_addr.s_addr = addr;
return ((char *) inet_ntoa(sin.sin_addr) );
}
static char *mgc_mg_info_print_ctl_type(MGC_MG_CTRL_TYPE ctlType)
{
switch(ctlType)
{
case MGC_MG_CTRL_TYPE_MGCP:
return "MGC_MG_CTRL_TYPE_MGCP";
case MGC_MG_CTRL_TYPE_8ECP:
return "MGC_MG_CTRL_TYPE_8ECP";
default:
break;
}
return "MGC_MG_CTRL_TYPE_UNDEF";
}
static char *mgc_mg_info_print_codec_list(MGC_CODEC_LIST codecList)
{
int i;
static char buf[256];
memset(buf , 0 ,256);
for(i=0 ; i<codecList.num ; i++)
{
strcat(buf, mgc_mgcp_print_vc_codec(codecList.codec[i]));
strcat(buf, " ");
if(strlen(buf) >= 255)
break;
}
return buf;
}
void mgc_mg_info_print_info(MG_INFO *pMgInfo)
{
MG_ATTR *pAttr;
int i;
PHY_PORT_INFO *pPhyPort;
if(pMgInfo == NULL)
return;
if(pMgInfo->created == FALSE)
{
MGC_INFO("mgInfo[%d] is not created! " , pMgInfo->id);
return;
}
pAttr = &pMgInfo->mgAttr;
MGC_INFO("--------mgInfo[%d] %s---------" , pMgInfo->id , pMgInfo->enable?"ENABLE":"DISABLE");
MGC_INFO("Domain : %s" , pAttr->domain);
MGC_INFO("Type : %s" , mgc_mg_info_print_mg_type(pAttr->mgType));
MGC_INFO("Ip : %s" , mgc_mg_info_print_ip(pAttr->ip));
MGC_INFO("CTL TYPE : %s" , mgc_mg_info_print_ctl_type(pAttr->ctrlType));
if(pAttr->epDes == MGCP_EP_NAME_UNSTRUCTURED)
{
MGC_INFO("epDes : MGCP_EP_NAME_UNSTRUCTURED");
}
else if(pAttr->epDes == MGCP_EP_NAME_STRUCTURED)
{
MGC_INFO("epDes : MGCP_EP_NAME_STRUCTURED");
}
else
{
MGC_INFO("epDes : MGCP_EP_NAME_UNKNOWN");
}
MGC_INFO("tonCap : %s" , (pAttr->toneCap == 1)?"ON":"OFF");
MGC_INFO("ptime : %d" , pAttr->ptime);
MGC_INFO("audit time : %ld" , pAttr->auditTimer);
MGC_INFO("e1cardNo : %d" , pAttr->e1cardNo);
MGC_INFO("maxPort : %d" , pAttr->maxPorts);
MGC_INFO("maxChnl : %d" , pAttr->maxChnls);
MGC_INFO("codelist len %d : %s" , pAttr->codecList.num , mgc_mg_info_print_codec_list(pAttr->codecList));
for(i=0 ; i<MGC_MAX_PHY_PORT_PER_MG ; i++)
{
pPhyPort = pMgInfo->pPhyPort[i];
if(pPhyPort == NULL)
continue;
if(pPhyPort->portNo == ITL_OPERA_PORT_NO)
continue;
mgc_phy_port_print(pPhyPort);
}
MGC_INFO("--------mgInfo[%d] end---------" , pMgInfo->id);
return;
}
#ifdef MGC_TEST_ENABLE
int mgc_mg_info_created_num(void)
{
int i , num;
MG_INFO *pMgInfo = NULL;
num = 0;
for(i=0 ; i<MGC_MAX_NUM_OF_MG ; i++)
{
pMgInfo = &mgcMgInfo[i];
if(pMgInfo->created)
num++;
}
return num;
}
#endif

1398
plat/mgc_v2/src/mgc_mgcp.c Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,482 @@
/*
*********************************************************************************
* *
* NOTICE: *
* *
*********************************************************************************
*
*
*
* mgcSap <---------mgcPhyPorts --------> mgcMgInfo
*
*
*/
/*********************************************************************************
* <mgc_phy_port.c>
* This file should provide MG_INFO object APIs
*
* Author Date
* ------ ------
* Sam Yao Aug 2008
*********************************************************************************/
/*-----------------------------------------------------------------------*/
/* INCLUDE HEADER FILES */
/*-----------------------------------------------------------------------*/
#include "./include/mgc_phy_port.h"
#include "./include/mgc_debug.h"
#include "./include/mgc_chnl_info.h"
#include "./include/mgc_ctl.h"
#include "./include/mgc_mg_info.h"
#include "./include/mgc_internal.h"
static PHY_PORT_INFO mgcPhyPort[MGC_MAX_NUM_OF_PHY_PORT];
/*-----------------------------------------------------------------------
PHY_PORT_INFO M A N A G E R
------------------------------------------------------------------------*/
/***************************************************************************
* mgc_phy_port_init
* ------------------------------------------------------------------------
* General: init PHY_PORT_INFO structure objcet
* Return Value: void.
* ------------------------------------------------------------------------
* Arguments:
* Input: pPhyPort- the pointer of the PHY_PORT_INFO object which should be init
* id - the id of the MG_INFO object
***************************************************************************/
void mgc_phy_port_init(PHY_PORT_INFO *pPhyPort , int id)
{
int i;
if((pPhyPort == NULL)||(id < 0))
return;
pPhyPort->id = id;
pPhyPort->portNo = -1;
pPhyPort->monFlag = 0;
pPhyPort->status = MGC_PHY_PORT_STATUS_UNDEF;
pPhyPort->portType = MGC_PHY_PORT_TYPE_UNDEF;
pPhyPort->pMgInfo = NULL;
pPhyPort->pMgcSap= NULL;
pPhyPort->chnlNum = 0;
for(i=0 ; i<MGC_MAX_CHNL_NUM_PER_PHY ; i++)
{
pPhyPort->pChnlInfo[i] = NULL;
}
return;
}
void mgc_phy_port_setup(void)
{
int i;
PHY_PORT_INFO *pPhyPort;
for(i=0 ; i<MGC_MAX_NUM_OF_PHY_PORT ; i++)
{
pPhyPort = &mgcPhyPort[i];
mgc_phy_port_init(pPhyPort, i);
}
return;
}
/***************************************************************************
* mgc_phy_port_clear
* ------------------------------------------------------------------------
* General: clear PHY_PORT_INFO structure objcet
* Return Value: void.
* ------------------------------------------------------------------------
* Arguments:
* Input: pPhyPort- the pointer of the PHY_PORT_INFO object which should be init
***************************************************************************/
void mgc_phy_port_clear(PHY_PORT_INFO *pPhyPort)
{
int i;
CHNL_INFO *pChnlInfo = NULL;
if(pPhyPort == NULL)
return;
for(i=0 ; i<MGC_MAX_CHNL_NUM_PER_PHY ; i++)
{
pChnlInfo = pPhyPort->pChnlInfo[i];
if(pChnlInfo == NULL)
continue;
mgc_chnl_info_clear(pChnlInfo);
if(pPhyPort->pMgInfo->mgAttr.mgType != MGC_MG_TYPE_TANDEM)
mgc_ctl_chnl_remove_one();
}
mgc_phy_port_init(pPhyPort , pPhyPort->id);
}
/***************************************************************************
* mgc_phy_port_get_unused_phy
* ------------------------------------------------------------------------
* General: get unused PHY_PORT_INFO structure objcet
* Return Value: if failure return NULL , else return the pointer of the PHY_PORT_INFO object.
* ------------------------------------------------------------------------
* Arguments:
* Input: void
***************************************************************************/
PHY_PORT_INFO *mgc_phy_port_get_unused_phy(void)
{
int i;
PHY_PORT_INFO *pPhyPort = NULL;
for(i=0 ; i<MGC_MAX_NUM_OF_PHY_PORT ; i++)
{
pPhyPort = &mgcPhyPort[i];
if((pPhyPort->chnlNum == 0)&&(pPhyPort->pMgInfo == NULL))
return pPhyPort;
}
return NULL;
}
/***************************************************************************
* mgc_phy_port_set_chnl_num
* ------------------------------------------------------------------------
* General: set the chnl number of the phyport according to the portType
* Return Value: void
* ------------------------------------------------------------------------
* Arguments:
* Input: pPhyPort - the pointer of the PHY_PORT_INFO object
* portType - the type of the port
***************************************************************************/
void mgc_phy_port_set_chnl_num(PHY_PORT_INFO *pPhyPort , MGC_PHY_PORT_TYPE portType)
{
if(pPhyPort == NULL)
return;
switch(portType)
{
case MGC_PHY_PORT_TYPE_UNDEF:
pPhyPort->chnlNum = 0;
break;
case MGC_PHY_PORT_TYPE_ANALOG:
pPhyPort->chnlNum = MGC_CHNL_NUM_AALN_PER_PORT;
break;
case MGC_PHY_VIRTUAL_TYPE_ANN:
pPhyPort->chnlNum = MGC_CHNL_NUM_ANN_PER_TYPE;
break;
case MGC_PHY_VIRTUAL_TYPE_TANDEM:
pPhyPort->chnlNum = MGC_CHNL_NUM_TANDEM_PER_TYPE;
break;
case MGC_PHY_VIRTUAL_TYPE_INTERNAL:
pPhyPort->chnlNum = MGC_CHNL_NUM_INTERNAL_PER_PORT;
break;
case MGC_PHY_VIRTUAL_TYPE_SURVEILLANCE:
pPhyPort->chnlNum = MGC_CHNL_NUM_SERVEILLANCE_PER_TYPE;
default :
pPhyPort->chnlNum = MGC_CHNL_NUM_DS_PER_PORT;
break;
}
return;
}
/***************************************************************************
* mgc_phy_port_attach_chnl
* ------------------------------------------------------------------------
* General: attach chnls to the phyPort
* Return Value: if failure return FALSE , else return TRUE
* ------------------------------------------------------------------------
* Arguments:
* Input: pPhyPort - the pointer of the PHY_PORT_INFO object
***************************************************************************/
BOOL mgc_phy_port_attach_chnl(PHY_PORT_INFO *pPhyPort)
{
int i;
CHNL_INFO *pChnlInfo = NULL;
if(pPhyPort == NULL)
return FALSE;
for(i=0 ; i<pPhyPort->chnlNum ; i++)
{
pChnlInfo = mgc_chnl_info_get_unused_chnl();
if(pChnlInfo == NULL)
return FALSE;
if((mgc_ctl_is_chnl_full() == TRUE)&&(pPhyPort->pMgInfo->mgAttr.mgType != MGC_MG_TYPE_TANDEM))
return FALSE;
pPhyPort->pChnlInfo[i] = pChnlInfo;
if(mgc_chnl_info_attach_to_phy_port(pChnlInfo , pPhyPort) == FALSE)
return FALSE;
mgc_chnl_info_status_set(pChnlInfo , MGC_CHNL_INFO_STATUS_IDLE);
if(pPhyPort->pMgInfo->mgAttr.mgType != MGC_MG_TYPE_TANDEM)
mgc_ctl_chnl_add_one();
}
if(pPhyPort->chnlNum == 0)
{
MGC_ERROR("mg[%d]port[%d] not support type!" , pPhyPort->pMgInfo->id , pPhyPort->portNo);
return FALSE;
}
if(pPhyPort->portNo != ITL_OPERA_PORT_NO)
{
MGC_DEBUG("mg[%d]port[%d] ==> phyPort[%d] {chnlInfo[%d] ~ chnlInfo[%d]}" ,
pPhyPort->pMgInfo->id ,pPhyPort->portNo,pPhyPort->id , pPhyPort->pChnlInfo[0]->id, pPhyPort->pChnlInfo[pPhyPort->chnlNum-1]->id);
}
return TRUE;
}
/***************************************************************************
* mgc_phy_port_find_port_of_mg
* ------------------------------------------------------------------------
* General: find the phyPort in the MG accroding to the PortNo
* Return Value: if failure return NULL , else return the pointer of the PHY_PORT_INFO object
* ------------------------------------------------------------------------
* Arguments:
* Input: pMgInfo - the pointer of the MG
* portNo - the portNo of the phyPort
***************************************************************************/
PHY_PORT_INFO *mgc_phy_port_find_port_of_mg(MG_INFO *pMgInfo , int portNo)
{
int i;
PHY_PORT_INFO *pPhyPort = NULL;
if(pMgInfo == NULL)
return NULL;
for(i=0 ; i<MGC_MAX_PHY_PORT_PER_MG ; i++)
{
pPhyPort = pMgInfo->pPhyPort[i];
if(pPhyPort == NULL)
continue;
if(pPhyPort->portNo != portNo)
continue;
return pPhyPort;
}
return NULL;
}
/***************************************************************************
* mgc_phy_port_find_port_of_mg_by_index
* ------------------------------------------------------------------------
* General: find the phyPort in the MG accroding to the index
* Return Value: if failure return NULL , else return the pointer of the PHY_PORT_INFO object
* ------------------------------------------------------------------------
* Arguments:
* Input: pMgInfo - the pointer of the MG
* index - index
***************************************************************************/
PHY_PORT_INFO *mgc_phy_port_find_port_of_mg_by_index(MG_INFO *pMgInfo , int index)
{
PHY_PORT_INFO *pPhyPort = NULL;
if(pMgInfo == NULL)
return NULL;
pPhyPort = pMgInfo->pPhyPort[index];
if(pPhyPort == NULL)
return NULL;
return pPhyPort;
}
/***************************************************************************
* mgc_phy_port_update_status
* ------------------------------------------------------------------------
* General: update phyPort status
* Return Value: void
* ------------------------------------------------------------------------
* Arguments:
* Input: pPhyPort - the pointer of the PHY_PORT_INFO object
* status - the status of the phyPort
***************************************************************************/
void mgc_phy_port_update_status(PHY_PORT_INFO *pPhyPort , BOOL status)
{
if(pPhyPort == NULL)
return;
if(status)
{
pPhyPort->status = MGC_PHY_PORT_STATUS_ON_LINE;
}
else
{
pPhyPort->status = MGC_PHY_PORT_STATUS_OFF_LINE;
}
return;
}
/***************************************************************************
* mgc_phy_port_find_idle_chnl
* ------------------------------------------------------------------------
* General: find a idle chnl in the phyPort
* Return Value: if failure return NULL , else return the pointer of the chnl
* ------------------------------------------------------------------------
* Arguments:
* Input: pPhyPort - the pointer of the PHY_PORT_INFO object
***************************************************************************/
CHNL_INFO *mgc_phy_port_find_idle_chnl(PHY_PORT_INFO *pPhyPort)
{
int i;
CHNL_INFO *pChnlInfo = NULL;
if(pPhyPort == NULL)
return NULL;
for(i=0 ; i<MGC_MAX_CHNL_NUM_PER_PHY ; i++)
{
pChnlInfo = pPhyPort->pChnlInfo[i];
if(pChnlInfo == NULL)
continue;
if(pChnlInfo->connectNum != 0)
continue;
return pChnlInfo;
}
return NULL;
}
/***************************************************************************
* mgc_phy_port_assign_idle_connection
* ------------------------------------------------------------------------
* General: find a idle connection in the phyPort
* Return Value: if failure return NULL , else return the pointer of the connction
* ------------------------------------------------------------------------
* Arguments:
* Input: pPhyPort - the pointer of the PHY_PORT_INFO object
***************************************************************************/
CONNECT_INFO *mgc_phy_port_assign_idle_connection(PHY_PORT_INFO *pPhyPort)
{
int i;
CHNL_INFO *pChnlInfo = NULL;
CONNECT_INFO *pConnect = NULL;
if(pPhyPort == NULL)
return NULL;
for(i=0 ; i<MGC_MAX_CHNL_NUM_PER_PHY ; i++)
{
pChnlInfo = pPhyPort->pChnlInfo[i];
if(pChnlInfo == NULL)
continue;
pConnect = mgc_chnl_info_assign_idle_connect(pChnlInfo);
if(pConnect == NULL)
continue;
return pConnect;
}
return NULL;
}
BYTE *mgc_phy_port_get_res_addr(void)
{
return (BYTE *)mgcPhyPort;
}
static char *mgc_phy_port_print_user_type(MGC_USER_TYPE type)
{
switch(type)
{
case MGC_USER_TYPE_MGC:
return "MGC_USER_TYPE_MGC";
case MGC_USER_TYPE_MG:
return "MGC_USER_TYPE_MG";
default :
break;
}
return "MGC_USER_TYPE_UNDEF";
}
void mgc_phy_port_print_chnl_info(PHY_PORT_INFO *pPhyPort)
{
int i;
CHNL_INFO *pChnlInfo;
if(pPhyPort == NULL)
return;
if((pPhyPort->portType != MGC_PHY_PORT_TYPE_E1)&&(pPhyPort->portType != MGC_PHY_PORT_TYPE_T1))
{
MGC_INFO("port type do not support!");
return;
}
MGC_INFO("%8s %10s %10s %10s %20s" , "ChnlNo", "Status", "Mode" , "Codec" , "LocalIP");
for(i=0 ; i<pPhyPort->chnlNum ; i++)
{
pChnlInfo = pPhyPort->pChnlInfo[i];
if(pChnlInfo == NULL)
continue;
MGC_INFO("chnl[%02d] %10s %10s %10s %20s",
i , mgc_chnl_info_print_status(pChnlInfo), mgc_chnl_info_print_mode(pChnlInfo),
mgc_chnl_info_print_codec(pChnlInfo), mgc_chnl_info_print_remote(pChnlInfo));
}
return;
}
void mgc_phy_port_print(PHY_PORT_INFO *pPhyPort)
{
if(pPhyPort == NULL)
return;
if((pPhyPort->pMgInfo == NULL)||(pPhyPort->pMgcSap == NULL) )
{
MGC_INFO("mgcPhyPort[%d] is not used!" , pPhyPort->id);
return;
}
MGC_INFO("mgInfo[%d]Port[%d] ==>> mgcPhyPort[%d] " , pPhyPort->pMgInfo->id , pPhyPort->portNo , pPhyPort->id);
MGC_INFO("mgInfo[%d]Port[%d] ==>> %s %s" ,
pPhyPort->pMgInfo->id , pPhyPort->portNo , pPhyPort->pMgcSap->usrName,mgc_phy_port_print_user_type(pPhyPort->pMgcSap->usrType));
MGC_INFO("mgInfo[%d]Port[%d] %s" , pPhyPort->pMgInfo->id , pPhyPort->portNo, (pPhyPort->status == MGC_PHY_PORT_STATUS_ON_LINE)?"on":"off");
mgc_phy_port_print_chnl_info(pPhyPort);
return;
}
int mgc_modify_port(BYTE sapIndex, WORD mgNo, BYTE portNo, BYTE portType)
{
MGC_ERROR("port modify is not support now!");
MGC_ERROR("Please delete first , and then re-add");
return -1;
}
void mgc_phy_port_set_mon(int id, BOOL enalbe)
{
if((id<0)||(id >= MGC_MAX_NUM_OF_PHY_PORT))
return;
mgcPhyPort[id].monFlag = enalbe;
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,291 @@
#include "./include/mgc_port_list.h"
#include "./include/mgc_port_info.h"
#include "./include/mgc_debug.h"
#define MGC_MAX_NUM_OF_PORT_NODE (MGC_MAX_NUM_OF_PORT)
MGC_PORT_NODE mgcPortNode[MGC_MAX_NUM_OF_PORT_NODE];
MGC_PORT_LIST mgcPortActiveList;
static void mgc_port_list_node_init(MGC_PORT_NODE *pNode , int id)
{
if(pNode == NULL)
return;
pNode->id = id;
pNode->pPortInfo = NULL;
pNode->pPrior = NULL;
pNode->pNext = NULL;
pNode->pList = NULL;
return;
}
static void mgc_port_list_init(MGC_PORT_LIST *pList)
{
if(pList == NULL)
return;
pList->pHead = NULL;
pList->len = 0;
return;
}
static MGC_PORT_NODE *mgc_port_list_get_unused_node(void)
{
int i;
static int index = 0 ;
MGC_PORT_NODE *pNode = NULL;
MGC_PORT_NODE *pNodeTmp = NULL;
i = index;
do
{
i++;
if(i == MGC_MAX_NUM_OF_PORT_NODE)
i = 0;
pNode = &mgcPortNode[i];
if((pNode->pNext != NULL)||(pNode->pPrior != NULL))
continue;
if((pNode->pPortInfo != NULL)||(pNode->pList != NULL))
{
MGC_ERROR("mgcNode[%d] error rec" , pNode->id);
mgc_port_list_node_init(pNode, pNode->id);
continue;
}
pNodeTmp = pNode;
index = i;
break;
}while( i!=index);
return pNodeTmp;
}
void mgc_port_list_setup(void)
{
int i;
MGC_PORT_NODE *pNode = NULL;
for(i=0 ; i<MGC_MAX_NUM_OF_PORT_NODE ; i++)
{
pNode = &mgcPortNode[i];
mgc_port_list_node_init(pNode, i);
}
mgc_port_list_init(&mgcPortActiveList);
}
WORD mgc_port_list_get_len(MGC_PORT_LIST *pList)
{
if(pList == NULL)
return 0;
return pList->len;
}
MGC_PORT_NODE *mgc_port_list_get_tail(MGC_PORT_LIST *pList)
{
if((pList == NULL)||(pList->pHead == NULL))
return NULL;
return (pList->pHead->pPrior);
}
static BOOL mgc_port_list_add_node_to_list(MGC_PORT_LIST *pList , MGC_PORT_NODE *pNode)
{
MGC_PORT_NODE *pNodeTail;
if((pList == NULL)||(pNode == NULL))
return FALSE;
if(pList->pHead == NULL)
{
pList->pHead = pNode;
pList->pHead->pPrior = pNode;
pList->pHead->pNext = pNode;
pNode->pList = pList;
}
pNodeTail = mgc_port_list_get_tail(pList);
if(pNodeTail == NULL)
{
MGC_ERROR("lost portlist tail");
return FALSE;
}
pNode->pPrior = pNodeTail;
pNode->pNext = pNodeTail->pNext;
pNode->pList = pList;
pNodeTail->pNext = pNode;
pList->pHead->pPrior = pNode;
pList->len++;
return TRUE;
}
static MGC_PORT_NODE *mgc_port_list_find_port_in_active_list(PORT_INFO *pPortInfo)
{
MGC_PORT_NODE *pNode = NULL;
MGC_PORT_NODE *pNodeTmp = NULL;
MGC_PORT_NODE *pHead = NULL;
if(pPortInfo == NULL)
return NULL;
pHead = mgcPortActiveList.pHead;
if(pHead == NULL)
return NULL;
pNode = pHead;
do{
if(pNode->pPortInfo == pPortInfo)
{
pNodeTmp = pNode;
break;
}
pNode = pNode->pNext;
}while(pNode != pHead);
return pNodeTmp;
}
MGC_PORT_NODE *mgc_port_list_add_to_active_list(PORT_INFO *pPortInfo)
{
MGC_PORT_NODE *pNode = NULL;
if(pPortInfo == NULL)
return NULL;
pNode = mgc_port_list_find_port_in_active_list(pPortInfo);
if(pNode != NULL)
return pNode;
pNode = mgc_port_list_get_unused_node();
if(pNode == NULL)
{
MGC_ERROR("mgcPortNode is full!");
return NULL;
}
pNode->pPortInfo = pPortInfo;
if(mgc_port_list_add_node_to_list(&mgcPortActiveList, pNode) == FALSE)
{
mgc_port_list_node_init(pNode, pNode->id);
return NULL;
}
//MGC_DEBUG("mgcPort[%d] add to mgcPortNode[%d]" , pPortInfo->id , pNode->id);
return pNode;
}
static BOOL mgc_port_list_remove_node_from_list(MGC_PORT_LIST *pList , MGC_PORT_NODE *pNode)
{
MGC_PORT_NODE *pPrior = NULL;
MGC_PORT_NODE *pNext = NULL;
if((pList == NULL) || (pNode == NULL))
return FALSE;
if(pNode->pList != pList)
{
MGC_ERROR("mgcPortNode[%d] not belong to the list" , pNode->id);
return FALSE;
}
pPrior = pNode->pPrior;
pNext = pNode->pNext;
if((pPrior == NULL)||(pNext == NULL))
{
MGC_ERROR("mgcPortNode[%d] lost rec" , pNode->id);
return FALSE;
}
pPrior->pNext = pNext;
pNext->pPrior = pPrior;
pList->len--;
if(pList->pHead == pNode)
{
pList->pHead = pNext;
}
if((pPrior == pNode)&&(pNext == pNode))
{
pList->pHead = NULL;
}
mgc_port_list_node_init(pNode, pNode->id);
return TRUE;
}
BOOL mgc_port_list_remove_from_active_list(PORT_INFO *pPortInfo)
{
MGC_PORT_NODE *pNode = NULL;
if(pPortInfo == NULL)
return FALSE;
pNode = mgc_port_list_find_port_in_active_list(pPortInfo);
if(pNode == NULL)
{
MGC_ERROR("mgcPort[%d] is not in the active list" , pPortInfo->id);
return FALSE;
}
if(mgc_port_list_remove_node_from_list(&mgcPortActiveList, pNode) == FALSE)
return FALSE;
//MGC_DEBUG("mgcPort[%d] remove from mgcPortNode[%d]" , pPortInfo->id , pNode->id);
return TRUE;
}
void mgc_port_active_list_proc(void)
{
MGC_PORT_NODE *pNode = NULL;
MGC_PORT_NODE *pNodeTmp = NULL;
PORT_INFO *pPortInfo = NULL;
MGC_PORT_LIST *pList = &mgcPortActiveList;
if(pList->pHead == NULL)
return;
pNode = pList->pHead;
do{
pPortInfo = pNode->pPortInfo;
pNodeTmp = pNode;
pNode = pNode->pNext;
if(pPortInfo == NULL)
{
MGC_ERROR("mgcPortNode[%d] lost rec" , pNodeTmp->id);
mgc_port_list_remove_node_from_list(pNodeTmp->pList, pNodeTmp);
}
else
{
mgc_port_info_fsm(pNode->pPortInfo);
if(pPortInfo->assigned == FALSE)
mgc_port_list_remove_from_active_list(pPortInfo);
}
}while((pNode != pList->pHead)&&(pList->pHead != NULL));
return;
}

View File

@@ -0,0 +1,562 @@
#include "./include/mgc_sur_info.h"
#include "./include/mgc_debug.h"
#include "./include/mgc_mgcp.h"
#include "./include/mgc_conn_info.h"
#include "./include/mgc_chnl_info.h"
#include "./include/mgc_mg_info.h"
#include "./include/mgc_phy_port.h"
#include "./include/mgc_tandem_info.h"
static CONNECT_INFO mgcSurvillanceConn[MGC_MAX_NUM_OF_SURVEILLANCE_CONN];
static CHNL_INFO mgcSurvillianceChnl[MGC_MAX_NUM_OF_SURVEILLIANCE_CHNL];
static PHY_PORT_INFO mgcSurvilliancePort[MGC_MAX_NUM_OF_SURVEILLANCE_NUM];
static MGC_SUR_INFO_NODE mgcSurvillianceNode[MGC_MAX_NUM_OF_SURVEILLANCE_NODE];
extern MGC_SAP *mgc_sap_get_index_sap(int index);
static void mgc_sur_info_node_init(MGC_SUR_INFO_NODE *pNode , int id)
{
if(pNode == NULL)
return ;
pNode->id = id;
pNode->pConn = NULL;
pNode->pNext = NULL;
pNode->pPrior = NULL;
return;
}
static MGC_SUR_INFO_NODE *mgc_sur_info_get_unused_node(void)
{
int i;
static int index = 0;
MGC_SUR_INFO_NODE *pNode = NULL;
MGC_SUR_INFO_NODE *pNodeTmp = NULL;
i = index;
do
{
i++;
if(i == MGC_MAX_NUM_OF_SURVEILLANCE_NODE)
i = 0;
pNode = &mgcSurvillianceNode[i];
if(pNode->pConn != NULL)
continue;
index = i;
pNodeTmp = pNode;
break;
}while(i != index);
return pNodeTmp;
}
void mgc_sur_info_list_init(MGC_SUR_INFO_LIST *pList)
{
if(pList == NULL)
return ;
pList->len = 0;
pList->pHead = NULL;
return;
}
MGC_SUR_INFO_NODE *mgc_sur_info_get_list_tail(MGC_SUR_INFO_LIST *pList)
{
MGC_SUR_INFO_NODE *pNode = NULL;
MGC_SUR_INFO_NODE *pNodeHead = NULL;
if((pList == NULL)||(pList->pHead == NULL))
return NULL;
pNode = NULL;
pNodeHead = pList->pHead;
pNode = pNodeHead->pNext;
while(pNode->pNext != pNodeHead)
{
pNode = pNode->pNext;
}
return pNode;
}
MGC_SUR_INFO_NODE *mgc_sur_info_get_list_node(MGC_SUR_INFO_LIST *pList , WORD index)
{
MGC_SUR_INFO_NODE *pNode = NULL;
MGC_SUR_INFO_NODE *pNodeTmp = NULL;
int i;
if((pList == NULL) || (pList->pHead == NULL))
return NULL;
if(index >= pList->len)
{
MGC_WARN("list len %d <= %d" , pList->len , index);
return NULL;
}
i = 0;
pNode = pList->pHead;
do
{
if(i == index)
{
pNodeTmp = pNode;
break;
}
i++;
pNode = pNode->pNext;
}while(pNode != pList->pHead);
return pNodeTmp;
}
MGC_SUR_INFO_NODE *mgc_sur_info_find_conn_in_list(MGC_SUR_INFO_LIST *pList , CONNECT_INFO *pConn)
{
MGC_SUR_INFO_NODE *pNode = NULL;
BOOL result = FALSE;
if((pList == NULL)||(pConn == NULL)||(pList->pHead == NULL))
return NULL;
pNode = pList->pHead;
do
{
if(pNode->pConn == pConn)
{
result = TRUE;
//MGC_DEBUG("find conn[%d] in the list" , pConn->id);
break;
}
pNode = pNode->pNext;
}while(pNode != pList->pHead);
if(result == TRUE)
return pNode;
return NULL;
}
BOOL mgc_sur_info_add_conn_to_list(MGC_SUR_INFO_LIST *pList , CONNECT_INFO *pConn)
{
MGC_SUR_INFO_NODE *pNode = NULL;
MGC_SUR_INFO_NODE *pNodeTail = NULL;
if((pList == NULL)||(pConn == NULL))
return FALSE;
pNode = mgc_sur_info_get_unused_node();
if(pNode == NULL)
return FALSE;
pNode->pConn = pConn;
pNode->pPrior = pNode;
pNode->pNext = pNode;
if(pList->pHead == NULL)
pList->pHead = pNode;
pNodeTail = mgc_sur_info_get_list_tail(pList);
if(pNodeTail == NULL)
{
MGC_ERROR("lost list tail");
return FALSE;
}
pNode->pPrior = pNodeTail;
pNode->pNext = pNodeTail->pNext;
pNodeTail->pNext = pNode;
pList->pHead->pPrior = pNode;
pList->len++;
MGC_DEBUG("conn[%d] is add to node[%d] , list len %d" , pConn->id , pNode->id , pList->len);
return TRUE;
}
BOOL mgc_sur_info_remove_conn_to_list(MGC_SUR_INFO_LIST *pList , CONNECT_INFO *pConn)
{
MGC_SUR_INFO_NODE *pNode = NULL;
MGC_SUR_INFO_NODE *pPrior = NULL;
MGC_SUR_INFO_NODE *pNext = NULL;
if((pList == NULL)||(pConn == NULL)||(pList->pHead == NULL))
return FALSE;
pNode = mgc_sur_info_find_conn_in_list(pList, pConn);
if(pNode == NULL)
{
MGC_ERROR("conn[%d] is not find in the list" , pConn->id);
return FALSE;
}
pPrior = pNode->pPrior;
pNext = pNode->pNext;
pPrior->pNext = pNext;
pNext->pPrior = pPrior;
pList->len--;
if(pList->pHead == pNode)
{
pList->pHead = pNext;
}
if((pPrior == pNode)&&(pNext == pNode))
{
if(pList->len != 0)
{
MGC_DEBUG("list shoulde be empty, len %d" , pList->len);
}
pList->pHead = NULL;
}
MGC_DEBUG("conn[%d] is removed from node[%d] list len %d" , pConn->id , pNode->id , pList->len);
mgc_sur_info_node_init(pNode, pNode->id);
return TRUE;
}
void mgc_sur_info_clear_list(MGC_SUR_INFO_LIST *pList)
{
MGC_SUR_INFO_NODE *pNodeTail = NULL;
CONNECT_INFO *pConn = NULL;
MGCP_PARA mgcpPara;
if((pList == NULL)||(pList->pHead == NULL))
return ;
pNodeTail = mgc_sur_info_get_list_tail(pList);
while(pNodeTail != NULL)
{
pConn = pNodeTail->pConn;
if((mgc_connect_get_status(pConn) == MGC_CONNECT_STATUS_CREATED)||(mgc_connect_get_status(pConn) == MGC_CONNECT_STATUS_CREATE))
{
if(mgc_connect_dlcx_para_create(pConn , &mgcpPara) == TRUE)
MGCP_req(mgc_mgcp_get_sap_index(), MGCP_CMD_DLCX , 0xFFFF , &mgcpPara);
}
mgc_tandem_info_unset_conn(pConn->pTandem, pConn);
mgc_chnl_info_detach_connect(pConn->pChnlInfo, pConn);
mgc_connect_init(pConn, pConn->id);
mgc_sur_info_remove_conn_to_list(pList , pConn);
pNodeTail = mgc_sur_info_get_list_tail(pList);
}
if(pList->len != 0)
{
MGC_ERROR("list clear failed!");
}
return;
}
static CHNL_INFO *mgc_sur_info_get_unsed_chnl(void)
{
int i;
CHNL_INFO *pChnlInfo = NULL;
for(i=0 ; i<MGC_MAX_NUM_OF_CHNL ; i++)
{
pChnlInfo = &mgcSurvillianceChnl[i];
if(pChnlInfo->status != MGC_CHNL_INFO_STATUS_UNDEF)
continue;
return pChnlInfo;
}
return NULL;
}
static CONNECT_INFO *mgc_sur_info_get_unsed_conn(void)
{
int i;
CONNECT_INFO *pConnect = NULL;
for(i=0 ; i<MGC_MAX_NUM_OF_CON ; i++)
{
pConnect = &mgcSurvillanceConn[i];
if(pConnect->pChnlInfo != NULL)
continue;
return pConnect;
}
return NULL;
}
#if 0
static BOOL mgc_sur_info_add_conn_to_chnl(CHNL_INFO *pChnlInfo)
{
int i;
CONNECT_INFO *pConn;
if(pChnlInfo == NULL)
return FALSE;
for(i=0 ; i<pChnlInfo->maxConnectNum ; i++)
{
pConn = mgc_sur_info_get_unsed_conn();
if(pConn == NULL)
return FALSE;
if(mgc_chnl_info_attach_connect(pChnlInfo, pConn, i) == FALSE)
return FALSE;
//MGC_DEBUG("surConn[%d] add to chnlInfo[%d]", pConn->id , pChnlInfo->id);
}
return TRUE;
}
#endif
static BOOL mgc_sur_info_add_chnl_to_port(PHY_PORT_INFO *pPhyPort)
{
int i;
CHNL_INFO *pChnlInfo = NULL;
if(pPhyPort == NULL)
return FALSE;
for(i=0 ; i<pPhyPort->chnlNum ; i++)
{
pChnlInfo = mgc_sur_info_get_unsed_chnl();
if(pChnlInfo == NULL)
return FALSE;
pPhyPort->pChnlInfo[i] = pChnlInfo;
if(mgc_chnl_info_attach_to_phy_port(pChnlInfo , pPhyPort) == FALSE)
return FALSE;
// if(mgc_sur_info_add_conn_to_chnl(pChnlInfo) == FALSE)
// return FALSE;
mgc_chnl_info_status_set(pChnlInfo , MGC_CHNL_INFO_STATUS_IDLE);
//MGC_DEBUG("chnlInfo[%d] add to phyPort[%d]" , pChnlInfo->id, pPhyPort->id);
}
return TRUE;
}
static PHY_PORT_INFO *mgc_sur_info_get_unused_phy_port(void)
{
int i;
PHY_PORT_INFO *pPhyPort = NULL;
for(i=0 ; i<MGC_MAX_NUM_OF_PHY_PORT ; i++)
{
pPhyPort = &mgcSurvilliancePort[i];
if((pPhyPort->chnlNum == 0)&&(pPhyPort->pMgInfo == NULL))
return pPhyPort;
}
return NULL;
}
BOOL mgc_sur_info_add_survillance_res(BYTE sapIndex, WORD mgNo)
{
MG_INFO *pMgInfo;
MGC_SAP *pMgcSap;
int i;
BOOL result = FALSE;
PHY_PORT_INFO *pPhyPort = NULL;
pMgInfo = mgc_mg_info_get_index_mg(mgNo);
pMgcSap = mgc_sap_get_index_sap(sapIndex);
if((pMgInfo == NULL)||(pMgcSap == NULL))
return FALSE;
if(pMgInfo->mgAttr.mgType != MGC_MG_TYPE_TANDEM)
return FALSE;
pPhyPort = mgc_sur_info_get_unused_phy_port();
if(pPhyPort == NULL)
return FALSE;
for(i=0 ; i<MGC_MAX_PHY_PORT_PER_MG ; i++)
{
if(pMgInfo->pPhyPort[i] != NULL)
continue;
result = TRUE;
break;
}
if(result == FALSE)
{
MGC_DEBUG("mg[%d] is full of phyport" , pMgInfo->id);
return FALSE;
}
pPhyPort->portType = MGC_PHY_VIRTUAL_TYPE_SURVEILLANCE;
pPhyPort->portNo = i;
pPhyPort->pMgcSap = pMgcSap;
pPhyPort->pMgInfo = pMgInfo;
switch(pMgInfo->mgAttr.ctrlType)
{
case MGC_MG_CTRL_TYPE_MGCP:
mgc_phy_port_set_chnl_num(pPhyPort , pPhyPort->portType);
break;
default:
mgc_phy_port_clear(pPhyPort);
MGC_ERROR("mgcMgInfo[%d] unsupport ctrl type %d" , pMgInfo->id , pMgInfo->mgAttr.ctrlType);
return FALSE;
}
if(mgc_sur_info_add_chnl_to_port(pPhyPort) == FALSE)
{
mgc_phy_port_clear(pPhyPort);
return FALSE;
}
if(mgc_mg_info_attach_phy_port(pMgInfo , pPhyPort, pMgcSap)== FALSE)
{
mgc_phy_port_clear(pPhyPort);
return FALSE;
}
return TRUE;
}
void mgc_sur_info_setup(void)
{
int i;
CONNECT_INFO *pConn = NULL;
CHNL_INFO *pChnl = NULL;
PHY_PORT_INFO *pPhyPort = NULL;
MGC_SUR_INFO_NODE *pNode = NULL;
for(i=0; i<MGC_MAX_NUM_OF_SURVEILLANCE_CONN ; i++)
{
pConn = &mgcSurvillanceConn[i];
mgc_connect_init(pConn , i + MGC_SURVEILLIANCE_CONN_STAR_ID);
}
for(i=0 ; i<MGC_MAX_NUM_OF_SURVEILLANCE_NODE; i++)
{
pNode = &mgcSurvillianceNode[i];
mgc_sur_info_node_init(pNode, i);
}
for(i=0 ; i<MGC_MAX_NUM_OF_SURVEILLIANCE_CHNL; i++)
{
pChnl = &mgcSurvillianceChnl[i];
mgc_chnl_info_init(pChnl, i + MGC_SURVEILLIANCE_CHNL_STAR_ID);
}
for(i=0 ; i<MGC_MAX_NUM_OF_SURVEILLANCE_NUM ; i++)
{
pPhyPort = &mgcSurvilliancePort[i];
mgc_phy_port_init(pPhyPort, i+MGC_SURVEILLIANCE_PHY_PORT_STAR_ID);
}
}
static CONNECT_INFO *mgc_sur_info_find_unattached_conn_in_phy_port(PHY_PORT_INFO *pPhyPort)
{
int i,j;
CONNECT_INFO *pConnect = NULL;
CHNL_INFO *pChnlInfo = NULL;
if(pPhyPort == NULL)
return NULL;
for(i=0 ; i<pPhyPort->chnlNum ; i++)
{
pChnlInfo = pPhyPort->pChnlInfo[i];
if(pChnlInfo == NULL)
{
MGC_WARN("phyPort[%d] lost chnl[%d] info" , pPhyPort->id , i);
continue;
}
for(j=0 ; j<pChnlInfo->maxConnectNum ; j++)
{
pConnect = pChnlInfo->pConnection[j];
if(pConnect == NULL)
{
pConnect = mgc_sur_info_get_unsed_conn();
if(pConnect == NULL)
continue;
if(pConnect->pTandem != NULL)
{
MGC_WARN("surConn[%d] attached illegal tandem[%d]", pConnect->id, pConnect->pTandem->id);
mgc_connect_init(pConnect, pConnect->id);
continue;
}
if(mgc_chnl_info_attach_connect(pChnlInfo, pConnect, j) == FALSE)
continue;
return pConnect;
}
}
}
MGC_DEBUG("no unattached conn find in phyport[%d]" , pPhyPort->id);
return NULL;
}
CONNECT_INFO *mgc_sur_info_find_sur_conn_in_mg(MG_INFO *pMgInfo)
{
int i;
CONNECT_INFO *pConnect = NULL;
PHY_PORT_INFO *pPhyPort = NULL;
if((pMgInfo == NULL)||(pMgInfo->mgAttr.mgType != MGC_MG_TYPE_TANDEM))
return NULL;
for(i=0 ; i<MGC_MAX_PHY_PORT_PER_MG ; i++)
{
pPhyPort = pMgInfo->pPhyPort[i];
if(pPhyPort == NULL)
continue;
if(pPhyPort->portType != MGC_PHY_VIRTUAL_TYPE_SURVEILLANCE)
continue;
break;
}
if(pPhyPort == NULL)
{
MGC_ERROR("no surveillant port find in mg[%d]" , pMgInfo->id);
return NULL;
}
pConnect = mgc_sur_info_find_unattached_conn_in_phy_port(pPhyPort);
return pConnect;
}

File diff suppressed because it is too large Load Diff