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

📄 performance.c

📁 技术文件名称:MPLSv1.0软件模块测试规程
💻 C
📖 第 1 页 / 共 5 页
字号:
            	      /*  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(feclabel_req.req_num == MAX_LDP_FECLABEL_QUE)
            	         return 1;            	                 	  
            	 }       
            	    if(FecDelFlag){
            	    	FecDelFlag = 0;
            	    	continue;
            	    }
            	         	 
            	 }
            	 #endif
            	 TempDownCB = (TempFec->down_cb_list).link;
            	 if(TempDownCB){         
          /*  process all the DownCB waited to be processed for Feclable procedure */ 
         
            	 while(TempDownCB){     /* the first three bit of waitflag are not all zero*/
          
            	     if(TempDownCB->waitflag&0x80){            	     	  
                         if((TempFec->down_cb_list).link){
                         	   TempDownCB->waitflag &=0x7f;
            	     	       if(!(TempDownCB->waitflag&0xe0)){
   	                              down_out_waitlist(TempFec,TempDownCB);
   	                              if(!((TempFec->down_cb_list).link)){
    	         		              if(!((TempFec->lsp_cb_list).link)){ 
    	         			             MPLS_WAITE_FECLBL_DELETE(TempFec,Mpls_bufWait_Lablelink)
    	         			        	         			
    	         		              } 
   	                              }        	     	
   	                           }
   	                        
   	                       MPLS_DOWNCB_DELETE(TempFec,TempDownCB);
   	                       if((TempFec->up_cb_list).first||(TempFec->down_cb_list).first||(TempFec->lsp_cb_list).first||TempFec->owner){
   	    
   	    	               }
   	                       else {
   	    		              MPLS_FEC_DELETE((TempFec->fec_key).mplsFecAddr,(TempFec->fec_key).mplsLdpFecAddrLen,TempFec);
   	                       }
   	                    
   	                    TempDownCB = (TempFec->down_cb_list).link;
            	    }
            	    }
            	    else{
            	     if(TempDownCB->waitflag&0x20){    /* need to do FecLable process */
            	         if(!(proc_waitFecLbllink(NULL,TempDownCB,(void *)TempFec))){
            	              TempDownCB->waitflag=(TempDownCB->waitflag)&0xdf;
            	              if(!(TempDownCB->waitflag&0xe0)){
            	                  DownCB_locat_adjust(TempDownCB,TempFec,0x2,&FecDelFlag);
            	                  
            	                  
            	                  if(walk_down_feclbl(TempFec)&&walk_lsp_feclbl(TempFec)){
    	         			
    	         			         MPLS_WAITE_FECLBL_DELETE(TempFec,Mpls_bufWait_Lablelink)
    	         			         FecDelFlag = 1;
    	         			
    	         		           }  
    	         		           if(FecDelFlag){
            	                    	TempFec = Mpls_bufWait_Lablelink.link;
            	                        break;
            	                    }
            	      /*  adjust the DownCB node if its waitflag's first three bits are all zero*/
            	     
            	                    TempDownCB = TempDownCB->prev;
            	              }
            	              else 
            	              {
            	              	if(walk_down_feclbl(TempFec)&&walk_lsp_feclbl(TempFec)){
    	         			
    	         			         MPLS_WAITE_FECLBL_DELETE(TempFec,Mpls_bufWait_Lablelink)
    	         			         FecDelFlag = 1;
    	         			
    	         		           }  
    	         		           if(FecDelFlag){
            	                    	TempFec = Mpls_bufWait_Lablelink.link;
            	                        break;
            	                    }
            	              	TempDownCB = TempDownCB->prev;
            	            }
            	            
            	         }
            	         
            	         else TempDownCB = (TempFec->down_cb_list).link;
            	         
            	      }            	        
            	      else  TempDownCB = TempDownCB->prev;
            	      if(feclabel_req.req_num == MAX_LDP_FECLABEL_QUE)
            	         return 1;            	                 	  
            	 }
            	}
            	if(FecDelFlag){
            		FecDelFlag = 0;
            		continue;
            	}
            	
            	 }
            	 
            	TempFec = TempFec->FecLbNext;
             }
             return 1;
         }
		
	
	else return 0;
	   
}
         
        
/* process waiting to be processed Lable list */
short Func_FecLable_wait(){
	mplsLdpFecEntry * TempFec;
	mplsLdpLspCB    * TempLspCB;
	mplsLdpDownCB   * TempDownCB;
	unsigned long   tempid;
	uchar           FecDelFlag=0;
	
	MPLS_SET_TIMER(FECLBL_WAIT_TIME,(void *)Func_FecLable_wait,0,ldptime_q,tempid);
	/* Mpls_bufWait_Lablelink为空,Dod_Func_FecLable_wait放在循环里面将不能扫描执行*/
	#ifdef PERFOMANCE_NEW
	Dod_Func_FecLable_wait();
	#endif
	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_wait running !!");
                   #endif
                   if(feclabel_req.req_num>=MAX_LDP_FECLABEL_QUE)
                     return 0;
            	     if(TempLspCB->waitflag&0x20){    /* need to do FecLable process */
            	         if(!(proc_waitFecLbllink(TempLspCB,NULL,TempFec))){
            	              TempLspCB->waitflag=(TempLspCB->waitflag)&0xdf;
            	              if(!(TempLspCB->waitflag&0xe0)){            	              	  
            	                  LspCB_locat_adjust(TempLspCB,TempFec,0x2,&FecDelFlag);             	           
            	                  if(FecDelFlag){
            	                    	TempFec = Mpls_bufWait_Lablelink.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(feclabel_req.req_num == MAX_LDP_FECLABEL_QUE)
            	         return 1;            	                 	  
            	 }       
            	    if(FecDelFlag){
            	    	FecDelFlag = 0;
            	    	continue;
            	    }
            	         	 
            	 }
            	 #endif
            	 
            	 TempDownCB = (TempFec->down_cb_list).link;
            	 if(TempDownCB){         
          /*  process all the DownCB waited to be processed for Feclable procedure */ 
         
            	 while(TempDownCB){     /* the first three bit of waitflag are not all zero*/
          
            	     if(TempDownCB->waitflag&0x80){            	     	  
                         if((TempFec->down_cb_list).link){
                         	   TempDownCB->waitflag &=0x7f;
            	     	       if(!(TempDownCB->waitflag&0xe0)){
   	                              down_out_waitlist(TempFec,TempDownCB);
   	                              if(!((TempFec->down_cb_list).link)){
    	         		              if(!((TempFec->lsp_cb_list).link)){ 
    	         			             MPLS_WAITE_FECLBL_DELETE(TempFec,Mpls_bufWait_Lablelink)
    	         			        	         			
    	         		              } 
   	                              }        	     	
   	                           }
   	                        
   	                       MPLS_DOWNCB_DELETE(TempFec,TempDownCB);
   	                       if((TempFec->up_cb_list).first||(TempFec->down_cb_list).first||(TempFec->lsp_cb_list).first||TempFec->owner){
   	    
   	    	               }
   	                       else {
   	    		              MPLS_FEC_DELETE((TempFec->fec_key).mplsFecAddr,(TempFec->fec_key).mplsLdpFecAddrLen,TempFec);
   	                       }
   	                    
   	                    TempDownCB = (TempFec->down_cb_list).link;
            	    }
            	    }
            	    else{
            	     if(TempDownCB->waitflag&0x20){    /* need to do FecLable process */
            	         if(!(proc_waitFecLbllink(NULL,TempDownCB,(void *)TempFec))){
            	              TempDownCB->waitflag=(TempDownCB->waitflag)&0xdf;
            	              if(!(TempDownCB->waitflag&0xe0)){
            	                  DownCB_locat_adjust(TempDownCB,TempFec,0x2,&FecDelFlag);
            	                  
            	                  
            	                  if(walk_down_feclbl(TempFec)&&walk_lsp_feclbl(TempFec)){
    	         			
    	         			         MPLS_WAITE_FECLBL_DELETE(TempFec,Mpls_bufWait_Lablelink)
    	         			         FecDelFlag = 1;
    	         			
    	         		           }  
    	         		           if(FecDelFlag){
            	                    	TempFec = Mpls_bufWait_Lablelink.link;
            	                        break;
            	                    }
            	      /*  adjust the DownCB node if its waitflag's first three bits are all zero*/
            	     
            	                    TempDownCB = TempDownCB->prev;
            	              }
            	              else 
            	              {
            	              	if(walk_down_feclbl(TempFec)&&walk_lsp_feclbl(TempFec)){
    	         			
    	         			         MPLS_WAITE_FECLBL_DELETE(TempFec,Mpls_bufWait_Lablelink)
    	         			         FecDelFlag = 1;
    	         			
    	         		           }  
    	         		           if(FecDelFlag){
            	                    	TempFec = Mpls_bufWait_Lablelink.link;
            	                        break;
            	                    }
            	              	TempDownCB = TempDownCB->prev;
            	            }
            	            
            	         }
            	         
            	         else TempDownCB = (TempFec->down_cb_list).link;
            	         
            	      }            	        
            	      else  TempDownCB = TempDownCB->prev;
            	      if(feclabel_req.req_num == MAX_LDP_FECLABEL_QUE)
            	         return 1;            	                 	  
            	 }
            	}
            	if(FecDelFlag){
            		FecDelFlag = 0;
            		continue;
            	}
            	
            	 }
            	 
            	TempFec = TempFec->FecLbNext;
             }
             return 1;
         }
		
	
	else return 0;
	   
}


