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