Files
svc.ems/omc/plat/mgc_v2/src/mgc_phy_port.c
2024-03-13 09:30:40 +08:00

483 lines
14 KiB
C

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