⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mplsfunc.c

📁 技术文件名称:MPLSv1.0软件模块测试规程
💻 C
📖 第 1 页 / 共 5 页
字号:
   	   
   	return MPLS_SDP_CMD_SUCCESS; 
}
/************************************************************************
 * FUNCTION NAME  : tranCharMask2Len()	                            
 * DESCRIPTION:   : compute the len of  dot mask 	    
 *  INPUT         :   mask  				
 *  OUTPUT        : 	                           				
 *  AUTHOR/DATE   : Sun Baoping/ 01.12.12                               
 *  GLOBAL        : 							
 *  NOTE          :  ..                                                 
/************************************************************************/
unsigned short tranCharMask2Len(uchar  *mask)
{
	int i = 0;
	ulong ipMask;
	unsigned long mm = 0x80000000;
	ipMask = atoinet(mask);
	
	
	for(i = 0; i< 32; i++)
	{
		if(!(mm & ipMask))
			break;
		else
			mm = mm>>1;
	}
	return i; 	
}
/************************************************************************
 * FUNCTION NAME  : tranUlongMask2Len()	                            
 * DESCRIPTION:   : compute the len of  ulong mask 	    
 *  INPUT         :   mask  				
 *  OUTPUT        : 	                           				
 *  AUTHOR/DATE   : Sun Baoping/ 01.12.12                               
 *  GLOBAL        : 							
 *  NOTE          :  ..                                                 
/************************************************************************/
unsigned short tranUlongMask2Len(unsigned long ipMask)
{
	int i = 0;
	unsigned long mm = 0x80000000;
		
	for(i = 0; i< 32; i++)
	{
		if(!(mm & ipMask))
			break;
		else
			mm = mm>>1;
	}
	return i; 	
}
unsigned long tranLen2mask(unsigned char len)
{
   return (0xffffffff <<(32- len));
}
/************************************************************************
 * FUNCTION NAME  : mplsFecFilterListNoPtr()	                            
 * DESCRIPTION:   : get prt to filter by filter No 	    
 *  INPUT         : listNo procesId			
 *  OUTPUT        : Ptr                       				
 *  AUTHOR/DATE   : Sun Baoping/ 01.12.12                               
 *  GLOBAL        : 							
 *  NOTE          :  ..                                                 
/************************************************************************/
ushort mplsFecFilterListNoPtr(ushort listNo, uchar procesId, mplsFecFilterAll_t **Ptr)
{
	mplsFecFilterAll_t  *tempPtr;
	
	tempPtr = mplsFecFilterHead;
    while((tempPtr->listNo!=0)&&(tempPtr->listNo!=listNo))
    {
        tempPtr = tempPtr->next;
    }
    
    if(tempPtr->listNo==listNo)
    {
        *Ptr = tempPtr;
        return MPLS_OAM_CMD_SUCCESS;
    }
    else if(tempPtr->listNo==0)
    {
        if(procesId == MPLS_FEC_FILTER_CONFIG)
        {   /* mplsFecFilterPF 始终指向最后一个有效的FEC filter, 
               mplsFecFilterPN 是mplsFecFilterPF 的next */
        	mplsFecFilterPF = mplsFecFilterPN;
        	mplsFecFilterPN = (mplsFecFilterAll_t *)GET_UB(sizeof(mplsFecFilterAll_t));
            if(mplsFecFilterPN==MPLS_NULL)         /* MEMERY ALLOCAT ERROR  ADD SBP 2001-12-21 */
               return MPLS_MEMERY_ALLOCAT_ERROR;
            memset(mplsFecFilterPN,0,sizeof(mplsFecFilterAll_t));
            mplsFecFilterPN->next = MPLS_NULL;
            mplsFecFilterPF->next = mplsFecFilterPN;
            mplsFecFilterPF->listNo = listNo;
            mplsFecFilterPF->allFilterFlag = 0;
            
            mplsFecFilterPF->FecFilter = (singleFecFilterAddr_t *)GET_UB(sizeof(singleFecFilterAddr_t));
            if(mplsFecFilterPF==MPLS_NULL)         /* MEMERY ALLOCAT ERROR  ADD SBP 2001-12-21 */
                return MPLS_MEMERY_ALLOCAT_ERROR;
            memset(mplsFecFilterPF->FecFilter,0,sizeof(singleFecFilterAddr_t));
            mplsFecFilterPF->FecFilter->filterFlag = MPLS_FEC_FILTER_DISABLE_ALL;
            mplsFecFilterPF->FecFilter->next = MPLS_NULL;
            
            *Ptr = mplsFecFilterPF;
            
        	return MPLS_OAM_CMD_SUCCESS;
        }
        else
            return MPLS_OAM_CMD_NOT_DONE;  /* 如果需要可以改为具体的错误号  sbp  2002-1-3 */
    } 
    else
        return MPLS_OAM_CMD_NOT_DONE;
}
/************************************************************************
 * FUNCTION NAME  : mplsFecFilterDelete()	                            
 * DESCRIPTION:   : delete Fec filter 	    
 *  INPUT         : Ptr
 *  OUTPUT        :                      				
 *  AUTHOR/DATE   : Sun Baoping/ 01.12.12                               
 *  GLOBAL        : mplsFecFilterHead							
 *  NOTE          :  ..                                                 
/************************************************************************/
int16 mplsFecFilterDelete(mplsFecFilterAll_t **Ptr)
{
	mplsFecFilterAll_t   *tempPF,*tempPN;
	
    tempPF = tempPN = mplsFecFilterHead;
    
    while(tempPN!=MPLS_NULL)
    {
        if(tempPN->listNo==(*Ptr)->listNo)
        {
        	if(tempPN == mplsFecFilterHead)
        	{
        		mplsFecFilterHead = mplsFecFilterHead->next;
        	}
            else
            {
                tempPF->next = tempPN->next;
            }
            /* release every pointer in the struct */
        	RET_UB(tempPN->FecFilter);
        	RET_UB(tempPN);
        	
            return MPLS_OAM_CMD_SUCCESS;
        }
        
        tempPF = tempPN;
        tempPN = tempPN->next;
    }
    return MPLS_OAM_CMD_FAIL;
}
/************************************************************************
 * FUNCTION NAME  : mplsFecFilterConfiguring()	                            
 * DESCRIPTION:   : set up Fec filter 	    
 *  INPUT         : c_action  deny or permit
 *                  addr      address
 *                  cmdFlag   add or delete
 *  OUTPUT        : Ptr                     				
 *  AUTHOR/DATE   : Sun Baoping/ 01.12.12                               
 *  GLOBAL        : 							
 *  NOTE          :  ..                                                 
/************************************************************************/
int16 mplsFecFilterConfiguring(mplsFecFilterAll_t **Ptr, uchar c_action,fecFilterAddr_t addr,uchar cmdFlag)
{
    ulong                    tempAddr;
    uchar                    NotHead;
    uchar                    NumFnd;
    ushort                   RetMsgNo;
    singleFecFilterAddr_t   *tempPtr;
    singleFecFilterAddr_t   *tempPtrPF;
    singleFecFilterAddr_t   *tempPtrPN;
    
    NotHead   = 0;
    NumFnd    = 0;
    tempPtr   = (*Ptr)->FecFilter;
    tempPtrPF = tempPtr;
           
    if(cmdFlag==MPLS_OAM_CMD_FLAG)
    { 
        while((tempPtr->filterFlag != MPLS_FEC_FILTER_DISABLE_ALL)&&(tempPtr->next!=NULL))
        {
        	RetMsgNo = IpAddrMaskMatching(tempPtr->fecAddr.IpAddr,tempPtr->fecAddr.mask.addrMask,addr.IpAddr,addr.mask.addrMask);
        	if(RetMsgNo!=MPLS_SDP_CMD_SUCCESS)
        	    return RetMsgNo;
        	tempPtrPF = tempPtr;
            tempPtr=tempPtr->next;
        }
        
        tempPtr   = (*Ptr)->FecFilter;
        tempPtrPF = tempPtr;
        while((tempPtr->filterFlag != MPLS_FEC_FILTER_DISABLE_ALL)&&(tempPtr->next!=NULL))
        {
        	NotHead = 1; 
        	tempPtrPF = tempPtr;
            tempPtr=tempPtr->next;
        }
        
        tempPtrPN  = (singleFecFilterAddr_t *)GET_UB(sizeof(singleFecFilterAddr_t));
        if(tempPtrPN==MPLS_NULL)         /* MEMERY ALLOCAT ERROR  ADD SBP 2001-12-21 */
            return MPLS_MEMERY_ALLOCAT_ERROR;	
	    memset(tempPtrPN,0,sizeof(singleFecFilterAddr_t));
	    tempPtrPN->next = MPLS_NULL;
        
        if(NotHead == 1)
        {
        	
        	tempPtrPF->next = tempPtrPN;
        	
        	tempPtrPN->next = tempPtr;
        	/*tempPtr = tempPtrPN;*/
        }
        else
        {
            tempPtrPN->next = tempPtr;
        	(*Ptr)->FecFilter = tempPtrPN;
        }
        
        tempPtrPN->filterFlag = c_action;
        tempPtrPN->fecAddr =  addr;
        
        return MPLS_OAM_CMD_SUCCESS;
    }
    else
    {
    	while(tempPtrPF!=NULL)
        {
        	NotHead ++;
        	if(tempPtrPF->filterFlag==c_action && 
        		(memcmp(&tempPtrPF->fecAddr ,&addr, sizeof(fecFilterAddr_t)) == 0))
        	{
        	    NumFnd = 1; 
        	    break;
        	}
        	tempPtr   = tempPtrPF;
            tempPtrPF = tempPtr->next;
        }
        
        if(NotHead==1)
        {
        	if(NumFnd==1)
            {
            	(*Ptr)->FecFilter = tempPtrPF->next;
                RET_UB(tempPtrPF);
                
                return MPLS_OAM_CMD_SUCCESS;
            }
            else
                return MPLS_OAM_CMD_NOT_DONE;  
        }
        else if(NotHead>1)
        {
            if(NumFnd==1)
            {
            	tempPtr->next = tempPtrPF->next;
                RET_UB(tempPtrPF);
                                
                return MPLS_OAM_CMD_SUCCESS;
            }
            else
                return MPLS_OAM_CMD_NOT_DONE;  
        }
    }
}
/************************************************************************
 * FUNCTION NAME  : mplsFecFilterMatching()	                            
 * DESCRIPTION:   : matching address from the Fec policy table 	    
 *  INPUT         : Ptr netAddr netMask
 *  OUTPUT        :                      				
 *  AUTHOR/DATE   : Sun Baoping/ 01.12.12                               
 *  GLOBAL        : 							
 *  NOTE          :  ..                                                 
/************************************************************************/
uchar mplsFecFilterMatching(mplsFecFilterAll_t **Ptr, ulong netAddr,ulong netMask)
{
    singleFecFilterAddr_t   *tempPtr;
    ulong                    tempAddr,tempAddr1;
    ulong                    tempMask;
    
    tempPtr  = (*Ptr)->FecFilter;
    tempAddr = netAddr & netMask;
    
    while(tempPtr->filterFlag != MPLS_FEC_FILTER_NONE)
    {
        if(tempPtr->filterFlag==MPLS_FEC_FILTER_ENABLE_ALL)
            return MPLS_FEC_FILTER_PERMIT;
        else if(tempPtr->filterFlag==MPLS_FEC_FILTER_DISABLE_ALL)
            return MPLS_FEC_FILTER_DENY; 
        else
        {   
        	#if 1
        	 /* 模糊匹配方法 */
            tempMask = tempPtr->fecAddr.mask.addrMask & netMask;
            if(tempMask == tempPtr->fecAddr.mask.addrMask)
            {
                tempAddr1 = (tempPtr->fecAddr.IpAddr)&(tempPtr->fecAddr.mask.addrMask);
                if(tempAddr == tempAddr1)
                {   /* tempAddr 和 tempPtr->fecAddr.IpAddr 完全匹配 */
                    if(tempPtr->filterFlag==MPLS_FEC_FILTER_ENABLE_SINGLE)
                        return MPLS_FEC_FILTER_PERMIT;
                    else
                        return MPLS_FEC_FILTER_DENY;
                }
                else
                {
                	tempAddr = tempPtr->fecAddr.mask.addrMask & tempAddr;
                	if(tempAddr == tempPtr->fecAddr.IpAddr)
                	{    /*  tempPtr->fecAddr.IpAddr包含 tempAddr  */
                		if(tempPtr->filterFlag==MPLS_FEC_FILTER_ENABLE_SINGLE)
                            return MPLS_FEC_FILTER_PERMIT;
                        else
                            return MPLS_FEC_FILTER_DENY;
                    }
                }
            }
            else if(tempMask < tempPtr->fecAddr.mask.addrMask)
            {
               	return MPLS_FEC_FILTER_DENY;
               	
               	/* if(tempAddr == tempPtr->fecAddr.IpAddr & tempAddr)
               	{     tempPtr->fecAddr.IpAddr 包含于 tempAddr  
               		if(tempPtr->filterFlag==MPLS_FEC_FILTER_ENABLE_SINGLE)
                           return MPLS_FEC_FILTER_PERMIT;
                       else
                           return MPLS_FEC_FILTER_DENY;
                }*/
            }
            #endif
            /* 完

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -