📄 performance.c
字号:
/*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 + -