📄 f_comm.c
字号:
ifindex2mod_req.mpls_platform = local_platform;
mpls_ifindex2module(&ifindex2mod_req,&ifindex2mod_ack,MPLS_INTERFACE);
if(ifindex2mod_ack.ack == MPLS_SUCCESS)
{
lspCb->downAtmLabel.module = ifindex2mod_ack.mod;
lspCb->downAtmLabel.port = ifindex2mod_ack.port;
}
else
{
DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_LSP,"ldpFecSearchCheck, ERR get Down ATM Module & port\n");
MPLS_ERR_LOG("ERR get UP ATM Module & port");
/* should release up atm label */
MPLS_FEC_LSPCB_DELETE(fecCb,lspCb);
continue;
}
MPLS_INSERT_INTO_DOWN_LSP_LIST(session->lsp_down_cb_list,lspCb,lspCb);
lspCb->status = IDLE;
lspCb->subStatus = IDLE;
if(!(lspCb->waitflag & 0x1))
LspCBFsm(session,MPLS_ROUTE_ADD,MPLS_NULL,LDP_HOP_LSP,fecCb,lspCb);
}
else
DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_LSP,"ldpFecSearchCheck,creat lspcb fail\n");
}
else
{
MPLS_ERR_LOG("====Nexthop not belong to Session====");
}
}
}
else
{
if(fecCb->owner & MPLS_OWNER_ROUTE)
{
belong_to = MPLS_FALSE;
MPLS_NEXTHOP_SESSION_BELONG(fecCb->nexthopAddr,session,belong_to);
if(belong_to == MPLS_TRUE)
{
if(fecCb->nexthopSessionIndex)
{
MPLS_WALK_DOWN_BEGIN(fecCb,downCb,t_downCb);
if(downCb != MPLS_NULL && downCb->downSessionIndex == fecCb->nexthopSessionIndex)
{
switch(downCb->state)
{
case ESTABLISHED:
if(session)
{
if(session->index == downCb->downSessionIndex)
wait_downfeclbl_append(downCb,fecCb,LDP_FWD_CLOSE);
}
break;
case RESPONSE_AWAITED:
/* send to up notification: no route */
downCb->waitflag |=0x1;
wait_downlblmsg_append(downCb,fecCb,MPLS_LBLABORT_MSGTYPE);
break;
default:
printf("mpls_err_log,ldpFecSearchCheck default 2");
break;
}
}
MPLS_WALK_DOWN_END(fecCb,downCb,t_downCb)
}
fecCb->nexthopSessionIndex = session->index;
}
/* maybe need check upCb list */
MPLS_UPCB_CREATE(fecCb,session,upCb)
if(upCb)
{
upCb->upSessionIndex = session->index;
upCb->upGenLabel = fecCb->localGenLabel;
upCb->upPeerLdpid.lsrAddress = session->peerLdpId.lsrAddress;
upCb->upPeerLdpid.labelSpace = session->peerLdpId.labelSpace;
upCb->state = ESTABLISHED;
wait_uplblmsg_append(upCb,fecCb,MPLS_NULL,MPLS_NULL,MPLS_LBLMAP_MSGTYPE);
}
}
}
}
}
return;
}
/****************************************************************************/
/* Product Name: MPLS PACK1.0
* Module Name: LDP/CR_LDP
* File Name: f_comm.c
* Author Name: weng.qing shi.zhaohui hu.yonghong
* Creat Date: 2002-6-18
* Version : 1.0
* Input : void
* Output : void
* Function : priodic fec lspcb scan function
* Note :
*/
/****************************************************************************/
#if MPLS_PROTECT
void ldpFecLspcbScan()
{
mplsLdpFecEntry * fecCb = MPLS_NULL;
mplsLdpLspCB * lspCb = MPLS_NULL;
mplsLdpLspCB * lspCb_t = MPLS_NULL;
mplsLdpCrLsp * crlspCb = MPLS_NULL;
unsigned short i;
if(fec_lspcb_scan.stop == 2)
{
fec_lspcb_scan.stop = 1; /* next time, from fec head scan */
WALK_CRFEC_BEGIN(crlspCb)
if(crlspCb)
{
if(crlspCb->crlspCb.up_lsp_session_list.prev)
{
if((crlspCb->crlspCb.up_lsp_session_list.prev)->up_lsp_session_list.next != &(crlspCb->crlspCb))
{
crlspCb->crlspCb.up_lsp_session_list.prev = MPLS_NULL;
lspCb_t = &(crlspCb->crlspCb);
while(lspCb_t->up_lsp_session_list.next)
{
lspCb_t = lspCb_t->up_lsp_session_list.next;
}
lspcb_scan ++;
MPLS_INSERT_INTO_UP_LSP_LIST(g_up_lsp_list,
&(crlspCb->crlspCb), \
lspCb_t);
break;
}
}
if(crlspCb->crlspCb.down_lsp_session_list.prev)
{
if((crlspCb->crlspCb.down_lsp_session_list.prev)->down_lsp_session_list.next != &(crlspCb->crlspCb))
{
crlspCb->crlspCb.down_lsp_session_list.prev = MPLS_NULL;
lspCb_t = &(crlspCb->crlspCb);
while(lspCb_t->down_lsp_session_list.next)
{
lspCb_t = lspCb_t->down_lsp_session_list.next;
}
lspcb_scan ++;
MPLS_INSERT_INTO_DOWN_LSP_LIST(g_down_lsp_list,
&(crlspCb->crlspCb), \
lspCb_t);
break;
}
}
}
WALK_CRFEC_END
}
if(fec_lspcb_scan.stop == 1)
{
fecCb = MPLS_AVL_FIRST(g_fec_avl_tree);
fec_lspcb_scan.stop = 0;
}
else
{
MPLS_FEC_SEARCH(fec_lspcb_scan.addr,fec_lspcb_scan.addrLen,fecCb)
if(fecCb == MPLS_NULL)
{
fecCb = MPLS_AVL_FIRST(g_fec_avl_tree);
fec_lspcb_scan.stop = 0;
}
}
i = 0;
for(;;fecCb = MPLS_AVL_NEXT(fecCb->fec_avl_node))
{
if(fecCb == MPLS_NULL)
{
fec_lspcb_scan.timer = 0;
fec_lspcb_scan.addr = 0;
fec_lspcb_scan.addrLen = 0;
fec_lspcb_scan.stop = 0;
return;
}
if(++i > 8)
{
fec_lspcb_scan.addr = fecCb->fec_key.mplsFecAddr;
fec_lspcb_scan.addrLen = fecCb->fec_key.mplsLdpFecAddrLen;
fec_lspcb_scan.stop = 0;
fec_lspcb_scan.timer = 1;
break;
}
else
{
MPLS_WALK_LSP_BEGIN(fecCb,lspCb,t_lspCb)
if(lspCb)
{
if(lspCb->up_lsp_session_list.prev)
{
if((lspCb->up_lsp_session_list.prev)->up_lsp_session_list.next != lspCb)
{
lspCb->up_lsp_session_list.prev = MPLS_NULL;
lspCb_t = lspCb;
while(lspCb_t->up_lsp_session_list.next)
{
lspCb_t = lspCb_t->up_lsp_session_list.next;
}
lspcb_scan ++;
MPLS_INSERT_INTO_UP_LSP_LIST(g_up_lsp_list,
lspCb, \
lspCb_t);
break;
}
}
if(lspCb->down_lsp_session_list.prev)
{
if((lspCb->down_lsp_session_list.prev)->down_lsp_session_list.next != lspCb)
{
lspCb->down_lsp_session_list.prev = MPLS_NULL;
lspCb_t = lspCb;
while(lspCb_t->down_lsp_session_list.next)
{
lspCb_t = lspCb_t->down_lsp_session_list.next;
}
lspcb_scan ++;
MPLS_INSERT_INTO_DOWN_LSP_LIST(g_down_lsp_list,
lspCb, \
lspCb_t);
break;
}
}
}
MPLS_WALK_LSP_END(fecCb,lspCb,t_lspCb)
}
}
return;
}
#endif
/* wengqing modify algorithm of get/release lspindex 2002.12.09 */
unsigned long inn = 0;
unsigned long ldp_get_index()
{
unsigned long i,j,k;
if(inn & 0xfffC0000)
inn = 0;
i = (inn >> 13);
j = (inn - (i << 13));
k = (inn & 0x1f);
j = j >> 5;
while(i < MPLS_ITEM_NO)
{
if(ldpIndex.item[i].nul < 8192)
{
for(; j < MPLS_INDEX_ITEM; j++)
{
for(; k < ((sizeof(unsigned long))<< 3); k++)
{
if(!(ldpIndex.item[i].index[j] & (1 << k)))
{
ldpIndex.item[i].index[j] += (1 << k);
ldpIndex.item[i].nul++;
#ifdef __BGS10_MPLS_DEBUG
MPLS_ERR_LOG("ldp_get_index %x",inn);
#endif
return inn++;
}
else
{
inn++;
}
}
k = 0;
}
j = k = 0;
}
else
{
inn += 8192;
}
j = k = 0;
i ++;
if(inn & 0xfffC0000)
{
i = 0;
inn = 0;
MPLS_MEMSET(&ldpIndex,0,sizeof(mpls_ldpIndex));
}
}
#ifdef __BGS10_MPLS_DEBUG
MPLS_ERR_LOG("ldp_get_index 0xffffffff");
#endif
return 0xffffffff;
}
void ldp_rel_index(unsigned long index)
{
unsigned long i,j,k;
#ifdef __BGS10_MPLS_DEBUG
MPLS_ERR_LOG("ldp_rel_index %x",index);
#endif
i = (index >> 13);
j = (index - (i << 13));
k = (index & 0x1f);
j = j >> 5;
/* wengqing 2002.12.05 protection of release index out of range */
if(i >=MPLS_ITEM_NO || j >= MPLS_INDEX_ITEM || k >= ((sizeof(unsigned long))<< 3) )
{
MPLS_ASSERT(0);
DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_LSP,"ldp_rel_index out of range \n");
printf("ldp_rel_index out of range ");
return;
}
if(ldpIndex.item[i].index[j] & (1 << k))
{
ldpIndex.item[i].index[j] &= (~(1 << k));
ldpIndex.item[i].nul --;
}
}
#if 0
/***********************************/
/* hyh lms pos */
/***********************************/
unsigned short mpls_lms_rel_genlabel(unsigned long l)
{
printf("mpls_lms_rel_genlabel %d ",l);
return MPLS_TRUE;
}
void mpls_ifindex2module(MPLS_IFINDEX2MOD_REQ * mpls_ifindex2mod_req,
MPLS_IFINDEX2MOD_ACK * mpls_ifindex2mod_ack,
unsigned short ModorPortorIf)
{
mpls_ifindex2mod_ack->ack = MPLS_SUCCESS;
return;
}
void mpls_get_lms_label( mpls_lms_label_req * label_req,
mpls_lms_label_ack * label_ack )
{
static i = 16;
label_ack -> ack = MPLS_SUCCESS;
label_ack -> label.type = MPLS_LABEL_PER_PLATFORM;
label_ack -> label.general_label.label.flags.gen_lbl = i++;
label_ack -> label.general_label.label.flags.res = 0;
}
void mpls_rel_lms_label( mpls_lms_label_rel * label_rel,
mpls_lms_label_ack * label_ack )
{
label_ack->ack = MPLS_SUCCESS;
return;
}
unsigned long mpls_lms_get_genlabel( )
{
static i = 15;
i++;
return i;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -