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