dvmrpd.h revision 1.3
1/*	$OpenBSD: dvmrpd.h,v 1.3 2006/06/01 22:07:30 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#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};
113
114struct imsg_hdr {
115	enum imsg_type	type;
116	u_int16_t	len;
117	u_int32_t	peerid;
118	pid_t		pid;
119};
120
121struct imsg {
122	struct imsg_hdr	 hdr;
123	void		*data;
124};
125
126struct imsg_fd {
127	TAILQ_ENTRY(imsg_fd)	entry;
128	int			fd;
129};
130
131/* interface states */
132#define	IF_STA_DOWN		0x01
133#define IF_STA_QUERIER		0x02
134#define	IF_STA_NONQUERIER	0x04
135#define	IF_STA_ANY		0x07
136#define	IF_STA_ACTIVE		(~IF_STA_DOWN)
137
138/* interface events */
139enum iface_event {
140	IF_EVT_NOTHING,
141	IF_EVT_UP,
142	IF_EVT_QTMOUT,		/* query timer expired */
143	IF_EVT_QRECVD,		/* query received, check for lower IP */
144	IF_EVT_QPRSNTTMOUT,	/* other querier present timeout */
145	IF_EVT_DOWN
146};
147
148/* interface actions */
149enum iface_action {
150	IF_ACT_NOTHING,
151	IF_ACT_STRT,
152	IF_ACT_QPRSNT,
153	IF_ACT_RST
154};
155
156/* interface types */
157enum iface_type {
158	IF_TYPE_POINTOPOINT,
159	IF_TYPE_BROADCAST
160};
161
162/* neighbor states */
163#define	NBR_STA_DOWN		0x01
164#define	NBR_STA_1_WAY		0x02
165#define	NBR_STA_2_WAY		0x04
166#define NBR_STA_ACTIVE		(~NBR_STA_DOWN)
167#define NBR_STA_ANY		0xff
168
169struct group {
170	TAILQ_ENTRY(group)	 entry;
171	struct event		 dead_timer;
172	struct event		 v1_host_timer;
173	struct event		 retrans_timer;
174
175	struct in_addr		 addr;
176
177	struct iface		*iface;
178
179	time_t			 uptime;
180	int			 state;
181};
182
183struct mfc {
184	struct in_addr		 origin;
185	struct in_addr		 group;
186	u_short			 ifindex;
187	u_int8_t		 ttls[MAXVIFS];
188};
189
190TAILQ_HEAD(rr_head, rr_entry);
191
192struct iface {
193	LIST_ENTRY(iface)	 entry;
194	struct event		 probe_timer;
195	struct event		 query_timer;
196	struct event		 querier_present_timer;
197	time_t			 uptime;
198	LIST_HEAD(, nbr)	 nbr_list;
199	TAILQ_HEAD(, group)	 group_list;
200	struct rr_head		 rr_list;
201
202	char			 name[IF_NAMESIZE];
203	struct in_addr		 addr;
204	struct in_addr		 dst;
205	struct in_addr		 mask;
206	struct in_addr		 querier;	/* designated querier */
207
208	u_int32_t		 gen_id;
209	u_int32_t		 group_cnt;
210
211	u_int32_t		 baudrate;
212	u_int32_t		 probe_interval;
213
214	u_int32_t		 query_interval;
215	u_int32_t		 query_resp_interval;
216	u_int32_t		 recv_query_resp_interval;
217	u_int32_t		 group_member_interval;
218	u_int32_t		 querier_present_interval;
219	u_int32_t		 startup_query_interval;
220	u_int32_t		 startup_query_cnt;
221	u_int32_t		 last_member_query_interval;
222	u_int32_t		 last_member_query_cnt;
223	u_int32_t		 last_member_query_time;
224	u_int32_t		 v1_querier_present_tmout;
225	u_int32_t		 v1_host_present_interval;
226	u_int32_t		 startup_query_counter; /* actual counter */
227	u_int32_t		 dead_interval;
228
229	unsigned int		 ifindex;		/* ifindex and vif */
230	int			 fd;
231	int			 state;
232	int			 mtu;
233	int			 nbr_cnt;
234	int			 adj_cnt;
235
236	u_int16_t		 flags;
237	u_int16_t		 metric;
238	enum iface_type		 type;
239
240	u_int8_t		 robustness;
241	u_int8_t		 linkstate;
242	u_int8_t		 media_type;
243	u_int8_t		 passive;
244	u_int8_t		 igmp_version;
245};
246
247/* dvmrp_conf */
248enum {
249	PROC_MAIN,
250	PROC_DVMRP_ENGINE,
251	PROC_RDE_ENGINE
252} dvmrpd_process;
253
254struct dvmrpd_conf {
255	struct event		 ev;
256	struct event		 report_timer;
257	u_int32_t		 gen_id;
258	u_int32_t		 opts;
259#define DVMRPD_OPT_VERBOSE	 0x00000001
260#define DVMRPD_OPT_VERBOSE2	 0x00000002
261#define DVMRPD_OPT_NOACTION	 0x00000004
262	int			 maxdepth;
263	LIST_HEAD(, iface)	 iface_list;
264	int			 dvmrp_socket;
265	int			 mroute_socket;
266	int			 flags;
267};
268
269/* kroute */
270struct kroute {
271	struct in_addr		 prefix;
272	struct in_addr		 nexthop;
273	u_int16_t		 flags;
274	u_short			 ifindex;
275	u_int8_t		 prefixlen;
276};
277
278struct kif {
279	char			 ifname[IF_NAMESIZE];
280	u_long			 baudrate;
281	int			 flags;
282	int			 mtu;
283	u_short			 ifindex;
284	u_int8_t		 media_type;
285	u_int8_t		 link_state;
286	u_int8_t		 nh_reachable;	/* for nexthop verification */
287};
288
289/* control data structures */
290struct ctl_iface {
291	char			 name[IF_NAMESIZE];
292	struct in_addr		 addr;
293	struct in_addr		 mask;
294	struct in_addr		 querier;
295
296	time_t			 probe_timer;
297	time_t			 query_timer;
298	time_t			 querier_present_timer;
299	time_t			 uptime;
300
301	u_int32_t		 gen_id;
302	u_int32_t		 group_cnt;
303	u_int32_t		 baudrate;
304	u_int32_t		 probe_interval;
305	u_int32_t		 query_interval;
306	u_int32_t		 query_resp_interval;
307	u_int32_t		 recv_query_resp_interval;
308	u_int32_t		 group_member_interval;
309	u_int32_t		 querier_present_interval;
310	u_int32_t		 startup_query_interval;
311	u_int32_t		 startup_query_cnt;
312	u_int32_t		 last_member_query_interval;
313	u_int32_t		 last_member_query_cnt;
314	u_int32_t		 last_member_query_time;
315	u_int32_t		 v1_querier_present_tmout;
316	u_int32_t		 v1_host_present_interval;
317	u_int32_t		 dead_interval;
318
319	unsigned int		 ifindex;
320	int			 state;
321	int			 mtu;
322	int			 nbr_cnt;
323	int			 adj_cnt;
324
325	u_int16_t		 flags;
326	u_int16_t		 metric;
327	enum iface_type		 type;
328	u_int8_t		 robustness;
329	u_int8_t		 linkstate;
330	u_int8_t		 mediatype;
331	u_int8_t		 passive;
332	u_int8_t		 igmp_version;
333};
334
335struct ctl_group {
336	time_t			 dead_timer;
337	time_t			 v1_host_timer;
338	time_t			 retrans_timer;
339	time_t			 uptime;
340	struct in_addr		 addr;
341	int			 state;
342};
343
344struct ctl_nbr {
345	char			 name[IF_NAMESIZE];
346	struct in_addr		 id;
347	struct in_addr		 addr;
348	time_t			 dead_timer;
349	time_t			 uptime;
350	int			 state;
351};
352
353struct ctl_rt {
354	struct in_addr		 prefix;
355	struct in_addr		 nexthop;
356	struct in_addr		 area;
357	struct in_addr		 adv_rtr;
358	time_t			 uptime;
359	time_t			 expire;
360	u_int32_t		 cost;
361	u_int8_t		 flags;
362	u_int8_t		 prefixlen;
363};
364
365struct ctl_mfc {
366	u_int8_t		 ttls[MAXVIFS];	/* outgoing vif(s) */
367	struct in_addr		 origin;
368	struct in_addr		 group;
369	time_t			 uptime;
370	time_t			 expire;
371	u_short			 ifindex;	/* incoming vif */
372};
373
374struct ctl_sum {
375	struct in_addr		 rtr_id;
376	u_int32_t		 hold_time;
377};
378
379/* buffer.c */
380struct buf	*buf_open(size_t);
381struct buf	*buf_dynamic(size_t, size_t);
382int		 buf_add(struct buf *, void *, size_t);
383void		*buf_reserve(struct buf *, size_t);
384void		*buf_seek(struct buf *, size_t, size_t);
385int		 buf_close(struct msgbuf *, struct buf *);
386void		 buf_free(struct buf *);
387void		 msgbuf_init(struct msgbuf *);
388void		 msgbuf_clear(struct msgbuf *);
389int		 msgbuf_write(struct msgbuf *);
390
391/* dvmrpd.c */
392void main_imsg_compose_dvmrpe(int, pid_t, void *, u_int16_t);
393
394/* parse.y */
395struct dvmrpd_conf	*parse_config(char *, int);
396int			 cmdline_symset(char *);
397
398/* imsg.c */
399void	 imsg_init(struct imsgbuf *, int, void (*)(int, short, void *));
400ssize_t	 imsg_read(struct imsgbuf *);
401ssize_t	 imsg_get(struct imsgbuf *, struct imsg *);
402int	 imsg_compose(struct imsgbuf *, enum imsg_type, u_int32_t, pid_t,
403	    void *, u_int16_t);
404struct buf	*imsg_create(struct imsgbuf *, enum imsg_type, u_int32_t, pid_t,
405		    u_int16_t);
406int	 imsg_add(struct buf *, void *, u_int16_t);
407int	 imsg_close(struct imsgbuf *, struct buf *);
408void	 imsg_free(struct imsg *);
409void	 imsg_event_add(struct imsgbuf *); /* needs to be provided externally */
410
411/* in_cksum.c */
412u_int16_t	 in_cksum(void *, size_t);
413
414/* kroute.c */
415int		 kif_init(void);
416void		 kif_clear(void);
417int		 kr_init(void);
418void		 kr_shutdown(void);
419void		 kr_dispatch_msg(int, short, void *);
420void		 kr_ifinfo(char *);
421struct kif	*kif_findname(char *);
422
423u_int8_t	 prefixlen_classful(in_addr_t);
424u_int8_t	 mask2prefixlen(in_addr_t);
425in_addr_t	 prefixlen2mask(u_int8_t);
426
427/* kmroute.c */
428int		 kmr_init(int);
429void		 kmr_shutdown(void);
430void		 kmr_recv_msg(int, short, void *);
431void		 kmr_mfc_couple(void);
432void		 kmr_mfc_decouple(void);
433void		 kmroute_clear(void);
434int		 mrt_init(int);
435int		 mrt_done(int);
436int		 mrt_add_vif(int, struct iface *);
437void		 mrt_del_vif(int, struct iface *);
438int		 mrt_add_mfc(int, struct mfc *);
439int		 mrt_del_mfc(int, struct mfc *);
440
441/* log.h */
442const char	*nbr_state_name(int);
443const char	*if_state_name(int);
444const char	*if_type_name(enum iface_type);
445const char	*group_state_name(int);
446
447/* printconf.c */
448void	print_config(struct dvmrpd_conf *);
449
450#endif	/* _DVMRPD_H_ */
451