xref: /openbsd-src/usr.sbin/eigrpd/eigrpd.h (revision f2da64fbbbf1b03f09f390ab01267c93dfd77c4c)
1 /*	$OpenBSD: eigrpd.h,v 1.22 2016/09/02 17:59:58 benno Exp $ */
2 
3 /*
4  * Copyright (c) 2015 Renato Westphal <renato@openbsd.org>
5  * Copyright (c) 2004 Esben Norby <norby@openbsd.org>
6  * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
7  *
8  * Permission to use, copy, modify, and distribute this software for any
9  * purpose with or without fee is hereby granted, provided that the above
10  * copyright notice and this permission notice appear in all copies.
11  *
12  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
13  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
14  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
15  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
16  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
18  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19  */
20 
21 #ifndef _EIGRPD_H_
22 #define _EIGRPD_H_
23 
24 #include <sys/queue.h>
25 #include <sys/tree.h>
26 #include <sys/socket.h>
27 #include <net/if.h>
28 #include <netinet/in.h>
29 
30 #include <event.h>
31 #include <imsg.h>
32 
33 #include "eigrp.h"
34 
35 #define CONF_FILE		"/etc/eigrpd.conf"
36 #define	EIGRPD_SOCKET		"/var/run/eigrpd.sock"
37 #define EIGRPD_USER		"_eigrpd"
38 
39 #define EIGRPD_OPT_VERBOSE	0x00000001
40 #define EIGRPD_OPT_VERBOSE2	0x00000002
41 #define EIGRPD_OPT_NOACTION	0x00000004
42 
43 #define NBR_IDSELF		1
44 #define NBR_CNTSTART		(NBR_IDSELF + 1)
45 
46 #define	READ_BUF_SIZE		65535
47 #define	PKG_DEF_SIZE		512	/* compromise */
48 #define	RT_BUF_SIZE		16384
49 #define	MAX_RTSOCK_BUF		128 * 1024
50 
51 #define	F_EIGRPD_INSERTED	0x0001
52 #define	F_KERNEL		0x0002
53 #define	F_CONNECTED		0x0004
54 #define	F_STATIC		0x0008
55 #define	F_DYNAMIC		0x0010
56 #define F_DOWN                  0x0020
57 #define	F_REJECT		0x0040
58 #define	F_BLACKHOLE		0x0080
59 #define	F_REDISTRIBUTED		0x0100
60 #define	F_CTL_EXTERNAL		0x0200	/* only used by eigrpctl */
61 #define	F_CTL_ACTIVE		0x0400
62 #define	F_CTL_ALLLINKS		0x0800
63 
64 static const char * const log_procnames[] = {
65 	"parent",
66 	"eigrpe",
67 	"rde"
68 };
69 
70 struct imsgev {
71 	struct imsgbuf		 ibuf;
72 	void			(*handler)(int, short, void *);
73 	struct event		 ev;
74 	short			 events;
75 };
76 
77 enum imsg_type {
78 	IMSG_CTL_RELOAD,
79 	IMSG_CTL_SHOW_INTERFACE,
80 	IMSG_CTL_SHOW_NBR,
81 	IMSG_CTL_SHOW_TOPOLOGY,
82 	IMSG_CTL_SHOW_STATS,
83 	IMSG_CTL_CLEAR_NBR,
84 	IMSG_CTL_FIB_COUPLE,
85 	IMSG_CTL_FIB_DECOUPLE,
86 	IMSG_CTL_IFACE,
87 	IMSG_CTL_KROUTE,
88 	IMSG_CTL_IFINFO,
89 	IMSG_CTL_END,
90 	IMSG_CTL_LOG_VERBOSE,
91 	IMSG_KROUTE_CHANGE,
92 	IMSG_KROUTE_DELETE,
93 	IMSG_NONE,
94 	IMSG_IFINFO,
95 	IMSG_IFDOWN,
96 	IMSG_NEWADDR,
97 	IMSG_DELADDR,
98 	IMSG_NETWORK_ADD,
99 	IMSG_NETWORK_DEL,
100 	IMSG_NEIGHBOR_UP,
101 	IMSG_NEIGHBOR_DOWN,
102 	IMSG_RECV_UPDATE_INIT,
103 	IMSG_RECV_UPDATE,
104 	IMSG_RECV_QUERY,
105 	IMSG_RECV_REPLY,
106 	IMSG_RECV_SIAQUERY,
107 	IMSG_RECV_SIAREPLY,
108 	IMSG_SEND_UPDATE,
109 	IMSG_SEND_QUERY,
110 	IMSG_SEND_REPLY,
111 	IMSG_SEND_MUPDATE,
112 	IMSG_SEND_MQUERY,
113 	IMSG_SEND_UPDATE_END,
114 	IMSG_SEND_REPLY_END,
115 	IMSG_SEND_SIAQUERY_END,
116 	IMSG_SEND_SIAREPLY_END,
117 	IMSG_SEND_MUPDATE_END,
118 	IMSG_SEND_MQUERY_END,
119 	IMSG_SOCKET_IPC,
120 	IMSG_RECONF_CONF,
121 	IMSG_RECONF_IFACE,
122 	IMSG_RECONF_INSTANCE,
123 	IMSG_RECONF_EIGRP_IFACE,
124 	IMSG_RECONF_END
125 };
126 
127 /* forward declarations */
128 struct eigrp_iface;
129 RB_HEAD(iface_id_head, eigrp_iface);
130 struct nbr;
131 RB_HEAD(nbr_addr_head, nbr);
132 RB_HEAD(nbr_pid_head, nbr);
133 struct rde_nbr;
134 RB_HEAD(rde_nbr_head, rde_nbr);
135 struct rt_node;
136 RB_HEAD(rt_tree, rt_node);
137 
138 union eigrpd_addr {
139 	struct in_addr	v4;
140 	struct in6_addr	v6;
141 };
142 
143 #define IN6_IS_SCOPE_EMBED(a)   \
144 	((IN6_IS_ADDR_LINKLOCAL(a)) ||  \
145 	 (IN6_IS_ADDR_MC_LINKLOCAL(a)) || \
146 	 (IN6_IS_ADDR_MC_INTFACELOCAL(a)))
147 
148 /* interface types */
149 enum iface_type {
150 	IF_TYPE_POINTOPOINT,
151 	IF_TYPE_BROADCAST
152 };
153 
154 struct if_addr {
155 	TAILQ_ENTRY(if_addr)	 entry;
156 	int			 af;
157 	union eigrpd_addr	 addr;
158 	uint8_t			 prefixlen;
159 	union eigrpd_addr	 dstbrd;
160 };
161 TAILQ_HEAD(if_addr_head, if_addr);
162 
163 struct iface {
164 	TAILQ_ENTRY(iface)	 entry;
165 	TAILQ_HEAD(, eigrp_iface) ei_list;
166 	unsigned int		 ifindex;
167 	char			 name[IF_NAMESIZE];
168 	struct if_addr_head	 addr_list;
169 	struct in6_addr		 linklocal;
170 	int			 mtu;
171 	enum iface_type		 type;
172 	uint8_t			 if_type;
173 	uint64_t		 baudrate;
174 	uint16_t		 flags;
175 	uint8_t			 linkstate;
176 	uint8_t			 group_count_v4;
177 	uint8_t			 group_count_v6;
178 };
179 
180 enum route_type {
181 	EIGRP_ROUTE_INTERNAL,
182 	EIGRP_ROUTE_EXTERNAL
183 };
184 
185 /* routing information advertised by update/query/reply messages */
186 struct rinfo {
187 	int			 af;
188 	enum route_type		 type;
189 	union eigrpd_addr	 prefix;
190 	uint8_t			 prefixlen;
191 	union eigrpd_addr	 nexthop;
192 	struct classic_metric	 metric;
193 	struct classic_emetric	 emetric;
194 };
195 
196 struct rinfo_entry {
197 	TAILQ_ENTRY(rinfo_entry) entry;
198 	struct rinfo		 rinfo;
199 };
200 TAILQ_HEAD(rinfo_head, rinfo_entry);
201 
202 /* interface states */
203 #define	IF_STA_DOWN		0x01
204 #define	IF_STA_ACTIVE		0x02
205 
206 struct summary_addr {
207 	TAILQ_ENTRY(summary_addr) entry;
208 	union eigrpd_addr	 prefix;
209 	uint8_t			 prefixlen;
210 };
211 
212 struct eigrp_iface {
213 	RB_ENTRY(eigrp_iface)	 id_tree;
214 	TAILQ_ENTRY(eigrp_iface) e_entry;
215 	TAILQ_ENTRY(eigrp_iface) i_entry;
216 	struct eigrp		*eigrp;
217 	struct iface		*iface;
218 	int			 state;
219 	uint32_t		 ifaceid;
220 	struct event		 hello_timer;
221 	uint32_t		 delay;
222 	uint32_t		 bandwidth;
223 	uint16_t		 hello_holdtime;
224 	uint16_t		 hello_interval;
225 	uint8_t			 splithorizon;
226 	uint8_t			 passive;
227 	time_t			 uptime;
228 	TAILQ_HEAD(, nbr)	 nbr_list;
229 	struct nbr		*self;
230 	struct rinfo_head	 update_list;	/* multicast updates */
231 	struct rinfo_head	 query_list;	/* multicast queries */
232 	TAILQ_HEAD(, summary_addr) summary_list;
233 };
234 RB_PROTOTYPE(iface_id_head, eigrp_iface, id_tree, iface_id_compare)
235 
236 #define INADDRSZ	4
237 #define IN6ADDRSZ	16
238 
239 struct seq_addr_entry {
240 	TAILQ_ENTRY(seq_addr_entry) entry;
241 	int			 af;
242 	union eigrpd_addr	 addr;
243 };
244 TAILQ_HEAD(seq_addr_head, seq_addr_entry);
245 
246 #define	REDIST_STATIC		0x01
247 #define	REDIST_RIP		0x02
248 #define	REDIST_OSPF		0x04
249 #define	REDIST_CONNECTED	0x08
250 #define	REDIST_DEFAULT		0x10
251 #define	REDIST_ADDR		0x20
252 #define	REDIST_NO		0x40
253 
254 struct redist_metric {
255 	uint32_t		 bandwidth;
256 	uint32_t		 delay;
257 	uint8_t			 reliability;
258 	uint8_t			 load;
259 	uint16_t		 mtu;
260 };
261 
262 struct redistribute {
263 	SIMPLEQ_ENTRY(redistribute) entry;
264 	uint8_t			 type;
265 	int			 af;
266 	union eigrpd_addr	 addr;
267 	uint8_t			 prefixlen;
268 	struct redist_metric	*metric;
269 	struct {
270 		uint32_t	 as;
271 		uint32_t	 metric;
272 		uint32_t	 tag;
273 	} emetric;
274 };
275 SIMPLEQ_HEAD(redist_list, redistribute);
276 
277 struct eigrp_stats {
278 	uint32_t		 hellos_sent;
279 	uint32_t		 hellos_recv;
280 	uint32_t		 updates_sent;
281 	uint32_t		 updates_recv;
282 	uint32_t		 queries_sent;
283 	uint32_t		 queries_recv;
284 	uint32_t		 replies_sent;
285 	uint32_t		 replies_recv;
286 	uint32_t		 acks_sent;
287 	uint32_t		 acks_recv;
288 	uint32_t		 squeries_sent;
289 	uint32_t		 squeries_recv;
290 	uint32_t		 sreplies_sent;
291 	uint32_t		 sreplies_recv;
292 };
293 
294 /* eigrp instance */
295 struct eigrp {
296 	TAILQ_ENTRY(eigrp)	 entry;
297 	int			 af;
298 	uint16_t		 as;
299 	uint8_t			 kvalues[6];
300 	uint16_t		 active_timeout;
301 	uint8_t			 maximum_hops;
302 	uint8_t			 maximum_paths;
303 	uint8_t			 variance;
304 	struct redist_metric	*dflt_metric;
305 	struct redist_list	 redist_list;
306 	TAILQ_HEAD(, eigrp_iface) ei_list;
307 	struct nbr_addr_head	 nbrs;
308 	struct rde_nbr		*rnbr_redist;
309 	struct rde_nbr		*rnbr_summary;
310 	struct rt_tree		 topology;
311 	uint32_t		 seq_num;
312 	struct eigrp_stats	 stats;
313 };
314 
315 /* eigrp_conf */
316 enum eigrpd_process {
317 	PROC_MAIN,
318 	PROC_EIGRP_ENGINE,
319 	PROC_RDE_ENGINE
320 } eigrpd_process;
321 
322 struct eigrpd_conf {
323 	struct in_addr		 rtr_id;
324 	unsigned int		 rdomain;
325 	uint8_t			 fib_priority_internal;
326 	uint8_t			 fib_priority_external;
327 	uint8_t			 fib_priority_summary;
328 	TAILQ_HEAD(, iface)	 iface_list;
329 	TAILQ_HEAD(, eigrp)	 instances;
330 	int			 flags;
331 #define	EIGRPD_FLAG_NO_FIB_UPDATE 0x0001
332 };
333 
334 struct eigrpd_global {
335 	int			 cmd_opts;
336 	time_t			 uptime;
337 	int			 eigrp_socket_v4;
338 	int			 eigrp_socket_v6;
339 	struct in_addr		 mcast_addr_v4;
340 	struct in6_addr		 mcast_addr_v6;
341 	char			*csock;
342 };
343 
344 extern struct eigrpd_global global;
345 
346 /* kroute */
347 struct kroute {
348 	int			 af;
349 	union eigrpd_addr	 prefix;
350 	uint8_t			 prefixlen;
351 	union eigrpd_addr	 nexthop;
352 	unsigned short		 ifindex;
353 	uint8_t			 priority;
354 	uint16_t		 flags;
355 };
356 
357 struct kaddr {
358 	unsigned short		 ifindex;
359 	int			 af;
360 	union eigrpd_addr	 addr;
361 	uint8_t			 prefixlen;
362 	union eigrpd_addr	 dstbrd;
363 };
364 
365 struct kif {
366 	char			 ifname[IF_NAMESIZE];
367 	unsigned short		 ifindex;
368 	int			 flags;
369 	uint8_t			 link_state;
370 	int			 mtu;
371 	uint8_t			 if_type;
372 	uint64_t		 baudrate;
373 	uint8_t			 nh_reachable;	/* for nexthop verification */
374 };
375 
376 /* control data structures */
377 struct ctl_iface {
378 	int			 af;
379 	uint16_t		 as;
380 	char			 name[IF_NAMESIZE];
381 	unsigned int		 ifindex;
382 	union eigrpd_addr	 addr;
383 	uint8_t			 prefixlen;
384 	uint16_t		 flags;
385 	uint8_t			 linkstate;
386 	int			 mtu;
387 	enum iface_type		 type;
388 	uint8_t			 if_type;
389 	uint64_t		 baudrate;
390 	uint32_t		 delay;
391 	uint32_t		 bandwidth;
392 	uint16_t		 hello_holdtime;
393 	uint16_t		 hello_interval;
394 	uint8_t			 splithorizon;
395 	uint8_t			 passive;
396 	time_t			 uptime;
397 	int			 nbr_cnt;
398 };
399 
400 struct ctl_nbr {
401 	int			 af;
402 	uint16_t		 as;
403 	char			 ifname[IF_NAMESIZE];
404 	union eigrpd_addr	 addr;
405 	uint16_t		 hello_holdtime;
406 	time_t			 uptime;
407 };
408 
409 struct ctl_rt {
410 	int			 af;
411 	uint16_t		 as;
412 	union eigrpd_addr	 prefix;
413 	uint8_t			 prefixlen;
414 	enum route_type		 type;
415 	union eigrpd_addr	 nexthop;
416 	char			 ifname[IF_NAMESIZE];
417 	uint32_t		 distance;
418 	uint32_t		 rdistance;
419 	uint32_t		 fdistance;
420 	int			 state;
421 	uint8_t			 flags;
422 	struct {
423 		uint32_t	 delay;
424 		uint32_t	 bandwidth;
425 		uint32_t	 mtu;
426 		uint8_t		 hop_count;
427 		uint8_t		 reliability;
428 		uint8_t		 load;
429 	} metric;
430 	struct classic_emetric	 emetric;
431 };
432 #define	F_CTL_RT_FIRST		0x01
433 #define	F_CTL_RT_SUCCESSOR	0x02
434 #define	F_CTL_RT_FSUCCESSOR	0x04
435 
436 struct ctl_show_topology_req {
437 	int			 af;
438 	union eigrpd_addr	 prefix;
439 	uint8_t			 prefixlen;
440 	uint16_t		 flags;
441 };
442 
443 struct ctl_stats {
444 	int			 af;
445 	uint16_t		 as;
446 	struct eigrp_stats	 stats;
447 };
448 
449 #define min(x,y) ((x) <= (y) ? (x) : (y))
450 #define max(x,y) ((x) > (y) ? (x) : (y))
451 
452 extern struct eigrpd_conf	*eigrpd_conf;
453 extern struct iface_id_head	 ifaces_by_id;
454 
455 /* parse.y */
456 struct eigrpd_conf	*parse_config(char *);
457 int			 cmdline_symset(char *);
458 
459 /* in_cksum.c */
460 uint16_t	 in_cksum(void *, size_t);
461 
462 /* kroute.c */
463 int		 kif_init(void);
464 int		 kr_init(int, unsigned int);
465 void		 kif_redistribute(void);
466 int		 kr_change(struct kroute *);
467 int		 kr_delete(struct kroute *);
468 void		 kr_shutdown(void);
469 void		 kr_fib_couple(void);
470 void		 kr_fib_decouple(void);
471 void		 kr_show_route(struct imsg *);
472 void		 kr_ifinfo(char *, pid_t);
473 struct kif	*kif_findname(char *);
474 void		 kif_clear(void);
475 
476 /* util.c */
477 uint8_t		 mask2prefixlen(in_addr_t);
478 uint8_t		 mask2prefixlen6(struct sockaddr_in6 *);
479 in_addr_t	 prefixlen2mask(uint8_t);
480 struct in6_addr	*prefixlen2mask6(uint8_t);
481 void		 eigrp_applymask(int, union eigrpd_addr *,
482 		    const union eigrpd_addr *, int);
483 int		 eigrp_addrcmp(int, const union eigrpd_addr *,
484 		    const union eigrpd_addr *);
485 int		 eigrp_addrisset(int, const union eigrpd_addr *);
486 int		 eigrp_prefixcmp(int, const union eigrpd_addr *,
487 		    const union eigrpd_addr *, uint8_t);
488 int		 bad_addr_v4(struct in_addr);
489 int		 bad_addr_v6(struct in6_addr *);
490 int		 bad_addr(int, union eigrpd_addr *);
491 void		 embedscope(struct sockaddr_in6 *);
492 void		 recoverscope(struct sockaddr_in6 *);
493 void		 addscope(struct sockaddr_in6 *, uint32_t);
494 void		 clearscope(struct in6_addr *);
495 void		 sa2addr(struct sockaddr *, int *, union eigrpd_addr *);
496 
497 /* eigrpd.c */
498 int		 main_imsg_compose_eigrpe(int, pid_t, void *, uint16_t);
499 int		 main_imsg_compose_rde(int, pid_t, void *, uint16_t);
500 void		 imsg_event_add(struct imsgev *);
501 int		 imsg_compose_event(struct imsgev *, uint16_t, uint32_t,
502 		    pid_t, int, void *, uint16_t);
503 struct eigrp	*eigrp_find(struct eigrpd_conf *, int, uint16_t);
504 void		 merge_config(struct eigrpd_conf *, struct eigrpd_conf *);
505 struct eigrpd_conf *config_new_empty(void);
506 void		 config_clear(struct eigrpd_conf *);
507 
508 /* printconf.c */
509 void		 print_config(struct eigrpd_conf *);
510 
511 /* logmsg.c */
512 const char	*log_in6addr(const struct in6_addr *);
513 const char	*log_in6addr_scope(const struct in6_addr *, unsigned int);
514 const char	*log_sockaddr(void *);
515 const char	*log_addr(int, union eigrpd_addr *);
516 const char	*log_prefix(struct rt_node *);
517 const char	*log_route_origin(int, struct rde_nbr *);
518 const char	*opcode_name(uint8_t);
519 const char	*af_name(int);
520 const char	*if_type_name(enum iface_type);
521 const char	*dual_state_name(int);
522 const char	*ext_proto_name(int);
523 
524 #endif	/* _EIGRPD_H_ */
525