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

📄 performance.c

📁 技术文件名称:MPLSv1.0软件模块测试规程
💻 C
📖 第 1 页 / 共 5 页
字号:
/*2002.12.28 Fengjun 删除CR待处理队列的出队列条件判断*/
/*2003.1.8   Fengjun 在处理LSP控制块前增加对当前待处理消息缓冲个数的判断  */
/*2003.1.13  fengjun 增加中间变量,在指针变量可能删除前取其下一个节点  */
/*2003.1.21  fengjun Func_CR_Lblmsg_wait及Func_CR_Lblmsg_wait1修改消息缓冲个数判断
/*2003.1.21  fengjun 所有的CR待处理函数增加对非正常FEC的防护
/*2003.1.21  fengjun 在CR_wait_lsplblmsg_append 及CR_wait_lspfeclbl_append
                     中删除对waitflag标志位的判断,直接调整待处理链表
                     wait_lsplblmsg_append 及wait_lspfeclbl_append中
                     修改控制块位置调整函数的判断条件  */                                               
/* 2003.1.26 fengjun 在处理跟C的待处理队列时,给CR分配64个请求的空间,
                     轮流处理CR和普通lsp的请求 */
/*2003.2.24  fengjun 为防止C处理及标记整合处理次序混乱修改C及标记整合待处理链表内容,
                     由链接FEC改为链接LSP控制块
/*2003.5.26  fengjun 改变Dod_Func_FecLable_wait在循环体内的位置,防止定时器不能触发标
                     记整合扫描操作。
/*2003.12.30 fengjun 预防作0指针操作 */
/* 2003.12.30  fengjun 控制块删除函数中已有FEC删除操作,外部的删除判断重复,去除 */
/* 2004-1-6 lixia mod for debug mpls */
/****************************************************************************/
/*      Product Name:   MPLS PACK1.0
 *      Module  Name:   LDP/CR_LDP
 *      File    Name:   performance.c
 *      Author  Name:   fengjun
 *      Creat   Date:   2003-2-18
 *      Version     :   1.0
/****************************************************************************/

#include "ldpvars.h"

char                    perfor_pdu[PERFORMANCE_PDU_LEN];
int mplsfirst=1;
unsigned long    asenderror = 0;
/*add by fengjun for guangzhou 0410
考虑到军网网络规模有异,增加分级配置,此处定义两个变量,分别定义
消息缓冲大小和缓冲数目,分别代替原有MAX_PDU_LENGTH\MAX_LDP_LBLMSGREQ_NUM两个宏*/
unsigned short Msg_buf_size=MAX_LDP_LBLMSG_BUF_1NODE;
unsigned short Msg_buf_num =MAX_LDP_LBLMSGREQ_NUM;
extern unsigned char  cr_priority;

