📄 ldpque.c
字号:
return;
}
/**PROC+********************************************************************/
/* Name: mpls_fec_req_confirm */
/* Author: hu.yonghong */
/* Purpose: process request information for mpls cross-connect request. */
/* Returns: Nothing. */
/* Params: None. */
/* Note: insert the req in the queue tail,do processing */
/**PROC-********************************************************************/
void mpls_fec_req_confirm(void *in)
{
LDPREQ_CONF *conf;
conf = (LDPREQ_CONF *)in;
#ifdef __BGS10_MPLS_DEBUG
MPLS_ERR_LOG("======== mpls_fec_req_confirm index %d========",conf->index);
#endif
/* 将响应与对头请求匹配,如匹配不上,表示响应有误,不理会,返回 */
if(fec_req.index != conf->index)
{
DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_LSP,"fec_req.index %x mismatch conf->index %d\n",fec_req.index,conf->index);
MPLS_ERR_LOG("fec_req.index %d mismatch conf->index %d",fec_req.index,conf->index);
return ;
}
/* 处理下一个请求*/
mpls_fecreq_next();
return ;
}
/**PROC+********************************************************************/
/* Name: mpls_fecreq_queue_timeout */
/* Author: hu.yonghong */
/* Purpose: process when timeout. */
/* Returns: Nothing. */
/* Params: None. */
/**PROC-********************************************************************/
void mpls_fecreq_queue_timeout()
{
MPLS_LQE *fec_lqe;
int rtcode;
/* 将对头请求出队列,释放空间 */
if(!MPLS_EMPTY_LIST(fec_req.req_queue))
{
fec_lqe = MPLS_GET_FIRST_LQE(fec_req.req_queue);
MPLS_REMOVE_FROM_LIST(*fec_lqe);
MPLS_MEM_FREE((fec_lqe->self),mem_mgr[IUMEM_LDP_FEC_QUE]);
MPLS_MEM_FREE((fec_lqe),mem_mgr[IUMEM_LDP_FEC_QUE_LQE]);
/* 队列请求个数减一 */
fec_req.req_num--;
MPLS_ASSERT(fec_req.req_num >= 0);
/* 继续处理队列中的对头请求 */
mpls_reset_fec_req();
mpls_process_fec_req();
}
return;
}
/**PROC+********************************************************************/
/* Name: mpls_fecreq_next */
/* Author: hu.yonghong */
/* Purpose: process next req in queue. */
/* Returns: Nothing. */
/* Params: None. */
/**PROC-********************************************************************/
void mpls_fecreq_next()
{
MPLS_LQE *fec_lqe;
int rtcode;
/* 将对头请求出队列,释放空间 */
if(!MPLS_EMPTY_LIST(fec_req.req_queue))
{
fec_lqe = MPLS_GET_FIRST_LQE(fec_req.req_queue);
MPLS_REMOVE_FROM_LIST(*fec_lqe);
MPLS_MEM_FREE((fec_lqe->self),mem_mgr[IUMEM_LDP_FEC_QUE]);
MPLS_MEM_FREE((fec_lqe),mem_mgr[IUMEM_LDP_FEC_QUE_LQE]);
/* 队列请求个数减一 */
fec_req.req_num--;
MPLS_ASSERT(fec_req.req_num >= 0);
/* 取消定时器 */
if(fec_req.timerid>0)
{
MPLS_CLEAR_TIMER(fec_req.timerid,ldptime_q,rtcode);
MPLS_ASSERT(rtcode == 1);
if(rtcode)
fec_req.timerid = 0;
}
/* 继续处理队列中的对头请求 */
mpls_reset_fec_req();
mpls_process_fec_req();
}
return;
}
/**PROC+********************************************************************/
/* Name: mpls_reset_fec_req */
/* Author: hu.yonghong */
/* Purpose: Reset request information for mpls cross-connect request. */
/* Returns: Nothing. */
/* Params: None. */
/* */
/**PROC-********************************************************************/
void mpls_reset_fec_req()
{
/* Reset request information for the cross-connect request. */
fec_req.req_in_progress = 0;
fec_req.index = 0;
fec_req.timerid = 0;
return;
}
short mpls_insert_into_policy_tab(unsigned char action,unsigned long addr,unsigned long mask,unsigned long nexthop,unsigned char valid)
{
mpls_policy_tab_t *policy_node = MPLS_NULL;
mpls_policy_tab_t *node_temp = MPLS_NULL;
if(g_policy_list.num >= MAX_LDP_POLICY)
return MPLS_POLICY_FULL;
/*为策略分配空间*/
MPLS_MEM_ALLOC(policy_node,(mpls_policy_tab_t *),sizeof(mpls_policy_tab_t),mem_mgr[IUMEM_LDP_POLICY]);
if(policy_node == MPLS_NULL)
{
DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_LSP,"!!! sorry,can not allocate memory for g_policy_list !!!\n");
printf("!!! sorry,can not allocate memory for g_policy_list !!!");
return MPLS_POLICY_MEMORY_FAIL;
}
/* 初始化链表节点,将其加入到链的尾部 */
policy_node->action = action;
policy_node->dest = addr;
policy_node->mask = mask;
policy_node->nexthop = nexthop;
policy_node->valid = valid;
policy_node->next = NULL;
node_temp = g_policy_list.req_list.next;
if(node_temp)
{
while(node_temp->next!=NULL)
{
node_temp = node_temp->next;
}
node_temp->next = policy_node;
}
else
g_policy_list.req_list.next = policy_node;
// MPLS_INSERT_INTO_LIST(g_policy_list,policy_node);
g_policy_list.num ++;
if(rt_change == 0)
{
rt_change = 1;
return MPLS_POLICY_NEED_INFER;
}
else if (g_policy_list.num >= PERMIT_LDP_POLICY) /* lixia add 2003-11-6 */
return MPLS_POLICY_PERMIT_FULL;
else
return MPLS_POLICY_SUCCESS;
}
/*
mpls_policy_tab_t *mpls_search_in_policy_tab(unsigned char action,unsigned long addr,unsigned long mask,unsigned long nexthop)
{
mpls_policy_tab_t *policy_node = MPLS_NULL;
unsigned char search;
policy_node = g_policy_list.req_list.next;
while(policy_node)
{
if((policy_node->action == action)&&(policy_node->dest == addr)
&&(policy_node->mask == mask)&&(policy_node->nexthop == nexthop)
&&(policy_node->valid == valid))
break;
else
policy_node = policy_node->next;
}
return policy_node;
}
*/
short mpls_delete_from_policy_tab(unsigned char action,unsigned long addr,unsigned long mask,unsigned long nexthop,unsigned char valid)
{
mpls_policy_tab_t *policy_node = MPLS_NULL;
mpls_policy_tab_t *node_temp = MPLS_NULL;
//MPLS_DELETE_FROM_LIST(g_policy_list,policy_node);
node_temp = g_policy_list.req_list.next;
if((node_temp->action == action)&&(node_temp->dest == addr)
&&(node_temp->mask == mask)&&(node_temp->nexthop == nexthop)
&&(node_temp->valid == valid))
{
policy_node = node_temp;
g_policy_list.req_list.next = node_temp->next;
}
else
{
policy_node = node_temp->next;
while(policy_node)
{
if((policy_node->action == action)&&(policy_node->dest == addr)
&&(policy_node->mask == mask)&&(policy_node->nexthop == nexthop)
&&(policy_node->valid == valid))
{
node_temp->next = policy_node->next;
break;
}
else
{
node_temp = node_temp->next;
/* 更新policy_node */
policy_node = node_temp->next;
}
}
}
if(policy_node)
{
MPLS_MEM_FREE(policy_node,mem_mgr[IUMEM_LDP_POLICY]);
policy_node = MPLS_NULL;
g_policy_list.num --;
if(g_policy_list.num ==0) /*2004-4-6 lixia add*/
return MPLS_POLICY_NEED_ENABLE;
if(rt_change == 0)
{
rt_change = 1;
return MPLS_POLICY_NEED_INFER;
}
else
return MPLS_POLICY_SUCCESS;
}
else
return MPLS_POLICY_NOT_EXIST;
}
unsigned short mpls_match_in_policy_tab(unsigned long addr,unsigned long mask,unsigned long nexthop)
{
mpls_policy_tab_t *policy_node = MPLS_NULL;
unsigned char match;
unsigned short lsp_create = 1;
policy_node = g_policy_list.req_list.next;
while(policy_node)
{
switch(policy_node->valid)
{
case MPLS_POLICY_ANY:
match = 1;
MPLS_ASSERT(policy_node->action == MPLS_POLICY_DENY);
if(policy_node->action == MPLS_POLICY_DENY)
lsp_create = 0;
break;
case MPLS_POLICY_DST_MSK:
MPLS_ASSERT(policy_node->action == MPLS_POLICY_DENY||policy_node->action == MPLS_POLICY_PERMIT);
if((addr&(policy_node->mask)) == ((policy_node->dest)&(policy_node->mask)))
{
match = 1;
if(policy_node->action == MPLS_POLICY_DENY)
lsp_create = 0;
else if(policy_node->action == MPLS_POLICY_PERMIT)
lsp_create = 1;
else
lsp_create = 2;
}
else
match = 0;
break;
case MPLS_POLICY_NHOP:
if(policy_node->nexthop == nexthop)
{
match = 1;
if(policy_node->action == MPLS_POLICY_DENY)
lsp_create = 0;
else if(policy_node->action == MPLS_POLICY_PERMIT)
lsp_create = 1;
else if(policy_node->action == MPLS_POLICY_EGRESS)
lsp_create = 2;
}
else
match = 0;
break;
case MPLS_POLICY_MASK:
MPLS_ASSERT(policy_node->action == MPLS_POLICY_DENY||policy_node->action == MPLS_POLICY_PERMIT);
if(policy_node->mask == mask)
{
match = 1;
if(policy_node->action == MPLS_POLICY_DENY)
lsp_create = 0;
else if(policy_node->action == MPLS_POLICY_PERMIT)
lsp_create = 1;
}
else
match = 0;
break;
default:
match = 0;
break;
}
if(match == 0)
policy_node = policy_node->next;
else if(match == 1)
break;
}
return lsp_create;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -