/****************************************************************/ /* MGC Implementation Program */ /* Version 9.0.1 */ /* Designed By Ying Min */ /* Last Update: 2007-4-17 */ /****************************************************************/ #include "./include/mgc_pub.h" #include "./include/mgc.h" #include "./include/mgc_const.h" #include "./include/mgc_def.h" #include "./include/mgc_struct.h" #include "./include/mgc_fsm.h" #include "./include/mgc_debug.h" #include "./include/mgc_sess_ctl.h" #include "../../snmp/src/include/snmp.h" #include "../../public/src/include/license_id.h" int mgc_is_non_virtual_mg(BYTE mgType) { if ((mgType > MGC_MG_TYPE_INTERNAL) && (mgType < MGC_MG_TYPE_ANN)) { return 1; } else { return 0; } } int mgc_codec_to_payload(BYTE codec) { if (codec== MGC_VCTYPE_GSM) return 3; else if (codec == MGC_VCTYPE_GSM_EFR) return 84; else if (codec == MGC_VCTYPE_AMR_12_2) return 71; else if (codec== MGC_VCTYPE_G729B) return 118; else if (codec== MGC_VCTYPE_PCMU) return 0; else if(codec == MGC_VCTYPE_AMR_10_2) return 70; else if(codec == MGC_VCTYPE_AMR_7_95) return 69; else if(codec == MGC_VCTYPE_AMR_7_4) return 68; else if(codec == MGC_VCTYPE_AMR_6_7) return 67; else if(codec == MGC_VCTYPE_AMR_5_15) return 65; else if(codec == MGC_VCTYPE_AMR_5_9) return 66; else if(codec == MGC_VCTYPE_AMR_4_75) return 64; return 8; } int mgc_8ecp_update_mg_status(BYTE mgNo, BYTE status) { char tmpStr[128]; if (mgcMgInfo[mgNo].created == 0) { sprintf(tmpStr, "mgc_8ecp_update_mg_status: MG not created, mgNo = %d\n\r", mgNo); mgc_log_err(tmpStr); return -1; } mgcMgInfo[mgNo].stLast = status; if (1 == mgcMgInfo[mgNo].mgAttr.e1cardNo) { if ((1 == status) && ((0 == mgc_e1card0_mgNo) || (0 == mgcMgInfo[mgc_e1card0_mgNo].stLast))) { mgc_8k_tone_card_silent = 1; } else { mgc_8k_tone_card_silent = 0; } } else if (0 == mgcMgInfo[mgNo].mgAttr.e1cardNo) { if ((0 == status) && (0 != mgc_e1card1_mgNo) && (1 == mgcMgInfo[mgc_e1card1_mgNo].stLast)) { 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) { WORD portIndex; char tmpStr[128]; if (mgcMgInfo[mgNo].created == 0) { sprintf(tmpStr, "mgc_8ecp_update_trk_status: MG not created, mgNo = %d\n\r", mgNo); mgc_log_err(tmpStr); return -1; } if (trkNo >= MGC_8ECP_MAX_TRK_PER_MG) { sprintf(tmpStr, "mgc_8ecp_update_trk_status: invalid trkNo, trkNo = %d\n\r", trkNo); mgc_log_err(tmpStr); return -1; } portIndex = mgcMgInfo[mgNo].portIndex[trkNo]; if (portIndex >= MGC_MAX_NUM_OF_PHY_PORT) return -1; mgcPhyPort[portIndex].stLast = status; return 0; } int mgc_bind_8ecp() { sprintf(mgc8ecpSap.name, "MGC"); mgc8ecpSap.update_mg_status = mgc_8ecp_update_mg_status; mgc8ecpSap.update_trk_status = mgc_8ecp_update_trk_status; if ((mgc8ecpSapIndex = _8ecp_bind(&mgc8ecpSap)) < 0) return -1; return 0; } int mgc_find_mg_by_name(char *mgName, WORD localPort, DWORD ip) { WORD i; char tmpStr[128]; BYTE usrType; if (MGC_MG_NETWORK_PORT == localPort) { usrType = MGC_USER_TYPE_MG; } else { usrType = MGC_USER_TYPE_MGC; } for (i = 0; i < MGC_MAX_NUM_OF_MG; i++) { if (mgcMgInfo[i].created == 0) continue; if ((strcmp(mgcMgInfo[i].mgAttr.domain, mgName) == 0) && (mgcMgInfo[i].usrType == usrType)) return i; } sprintf(tmpStr, "mgc_find_mg_by_name: invalid mgName: %s, ip: %ld\n\r", mgName, ip); mgc_log_err(tmpStr); return -1; } int mgc_codec_str_to_api(char *codec) { if (strcmp(codec, "PCMA") == 0) return MGC_VCTYPE_PCMA; else if (strcmp(codec, "PCMU") == 0) return MGC_VCTYPE_PCMU; else if (strcmp(codec, "GSM") == 0) return MGC_VCTYPE_GSM; else if (strcmp(codec, "GSM-EFR") == 0) return MGC_VCTYPE_GSM_EFR; else if (strcmp(codec, "AMR") == 0) return MGC_VCTYPE_AMR_12_2; else if (strcmp(codec, "G729B") == 0) return MGC_VCTYPE_G729B; else if (strcmp(codec, "AMR_12_2") == 0) return MGC_VCTYPE_AMR_12_2; else if (strcmp(codec, "AMR_10_2") == 0) return MGC_VCTYPE_AMR_10_2; else if (strcmp(codec, "AMR_7_95") == 0) return MGC_VCTYPE_AMR_7_95; else if (strcmp(codec, "AMR_7_4") == 0) return MGC_VCTYPE_AMR_7_4; else if (strcmp(codec, "AMR_6_7") == 0) return MGC_VCTYPE_AMR_6_7; else if (strcmp(codec, "AMR_5_15") == 0) return MGC_VCTYPE_AMR_5_15; else if (strcmp(codec, "AMR_5_9") == 0) return MGC_VCTYPE_AMR_5_9; else if (strcmp(codec, "AMR_4_75") == 0) return MGC_VCTYPE_AMR_4_75; return MGC_VCTYPE_PCMA; } void mgc_connect_init(WORD connectIndex) { memset((BYTE *) &mgcConnectInfo[connectIndex], 0, sizeof(CONNECT_INFO)); mgcConnectInfo[connectIndex].port = 0xFFFF; mgcConnectInfo[connectIndex].chlIndex = 0xFFFF; mgcConnectInfo[connectIndex].aasChnl.mgNo = 0xFFFF; mgcConnectInfo[connectIndex].aasChnl.portNo = 0xFF; mgcConnectInfo[connectIndex].aasChnl.chlNo = 0xFFFF; mgcConnectInfo[connectIndex].aasChnl.connectNo = 0xFFFF; } int mgc_assign_connect_to_chnl(CHNL chnl) { WORD portIndex; WORD chnlIndex; WORD connectIndex = mgc_select_connection; CHNL_INFO *chnlInfo; int i; if (connectIndex >= MGC_MAX_NUM_OF_CON) { mgc_log_err("mgc_select_connection may be changed\n\r"); connectIndex = 0; } for (i = 0; i < MGC_MAX_NUM_OF_CON; i++) { if (1 == mgcConnectInfo[connectIndex].assigned) { if (++connectIndex >= MGC_MAX_NUM_OF_CON) { connectIndex = 0; } continue; } else { mgc_connect_init(connectIndex); if ((MGC_MG_TYPE_ANN == mgcMgInfo[chnl.mgNo].mgAttr.mgType) || (MGC_MG_TYPE_INTERNAL == mgcMgInfo[chnl.mgNo].mgAttr.mgType)) { chnlIndex = mgcMgInfo[chnl.mgNo].chnlStartIndex + chnl.chlNo; }//add by Francis else { portIndex = mgcMgInfo[chnl.mgNo].portIndex[chnl.portNo]; if (portIndex >= MGC_MAX_NUM_OF_PHY_PORT) { mgc_log_err("mgc_assign_connect_to_chnl: phy portIndex out of range!\n\r"); return -1; } chnlIndex = mgcPhyPort[portIndex].chnlStartIndex + chnl.chlNo; } if (chnlIndex >= MGC_MAX_NUM_OF_CHNL) { mgc_log_err("mgc_assign_connect_to_chnl: chnlIndex out of range!\n\r"); return -1; } chnlInfo = &mgcChnl[chnlIndex]; if ((chnlInfo->connectIndex[chnl.connectNo] >= MGC_MAX_NUM_OF_CON) || (mgcConnectInfo[chnlInfo->connectIndex[chnl.connectNo]].assigned != 1)) { chnlInfo->connectIndex[chnl.connectNo] = connectIndex; mgcConnectInfo[connectIndex].assigned = 1; mgcConnectInfo[connectIndex].status = MGC_CONNECT_STATUS_IDLE; mgcConnectInfo[connectIndex].chlIndex = chnlIndex; mgc_select_connection = connectIndex + 1; if (mgc_select_connection >= MGC_MAX_NUM_OF_CON) { mgc_select_connection = 0; } return connectIndex; } else { if ((chnlInfo->connectIndex[chnl.connectNo] < MGC_MAX_NUM_OF_CON) && (mgcConnectInfo[chnlInfo->connectIndex[chnl.connectNo]].assigned == 1)) { mgc_log_err("mgc_assign_connect_to_chnl: one connect already created on chnl's connectNo\n\r"); return chnlInfo->connectIndex[chnl.connectNo]; } return -1; } } } mgc_log_err("mgc_assign_connect_to_chnl: connect resource is not sufficient\n\r"); return -1; } int mgc_assign_connect(CHNL *chnl, WORD *chnlConnectIndex) { WORD portIndex; WORD chnlIndex; CHNL_INFO *chnlInfo; WORD connectIndex = mgc_select_connection; int i; int j; if (connectIndex >= MGC_MAX_NUM_OF_CON) { mgc_log_err("mgc_select_connection may be changed\n\r"); connectIndex = 0; } for (i = 0; i < MGC_MAX_NUM_OF_CON; i++) { if (1 == mgcConnectInfo[connectIndex].assigned) { if (++connectIndex >= MGC_MAX_NUM_OF_CON) { connectIndex = 0; } continue; } else { mgc_connect_init(connectIndex); if (MGC_MG_TYPE_ANN == mgcMgInfo[chnl->mgNo].mgAttr.mgType) { chnlIndex = mgcMgInfo[chnl->mgNo].chnlStartIndex + chnl->chlNo; }//add by Francis else { portIndex = mgcMgInfo[chnl->mgNo].portIndex[chnl->portNo]; if (portIndex >= MGC_MAX_NUM_OF_PHY_PORT) { mgc_log_err("mgc_assign_connect: phy portIndex out of range!\n\r"); return -1; } chnlIndex = mgcPhyPort[portIndex].chnlStartIndex + chnl->chlNo; } if (chnlIndex >= MGC_MAX_NUM_OF_CHNL) { mgc_log_err("mgc_assign_connect: chnlIndex out of range!\n\r"); return -1; } chnlInfo = &mgcChnl[chnlIndex]; for (j = 0; j < MGC_MAX_NUM_OF_CHNL_CON; j++) { if ((chnlInfo->connectIndex[j] < MGC_MAX_NUM_OF_CON) && (mgcConnectInfo[chnlInfo->connectIndex[j]].assigned == 1)) { continue; } else { chnlInfo->connectIndex[j] = connectIndex; *chnlConnectIndex = j; chnl->connectNo = j; mgcConnectInfo[connectIndex].assigned = 1; mgcConnectInfo[connectIndex].status = MGC_CONNECT_STATUS_IDLE; mgcConnectInfo[connectIndex].chlIndex = chnlIndex; mgc_select_connection = connectIndex + 1; if (mgc_select_connection >= MGC_MAX_NUM_OF_CON) { mgc_select_connection = 0; } return connectIndex; } } mgc_log_err("mgc_assign_connect: chnl connect resource is not sufficient\n\r"); return -1; } } mgc_log_err("mgc_assign_connect: connect resource is not sufficient\n\r"); return -1; } void mgc_remove_connect(WORD chnl) { int i; for (i = 0; i < MGC_MAX_NUM_OF_CON; i++) { if ((mgcConnectInfo[i].assigned != 1) || (mgcConnectInfo[i].chlIndex != chnl)) { continue; } else { mgc_connect_init(i); } } } int mgc_release_connect(CHNL *chnl) { WORD portIndex; WORD chnlIndex; WORD connectIndex; CHNL_INFO *chnlInfo; if (MGC_MG_TYPE_ANN == mgcMgInfo[chnl->mgNo].mgAttr.mgType) { chnlIndex = mgcMgInfo[chnl->mgNo].chnlStartIndex + chnl->chlNo; chnlInfo = &mgcChnl[chnlIndex]; }//add by Francis else { portIndex = mgcMgInfo[chnl->mgNo].portIndex[chnl->portNo]; chnlIndex = mgcPhyPort[portIndex].chnlStartIndex + chnl->chlNo; chnlInfo = &mgcChnl[chnlIndex]; } if (((connectIndex = chnlInfo->connectIndex[chnl->connectNo]) >= MGC_MAX_NUM_OF_CON) || (mgcConnectInfo[connectIndex].chlIndex != chnlIndex)) { mgc_log_err("mgc_release_connect: the chnl connectNo has no connection\n\r"); return -1; } else { mgc_connect_init(connectIndex); if (chnlInfo->connectNum > 0) { chnlInfo->connectNum--; } else { chnlInfo->connectNum = 0; } } return 0; } int mgc_find_connect_by_con_id(CHNL *Chnl, char *conId) { int i; WORD portIndex; WORD chnlIndex; CHNL_INFO *chnlInfo; WORD chnlConnectIndex; WORD connectIndex; if (MGC_MG_TYPE_ANN == mgcMgInfo[Chnl->mgNo].mgAttr.mgType) { chnlIndex = mgcMgInfo[Chnl->mgNo].chnlStartIndex + Chnl->chlNo; }//add by Francis else { portIndex = mgcMgInfo[Chnl->mgNo].portIndex[Chnl->portNo]; if (portIndex >= MGC_MAX_NUM_OF_PHY_PORT) { mgc_log_err("mgc_find_connect_by_con_id: portIndex out of range!\r\n"); return -1; } chnlIndex = mgcPhyPort[portIndex].chnlStartIndex + Chnl->chlNo; } if (chnlIndex >= MGC_MAX_NUM_OF_CHNL) { mgc_log_err("mgc_find_connect_by_con_id: chnlIndex out of range!\r\n"); return -1; } chnlInfo = &mgcChnl[chnlIndex]; if (mgcMgInfo[Chnl->mgNo].usrType == MGC_USER_TYPE_MG) { chnlConnectIndex = strtoll(conId, NULL, 16) >> 48; if ((chnlConnectIndex >= MGC_MAX_NUM_OF_CHNL_CON) || (chnlInfo->connectIndex[chnlConnectIndex] >= MGC_MAX_NUM_OF_CON) || (strcmp(conId, mgcConnectInfo[chnlInfo->connectIndex[chnlConnectIndex]].mediaAttr.conId) != 0)) return -1; else return chnlConnectIndex; } else if (mgcMgInfo[Chnl->mgNo].usrType == MGC_USER_TYPE_MGC) { for (i = 0; i < MGC_MAX_NUM_OF_CHNL_CON; i++) { if ((connectIndex = chnlInfo->connectIndex[i]) >= MGC_MAX_NUM_OF_CON) { continue; } else { if ((0 == strcmp(conId, mgcConnectInfo[connectIndex].mediaAttr.conId)) && (chnlIndex == mgcConnectInfo[connectIndex].chlIndex)) { return i; } } } return -1; } else return -1; } int mgc_extract_media_info(BYTE flag, BYTE cmd, MGCP_PARA *para, WORD port)//new replace //int mgc_extract_media_info(BYTE flag, MGCP_PARA *para, CHNL *mgcfChnl) { WORD portIndex; WORD chnlIndex; CHNL_INFO *chnlInfo; CHNL *mgcfChnl; int connectIndex; int chnlConnectIndex;//new replace PORT_INFO *portInfo; portInfo = &mgcPort[port]; mgcfChnl = &portInfo->mgcfChnl;//new replace if (((MGC_MG_TYPE_ANN != mgcMgInfo[mgcfChnl->mgNo].mgAttr.mgType) && (mgcfChnl->portNo >= MGC_MAX_PHY_PORT_PER_MG)) || (mgcfChnl->chlNo >= MGC_MAX_NUM_OF_CHNL)) return 0; if ((MGC_MG_TYPE_ANN == mgcMgInfo[mgcfChnl->mgNo].mgAttr.mgType) || (MGC_MG_TYPE_INTERNAL == mgcMgInfo[mgcfChnl->mgNo].mgAttr.mgType)) { chnlIndex = mgcMgInfo[mgcfChnl->mgNo].chnlStartIndex + mgcfChnl->chlNo; }//add by Francis else { portIndex = mgcMgInfo[mgcfChnl->mgNo].portIndex[mgcfChnl->portNo]; if (portIndex >= MGC_MAX_NUM_OF_PHY_PORT) { mgc_log_err("mgc_extract_media_info: phy portIndex out of range!\n\r"); return -1; } chnlIndex = mgcPhyPort[portIndex].chnlStartIndex + mgcfChnl->chlNo; } if (chnlIndex >= MGC_MAX_NUM_OF_CHNL) { mgc_log_err("mgc_extract_media_info: chnlIndex out of range!\n\r"); return -1; } chnlInfo = &mgcChnl[chnlIndex]; if (flag == MGCP_RESPONSE) { if ((MGC_MG_TYPE_ANN != mgcMgInfo[mgcfChnl->mgNo].mgAttr.mgType) && (MGCP_CMD_CRCX == cmd) && (((para->flag & MGCP_PARA_FLAG_I) != MGCP_PARA_FLAG_I) || ((para->flag & MGCP_PARA_FLAG_SDP) != MGCP_PARA_FLAG_SDP))) { mgc_log_err("mgc_extract_media_info: crcx response miss para!!\n\r"); return -4; } if (mgcfChnl->connectNo != mgcPort[port].mgcfOperSteps[mgcPort[port].mgcfOperStepIndex].chnlConnectIndex) { mgc_log_err("mgc_extract_media_info: connectNo is mismatch!\n\r"); return -1; } if((MGCP_CMD_AUEP != cmd) && (MGCP_CMD_RQNT != cmd) && (MGCP_CMD_RSIP != cmd)) { connectIndex = chnlInfo->connectIndex[mgcPort[port].mgcfOperSteps[mgcPort[port].mgcfOperStepIndex].chnlConnectIndex]; } if (connectIndex >= MGC_MAX_NUM_OF_CON) { mgc_log_err("mgc_extract_media_info: chnl's connection released\n\r"); return -1; } if ((para->flag & MGCP_PARA_FLAG_I) == MGCP_PARA_FLAG_I) { strcpy(mgcConnectInfo[connectIndex].mediaAttr.conId, para->i.conId); } if ((para->flag & MGCP_PARA_FLAG_O) == MGCP_PARA_FLAG_O) { chnlInfo->comMediaAttr.pkgEvent = (para->o.package << 8) | para->o.event; if ((MGCP_CMD_AUEP != cmd) && (MGCP_CMD_RQNT != cmd)) mgcConnectInfo[connectIndex].mediaAttr.pkgEvent = (para->o.package << 8) | para->o.event; } } else { if (MGCP_CMD_CRCX == cmd) { if ((MGC_MG_TYPE_ANN == mgcMgInfo[mgcfChnl->mgNo].mgAttr.mgType) && ((para->flag & MGCP_PARA_FLAG_SDP) != MGCP_PARA_FLAG_SDP)) { mgc_log_err("mgc_extract_media_info: crcx command miss sdp!!\n\r"); return -2; } if ((connectIndex = mgc_assign_connect(mgcfChnl, &mgcPort[port].mgcfOperSteps[0].chnlConnectIndex)) < 0) { mgc_log_err("mgc_extract_media_info: assign connect failed\n\r"); return -3; } mgcPort[port].mgcfOperStepsNum = 1; } else if ((MGCP_CMD_MDCX == cmd) || (MGCP_CMD_DLCX == cmd)) { if ((chnlConnectIndex = mgc_find_connect_by_con_id(mgcfChnl, para->i.conId)) < 0) { mgc_log_err("mgc_extract_media_info: find connect by id failed\n\r"); return -1; } mgcfChnl->connectNo = chnlConnectIndex; connectIndex = chnlInfo->connectIndex[chnlConnectIndex]; } else if((MGCP_CMD_NTFY == cmd)&&((para->flag & MGCP_PARA_FLAG_O) == MGCP_PARA_FLAG_O)) { chnlInfo->comMediaAttr.pkgEvent = (para->o.package << 8) | para->o.event; return 0; } /* else { if (0xFFFF == (connectIndex = chnlInfo->connectIndex[0])) { mgc_log_err("mgc_extract_media_info: chnl's 0 connection released\n\r"); return -1; } } */ if (connectIndex >= MGC_MAX_NUM_OF_CON) { mgc_log_err("mgc_extract_media_info: chnl's connection released\n\r"); return -1; } if ((para->flag & MGCP_PARA_FLAG_L) == MGCP_PARA_FLAG_L) { mgcConnectInfo[connectIndex].mediaAttr.ecDisable = para->l.ecDisable; mgcConnectInfo[connectIndex].mediaAttr.ssDisable = para->l.ssDisable; mgcConnectInfo[connectIndex].mediaAttr.ptime = para->l.p; mgcConnectInfo[connectIndex].mediaAttr.vocoderType = mgc_codec_str_to_api(para->l.codec); } if ((para->flag & MGCP_PARA_FLAG_M) == MGCP_PARA_FLAG_M) mgcConnectInfo[connectIndex].mediaAttr.conMode = para->m.mode; if ((para->flag & MGCP_PARA_FLAG_C) == MGCP_PARA_FLAG_C) strcpy(mgcConnectInfo[connectIndex].mediaAttr.callId, para->c.callId); if ((para->flag & MGCP_PARA_FLAG_O) == MGCP_PARA_FLAG_O) { chnlInfo->comMediaAttr.pkgEvent = (para->o.package << 8) | para->o.event; mgcConnectInfo[connectIndex].mediaAttr.pkgEvent = (para->o.package << 8) | para->o.event; } if ((para->flag & MGCP_PARA_FLAG_S) == MGCP_PARA_FLAG_S) { chnlInfo->comMediaAttr.pkgSignal = (para->s.pkg << 8) | para->s.signal; mgcConnectInfo[connectIndex].mediaAttr.pkgSignal = (para->s.pkg << 8) | para->s.signal; } } if ((para->flag & MGCP_PARA_FLAG_SDP) == MGCP_PARA_FLAG_SDP) { if (flag == MGCP_RESPONSE) { if ((portInfo->mgcfOperSteps[portInfo->mgcfOperStepIndex].flag & MGCP_PARA_FLAG_TFO) == MGCP_PARA_FLAG_TFO) { mgcConnectInfo[connectIndex].flag |= MGCP_PARA_FLAG_TFO; memcpy(para->sdp.medias.medias, mgcConnectInfo[connectIndex].mediaAttr.sdp.medias.medias, sizeof(PUB_SDP_MEDIA) * 8); } else { mgcConnectInfo[connectIndex].flag &= ~MGCP_PARA_FLAG_TFO; } } /* if (mgcMgInfo[mgcfChnl->mgNo].mgAttr.mgType != MGC_MG_TYPE_ANN) { num = para->sdp.medias.medias[0].m.plNum; for (i = 0; i < mgcMgInfo[mgcfChnl->mgNo].mgAttr.codecList.num; i++) { para->sdp.medias.medias[0].m.payloads[num + i] = mgc_codec_to_payload(mgcMgInfo[mgcfChnl->mgNo].mgAttr.codecList.codec[i]); para->sdp.medias.medias[0].m.plNum++; if (para->sdp.medias.medias[0].m.plNum >= 8) break; } }*/ //memcpy((BYTE *) &chnlInfo->mediaAttr.sdp, (BYTE *) ¶->sdp, sizeof(PUB_SDP_MSG)); memcpy((BYTE *) &mgcConnectInfo[connectIndex].mediaAttr.sdp, (BYTE *) ¶->sdp, sizeof(PUB_SDP_MSG)); } if ((MGCP_CMD_AUEP != cmd) && (MGCP_CMD_RQNT != cmd)) { if ((mgcConnectInfo[connectIndex].mediaAttr.sdp.medias.medias[0].flag & PUB_SDP_FLAG_C) != PUB_SDP_FLAG_C) //if ((chnlInfo->mediaAttr.sdp.medias.medias[0].flag & PUB_SDP_FLAG_C) != PUB_SDP_FLAG_C) { //memcpy(&chnlInfo->mediaAttr.sdp.medias.medias[0].c, &chnlInfo->mediaAttr.sdp.c, sizeof(PUB_SDP_C)); //chnlInfo->mediaAttr.sdp.medias.medias[0].flag |= PUB_SDP_FLAG_C; memcpy(&mgcConnectInfo[connectIndex].mediaAttr.sdp.medias.medias[0].c, &mgcConnectInfo[connectIndex].mediaAttr.sdp.c, sizeof(PUB_SDP_C)); mgcConnectInfo[connectIndex].mediaAttr.sdp.medias.medias[0].flag |= PUB_SDP_FLAG_C; } /* num = mgcConnectInfo[connectIndex].mediaAttr.sdp.medias.medias[0].attrs.num; //num = chnlInfo->mediaAttr.sdp.medias.medias[0].attrs.num; if (num < PUB_SDP_MAX_ATTR_NUM) { //chnlInfo->mediaAttr.sdp.medias.medias[0].attrs.attrs[num].aType = PUB_SDP_ATTR_TYPE_PTIME; //sprintf(chnlInfo->mediaAttr.sdp.medias.medias[0].attrs.attrs[num].aValue, "%d", chnlInfo->mediaAttr.ptime); //chnlInfo->mediaAttr.sdp.medias.medias[0].attrs.num++; mgcConnectInfo[connectIndex].mediaAttr.sdp.medias.medias[0].attrs.attrs[num].aType = PUB_SDP_ATTR_TYPE_PTIME; sprintf(mgcConnectInfo[connectIndex].mediaAttr.sdp.medias.medias[0].attrs.attrs[num].aValue, "%d", mgcConnectInfo[connectIndex].mediaAttr.ptime); mgcConnectInfo[connectIndex].mediaAttr.sdp.medias.medias[0].attrs.num++; }*/ } return 0; } void mgc_port_init(WORD port) { memset((BYTE *) &mgcPort[port], 0, sizeof(PORT_INFO)); } int mgc_get_port() { WORD i; WORD port = mgcSelectPort; if (port >= MGC_MAX_NUM_OF_PORT) { mgc_log_err("mgcSelectPort may be changed\n\r"); port = 0; } for (i = 0; i < MGC_MAX_NUM_OF_PORT; i++) { if (mgcPort[port].assigned != 0) { if (++port >= MGC_MAX_NUM_OF_PORT) { port = 0; } continue; } mgcPort[port].assigned = 1; mgcSelectPort = port + 1; if (mgcSelectPort >= MGC_MAX_NUM_OF_PORT) { mgcSelectPort = 0; } return port; } return -1; } int mgc_mgcp_ind(BYTE cmd, WORD *usrPort, WORD hdlPort, MGCP_PARA *para) { int ret; int port; int mgNo; PORT_INFO *portInfo; MGCP_SL *sl; WORD portIndex = 0xFFFF, chnlIndex = 0xFFFF; char tmpStr[128]; MG_ATTR *mgAttr; WORD associPort; if (para == NULL) { mgc_log_err("mgc_mgcp_ind: para is NULL\n\r"); return -1; } if ((para->flag & MGCP_PARA_FLAG_SL) != MGCP_PARA_FLAG_SL) { mgc_log_err("mgc_mgcp_ind: missing start line\n\r"); return -1; } sl = ¶->sl; if ((mgNo = mgc_find_mg_by_name(sl->mgName, para->localPort, para->ip)) < 0) { mgc_log_err("mgc_mgcp_ind: can't find the mgName\n\r"); return -1; } if ((mgcMgInfo[mgNo].portIndex[sl->trkNum] >= MGC_MAX_NUM_OF_PHY_PORT) && (cmd == MGCP_CMD_RSIP)) { mgcMgcpPara.ip = mgcMgInfo[mgNo].mgAttr.ip; if (mgcMgInfo[mgNo].usrType == MGC_USER_TYPE_MGC) { mgcMgcpPara.localPort = MGC_MGCP_MGC_PORT; mgcMgcpPara.peerPort = MGC_MGCP_MG_PORT; } else { mgcMgcpPara.localPort = MGC_MGCP_MG_PORT; mgcMgcpPara.peerPort = MGC_MGCP_MGC_PORT; } mgcMgcpPara.flag = 0; mgcMgcpPara.sl.cmdRes = MGCP_RESPONSE; mgcMgcpPara.flag |= MGCP_PARA_FLAG_SL; MGCP_rsp(mgcMgcpSapIndex, cmd, 0xFFFF, hdlPort, 200, &mgcMgcpPara); return 0; } if ((port = mgc_get_port()) < 0) { mgc_log_err("mgc_mgcp_ind: can't allocate port\n\r"); return -1; } mgAttr = &mgcMgInfo[mgNo].mgAttr; portInfo = &mgcPort[port]; portInfo->mgcfState = MGC_MGCF_STATE_INDICATION; portInfo->llPort = hdlPort; portInfo->llCmd = cmd; if (mgcMgInfo[mgNo].usrType == MGC_USER_TYPE_MG) portInfo->ip = para->ip; portInfo->mgcfChnl.mgNo = mgNo; portInfo->mgcfChnl.portNo = sl->trkNum; portInfo->mgcfChnl.chlNo = sl->chlNum; if ((MGCP_CMD_CRCX == cmd) || (MGCP_CMD_MDCX == cmd) || (MGCP_CMD_DLCX == cmd)||(MGCP_CMD_NTFY == cmd)) { if ((ret = mgc_extract_media_info(MGCP_COMMAND, cmd, para, port)) < 0) { if (ret == -2) { mgc_log_err("mgc_mgcp_ind: crcx command to aas miss sdp!\n\r"); mgc_port_init(port); return -1; } else if (ret == -3) { mgc_log_err("mgc_mgcp_ind: aas mg no connection resource!\n\r"); mgc_port_init(port); return -1; } else { mgc_log_err("mgc_mgcp_ind: extract media info failed!\n\r"); mgc_port_init(port); return -1; } } } *usrPort = port; if (sl->trkNum < MGC_MAX_PHY_PORT_PER_MG) { portIndex = mgcMgInfo[mgNo].portIndex[sl->trkNum]; if ((portIndex < MGC_MAX_NUM_OF_PHY_PORT) && (sl->chlNum < mgcPhyPort[portIndex].chnlNum)) chnlIndex = mgcPhyPort[portIndex].chnlStartIndex + sl->chlNum; } else { chnlIndex = mgcMgInfo[mgNo].chnlStartIndex + sl->chlNum; } sprintf(tmpStr, "mgc_mgcp_ind: succeed, cmd = %d, usrPort = %d, hdlPort = %d, mgNo: %d, portNo: %d, chlNo: %d\n\r", cmd, port, hdlPort, portInfo->mgcfChnl.mgNo, portInfo->mgcfChnl.portNo, portInfo->mgcfChnl.chlNo); mgc_log_procedure(mgNo, portIndex, chnlIndex, tmpStr); if ((mgcMgInfo[mgNo].usrType == MGC_USER_TYPE_MGC) && (cmd != MGCP_CMD_RSIP) && (cmd != MGCP_CMD_NTFY)) { if ((portInfo->mgcfChnl.connectNo >= MGC_MAX_NUM_OF_CHNL_CON) || (mgcChnl[chnlIndex].connectIndex[portInfo->mgcfChnl.connectNo] >= MGC_MAX_NUM_OF_CON)) { mgc_log_err("mgc_mgcp_ind: connectNo >= MGC_MAX_NUM_OF_CHNL_CON\n\r"); mgc_port_init(port); return -1; } associPort = mgcConnectInfo[mgcChnl[chnlIndex].connectIndex[portInfo->mgcfChnl.connectNo]].port; if ((associPort < MGC_MAX_NUM_OF_PORT) && (mgcPort[associPort].assigned != 0)) { mgcPort[associPort].mngCmd = MGC_MNG_CMD_CLEAR_AFTER_OPER; mgc_log_err("mgc_mgcp_ind: DLCX recved from MG, Chnl clear remain connection operation !\n\r"); mgcMgcpPara.ip = mgcMgInfo[mgNo].mgAttr.ip; mgcMgcpPara.localPort = MGC_MGCP_MGC_PORT; mgcMgcpPara.peerPort = MGC_MGCP_MG_PORT; mgcMgcpPara.flag = 0; mgcMgcpPara.sl.cmdRes = MGCP_RESPONSE; mgcMgcpPara.flag |= MGCP_PARA_FLAG_SL; MGCP_rsp(mgcMgcpSapIndex, cmd, port, hdlPort, 250, &mgcMgcpPara); // mgc_connect_init(mgcChnl[chnlIndex].connectIndex[portInfo->mgcfChnl.connectNo]); mgc_port_init(port); } } return 0; } int mgc_mgcp_cnf(BYTE cmd, WORD usrPort, WORD hdlPort, WORD retCode, MGCP_PARA *para) { char tmpStr[128]; if (usrPort >= MGC_MAX_NUM_OF_PORT) { sprintf(tmpStr, "mgc_mgcp_cnf, invalid usrPort = %d, hdlPort = %d, cmd = %d, retCode = %d\n\r", usrPort, hdlPort, cmd, retCode); mgc_log_err(tmpStr); return -1; } if (mgcPort[usrPort].llPort != hdlPort) { sprintf(tmpStr, "mgc_mgcp_cnf, mismatched llport = %d, hdlPort = %d, cmd = %d, retCode = %d\n\r", mgcPort[usrPort].llPort, hdlPort, cmd, retCode); mgc_log_err(tmpStr); return -1; } if (mgcPort[usrPort].mgcfOperSteps[mgcPort[usrPort].mgcfOperStepIndex].cmd != cmd) { sprintf(tmpStr, "mgc_mgcp_cnf, mismatched cmd = %d, hdlPort = %d, cmd = %d, retCode = %d\n\r", mgcPort[usrPort].mgcfOperSteps[mgcPort[usrPort].mgcfOperStepIndex].cmd, hdlPort, cmd, retCode); mgc_log_err(tmpStr); return -1; } if (((MGCP_CMD_CRCX == cmd) && (retCode == 200)) || (MGCP_CMD_MDCX == cmd)) { // mgc_extract_media_info(MGCP_RESPONSE, para, &mgcPort[usrPort].mgcfChnl); if (mgc_extract_media_info(MGCP_RESPONSE, cmd, para, usrPort) < 0)//new replace { sprintf(tmpStr, "mgc_mgcp_cnf: extract_media fail cmd = %d, hdlPort = %d, retCode = %d\n\r", cmd, hdlPort, retCode); mgc_log_err(tmpStr); return -1; } } mgcPort[usrPort].llCmd = retCode; return 0; } int mgc_bind_mgcp() { sprintf(mgcMgcpSap.name, "MGC"); mgcMgcpSap.MGCP_ind = mgc_mgcp_ind; mgcMgcpSap.MGCP_cnf = mgc_mgcp_cnf; if ((mgcMgcpSapIndex = mgcp_bind(&mgcMgcpSap)) < 0) return -1; return 0; } void mgc_chnl_init(WORD chnl) { memset((BYTE *) &mgcChnl[chnl], 0, sizeof(CHNL_INFO)); memset((BYTE *) mgcChnl[chnl].connectIndex, 0xFFFF, sizeof(WORD)*MGC_MAX_NUM_OF_CHNL_CON);//new replace mgcChnl[chnl].port = 0xFFFF; mgcChnl[chnl].sapIndex = 0xFF; } int mgc_vc_name_init() { strcpy(vcName[MGC_VCTYPE_PCMA], "PCMA"); strcpy(vcName[MGC_VCTYPE_PCMU], "PCMU"); strcpy(vcName[MGC_VCTYPE_GSM], "GSM"); strcpy(vcName[MGC_VCTYPE_GSM_EFR], "GSM-EFR"); strcpy(vcName[MGC_VCTYPE_AMR_12_2], "AMR_12_2"); strcpy(vcName[MGC_VCTYPE_G729B], "G729B"); strcpy(vcName[MGC_VCTYPE_AMR_10_2], "AMR_10_2"); strcpy(vcName[MGC_VCTYPE_AMR_7_95], "AMR_7_95"); strcpy(vcName[MGC_VCTYPE_AMR_7_4], "AMR_7_4"); strcpy(vcName[MGC_VCTYPE_AMR_6_7], "AMR_6_7"); strcpy(vcName[MGC_VCTYPE_AMR_5_15], "AMR_5_15"); strcpy(vcName[MGC_VCTYPE_AMR_5_9], "AMR_5_9"); strcpy(vcName[MGC_VCTYPE_AMR_4_75], "AMR_4_75"); return 0; } int mgc_get_non_virtual_trk_status(WORD mgNo) { struct snmp_pdu mgcSnmpPdu; struct snmp_addr mgcSnmpAddr; struct var_list *mgcVarList; BYTE i, j = 0; MG_INFO *mgInfo; mgInfo = &mgcMgInfo[mgNo]; mgcVarList = &mgcSnmpPdu.var[0]; mgcSnmpPdu.var_num = 0; //val list number if (MGC_MG_TYPE_AudioCoder == mgInfo->mgAttr.mgType) { for (i = 0; i < MGC_MAX_PHY_PORT_PER_MG; i++) { if (mgInfo->portIndex[i] != 0xFFFF) { mgcVarList[j].oidlen = MGC_AC_LINE_STATUS_IDLEN; MGC_AC_LINE_STATUS_OID[MGC_AC_LINE_STATUS_IDLEN - 1] = i; memcpy(&mgcVarList[mgcSnmpPdu.var_num].oid[0], MGC_AC_LINE_STATUS_OID, MGC_AC_LINE_STATUS_IDLEN*4); mgcVarList[mgcSnmpPdu.var_num].vartype = 0x04;//octet string mgcVarList[mgcSnmpPdu.var_num].msglen = 0; mgcSnmpPdu.var_num++; j++; } } } else if (MGC_MG_TYPE_LGC_MG == mgInfo->mgAttr.mgType) { mgcVarList[0].oidlen = MGC_LGC_MG_STATUS_IDLEN; memcpy(&mgcVarList[mgcSnmpPdu.var_num].oid[0], MGC_LGC_MG_STATUS_OID, MGC_LGC_MG_STATUS_IDLEN*4); mgcVarList[mgcSnmpPdu.var_num].vartype = 0x04;//octet string mgcVarList[mgcSnmpPdu.var_num].msglen = 0; mgcSnmpPdu.var_num++; }//revise by Francis 0822 mgInfo->requestId = (++mgInfo->requestId) & 0xFFFF; if (mgInfo->requestId == 0) mgInfo->requestId = 1; mgcSnmpPdu.pdu_type = 0x00; //get mgcSnmpPdu.request_id = (mgNo << 16) | mgInfo->requestId; mgcSnmpAddr.local_port = 4968; mgcSnmpAddr.remote_port = 161; mgcSnmpAddr.broadcast = 0; //Not broadcast mgcSnmpAddr.remote_ip = mgInfo->mgAttr.ip; if (mgcSnmpPdu.var_num) snmp_send(&mgcSnmpPdu,&mgcSnmpAddr); return 1; } int mgc_get_snmp_msg() { struct snmp_pdu mgcSnmpPdu; struct snmp_addr mgcSnmpAddr; struct var_list *mgcVarList; BYTE i, trkNo; WORD mgNo, portIndex; MG_INFO *mgInfo; mgcSnmpAddr.local_port = 4968; if (!snmp_receive(&mgcSnmpPdu, &mgcSnmpAddr)) return 0; if (mgcSnmpPdu.error_index != 0) return -1; mgNo = mgcSnmpPdu.request_id >> 16; mgInfo = &mgcMgInfo[mgNo]; if ((mgcSnmpPdu.request_id & 0xFFFF) != mgInfo->requestId) return -1; if (mgcSnmpPdu.var_num > MGC_MAX_PHY_PORT_PER_MG) return -1; mgcVarList = &mgcSnmpPdu.var[0]; for (i = 0; i < mgcSnmpPdu.var_num; i++) { trkNo = mgcVarList[i].oid[MGC_AC_LINE_STATUS_IDLEN - 1]; if (trkNo > (MGC_MAX_PHY_PORT_PER_MG - 1)) return -1; if ((portIndex = mgInfo->portIndex[trkNo]) != 0xFFFF) { if (mgcVarList[i].msg[0] == 1) { // No Alarm mgcPhyPort[portIndex].stLast = 1;//revise by Francis 0822 } else { // Alarm mgcPhyPort[portIndex].stLast = 0;//revise by Francis 0822 } } } return 1; } void mgc_get_mg_trk_status(WORD mg, BYTE stage) { BYTE i; WORD portIndex; CHNL chnl = {0, 0, 0, 0}; // static BYTE stage = 0; // stage++; // for (mg = 0; mg < MGC_MAX_NUM_OF_MG; mg++) // { if ((mgcMgInfo[mg].created == 0) || ((!mgc_is_non_virtual_mg(mgcMgInfo[mg].mgAttr.mgType)) && (mgcMgInfo[mg].mgAttr.mgType != MGC_MG_TYPE_ANN))) return; chnl.mgNo = mg; chnl.chlNo = 1; if ((mgcMgInfo[mg].mgAttr.ctrlType == MGC_MG_CTRL_TYPE_MGCP) && (mgcMgInfo[mg].usrType == MGC_USER_TYPE_MGC)) { if (mgcMgInfo[mg].mgAttr.mgType == MGC_MG_TYPE_ANN)//revise by Francis 0822 { chnl.portNo = 0; mgc_auep_chnl(0xFFFF, chnl); } else if (mgcMgInfo[mg].portNum > 0) { for (i = 0; i < MGC_MAX_PHY_PORT_PER_MG; i++) { if (mgcMgInfo[mg].portIndex[i] == 0xFFFF) continue; else { chnl.portNo = i; mgc_auep_chnl(0xFFFF, chnl); break; } } } if ((mgc_is_non_virtual_mg(mgcMgInfo[mg].mgAttr.mgType)) && (mgcMgInfo[mg].portNum > 0)) { if (MGC_MG_TYPE_SSW_CSS != mgcMgInfo[mg].mgAttr.mgType) { mgc_get_non_virtual_trk_status(mg); }//revise by Francis 0822 } } if ((stage & 1) == 0) { mgcMgInfo[mg].status = mgcMgInfo[mg].stLast; mgcMgInfo[mg].stLast = 0; if (mgc_is_non_virtual_mg(mgcMgInfo[mg].mgAttr.mgType))//revise by Francis 0822 { for (i = 0; i < MGC_MAX_PHY_PORT_PER_MG; i++) { portIndex = mgcMgInfo[mg].portIndex[i]; if (portIndex != 0xFFFF) { mgcPhyPort[portIndex].phyStatus = mgcPhyPort[portIndex].stLast; mgcPhyPort[portIndex].stLast = 0; } } } } // } } void mgc_t10s() { // static DWORD cntT10s = 0; static DWORD cntT50ms = 0; static BYTE stage[MGC_MAX_NUM_OF_MG] = {0}; WORD i; if (++cntT50ms >= MGC_MGCF_TIMER_50MS) { // 50 mini seconds period cntT50ms = 0; mgc_get_snmp_msg(); mgc_mon(); } for (i = 1; i < MGC_MAX_NUM_OF_MG; i++) { if (mgcMgInfo[i].created == 0) continue; if (++mgcMgInfo[i].auditTimer >= mgcMgInfo[i].mgAttr.auditTimer) { stage[i]++; mgcMgInfo[i].auditTimer = 0; mgc_get_mg_trk_status(i, stage[i]); } } /* if (++cntT10s >= MGC_MGCF_TIMER_10S) { // 10 seconds period cntT10s = 0; mgc_get_mg_trk_status(); } */ } int mgc_mg_init(WORD mgNo) { memset((BYTE *) &mgcMgInfo[mgNo], 0, sizeof(MG_INFO)); memset((BYTE *) &mgcMgInfo[mgNo].portIndex, 0xFFFF, sizeof(WORD) * MGC_MAX_PHY_PORT_PER_MG); return 0; } void mgc_init(DWORD systemId, DWORD localIp, DWORD peerIp) { WORD i; MG_ATTR tmpMgAttr; MG_ATTR *mgAttr = &tmpMgAttr; printf("MGC module init start!\n"); if (mgc_bind_8ecp() < 0) printf("MGC module binds 8ECP fail!\n"); if (mgc_bind_mgcp() < 0) printf("MGC module binds MGCP fail!\n"); memset((BYTE *) &mgcSap[0], 0, sizeof(MGC_SAP) * MGC_MAX_NUM_OF_SAP); memset((BYTE *) &mgcPhyPort[0], 0, sizeof(PHY_PORT_INFO) * MGC_MAX_NUM_OF_PHY_PORT); for (i = 0; i < MGC_MAX_NUM_OF_MG; i++) mgc_mg_init(i); for (i = 0; i < MGC_MAX_NUM_OF_PORT; i++) mgc_port_init(i); for (i = 0; i < MGC_MAX_NUM_OF_CHNL; i++) mgc_chnl_init(i); for (i = 0; i < MGC_MAX_NUM_OF_CON; i++) mgc_connect_init(i);//new replace mgc_sess_init(); mgc_vc_name_init(); memset(mgc_aas_mgNo, 0xFFFF, sizeof(WORD)*MGC_MAX_NUM_OF_AAS_MGC); mgcSelectPort = 0; mgc_select_connection = 0; mgc_select_ass_mgc_mgNo = 0; mgcMaxMgNo = MGC_MAX_NUM_OF_MG; mgcMaxChlNo = MGC_MAX_NUM_OF_CHNL; mgcMgCreated = 0; mgcChlAssigned = 0; memset(mgAttr, 0, sizeof(MG_ATTR)); mgAttr->mgType = MGC_MG_TYPE_INTERNAL; mgAttr->ctrlType = MGC_MG_CTRL_TYPE_MGCP; strcpy(mgAttr->domain, "InternalMG"); mgAttr->ip = 1; mgc_create_MG(0, mgAttr); mgc_8k_tone_card_silent = 0; mgc_e1card0_mgNo = 0; mgc_e1card1_mgNo = 0; sysID = systemId; localIP = localIp; peerIP = peerIp; strcpy(mgcAsciInBuf, "\0"); strcpy(mgcAsciOutBuf, "\0"); mgcMonitorFg = MGC_MONITOR_NONE; mgc_debug_set(); printf("MGC module init complete!\n"); } void mgc_timer() { WORD port; for (port = 0; port < MGC_MAX_NUM_OF_PORT; port++) { if (mgcPort[port].assigned == 0) continue; mgc_fsm(port); } mgc_t10s(); } int mgc_bind(MGC_SAP *sap) { BYTE sapIndex; if (wxc2_get_license(LIC_MGC) <= 0) { mgc_log_err("mgc_bind: mgc module is not presented!\n\r"); return -1; } if ((sap == NULL) || (sap->mgc_cnf == NULL) || (sap->usrType > MGC_USER_TYPE_MG)) return -1; for (sapIndex = 0; sapIndex < MGC_MAX_NUM_OF_SAP; sapIndex++) { if (mgcSap[sapIndex].mgc_cnf != NULL) continue; memcpy((BYTE *) &mgcSap[sapIndex], sap, sizeof(MGC_SAP)); return sapIndex; } return -1; } int mgc_unbind(MGC_SAP *sap, BYTE sapIndex) { if ((sap == NULL) || (sapIndex >= MGC_MAX_NUM_OF_SAP)) return -1; if ((strcmp(sap->usrName, mgcSap[sapIndex].usrName) != 0) || (sap->usrType != mgcSap[sapIndex].usrType)) return -1; memset((BYTE *) &mgcSap[sapIndex], 0, sizeof(MGC_SAP)); return 0; } int mgc_store_aas_mgc_mg(WORD mgNo) { int i; for (i = 0; i < MGC_MAX_NUM_OF_AAS_MGC; i++) { if ((mgc_aas_mgNo[i] < MGC_MAX_NUM_OF_MG) && (mgc_aas_mgNo[i] > 0)) { continue; } else { mgc_aas_mgNo[i] = mgNo; return 0; } } return -1; } int mgc_delet_aas_mgc_mg(WORD mgNo) { int i; for (i = 0; i < MGC_MAX_NUM_OF_AAS_MGC; i++) { if ((mgc_aas_mgNo[i] > 0) && (mgc_aas_mgNo[i] != mgNo)) { continue; } else { mgc_aas_mgNo[i] = 0; return 0; } } return -1; } int mgc_assign_chnl(BYTE sapIndex, WORD mgNo, BYTE portNo, BYTE chnlType) { WORD i, j; WORD chnlStart, chnlEnd, chnlNum; if (mgNo >= MGC_MAX_NUM_OF_MG) { return -1; } if (chnlType == MGC_MG_TYPE_ANN) { chnlStart = MGC_CHNL_START_ANN; chnlEnd = MGC_CHNL_START_ANN + MGC_CHNL_NUM_ANN; chnlNum = MGC_CHNL_NUM_ANN_PER_TYPE; } else if (chnlType == MGC_PHY_PORT_TYPE_ANALOG) { chnlStart = MGC_CHNL_START_AALN; chnlEnd = MGC_CHNL_START_AALN + MGC_CHNL_NUM_AALN; chnlNum = MGC_CHNL_NUM_AALN_PER_PORT; } else if(chnlType == MGC_MG_TYPE_INTERNAL) { chnlStart = MGC_CHNL_START_INTERNAL; chnlEnd = MGC_CHNL_START_INTERNAL+ MGC_CHNL_NUM_INTERNAL; chnlNum = MGC_CHNL_NUM_INTERNAL_PER_PORT; } else { chnlStart = MGC_CHNL_START_DS; chnlEnd = MGC_CHNL_START_DS + MGC_CHNL_NUM_DS_TOTAL; chnlNum = MGC_CHNL_NUM_DS_PER_PORT; } if ((mgcChlAssigned + chnlNum) > mgcMaxChlNo) return -1; for (i = chnlStart; i < chnlEnd; i += chnlNum) { if (mgcChnl[i].assigned == 1) continue; for (j = 0; j < chnlNum; j++) { mgcChnl[i + j].assigned = 1; mgcChnl[i + j].mgNo = mgNo; mgcChnl[i + j].portNo = portNo; mgcChnl[i + j].port = 0xFFFF; if (chnlType == MGC_MG_TYPE_ANN) { mgcChnl[i + j].sapIndex = sapIndex; } } mgcChlAssigned += chnlNum; return i; } return -1; } int mgc_remove_chnl(WORD chnlIndex, WORD chnlNum) { WORD i, port; if ((chnlIndex>MGC_MAX_NUM_OF_CHNL) || ((chnlIndex+chnlNum)>MGC_MAX_NUM_OF_CHNL)) { return -1; } for (i = 0; i < chnlNum; i++) { port = mgcChnl[chnlIndex + i].port; if (port < MGC_MAX_NUM_OF_CHNL) mgcPort[port].mngCmd = MGC_MNG_CMD_REMOVE_CHNL; mgc_chnl_init(chnlIndex + i); mgc_remove_connect(chnlIndex + i); } if (mgcChlAssigned > chnlNum) mgcChlAssigned -= chnlNum; else mgcChlAssigned = 0; return 0; } int mgc_assign_MG(BYTE sapIndex, WORD mgNo, MG_ATTR *mgAttr) { int chnlIndex; BYTE cardNo; if ((mgNo >= MGC_MAX_NUM_OF_MG) || (mgAttr == NULL) || (0 == strcmp(mgAttr->domain, "")) || (0 == mgAttr->ip)) { return -1; } if (mgAttr->mgType == MGC_MG_TYPE_ANN) { if ((chnlIndex = mgc_assign_chnl(sapIndex, mgNo, 0xFF, MGC_MG_TYPE_ANN)) < 0) return -1; mgcMgInfo[mgNo].chnlNum = MGC_CHNL_NUM_ANN_PER_TYPE; mgcMgInfo[mgNo].chnlStartIndex = chnlIndex; } if (mgAttr->mgType == MGC_MG_TYPE_INTERNAL) { if ((chnlIndex = mgc_assign_chnl(0xFF, mgNo, 0xFF, MGC_MG_TYPE_INTERNAL)) < 0) return -1; mgcMgInfo[mgNo].chnlNum = MGC_CHNL_NUM_INTERNAL_PER_PORT; mgcMgInfo[mgNo].chnlStartIndex = chnlIndex; }//add by Francis if (MGC_MG_CTRL_TYPE_8ECP == mgAttr->ctrlType) { if ((cardNo = atoi(mgAttr->domain)) > 31) { mgc_log_err("mgc_create_MG: 8ecp domain out of range!\n\r"); return -1; } _8ecp_createMG(mgNo, mgAttr->ip, cardNo); if (0 == cardNo) { mgc_e1card0_mgNo = mgNo; } else if (1 == cardNo) { mgc_e1card1_mgNo = mgNo; } } mgcMgInfo[mgNo].created = 1; memcpy((BYTE *) &mgcMgInfo[mgNo].mgAttr, (BYTE *) mgAttr, sizeof(MG_ATTR)); if (mgcMgInfo[mgNo].mgAttr.auditTimer == 0) { mgcMgInfo[mgNo].mgAttr.auditTimer = MGC_MGCF_TIMER_10S; } else { mgcMgInfo[mgNo].mgAttr.auditTimer = mgcMgInfo[mgNo].mgAttr.auditTimer * MGC_MGCF_TIMER_1S; } mgcMgInfo[mgNo].mgAttr.e1cardNo = cardNo; mgcMgInfo[mgNo].portNum = 0; memset((BYTE *) mgcMgInfo[mgNo].portIndex, 0xFFFF, sizeof(WORD) * MGC_MAX_PHY_PORT_PER_MG); mgcMgCreated++; return mgNo; } int mgc_create_MG(BYTE sapIndex, MG_ATTR *mgAttr) { WORD i; int mgNo; char tmpStr[128]; if ((mgAttr == NULL) || (sapIndex >= MGC_MAX_NUM_OF_SAP) || (0 == strcmp(mgAttr->domain, "")) || (0 == mgAttr->ip) || ((MGC_MG_CTRL_TYPE_8ECP != mgAttr->ctrlType) && (MGC_MG_CTRL_TYPE_MGCP != mgAttr->ctrlType))) { mgc_log_err("mgc_create_MG: invalid sapIndex or NULL mgAttr or No domain or No ip!\n\r"); return -1; } if ((mgcMgCreated + 1) > mgcMaxMgNo) { mgc_log_err("mgc_create_MG: license not enough!\n\r"); return -1; } for (i = 0; i < MGC_MAX_NUM_OF_MG; i++) { if (mgcMgInfo[i].created == 0) { continue; } if ((0 == strcmp(mgcMgInfo[i].mgAttr.domain, mgAttr->domain)) && (mgcMgInfo[i].mgAttr.ip == mgAttr->ip) && (mgcMgInfo[i].usrType == mgcSap[sapIndex].usrType)) { if (mgcMgInfo[i].sapIndex[sapIndex] == 0) { mgcMgInfo[i].sapIndex[sapIndex] = 1; return i; } else { mgc_log_err("mgc_create_MG: duplicated MG and sapIndex!\n\r"); return -1; } } } if (mgAttr->mgType == MGC_MG_TYPE_INTERNAL) { if (0 == mgcMgInfo[0].created) return mgc_assign_MG(0xFF, MGC_INTERNAL_VIRTUAL_MG, mgAttr); else return -1; } for (i = 1; i < MGC_MAX_NUM_OF_MG; i++) { if (mgcMgInfo[i].created == 1) continue; mgNo = mgc_assign_MG(sapIndex, i, mgAttr); if (mgNo >= 0) { if ((mgcMonitorFg & MGC_MONITOR_ALL) == MGC_MONITOR_ALL) { sprintf(tmpStr, "mgc_create_MG: succeed, sapIndex = %d, mgNo = %d, mgDomain: %s\n\r", sapIndex, mgNo, mgAttr->domain); mgc_asciout_proc(tmpStr); mgcMgInfo[mgNo].monFlag = 1; } mgcMgInfo[mgNo].usrType = mgcSap[sapIndex].usrType; if ((MGC_MG_TYPE_ANN == mgcMgInfo[mgNo].mgAttr.mgType) && (MGC_USER_TYPE_MGC == mgcMgInfo[mgNo].usrType)) { if (mgc_store_aas_mgc_mg(mgNo) < 0) { mgc_log_err("mgc_assign_MG: no resource store AAS MGC MG!\n\r"); mgc_mg_init(mgNo); return -1; } } mgcMgInfo[mgNo].sapIndex[sapIndex] = 1; return mgNo; } else { mgc_log_err("mgc_assign_MG: MG assign failed!\n\r"); return -1; } } mgc_log_err("mgc_create_MG: MG resource not available!\n\r"); return -1; } int mgc_delete_MG(BYTE sapIndex, WORD mgNo) { BYTE i; char tmpStr[128]; BYTE cardNo; BYTE mgFlag = 0; if ((sapIndex >= MGC_MAX_NUM_OF_SAP) || (mgNo >= MGC_MAX_NUM_OF_MG) || (0 == mgNo) || (0 == mgcMgInfo[mgNo].created))//add by Francis { mgc_log_err("mgc_delete_MG: invalid sapIndex or mgNo!\n\r"); return -1; } if (MGC_MG_CTRL_TYPE_8ECP == mgcMgInfo[mgNo].mgAttr.ctrlType) { cardNo = mgcMgInfo[mgNo].mgAttr.e1cardNo; if (cardNo > 31) { mgc_log_err("mgc_delete_MG: invalid 8ecp cardNo!\n\r"); return -1; } _8ecp_deleteMG(mgNo, mgcMgInfo[mgNo].mgAttr.ip, cardNo); if (0 == cardNo) { mgc_e1card0_mgNo = 0; } else if (1 == cardNo) { mgc_e1card1_mgNo = 0; } } else { if ((MGC_MG_TYPE_ANN == mgcMgInfo[mgNo].mgAttr.mgType) && (mgcMgInfo[mgNo].chnlNum > 0)) { mgc_delet_aas_mgc_mg(mgNo); mgc_remove_chnl(mgcMgInfo[mgNo].chnlStartIndex, mgcMgInfo[mgNo].chnlNum); }//add by Francis else { for (i = 0; i < MGC_MAX_PHY_PORT_PER_MG; i++) { if (mgcMgInfo[mgNo].portIndex[i] < MGC_MAX_NUM_OF_PHY_PORT) { mgc_delete_port(sapIndex, mgNo, i); } } } } mgcMgInfo[mgNo].sapIndex[sapIndex] = 0; for (i = 0; i < MGC_MAX_NUM_OF_SAP; i++) { if (mgcMgInfo[mgNo].sapIndex[i] == 1) { mgFlag = 1; break; } } if (mgFlag == 0) { mgc_mg_init(mgNo); if (mgcMgCreated > 0) mgcMgCreated--; sprintf(tmpStr, "mgc_delete_MG: succeed, sapIndex = %d, mgNo = %d, mgDomain: %s\n\r", sapIndex, mgNo, mgcMgInfo[mgNo].mgAttr.domain); mgc_asciout_proc(tmpStr); return 0; } mgc_log_err("mgc_delete_MG: other users are using this mg!\n\r"); return 0; } int mgc_modify_MG(BYTE sapIndex, WORD mgNo, MG_ATTR *mgAttr) { char tmpStr[128]; BYTE cardNo; if ((sapIndex >= MGC_MAX_NUM_OF_SAP) || (mgNo >= MGC_MAX_NUM_OF_MG)) { mgc_log_err("mgc_modify_MG: invalid sapIndex or mgNo!\n\r"); return -1; } if (0 == mgcMgInfo[mgNo].created) { mgc_log_err("mgc_modify_MG: mg not create!\n\r"); return -1; } if (MGC_MG_CTRL_TYPE_8ECP == mgAttr->ctrlType) { if ((cardNo = atoi(mgAttr->domain)) > 31) { mgc_log_err("mgc_modify_MG: 8ecp domain out of range!\n\r"); return -1; } _8ecp_createMG(mgNo, mgAttr->ip, cardNo); } memcpy((BYTE *) &mgcMgInfo[mgNo].mgAttr, (BYTE *) mgAttr, sizeof(MG_ATTR)); sprintf(tmpStr, "mgc_modify_MG: succeed, sapIndex = %d, mgNo = %d, mgDomain: %s\n\r", sapIndex, mgNo, mgAttr->domain); mgc_asciout_proc(tmpStr); return 0; } int mgc_add_port(BYTE sapIndex, WORD mgNo, BYTE portNo, BYTE portType) { WORD i; int chnlIndex; MG_INFO *mgInfo; BYTE chnlNum; WORD portIndex; char tmpStr[128]; if ((sapIndex >= MGC_MAX_NUM_OF_SAP) || (mgNo >= MGC_MAX_NUM_OF_MG) || (portNo >= MGC_MAX_PHY_PORT_PER_MG) || (portType > MGC_PHY_PORT_TYPE_ANALOG)) { mgc_log_err("mgc_add_port: invalid sapIndex, mgNo, portNo, or portType!\n\r"); return -1; } mgInfo = &mgcMgInfo[mgNo]; if (mgInfo->created != 1) { mgc_log_err("mgc_add_port: MG not created!\n\r"); return -1; } if ((mgInfo->portNum + 1) > mgInfo->mgAttr.maxPorts) { mgc_log_err("mgc_add_port: reached maxPorts of that MG!\n\r"); return -1; } portIndex = mgcMgInfo[mgNo].portIndex[portNo]; if ((portIndex < MGC_MAX_NUM_OF_PHY_PORT) && (mgcPhyPort[portIndex].created == 1)) { mgc_log_err("mgc_add_port: port already created!\n\r"); return -1; } for (i = 0; i < MGC_MAX_NUM_OF_PHY_PORT; i++) { if (mgcPhyPort[i].created == 1) continue; if (mgInfo->mgAttr.ctrlType != MGC_MG_CTRL_TYPE_8ECP) { if (portType == MGC_PHY_PORT_TYPE_ANALOG) chnlNum = MGC_CHNL_NUM_AALN_PER_PORT; else chnlNum = MGC_CHNL_NUM_DS_PER_PORT; if ((chnlIndex = mgc_assign_chnl(sapIndex, mgNo, portNo, portType)) < 0) { mgc_log_err("mgc_add_port: insufficient channel resources!\n\r"); return -1; } mgcPhyPort[i].chnlNum = chnlNum; mgcPhyPort[i].chnlStartIndex = chnlIndex; } mgcPhyPort[i].created = 1; mgcPhyPort[i].mgNo = mgNo; mgcPhyPort[i].portNo = portNo; mgcPhyPort[i].portType = portType; mgcPhyPort[i].sapIndex = sapIndex; mgInfo->portIndex[portNo] = i; mgInfo->portNum++; if ((mgcMonitorFg & MGC_MONITOR_ALL) == MGC_MONITOR_ALL) mgcPhyPort[i].monFlag = 1; sprintf(tmpStr, "mgc_add_port: succeed, sapIndex = %d, mgNo = %d, portNo = %d, portType = %d, allocated portNo = %d\n\r", sapIndex, mgNo, portNo, portType, i); mgc_log_procedure(mgNo, i, 0xFFFF, tmpStr); return i; } mgc_log_err("mgc_add_port: insufficient port resource!\n\r"); return -1; } int mgc_delete_port(BYTE sapIndex, WORD mgNo, BYTE portNo) { WORD portIndex; MG_INFO *mgInfo; char tmpStr[128]; if ((sapIndex >= MGC_MAX_NUM_OF_SAP) || (mgNo >= MGC_MAX_NUM_OF_MG) || (portNo >= MGC_MAX_PHY_PORT_PER_MG)) { mgc_log_err("mgc_delete_port: invalid sapIndex, mgNo, portNo!\n\r"); return -1; } mgInfo = &mgcMgInfo[mgNo]; portIndex = mgInfo->portIndex[portNo]; if (mgcPhyPort[portIndex].sapIndex == sapIndex) { mgc_remove_chnl(mgcPhyPort[portIndex].chnlStartIndex, mgcPhyPort[portIndex].chnlNum); memset((BYTE *) &mgcPhyPort[portIndex], 0, sizeof(PHY_PORT_INFO)); mgInfo->portIndex[portNo] = 0xFFFF; mgInfo->portNum--; sprintf(tmpStr, "mgc_delete_port: succeed, sapIndex = %d, mgNo = %d, portNo = %d\n\r", sapIndex, mgNo, portNo); mgc_asciout_proc(tmpStr); return 0; } else { mgc_log_err("mgc_delete_port: invalid sapIndex for the portNo!\n\r"); return -1; } } int mgc_modify_port(BYTE sapIndex, WORD mgNo, BYTE portNo, BYTE portType) { WORD phyPort; char tmpStr[128]; if ((sapIndex >= MGC_MAX_NUM_OF_SAP) || (mgNo >= MGC_MAX_NUM_OF_MG) || (!mgc_is_non_virtual_mg(mgcMgInfo[mgNo].mgAttr.mgType))||//add by Francis (portNo >= MGC_MAX_PHY_PORT_PER_MG) || (portType > MGC_PHY_PORT_TYPE_ANALOG)) { mgc_log_err("mgc_modify_port: invalid sapIndex, mgNo, portNo, or portType!\n\r"); return -1; } phyPort = mgcMgInfo[mgNo].portIndex[portNo]; if (phyPort >= MGC_MAX_NUM_OF_PHY_PORT) { mgc_log_err("mgc_modify_port: invalid phyPort!\n\r"); return -1; } mgcPhyPort[phyPort].portType = portType; sprintf(tmpStr, "mgc_modify_port: succeed, sapIndex = %d, mgNo = %d, portNo = %d, portType = %d\n\r", sapIndex, mgNo, portNo, portType); mgc_asciout_proc(tmpStr); return 0; } int mgc_apply_aas_tone(CHNL *aasChnl, BYTE toneNo) { int i; int j; WORD chnlIndex; WORD connectIndex; for (i = 0; i < MGC_MAX_NUM_OF_AAS_MGC; i++) { if (mgc_select_ass_mgc_mgNo > 3) { mgc_select_ass_mgc_mgNo = 0; } if ((mgc_aas_mgNo[mgc_select_ass_mgc_mgNo] >= MGC_MAX_NUM_OF_MG) || (mgc_aas_mgNo[mgc_select_ass_mgc_mgNo] == 0) || (mgcMgInfo[mgc_aas_mgNo[mgc_select_ass_mgc_mgNo]].status != 1) || (mgcMgInfo[mgc_aas_mgNo[mgc_select_ass_mgc_mgNo]].mgAttr.ip != localIP)) { mgc_select_ass_mgc_mgNo++; continue; } else { chnlIndex = mgcMgInfo[mgc_aas_mgNo[mgc_select_ass_mgc_mgNo]].chnlStartIndex + toneNo; for (j = 0; j < MGC_MAX_NUM_OF_CHNL_CON; j++) { if (((connectIndex = mgcChnl[chnlIndex].connectIndex[j]) < MGC_MAX_NUM_OF_CON) && (mgcConnectInfo[connectIndex].assigned == 1)) { continue; } else { aasChnl->mgNo = mgc_aas_mgNo[mgc_select_ass_mgc_mgNo]; aasChnl->portNo = 0xFF; aasChnl->chlNo = toneNo; aasChnl->connectNo = j; if (mgc_assign_connect_to_chnl(*aasChnl) < 0) { mgc_log_err("mgc_apply_aas_tone: assigned connect to chnl failed!\n\r"); return -1; } mgc_select_ass_mgc_mgNo++; return 0; } } } } return -1; } int mgc_match_codec_list(MGC_CODEC_LIST *dest, MGC_CODEC_LIST *aParty, MGC_CODEC_LIST *bParty) { BYTE i, j, num = 0; MGC_CODEC_LIST *base, *highPri; if (dest == NULL) { mgc_log_err("mgc_match_codec_list: dest == NULL!\n\r"); return -1; } dest->num = 0; dest->priority = 0; if (aParty->priority >= bParty->priority) { base = bParty; highPri = aParty; } else { base = aParty; highPri = bParty; } if (aParty->codec[0] == MGC_VCTYPE_G729B) { base = bParty; highPri = aParty; } else if (bParty->codec[0] == MGC_VCTYPE_G729B) { base = aParty; highPri = bParty; } if (base->num == 0) { if (highPri->num == 0) { mgc_log_err("mgc_match_codec_list: base->num == 0!\n\r"); return -1; } else { memcpy((BYTE *) dest, (BYTE *) highPri, sizeof(MGC_CODEC_LIST)); return 0; } } if (highPri->num == 0) { memcpy((BYTE *) dest, (BYTE *) base, sizeof(MGC_CODEC_LIST)); return 0; } for (i = 0; i < highPri->num; i++) { for (j = 0; j < base->num; j++) { if (highPri->codec[i] == base->codec[j]) { dest->codec[num++] = highPri->codec[i]; break; } } } if (num > 0) { dest->num = num; dest->priority = highPri->priority; return 0; } else { mgc_log_err("mgc_match_codec_list: can't match at all!\n\r"); return -1; } } int mgc_crcx_chnl(WORD usrPort, CHNL chnl) { int port; WORD chnlIndex, phyPort, associPort; char tmpStr[256]; BYTE ptime; int connectIndex;//new replace WORD aasChnlIndex; WORD aasConnectIndex; CHNL aasChnl; // return 0; if (chnl.mgNo >= MGC_MAX_NUM_OF_MG) { mgc_log_err("mgc_crcx_chnl: invalid mgNo!\n\r"); return -1; } if (mgcMgInfo[chnl.mgNo].mgAttr.mgType == MGC_MG_TYPE_INTERNAL) { mgc_log_err("mgc_crcx_chnl: MGC_MG_TYPE_INTERNAL!\n\r"); return -1; } if (mgcMgInfo[chnl.mgNo].mgAttr.ctrlType == MGC_MG_CTRL_TYPE_8ECP) return 1; if (chnl.portNo >= MGC_MAX_PHY_PORT_PER_MG) { mgc_log_err("mgc_crcx_chnl: invalid portNo!\n\r"); return -1; } if (chnl.connectNo >= MGC_MAX_NUM_OF_CHNL_CON) { mgc_log_err("mgc_crcx_chnl: invalid connectNo!\n\r"); return -1; } if (MGC_MG_TYPE_ANN == mgcMgInfo[chnl.mgNo].mgAttr.mgType) { chnlIndex = mgcMgInfo[chnl.mgNo].chnlStartIndex + chnl.chlNo; } else { phyPort = mgcMgInfo[chnl.mgNo].portIndex[chnl.portNo]; chnlIndex = mgcPhyPort[phyPort].chnlStartIndex + chnl.chlNo; } if ((chnlIndex >= MGC_MAX_NUM_OF_CHNL) || ((mgcMgInfo[chnl.mgNo].mgAttr.mgType != MGC_MG_TYPE_ANN) && (phyPort >= MGC_MAX_NUM_OF_PHY_PORT))) { mgc_log_err("mgc_crcx_chnl: invalid chnlIndex or phyPort!\n\r"); return -1; } if ((mgcChnl[chnlIndex].connectIndex[chnl.connectNo] < MGC_MAX_NUM_OF_CON) && (mgcConnectInfo[mgcChnl[chnlIndex].connectIndex[chnl.connectNo]].assigned == 1) && ((mgcConnectInfo[mgcChnl[chnlIndex].connectIndex[chnl.connectNo]].status == MGC_CONNECT_STATUS_CREATED) ||(mgcConnectInfo[mgcChnl[chnlIndex].connectIndex[chnl.connectNo]].status == MGC_CONNECT_STATUS_TONE)))//new replace { mgc_log_err("mgc_crcx_chnl: connection already created on this channel!\n\r"); return 0; } if ((mgcChnl[chnlIndex].connectIndex[chnl.connectNo] >= MGC_MAX_NUM_OF_CON) || (mgcConnectInfo[mgcChnl[chnlIndex].connectIndex[chnl.connectNo]].assigned != 1)) { if ((connectIndex = mgc_assign_connect_to_chnl(chnl)) < 0) { mgc_log_err("mgc_crcx_chnl: connect resource not available!\n\r"); return -1; }//new replace } else { connectIndex = mgcChnl[chnlIndex].connectIndex[chnl.connectNo]; } associPort = mgcConnectInfo[connectIndex].port; if ((associPort < MGC_MAX_NUM_OF_PORT) && (mgcPort[associPort].assigned != 0)) { mgcPort[associPort].mngCmd = MGC_MNG_CMD_OVERWRITE; mgc_log_err("mgc_crcx_chnl: chnl connection operation overwritten!\n\r"); } aasChnl = mgcConnectInfo[connectIndex].aasChnl; if ((aasChnl.mgNo < MGC_MAX_NUM_OF_MG) && (aasChnl.chlNo < MGC_MAX_NUM_OF_CHNL) && (aasChnl.connectNo < MGC_MAX_NUM_OF_CHNL_CON)) { aasChnlIndex = mgcMgInfo[aasChnl.mgNo].chnlStartIndex + aasChnl.chlNo; if ((aasConnectIndex = mgcChnl[aasChnlIndex].connectIndex[aasChnl.connectNo]) < MGC_MAX_NUM_OF_CON) { associPort = mgcConnectInfo[aasConnectIndex].port; if ((associPort < MGC_MAX_NUM_OF_PORT) && (mgcPort[associPort].assigned != 0)) { mgcPort[associPort].mngCmd = MGC_MNG_CMD_OVERWRITE; mgc_log_err("mgc_crcx_chnl: connection aasChnl operation overwritten!\n\r"); } } } associPort = mgcChnl[chnlIndex].port; if ((associPort < MGC_MAX_NUM_OF_PORT) && (mgcPort[associPort].assigned != 0)) { mgcPort[associPort].mngCmd = MGC_MNG_CMD_OVERWRITE; mgc_log_err("mgc_crcx_chnl: chnl operation overwritten!\n\r"); } if (mgcConnectInfo[connectIndex].codecList.num == 0) // if (mgcChnl[chnlIndex].codecList.num == 0) { if (mgc_match_codec_list(&mgcConnectInfo[connectIndex].codecList, &mgcConnectInfo[connectIndex].codecList, &mgcMgInfo[chnl.mgNo].mgAttr.codecList) < 0) //if (mgc_match_codec_list(&codecList, &mgcChnl[chnlIndex].codecList, &mgcMgInfo[chnl.mgNo].mgAttr.codecList) < 0) { mgc_log_err("mgc_crcx_chnl: mgcChnl[chnlIndex].codecList error!\n\n"); return -1; } } if ((port = mgc_get_port()) < 0) { mgc_log_err("mgc_crcx_chnl: port resource not available!\n\r"); return -1; } ptime = mgcMgInfo[chnl.mgNo].mgAttr.ptime; mgcPort[port].usrPort = usrPort; mgcPort[port].mgcfOperStepsNum = 1; mgcPort[port].mgcfOperSteps[0].localChnl = chnl; mgcPort[port].mgcfOperSteps[0].media.ptime = ptime; mgcPort[port].mgcfOperSteps[0].media.conMode = MGCP_CON_MODE_RECVONLY; mgcPort[port].mgcfOperSteps[0].media.vocoderType = mgcConnectInfo[connectIndex].codecList; mgcPort[port].mgcfOperSteps[0].cmd = MGCP_CMD_CRCX; mgcPort[port].mgcfOperId = MGC_OPER_ID_CRCX; mgcPort[port].mgcfState = MGC_MGCF_STATE_REQUEST; mgcPort[port].mgcfOperSteps[0].chnlConnectIndex = chnl.connectNo; sprintf(tmpStr, "mgc_crcx_chnl: succeed, usrPort = %d, mgNo = %d, portNo = %d, chnlNo = %d, chnlConnectNo = %d, connectIndex = %d\n\r", usrPort, chnl.mgNo, chnl.portNo, chnl.chlNo, chnl.connectNo, connectIndex);//new replace mgc_log_procedure(chnl.mgNo, phyPort, chnlIndex, tmpStr); return 0; } int mgc_mdcx_chnl(WORD usrPort, CHNL chnl, MEDIA_PARA *mediaPara, BYTE sdFlag) { int port; WORD chnlIndex, phyPort; char tmpStr[256]; WORD connectIndex;//new replace // return 0; if (chnl.mgNo >= MGC_MAX_NUM_OF_MG) { mgc_log_err("mgc_mdcx_chnl: invalid mgNo!\n\r"); return -1; } if (chnl.portNo >= MGC_MAX_PHY_PORT_PER_MG) { mgc_log_err("mgc_mdcx_chnl: invalid portNo!\n\r"); return -1; } if ((MGC_MG_TYPE_ANN == mgcMgInfo[chnl.mgNo].mgAttr.mgType) || (MGC_MG_TYPE_INTERNAL == mgcMgInfo[chnl.mgNo].mgAttr.mgType)) { chnlIndex = mgcMgInfo[chnl.mgNo].chnlStartIndex + chnl.chlNo; } else { phyPort = mgcMgInfo[chnl.mgNo].portIndex[chnl.portNo]; chnlIndex = mgcPhyPort[phyPort].chnlStartIndex + chnl.chlNo; } if ((chnlIndex >= MGC_MAX_NUM_OF_CHNL) || ((mgcMgInfo[chnl.mgNo].mgAttr.mgType != MGC_MG_TYPE_ANN) && (phyPort >= MGC_MAX_NUM_OF_PHY_PORT))) { mgc_log_err("mgc_mdcx_chnl: invalid chnlIndex or phyPort!\n\r"); return -1; } if ((connectIndex = mgcChnl[chnlIndex].connectIndex[chnl.connectNo]) >= MGC_MAX_NUM_OF_CON);//new replace { mgc_log_err("mgc_mdcx_chnl: invalid connectNo!\n\r"); return -1; } if ((mediaPara->flag & MGC_MEDIA_PARA_FLAG_EC) == MGC_MEDIA_PARA_FLAG_EC) //mgcChnl[chnlIndex].mediaAttr.ecDisable = mediaPara->ecDisable; mgcConnectInfo[connectIndex].mediaAttr.ecDisable = mediaPara->ecDisable; if ((mediaPara->flag & MGC_MEDIA_PARA_FLAG_SS) == MGC_MEDIA_PARA_FLAG_SS) //mgcChnl[chnlIndex].mediaAttr.ssDisable = mediaPara->ssDisable; mgcConnectInfo[connectIndex].mediaAttr.ssDisable = mediaPara->ssDisable; if ((mediaPara->flag & MGC_MEDIA_PARA_FLAG_CM) == MGC_MEDIA_PARA_FLAG_CM) //mgcChnl[chnlIndex].mediaAttr.conMode = mediaPara->conMode; mgcConnectInfo[connectIndex].mediaAttr.conMode = mediaPara->conMode; if ((mediaPara->flag & MGC_MEDIA_PARA_FLAG_PT) == MGC_MEDIA_PARA_FLAG_PT) //mgcChnl[chnlIndex].mediaAttr.ptime = mediaPara->ptime; mgcConnectInfo[connectIndex].mediaAttr.ptime = mediaPara->ptime; if ((mediaPara->flag & MGC_MEDIA_PARA_FLAG_VT) == MGC_MEDIA_PARA_FLAG_VT) { //mgc_match_codec_list(&mgcChnl[chnlIndex].codecList, &mediaPara->vocoderType, &mgcMgInfo[chnl.mgNo].mgAttr.codecList); mgc_match_codec_list(&mgcConnectInfo[connectIndex].codecList, &mediaPara->vocoderType, &mgcMgInfo[chnl.mgNo].mgAttr.codecList); } if (sdFlag == 0) { // sprintf(tmpStr, "mgc_mdcx_chnl: succeed, usrPort = %d, mgNo = %d, portNo = %d, chnlNo = %d, sdFlag = %d\n\r", usrPort, chnl.mgNo, chnl.portNo, chnl.chlNo, sdFlag); sprintf(tmpStr, "mgc_mdcx_chnl: succeed, usrPort = %d, mgNo = %d, portNo = %d, chnlNo = %d, connectNo = %d, sdFlag = %d\n\r", usrPort, chnl.mgNo, chnl.portNo, chnl.chlNo, chnl.connectNo, sdFlag);//new replace mgc_log_procedure(chnl.mgNo, phyPort, chnlIndex, tmpStr); return 0; } if ((mgcConnectInfo[mgcChnl[chnlIndex].connectIndex[chnl.connectNo]].assigned != 1) || ((mgcConnectInfo[mgcChnl[chnlIndex].connectIndex[chnl.connectNo]].status != MGC_CONNECT_STATUS_CREATED)&&((mgcConnectInfo[mgcChnl[chnlIndex].connectIndex[chnl.connectNo]].status != MGC_CONNECT_STATUS_TONE))))//new replace // if (mgcChnl[chnlIndex].status != MGC_CHNL_STATUS_CREATED) { mgc_log_err("mgc_mdcx_chnl: connection not created on this channel!\n\r"); return -1; } if ((port = mgc_get_port()) < 0) { mgc_log_err("mgc_mdcx_chnl: port resource not available!\n\r"); return -1; } mgcPort[port].usrPort = usrPort; mgcPort[port].mgcfOperStepsNum = 1; mgcPort[port].mgcfOperSteps[0].localChnl = chnl; mgcPort[port].mgcfOperSteps[0].cmd = MGCP_CMD_MDCX; mgcPort[port].mgcfOperId = MGC_OPER_ID_MDCX; mgcPort[port].mgcfState = MGC_MGCF_STATE_REQUEST; mgcPort[port].mgcfOperSteps[0].chnlConnectIndex = chnl.connectNo; // sprintf(tmpStr, "mgc_mdcx_chnl: succeed, usrPort = %d, mgNo = %d, portNo = %d, chnlNo = %d, sdFlag = %d\n\r", usrPort, chnl.mgNo, chnl.portNo, chnl.chlNo, sdFlag); sprintf(tmpStr, "mgc_mdcx_chnl: succeed, usrPort = %d, mgNo = %d, portNo = %d, chnlNo = %d, connectNo = %d, sdFlag = %d\n\r", usrPort, chnl.mgNo, chnl.portNo, chnl.chlNo, chnl.connectNo, sdFlag); mgc_log_procedure(chnl.mgNo, phyPort, chnlIndex, tmpStr); return 0; } int mgc_recvonly_chnl(WORD usrPort, CHNL orgChnl, CHNL destChnl) { int port; BYTE ptime; WORD chnlIndexOrg, chnlIndexDst, phyPortOrg, phyPortDst; char tmpStr[256]; int orgConnectIndex; int destConnectIndex; MGC_CODEC_LIST codecList; if ((orgChnl.mgNo >= MGC_MAX_NUM_OF_MG) || (destChnl.mgNo >= MGC_MAX_NUM_OF_MG)) { mgc_log_err("mgc_recvonly_chnl: invalid mgNo!\n\r"); return -1; } if ((orgChnl.portNo >= MGC_MAX_PHY_PORT_PER_MG) || (destChnl.portNo >= MGC_MAX_PHY_PORT_PER_MG)) { mgc_log_err("mgc_recvonly_chnl: invalid portNo!\n\r"); return -1; } if ((orgChnl.connectNo >= MGC_MAX_NUM_OF_CHNL_CON) || (destChnl.connectNo >= MGC_MAX_NUM_OF_CHNL_CON)) { mgc_log_err("mgc_recvonly_chnl: invalid connectNo!\n\r"); return -1; } if ((MGC_MG_TYPE_ANN == mgcMgInfo[orgChnl.mgNo].mgAttr.mgType) || (mgcMgInfo[orgChnl.mgNo].mgAttr.mgType == MGC_MG_TYPE_INTERNAL)) { chnlIndexOrg = mgcMgInfo[orgChnl.mgNo].chnlStartIndex + orgChnl.chlNo; } else { phyPortOrg = mgcMgInfo[orgChnl.mgNo].portIndex[orgChnl.portNo]; chnlIndexOrg = mgcPhyPort[phyPortOrg].chnlStartIndex + orgChnl.chlNo; } if ((chnlIndexOrg >= MGC_MAX_NUM_OF_CHNL) || ((mgcMgInfo[orgChnl.mgNo].mgAttr.mgType != MGC_MG_TYPE_INTERNAL) && (mgcMgInfo[orgChnl.mgNo].mgAttr.mgType != MGC_MG_TYPE_ANN) && (phyPortOrg >= MGC_MAX_NUM_OF_PHY_PORT))) { mgc_log_err("mgc_recvonly_chnl: invalid chnlIndex or phyPort of orgChnl!\n\r"); return -1; } if (((orgConnectIndex = mgcChnl[chnlIndexOrg].connectIndex[orgChnl.connectNo]) >= MGC_MAX_NUM_OF_CON) || (mgcConnectInfo[orgConnectIndex].assigned != 1) || ((mgcConnectInfo[orgConnectIndex].status != MGC_CONNECT_STATUS_CREATED)&&(mgcConnectInfo[orgConnectIndex].status != MGC_CONNECT_STATUS_TONE)))//new replace { mgc_log_err("mgc_recvonly_chnl: orgChnl connectionIndex invaild or connection not create!\n\r"); return -1; } if (mgcConnectInfo[orgConnectIndex].mediaAttr.conMode == MGCP_CON_MODE_RECVONLY) { sprintf(tmpStr, "mgc_recvonly_chnl: connection already in recvonly mode, usrPort = %d, Org: mgNo = %d, portNo = %d, chnlNo = %d, connectNo = %d, connectIndex = %d, Dest: mgNo = %d, portNo = %d, chnlNo = %d, connectNo = %d\n\r", usrPort, orgChnl.mgNo, orgChnl.portNo, orgChnl.chlNo, orgChnl.connectNo, orgConnectIndex, destChnl.mgNo, destChnl.portNo, destChnl.chlNo, destChnl.connectNo); mgc_log_procedure(orgChnl.mgNo, phyPortOrg, chnlIndexOrg, tmpStr); return 0; } if ((MGC_MG_TYPE_ANN == mgcMgInfo[destChnl.mgNo].mgAttr.mgType) || (mgcMgInfo[destChnl.mgNo].mgAttr.mgType == MGC_MG_TYPE_INTERNAL)) { chnlIndexDst = mgcMgInfo[destChnl.mgNo].chnlStartIndex + destChnl.chlNo; } else { phyPortDst = mgcMgInfo[destChnl.mgNo].portIndex[destChnl.portNo]; chnlIndexDst = mgcPhyPort[phyPortDst].chnlStartIndex + destChnl.chlNo; } if (chnlIndexDst >= MGC_MAX_NUM_OF_CHNL || ((mgcMgInfo[destChnl.mgNo].mgAttr.mgType != MGC_MG_TYPE_INTERNAL) && (phyPortDst >= MGC_MAX_NUM_OF_PHY_PORT))) { mgc_log_err("mgc_recvonly_chnl: invalid chnlIndex or phyPort of destChnl!\n\r"); return -1; } if (((destConnectIndex = mgcChnl[chnlIndexDst].connectIndex[destChnl.connectNo]) >= MGC_MAX_NUM_OF_CON) || (mgcConnectInfo[destConnectIndex].assigned != 1) || ((mgcConnectInfo[destConnectIndex].status != MGC_CONNECT_STATUS_CREATED)&&(mgcConnectInfo[destConnectIndex].status != MGC_CONNECT_STATUS_TONE)))//new replace { mgc_log_err("mgc_recvonly_chnl: destChnl connectionIndex invaild or connection not create!\n\r"); return -1; } if (mgcConnectInfo[orgConnectIndex].codecList.num == 0) { if (mgc_match_codec_list(&mgcConnectInfo[orgConnectIndex].codecList, &mgcConnectInfo[orgConnectIndex].codecList, &mgcMgInfo[orgChnl.mgNo].mgAttr.codecList) < 0) { mgc_log_err("mgc_crcx_chnl: mgcChnl[chnlIndex].codecList error!\n\n"); return -1; } } codecList = mgcConnectInfo[orgConnectIndex].codecList; if ((port = mgc_get_port()) < 0) { mgc_log_err("mgc_mdcx_chnl: port resource not available!\n\r"); return -1; } mgcPort[port].usrPort = usrPort; mgcPort[port].mgcfOperStepsNum = 1; ptime = mgcMgInfo[orgChnl.mgNo].mgAttr.ptime; mgcPort[port].mgcfOperSteps[0].media.ptime = ptime; mgcPort[port].mgcfOperSteps[0].media.conMode = MGCP_CON_MODE_RECVONLY; mgcPort[port].mgcfOperSteps[0].localChnl = orgChnl; mgcPort[port].mgcfOperSteps[0].remChnl = destChnl; mgcPort[port].mgcfOperSteps[0].cmd = MGCP_CMD_MDCX; mgcPort[port].mgcfOperSteps[0].media.vocoderType = codecList; mgcPort[port].mgcfOperId = MGC_OPER_ID_MDCX; mgcPort[port].mgcfState = MGC_MGCF_STATE_REQUEST; sprintf(tmpStr, "mgc_recvonly_chnl: succeed, usrPort = %d, Org: mgNo = %d, portNo = %d, chnlNo = %d, connectNo = %d, connectIndex = %d, Dest: mgNo = %d, portNo = %d, chnlNo = %d, connectNo = %d, connectIndex = %d\n\r", usrPort, orgChnl.mgNo, orgChnl.portNo, orgChnl.chlNo, orgChnl.connectNo, orgConnectIndex, destChnl.mgNo, destChnl.portNo, destChnl.chlNo, destChnl.connectNo, destConnectIndex); mgc_log_procedure(orgChnl.mgNo, phyPortOrg, chnlIndexOrg, tmpStr); return 0; } int mgc_dlcx_chnl(WORD usrPort, CHNL chnl) { int port; WORD chnlIndex, phyPort, associPort; char tmpStr[256]; WORD orgChl, dstChl; WORD connectIndex; WORD aasChnlIndex; WORD aasConnectIndex; CHNL aasChnl; // return 0; if (chnl.mgNo >= MGC_MAX_NUM_OF_MG) { mgc_log_err("mgc_dlcx_chnl: invalid mgNo!\n\r"); return -1; } if (mgcMgInfo[chnl.mgNo].mgAttr.ctrlType == MGC_MG_CTRL_TYPE_8ECP) { orgChl = (mgcMgInfo[chnl.mgNo].mgAttr.e1cardNo * 8 + chnl.portNo) * 32 + chnl.chlNo; dstChl = (mgc_8k_tone_card_silent * 8 + 7) * 32 + 31; _8ecp_connect_chnl(orgChl, dstChl, 0); //ecDisable:0/1=enable/disable echo canceller phyPort = mgcMgInfo[chnl.mgNo].portIndex[chnl.portNo]; chnlIndex = mgcPhyPort[phyPort].chnlStartIndex + chnl.chlNo; sprintf(tmpStr, "mgc_dlcx_chnl: succeed, usrPort = %d, mgNo = %d, portNo = %d, chnlNo = %d\n\r", usrPort, chnl.mgNo, chnl.portNo, chnl.chlNo); mgc_log_procedure(chnl.mgNo, phyPort, chnlIndex, tmpStr); return 0; } if ((mgcMgInfo[chnl.mgNo].mgAttr.mgType != MGC_MG_TYPE_ANN) && (chnl.portNo >= MGC_MAX_PHY_PORT_PER_MG)) { mgc_log_err("mgc_dlcx_chnl: invalid portNo!\n\r"); return -1; } if (chnl.connectNo >= MGC_MAX_NUM_OF_CHNL_CON) { mgc_log_err("mgc_dlcx_chnl: invalid connectNo!\n\r"); return -1; } if (chnl.chlNo >= MGC_MAX_NUM_OF_CHNL) { if (chnl.chlNo != MGCP_EP_NAME_CHNL_WILDCAST) { mgc_log_err("mgc_dlcx_chnl: invalid chnlIndex!\n\r"); return -1; } } if (chnl.chlNo < MGC_MAX_NUM_OF_CHNL) { if (MGC_MG_TYPE_ANN == mgcMgInfo[chnl.mgNo].mgAttr.mgType) { chnlIndex = mgcMgInfo[chnl.mgNo].chnlStartIndex + chnl.chlNo; } else { phyPort = mgcMgInfo[chnl.mgNo].portIndex[chnl.portNo]; chnlIndex = mgcPhyPort[phyPort].chnlStartIndex + chnl.chlNo; } if ((chnlIndex >= MGC_MAX_NUM_OF_CHNL) || ((mgcMgInfo[chnl.mgNo].mgAttr.mgType != MGC_MG_TYPE_ANN) && (phyPort >= MGC_MAX_NUM_OF_PHY_PORT))) { mgc_log_err("mgc_dlcx_chnl: invalid chnlIndex or phyPort!\n\r"); return -1; } if ((connectIndex = mgcChnl[chnlIndex].connectIndex[chnl.connectNo]) >= MGC_MAX_NUM_OF_CON)//new replace { mgc_log_err("mgc_dlcx_chnl: invalid connectIndex!\n\r"); return -1; } associPort = mgcConnectInfo[connectIndex].port; if ((associPort < MGC_MAX_NUM_OF_PORT) && (mgcPort[associPort].assigned != 0)) { mgcPort[associPort].mngCmd = MGC_MNG_CMD_OVERWRITE; mgc_log_err("mgc_dlcx_chnl: chnl connection operation overwritten!\n\r"); } aasChnl = mgcConnectInfo[connectIndex].aasChnl; if ((aasChnl.mgNo < MGC_MAX_NUM_OF_MG) && (aasChnl.chlNo < MGC_MAX_NUM_OF_CHNL) && (aasChnl.connectNo < MGC_MAX_NUM_OF_CHNL_CON)) { aasChnlIndex = mgcMgInfo[aasChnl.mgNo].chnlStartIndex + aasChnl.chlNo; if ((aasConnectIndex = mgcChnl[aasChnlIndex].connectIndex[aasChnl.connectNo]) < MGC_MAX_NUM_OF_CON) { associPort = mgcConnectInfo[aasConnectIndex].port; if ((associPort < MGC_MAX_NUM_OF_PORT) && (mgcPort[associPort].assigned != 0)) { mgcPort[associPort].mngCmd = MGC_MNG_CMD_OVERWRITE; mgc_log_err("mgc_dlcx_chnl: connection aasChnl operation overwritten!\n\r"); } } } associPort = mgcChnl[chnlIndex].port; if ((associPort < MGC_MAX_NUM_OF_PORT) && (mgcPort[associPort].assigned != 0)) { mgcPort[associPort].mngCmd = MGC_MNG_CMD_OVERWRITE; mgc_log_err("mgc_dlcx_chnl: chnl operation overwritten!\n\r"); } if ((mgcConnectInfo[connectIndex].assigned != 1) || ((mgcConnectInfo[connectIndex].status != MGC_CONNECT_STATUS_CREATED)&&(mgcConnectInfo[connectIndex].status != MGC_CONNECT_STATUS_TONE))) //new replace { mgc_log_err("mgc_dlcx_chnl: connection not created on this channel!\n\r"); return 0; } } if ((port = mgc_get_port()) < 0) { mgc_log_err("mgc_dlcx_chnl: port resource not available!\n\r"); return -1; } mgcPort[port].usrPort = usrPort; mgcPort[port].mgcfOperStepsNum = 1; mgcPort[port].mgcfOperSteps[0].localChnl = chnl; mgcPort[port].mgcfOperSteps[0].cmd = MGCP_CMD_DLCX; mgcPort[port].mgcfOperId = MGC_OPER_ID_DLCX; mgcPort[port].mgcfState = MGC_MGCF_STATE_REQUEST; mgcPort[port].mgcfOperSteps[0].chnlConnectIndex = chnl.connectNo; sprintf(tmpStr, "mgc_dlcx_chnl: succeed, usrPort = %d, mgNo = %d, portNo = %d, chnlNo = %d, connectNo = %d\n\r", usrPort, chnl.mgNo, chnl.portNo, chnl.chlNo, chnl.connectNo); mgc_log_procedure(chnl.mgNo, phyPort, chnlIndex, tmpStr); MGC_SESS_REC *pSess; pSess = mgc_sess_is_already_rec(chnl); if(pSess != NULL) mgc_sess_rec_init(pSess, pSess->id); return 0; } int mgc_rqnt_chnl(WORD usrPort, CHNL chnl, EVENT *event, SIGNAL *signal) { int port; WORD chnlIndex, phyPort; char tmpStr[256]; if (chnl.mgNo >= MGC_MAX_NUM_OF_MG) { mgc_log_err("mgc_rqnt_chnl: invalid mgNo!\n\r"); return -1; } if (mgcMgInfo[chnl.mgNo].mgAttr.ctrlType == MGC_MG_CTRL_TYPE_8ECP) return 1; if (chnl.portNo >= MGC_MAX_PHY_PORT_PER_MG) { mgc_log_err("mgc_rqnt_chnl: invalid portNo!\n\r"); return -1; } if (MGC_MG_TYPE_ANN == mgcMgInfo[chnl.mgNo].mgAttr.mgType) { chnlIndex = mgcMgInfo[chnl.mgNo].chnlStartIndex + chnl.chlNo; } else { phyPort = mgcMgInfo[chnl.mgNo].portIndex[chnl.portNo]; chnlIndex = mgcPhyPort[phyPort].chnlStartIndex + chnl.chlNo; } if ((chnlIndex >= MGC_MAX_NUM_OF_CHNL) || ((mgcMgInfo[chnl.mgNo].mgAttr.mgType != MGC_MG_TYPE_ANN) && (phyPort >= MGC_MAX_NUM_OF_PHY_PORT))) { mgc_log_err("mgc_rqnt_chnl: invalid chnlIndex or phyPort!\n\r"); return -1; } if ((mgcChnl[chnlIndex].port < MGC_MAX_NUM_OF_PORT) && (mgcPort[mgcChnl[chnlIndex].port].assigned != 0)) { mgc_log_err("mgc_rqnt_chnl: channel already engaged!\n\r"); return 0; } if ((port = mgc_get_port()) < 0) { mgc_log_err("mgc_rqnt_chnl: port resource not available!\n\r"); return -1; } mgcPort[port].usrPort = usrPort; mgcPort[port].mgcfOperStepsNum = 1; mgcPort[port].mgcfOperSteps[0].localChnl = chnl; mgcPort[port].mgcfOperSteps[0].cmd = MGCP_CMD_RQNT; mgcPort[port].mgcfOperId = MGC_OPER_ID_RQNT; mgcPort[port].mgcfState = MGC_MGCF_STATE_REQUEST; mgcPort[port].mgcfOperSteps[0].chnlConnectIndex = 0xFFFF; if (event != NULL) //mgcChnl[chnlIndex].mediaAttr.pkgEvent = (event->pkg << 8) | event->event; mgcChnl[chnlIndex].comMediaAttr.pkgEvent = (event->pkg << 8) | event->event; if (signal != NULL) //mgcChnl[chnlIndex].mediaAttr.pkgSignal = (signal->pkg << 8) | signal->signal; mgcChnl[chnlIndex].comMediaAttr.pkgSignal = (signal->pkg << 8) | signal->signal; // sprintf(tmpStr, "mgc_rqnt_chnl: succeed, usrPort = %d, mgNo = %d, portNo = %d, chnlNo = %d\n\r", usrPort, chnl.mgNo, chnl.portNo, chnl.chlNo); sprintf(tmpStr, "mgc_rqnt_chnl: succeed, usrPort = %d, mgNo = %d, portNo = %d, chnlNo = %d, connectNo = %d\n\r", usrPort, chnl.mgNo, chnl.portNo, chnl.chlNo, chnl.connectNo); mgc_log_procedure(chnl.mgNo, phyPort, chnlIndex, tmpStr); return 0; } int mgc_auep_chnl(WORD usrPort, CHNL chnl) { int port; WORD chnlIndex, phyPort; char tmpStr[256]; // return 0; if (chnl.mgNo >= MGC_MAX_NUM_OF_MG) { mgc_log_err("mgc_auep_chnl: invalid mgNo!\n\r"); return -1; } if (mgcMgInfo[chnl.mgNo].mgAttr.ctrlType == MGC_MG_CTRL_TYPE_8ECP) return 1; if (chnl.portNo >= MGC_MAX_PHY_PORT_PER_MG) { mgc_log_err("mgc_auep_chnl: invalid portNo!\n\r"); return -1; } if (MGC_MG_TYPE_ANN == mgcMgInfo[chnl.mgNo].mgAttr.mgType) { chnlIndex = mgcMgInfo[chnl.mgNo].chnlStartIndex + chnl.chlNo; } else { phyPort = mgcMgInfo[chnl.mgNo].portIndex[chnl.portNo]; chnlIndex = mgcPhyPort[phyPort].chnlStartIndex + chnl.chlNo; } if ((chnlIndex >= MGC_MAX_NUM_OF_CHNL) || ((mgcMgInfo[chnl.mgNo].mgAttr.mgType != MGC_MG_TYPE_ANN) && (phyPort >= MGC_MAX_NUM_OF_PHY_PORT))) { mgc_log_err("mgc_auep_chnl: invalid chnlIndex or phyPort!\n\r"); return -1; } if (mgcChnl[chnlIndex].auepSt != MGC_CHNL_AUEP_IDLE) { mgc_log_err("mgc_auep_chnl: auep already in progress!\n\r"); return -1; } if ((port = mgc_get_port()) < 0) { mgc_log_err("mgc_auep_chnl: port resource not available!\n\r"); return -1; } mgcPort[port].usrPort = usrPort; mgcPort[port].mgcfOperStepsNum = 1; mgcPort[port].mgcfOperSteps[0].localChnl = chnl; mgcPort[port].mgcfOperSteps[0].cmd = MGCP_CMD_AUEP; mgcPort[port].mgcfOperId = MGC_OPER_ID_AUEP; mgcPort[port].mgcfState = MGC_MGCF_STATE_REQUEST; mgcPort[port].mgcfOperSteps[0].chnlConnectIndex = 0xFFFF; mgcChnl[chnlIndex].auepSt = MGC_CHNL_AUEP_IN_PROGRESS; // sprintf(tmpStr, "mgc_auep_chnl: succeed, usrPort = %d, mgNo = %d, portNo = %d, chnlNo = %d\n\r", usrPort, chnl.mgNo, chnl.portNo, chnl.chlNo); sprintf(tmpStr, "mgc_auep_chnl: succeed, usrPort = %d, mgNo = %d, portNo = %d, chnlNo = %d, connectNo = %d\n\r", usrPort, chnl.mgNo, chnl.portNo, chnl.chlNo, chnl.connectNo); mgc_log_procedure(chnl.mgNo, phyPort, chnlIndex, tmpStr); return 0; } int mgc_connect_chnl(WORD usrPort, CHNL orgChnl, CHNL destChnl, BYTE flag) { int port; BYTE step = 0, ptime; WORD orgChl, dstChl; WORD chnlIndexOrg, chnlIndexDst, phyPortOrg, phyPortDst, associPort; char tmpStr[256]; MGC_CODEC_LIST codecList; int orgConnectIndex; int destConnectIndex; WORD aasChnlIndex; WORD aasConnectIndex; CHNL aasChnl; CONNECT_INFO *pConnect; if ((orgChnl.mgNo >= MGC_MAX_NUM_OF_MG) || (destChnl.mgNo >= MGC_MAX_NUM_OF_MG)) { mgc_log_err("mgc_connect_chnl: invalid mgNo!\n\r"); return -1; } if ((mgcMgInfo[orgChnl.mgNo].mgAttr.ctrlType != mgcMgInfo[destChnl.mgNo].mgAttr.ctrlType) && ((mgcMgInfo[orgChnl.mgNo].mgAttr.ctrlType == MGC_MG_CTRL_TYPE_8ECP) || (mgcMgInfo[destChnl.mgNo].mgAttr.ctrlType == MGC_MG_CTRL_TYPE_8ECP))) { mgc_log_err("mgc_connect_chnl: mg ctrlType error!\n\r"); return -1; } if (mgcMgInfo[orgChnl.mgNo].mgAttr.ctrlType == MGC_MG_CTRL_TYPE_8ECP) { orgChl = (mgcMgInfo[orgChnl.mgNo].mgAttr.e1cardNo * 8 + orgChnl.portNo) * 32 + orgChnl.chlNo; if ((flag & MGC_CONNECT_SILENT_TONE) == MGC_CONNECT_SILENT_TONE) dstChl = (mgc_8k_tone_card_silent * 8 + 7) * 32 + 31; else dstChl = (mgcMgInfo[destChnl.mgNo].mgAttr.e1cardNo * 8 + destChnl.portNo) * 32 + destChnl.chlNo; phyPortOrg = mgcMgInfo[orgChnl.mgNo].portIndex[orgChnl.portNo]; chnlIndexOrg = mgcPhyPort[phyPortOrg].chnlStartIndex + orgChnl.chlNo; _8ecp_connect_chnl(orgChl, dstChl, mgcChnl[chnlIndexOrg].comMediaAttr.ecDisable); //ecDisable:0/1=enable/disable echo canceller phyPortDst = mgcMgInfo[destChnl.mgNo].portIndex[destChnl.portNo]; chnlIndexDst = mgcPhyPort[phyPortDst].chnlStartIndex + destChnl.chlNo; sprintf(tmpStr, "mgc_connect_chnl: succeed, usrPort = %d, Org: mgNo = %d, portNo = %d, chnlNo = %d, Dest: mgNo = %d, portNo = %d, chnlNo = %d\n\r", usrPort, orgChnl.mgNo, orgChnl.portNo, orgChnl.chlNo, destChnl.mgNo, destChnl.portNo, destChnl.chlNo); if (mgc_log_procedure(orgChnl.mgNo, phyPortOrg, chnlIndexOrg, tmpStr) < 0) mgc_log_procedure(destChnl.mgNo, phyPortDst, chnlIndexDst, tmpStr); return 0; } if ((orgChnl.portNo >= MGC_MAX_PHY_PORT_PER_MG) || (destChnl.portNo >= MGC_MAX_PHY_PORT_PER_MG)) { mgc_log_err("mgc_connect_chnl: invalid portNo!\n\r"); return -1; } if ((orgChnl.connectNo >= MGC_MAX_NUM_OF_CHNL_CON) || (destChnl.connectNo >= MGC_MAX_NUM_OF_CHNL_CON)) { mgc_log_err("mgc_connect_chnl: invalid connectNo!\n\r"); return -1; } if (mgcMgInfo[orgChnl.mgNo].mgAttr.mgType == MGC_MG_TYPE_INTERNAL) { phyPortOrg = 0; chnlIndexOrg = mgcMgInfo[orgChnl.mgNo].chnlStartIndex + orgChnl.chlNo; } else { if (MGC_MG_TYPE_ANN == mgcMgInfo[orgChnl.mgNo].mgAttr.mgType) { chnlIndexOrg = mgcMgInfo[orgChnl.mgNo].chnlStartIndex + orgChnl.chlNo; } else { phyPortOrg = mgcMgInfo[orgChnl.mgNo].portIndex[orgChnl.portNo]; chnlIndexOrg = mgcPhyPort[phyPortOrg].chnlStartIndex + orgChnl.chlNo; } } if ((chnlIndexOrg >= MGC_MAX_NUM_OF_CHNL) || ((mgcMgInfo[orgChnl.mgNo].mgAttr.mgType != MGC_MG_TYPE_INTERNAL) && (mgcMgInfo[orgChnl.mgNo].mgAttr.mgType != MGC_MG_TYPE_ANN) && (phyPortOrg >= MGC_MAX_NUM_OF_PHY_PORT))) { mgc_log_err("mgc_connect_chnl: invalid chnlIndex or phyPort of orgChnl!\n\r"); return -1; } if (((orgConnectIndex = mgcChnl[chnlIndexOrg].connectIndex[orgChnl.connectNo]) >= MGC_MAX_NUM_OF_CON) || (mgcConnectInfo[orgConnectIndex].assigned != 1))//new replace { if ((orgConnectIndex = mgc_assign_connect_to_chnl(orgChnl)) < 0) { mgc_log_err("mgc_connect_chnl: assigned connect on orgChnl failed!\n\r"); return -1; } } associPort = mgcConnectInfo[orgConnectIndex].port; if ((associPort < MGC_MAX_NUM_OF_PORT) && (mgcPort[associPort].assigned != 0)) { mgcPort[associPort].mngCmd = MGC_MNG_CMD_OVERWRITE; mgc_log_err("mgc_connect_chnl: orgChnl operation overwritten!\n\r"); } aasChnl = mgcConnectInfo[orgConnectIndex].aasChnl; if ((aasChnl.mgNo < MGC_MAX_NUM_OF_MG) && (aasChnl.chlNo < MGC_MAX_NUM_OF_CHNL) && (aasChnl.connectNo < MGC_MAX_NUM_OF_CHNL_CON)) { aasChnlIndex = mgcMgInfo[aasChnl.mgNo].chnlStartIndex + aasChnl.chlNo; if ((aasConnectIndex = mgcChnl[aasChnlIndex].connectIndex[aasChnl.connectNo]) < MGC_MAX_NUM_OF_CON) { associPort = mgcConnectInfo[aasConnectIndex].port; if ((associPort < MGC_MAX_NUM_OF_PORT) && (mgcPort[associPort].assigned != 0)) { mgcPort[associPort].mngCmd = MGC_MNG_CMD_OVERWRITE; mgc_log_err("mgc_connect_chnl: connection aasChnl operation overwritten!\n\r"); } } } associPort = mgcChnl[chnlIndexOrg].port; if ((associPort < MGC_MAX_NUM_OF_PORT) && (mgcPort[associPort].assigned != 0)) { mgcPort[associPort].mngCmd = MGC_MNG_CMD_OVERWRITE; mgc_log_err("mgc_connect_chnl: orgChnl chnl operation overwritten!\n\r"); } if (mgcMgInfo[destChnl.mgNo].mgAttr.mgType == MGC_MG_TYPE_INTERNAL) { phyPortDst = 0; chnlIndexDst = mgcMgInfo[destChnl.mgNo].chnlStartIndex + destChnl.chlNo; } else { if (MGC_MG_TYPE_ANN == mgcMgInfo[destChnl.mgNo].mgAttr.mgType) { chnlIndexDst = mgcMgInfo[destChnl.mgNo].chnlStartIndex + destChnl.chlNo; } else { phyPortDst = mgcMgInfo[destChnl.mgNo].portIndex[destChnl.portNo]; chnlIndexDst = mgcPhyPort[phyPortDst].chnlStartIndex + destChnl.chlNo; } } if (chnlIndexDst >= MGC_MAX_NUM_OF_CHNL || ((mgcMgInfo[destChnl.mgNo].mgAttr.mgType != MGC_MG_TYPE_ANN) && (phyPortDst >= MGC_MAX_NUM_OF_PHY_PORT))) { mgc_log_err("mgc_connect_chnl: invalid chnlIndex or phyPort of destChnl!\n\r"); return -1; } if (((destConnectIndex = mgcChnl[chnlIndexDst].connectIndex[destChnl.connectNo]) >= MGC_MAX_NUM_OF_CON) || (mgcConnectInfo[destConnectIndex].assigned != 1))//new replace { if ((destConnectIndex = mgc_assign_connect_to_chnl(destChnl)) < 0) { mgc_log_err("mgc_connect_chnl: assigned connect on destChnl failed!\n\r"); return -1; } } if (mgcMgInfo[destChnl.mgNo].mgAttr.mgType != MGC_MG_TYPE_INTERNAL) { associPort = mgcConnectInfo[destConnectIndex].port; if ((associPort < MGC_MAX_NUM_OF_PORT) && (mgcPort[associPort].assigned != 0)) { mgcPort[associPort].mngCmd = MGC_MNG_CMD_OVERWRITE; mgc_log_err("mgc_connect_chnl: destChnl operation overwritten!\n\r"); } associPort = mgcChnl[chnlIndexDst].port; if ((associPort < MGC_MAX_NUM_OF_PORT) && (mgcPort[associPort].assigned != 0)) { mgcPort[associPort].mngCmd = MGC_MNG_CMD_OVERWRITE; mgc_log_err("mgc_connect_chnl: destChnl chnl operation overwritten!\n\r"); } } if ((mgcConnectInfo[orgConnectIndex].codecList.num == 0) && (mgcMgInfo[orgChnl.mgNo].mgAttr.mgType != MGC_MG_TYPE_INTERNAL)) { if (mgc_match_codec_list(&mgcConnectInfo[orgConnectIndex].codecList, &mgcConnectInfo[orgConnectIndex].codecList, &mgcMgInfo[orgChnl.mgNo].mgAttr.codecList) < 0) { mgc_log_err("mgc_connect_chnl: mgcConnectInfo[orgConnectIndex].codecList error!\n\n"); return -1; } } if ((mgcConnectInfo[destConnectIndex].codecList.num == 0) && (mgcMgInfo[destChnl.mgNo].mgAttr.mgType != MGC_MG_TYPE_INTERNAL)) { if (mgc_match_codec_list(&mgcConnectInfo[destConnectIndex].codecList, &mgcConnectInfo[destConnectIndex].codecList, &mgcMgInfo[destChnl.mgNo].mgAttr.codecList) < 0) { mgc_log_err("mgc_connect_chnl: mgcConnectInfo[destConnectIndex].codecList error!\n\n"); return -1; } } if (mgc_match_codec_list(&codecList, &mgcConnectInfo[orgConnectIndex].codecList, &mgcConnectInfo[destConnectIndex].codecList) < 0) { mgc_log_err("mgc_connect_chnl: can't match codec!\n\n"); return -1; } if ((port = mgc_get_port()) < 0) { mgc_log_err("mgc_connect_chnl: port resource not available!\n\r"); return -1; } mgcPort[port].usrPort = usrPort; if (mgcMgInfo[orgChnl.mgNo].mgAttr.ptime >= mgcMgInfo[destChnl.mgNo].mgAttr.ptime) ptime = mgcMgInfo[orgChnl.mgNo].mgAttr.ptime; else ptime = mgcMgInfo[destChnl.mgNo].mgAttr.ptime; if ((mgcConnectInfo[orgConnectIndex].status != MGC_CONNECT_STATUS_CREATED)&&(mgcConnectInfo[orgConnectIndex].status != MGC_CONNECT_STATUS_TONE)) { if (MGC_MG_TYPE_INTERNAL != mgcMgInfo[orgChnl.mgNo].mgAttr.mgType) { mgcPort[port].mgcfOperSteps[step].localChnl = orgChnl; mgcPort[port].mgcfOperSteps[step].media.ptime = ptime; mgcPort[port].mgcfOperSteps[step].media.conMode = MGCP_CON_MODE_RECVONLY; mgcPort[port].mgcfOperSteps[step].media.vocoderType = codecList; mgcPort[port].mgcfOperSteps[step].chnlConnectIndex = orgChnl.connectNo; mgcPort[port].mgcfOperSteps[step++].cmd = MGCP_CMD_CRCX; } } if ((mgcConnectInfo[destConnectIndex].status != MGC_CONNECT_STATUS_CREATED)&&(mgcConnectInfo[destConnectIndex].status != MGC_CONNECT_STATUS_TONE)) { if (MGC_MG_TYPE_INTERNAL != mgcMgInfo[destChnl.mgNo].mgAttr.mgType) { mgcPort[port].mgcfOperSteps[step].localChnl = destChnl; mgcPort[port].mgcfOperSteps[step].media.ptime = ptime; mgcPort[port].mgcfOperSteps[step].media.conMode = MGCP_CON_MODE_RECVONLY; mgcPort[port].mgcfOperSteps[step].media.vocoderType = codecList; mgcPort[port].mgcfOperSteps[step].chnlConnectIndex = destChnl.connectNo; mgcPort[port].mgcfOperSteps[step++].cmd = MGCP_CMD_CRCX; } } if ((MGC_MG_TYPE_IPBSS != mgcMgInfo[orgChnl.mgNo].mgAttr.mgType) && (orgChnl.mgNo == destChnl.mgNo) && ((mgcConnectInfo[orgConnectIndex].flag & MGCP_PARA_FLAG_TFO) != MGCP_PARA_FLAG_TFO)) { if ((mgcMgInfo[orgChnl.mgNo].mgAttr.mgType != MGC_MG_TYPE_IPBSS) && (MGC_MG_TYPE_INTERNAL != mgcMgInfo[orgChnl.mgNo].mgAttr.mgType)) { mgcPort[port].mgcfOperSteps[step].localChnl = orgChnl; mgcPort[port].mgcfOperSteps[step].remChnl = destChnl; mgcPort[port].mgcfOperSteps[step].pkgSignal = 0; mgcPort[port].mgcfOperSteps[step].media.ptime = ptime; mgcPort[port].mgcfOperSteps[step].media.conMode = mgcConnectInfo[orgConnectIndex].mediaAttr.conMode; mgcPort[port].mgcfOperSteps[step].flag |= MGCP_PARA_FLAG_TFO; mgcPort[port].mgcfOperSteps[step].media.vocoderType = codecList; mgcPort[port].mgcfOperSteps[step].chnlConnectIndex = orgChnl.connectNo; mgcPort[port].mgcfOperSteps[step++].cmd = MGCP_CMD_MDCX; } } else if ((orgChnl.mgNo != destChnl.mgNo) && ((mgcConnectInfo[orgConnectIndex].flag & MGCP_PARA_FLAG_TFO) == MGCP_PARA_FLAG_TFO)) { if (MGC_MG_TYPE_INTERNAL != mgcMgInfo[orgChnl.mgNo].mgAttr.mgType) { mgcPort[port].mgcfOperSteps[step].localChnl = orgChnl; mgcPort[port].mgcfOperSteps[step].remChnl = destChnl; mgcPort[port].mgcfOperSteps[step].pkgSignal = 0; mgcPort[port].mgcfOperSteps[step].media.ptime = ptime; mgcPort[port].mgcfOperSteps[step].media.conMode = mgcConnectInfo[orgConnectIndex].mediaAttr.conMode; mgcPort[port].mgcfOperSteps[step].media.vocoderType = codecList; mgcPort[port].mgcfOperSteps[step].chnlConnectIndex = orgChnl.connectNo; mgcPort[port].mgcfOperSteps[step++].cmd = MGCP_CMD_MDCX; } } if (MGC_MG_TYPE_INTERNAL != mgcMgInfo[orgChnl.mgNo].mgAttr.mgType) { mgcPort[port].mgcfOperSteps[step].localChnl = orgChnl; mgcPort[port].mgcfOperSteps[step].remChnl = destChnl; mgcPort[port].mgcfOperSteps[step].pkgSignal = 0; mgcPort[port].mgcfOperSteps[step].media.ptime = ptime; mgcPort[port].mgcfOperSteps[step].media.conMode = mgcConnectInfo[orgConnectIndex].mediaAttr.conMode; if ((MGC_MG_TYPE_IPBSS != mgcMgInfo[orgChnl.mgNo].mgAttr.mgType) && (orgChnl.mgNo == destChnl.mgNo)) { mgcPort[port].mgcfOperSteps[step].flag |= MGCP_PARA_FLAG_TFO; } mgcPort[port].mgcfOperSteps[step].media.vocoderType = codecList; mgcPort[port].mgcfOperSteps[step].chnlConnectIndex = orgChnl.connectNo; mgcPort[port].mgcfOperSteps[step++].cmd = MGCP_CMD_MDCX; } if (MGC_MG_TYPE_INTERNAL != mgcMgInfo[destChnl.mgNo].mgAttr.mgType) { mgcPort[port].mgcfOperSteps[step].localChnl = destChnl; mgcPort[port].mgcfOperSteps[step].remChnl = orgChnl; mgcPort[port].mgcfOperSteps[step].pkgSignal = 0; mgcPort[port].mgcfOperSteps[step].media.ptime = ptime; if ((flag & MGC_CONNECT_SILENT_TONE) == MGC_CONNECT_SILENT_TONE) { mgcPort[port].mgcfOperSteps[step].media.conMode = MGCP_CON_MODE_RECVONLY; } else mgcPort[port].mgcfOperSteps[step].media.conMode = MGCP_CON_MODE_SENDRECV; if ((MGC_MG_TYPE_IPBSS != mgcMgInfo[orgChnl.mgNo].mgAttr.mgType) && (orgChnl.mgNo == destChnl.mgNo)) { mgcPort[port].mgcfOperSteps[step].flag |= MGCP_PARA_FLAG_TFO; } mgcPort[port].mgcfOperSteps[step].media.vocoderType = codecList; mgcPort[port].mgcfOperSteps[step].chnlConnectIndex = destChnl.connectNo; mgcPort[port].mgcfOperSteps[step++].cmd = MGCP_CMD_MDCX; } if(mgcMgInfo[destChnl.mgNo].mgAttr.mgType == MGC_MG_TYPE_AudioCoder) { mgcPort[port].mgcfOperSteps[step].localChnl = destChnl; mgcPort[port].mgcfOperSteps[step++].cmd = MGCP_CMD_RQNT; mgcChnl[chnlIndexDst].comMediaAttr.pkgReq = (MGCP_PKG_D << 8)|(MGCP_D_SIG_WILD); } pConnect = &mgcConnectInfo[orgConnectIndex]; memset(&(pConnect->operRec) , 0 , sizeof(OPER_REC)); pConnect->operRec.operaId = MGC_OPER_ID_CONNECT_CHNL; if (step == 0) mgc_port_init(port); else { mgcPort[port].mgcfOperId = MGC_OPER_ID_CONNECT_CHNL; mgcPort[port].mgcfState = MGC_MGCF_STATE_REQUEST; mgcPort[port].mgcfOperStepsNum = step; } sprintf(tmpStr, "mgc_connect_chnl: succeed, usrPort = %d, Org: mgNo = %d, portNo = %d, chnlNo = %d, connectNo = %d, connectIndex = %d, Dest: mgNo = %d, portNo = %d, chnlNo = %d, connectNo = %d, connectIndex = %d, step = %d\n\r", usrPort, orgChnl.mgNo, orgChnl.portNo, orgChnl.chlNo, orgChnl.connectNo, orgConnectIndex, destChnl.mgNo, destChnl.portNo, destChnl.chlNo, destChnl.connectNo, destConnectIndex, step); if (mgc_log_procedure(orgChnl.mgNo, phyPortOrg, chnlIndexOrg, tmpStr) < 0) mgc_log_procedure(destChnl.mgNo, phyPortDst, chnlIndexDst, tmpStr); if(mgc_sess_rec_org_and_dst_chnl(orgChnl , destChnl) == FALSE) return -1; return 0; } int mgc_connect_dtmf(WORD usrPort, CHNL orgChnl, CHNL dstChnl, BYTE dtmfNo) { int port; BYTE step = 0, ptime; WORD orgChl, dstChl; WORD chnlIndexOrg, phyPortOrg, associPort; char tmpStr[256]; BYTE digit = 0; int orgConnectIndex; WORD aasChnlIndex; WORD aasConnectIndex; CHNL aasChnl; // return 0; if ((orgChnl.mgNo >= MGC_MAX_NUM_OF_MG) || (dstChnl.mgNo >= MGC_MAX_NUM_OF_MG)) { mgc_log_err("mgc_connect_dtmf: invalid mgNo!\n\r"); return -1; } if (0 == dtmfNo) { digit = 10; } else { digit = dtmfNo; } if (mgcMgInfo[orgChnl.mgNo].mgAttr.ctrlType == MGC_MG_CTRL_TYPE_8ECP) { orgChl = (mgcMgInfo[orgChnl.mgNo].mgAttr.e1cardNo * 8 + orgChnl.portNo) * 32 + orgChnl.chlNo; dstChl = (mgcMgInfo[dstChnl.mgNo].mgAttr.e1cardNo * 8 + dstChnl.portNo) * 32 + dstChnl.chlNo; _8ecp_connect_dtmf(orgChl, dstChl, digit); phyPortOrg = mgcMgInfo[orgChnl.mgNo].portIndex[orgChnl.portNo]; chnlIndexOrg = mgcPhyPort[phyPortOrg].chnlStartIndex + orgChnl.chlNo; sprintf(tmpStr, "mgc_connect_dtmf: succeed, usrPort = %d, mgNo = %d, portNo = %d, chnlNo = %d, dtmfNo = %d\n\r", usrPort, orgChnl.mgNo, orgChnl.portNo, orgChnl.chlNo, dtmfNo); mgc_log_procedure(orgChnl.mgNo, phyPortOrg, chnlIndexOrg, tmpStr); return 0; } if (orgChnl.portNo >= MGC_MAX_PHY_PORT_PER_MG) { mgc_log_err("mgc_connect_dtmf: invalid portNo!\n\r"); return -1; } if (orgChnl.connectNo >= MGC_MAX_NUM_OF_CHNL_CON) { mgc_log_err("mgc_connect_dtmf: invalid connectNo!\n\r"); return -1; } if (MGC_MG_TYPE_ANN == mgcMgInfo[orgChnl.mgNo].mgAttr.mgType) { chnlIndexOrg = mgcMgInfo[orgChnl.mgNo].chnlStartIndex + orgChnl.chlNo; } else { phyPortOrg = mgcMgInfo[orgChnl.mgNo].portIndex[orgChnl.portNo]; chnlIndexOrg = mgcPhyPort[phyPortOrg].chnlStartIndex + orgChnl.chlNo; } if (chnlIndexOrg >= MGC_MAX_NUM_OF_CHNL || ((mgcMgInfo[orgChnl.mgNo].mgAttr.mgType != MGC_MG_TYPE_ANN) && (phyPortOrg >= MGC_MAX_NUM_OF_PHY_PORT))) { mgc_log_err("mgc_connect_dtmf: invalid chnlIndex or phyPort of orgChnl!\n\r"); return -1; } if (((orgConnectIndex = mgcChnl[chnlIndexOrg].connectIndex[orgChnl.connectNo]) >= MGC_MAX_NUM_OF_CON) || (mgcConnectInfo[orgConnectIndex].assigned != 1))//new replace { if ((orgConnectIndex = mgc_assign_connect_to_chnl(orgChnl)) < 0) { mgc_log_err("mgc_connect_dtmf: assigned connect on orgChnl failed!\n\r"); return -1; } } associPort = mgcConnectInfo[orgConnectIndex].port; if ((associPort < MGC_MAX_NUM_OF_PORT) && (mgcPort[associPort].assigned != 0)) { mgcPort[associPort].mngCmd = MGC_MNG_CMD_OVERWRITE; mgc_log_err("mgc_connect_dtmf: orgChnl connection operation overwritten!\n\r"); } aasChnl = mgcConnectInfo[orgConnectIndex].aasChnl; if ((aasChnl.mgNo < MGC_MAX_NUM_OF_MG) && (aasChnl.chlNo < MGC_MAX_NUM_OF_CHNL) && (aasChnl.connectNo < MGC_MAX_NUM_OF_CHNL_CON)) { aasChnlIndex = mgcMgInfo[aasChnl.mgNo].chnlStartIndex + aasChnl.chlNo; if ((aasConnectIndex = mgcChnl[aasChnlIndex].connectIndex[aasChnl.connectNo]) < MGC_MAX_NUM_OF_CON) { associPort = mgcConnectInfo[aasConnectIndex].port; if ((associPort < MGC_MAX_NUM_OF_PORT) && (mgcPort[associPort].assigned != 0)) { mgcPort[associPort].mngCmd = MGC_MNG_CMD_OVERWRITE; mgc_log_err("mgc_connect_dtmf: connection aasChnl operation overwritten!\n\r"); } } } associPort = mgcChnl[chnlIndexOrg].port; if ((associPort < MGC_MAX_NUM_OF_PORT) && (mgcPort[associPort].assigned != 0)) { mgcPort[associPort].mngCmd = MGC_MNG_CMD_OVERWRITE; mgc_log_err("mgc_connect_dtmf: orgChnl chnl operation overwritten!\n\r"); } if ((port = mgc_get_port()) < 0) { mgc_log_err("mgc_connect_dtmf: port resource not available!\n\r"); return -1; } mgcPort[port].usrPort = usrPort; if ((mgcConnectInfo[orgConnectIndex].status != MGC_CONNECT_STATUS_CREATED)&&(mgcConnectInfo[orgConnectIndex].status != MGC_CONNECT_STATUS_TONE)) { ptime = mgcMgInfo[orgChnl.mgNo].mgAttr.ptime; mgcPort[port].mgcfOperSteps[step].localChnl = orgChnl; mgcPort[port].mgcfOperSteps[step].media.ptime = ptime; mgcPort[port].mgcfOperSteps[step].media.conMode = MGCP_CON_MODE_RECVONLY; mgcPort[port].mgcfOperSteps[step].chnlConnectIndex = orgChnl.connectNo; mgcPort[port].mgcfOperSteps[step++].cmd = MGCP_CMD_CRCX; } mgcPort[port].mgcfOperSteps[step].localChnl = orgChnl; mgcPort[port].mgcfOperSteps[step].pkgSignal = (MGCP_PKG_D << 8) | digit; if(mgcMgInfo[orgChnl.mgNo].mgAttr.mgType == MGC_MG_TYPE_AudioCoder) { mgcChnl[orgConnectIndex].comMediaAttr.pkgReq = (MGCP_PKG_D << 8)|(MGCP_D_SIG_WILD); } mgcPort[port].mgcfOperSteps[step].chnlConnectIndex = orgChnl.connectNo; mgcPort[port].mgcfOperSteps[step++].cmd = MGCP_CMD_RQNT; mgcPort[port].mgcfOperStepsNum = step; mgcPort[port].mgcfOperId = MGC_OPER_ID_CONNECT_DTMF; mgcPort[port].mgcfState = MGC_MGCF_STATE_REQUEST; sprintf(tmpStr, "mgc_connect_dtmf: succeed, usrPort = %d, mgNo = %d, portNo = %d, chnlNo = %d, connectNo = %d, dtmfNo = %d\n\r", usrPort, orgChnl.mgNo, orgChnl.portNo, orgChnl.chlNo, orgChnl.connectNo, dtmfNo); mgc_log_procedure(orgChnl.mgNo, phyPortOrg, chnlIndexOrg, tmpStr); return 0; } int mgc_connect_AAS(WORD usrPort, CHNL orgChnl, CHNL dstChnl, BYTE toneNo, WORD duration, WORD times) { int port; BYTE step = 0, ptime; WORD orgChl, dstChl; WORD chnlIndexOrg, chnlIndexDst, phyPortOrg, phyPortDst, associPort; char tmpStr[256]; CHNL aasChnl = {0xFFFF, 0, 0xFFFF, 0xFFFF}; int orgConnectIndex; int destConnectIndex; WORD aasConnectIndex; WORD chnlIndexAAS; MGC_CODEC_LIST codecList; WORD orgAASChnlIndex; WORD orgAASConnectIndex; CHNL orgAASChnl; CONNECT_INFO *pConnect; BYTE tone; if ((orgChnl.mgNo >= MGC_MAX_NUM_OF_MG) || (dstChnl.mgNo >= MGC_MAX_NUM_OF_MG)) { mgc_log_err("mgc_connect_AAS: invalid mgNo!\n\r"); return -1; } if ((mgcMgInfo[orgChnl.mgNo].mgAttr.ctrlType != mgcMgInfo[dstChnl.mgNo].mgAttr.ctrlType) && ((mgcMgInfo[orgChnl.mgNo].mgAttr.ctrlType == MGC_MG_CTRL_TYPE_8ECP) || (mgcMgInfo[dstChnl.mgNo].mgAttr.ctrlType == MGC_MG_CTRL_TYPE_8ECP))) { mgc_log_err("mgc_connect_chnl: mg ctrlType error!\n\r"); return -1; } if (toneNo >= MGC_MAX_TONE_NO) { mgc_log_err("mgc_connect_AAS: invalid toneNo!\n\r"); return -1; } if (mgcMgInfo[orgChnl.mgNo].mgAttr.ctrlType == MGC_MG_CTRL_TYPE_8ECP) { orgChl = (mgcMgInfo[orgChnl.mgNo].mgAttr.e1cardNo * 8 + orgChnl.portNo) * 32 + orgChnl.chlNo; if ((0 == dstChnl.mgNo) && (0 == dstChnl.portNo) && (0 == dstChnl.chlNo)) { dstChl = (mgc_8k_tone_card_silent * 8 + 7) * 32 + 31; } else if ((1 == mgcMgInfo[dstChnl.mgNo].created) && (1 == mgcPhyPort[mgcMgInfo[dstChnl.mgNo].portIndex[dstChnl.portNo]].created)) { dstChl = (mgcMgInfo[dstChnl.mgNo].mgAttr.e1cardNo * 8 + dstChnl.portNo) * 32 + dstChnl.chlNo;//need revise } else { mgc_log_err("mgc_connect_AAS: invalid 8ecp mgNo or portNo!\n\r"); return -1; } _8ecp_connect_tone(orgChl, dstChl, toneNo, duration); sprintf(tmpStr, "mgc_connect_AAS: succeed, usrPort = %d, Org: mgNo = %d, portNo = %d, chnlNo = %d\n\r", usrPort, orgChnl.mgNo, orgChnl.portNo, orgChnl.chlNo); mgc_log_procedure(orgChnl.mgNo, phyPortOrg, chnlIndexOrg, tmpStr); return 0; } if ((orgChnl.portNo >= MGC_MAX_PHY_PORT_PER_MG) || (dstChnl.portNo >= MGC_MAX_PHY_PORT_PER_MG)) { mgc_log_err("mgc_connect_AAS: invalid portNo!\n\r"); return -1; } if ((orgChnl.connectNo >= MGC_MAX_NUM_OF_CHNL_CON) || (dstChnl.connectNo >= MGC_MAX_NUM_OF_CHNL_CON)) { mgc_log_err("mgc_connect_AAS: invalid connectNo!\n\r"); return -1; } if ((MGC_MG_TYPE_ANN == mgcMgInfo[orgChnl.mgNo].mgAttr.mgType) || (MGC_MG_TYPE_INTERNAL == mgcMgInfo[orgChnl.mgNo].mgAttr.mgType)) { chnlIndexOrg = mgcMgInfo[orgChnl.mgNo].chnlStartIndex + orgChnl.chlNo; } else { phyPortOrg = mgcMgInfo[orgChnl.mgNo].portIndex[orgChnl.portNo]; chnlIndexOrg = mgcPhyPort[phyPortOrg].chnlStartIndex + orgChnl.chlNo; } if (chnlIndexOrg >= MGC_MAX_NUM_OF_CHNL || ((mgcMgInfo[orgChnl.mgNo].mgAttr.mgType != MGC_MG_TYPE_INTERNAL) && (mgcMgInfo[orgChnl.mgNo].mgAttr.mgType != MGC_MG_TYPE_ANN) && (phyPortOrg >= MGC_MAX_NUM_OF_PHY_PORT))) { mgc_log_err("mgc_connect_AAS: invalid chnlIndex or phyPort of orgChnl!\n\r"); return -1; } if (((orgConnectIndex = mgcChnl[chnlIndexOrg].connectIndex[orgChnl.connectNo]) >= MGC_MAX_NUM_OF_CON) || (mgcConnectInfo[orgConnectIndex].assigned != 1))//new replace { if ((orgConnectIndex = mgc_assign_connect_to_chnl(orgChnl)) < 0) { mgc_log_err("mgc_connect_AAS: assigned connect on orgChnl failed!\n\r"); return -1; } } associPort = mgcConnectInfo[orgConnectIndex].port; if ((associPort < MGC_MAX_NUM_OF_PORT) && (mgcPort[associPort].assigned != 0)) { mgcPort[associPort].mngCmd = MGC_MNG_CMD_OVERWRITE; mgc_log_err("mgc_connect_AAS: orgChnl connection operation overwritten!\n\r"); } orgAASChnl = mgcConnectInfo[orgConnectIndex].aasChnl; if ((orgAASChnl.mgNo < MGC_MAX_NUM_OF_MG) && (orgAASChnl.chlNo < MGC_MAX_NUM_OF_CHNL) && (orgAASChnl.connectNo < MGC_MAX_NUM_OF_CHNL_CON)) { orgAASChnlIndex = mgcMgInfo[orgAASChnl.mgNo].chnlStartIndex + orgAASChnl.chlNo; if ((orgAASConnectIndex = mgcChnl[orgAASChnlIndex].connectIndex[orgAASChnl.connectNo]) < MGC_MAX_NUM_OF_CON) { associPort = mgcConnectInfo[orgAASConnectIndex].port; if ((associPort < MGC_MAX_NUM_OF_PORT) && (mgcPort[associPort].assigned != 0)) { mgcPort[associPort].mngCmd = MGC_MNG_CMD_OVERWRITE; mgc_log_err("mgc_connect_AAS: connection aasChnl operation overwritten!\n\r"); } } } associPort = mgcChnl[chnlIndexOrg].port; if ((associPort < MGC_MAX_NUM_OF_PORT) && (mgcPort[associPort].assigned != 0)) { mgcPort[associPort].mngCmd = MGC_MNG_CMD_OVERWRITE; mgc_log_err("mgc_connect_AAS: orgChnl chnl operation overwritten!\n\r"); } if ((MGC_MG_TYPE_ANN == mgcMgInfo[dstChnl.mgNo].mgAttr.mgType) || (MGC_MG_TYPE_INTERNAL == mgcMgInfo[dstChnl.mgNo].mgAttr.mgType)) { chnlIndexDst = mgcMgInfo[dstChnl.mgNo].chnlStartIndex + dstChnl.chlNo; } else { phyPortDst = mgcMgInfo[dstChnl.mgNo].portIndex[dstChnl.portNo]; chnlIndexDst = mgcPhyPort[phyPortDst].chnlStartIndex + dstChnl.chlNo; } if (chnlIndexDst >= MGC_MAX_NUM_OF_CHNL || ((mgcMgInfo[dstChnl.mgNo].mgAttr.mgType != MGC_MG_TYPE_INTERNAL) && (mgcMgInfo[dstChnl.mgNo].mgAttr.mgType != MGC_MG_TYPE_ANN) && (phyPortDst >= MGC_MAX_NUM_OF_PHY_PORT))) { mgc_log_err("mgc_connect_AAS: invalid destChnl chnlIndex or phyPort of orgChnl!\n\r"); return -1; } destConnectIndex = mgcChnl[chnlIndexDst].connectIndex[dstChnl.connectNo]; if ((mgcConnectInfo[orgConnectIndex].codecList.num == 0) && (mgcMgInfo[orgChnl.mgNo].mgAttr.mgType != MGC_MG_TYPE_INTERNAL)) { if (mgc_match_codec_list(&mgcConnectInfo[orgConnectIndex].codecList, &mgcConnectInfo[orgConnectIndex].codecList, &mgcMgInfo[orgChnl.mgNo].mgAttr.codecList) < 0) { mgc_log_err("mgc_connect_AAS: mgcConnectInfo[orgConnectIndex].codecList error!\n\n"); return -1; } } if ((destConnectIndex < MGC_MAX_NUM_OF_CON) && (mgcConnectInfo[destConnectIndex].codecList.num == 0) && (mgcMgInfo[dstChnl.mgNo].mgAttr.mgType != MGC_MG_TYPE_INTERNAL)) { if (mgc_match_codec_list(&mgcConnectInfo[destConnectIndex].codecList, &mgcConnectInfo[destConnectIndex].codecList, &mgcMgInfo[dstChnl.mgNo].mgAttr.codecList) < 0) { mgc_log_err("mgc_connect_AAS: mgcConnectInfo[dstConnectIndex].codecList error!\n\n"); return -1; } } if (destConnectIndex < MGC_MAX_NUM_OF_CON) { if (mgc_match_codec_list(&codecList, &mgcConnectInfo[orgConnectIndex].codecList, &mgcConnectInfo[destConnectIndex].codecList) < 0) { mgc_log_err("mgc_connect_AAS: orgConnect and dstConnect code negotiation fail!\n\n"); return -1; } } if ((port = mgc_get_port()) < 0) { mgc_log_err("mgc_connect_AAS: port resource not available!\n\r"); return -1; } mgcPort[port].usrPort = usrPort; if (toneNo == MGC_HOLD_MUSIC) { if (mgcConnectInfo[orgConnectIndex].status != MGC_CONNECT_STATUS_CREATED) { if (MGC_MG_TYPE_INTERNAL != mgcMgInfo[orgChnl.mgNo].mgAttr.mgType) { ptime = mgcMgInfo[orgChnl.mgNo].mgAttr.ptime; mgcPort[port].mgcfOperSteps[step].localChnl = orgChnl; mgcPort[port].mgcfOperSteps[step].media.ptime = ptime; mgcPort[port].mgcfOperSteps[step].media.conMode = MGCP_CON_MODE_RECVONLY; mgcPort[port].mgcfOperSteps[step].chnlConnectIndex = orgChnl.connectNo; mgcPort[port].mgcfOperSteps[step].media.vocoderType = mgcConnectInfo[orgConnectIndex].codecList; mgcPort[port].mgcfOperSteps[step++].cmd = MGCP_CMD_CRCX; } } else { if (mgcConnectInfo[orgConnectIndex].mediaAttr.conMode >= MGCP_CON_MODE_SENDONLY) { ptime = mgcMgInfo[orgChnl.mgNo].mgAttr.ptime; mgcPort[port].mgcfOperSteps[step].media.ptime = ptime; mgcPort[port].mgcfOperSteps[step].media.conMode = MGCP_CON_MODE_RECVONLY; mgcPort[port].mgcfOperSteps[step].localChnl = orgChnl; mgcPort[port].mgcfOperSteps[step].remChnl = dstChnl; if (destConnectIndex < MGC_MAX_NUM_OF_CON) { mgcPort[port].mgcfOperSteps[step].media.vocoderType = mgcConnectInfo[destConnectIndex].codecList;//orgConnectIndex } else { mgcPort[port].mgcfOperSteps[step].media.vocoderType = mgcConnectInfo[orgConnectIndex].codecList; } mgcPort[port].mgcfOperSteps[step++].cmd = MGCP_CMD_MDCX; } } } if (mgcMgInfo[dstChnl.mgNo].mgAttr.mgType != MGC_MG_TYPE_INTERNAL) { if ((destConnectIndex < MGC_MAX_NUM_OF_CON) && (mgcConnectInfo[destConnectIndex].status == MGC_CONNECT_STATUS_CREATED)) { if (mgcConnectInfo[destConnectIndex].mediaAttr.conMode >= MGCP_CON_MODE_SENDONLY) { ptime = mgcMgInfo[dstChnl.mgNo].mgAttr.ptime; if ((mgcConnectInfo[destConnectIndex].flag & MGCP_PARA_FLAG_TFO) == MGCP_PARA_FLAG_TFO) { mgcPort[port].mgcfOperSteps[step].flag |= MGCP_PARA_FLAG_TFO; } mgcPort[port].mgcfOperSteps[step].media.ptime = ptime; mgcPort[port].mgcfOperSteps[step].media.conMode = MGCP_CON_MODE_RECVONLY; mgcPort[port].mgcfOperSteps[step].localChnl = dstChnl; mgcPort[port].mgcfOperSteps[step].remChnl = orgChnl; mgcPort[port].mgcfOperSteps[step].chnlConnectIndex = dstChnl.connectNo; mgcPort[port].mgcfOperSteps[step].media.vocoderType = mgcConnectInfo[orgConnectIndex].codecList;//destConnectIndex mgcPort[port].mgcfOperSteps[step++].cmd = MGCP_CMD_MDCX; } } } toneNo = times * 10 + (toneNo - 7); if (mgc_apply_aas_tone(&aasChnl, toneNo) < 0) { mgc_log_err("mgc_connect_AAS: apply aas tone fail!\n\r"); mgc_port_init(port); return -1; } else { if ((aasChnl.mgNo >= MGC_MAX_NUM_OF_MG) || (aasChnl.portNo != 0xFF) || (aasChnl.chlNo != toneNo) || (aasChnl.connectNo > MGC_MAX_NUM_OF_CON)) { mgc_log_err("mgc_connect_AAS: apply aas mg fail!\n\r"); mgc_port_init(port); return -1; } else { if ((mgcConnectInfo[orgConnectIndex].flag & MGCP_PARA_FLAG_TFO) == MGCP_PARA_FLAG_TFO) { ptime = mgcMgInfo[orgChnl.mgNo].mgAttr.ptime; mgcPort[port].mgcfOperSteps[step].media.ptime = ptime; if (toneNo == 0) { mgcPort[port].mgcfOperSteps[step].media.conMode = MGCP_CON_MODE_RECVONLY; } else { mgcPort[port].mgcfOperSteps[step].media.conMode = mgcConnectInfo[orgConnectIndex].mediaAttr.conMode;; } mgcPort[port].mgcfOperSteps[step].localChnl = orgChnl; mgcPort[port].mgcfOperSteps[step].remChnl = dstChnl; if (destConnectIndex < MGC_MAX_NUM_OF_CON) { mgcPort[port].mgcfOperSteps[step].media.vocoderType = mgcConnectInfo[destConnectIndex].codecList;//orgConnectIndex } else { mgcPort[port].mgcfOperSteps[step].media.vocoderType = mgcConnectInfo[orgConnectIndex].codecList; } mgcPort[port].mgcfOperSteps[step++].cmd = MGCP_CMD_MDCX; } chnlIndexAAS = mgcMgInfo[aasChnl.mgNo].chnlStartIndex + aasChnl.chlNo; aasConnectIndex = mgcChnl[chnlIndexAAS].connectIndex[aasChnl.connectNo]; ptime = mgcConnectInfo[orgConnectIndex].mediaAttr.ptime; mgcPort[port].mgcfOperSteps[step].media.ptime = ptime; mgcPort[port].mgcfOperSteps[step].media.conMode = MGCP_CON_MODE_SENDONLY; mgcPort[port].mgcfOperSteps[step].localChnl = aasChnl; mgcPort[port].mgcfOperSteps[step].remChnl = orgChnl; mgcPort[port].mgcfOperSteps[step].cmd = MGCP_CMD_CRCX; // mgcPort[port].mgcfOperSteps[step].media.vocoderType = mgcMgInfo[orgChnl.mgNo].mgAttr.codecList; mgcPort[port].mgcfOperSteps[step].media.vocoderType = mgcConnectInfo[orgConnectIndex].codecList; mgcConnectInfo[orgConnectIndex].aasChnl = aasChnl; memcpy((BYTE *) &mgcConnectInfo[aasConnectIndex].mediaAttr.sdp, (BYTE *) &mgcConnectInfo[orgConnectIndex].mediaAttr.sdp, sizeof(PUB_SDP_MSG)); if (MGC_MG_TYPE_INTERNAL == mgcMgInfo[orgChnl.mgNo].mgAttr.mgType) { if (duration == 0) { mgcPort[port].mgcfOperSteps[step].delay = MGC_MGCF_TIMER_1H; } else { mgcPort[port].mgcfOperSteps[step].delay = duration * MGC_MGCF_TIMER_1S; } } mgcPort[port].mgcfOperSteps[step++].chnlConnectIndex = aasChnl.connectNo; if (MGC_MG_TYPE_INTERNAL != mgcMgInfo[orgChnl.mgNo].mgAttr.mgType) { ptime = mgcMgInfo[orgChnl.mgNo].mgAttr.ptime; mgcPort[port].mgcfOperSteps[step].media.ptime = ptime; mgcPort[port].mgcfOperSteps[step].media.conMode = MGCP_CON_MODE_RECVONLY; mgcPort[port].mgcfOperSteps[step].localChnl = orgChnl; mgcPort[port].mgcfOperSteps[step].remChnl = aasChnl; mgcPort[port].mgcfOperSteps[step].chnlConnectIndex = orgChnl.connectNo; mgcPort[port].mgcfOperSteps[step].media.vocoderType = mgcConnectInfo[orgConnectIndex].codecList; mgcPort[port].mgcfOperSteps[step].cmd = MGCP_CMD_MDCX; if (duration == 0) { mgcPort[port].mgcfOperSteps[step++].delay = MGC_MGCF_TIMER_1H; } else { mgcPort[port].mgcfOperSteps[step++].delay = duration * MGC_MGCF_TIMER_1S; } } mgcPort[port].mgcfOperSteps[step].localChnl = aasChnl; mgcPort[port].mgcfOperSteps[step].remChnl = orgChnl; mgcPort[port].mgcfOperSteps[step].chnlConnectIndex = aasChnl.connectNo; mgcPort[port].mgcfOperSteps[step++].cmd = MGCP_CMD_DLCX; } } mgcPort[port].mgcfOperId = MGC_OPER_ID_CONNECT_AAS; mgcPort[port].mgcfState = MGC_MGCF_STATE_REQUEST; mgcPort[port].mgcfOperStepsNum = step; pConnect = &mgcConnectInfo[orgConnectIndex]; memset(&(pConnect->operRec) , 0 , sizeof(OPER_REC)); pConnect->operRec.operaId = MGC_OPER_ID_CONNECT_AAS; pConnect->operRec.tone = tone; pConnect->operRec.duration = duration; pConnect->operRec.times = times; sprintf(tmpStr, "mgc_connect_AAS: succeed, usrPort = %d, Org: mgNo = %d, portNo = %d, chnlNo = %d, connectNo = %d, connectIndex = %d, Dest: mgNo = %d, portNo = %d, chnlNo = %d, connectNo = %d, connectIndex = %d, step = %d\n\r", usrPort, orgChnl.mgNo, orgChnl.portNo, orgChnl.chlNo, orgChnl.connectNo, orgConnectIndex, dstChnl.mgNo, dstChnl.portNo, dstChnl.chlNo, dstChnl.connectNo, destConnectIndex, step); mgc_log_procedure(orgChnl.mgNo, phyPortOrg, chnlIndexOrg, tmpStr); return 0; } int mgc_connect_tone(WORD usrPort, CHNL orgChnl, CHNL dstChnl, BYTE toneNo, WORD duration) { int port; BYTE step = 0, ptime; WORD orgChl, dstChl; WORD chnlIndexOrg, chnlIndexDst, phyPortOrg, phyPortDst, associPort; char tmpStr[256]; CHNL aasChnl = {0xFFFF, 0, 0xFFFF, 0xFFFF}; int orgConnectIndex; int destConnectIndex; WORD aasConnectIndex; WORD chnlIndexAAS; MGC_CODEC_LIST codecList; WORD orgAASChnlIndex; WORD orgAASConnectIndex; CHNL orgAASChnl; CONNECT_INFO *pConnect; BYTE tone; if ((orgChnl.mgNo >= MGC_MAX_NUM_OF_MG) || (dstChnl.mgNo >= MGC_MAX_NUM_OF_MG)) { mgc_log_err("mgc_connect_tone: invalid mgNo!\n\r"); return -1; } if ((mgcMgInfo[orgChnl.mgNo].mgAttr.ctrlType != mgcMgInfo[dstChnl.mgNo].mgAttr.ctrlType) && ((mgcMgInfo[orgChnl.mgNo].mgAttr.ctrlType == MGC_MG_CTRL_TYPE_8ECP) || (mgcMgInfo[dstChnl.mgNo].mgAttr.ctrlType == MGC_MG_CTRL_TYPE_8ECP))) { mgc_log_err("mgc_connect_chnl: mg ctrlType error!\n\r"); return -1; } if (toneNo >= MGC_MAX_TONE_NO) { mgc_log_err("mgc_connect_tone: invalid toneNo!\n\r"); return -1; } tone = toneNo; if (mgcMgInfo[orgChnl.mgNo].mgAttr.ctrlType == MGC_MG_CTRL_TYPE_8ECP) { orgChl = (mgcMgInfo[orgChnl.mgNo].mgAttr.e1cardNo * 8 + orgChnl.portNo) * 32 + orgChnl.chlNo; if ((0 == dstChnl.mgNo) && (0 == dstChnl.portNo) && (0 == dstChnl.chlNo)) { dstChl = (mgc_8k_tone_card_silent * 8 + 7) * 32 + 31; } else if ((1 == mgcMgInfo[dstChnl.mgNo].created) && (1 == mgcPhyPort[mgcMgInfo[dstChnl.mgNo].portIndex[dstChnl.portNo]].created)) { dstChl = (mgcMgInfo[dstChnl.mgNo].mgAttr.e1cardNo * 8 + dstChnl.portNo) * 32 + dstChnl.chlNo;//need revise } else { mgc_log_err("mgc_connect_tone: invalid 8ecp mgNo or portNo!\n\r"); return -1; } _8ecp_connect_tone(orgChl, dstChl, toneNo, duration); sprintf(tmpStr, "mgc_connect_tone: succeed, usrPort = %d, Org: mgNo = %d, portNo = %d, chnlNo = %d\n\r", usrPort, orgChnl.mgNo, orgChnl.portNo, orgChnl.chlNo); mgc_log_procedure(orgChnl.mgNo, phyPortOrg, chnlIndexOrg, tmpStr); return 0; } if ((orgChnl.portNo >= MGC_MAX_PHY_PORT_PER_MG) || (dstChnl.portNo >= MGC_MAX_PHY_PORT_PER_MG)) { mgc_log_err("mgc_connect_tone: invalid portNo!\n\r"); return -1; } if ((orgChnl.connectNo >= MGC_MAX_NUM_OF_CHNL_CON) || (dstChnl.connectNo >= MGC_MAX_NUM_OF_CHNL_CON)) { mgc_log_err("mgc_connect_tone: invalid connectNo!\n\r"); return -1; } if ((MGC_MG_TYPE_ANN == mgcMgInfo[orgChnl.mgNo].mgAttr.mgType) || (MGC_MG_TYPE_INTERNAL == mgcMgInfo[orgChnl.mgNo].mgAttr.mgType)) { chnlIndexOrg = mgcMgInfo[orgChnl.mgNo].chnlStartIndex + orgChnl.chlNo; } else { phyPortOrg = mgcMgInfo[orgChnl.mgNo].portIndex[orgChnl.portNo]; chnlIndexOrg = mgcPhyPort[phyPortOrg].chnlStartIndex + orgChnl.chlNo; } if (chnlIndexOrg >= MGC_MAX_NUM_OF_CHNL || ((mgcMgInfo[orgChnl.mgNo].mgAttr.mgType != MGC_MG_TYPE_INTERNAL) && (mgcMgInfo[orgChnl.mgNo].mgAttr.mgType != MGC_MG_TYPE_ANN) && (phyPortOrg >= MGC_MAX_NUM_OF_PHY_PORT))) { mgc_log_err("mgc_connect_tone: invalid chnlIndex or phyPort of orgChnl!\n\r"); return -1; } if (((orgConnectIndex = mgcChnl[chnlIndexOrg].connectIndex[orgChnl.connectNo]) >= MGC_MAX_NUM_OF_CON) || (mgcConnectInfo[orgConnectIndex].assigned != 1))//new replace { if ((orgConnectIndex = mgc_assign_connect_to_chnl(orgChnl)) < 0) { mgc_log_err("mgc_connect_tone: assigned connect on orgChnl failed!\n\r"); return -1; } } associPort = mgcConnectInfo[orgConnectIndex].port; if ((associPort < MGC_MAX_NUM_OF_PORT) && (mgcPort[associPort].assigned != 0)) { mgcPort[associPort].mngCmd = MGC_MNG_CMD_OVERWRITE; mgc_log_err("mgc_connect_tone: orgChnl connection operation overwritten!\n\r"); } orgAASChnl = mgcConnectInfo[orgConnectIndex].aasChnl; if ((orgAASChnl.mgNo < MGC_MAX_NUM_OF_MG) && (orgAASChnl.chlNo < MGC_MAX_NUM_OF_CHNL) && (orgAASChnl.connectNo < MGC_MAX_NUM_OF_CHNL_CON)) { orgAASChnlIndex = mgcMgInfo[orgAASChnl.mgNo].chnlStartIndex + orgAASChnl.chlNo; if ((orgAASConnectIndex = mgcChnl[orgAASChnlIndex].connectIndex[orgAASChnl.connectNo]) < MGC_MAX_NUM_OF_CON) { associPort = mgcConnectInfo[orgAASConnectIndex].port; if ((associPort < MGC_MAX_NUM_OF_PORT) && (mgcPort[associPort].assigned != 0)) { mgcPort[associPort].mngCmd = MGC_MNG_CMD_OVERWRITE; mgc_log_err("mgc_connect_tone: connection aasChnl operation overwritten!\n\r"); } } } associPort = mgcChnl[chnlIndexOrg].port; if ((associPort < MGC_MAX_NUM_OF_PORT) && (mgcPort[associPort].assigned != 0)) { mgcPort[associPort].mngCmd = MGC_MNG_CMD_OVERWRITE; mgc_log_err("mgc_connect_tone: orgChnl chnl operation overwritten!\n\r"); } if ((MGC_MG_TYPE_ANN == mgcMgInfo[dstChnl.mgNo].mgAttr.mgType) || (MGC_MG_TYPE_INTERNAL == mgcMgInfo[dstChnl.mgNo].mgAttr.mgType)) { chnlIndexDst = mgcMgInfo[dstChnl.mgNo].chnlStartIndex + dstChnl.chlNo; } else { phyPortDst = mgcMgInfo[dstChnl.mgNo].portIndex[dstChnl.portNo]; chnlIndexDst = mgcPhyPort[phyPortDst].chnlStartIndex + dstChnl.chlNo; } if (chnlIndexDst >= MGC_MAX_NUM_OF_CHNL || ((mgcMgInfo[dstChnl.mgNo].mgAttr.mgType != MGC_MG_TYPE_INTERNAL) && (mgcMgInfo[dstChnl.mgNo].mgAttr.mgType != MGC_MG_TYPE_ANN) && (phyPortDst >= MGC_MAX_NUM_OF_PHY_PORT))) { mgc_log_err("mgc_connect_tone: invalid destChnl chnlIndex or phyPort of orgChnl!\n\r"); return -1; } destConnectIndex = mgcChnl[chnlIndexDst].connectIndex[dstChnl.connectNo]; if ((mgcConnectInfo[orgConnectIndex].codecList.num == 0) && (mgcMgInfo[orgChnl.mgNo].mgAttr.mgType != MGC_MG_TYPE_INTERNAL)) { if (mgc_match_codec_list(&mgcConnectInfo[orgConnectIndex].codecList, &mgcConnectInfo[orgConnectIndex].codecList, &mgcMgInfo[orgChnl.mgNo].mgAttr.codecList) < 0) { mgc_log_err("mgc_connect_tone: mgcConnectInfo[orgConnectIndex].codecList error!\n\n"); return -1; } } if (destConnectIndex < MGC_MAX_NUM_OF_CON) { if ((mgcConnectInfo[destConnectIndex].codecList.num == 0) && (mgcMgInfo[dstChnl.mgNo].mgAttr.mgType != MGC_MG_TYPE_INTERNAL)) { if (mgc_match_codec_list(&mgcConnectInfo[destConnectIndex].codecList, &mgcConnectInfo[destConnectIndex].codecList, &mgcMgInfo[dstChnl.mgNo].mgAttr.codecList) < 0) { mgc_log_err("mgc_connect_tone: mgcConnectInfo[dstConnectIndex].codecList error!\n\n"); return -1; } } if (mgc_match_codec_list(&codecList, &mgcConnectInfo[orgConnectIndex].codecList, &mgcConnectInfo[destConnectIndex].codecList) < 0) { mgc_log_err("mgc_connect_AAS: orgConnect and dstConnect code negotiation fail!\n\n"); return -1; } } else codecList = mgcConnectInfo[orgConnectIndex].codecList; if ((port = mgc_get_port()) < 0) { mgc_log_err("mgc_connect_tone: port resource not available!\n\r"); return -1; } mgcPort[port].usrPort = usrPort; if (mgcConnectInfo[orgConnectIndex].status != MGC_CONNECT_STATUS_CREATED) { if (MGC_MG_TYPE_INTERNAL != mgcMgInfo[orgChnl.mgNo].mgAttr.mgType) { ptime = mgcMgInfo[orgChnl.mgNo].mgAttr.ptime; mgcPort[port].mgcfOperSteps[step].localChnl = orgChnl; mgcPort[port].mgcfOperSteps[step].media.ptime = ptime; mgcPort[port].mgcfOperSteps[step].media.conMode = MGCP_CON_MODE_RECVONLY; mgcPort[port].mgcfOperSteps[step].chnlConnectIndex = orgChnl.connectNo; mgcPort[port].mgcfOperSteps[step].media.vocoderType = mgcConnectInfo[orgConnectIndex].codecList; mgcPort[port].mgcfOperSteps[step++].cmd = MGCP_CMD_CRCX; } } else { if (mgcConnectInfo[orgConnectIndex].mediaAttr.conMode >= MGCP_CON_MODE_SENDONLY) { ptime = mgcMgInfo[orgChnl.mgNo].mgAttr.ptime; mgcPort[port].mgcfOperSteps[step].media.ptime = ptime; mgcPort[port].mgcfOperSteps[step].media.conMode = MGCP_CON_MODE_RECVONLY; mgcPort[port].mgcfOperSteps[step].localChnl = orgChnl; mgcPort[port].mgcfOperSteps[step].remChnl = dstChnl; mgcPort[port].mgcfOperSteps[step].media.vocoderType = mgcConnectInfo[orgConnectIndex].codecList; mgcPort[port].mgcfOperSteps[step++].cmd = MGCP_CMD_MDCX; } } if ((destConnectIndex < MGC_MAX_NUM_OF_CON) && (mgcConnectInfo[destConnectIndex].status == MGC_CONNECT_STATUS_CREATED)) { if (mgcConnectInfo[destConnectIndex].mediaAttr.conMode >= MGCP_CON_MODE_SENDONLY) { ptime = mgcMgInfo[dstChnl.mgNo].mgAttr.ptime; mgcPort[port].mgcfOperSteps[step].media.ptime = ptime; mgcPort[port].mgcfOperSteps[step].media.conMode = MGCP_CON_MODE_RECVONLY; mgcPort[port].mgcfOperSteps[step].localChnl = dstChnl; mgcPort[port].mgcfOperSteps[step].remChnl = orgChnl; mgcPort[port].mgcfOperSteps[step].chnlConnectIndex = dstChnl.connectNo; mgcPort[port].mgcfOperSteps[step].media.vocoderType = mgcConnectInfo[orgConnectIndex].codecList; mgcPort[port].mgcfOperSteps[step++].cmd = MGCP_CMD_MDCX; } } if (mgcMgInfo[orgChnl.mgNo].mgAttr.toneCap == 1) { mgcPort[port].mgcfOperSteps[step].localChnl = orgChnl; mgcPort[port].mgcfOperSteps[step].cmd = MGCP_CMD_RQNT; mgcPort[port].mgcfOperSteps[step].pkgSignal = MGC_TONE_NO_TO_PKG_SIG[toneNo]; mgcPort[port].mgcfOperSteps[step].chnlConnectIndex = orgChnl.connectNo; if (duration == 0) { mgcPort[port].mgcfOperSteps[step++].delay = MGC_MGCF_TIMER_1H; } else { mgcPort[port].mgcfOperSteps[step++].delay = duration * MGC_MGCF_TIMER_1S; } mgcPort[port].mgcfOperSteps[step].localChnl = orgChnl; mgcPort[port].mgcfOperSteps[step].pkgSignal = 0; mgcPort[port].mgcfOperSteps[step].chnlConnectIndex = orgChnl.connectNo; mgcPort[port].mgcfOperSteps[step++].cmd = MGCP_CMD_RQNT; } else { toneNo = toneNo - 7; if (mgc_apply_aas_tone(&aasChnl, toneNo) < 0) { mgc_log_err("mgc_connect_tone: mg no toneCap and no AAS MG!\n\r"); mgc_port_init(port); return -1; } else { if ((aasChnl.mgNo >= MGC_MAX_NUM_OF_MG) || (aasChnl.portNo != 0xFF) || (aasChnl.chlNo != toneNo) || (aasChnl.connectNo > MGC_MAX_NUM_OF_CON)) { mgc_log_err("mgc_connect_tone: mg no toneCap and apply aas mg fault!\n\r"); mgc_port_init(port); return -1; } else { if ((mgcConnectInfo[orgConnectIndex].flag & MGCP_PARA_FLAG_TFO) == MGCP_PARA_FLAG_TFO) { ptime = mgcMgInfo[orgChnl.mgNo].mgAttr.ptime; mgcPort[port].mgcfOperSteps[step].media.ptime = ptime; mgcPort[port].mgcfOperSteps[step].media.conMode = MGCP_CON_MODE_RECVONLY; mgcPort[port].mgcfOperSteps[step].localChnl = orgChnl; mgcPort[port].mgcfOperSteps[step].remChnl = dstChnl; mgcPort[port].mgcfOperSteps[step].media.vocoderType = mgcConnectInfo[orgConnectIndex].codecList; mgcPort[port].mgcfOperSteps[step++].cmd = MGCP_CMD_MDCX; } chnlIndexAAS = mgcMgInfo[aasChnl.mgNo].chnlStartIndex + aasChnl.chlNo; aasConnectIndex = mgcChnl[chnlIndexAAS].connectIndex[aasChnl.connectNo]; ptime = mgcConnectInfo[orgConnectIndex].mediaAttr.ptime; mgcPort[port].mgcfOperSteps[step].media.ptime = ptime; mgcPort[port].mgcfOperSteps[step].media.conMode = MGCP_CON_MODE_SENDONLY; mgcPort[port].mgcfOperSteps[step].localChnl = aasChnl; mgcPort[port].mgcfOperSteps[step].remChnl = orgChnl; mgcPort[port].mgcfOperSteps[step].cmd = MGCP_CMD_CRCX; mgcPort[port].mgcfOperSteps[step].media.vocoderType = mgcConnectInfo[orgConnectIndex].codecList; mgcConnectInfo[orgConnectIndex].aasChnl = aasChnl; memcpy((BYTE *) &mgcConnectInfo[aasConnectIndex].mediaAttr.sdp, (BYTE *) &mgcConnectInfo[orgConnectIndex].mediaAttr.sdp, sizeof(PUB_SDP_MSG)); if (MGC_MG_TYPE_INTERNAL == mgcMgInfo[orgChnl.mgNo].mgAttr.mgType) { if (duration == 0) { mgcPort[port].mgcfOperSteps[step].delay = MGC_MGCF_TIMER_1H; } else { mgcPort[port].mgcfOperSteps[step].delay = duration * MGC_MGCF_TIMER_1S; } } mgcPort[port].mgcfOperSteps[step++].chnlConnectIndex = aasChnl.connectNo; if (MGC_MG_TYPE_INTERNAL != mgcMgInfo[orgChnl.mgNo].mgAttr.mgType) { ptime = mgcMgInfo[orgChnl.mgNo].mgAttr.ptime; mgcPort[port].mgcfOperSteps[step].media.ptime = ptime; mgcPort[port].mgcfOperSteps[step].media.conMode = mgcConnectInfo[orgConnectIndex].mediaAttr.conMode; mgcPort[port].mgcfOperSteps[step].localChnl = orgChnl; mgcPort[port].mgcfOperSteps[step].remChnl = aasChnl; mgcPort[port].mgcfOperSteps[step].chnlConnectIndex = orgChnl.connectNo; mgcPort[port].mgcfOperSteps[step].media.vocoderType = mgcConnectInfo[orgConnectIndex].codecList; mgcPort[port].mgcfOperSteps[step].cmd = MGCP_CMD_MDCX; if (duration == 0) { mgcPort[port].mgcfOperSteps[step++].delay = MGC_MGCF_TIMER_1H; } else { mgcPort[port].mgcfOperSteps[step++].delay = duration * MGC_MGCF_TIMER_1S; } } mgcPort[port].mgcfOperSteps[step].localChnl = aasChnl; mgcPort[port].mgcfOperSteps[step].remChnl = orgChnl; mgcPort[port].mgcfOperSteps[step].chnlConnectIndex = aasChnl.connectNo; mgcPort[port].mgcfOperSteps[step++].cmd = MGCP_CMD_DLCX; } } } mgcPort[port].mgcfOperId = MGC_OPER_ID_CONNECT_TONE; mgcPort[port].mgcfState = MGC_MGCF_STATE_REQUEST; mgcPort[port].mgcfOperStepsNum = step; pConnect = &mgcConnectInfo[orgConnectIndex]; memset(&(pConnect->operRec) , 0 , sizeof(OPER_REC)); pConnect->operRec.operaId = MGC_OPER_ID_CONNECT_TONE; pConnect->operRec.tone = tone; pConnect->operRec.duration = duration; sprintf(tmpStr, "mgc_connect_tone: succeed, usrPort = %d, Org: mgNo = %d, portNo = %d, chnlNo = %d, connectNo = %d, connectIndex = %d, Dest: mgNo = %d, portNo = %d, chnlNo = %d, connectNo = %d, connectIndex = %d, step = %d\n\r", usrPort, orgChnl.mgNo, orgChnl.portNo, orgChnl.chlNo, orgChnl.connectNo, orgConnectIndex, dstChnl.mgNo, dstChnl.portNo, dstChnl.chlNo, dstChnl.connectNo, destConnectIndex, step); mgc_log_procedure(orgChnl.mgNo, phyPortOrg, chnlIndexOrg, tmpStr); return 0; } int mgc_query_mg_status(WORD mgNo) { if (mgNo >= MGC_MAX_NUM_OF_MG) { mgc_log_err("mgc_query_mg_status: invalid mgNo!\n\r"); return -1; } return mgcMgInfo[mgNo].status; } int mgc_query_port_status(WORD mgNo, BYTE portNo) { if ((mgNo >= MGC_MAX_NUM_OF_MG) || (portNo >= MGC_MAX_PHY_PORT_PER_MG) || (0 == mgcPhyPort[mgcMgInfo[mgNo].portIndex[portNo]].created)) { mgc_log_err("mgc_query_port_status: invalid mgNo or portNo!\n\r"); return 0; } return mgcPhyPort[mgcMgInfo[mgNo].portIndex[portNo]].phyStatus; } int mgc_query_channel_status(CHNL chnl) { if ((chnl.mgNo >= MGC_MAX_NUM_OF_MG) || (chnl.portNo >= MGC_MAX_PHY_PORT_PER_MG)) { mgc_log_err("mgc_query_channel_status: invalid mgNo or portNo!\n\r"); return -1; } return mgcChnl[mgcPhyPort[mgcMgInfo[chnl.mgNo].portIndex[chnl.portNo]].chnlStartIndex + chnl.chlNo].status; } int mgc_create_virtual_chnl(WORD port, CHNL *chnl) { int chnlIndex; char tmpStr[128]; chnl->mgNo = MGC_INTERNAL_VIRTUAL_MG; chnl->portNo = 0; if ((chnlIndex = mgc_assign_chnl(0xFF, MGC_INTERNAL_VIRTUAL_MG, 0xFF, MGC_MG_TYPE_INTERNAL)) < 0) { mgc_log_err("mgc_create_virtual_chnl: can't allocate virtual channel!\n\r"); return -1; } chnl->chlNo = chnlIndex - mgcMgInfo[chnl->mgNo].chnlStartIndex; if (mgc_assign_connect_to_chnl(*chnl) < 0) { mgc_log_err("mgc_create_virtual_chnl: can't allocate connect!\n\r"); return -1; } sprintf(tmpStr, "mgc_create_virtual_chnl: succeed, usrPort = %d, assigned chnlIndex = %d\n\r", port, chnlIndex); mgc_log_procedure(chnl->mgNo, 0xFFFF, chnlIndex, tmpStr); // mgc_asciout_proc(tmpStr); return 0; } int mgc_release_virtual_chnl(WORD port, CHNL chnl) { WORD chnlIndex; char tmpStr[128]; int connectIndex; WORD associPort; WORD aasChnlIndex; WORD aasConnectIndex; CHNL aasChnl; if ((chnl.mgNo != MGC_INTERNAL_VIRTUAL_MG) || (chnl.portNo != 0)) { mgc_log_err("mgc_release_virtual_chnl: invalid mgNo or portNo!\n\r"); return -1; } chnlIndex = mgcMgInfo[chnl.mgNo].chnlStartIndex + chnl.chlNo; if ((connectIndex = mgcChnl[chnlIndex].connectIndex[chnl.connectNo]) < MGC_MAX_NUM_OF_CON) { aasChnl = mgcConnectInfo[connectIndex].aasChnl; if ((aasChnl.mgNo < MGC_MAX_NUM_OF_MG) && (aasChnl.chlNo < MGC_MAX_NUM_OF_CHNL) && (aasChnl.connectNo < MGC_MAX_NUM_OF_CHNL_CON)) { aasChnlIndex = mgcMgInfo[aasChnl.mgNo].chnlStartIndex + aasChnl.chlNo; if ((aasConnectIndex = mgcChnl[aasChnlIndex].connectIndex[aasChnl.connectNo]) < MGC_MAX_NUM_OF_CON) { associPort = mgcConnectInfo[aasConnectIndex].port; if ((associPort < MGC_MAX_NUM_OF_PORT) && (mgcPort[associPort].assigned != 0)) { mgcPort[associPort].mngCmd = MGC_MNG_CMD_OVERWRITE; mgc_log_err("mgc_release_virtual_chnl: connection aasChnl operation overwritten!\n\r"); } } } } else { mgc_log_err("mgc_release_virtual_chnl: invalid connectIndex!\n\r"); } mgc_remove_chnl(chnlIndex, MGC_CHNL_NUM_INTERNAL_PER_PORT); sprintf(tmpStr, "mgc_release_virtual_chnl: succeed, usrPort = %d, chnlIndex = %d\n\r", port, chnlIndex); mgc_log_procedure(chnl.mgNo, 0xFFFF, chnlIndex, tmpStr); // mgc_asciout_proc(tmpStr); return 0; } int mgc_query_chnl_media(WORD port, CHNL chnl, PUB_SDP_MSG **mediaInfo, BYTE *mgPayloads, BYTE *mgPlNum) { WORD phyPort, chnlIndex; WORD connectIndex; int i; char tmpStr[128]; if ((chnl.mgNo >= MGC_MAX_NUM_OF_MG) || (chnl.portNo >= MGC_MAX_PHY_PORT_PER_MG)) { mgc_log_err("mgc_query_chnl_media: invalid mgNo or portNo!\n\r"); return -1; } if (mgcMgInfo[chnl.mgNo].mgAttr.mgType == MGC_MG_TYPE_INTERNAL) chnlIndex = mgcMgInfo[chnl.mgNo].chnlStartIndex + chnl.chlNo; else { phyPort = mgcMgInfo[chnl.mgNo].portIndex[chnl.portNo]; chnlIndex = mgcPhyPort[phyPort].chnlStartIndex + chnl.chlNo; } if ((connectIndex = mgcChnl[chnlIndex].connectIndex[chnl.connectNo]) >= MGC_MAX_NUM_OF_CON) { return -1; } if ((mgcConnectInfo[connectIndex].status != MGC_CONNECT_STATUS_CREATED)&&(mgcConnectInfo[connectIndex].status != MGC_CONNECT_STATUS_TONE)) // if (mgcChnl[chnlIndex].status != MGC_CHNL_STATUS_CREATED) return -1; *mediaInfo = &mgcConnectInfo[connectIndex].mediaAttr.sdp; for (i = 0; i < mgcConnectInfo[connectIndex].codecList.num; i++) { mgPayloads[i] = mgc_codec_to_payload(mgcConnectInfo[connectIndex].codecList.codec[i]); } *mgPlNum = mgcConnectInfo[connectIndex].codecList.num; // *mediaInfo = &mgcChnl[chnlIndex].mediaAttr.sdp; sprintf(tmpStr, "mgc_query_chnl: rtpmap=%s\n\r", (*mediaInfo)->medias.medias[0].attrs.attrs[0].aValue); mgc_asciout_proc(tmpStr); return 0; } int mgc_payload_to_codec(WORD payload, PUB_SDP_ATTRS attrs) { BYTE i = 0; if (attrs.num > 0) { for (i = 0; i < attrs.num; i++) { if (attrs.attrs[i].aType != PUB_SDP_ATTR_TYPE_RTPMAP) { continue; } if (strtol(attrs.attrs[i].aValue, NULL, 10) == payload) { if (strstr(attrs.attrs[i].aValue, " GSM/") != NULL) return MGC_VCTYPE_GSM; else if (strstr(attrs.attrs[i].aValue, "GSM-EFR") != NULL) return MGC_VCTYPE_GSM_EFR; else if (strstr(attrs.attrs[i].aValue, "AMR") != NULL) return MGC_VCTYPE_AMR_12_2; else if (strstr(attrs.attrs[i].aValue, "G729B") != NULL) return MGC_VCTYPE_G729B; else if (strstr(attrs.attrs[i].aValue, "PCMU") != NULL) return MGC_VCTYPE_PCMU; else if (strstr(attrs.attrs[i].aValue, "AMR_12_2") != NULL) return MGC_VCTYPE_AMR_12_2; else if (strstr(attrs.attrs[i].aValue, "AMR_10_2") != NULL) return MGC_VCTYPE_AMR_10_2; else if (strstr(attrs.attrs[i].aValue, "AMR_7_95") != NULL) return MGC_VCTYPE_AMR_7_95; else if (strstr(attrs.attrs[i].aValue, "AMR_7_4") != NULL) return MGC_VCTYPE_AMR_7_4; else if (strstr(attrs.attrs[i].aValue, "AMR_6_7") != NULL) return MGC_VCTYPE_AMR_6_7; else if (strstr(attrs.attrs[i].aValue, "AMR_5_15") != NULL) return MGC_VCTYPE_AMR_5_15; else if (strstr(attrs.attrs[i].aValue, "AMR_5_9") != NULL) return MGC_VCTYPE_AMR_5_9; else if (strstr(attrs.attrs[i].aValue, "AMR_4_75") != NULL) return MGC_VCTYPE_AMR_4_75; else return MGC_VCTYPE_PCMA; } } } if (i == attrs.num) { if (payload == 3) return MGC_VCTYPE_GSM; else if (payload == 84) return MGC_VCTYPE_GSM_EFR; else if (payload == 118) return MGC_VCTYPE_G729B; else if (payload == 0) return MGC_VCTYPE_PCMU; else if (payload == 71) return MGC_VCTYPE_AMR_12_2; else if (payload == 70) return MGC_VCTYPE_AMR_10_2; else if (payload == 69) return MGC_VCTYPE_AMR_7_95; else if (payload == 68) return MGC_VCTYPE_AMR_7_4; else if (payload == 67) return MGC_VCTYPE_AMR_6_7; else if (payload == 65) return MGC_VCTYPE_AMR_5_15; else if (payload == 66) return MGC_VCTYPE_AMR_5_9; else if (payload == 64) return MGC_VCTYPE_AMR_4_75; } return MGC_VCTYPE_PCMA; } int mgc_update_chnl_media(WORD port, CHNL chnl, PUB_SDP_MSG *mediaInfo) { WORD chnlIndex; BYTE i; WORD connectIndex; BYTE ptime; char tmpStr[128]; if ((chnl.mgNo != MGC_INTERNAL_VIRTUAL_MG) || (chnl.portNo != 0)) { mgc_log_err("mgc_update_chnl_media: invalid mgNo or portNo!\n\r"); return -1; } chnlIndex = mgcMgInfo[chnl.mgNo].chnlStartIndex + chnl.chlNo; connectIndex = mgcChnl[chnlIndex].connectIndex[chnl.connectNo]; if (connectIndex > MGC_MAX_NUM_OF_CON) { mgc_log_err("mgc_update_chnl_media: invalid chnl connectNo!\n\r"); return -1; } memcpy((BYTE *) &mgcConnectInfo[connectIndex].mediaAttr.sdp, mediaInfo, sizeof(PUB_SDP_MSG)); // memcpy((BYTE *) &mgcChnl[chnlIndex].mediaAttr.sdp, mediaInfo, sizeof(PUB_SDP_MSG)); mgcConnectInfo[connectIndex].codecList.num = mediaInfo->medias.medias[0].m.plNum; for (i = 0; i < mgcConnectInfo[connectIndex].codecList.num; i++) { mgcConnectInfo[connectIndex].codecList.codec[i] = mgc_payload_to_codec(mediaInfo->medias.medias[0].m.payloads[i], mediaInfo->medias.medias[0].attrs); } mgcConnectInfo[connectIndex].codecList.priority = 256; if (chnl.mgNo == MGC_MG_TYPE_INTERNAL) { mgcMgInfo[chnl.mgNo].mgAttr.codecList.num = mediaInfo->medias.medias[0].m.plNum; for (i = 0; i < mgcConnectInfo[connectIndex].codecList.num; i++) { mgcMgInfo[chnl.mgNo].mgAttr.codecList.codec[i] = mgcConnectInfo[connectIndex].codecList.codec[i]; } } for (i = 0; i < mediaInfo->medias.medias[0].attrs.num; i++) { if (mediaInfo->medias.medias[0].attrs.attrs[i].aType == PUB_SDP_ATTR_TYPE_PTIME) { ptime = atoi(mediaInfo->medias.medias[0].attrs.attrs[0].aValue); break; } } if (i == mediaInfo->medias.medias[0].attrs.num) ptime = 20; mgcConnectInfo[connectIndex].mediaAttr.ptime = ptime; if (MGC_MG_TYPE_INTERNAL == mgcMgInfo[chnl.mgNo].mgAttr.mgType) { // mgcChnl[chnl.chlNo].status = MGC_CHNL_STATUS_CREATED; mgcConnectInfo[connectIndex].status = MGC_CONNECT_STATUS_CREATED; } // mgcChnl[chnlIndex].codecList.num = mediaInfo->medias.medias[0].m.plNum; // for (i = 0; i < mgcChnl[chnlIndex].codecList.num; i++) // mgcChnl[chnlIndex].codecList.codec[i] = mgc_payload_to_codec(mediaInfo->medias.medias[0].m.payloads[i]); // mgcChnl[chnlIndex].codecList.priority = 1; sprintf(tmpStr, "mgc_update_chnl_media: codec=%d, connectIndex=%d\n\r", mgcConnectInfo[connectIndex].codecList.codec[0], connectIndex); mgc_asciout_proc(tmpStr); return 0; } int mgc_license_ctrl(WORD maxMgNum, WORD maxChnlNum) { char tmpStr[128]; if ((maxMgNum > MGC_MAX_NUM_OF_MG) || (maxChnlNum > MGC_MAX_NUM_OF_CHNL)) { mgc_log_err("mgc_license_ctrl: invalid maxMgNum or maxChnlNum!\n\r"); return -1; } mgcMaxMgNo = maxMgNum; mgcMaxChlNo = maxChnlNum; sprintf(tmpStr, "mgc_license_ctrl: succeed, mgcMaxMgNo = %d, mgcMaxChlNo = %d\n\r", mgcMaxMgNo, mgcMaxChlNo); mgc_asciout_proc(tmpStr); return 0; } int mgc_rsp(BYTE cmd, WORD usrPort, WORD port, WORD retCode, MEDIA_ATTR *mediaAttr) { WORD portIndex; WORD chnlIndex; PORT_INFO *portInfo; char tmpStr[128]; int connectIndex; if ((port >= MGC_MAX_NUM_OF_PORT) || ((cmd != MGCP_CMD_CRCX) && (mgcPort[port].usrPort != usrPort)) || (mgcPort[port].llCmd != cmd)) { mgc_log_err("mgc_rsp: invalid port or cmd!\n\r"); return -1; } portInfo = &mgcPort[port]; if (MGC_MG_TYPE_ANN == mgcMgInfo[portInfo->mgcfChnl.mgNo].mgAttr.mgType) { chnlIndex = mgcMgInfo[portInfo->mgcfChnl.mgNo].chnlStartIndex + portInfo->mgcfChnl.chlNo; } else { portIndex = mgcMgInfo[portInfo->mgcfChnl.mgNo].portIndex[portInfo->mgcfChnl.portNo]; chnlIndex = mgcPhyPort[portIndex].chnlStartIndex + portInfo->mgcfChnl.chlNo; } if ((cmd == MGCP_CMD_CRCX) && (retCode == 200)) { if ((connectIndex = mgcChnl[chnlIndex].connectIndex[portInfo->mgcfChnl.connectNo]) >= MGC_MAX_NUM_OF_CON) { mgc_log_err("mgc_rsp: CRCX invalid connectIndex!\n\r"); return -1; } sprintf(mgcConnectInfo[connectIndex].mediaAttr.conId, "%X%04X%lX", portInfo->mgcfChnl.connectNo, usrPort, time(NULL)); // memcpy((BYTE *) &mgcChnl[chnlIndex].mediaAttr.sdp, (BYTE *) mediaAttr, sizeof(PUB_SDP_MSG)); memcpy((BYTE *) &mgcConnectInfo[connectIndex].mediaAttr.sdp, (BYTE *) &mediaAttr->sdp, sizeof(PUB_SDP_MSG)); } mgcPort[port].usrCmd = retCode; sprintf(tmpStr, "mgc_rsp: succeed, usrPort = %d, port = %d, retCode = %d, cmd = %d\n\r", usrPort, port, retCode, cmd); mgc_log_procedure(portInfo->mgcfChnl.mgNo, portIndex, chnlIndex, tmpStr); return 0; } /* Parameter chnl: the chnl need to update codec codecList: the codec up layer support Result failure: return -1 sucess : return 0~6 which is represent following codec #define MGC_VCTYPE_PCMA 0 #define MGC_VCTYPE_PCMU 1 #define MGC_VCTYPE_GSM 2 #define MGC_VCTYPE_GSM_EFR 3 #define MGC_VCTYPE_AMR 4 #define MGC_VCTYPE_G729B 5 #define MGC_VCTYPE_AMR_7_4 6 */ int mgc_chnl_codec_update(CHNL chnl , MGC_CODEC_LIST codecList) { MG_INFO *pMgInfo; WORD chnlIndex, phyPort; int connectIndex; MGC_CODEC_LIST codecListMg; MGC_CODEC_LIST codecListResult; BYTE codec; CONNECT_INFO *pConn = NULL; int i,j; if(chnl.mgNo > MGC_MAX_NUM_OF_MG) { mgc_log_err("mgc_chnl_codec_update: invalid mgNo!\n\r"); return -1; } pMgInfo = &mgcMgInfo[chnl.mgNo]; if(pMgInfo->mgAttr.ctrlType != MGC_MG_CTRL_TYPE_MGCP) return -1; if (chnl.portNo >= MGC_MAX_PHY_PORT_PER_MG) { mgc_log_err("mgc_chnl_codec_update: invalid portNo!\n\r"); return -1; } if (chnl.connectNo >= MGC_MAX_NUM_OF_CHNL_CON) { mgc_log_err("mgc_chnl_codec_update: invalid connectNo!\n\r"); return -1; } if ((MGC_MG_TYPE_ANN == pMgInfo->mgAttr.mgType)||(MGC_MG_TYPE_INTERNAL == pMgInfo->mgAttr.mgType)) { chnlIndex = pMgInfo->chnlStartIndex + chnl.chlNo; } else { phyPort = pMgInfo->portIndex[chnl.portNo]; chnlIndex = mgcPhyPort[phyPort].chnlStartIndex + chnl.chlNo; } if ((chnlIndex >= MGC_MAX_NUM_OF_CHNL) || ((mgcMgInfo[chnl.mgNo].mgAttr.mgType != MGC_MG_TYPE_ANN) && (phyPort >= MGC_MAX_NUM_OF_PHY_PORT))) { mgc_log_err("mgc_chnl_codec_update: invalid chnlIndex or phyPort!\n\r"); return -1; } if((mgcChnl[chnlIndex].connectIndex[chnl.connectNo] >= MGC_MAX_NUM_OF_CON)|| ((mgcConnectInfo[mgcChnl[chnlIndex].connectIndex[chnl.connectNo]].assigned != 1))) { connectIndex = mgc_assign_connect_to_chnl(chnl); if(connectIndex < 0) return -1; } else { connectIndex = mgcChnl[chnlIndex].connectIndex[chnl.connectNo]; } pConn = &mgcConnectInfo[connectIndex]; memset(&codecListResult , 0 , sizeof(MGC_CODEC_LIST)); memcpy(&codecListMg , &pMgInfo->mgAttr.codecList , sizeof(MGC_CODEC_LIST)); codecListMg.priority = codecList.priority + 1; for(i=0 ; imgAttr.mgType == MGC_MG_TYPE_IPBSS) memcpy(&pConn->codecList , &codecListResult , sizeof(MGC_CODEC_LIST)); switch(codecListResult.codec[0]) { case MGC_VCTYPE_AMR_12_2: case MGC_VCTYPE_AMR_10_2: return MGC_VCTYPE_AMR_12_2; case MGC_VCTYPE_AMR_7_95: case MGC_VCTYPE_AMR_7_4: case MGC_VCTYPE_AMR_6_7: case MGC_VCTYPE_AMR_5_15: case MGC_VCTYPE_AMR_5_9: case MGC_VCTYPE_AMR_4_75: return MGC_VCTYPE_AMR_7_95; default: return codecListResult.codec[0]; } return -1; } /* Parameter chnl: the chnl need to be queried Result: failure: return -1 success: return 0~3 which represent following status #define MGC_CONNECT_STATUS_IDLE 0 #define MGC_CONNECT_STATUS_CREATING 1 #define MGC_CONNECT_STATUS_CREATED 2 #define MGC_CONNECT_STATUS_TONE 3 */ int mgc_query_chnl_status(CHNL chnl) { MG_INFO *pMgInfo; WORD chnlIndex, phyPort , connIndex; if(chnl.mgNo > MGC_MAX_NUM_OF_MG) { mgc_log_err("mgc_query_chnl_status: invalid mgNo!\n\r"); return -1; } if (chnl.portNo >= MGC_MAX_PHY_PORT_PER_MG) { mgc_log_err("mgc_query_chnl_status: invalid portNo!\n\r"); return -1; } if (chnl.connectNo >= MGC_MAX_NUM_OF_CHNL_CON) { mgc_log_err("mgc_query_chnl_status: invalid connectNo!\n\r"); return -1; } pMgInfo = &mgcMgInfo[chnl.mgNo]; if ((MGC_MG_TYPE_ANN == pMgInfo->mgAttr.mgType)||(MGC_MG_TYPE_INTERNAL == pMgInfo->mgAttr.mgType)) { chnlIndex = pMgInfo->chnlStartIndex + chnl.chlNo; } else { phyPort = pMgInfo->portIndex[chnl.portNo]; chnlIndex = mgcPhyPort[phyPort].chnlStartIndex + chnl.chlNo; } connIndex = mgcChnl[chnlIndex].connectIndex[chnl.connectNo]; if(connIndex > MGC_MAX_NUM_OF_CON) return -1; return(mgcConnectInfo[connIndex].status); } OPER_REC *mgc_query_chnl_oper_rec(CHNL chnl) { MG_INFO *pMgInfo; WORD chnlIndex, phyPort , connIndex; if(chnl.mgNo > MGC_MAX_NUM_OF_MG) { mgc_log_err("mgc_query_chnl_status: invalid mgNo!\n\r"); return NULL; } if (chnl.portNo >= MGC_MAX_PHY_PORT_PER_MG) { mgc_log_err("mgc_query_chnl_status: invalid portNo!\n\r"); return NULL; } if (chnl.connectNo >= MGC_MAX_NUM_OF_CHNL_CON) { mgc_log_err("mgc_query_chnl_status: invalid connectNo!\n\r"); return NULL; } pMgInfo = &mgcMgInfo[chnl.mgNo]; if ((MGC_MG_TYPE_ANN == pMgInfo->mgAttr.mgType)||(MGC_MG_TYPE_INTERNAL == pMgInfo->mgAttr.mgType)) { chnlIndex = pMgInfo->chnlStartIndex + chnl.chlNo; } else { phyPort = pMgInfo->portIndex[chnl.portNo]; chnlIndex = mgcPhyPort[phyPort].chnlStartIndex + chnl.chlNo; } connIndex = mgcChnl[chnlIndex].connectIndex[chnl.connectNo]; if(connIndex > MGC_MAX_NUM_OF_CON) return NULL; return &(mgcConnectInfo[connIndex].operRec); }