Annotation of embedaddon/bird2/proto/bfd/bfd.h, revision 1.1.1.1
1.1 misho 1: /*
2: * BIRD -- Bidirectional Forwarding Detection (BFD)
3: *
4: * Can be freely distributed and used under the terms of the GNU GPL.
5: */
6:
7: #ifndef _BIRD_BFD_H_
8: #define _BIRD_BFD_H_
9:
10: #include <pthread.h>
11:
12: #include "nest/bird.h"
13: #include "nest/cli.h"
14: #include "nest/iface.h"
15: #include "nest/protocol.h"
16: #include "nest/route.h"
17: #include "nest/password.h"
18: #include "conf/conf.h"
19: #include "lib/hash.h"
20: #include "lib/resource.h"
21: #include "lib/socket.h"
22: #include "lib/string.h"
23:
24: #include "nest/bfd.h"
25: #include "io.h"
26:
27:
28: #define BFD_CONTROL_PORT 3784
29: #define BFD_ECHO_PORT 3785
30: #define BFD_MULTI_CTL_PORT 4784
31:
32: #define BFD_DEFAULT_MIN_RX_INT (10 MS_)
33: #define BFD_DEFAULT_MIN_TX_INT (100 MS_)
34: #define BFD_DEFAULT_IDLE_TX_INT (1 S_)
35: #define BFD_DEFAULT_MULTIPLIER 5
36:
37:
38: struct bfd_iface_config;
39:
40: struct bfd_config
41: {
42: struct proto_config c;
43: list patt_list; /* List of iface configs (struct bfd_iface_config) */
44: list neigh_list; /* List of configured neighbors (struct bfd_neighbor) */
45: struct bfd_iface_config *multihop; /* Multihop pseudoiface config */
46: };
47:
48: struct bfd_iface_config
49: {
50: struct iface_patt i;
51: u32 min_rx_int;
52: u32 min_tx_int;
53: u32 idle_tx_int;
54: u8 multiplier;
55: u8 passive;
56: u8 auth_type; /* Authentication type (BFD_AUTH_*) */
57: list *passwords; /* Passwords for authentication */
58: };
59:
60: struct bfd_neighbor
61: {
62: node n;
63: ip_addr addr;
64: ip_addr local;
65: struct iface *iface;
66:
67: struct neighbor *neigh;
68: struct bfd_request *req;
69:
70: u8 multihop;
71: u8 active;
72: };
73:
74: struct bfd_proto
75: {
76: struct proto p;
77: struct birdloop *loop;
78: pool *tpool;
79: pthread_spinlock_t lock;
80: node bfd_node;
81:
82: slab *session_slab;
83: HASH(struct bfd_session) session_hash_id;
84: HASH(struct bfd_session) session_hash_ip;
85:
86: sock *notify_rs;
87: sock *notify_ws;
88: list notify_list;
89:
90: sock *rx4_1;
91: sock *rx6_1;
92: sock *rx4_m;
93: sock *rx6_m;
94: list iface_list;
95: };
96:
97: struct bfd_iface
98: {
99: node n;
100: ip_addr local;
101: struct iface *iface;
102: struct bfd_iface_config *cf;
103: struct bfd_proto *bfd;
104:
105: sock *sk;
106: u32 uc;
107: u8 changed;
108: };
109:
110: struct bfd_session
111: {
112: node n;
113: ip_addr addr; /* Address of session */
114: struct bfd_iface *ifa; /* Iface associated with session */
115: struct bfd_session *next_id; /* Next in bfd.session_hash_id */
116: struct bfd_session *next_ip; /* Next in bfd.session_hash_ip */
117:
118: u8 opened_unused;
119: u8 passive;
120: u8 poll_active;
121: u8 poll_scheduled;
122:
123: u8 loc_state;
124: u8 rem_state;
125: u8 loc_diag;
126: u8 rem_diag;
127: u32 loc_id; /* Local session ID (local discriminator) */
128: u32 rem_id; /* Remote session ID (remote discriminator) */
129: u32 des_min_tx_int; /* Desired min rx interval, local option */
130: u32 des_min_tx_new; /* Used for des_min_tx_int change */
131: u32 req_min_rx_int; /* Required min tx interval, local option */
132: u32 req_min_rx_new; /* Used for req_min_rx_int change */
133: u32 rem_min_tx_int; /* Last received des_min_tx_int */
134: u32 rem_min_rx_int; /* Last received req_min_rx_int */
135: u8 demand_mode; /* Currently unused */
136: u8 rem_demand_mode;
137: u8 detect_mult; /* Announced detect_mult, local option */
138: u8 rem_detect_mult; /* Last received detect_mult */
139:
140: btime last_tx; /* Time of last sent periodic control packet */
141: btime last_rx; /* Time of last received valid control packet */
142:
143: timer *tx_timer; /* Periodic control packet timer */
144: timer *hold_timer; /* Timer for session down detection time */
145:
146: list request_list; /* List of client requests (struct bfd_request) */
147: btime last_state_change; /* Time of last state change */
148: u8 notify_running; /* 1 if notify hooks are running */
149:
150: u8 rx_csn_known; /* Received crypto sequence number is known */
151: u32 rx_csn; /* Last received crypto sequence number */
152: u32 tx_csn; /* Last transmitted crypto sequence number */
153: u32 tx_csn_time; /* Timestamp of last tx_csn change */
154: };
155:
156:
157: extern const char *bfd_state_names[];
158:
159: #define BFD_STATE_ADMIN_DOWN 0
160: #define BFD_STATE_DOWN 1
161: #define BFD_STATE_INIT 2
162: #define BFD_STATE_UP 3
163:
164: #define BFD_DIAG_NOTHING 0
165: #define BFD_DIAG_TIMEOUT 1
166: #define BFD_DIAG_ECHO_FAILED 2
167: #define BFD_DIAG_NEIGHBOR_DOWN 3
168: #define BFD_DIAG_FWD_RESET 4
169: #define BFD_DIAG_PATH_DOWN 5
170: #define BFD_DIAG_C_PATH_DOWN 6
171: #define BFD_DIAG_ADMIN_DOWN 7
172: #define BFD_DIAG_RC_PATH_DOWN 8
173:
174: #define BFD_POLL_TX 1
175: #define BFD_POLL_RX 2
176:
177: #define BFD_FLAGS 0x3f
178: #define BFD_FLAG_POLL (1 << 5)
179: #define BFD_FLAG_FINAL (1 << 4)
180: #define BFD_FLAG_CPI (1 << 3)
181: #define BFD_FLAG_AP (1 << 2)
182: #define BFD_FLAG_DEMAND (1 << 1)
183: #define BFD_FLAG_MULTIPOINT (1 << 0)
184:
185: #define BFD_AUTH_NONE 0
186: #define BFD_AUTH_SIMPLE 1
187: #define BFD_AUTH_KEYED_MD5 2
188: #define BFD_AUTH_METICULOUS_KEYED_MD5 3
189: #define BFD_AUTH_KEYED_SHA1 4
190: #define BFD_AUTH_METICULOUS_KEYED_SHA1 5
191:
192: extern const u8 bfd_auth_type_to_hash_alg[];
193:
194:
195: static inline void bfd_lock_sessions(struct bfd_proto *p) { pthread_spin_lock(&p->lock); }
196: static inline void bfd_unlock_sessions(struct bfd_proto *p) { pthread_spin_unlock(&p->lock); }
197:
198: /* bfd.c */
199: struct bfd_session * bfd_find_session_by_id(struct bfd_proto *p, u32 id);
200: struct bfd_session * bfd_find_session_by_addr(struct bfd_proto *p, ip_addr addr);
201: void bfd_session_process_ctl(struct bfd_session *s, u8 flags, u32 old_tx_int, u32 old_rx_int);
202: void bfd_show_sessions(struct proto *P);
203:
204: /* packets.c */
205: void bfd_send_ctl(struct bfd_proto *p, struct bfd_session *s, int final);
206: sock * bfd_open_rx_sk(struct bfd_proto *p, int multihop, int inet_version);
207: sock * bfd_open_tx_sk(struct bfd_proto *p, ip_addr local, struct iface *ifa);
208:
209:
210: #endif /* _BIRD_BFD_H_ */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>