📄 ldpque.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 + -