xref: /openbsd/usr.sbin/dvmrpd/dvmrpd.h (revision e8127df6)
1 /*	$OpenBSD: dvmrpd.h,v 1.23 2021/01/19 11:46:10 claudio Exp $ */
2 
3 /*
4  * Copyright (c) 2004, 2005, 2006 Esben Norby <norby@openbsd.org>
5  * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
6  *
7  * Permission to use, copy, modify, and distribute this software for any
8  * purpose with or without fee is hereby granted, provided that the above
9  * copyright notice and this permission notice appear in all copies.
10  *
11  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18  */
19 
20 #ifndef _DVMRPD_H_
21 #define _DVMRPD_H_
22 
23 #include <sys/queue.h>
24 #include <sys/socket.h>
25 #include <sys/time.h>
26 #include <sys/tree.h>
27 #include <net/if.h>
28 #include <netinet/in.h>
29 #include <event.h>
30 
31 #include <imsg.h>
32 
33 #define CONF_FILE		"/etc/dvmrpd.conf"
34 #define	DVMRPD_SOCKET		"/var/run/dvmrpd.sock"
35 #define DVMRPD_USER		"_dvmrpd"
36 
37 #define NBR_HASHSIZE		128
38 
39 #define NBR_IDSELF		1
40 #define NBR_CNTSTART		(NBR_IDSELF + 1)
41 
42 #define	READ_BUF_SIZE		65535
43 #define	RT_BUF_SIZE		16384
44 
45 #define	DVMRPD_FLAG_NO_FIB_UPDATE	0x0001
46 
47 #define	F_DVMRPD_INSERTED	0x0001
48 #define	F_KERNEL		0x0002
49 #define	F_CONNECTED		0x0004
50 #define	F_DOWN			0x0010
51 #define	F_STATIC		0x0020
52 #define	F_LONGER		0x0040
53 
54 #define MAXVIFS			32	/* XXX */
55 
56 static const char * const log_procnames[] = {
57 	"parent",
58 	"dvmrpe",
59 	"rde"
60 };
61 
62 struct imsgev {
63 	struct imsgbuf		 ibuf;
64 	void			(*handler)(int, short, void *);
65 	struct event		 ev;
66 	void			*data;
67 	short			 events;
68 };
69 
70 enum imsg_type {
71 	IMSG_NONE,
72 	IMSG_CTL_RELOAD,
73 	IMSG_CTL_SHOW_IFACE,
74 	IMSG_CTL_SHOW_IGMP,
75 	IMSG_CTL_SHOW_NBR,
76 	IMSG_CTL_SHOW_RIB,
77 	IMSG_CTL_SHOW_MFC,
78 	IMSG_CTL_MFC_COUPLE,
79 	IMSG_CTL_MFC_DECOUPLE,
80 	IMSG_CTL_KROUTE,
81 	IMSG_CTL_KROUTE_ADDR,
82 	IMSG_CTL_IFINFO,
83 	IMSG_CTL_SHOW_SUM,
84 	IMSG_CTL_END,
85 	IMSG_CTL_LOG_VERBOSE,
86 	IMSG_IFINFO,
87 	IMSG_ROUTE_REPORT,
88 	IMSG_FULL_ROUTE_REPORT,
89 	IMSG_FULL_ROUTE_REPORT_END,
90 	IMSG_MFC_ADD,
91 	IMSG_MFC_DEL,
92 	IMSG_GROUP_ADD,
93 	IMSG_GROUP_DEL,
94 	IMSG_NBR_DEL,
95 	IMSG_SEND_PRUNE,
96 	IMSG_RECV_PRUNE,
97 	IMSG_FLASH_UPDATE,
98 	IMSG_FLASH_UPDATE_DS
99 };
100 
101 /* interface states */
102 #define	IF_STA_DOWN		0x01
103 #define IF_STA_QUERIER		0x02
104 #define	IF_STA_NONQUERIER	0x04
105 #define	IF_STA_ANY		0x07
106 #define	IF_STA_ACTIVE		(~IF_STA_DOWN)
107 
108 /* interface events */
109 enum iface_event {
110 	IF_EVT_NOTHING,
111 	IF_EVT_UP,
112 	IF_EVT_QTMOUT,		/* query timer expired */
113 	IF_EVT_QRECVD,		/* query received, check for lower IP */
114 	IF_EVT_QPRSNTTMOUT,	/* other querier present timeout */
115 	IF_EVT_DOWN
116 };
117 
118 /* interface actions */
119 enum iface_action {
120 	IF_ACT_NOTHING,
121 	IF_ACT_STRT,
122 	IF_ACT_QPRSNT,
123 	IF_ACT_RST
124 };
125 
126 /* interface types */
127 enum iface_type {
128 	IF_TYPE_POINTOPOINT,
129 	IF_TYPE_BROADCAST
130 };
131 
132 /* neighbor states */
133 #define	NBR_STA_DOWN		0x01
134 #define	NBR_STA_1_WAY		0x02
135 #define	NBR_STA_2_WAY		0x04
136 #define NBR_STA_ACTIVE		(~NBR_STA_DOWN)
137 #define NBR_STA_ANY		0xff
138 
139 struct group {
140 	TAILQ_ENTRY(group)	 entry;
141 	struct event		 dead_timer;
142 	struct event		 v1_host_timer;
143 	struct event		 retrans_timer;
144 
145 	struct in_addr		 addr;
146 
147 	struct iface		*iface;
148 
149 	time_t			 uptime;
150 	int			 state;
151 };
152 
153 struct rde_group {
154 	TAILQ_ENTRY(rde_group)	 entry;
155 	struct in_addr		 rde_group;
156 };
157 
158 struct mfc {
159 	struct in_addr		 origin;
160 	struct in_addr		 group;
161 	u_short			 ifindex;
162 	u_int8_t		 ttls[MAXVIFS];
163 };
164 
165 struct prune {
166 	struct in_addr		 origin;
167 	struct in_addr		 netmask;
168 	struct in_addr		 group;
169 	struct in_addr		 nexthop;
170 	u_short			 ifindex;
171 	u_int32_t		 lifetime;
172 };
173 
174 struct nbr_msg {
175 	struct in_addr		 address;
176 	unsigned int		 ifindex;
177 };
178 
179 TAILQ_HEAD(rr_head, rr_entry);
180 RB_HEAD(src_head, src_node);
181 
182 struct iface {
183 	LIST_ENTRY(iface)	 entry;
184 	struct event		 probe_timer;
185 	struct event		 query_timer;
186 	struct event		 querier_present_timer;
187 	time_t			 uptime;
188 	LIST_HEAD(, nbr)	 nbr_list;
189 	TAILQ_HEAD(, group)	 group_list;
190 	TAILQ_HEAD(, rde_group)	 rde_group_list;
191 	struct rr_head		 rr_list;
192 
193 	char			 name[IF_NAMESIZE];
194 	struct in_addr		 addr;
195 	struct in_addr		 dst;
196 	struct in_addr		 mask;
197 	struct in_addr		 querier;	/* designated querier */
198 
199 	u_int64_t		 baudrate;
200 	u_int32_t		 gen_id;
201 	u_int32_t		 group_cnt;
202 	u_int32_t		 probe_interval;
203 
204 	u_int32_t		 query_interval;
205 	u_int32_t		 query_resp_interval;
206 	u_int32_t		 recv_query_resp_interval;
207 	u_int32_t		 group_member_interval;
208 	u_int32_t		 querier_present_interval;
209 	u_int32_t		 startup_query_interval;
210 	u_int32_t		 startup_query_cnt;
211 	u_int32_t		 last_member_query_interval;
212 	u_int32_t		 last_member_query_cnt;
213 	u_int32_t		 last_member_query_time;
214 	u_int32_t		 v1_querier_present_tmout;
215 	u_int32_t		 v1_host_present_interval;
216 	u_int32_t		 startup_query_counter; /* actual counter */
217 	u_int32_t		 dead_interval;
218 
219 	unsigned int		 ifindex;		/* ifindex and vif */
220 	int			 fd;
221 	int			 state;
222 	int			 mtu;
223 	int			 nbr_cnt;
224 	int			 adj_cnt;
225 
226 	u_int16_t		 flags;
227 	u_int16_t		 metric;
228 	enum iface_type		 type;
229 
230 	u_int8_t		 robustness;
231 	u_int8_t		 linkstate;
232 	u_int8_t		 if_type;
233 	u_int8_t		 passive;
234 	u_int8_t		 igmp_version;
235 };
236 
237 /* dvmrp_conf */
238 enum {
239 	PROC_MAIN,
240 	PROC_DVMRP_ENGINE,
241 	PROC_RDE_ENGINE
242 } dvmrpd_process;
243 
244 struct dvmrpd_conf {
245 	struct event		 ev;
246 	struct event		 report_timer;
247 	u_int32_t		 gen_id;
248 	u_int32_t		 opts;
249 #define DVMRPD_OPT_VERBOSE	 0x00000001
250 #define DVMRPD_OPT_VERBOSE2	 0x00000002
251 #define DVMRPD_OPT_NOACTION	 0x00000004
252 	int			 maxdepth;
253 	LIST_HEAD(, iface)	 iface_list;
254 	int			 dvmrp_socket;
255 	int			 mroute_socket;
256 	int			 flags;
257 };
258 
259 /* kroute */
260 struct kroute {
261 	struct in_addr		 prefix;
262 	struct in_addr		 nexthop;
263 	u_int16_t		 flags;
264 	u_short			 ifindex;
265 	u_int8_t		 prefixlen;
266 };
267 
268 struct kif {
269 	char			 ifname[IF_NAMESIZE];
270 	u_int64_t		 baudrate;
271 	int			 flags;
272 	int			 mtu;
273 	u_short			 ifindex;
274 	u_int8_t		 if_type;
275 	u_int8_t		 link_state;
276 	u_int8_t		 nh_reachable;	/* for nexthop verification */
277 };
278 
279 /* control data structures */
280 struct ctl_iface {
281 	char			 name[IF_NAMESIZE];
282 	struct in_addr		 addr;
283 	struct in_addr		 mask;
284 	struct in_addr		 querier;
285 
286 	time_t			 probe_timer;
287 	time_t			 query_timer;
288 	time_t			 querier_present_timer;
289 	time_t			 uptime;
290 
291 	u_int64_t		 baudrate;
292 	u_int32_t		 gen_id;
293 	u_int32_t		 group_cnt;
294 	u_int32_t		 probe_interval;
295 	u_int32_t		 query_interval;
296 	u_int32_t		 query_resp_interval;
297 	u_int32_t		 recv_query_resp_interval;
298 	u_int32_t		 group_member_interval;
299 	u_int32_t		 querier_present_interval;
300 	u_int32_t		 startup_query_interval;
301 	u_int32_t		 startup_query_cnt;
302 	u_int32_t		 last_member_query_interval;
303 	u_int32_t		 last_member_query_cnt;
304 	u_int32_t		 last_member_query_time;
305 	u_int32_t		 v1_querier_present_tmout;
306 	u_int32_t		 v1_host_present_interval;
307 	u_int32_t		 dead_interval;
308 
309 	unsigned int		 ifindex;
310 	int			 state;
311 	int			 mtu;
312 	int			 nbr_cnt;
313 	int			 adj_cnt;
314 
315 	u_int16_t		 flags;
316 	u_int16_t		 metric;
317 	enum iface_type		 type;
318 	u_int8_t		 robustness;
319 	u_int8_t		 linkstate;
320 	u_int8_t		 if_type;
321 	u_int8_t		 passive;
322 	u_int8_t		 igmp_version;
323 };
324 
325 struct ctl_group {
326 	time_t			 dead_timer;
327 	time_t			 v1_host_timer;
328 	time_t			 retrans_timer;
329 	time_t			 uptime;
330 	struct in_addr		 addr;
331 	int			 state;
332 };
333 
334 struct ctl_nbr {
335 	char			 name[IF_NAMESIZE];
336 	struct in_addr		 id;
337 	struct in_addr		 addr;
338 	time_t			 dead_timer;
339 	time_t			 uptime;
340 	int			 state;
341 };
342 
343 struct ctl_rt {
344 	struct in_addr		 prefix;
345 	struct in_addr		 nexthop;
346 	struct in_addr		 area;
347 	struct in_addr		 adv_rtr;
348 	time_t			 uptime;
349 	time_t			 expire;
350 	u_int32_t		 cost;
351 	u_int8_t		 flags;
352 	u_int8_t		 prefixlen;
353 };
354 
355 struct ctl_mfc {
356 	u_int8_t		 ttls[MAXVIFS];	/* outgoing vif(s) */
357 	struct in_addr		 origin;
358 	struct in_addr		 group;
359 	time_t			 uptime;
360 	time_t			 expire;
361 	u_short			 ifindex;	/* incoming vif */
362 };
363 
364 struct ctl_sum {
365 	struct in_addr		 rtr_id;
366 	u_int32_t		 hold_time;
367 };
368 
369 /* dvmrpd.c */
370 void main_imsg_compose_dvmrpe(int, pid_t, void *, u_int16_t);
371 
372 /* parse.y */
373 struct dvmrpd_conf	*parse_config(char *, int);
374 int			 cmdline_symset(char *);
375 
376 int	 imsg_compose_event(struct imsgev *, u_int16_t, u_int32_t, pid_t,
377 	    int, void *, u_int16_t);
378 void	 imsg_event_add(struct imsgev *);
379 
380 /* in_cksum.c */
381 u_int16_t	 in_cksum(void *, size_t);
382 
383 /* kroute.c */
384 int		 kif_init(void);
385 void		 kif_clear(void);
386 int		 kr_init(void);
387 void		 kr_shutdown(void);
388 void		 kr_dispatch_msg(int, short, void *);
389 void		 kr_ifinfo(char *);
390 struct kif	*kif_findname(char *);
391 
392 u_int8_t	 prefixlen_classful(in_addr_t);
393 u_int8_t	 mask2prefixlen(in_addr_t);
394 in_addr_t	 prefixlen2mask(u_int8_t);
395 
396 /* kmroute.c */
397 int		 kmr_init(int);
398 void		 kmr_shutdown(void);
399 void		 kmr_recv_msg(int, short, void *);
400 void		 kmr_mfc_couple(void);
401 void		 kmr_mfc_decouple(void);
402 void		 kmroute_clear(void);
403 int		 mrt_init(int);
404 int		 mrt_done(int);
405 int		 mrt_add_vif(int, struct iface *);
406 void		 mrt_del_vif(int, struct iface *);
407 int		 mrt_add_mfc(int, struct mfc *);
408 int		 mrt_del_mfc(int, struct mfc *);
409 
410 /* log.h */
411 const char	*nbr_state_name(int);
412 const char	*if_state_name(int);
413 const char	*if_type_name(enum iface_type);
414 const char	*group_state_name(int);
415 
416 /* printconf.c */
417 void		 print_config(struct dvmrpd_conf *);
418 
419 /* interface.c */
420 struct iface	*if_find_index(u_short);
421 
422 #define	PREFIX_SIZE(x)	(((x) + 7) / 8)
423 
424 #endif	/* _DVMRPD_H_ */
425