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

📄 ldpque.h

📁 技术文件名称:MPLSv1.0软件模块测试规程
💻 H
字号:
/* huyonghong 2003.4.3 增加策略的数据结构和函数声明 */
#ifndef LDPQUE_H
#define LDPQUE_H

#include "pvcmpls.h"
#include "ldpfwd.h"

#include "_noalign.h"

/*****************************************************************************/
/* List Management Macro                                                     */
/*****************************************************************************/

#define XC_CONF_TIME				(5*LDP_MIN_TIME_INTERVAL)		/*跟C进程缓冲确认时间*/
#define XC_QUE_FULL_RESND_TIME		(2*LDP_MIN_TIME_INTERVAL)		/* 跟C进程缓冲满重发时间 */
#define XC_RES_TIME					(120*LDP_MIN_TIME_INTERVAL) 	/* 跟C010通信时间 */

#define LBL_CONF_TIME				(2*LDP_MIN_TIME_INTERVAL)       /*跟标记同步缓冲确认时间*/
#define LBL_QUE_FULL_RESEND_TIME	(1*LDP_MIN_TIME_INTERVAL)		/* 跟标记同步缓冲满重发时间 */

#define FEC_CONF_TIME               (1*LDP_MIN_TIME_INTERVAL)       /*跟FEC缓冲确认时间*/
#define FEC_QUE_FULL_RESEND_TIME	(1*LDP_MIN_TIME_INTERVAL)		/* 跟FEC缓冲满重发时间 */

#define REQ_RESEND_TIME				(60*LDP_MIN_TIME_INTERVAL)	    /* 重发request定时时间 */
#define REQ_DELAY					(60*LDP_MIN_TIME_INTERVAL)      /* abort跟request之间发送时延 */


#define MPLS_INIT_ROOT(R)        (R).self = NULL;               \
                                (R).next = &(R);               \
                                (R).prev = &(R)

#define MPLS_INIT_LQE(E, S)      (E).self = (S);                \
                                (E).next = NULL;               \
                                (E).prev = NULL

#define MPLS_LIST_ROOT(R)        ((R).self == NULL)
#define MPLS_EMPTY_LIST(R)       ((R).next == &(R))
#define MPLS_IN_LIST(E)          ((E).next != NULL)
#define MPLS_NEXT_IN_LIST(E)     (void *)((E).next->self)
#define MPLS_PREV_IN_LIST(E)     (void *)((E).prev->self)
#define MPLS_GET_FIRST_LQE(R)	 (void *)((R).next)		
#define MPLS_LIST_NEXT(E)		 (void *)((E).next)
#define MPLS_LIST_PREV(E)		 (void *)((E).prev)	

#define MPLS_INSERT_AFTER(P, E)  MPLS_ASSERT((E).next == NULL);  \
                                MPLS_ASSERT((E).prev == NULL);  \
                                MPLS_ASSERT((P).prev != NULL);  \
                                MPLS_ASSERT((P).next != NULL);  \
                                (E).next = (P).next;           \
                                (E).prev = &(P);               \
                                (E).next->prev = &(E);         \
                                (E).prev->next = &(E)

#define MPLS_INSERT_BEFORE(N, E) MPLS_ASSERT((E).next == NULL);  \
                                MPLS_ASSERT((E).prev == NULL);  \
                                MPLS_ASSERT((N).prev != NULL);  \
                                MPLS_ASSERT((N).next != NULL);  \
                                (E).prev = (N).prev;           \
                                (E).next = &(N);               \
                                (E).next->prev = &(E);         \
                                (E).prev->next = &(E)

#define MPLS_REMOVE_FROM_LIST(E) MPLS_ASSERT((E).prev != NULL);  \
                                MPLS_ASSERT((E).next != NULL);  \
                                (E).next->prev = (E).prev;     \
                                (E).prev->next = (E).next;     \
                                (E).next = NULL;               \
                                (E).prev = NULL
                                
#define REQ_QUEUE_OK		0
#define REQ_QUEUE_FULL		1
#define REQ_MEMORY_FAIL		2
#define LOC_NO_NEED			0	/* 不需要记录在缓冲中的地址 */
#define LOC_NEED			1	/* 需要记录在缓冲中的地址 */

#define MPLS_POLICY_SUCCESS      0
//#define MPLS_POLICY_MEMORY_FAIL  2           /*lixia dele 2003-11-6 */
#define MPLS_POLICY_NOT_EXIST    3

/* lixia add 2003-9-22 */
#define MPLS_RELPVC_SUCCESS      0
#define MPLS_RELPVC_MEMORY_FAIL  4 
#define MPLS_RELPVC_NOT_EXIST    5 

#define RESEND_RELPVC_NUM        5    /* 2003-10-21 lixia add for unrel pvc */

/* 队列采用了双向循环链表结构 */
typedef struct mpls_lqe
{
	struct mpls_lqe       *next;     /* 指向后一个节点 */
	struct mpls_lqe       *prev;     /* 指向前一个节点 */
	void                  *self;      /* 指向本节点(某一特定请求)的起始地址 */  
} MPLS_PACK MPLS_LQE;

/* 队列结构 */
typedef struct mpls_req
{
  	MPLS_LQE            req_queue;        /* 请求消息队列 */
  	unsigned char       req_in_progress;    /* 表示队列头是否正在处理的标志位 */
  	unsigned short      req_num;          /* 当前队列中的请求个数 */
  	unsigned long       index;             /* 当前请求匹配号 */
  	unsigned long       timerid;            /* 当前请求定时器 */
} MPLS_PACK MPLS_REQ;

