1: /*
2: * BIRD -- The Babel protocol
3: *
4: * Copyright (c) 2015--2016 Toke Hoiland-Jorgensen
5: *
6: * Can be freely distributed and used under the terms of the GNU GPL.
7: *
8: * This file contains the data structures used by Babel.
9: */
10:
11: #ifndef _BIRD_BABEL_H_
12: #define _BIRD_BABEL_H_
13:
14: #include "nest/bird.h"
15: #include "nest/cli.h"
16: #include "nest/iface.h"
17: #include "nest/route.h"
18: #include "nest/protocol.h"
19: #include "nest/locks.h"
20: #include "lib/resource.h"
21: #include "lib/lists.h"
22: #include "lib/socket.h"
23: #include "lib/string.h"
24: #include "lib/timer.h"
25:
26: #ifndef IPV6
27: #error "The Babel protocol only speaks IPv6"
28: #endif
29:
30: #define EA_BABEL_METRIC EA_CODE(EAP_BABEL, 0)
31: #define EA_BABEL_ROUTER_ID EA_CODE(EAP_BABEL, 1)
32:
33: #define BABEL_MAGIC 42
34: #define BABEL_VERSION 2
35: #define BABEL_PORT 6696
36: #define BABEL_INFINITY 0xFFFF
37:
38:
39: #define BABEL_HELLO_INTERVAL_WIRED 4 /* Default hello intervals in seconds */
40: #define BABEL_HELLO_INTERVAL_WIRELESS 4
41: #define BABEL_UPDATE_INTERVAL_FACTOR 4
42: #define BABEL_IHU_INTERVAL_FACTOR 3
43: #define BABEL_IHU_EXPIRY_FACTOR(X) ((X)*3/2) /* 1.5 */
44: #define BABEL_HELLO_EXPIRY_FACTOR(X) ((X)*3/2) /* 1.5 */
45: #define BABEL_ROUTE_EXPIRY_FACTOR(X) ((X)*7/2) /* 3.5 */
46: #define BABEL_ROUTE_REFRESH_INTERVAL 2 /* Seconds before route expiry to send route request */
47: #define BABEL_HOLD_TIME 10 /* Expiry time for our own routes */
48: #define BABEL_RXCOST_WIRED 96
49: #define BABEL_RXCOST_WIRELESS 256
50: #define BABEL_INITIAL_HOP_COUNT 255
51: #define BABEL_MAX_SEND_INTERVAL 5
52: #define BABEL_TIME_UNITS 100 /* On-wire times are counted in centiseconds */
53: #define BABEL_SEQNO_REQUEST_EXPIRY 60
54: #define BABEL_GARBAGE_INTERVAL 300
55:
56: /* Max interval that will not overflow when carried as 16-bit centiseconds */
57: #define BABEL_MAX_INTERVAL (0xFFFF/BABEL_TIME_UNITS)
58:
59: #define BABEL_OVERHEAD (SIZE_OF_IP_HEADER+UDP_HEADER_LENGTH)
60: #define BABEL_MIN_MTU (512 + BABEL_OVERHEAD)
61:
62:
63: enum babel_tlv_type {
64: BABEL_TLV_PAD1 = 0,
65: BABEL_TLV_PADN = 1,
66: BABEL_TLV_ACK_REQ = 2,
67: BABEL_TLV_ACK = 3,
68: BABEL_TLV_HELLO = 4,
69: BABEL_TLV_IHU = 5,
70: BABEL_TLV_ROUTER_ID = 6,
71: BABEL_TLV_NEXT_HOP = 7,
72: BABEL_TLV_UPDATE = 8,
73: BABEL_TLV_ROUTE_REQUEST = 9,
74: BABEL_TLV_SEQNO_REQUEST = 10,
75: /* extensions - not implemented
76: BABEL_TLV_TS_PC = 11,
77: BABEL_TLV_HMAC = 12,
78: BABEL_TLV_SS_UPDATE = 13,
79: BABEL_TLV_SS_REQUEST = 14,
80: BABEL_TLV_SS_SEQNO_REQUEST = 15,
81: */
82: BABEL_TLV_MAX
83: };
84:
85: enum babel_iface_type {
86: /* In practice, UNDEF and WIRED give equivalent behaviour */
87: BABEL_IFACE_TYPE_UNDEF = 0,
88: BABEL_IFACE_TYPE_WIRED = 1,
89: BABEL_IFACE_TYPE_WIRELESS = 2,
90: BABEL_IFACE_TYPE_MAX
91: };
92:
93: enum babel_ae_type {
94: BABEL_AE_WILDCARD = 0,
95: BABEL_AE_IP4 = 1,
96: BABEL_AE_IP6 = 2,
97: BABEL_AE_IP6_LL = 3,
98: BABEL_AE_MAX
99: };
100:
101:
102: struct babel_config {
103: struct proto_config c;
104:
105: list iface_list; /* Patterns configured -- keep it first; see babel_reconfigure why */
106: };
107:
108: struct babel_iface_config {
109: struct iface_patt i;
110:
111: u16 rxcost;
112: u8 type;
113: u8 check_link;
114: uint port;
115: u16 hello_interval;
116: u16 ihu_interval;
117: u16 update_interval;
118:
119: u16 rx_buffer; /* RX buffer size, 0 for MTU */
120: u16 tx_length; /* TX packet length limit (including headers), 0 for MTU */
121: int tx_tos;
122: int tx_priority;
123: };
124:
125: struct babel_proto {
126: struct proto p;
127: timer *timer;
128: struct fib rtable;
129: list interfaces; /* Interfaces we really know about (struct babel_iface) */
130: u64 router_id;
131: u16 update_seqno; /* To be increased on request */
132: u8 triggered; /* For triggering global updates */
133:
134: slab *route_slab;
135: slab *source_slab;
136: slab *msg_slab;
137:
138: slab *seqno_slab;
139: list seqno_cache; /* Seqno requests in the cache (struct babel_seqno_request) */
140:
141: struct tbf log_pkt_tbf; /* TBF for packet messages */
142: };
143:
144: struct babel_iface {
145: node n;
146:
147: struct babel_proto *proto;
148: struct iface *iface;
149:
150: struct babel_iface_config *cf;
151:
152: u8 up;
153:
154: pool *pool;
155: char *ifname;
156: sock *sk;
157: ip_addr addr;
158: int tx_length;
159: list neigh_list; /* List of neighbors seen on this iface (struct babel_neighbor) */
160: list msg_queue;
161:
162: u16 hello_seqno; /* To be increased on each hello */
163:
164: bird_clock_t next_hello;
165: bird_clock_t next_regular;
166: bird_clock_t next_triggered;
167: bird_clock_t want_triggered;
168:
169: timer *timer;
170: event *send_event;
171: };
172:
173: struct babel_neighbor {
174: node n;
175: struct babel_iface *ifa;
176:
177: ip_addr addr;
178: u16 txcost;
179: u8 hello_cnt;
180: u16 hello_map;
181: u16 next_hello_seqno;
182: /* expiry timers */
183: bird_clock_t hello_expiry;
184: bird_clock_t ihu_expiry;
185:
186: list routes; /* Routes this neighbour has sent us (struct babel_route) */
187: };
188:
189: struct babel_source {
190: node n;
191:
192: u64 router_id;
193: u16 seqno;
194: u16 metric;
195: bird_clock_t expires;
196: };
197:
198: struct babel_route {
199: node n;
200: node neigh_route;
201: struct babel_entry *e;
202: struct babel_neighbor *neigh;
203:
204: u16 seqno;
205: u16 advert_metric;
206: u16 metric;
207: u64 router_id;
208: ip_addr next_hop;
209: bird_clock_t refresh_time;
210: bird_clock_t expires;
211: u16 expiry_interval;
212: };
213:
214: struct babel_entry {
215: struct fib_node n;
216: struct babel_proto *proto;
217: struct babel_route *selected_in;
218: struct babel_route *selected_out;
219:
220: bird_clock_t updated;
221:
222: list sources; /* Source entries for this prefix (struct babel_source). */
223: list routes; /* Routes for this prefix (struct babel_route) */
224: };
225:
226: /* Stores forwarded seqno requests for duplicate suppression. */
227: struct babel_seqno_request {
228: node n;
229: ip_addr prefix;
230: u8 plen;
231: u64 router_id;
232: u16 seqno;
233: bird_clock_t updated;
234: };
235:
236:
237: /*
238: * Internal TLV messages
239: */
240:
241: struct babel_msg_ack_req {
242: u8 type;
243: u16 nonce;
244: u16 interval;
245: ip_addr sender;
246: };
247:
248: struct babel_msg_ack {
249: u8 type;
250: u16 nonce;
251: };
252:
253: struct babel_msg_hello {
254: u8 type;
255: u16 seqno;
256: u16 interval;
257: ip_addr sender;
258: };
259:
260: struct babel_msg_ihu {
261: u8 type;
262: u8 ae;
263: u16 rxcost;
264: u16 interval;
265: ip_addr addr;
266: ip_addr sender;
267: };
268:
269: struct babel_msg_update {
270: u8 type;
271: u8 wildcard;
272: u8 plen;
273: u16 interval;
274: u16 seqno;
275: u16 metric;
276: ip_addr prefix;
277: u64 router_id;
278: ip_addr next_hop;
279: ip_addr sender;
280: };
281:
282: struct babel_msg_route_request {
283: u8 type;
284: u8 full;
285: u8 plen;
286: ip_addr prefix;
287: };
288:
289: struct babel_msg_seqno_request {
290: u8 type;
291: u8 plen;
292: u16 seqno;
293: u8 hop_count;
294: u64 router_id;
295: ip_addr prefix;
296: ip_addr sender;
297: };
298:
299: union babel_msg {
300: u8 type;
301: struct babel_msg_ack_req ack_req;
302: struct babel_msg_ack ack;
303: struct babel_msg_hello hello;
304: struct babel_msg_ihu ihu;
305: struct babel_msg_update update;
306: struct babel_msg_route_request route_request;
307: struct babel_msg_seqno_request seqno_request;
308: };
309:
310: struct babel_msg_node {
311: node n;
312: union babel_msg msg;
313: };
314:
315:
316: /* babel.c */
317: void babel_handle_ack_req(union babel_msg *msg, struct babel_iface *ifa);
318: void babel_handle_ack(union babel_msg *msg, struct babel_iface *ifa);
319: void babel_handle_hello(union babel_msg *msg, struct babel_iface *ifa);
320: void babel_handle_ihu(union babel_msg *msg, struct babel_iface *ifa);
321: void babel_handle_router_id(union babel_msg *msg, struct babel_iface *ifa);
322: void babel_handle_update(union babel_msg *msg, struct babel_iface *ifa);
323: void babel_handle_route_request(union babel_msg *msg, struct babel_iface *ifa);
324: void babel_handle_seqno_request(union babel_msg *msg, struct babel_iface *ifa);
325:
326: void babel_show_interfaces(struct proto *P, char *iff);
327: void babel_show_neighbors(struct proto *P, char *iff);
328: void babel_show_entries(struct proto *P);
329:
330: /* packets.c */
331: void babel_enqueue(union babel_msg *msg, struct babel_iface *ifa);
332: void babel_send_unicast(union babel_msg *msg, struct babel_iface *ifa, ip_addr dest);
333: int babel_open_socket(struct babel_iface *ifa);
334: void babel_send_queue(void *arg);
335:
336:
337: #endif
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>