short proc_waitFecLbllink(TempLspCB,TempDownCB , TempFec)
   mplsLdpLspCB    *TempLspCB;
   mplsLdpDownCB   *TempDownCB;
   void *TempFec;   
{
	uchar  FecLblflag;
	short  i;
	
	if(TempLspCB){
		FecLblflag =( TempLspCB->waitflag )& 0x4;
		switch(FecLblflag){
		    case  0    :  /*    LDP_FWD_CREATE    */
		    {
		    	i = ldp_label_forward(TempFec,TempLspCB,LDP_FWD_CREATE);		    	
		    	return i;
		    }   
		    case  4    :  /*    LDP_FWD_CLOSE   */
		    {
		    	i = ldp_label_forward(TempFec,TempLspCB,LDP_FWD_CLOSE);
		    	return i;
		    }
		    default: return 0;
		}
	}
	if(TempDownCB)
	{
		FecLblflag =( TempDownCB->waitflag )& 0x4;
		switch(FecLblflag){
		    case  0    :  /*    LDP_FWD_CREATE    */
		    {
		    	i = sendtoLabelXC(TempFec,MPLS_NULL,TempDownCB,LDP_FWD_CREATE);
		    	XC2++;
		    	if(i)
		    	    XC3++;		    	
		    	return i;
		    }   
		    case  4    :  /*    LDP_FWD_CLOSE   */
		    {
		    	i = sendtoLabelXC(TempFec,MPLS_NULL,TempDownCB,LDP_FWD_CLOSE);
		    	XC4++;
		    	if(i)
		    	   XC5++;
		    	return i;
		    }
		    default: return 0;
		}
	}
}




#ifndef PERFOMANCE_NEW
short wait_lspfeclbl_append(mplsLdpLspCB *LspCBVar,void *pFec,uchar xcflag){
	uchar    tempflag;
	uchar    true=0;
	mplsLdpFecEntry   * pFecEntry;
	pFecEntry = (mplsLdpFecEntry *)pFec;	
	uchar           FecDelFlag=0;
	
	if(((LspCBVar->waitflag)&0xe0) != MPLS_NULL)
            true = 1;
        tempflag = (LspCBVar->waitflag) & 0x20 ;
        if(!tempflag){
        	(LspCBVar->waitflag)&=0xfb;
        	switch(xcflag){
        	   case LDP_FWD_CREATE:
        	      (LspCBVar->waitflag)|=0x20;
        	      break;
        	   case LDP_FWD_CLOSE:
        	      (LspCBVar->waitflag)|=0x24;
        	      break;        	   
        	   default:return 0;
        	   
                }
        } 
        /*判断是否有冲突的情况 */        
        else{
             /* 已有CREAT,现新来CLOSE请求 */
             if((!((LspCBVar->waitflag)&0x4))&&(xcflag==LDP_FWD_CLOSE)){

⌨️ 快捷键说明

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