#ifndef  PERFOMANCE_NEW
/* process waiting to be processed Xc list */
short Func_Xc_wait1(){
	mplsLdpFecEntry *TempFec;
	mplsLdpLspCB    *TempLspCB;
	uchar           FecDelFlag=0;	
	unsigned long   tempid;
	

	if((xc_req.req_num-cur_crreq_num)<(MAX_LDP_XC_QUE-MAX_LDP_XC_CRQUE)){
		    TempFec = Mpls_bufWait_Xclink.link;
            while(TempFec){      /* find the first node in the Xcwaited list */
            	if((xc_req.req_num-cur_crreq_num)>=(MAX_LDP_XC_QUE-MAX_LDP_XC_CRQUE))
            	return 0;
            	TempLspCB = (TempFec->lsp_cb_list).link;
       
       /*  process all the LspCB waited to be processed for Feclable procedure */
       
            	while(TempLspCB){      /* the first three bit of waitflag are not all zero*/
            	     #ifdef MPLS_PERFORMANCE_TEMPDEBUG
            	     printf("Func_Xc_wait1 running!");
            	     #endif
            	     if(TempLspCB->waitflag&0x80){    /* need to do Xc process */            	         
            	         if(!(proc_waitxclink(TempLspCB,(char *)TempFec))){
            	              TempLspCB->waitflag=(TempLspCB->waitflag)&0x7f;            	              
            	              if(!(TempLspCB->waitflag&0xe0)){
            	              	  LspCB_locat_adjust(TempLspCB,TempFec,0x1,&FecDelFlag); 
            	               	  if(FecDelFlag){            	              	  	  
            	              	  	  TempFec = Mpls_bufWait_Xclink.link;
            	              	  	  break;
            	              	  }
            	              	  	
            	      /*  adjust the LspCB node if its waitflag's first three bits are all zero*/
            	                  TempLspCB = (TempFec->lsp_cb_list).link;
            	              }
            	              
            	              else 
            	              {
            	              	  TempLspCB = TempLspCB->prev;
            	              }
            	            
            	         }
            	         else TempLspCB = (TempFec->lsp_cb_list).link;
            	      }            	        
            	      else  TempLspCB = TempLspCB->prev;
            	      if((xc_req.req_num-cur_crreq_num)>=(MAX_LDP_XC_QUE-MAX_LDP_XC_CRQUE))
            	         return 1;
            	 }
            	if(FecDelFlag){  
            		  FecDelFlag = 0;             	  	  
            	      continue; 
            	}
            	else
            	{
            		//TempFec = Mpls_bufWait_Xclink.link;
            		TempFec = TempFec->XcNext;
            	}
            	
            	              	
             }
         }		
        else return 0;
}


short Func_Xc_wait(){
	
	mplsLdpFecEntry *TempFec;
	mplsLdpLspCB    *TempLspCB;
	uchar           FecDelFlag=0;
	unsigned long   tempid;
	
	MPLS_SET_TIMER(XC_WAIT_TIME,(void *)Func_Xc_wait,0,ldptime_q,tempid);
	if((xc_req.req_num-cur_crreq_num)<(MAX_LDP_XC_QUE-MAX_LDP_XC_CRQUE)){
		    TempFec = Mpls_bufWait_Xclink.link;
            while(TempFec){      /* find the first node in the Xcwaited list */
            	if((xc_req.req_num-cur_crreq_num)>=(MAX_LDP_XC_QUE-MAX_LDP_XC_CRQUE))
            	return 0;
            	TempLspCB = (TempFec->lsp_cb_list).link;
       
       /*  process all the LspCB waited to be processed for Feclable procedure */
       
            	while(TempLspCB){      /* the first three bit of waitflag are not all zero*/
            	     #ifdef MPLS_PERFORMANCE_TEMPDEBUG
            	     printf("Func_Xc_wait running!");
            	     #endif
            	     if(TempLspCB->waitflag&0x80){    /* need to do Xc process */            	         
            	         if(!(proc_waitxclink(TempLspCB,(char *)TempFec))){
            	              TempLspCB->waitflag=(TempLspCB->waitflag)&0x7f;            	              
            	              if(!(TempLspCB->waitflag&0xe0)){
            	              	  LspCB_locat_adjust(TempLspCB,TempFec,0x1,&FecDelFlag);             	              
            	              	  if(FecDelFlag){            	              	  	  
            	              	  	  TempFec = Mpls_bufWait_Xclink.link;
            	              	  	  break;
            	              	  	}
            	              	  	
            	      /*  adjust the LspCB node if its waitflag's first three bits are all zero*/
            	                  TempLspCB = (TempFec->lsp_cb_list).link;
            	              }
            	              
            	              else 
            	              {
            	              		TempLspCB = TempLspCB->prev;
            	              }
            	            
            	         }
            	         else TempLspCB = (TempFec->lsp_cb_list).link;
            	      }            	        
            	      else  TempLspCB = TempLspCB->prev;
            	      if((xc_req.req_num-cur_crreq_num)>=(MAX_LDP_XC_QUE-MAX_LDP_XC_CRQUE))
            	         return 1;
            	 }
            	if(FecDelFlag){  
            		  FecDelFlag = 0;             	  	  
            	      continue; 
            	}
            	else
            	{            		
            		TempFec = TempFec->XcNext;
            	}
            	
            	              	
             }
         }		
        else return 0;
}
#endif


