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