dvmrpd.h revision 1.10
1/*	$OpenBSD: dvmrpd.h,v 1.10 2008/12/02 13:42:44 michele 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#define CONF_FILE		"/etc/dvmrpd.conf"
32#define	DVMRPD_SOCKET		"/var/run/dvmrpd.sock"
33#define DVMRPD_USER		"_dvmrpd"
34
35#define NBR_HASHSIZE		128
36
37#define NBR_IDSELF		1
38#define NBR_CNTSTART		(NBR_IDSELF + 1)
39
40#define	READ_BUF_SIZE		65535
41#define	RT_BUF_SIZE		16384
42
43#define	DVMRPD_FLAG_NO_FIB_UPDATE	0x0001
44
45#define	F_DVMRPD_INSERTED	0x0001
46#define	F_KERNEL		0x0002
47#define	F_CONNECTED		0x0004
48#define	F_DOWN			0x0010
49#define	F_STATIC		0x0020
50#define	F_LONGER		0x0040
51
52#define MAXVIFS			32	/* XXX */
53
54/* buffer */
55struct buf {
56	TAILQ_ENTRY(buf)	 entry;
57	u_char			*buf;
58	size_t			 size;
59	size_t			 max;
60	size_t			 wpos;
61	size_t			 rpos;
62	int			 fd;
63};
64
65struct msgbuf {
66	u_int32_t		 queued;
67	int			 fd;
68	TAILQ_HEAD(, buf)	 bufs;
69};
70
71#define	IMSG_HEADER_SIZE	sizeof(struct imsg_hdr)
72#define	MAX_IMSGSIZE		8192
73
74struct buf_read {
75	u_char			 buf[READ_BUF_SIZE];
76	u_char			*rptr;
77	size_t			 wpos;
78};
79
80struct imsgbuf {
81	TAILQ_HEAD(, imsg_fd)	fds;
82	struct buf_read		r;
83	struct msgbuf		w;
84	struct event		ev;
85	void			(*handler)(int, short, void *);
86	int			fd;
87	pid_t			pid;
88	short			events;
89};
90
91enum imsg_type {
92	IMSG_NONE,
93	IMSG_CTL_RELOAD,
94	IMSG_CTL_SHOW_IFACE,
95	IMSG_CTL_SHOW_IGMP,
96	IMSG_CTL_SHOW_NBR,
97	IMSG_CTL_SHOW_RIB,
98	IMSG_CTL_SHOW_MFC,
99	IMSG_CTL_MFC_COUPLE,
100	IMSG_CTL_MFC_DECOUPLE,
101	IMSG_CTL_KROUTE,
102	IMSG_CTL_KROUTE_ADDR,
103	IMSG_CTL_IFINFO,
104	IMSG_CTL_SHOW_SUM,
105	IMSG_CTL_END,
106	IMSG_IFINFO,
107	IMSG_ROUTE_REPORT,
108	IMSG_FULL_ROUTE_REPORT,
109	IMSG_FULL_ROUTE_REPORT_END,
110	IMSG_MFC_ADD,
111	IMSG_MFC_DEL,
112	IMSG_NEIGHBOR_UP,
113	IMSG_NEIGHBOR_DOWN,
114	IMSG_FLASH_UPDATE,
115	IMSG_FLASH_UPDATE_DS
116};
117
118struct imsg_hdr {
119	enum imsg_type	type;
120	u_int16_t	len;
121	u_int32_t	peerid;
122	pid_t		pid;
123};
124
125struct imsg {
126	struct imsg_hdr	 hdr;
127	void		*data;
128};
129
130struct imsg_fd {
131	TAILQ_ENTRY(imsg_fd)	entry;
132	int			fd;
133};
134
135/* interface states */
136#define	IF_STA_DOWN		0x01
137#define IF_STA_QUERIER		0x02
138#define	IF_STA_NONQUERIER	0x04
139#define	IF_STA_ANY		0x07
140#define	IF_STA_ACTIVE		(~IF_STA_DOWN)
141
142/* interface events */
143enum iface_event {
144	IF_EVT_NOTHING,
145	IF_EVT_UP,
146	IF_EVT_QTMOUT,		/* query timer expired */
147	IF_EVT_QRECVD,		/* query received, check for lower IP */
148	IF_EVT_QPRSNTTMOUT,	/* other querier present timeout */
149	IF_EVT_DOWN
150};
151
152/* interface actions */
153enum iface_action {
154	IF_ACT_NOTHING,
155	IF_ACT_STRT,
156	IF_ACT_QPRSNT,
157	IF_ACT_RST
158};
159
160/* interface types */
161enum iface_type {
162	IF_TYPE_POINTOPOINT,
163	IF_TYPE_BROADCAST
164};
165
166/* neighbor states */
167#define	NBR_STA_DOWN		0x01
168#define	NBR_STA_1_WAY		0x02
169#define	NBR_STA_2_WAY		0x04
170#define NBR_STA_ACTIVE		(~NBR_STA_DOWN)
171#define NBR_STA_ANY		0xff
172
173struct group {
174	TAILQ_ENTRY(group)	 entry;
175	struct event		 dead_timer;
176	struct event		 v1_host_timer;
177	struct event		 retrans_timer;
178
179	struct in_addr		 addr;
180
181	struct iface		*iface;
182
183	time_t			 uptime;
184	int			 state;
185};
186
187struct mfc {
188	struct in_addr		 origin;
189	struct in_addr		 group;
190	u_short			 ifindex;
191	u_int8_t		 ttls[MAXVIFS];
192};
193
194TAILQ_HEAD(rr_head, rr_entry);
195RB_HEAD(src_head, src_node);
196
197struct iface {
198	LIST_ENTRY(iface)	 entry;
199	struct event		 probe_timer;
200	struct event		 query_timer;
201	struct event		 querier_present_timer;
202	time_t			 uptime;
203	LIST_HEAD(, nbr)	 nbr_list;
204	TAILQ_HEAD(, group)	 group_list;
205	struct rr_head		 rr_list;
206
207	char			 name[IF_NAMESIZE];
208	struct in_addr		 addr;
209	struct in_addr		 dst;
210	struct in_addr		 mask;
211	struct in_addr		 querier;	/* designated querier */
212
213	u_int64_t		 baudrate;
214	u_int32_t		 gen_id;
215	u_int32_t		 group_cnt;
216	u_int32_t		 probe_interval;
217
218	u_int32_t		 query_interval;
219	u_int32_t		 query_resp_interval;
220	u_int32_t		 recv_query_resp_interval;
221	u_int32_t		 group_member_interval;
222	u_int32_t		 querier_present_interval;
223	u_int32_t		 startup_query_interval;
224	u_int32_t		 startup_query_cnt;
225	u_int32_t		 last_member_query_interval;
226	u_int32_t		 last_member_query_cnt;
227	u_int32_t		 last_member_query_time;
228	u_int32_t		 v1_querier_present_tmout;
229	u_int32_t		 v1_host_present_interval;
230	u_int32_t		 startup_query_counter; /* actual counter */
231	u_int32_t		 dead_interval;
232
233	unsigned int		 ifindex;		/* ifindex and vif */
234	int			 fd;
235	int			 state;
236	int			 mtu;
237	int			 nbr_cnt;
238	int			 adj_cnt;
239
240	u_int16_t		 flags;
241	u_int16_t		 metric;
242	enum iface_type		 type;
243
244	u_int8_t		 robustness;
245	u_int8_t		 linkstate;
246	u_int8_t		 media_type;
247	u_int8_t		 passive;
248	u_int8_t		 igmp_version;
249};
250
251/* dvmrp_conf */
252enum {
253	PROC_MAIN,
254	PROC_DVMRP_ENGINE,
255	PROC_RDE_ENGINE
256} dvmrpd_process;
257
258struct dvmrpd_conf {
259	struct event		 ev;
260	struct event		 report_timer;
261	u_int32_t		 gen_id;
262	u_int32_t		 opts;
263#define DVMRPD_OPT_VERBOSE	 0x00000001
264#define DVMRPD_OPT_VERBOSE2	 0x00000002
265#define DVMRPD_OPT_NOACTION	 0x00000004
266	int			 maxdepth;
267	LIST_HEAD(, iface)	 iface_list;
268	struct src_head		 src_list;
269	int			 dvmrp_socket;
270	int			 mroute_socket;
271	int			 flags;
272};
273
274/* kroute */
275struct kroute {
276	struct in_addr		 prefix;
277	struct in_addr		 nexthop;
278	u_int16_t		 flags;
279	u_short			 ifindex;
280	u_int8_t		 prefixlen;
281};
282
283struct kif {
284	char			 ifname[IF_NAMESIZE];
285	u_int64_t		 baudrate;
286	int			 flags;
287	int			 mtu;
288	u_short			 ifindex;
289	u_int8_t		 media_type;
290	u_int8_t		 link_state;
291	u_int8_t		 nh_reachable;	/* for nexthop verification */
292};
293
294/* control data structures */
295struct ctl_iface {
296	char			 name[IF_NAMESIZE];
297	struct in_addr		 addr;
298	struct in_addr		 mask;
299	struct in_addr		 querier;
300
301	time_t			 probe_timer;
302	time_t			 query_timer;
303	time_t			 querier_present_timer;
304	time_t			 uptime;
305
306	u_int64_t		 baudrate;
307	u_int32_t		 gen_id;
308	u_int32_t		 group_cnt;
309	u_int32_t		 probe_interval;
310	u_int32_t		 query_interval;
311	u_int32_t		 query_resp_interval;
312	u_int32_t		 recv_query_resp_interval;
313	u_int32_t		 group_member_interval;
314	u_int32_t		 querier_present_interval;
315	u_int32_t		 startup_query_interval;
316	u_int32_t		 startup_query_cnt;
317	u_int32_t		 last_member_query_interval;
318	u_int32_t		 last_member_query_cnt;
319	u_int32_t		 last_member_query_time;
320	u_int32_t		 v1_querier_present_tmout;
321	u_int32_t		 v1_host_present_interval;
322	u_int32_t		 dead_interval;
323
324	unsigned int		 ifindex;
325	int			 state;
326	int			 mtu;
327	int			 nbr_cnt;
328	int			 adj_cnt;
329
330	u_int16_t		 flags;
331	u_int16_t		 metric;
332	enum iface_type		 type;
333	u_int8_t		 robustness;
334	u_int8_t		 linkstate;
335	u_int8_t		 mediatype;
336	u_int8_t		 passive;
337	u_int8_t		 igmp_version;
338};
339
340struct ctl_group {
341	time_t			 dead_timer;
342	time_t			 v1_host_timer;
343	time_t			 retrans_timer;
344	time_t			 uptime;
345	struct in_addr		 addr;
346	int			 state;
347};
348
349struct ctl_nbr {
350	char			 name[IF_NAMESIZE];
351	struct in_addr		 id;
352	struct in_addr		 addr;
353	time_t			 dead_timer;
354	time_t			 uptime;
355	int			 state;
356};
357
358struct ctl_rt {
359	struct in_addr		 prefix;
360	struct in_addr		 nexthop;
361	struct in_addr		 area;
362	struct in_addr		 adv_rtr;
363	time_t			 uptime;
364	time_t			 expire;
365	u_int32_t		 cost;
366	u_int8_t		 flags;
367	u_int8_t		 prefixlen;
368};
369
370struct ctl_mfc {
371	u_int8_t		 ttls[MAXVIFS];	/* outgoing vif(s) */
372	struct in_addr		 origin;
373	struct in_addr		 group;
374	time_t			 uptime;
375	time_t			 expire;
376	u_short			 ifindex;	/* incoming vif */
377};
378
379struct ctl_sum {
380	struct in_addr		 rtr_id;
381	u_int32_t		 hold_time;
382};
383
384/* buffer.c */
385struct buf	*buf_open(size_t);
386struct buf	*buf_dynamic(size_t, size_t);
387int		 buf_add(struct buf *, void *, size_t);
388void		*buf_reserve(struct buf *, size_t);
389void		*buf_seek(struct buf *, size_t, size_t);
390int		 buf_close(struct msgbuf *, struct buf *);
391void		 buf_free(struct buf *);
392void		 msgbuf_init(struct msgbuf *);
393void		 msgbuf_clear(struct msgbuf *);
394int		 msgbuf_write(struct msgbuf *);
395
396/* dvmrpd.c */
397void main_imsg_compose_dvmrpe(int, pid_t, void *, u_int16_t);
398
399/* parse.y */
400struct dvmrpd_conf	*parse_config(char *, int);
401int			 cmdline_symset(char *);
402
403/* imsg.c */
404void	 imsg_init(struct imsgbuf *, int, void (*)(int, short, void *));
405ssize_t	 imsg_read(struct imsgbuf *);
406ssize_t	 imsg_get(struct imsgbuf *, struct imsg *);
407int	 imsg_compose(struct imsgbuf *, enum imsg_type, u_int32_t, pid_t,
408	    void *, u_int16_t);
409struct buf	*imsg_create(struct imsgbuf *, enum imsg_type, u_int32_t, pid_t,
410		    u_int16_t);
411int	 imsg_add(struct buf *, void *, u_int16_t);
412int	 imsg_close(struct imsgbuf *, struct buf *);
413void	 imsg_free(struct imsg *);
414void	 imsg_event_add(struct imsgbuf *); /* needs to be provided externally */
415
416/* in_cksum.c */
417u_int16_t	 in_cksum(void *, size_t);
418
419/* kroute.c */
420int		 kif_init(void);
421void		 kif_clear(void);
422int		 kr_init(void);
423void		 kr_shutdown(void);
424void		 kr_dispatch_msg(int, short, void *);
425void		 kr_ifinfo(char *);
426struct kif	*kif_findname(char *);
427
428u_int8_t	 prefixlen_classful(in_addr_t);
429u_int8_t	 mask2prefixlen(in_addr_t);
430in_addr_t	 prefixlen2mask(u_int8_t);
431
432/* kmroute.c */
433int		 kmr_init(int);
434void		 kmr_shutdown(void);
435void		 kmr_recv_msg(int, short, void *);
436void		 kmr_mfc_couple(void);
437void		 kmr_mfc_decouple(void);
438void		 kmroute_clear(void);
439int		 mrt_init(int);
440int		 mrt_done(int);
441int		 mrt_add_vif(int, struct iface *);
442void		 mrt_del_vif(int, struct iface *);
443int		 mrt_add_mfc(int, struct mfc *);
444int		 mrt_del_mfc(int, struct mfc *);
445
446/* log.h */
447const char	*nbr_state_name(int);
448const char	*if_state_name(int);
449const char	*if_type_name(enum iface_type);
450const char	*group_state_name(int);
451
452/* printconf.c */
453void		 print_config(struct dvmrpd_conf *);
454
455/* interface.c */
456struct iface	*if_find_index(u_short);
457
458#define	PREFIX_SIZE(x)	(((x) + 7) / 8)
459
460#endif	/* _DVMRPD_H_ */
461