/* for special mplsLdpLspCB and mplsLdpFecEntry put it to the Xcbuffer */
short proc_waitxclink(mplsLdpLspCB *TempLspCB,char  *TempFec){
	unsigned char Xcflag;
	short i;	
	Xcflag =( TempLspCB->waitflag )&0x18;
	switch(Xcflag){
		case 0x0  :    /* BANDWIDTH_REQ */
		{
		    i = FuncResvBW(TempLspCB,(char *)TempFec);	
		    return i;
		    
		    
		}
		case 0x8  :    /* CRPVC_REQ     */
		{
		    /*$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 2004-5-17 fengjunjinan*/
		    /*needn't send create pvc req to c when it will be dele*/
		    if((TempLspCB->waitflag&0x1))
		    {
		        printf("  waitflag wrong Func_Xc_wait1 running CRPVC_REQ! %x,index is %x",TempLspCB->waitflag,TempLspCB->lspIndex);
		        return  LDP_TRUE;
		    }
		    /*$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 2004-5-17 fengjunjinan*/
		    i = FuncCreatePvc(TempLspCB,(char *)TempFec);	
		    return i;
		    
		} 
		case 0x10 :    /* RLSBW_REQ     */
		{
		    i = FuncRlsBW(TempLspCB,(char *)TempFec);	
		   return i;
		    
		}
		case 0x18 :    /* RLSPVC_REQ    */
		{
		    i = FuncRelPVC(TempLspCB,(char *)TempFec);	
		    return i;
		    
		}
	        default : return 0;
	}
	
}


short Xc_down_append(mplsLdpDownCB *TempDown,void *pFec){	
	mplsLdpFecEntry * pFecEntry;
	uchar    tempflag;
	uchar true=0;
	pFecEntry = (mplsLdpFecEntry *)pFec;
	if((TempDown->waitflag)&0xe0 != MPLS_NULL)
            true = 1;
    (TempDown->waitflag)|= 0x80 ;
        
        /*  判断是否要调整LSPCB的位置 */
        if(true)
            return MPLS_TRUE;
        else
        {
        	if(!(TempDown->prev))
                   (pFecEntry->down_cb_list).link = TempDown;
            else{
            
	        	MPLS_DOWNCB_DELETE(pFecEntry,TempDown);
	        	
	        	
		        TempDown->prev = MPLS_NULL;
		        TempDown->next = (pFecEntry->down_cb_list).first;
		        ((pFecEntry->down_cb_list).first)->prev = TempDown;
		        (pFecEntry->down_cb_list).first = TempDown;
	            if(!((pFecEntry->down_cb_list).link))  
	                  (pFecEntry->down_cb_list).link =TempDown;  
            }  
        
        }
        /*  判断是否要将FEC加入到待处理队列中 */
        if(pFecEntry->FecLbNext||(Mpls_bufWait_Lablelink.last == pFecEntry))
           return MPLS_TRUE;
        else {          	
        	MPLS_WAITE_FECLBL_INSERT(pFecEntry,Mpls_bufWait_Lablelink)
         }
        return MPLS_TRUE;
	
}

	

	
	