/* 与C通信队列中self指向的请求的节点结构 */
typedef struct {
    unsigned char      req_type;  /* 1:预留;2:建立;3:释放资源;4:释放PVC */
#define   BANDWIDTH_REQ    1
#define   CRPVC_REQ        2
#define   RLSBW_REQ        3
#define   RLSPVC_REQ       4
    union {
        STRUC_MPLS_AD_BANDWIDTH_REQ    bw_req;
        STRUC_MPLS_AD_CRPVC_REQ        crpvc_req;
        STRUC_MPLS_AD_RLSBW_REQ        rlsbw_req;
        STRUC_MPLS_AD_RLSPVC_REQ       rlspvc_req;
    } union_req;
} MPLS_PACK XC_REQ;    /*  */

/* 与标记整合模块通信队列中self指向的请求的节点结构 */
typedef struct {
	unsigned char      req_type;
#define SEND_REQ		1
#define RECV_REQ		2
#define CLOSE_REQ		3
	mplsLdpFecLabel    feclabel;
} MPLS_PACK FECLABEL_REQ;	

/* 回确认的结构 */
typedef struct {
    unsigned long      index;    /* xc_req的index */      
} MPLS_PACK LDPREQ_CONF;    

typedef struct {
	unsigned long 							req_index;
	STRUC_MPLS_AD_BANDWIDTH_REQ	    req;
}MPLS_PACK MPLS_BANDWIDTH_REQ;

typedef struct {
	unsigned long 							req_index;
	STRUC_MPLS_AD_RLSBW_REQ			req;
}MPLS_PACK MPLS_RLSBW_REQ;

typedef struct {
	unsigned long 							req_index;
	STRUC_MPLS_AD_CRPVC_REQ			req;
}MPLS_PACK MPLS_CRPVC_REQ;

typedef struct {
	unsigned long 							req_index;
	STRUC_MPLS_AD_RLSPVC_REQ		req;
}MPLS_PACK MPLS_RLSPVC_REQ;


typedef struct {
	unsigned long 		ack_index;
    unsigned char       ack_type;  /* 1:预留;2:建立;3:释放资源;4:释放PVC */
#define   BANDWIDTH_ACK    1
#define   CRPVC_ACK        2
#define   RLSBW_ACK        3
#define   RLSPVC_ACK       4
    union {
        STRUC_AD_MPLS_BANDWIDTH_ACK    bw_ack;
        STRUC_AD_MPLS_CRPVC_ACK        crpvc_ack;
        STRUC_AD_MPLS_RLSBW_ACK        rlsbw_ack;
        STRUC_AD_MPLS_RLSPVC_ACK       rlspvc_ack;
    } union_ack;
}MPLS_PACK XC_ACK;


typedef struct mpls_policy_tab      /* 表示一条具体的策略 */
{
    unsigned char action;            /* 策略动作 permit 1/deny 2/egress 3 */
    unsigned long dest;              /* 目的地址 */
    unsigned long mask;               /* 目的网段长度 */
    unsigned long nexthop;           /* 下一跳地址 */
    unsigned char valid;             /* 1:any; 2:dest+addr; 3:nexthop; 4:mask */
    struct mpls_policy_tab  *next;
    
}MPLS_PACK mpls_policy_tab_t;

typedef struct 
{    
    unsigned short       num;           /* lixia change char to short 2003-11-6 */ 
    mpls_policy_tab_t   req_list; /* 策略链表 */
    
}MPLS_PACK mpls_policy_list;



void mpls_reset_xc_req();
void mpls_process_xc_req();
short mpls_xc_req_append(void *xcreq,
						unsigned char xcreq_type,
						unsigned char *lqe_loc,
						unsigned char loc_need);
void mpls_xc_req_confirm(void *in,unsigned char ack_type);
void mpls_xcreq_queue_timeout();
void mpls_xcreq_next();
void delete_lqe_xcque(unsigned char *lqe_loc);
void mpls_xcreq_queue_delay();
int match_queue_head(unsigned short localLspId,
		         unsigned long  IngressId,
		         unsigned long  LspCBNo,
		         unsigned char  ack_type);

void search_lspindex_xcque(unsigned long lspIndex,MPLS_LQE *xc_lqe);
void delete_lspindex_xcque(unsigned long lspIndex);
unsigned long ldp_get_crque_num(XC_REQ *req_index);

short mpls_feclabel_req_append(void *req,unsigned char req_type);
void mpls_process_feclabel_req();
void mpls_feclabel_req_confirm(void *in);
void mpls_feclabelreq_queue_timeout();
void mpls_feclabelreq_next();
void mpls_reset_feclabel_req();

short mpls_fec_req_append(void *req);
void mpls_process_fec_req();
void mpls_fec_req_confirm(void *in);
void mpls_fecreq_queue_timeout();
void mpls_fecreq_next();
void mpls_reset_fec_req();

short mpls_insert_into_policy_tab(unsigned char action,unsigned long addr,unsigned long mask,unsigned long nexthop,unsigned char valid);
short mpls_delete_from_policy_tab(unsigned char action,unsigned long addr,unsigned long mask,unsigned long nexthop,unsigned char valid);
unsigned short mpls_match_in_policy_tab(unsigned long addr,unsigned long mask,unsigned long nexthop);



#include "_restore.h"
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -