Annotation of embedaddon/bird2/proto/babel/babel.h, revision 1.1.1.1
1.1 misho 1: /*
2: * BIRD -- The Babel protocol
3: *
4: * Copyright (c) 2015--2016 Toke Hoiland-Jorgensen
5: * (c) 2016--2017 Ondrej Zajicek <santiago@crfreenet.org>
6: * (c) 2016--2017 CZ.NIC z.s.p.o.
7: *
8: * Can be freely distributed and used under the terms of the GNU GPL.
9: *
10: * This file contains the data structures used by Babel.
11: */
12:
13: #ifndef _BIRD_BABEL_H_
14: #define _BIRD_BABEL_H_
15:
16: #include "nest/bird.h"
17: #include "nest/cli.h"
18: #include "nest/iface.h"
19: #include "nest/route.h"
20: #include "nest/protocol.h"
21: #include "nest/locks.h"
22: #include "lib/resource.h"
23: #include "lib/lists.h"
24: #include "lib/socket.h"
25: #include "lib/string.h"
26: #include "lib/timer.h"
27:
28: #define EA_BABEL_METRIC EA_CODE(PROTOCOL_BABEL, 0)
29: #define EA_BABEL_ROUTER_ID EA_CODE(PROTOCOL_BABEL, 1)
30:
31: #define BABEL_MAGIC 42
32: #define BABEL_VERSION 2
33: #define BABEL_PORT 6696
34: #define BABEL_INFINITY 0xFFFF
35:
36:
37: #define BABEL_HELLO_INTERVAL_WIRED (4 S_) /* Default hello intervals in seconds */
38: #define BABEL_HELLO_INTERVAL_WIRELESS (4 S_)
39: #define BABEL_HELLO_LIMIT 12
40: #define BABEL_UPDATE_INTERVAL_FACTOR 4
41: #define BABEL_IHU_INTERVAL_FACTOR 3
42: #define BABEL_HOLD_TIME_FACTOR 4 /* How long we keep unreachable route relative to update interval */
43: #define BABEL_IHU_EXPIRY_FACTOR(X) ((btime)(X)*7/2) /* 3.5 */
44: #define BABEL_HELLO_EXPIRY_FACTOR(X) ((btime)(X)*3/2) /* 1.5 */
45: #define BABEL_ROUTE_EXPIRY_FACTOR(X) ((btime)(X)*7/2) /* 3.5 */
46: #define BABEL_ROUTE_REFRESH_FACTOR(X) ((btime)(X)*5/2) /* 2.5 */
47: #define BABEL_SEQNO_REQUEST_RETRY 4
48: #define BABEL_SEQNO_REQUEST_EXPIRY (2 S_)
49: #define BABEL_GARBAGE_INTERVAL (300 S_)
50: #define BABEL_RXCOST_WIRED 96
51: #define BABEL_RXCOST_WIRELESS 256
52: #define BABEL_INITIAL_HOP_COUNT 255
53: #define BABEL_MAX_SEND_INTERVAL 5 /* Unused ? */
54:
55: /* Max interval that will not overflow when carried as 16-bit centiseconds */
56: #define BABEL_TIME_UNITS 10000 /* On-wire times are counted in centiseconds */
57: #define BABEL_MIN_INTERVAL (0x0001 * BABEL_TIME_UNITS)
58: #define BABEL_MAX_INTERVAL (0xFFFF * BABEL_TIME_UNITS)
59:
60: #define BABEL_OVERHEAD (IP6_HEADER_LENGTH+UDP_HEADER_LENGTH)
61: #define BABEL_MIN_MTU (512 + BABEL_OVERHEAD)
62:
63:
64: enum babel_tlv_type {
65: BABEL_TLV_PAD1 = 0,
66: BABEL_TLV_PADN = 1,
67: BABEL_TLV_ACK_REQ = 2,
68: BABEL_TLV_ACK = 3,
69: BABEL_TLV_HELLO = 4,
70: BABEL_TLV_IHU = 5,
71: BABEL_TLV_ROUTER_ID = 6,
72: BABEL_TLV_NEXT_HOP = 7,
73: BABEL_TLV_UPDATE = 8,
74: BABEL_TLV_ROUTE_REQUEST = 9,
75: BABEL_TLV_SEQNO_REQUEST = 10,
76: /* extensions - not implemented
77: BABEL_TLV_TS_PC = 11,
78: BABEL_TLV_HMAC = 12,
79: BABEL_TLV_SS_UPDATE = 13,
80: BABEL_TLV_SS_REQUEST = 14,
81: BABEL_TLV_SS_SEQNO_REQUEST = 15,
82: */
83: BABEL_TLV_MAX
84: };
85:
86: enum babel_subtlv_type {
87: BABEL_SUBTLV_PAD1 = 0,
88: BABEL_SUBTLV_PADN = 1,
89:
90: /* Mandatory subtlvs */
91: BABEL_SUBTLV_SOURCE_PREFIX = 128,
92: };
93:
94: enum babel_iface_type {
95: /* In practice, UNDEF and WIRED give equivalent behaviour */
96: BABEL_IFACE_TYPE_UNDEF = 0,
97: BABEL_IFACE_TYPE_WIRED = 1,
98: BABEL_IFACE_TYPE_WIRELESS = 2,
99: BABEL_IFACE_TYPE_MAX
100: };
101:
102: enum babel_ae_type {
103: BABEL_AE_WILDCARD = 0,
104: BABEL_AE_IP4 = 1,
105: BABEL_AE_IP6 = 2,
106: BABEL_AE_IP6_LL = 3,
107: BABEL_AE_MAX
108: };
109:
110:
111: struct babel_config {
112: struct proto_config c;
113: list iface_list; /* List of iface configs (struct babel_iface_config) */
114: uint hold_time; /* Time to hold stale entries and unreachable routes */
115: u8 randomize_router_id;
116:
117: struct channel_config *ip4_channel;
118: struct channel_config *ip6_channel;
119: };
120:
121: struct babel_iface_config {
122: struct iface_patt i;
123:
124: u16 rxcost;
125: u8 type;
126: u8 limit; /* Minimum number of Hellos to keep link up */
127: u8 check_link;
128: uint port;
129: uint hello_interval; /* Hello interval, in us */
130: uint ihu_interval; /* IHU interval, in us */
131: uint update_interval; /* Update interval, in us */
132:
133: u16 rx_buffer; /* RX buffer size, 0 for MTU */
134: u16 tx_length; /* TX packet length limit (including headers), 0 for MTU */
135: int tx_tos;
136: int tx_priority;
137:
138: ip_addr next_hop_ip4;
139: ip_addr next_hop_ip6;
140: };
141:
142: struct babel_proto {
143: struct proto p;
144: timer *timer;
145: struct fib ip4_rtable;
146: struct fib ip6_rtable;
147:
148: struct channel *ip4_channel;
149: struct channel *ip6_channel;
150:
151: list interfaces; /* Interfaces we really know about (struct babel_iface) */
152: u64 router_id;
153: u16 update_seqno; /* To be increased on request */
154: u8 update_seqno_inc; /* Request for update_seqno increase */
155: u8 triggered; /* For triggering global updates */
156:
157: slab *route_slab;
158: slab *source_slab;
159: slab *msg_slab;
160: slab *seqno_slab;
161:
162: struct tbf log_pkt_tbf; /* TBF for packet messages */
163: };
164:
165: struct babel_iface {
166: node n;
167:
168: struct babel_proto *proto;
169: struct iface *iface;
170:
171: struct babel_iface_config *cf;
172:
173: u8 up;
174:
175: pool *pool;
176: char *ifname;
177: sock *sk;
178: ip_addr addr;
179: ip_addr next_hop_ip4;
180: ip_addr next_hop_ip6;
181: int tx_length;
182: list neigh_list; /* List of neighbors seen on this iface (struct babel_neighbor) */
183: list msg_queue;
184:
185: u16 hello_seqno; /* To be increased on each hello */
186:
187: btime next_hello;
188: btime next_regular;
189: btime next_triggered;
190: btime want_triggered;
191:
192: timer *timer;
193: event *send_event;
194: };
195:
196: struct babel_neighbor {
197: node n;
198: struct babel_iface *ifa;
199:
200: ip_addr addr;
201: uint uc; /* Reference counter for seqno requests */
202: u16 rxcost; /* Sent in last IHU */
203: u16 txcost; /* Received in last IHU */
204: u16 cost; /* Computed neighbor cost */
205: s8 ihu_cnt; /* IHU countdown, 0 to send it */
206: u8 hello_cnt;
207: u16 hello_map;
208: u16 next_hello_seqno;
209: uint last_hello_int;
210: /* expiry timers */
211: btime hello_expiry;
212: btime ihu_expiry;
213:
214: list routes; /* Routes this neighbour has sent us (struct babel_route) */
215: };
216:
217: struct babel_source {
218: node n;
219:
220: u64 router_id;
221: u16 seqno;
222: u16 metric;
223: btime expires;
224: };
225:
226: struct babel_route {
227: node n;
228: node neigh_route;
229: struct babel_entry *e;
230: struct babel_neighbor *neigh;
231:
232: u8 feasible;
233: u16 seqno;
234: u16 metric;
235: u16 advert_metric;
236: u64 router_id;
237: ip_addr next_hop;
238: btime refresh_time;
239: btime expires;
240: };
241:
242: struct babel_seqno_request {
243: node n;
244: u64 router_id;
245: u16 seqno;
246: u8 hop_count;
247: u8 count;
248: btime expires;
249: struct babel_neighbor *nbr;
250: };
251:
252: struct babel_entry {
253: struct babel_route *selected;
254:
255: list routes; /* Routes for this prefix (struct babel_route) */
256: list sources; /* Source entries for this prefix (struct babel_source). */
257: list requests;
258:
259: u8 valid; /* Entry validity state (BABEL_ENTRY_*) */
260: u8 unreachable; /* Unreachable route is announced */
261: u16 seqno; /* Outgoing seqno */
262: u16 metric; /* Outgoing metric */
263: u64 router_id; /* Outgoing router ID */
264: btime updated; /* Last change of outgoing rte, for triggered updates */
265:
266: struct fib_node n;
267: };
268:
269: #define BABEL_ENTRY_DUMMY 0 /* No outgoing route */
270: #define BABEL_ENTRY_VALID 1 /* Valid outgoing route */
271: #define BABEL_ENTRY_STALE 2 /* Stale outgoing route, waiting for GC */
272:
273:
274: /*
275: * Internal TLV messages
276: */
277:
278: struct babel_msg_ack_req {
279: u8 type;
280: u16 nonce;
281: uint interval;
282: ip_addr sender;
283: };
284:
285: struct babel_msg_ack {
286: u8 type;
287: u16 nonce;
288: };
289:
290: struct babel_msg_hello {
291: u8 type;
292: u16 seqno;
293: uint interval;
294: ip_addr sender;
295: };
296:
297: struct babel_msg_ihu {
298: u8 type;
299: u8 ae;
300: u16 rxcost;
301: uint interval;
302: ip_addr addr;
303: ip_addr sender;
304: };
305:
306: struct babel_msg_update {
307: u8 type;
308: u8 wildcard;
309: uint interval;
310: u16 seqno;
311: u16 metric;
312: u64 router_id;
313: union {
314: net_addr net;
315: net_addr_ip6_sadr net_sadr;
316: };
317: ip_addr next_hop;
318: ip_addr sender;
319: };
320:
321: struct babel_msg_route_request {
322: u8 type;
323: u8 full;
324: union {
325: net_addr net;
326: net_addr_ip6_sadr net_sadr;
327: };
328: };
329:
330: struct babel_msg_seqno_request {
331: u8 type;
332: u8 hop_count;
333: u16 seqno;
334: u64 router_id;
335: union {
336: net_addr net;
337: net_addr_ip6_sadr net_sadr;
338: };
339: ip_addr sender;
340: };
341:
342: union babel_msg {
343: u8 type;
344: struct babel_msg_ack_req ack_req;
345: struct babel_msg_ack ack;
346: struct babel_msg_hello hello;
347: struct babel_msg_ihu ihu;
348: struct babel_msg_update update;
349: struct babel_msg_route_request route_request;
350: struct babel_msg_seqno_request seqno_request;
351: };
352:
353: struct babel_msg_node {
354: node n;
355: union babel_msg msg;
356: };
357:
358: static inline int babel_sadr_enabled(struct babel_proto *p)
359: { return p->ip6_rtable.addr_type == NET_IP6_SADR; }
360:
361: /* babel.c */
362: void babel_handle_ack_req(union babel_msg *msg, struct babel_iface *ifa);
363: void babel_handle_ack(union babel_msg *msg, struct babel_iface *ifa);
364: void babel_handle_hello(union babel_msg *msg, struct babel_iface *ifa);
365: void babel_handle_ihu(union babel_msg *msg, struct babel_iface *ifa);
366: void babel_handle_router_id(union babel_msg *msg, struct babel_iface *ifa);
367: void babel_handle_update(union babel_msg *msg, struct babel_iface *ifa);
368: void babel_handle_route_request(union babel_msg *msg, struct babel_iface *ifa);
369: void babel_handle_seqno_request(union babel_msg *msg, struct babel_iface *ifa);
370:
371: void babel_show_interfaces(struct proto *P, char *iff);
372: void babel_show_neighbors(struct proto *P, char *iff);
373: void babel_show_entries(struct proto *P);
374: void babel_show_routes(struct proto *P);
375:
376: /* packets.c */
377: void babel_enqueue(union babel_msg *msg, struct babel_iface *ifa);
378: void babel_send_unicast(union babel_msg *msg, struct babel_iface *ifa, ip_addr dest);
379: int babel_open_socket(struct babel_iface *ifa);
380: void babel_send_queue(void *arg);
381:
382:
383: #endif
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>