#ifndef  PERFOMANCE_NEW
short wait_xc_append(mplsLdpLspCB *LspCBVar,void *pFec,uchar xcflag){
	mplsLdpFecEntry * pFecEntry;
	uchar    tempflag;
	uchar true=0;
	pFecEntry = (mplsLdpFecEntry *)pFec;		
	if(((LspCBVar->waitflag)&0xe0 )!= MPLS_NULL)
            true = 1;
        tempflag = (LspCBVar->waitflag) & 0x80 ;
        if(!tempflag){
        	(LspCBVar->waitflag)&=0xe7;
        	switch(xcflag){
        	   case 0x0:
        	      (LspCBVar->waitflag)|=0x80;
        	      break;
        	   case 0x1:
        	      (LspCBVar->waitflag)|=0x88;
        	      break;
        	   case 0x2:
        	      (LspCBVar->waitflag)|=0x90;
        	      break;
        	   case 0x3:
        	      (LspCBVar->waitflag)|=0x98;
        	      break;
        	   default:return 0;
        	   
                }
        }        
        else  return MPLS_TRUE;
        /*  判断是否要调整LSPCB的位置 */
        if(!true)
        {
        	
        	MPLS_LSPCB_DELETE(pFecEntry,LspCBVar)
        	
        	if(LspCBVar != MPLS_NULL)											
            {																
	            (LspCBVar)->prev = NULL;										
	            (LspCBVar)->next = (pFecEntry)->lsp_cb_list.first;				
	            if((LspCBVar)->next != NULL)									
		            (LspCBVar)->next->prev = (LspCBVar);							
	            (pFecEntry)->lsp_cb_list.first = (LspCBVar);					
	            if((pFecEntry)->lsp_cb_list.last == NULL)				
		            (pFecEntry)->lsp_cb_list.last = (LspCBVar);			
            }	
            if(!((pFecEntry->lsp_cb_list).link))  
	                    (pFecEntry->lsp_cb_list).link =(pFecEntry->lsp_cb_list).first; 
      
     
        }
        /*  判断是否要将FEC加入到待处理队列中 */
        
        true = 0;
        if(!(Mpls_bufWait_Xclink.link))
             true = 1;
        if(pFecEntry->XcNext||(Mpls_bufWait_Xclink.last == pFecEntry))
           return MPLS_TRUE;
        else {  
        	            
            MPLS_WAITE_XC_INSERT(pFecEntry,Mpls_bufWait_Xclink)
            }
        if(true)
           Func_Xc_wait1();    
        return MPLS_TRUE;
}
#endif
        
            
short Func_FecLable_wait1(){
	mplsLdpFecEntry * TempFec;
	mplsLdpLspCB    * TempLspCB;
	mplsLdpDownCB   * TempDownCB;
	unsigned long   tempid;
	uchar           FecDelFlag=0;
	
	if(feclabel_req.req_num<MAX_LDP_FECLABEL_QUE){
		    TempFec = Mpls_bufWait_Lablelink.link;
            while(TempFec){      /* find the first node in the Mpls_bufWait_Lablelink list */
                if(feclabel_req.req_num>=MAX_LDP_FECLABEL_QUE)
                return 0;
                #ifndef PERFOMANCE_NEW
            	TempLspCB = (TempFec->lsp_cb_list).link;
            	if(TempLspCB){
          /*  process all the LspCB waited to be processed for Feclable procedure */
            	while(TempLspCB){            		      /* the first three bit of waitflag are not all zero*/
                     #ifdef MPLS_PERFORMANCE_TEMPDEBUG
                     printf("Func_FecLable_wait1 running!");
                     #endif
            	     if(TempLspCB->waitflag&0x20){    /* need to do FecLable process */
            	         if(!(proc_waitFecLbllink(TempLspCB,NULL,TempFec))){
            	              TempLspCB->waitflag=(TempLspCB->waitflag)&0xdf;
            	              if(!(TempLspCB->waitflag&0x60)){            	              	  
            	                  LspCB_locat_adjust(TempLspCB,TempFec,0x2,&FecDelFlag);             	            
            	                  if(FecDelFlag){
            	                    	TempFec = Mpls_bufWait_Lablelink.link;
            	                    	
            	                      break;
            	                    }
            	                    

⌨️ 快捷键说明

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