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

📄 ldpque.c

📁 技术文件名称:MPLSv1.0软件模块测试规程
💻 C
📖 第 1 页 / 共 5 页
字号:
    
  	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 + -