summaryrefslogtreecommitdiff
path: root/usr.sbin/mrouted/defs.h
blob: 666e11a561e4a8fc26ba3a1e12555e0b9303d388 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
/*	$NetBSD: defs.h,v 1.6 1995/12/10 10:06:59 mycroft Exp $	*/

/*
 * The mrouted program is covered by the license in the accompanying file
 * named "LICENSE".  Use of the mrouted program represents acceptance of
 * the terms and conditions listed in that file.
 *
 * The mrouted program is COPYRIGHT 1989 by The Board of Trustees of
 * Leland Stanford Junior University.
 */


#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <ctype.h>
#include <errno.h>
#include <syslog.h>
#include <signal.h>
#include <string.h>
#include <sys/param.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#ifdef SYSV
#include <sys/sockio.h>
#endif
#include <sys/time.h>
#include <net/if.h>
#include <netinet/in.h>
#include <netinet/in_systm.h>
#include <netinet/ip.h>
#include <netinet/igmp.h>
#include <netinet/ip_mroute.h>
#ifdef RSRR
#include <sys/un.h>
#endif /* RSRR */

#ifndef __P
#ifdef __STDC__
#define __P(x)	x
#else
#define __P(x)	()
#endif
#endif

typedef void (*cfunc_t)(void *);
typedef void (*ihfunc_t)(int, fd_set *);

#include "dvmrp.h"
#include "vif.h"
#include "route.h"
#include "prune.h"
#include "pathnames.h"
#ifdef RSRR
#include "rsrr.h"
#include "rsrr_var.h"
#endif /* RSRR */

/*
 * Miscellaneous constants and macros.
 */
#define FALSE		0
#define TRUE		1

#define EQUAL(s1, s2)	(strcmp((s1), (s2)) == 0)

#define TIMER_INTERVAL	ROUTE_MAX_REPORT_DELAY

#define VENDOR_CODE	1   /* Get a new vendor code if you make significant
			     * changes to mrouted. */

#define PROTOCOL_VERSION 3  /* increment when packet format/content changes */

#define MROUTED_VERSION  8  /* increment on local changes or bug fixes, */
			    /* reset to 0 whever PROTOCOL_VERSION increments */

#define MROUTED_LEVEL  ((MROUTED_VERSION << 8) | PROTOCOL_VERSION | \
			((NF_PRUNE | NF_GENID | NF_MTRACE) << 16) | \
			(VENDOR_CODE << 24))
			    /* for IGMP 'group' field of DVMRP messages */

#define LEAF_FLAGS	(( vifs_with_neighbors == 1 ) ? 0x010000 : 0)
			    /* more for IGMP 'group' field of DVMRP messages */
#define	DEL_RTE_GROUP		0
#define	DEL_ALL_ROUTES		1
			    /* for Deleting kernel table entries */

/* obnoxious gcc gives an extraneous warning about this constant... */
#if defined(__STDC__) || defined(__GNUC__)
#define JAN_1970	2208988800UL	/* 1970 - 1900 in seconds */
#else
#define JAN_1970	2208988800L	/* 1970 - 1900 in seconds */
#define const		/**/
#endif

#ifdef RSRR
#define BIT_ZERO(X)      ((X) = 0)
#define BIT_SET(X,n)     ((X) |= 1 << (n))
#define BIT_CLR(X,n)     ((X) &= ~(1 << (n)))
#define BIT_TST(X,n)     ((X) & 1 << (n))
#endif /* RSRR */

#ifdef SYSV
#define bcopy(a, b, c)	memcpy(b, a, c)
#define bzero(s, n) 	memset((s), 0, (n))
#define setlinebuf(s)	setvbuf(s, NULL, _IOLBF, 0)
#define signal(s,f)	sigset(s,f)
#endif

/*
 * External declarations for global variables and functions.
 */
#define RECV_BUF_SIZE 8192
extern char		*recv_buf;
extern char		*send_buf;
extern int		igmp_socket;
#ifdef RSRR
extern int              rsrr_socket;
#endif /* RSRR */
extern u_int32_t	allhosts_group;
extern u_int32_t	allrtrs_group;
extern u_int32_t	dvmrp_group;
extern u_int32_t	dvmrp_genid;

#define DEFAULT_DEBUG  2	/* default if "-d" given without value */

extern int		debug;
extern u_char		pruning;

extern int		routes_changed;
extern int		delay_change_reports;
extern unsigned		nroutes;

extern struct uvif	uvifs[MAXVIFS];
extern vifi_t		numvifs;
extern int		vifs_down;
extern int		udp_socket;
extern int		vifs_with_neighbors;

extern char		s1[];
extern char		s2[];
extern char		s3[];
extern char		s4[];

#if !(defined(BSD) && (BSD >= 199103))
extern int		errno;
extern int		sys_nerr;
extern char *		sys_errlist[];
#endif

#ifdef OLD_KERNEL
#define	MRT_INIT	DVMRP_INIT
#define	MRT_DONE	DVMRP_DONE
#define	MRT_ADD_VIF	DVMRP_ADD_VIF
#define	MRT_DEL_VIF	DVMRP_DEL_VIF
#define	MRT_ADD_MFC	DVMRP_ADD_MFC
#define	MRT_DEL_MFC	DVMRP_DEL_MFC

#define	IGMP_PIM	0x14
#endif

/* main.c */
extern void		log(int, int, char *, ...);
extern int		register_input_handler(int fd, ihfunc_t func);

/* igmp.c */
extern void		init_igmp(void);
extern void		accept_igmp(int recvlen);
extern void		send_igmp __P((u_int32_t src, u_int32_t dst, int type,
						int code, u_int32_t group,
						int datalen));

/* callout.c */
extern void		callout_init(void);
extern void		age_callout_queue(void);
extern int		timer_setTimer __P((int delay, cfunc_t action,
						char *data));
extern void		timer_clearTimer(int timer_id);

/* route.c */
extern void		init_routes(void);
extern void		start_route_updates(void);
extern void		update_route __P((u_int32_t origin, u_int32_t mask,
						u_int metric, u_int32_t src,
						vifi_t vifi));
extern void		age_routes(void);
extern void		expire_all_routes(void);
extern void		free_all_routes(void);
extern void		accept_probe __P((u_int32_t src, u_int32_t dst,
						char *p, int datalen,
						u_int32_t level));
extern void		accept_report __P((u_int32_t src, u_int32_t dst,
						char *p, int datalen,
						u_int32_t level));
extern struct rtentry *	determine_route(u_int32_t src);
extern void		report __P((int which_routes, vifi_t vifi,
						u_int32_t dst));
extern void		report_to_all_neighbors(int which_routes);
extern int		report_next_chunk(void);
extern void		add_vif_to_routes(vifi_t vifi);
extern void		delete_vif_from_routes(vifi_t vifi);
extern void		delete_neighbor_from_routes __P((u_int32_t addr,
							vifi_t vifi));
extern void		dump_routes(FILE *fp);
extern void		start_route_updates(void);

/* vif.c */
extern void		init_vifs(void);
extern void		check_vif_state(void);
extern vifi_t		find_vif(u_int32_t src, u_int32_t dst);
extern void		age_vifs(void);
extern void		dump_vifs(FILE *fp);
extern void		stop_all_vifs(void);
extern struct listaddr *neighbor_info(vifi_t vifi, u_int32_t addr);
extern void		accept_group_report __P((u_int32_t src, u_int32_t dst,
					u_int32_t group, int r_type));
extern void		query_groups(void);
extern void		probe_for_neighbors(void);
extern int		update_neighbor __P((vifi_t vifi, u_int32_t addr,
					int msgtype, char *p, int datalen,
					u_int32_t level));
extern void		accept_neighbor_request(u_int32_t src, u_int32_t dst);
extern void		accept_neighbor_request2 __P((u_int32_t src,
					u_int32_t dst));
extern void		accept_neighbors __P((u_int32_t src, u_int32_t dst,
					u_char *p, int datalen, u_int32_t level));
extern void		accept_neighbors2 __P((u_int32_t src, u_int32_t dst,
					u_char *p, int datalen, u_int32_t level));
extern void		accept_leave_message __P((u_int32_t src, u_int32_t dst,
					u_int32_t group));
extern void		accept_membership_query __P((u_int32_t src, u_int32_t dst,
					u_int32_t group, int tmo));

/* config.c */
extern void		config_vifs_from_kernel(void);

/* cfparse.y */
extern void		config_vifs_from_file(void);

/* inet.c */
extern int		inet_valid_host(u_int32_t naddr);
extern int		inet_valid_subnet(u_int32_t nsubnet, u_int32_t nmask);
extern char *		inet_fmt(u_int32_t addr, char *s);
extern char *		inet_fmts(u_int32_t addr, u_int32_t mask, char *s);
extern u_int32_t	inet_parse(char *s);
extern int		inet_cksum(u_short *addr, u_int len);

/* prune.c */
extern unsigned		kroutes;
extern void		add_table_entry(u_int32_t origin, u_int32_t mcastgrp);
extern void 		del_table_entry __P((struct rtentry *r,
					u_int32_t mcastgrp, u_int del_flag));
extern void		update_table_entry(struct rtentry *r);
extern void		init_ktable(void);
extern void 		accept_prune __P((u_int32_t src, u_int32_t dst, char *p,
					int datalen));
extern void		steal_sources(struct rtentry *rt);
extern void		reset_neighbor_state(vifi_t vifi, u_int32_t addr);
extern int		grplst_mem(vifi_t vifi, u_int32_t mcastgrp);
extern int		scoped_addr(vifi_t vifi, u_int32_t addr);
extern void		free_all_prunes(void);
extern void 		age_table_entry(void);
extern void		dump_cache(FILE *fp2);
extern void 		update_lclgrp(vifi_t vifi, u_int32_t mcastgrp);
extern void		delete_lclgrp(vifi_t vifi, u_int32_t mcastgrp);
extern void		chkgrp_graft(vifi_t vifi, u_int32_t mcastgrp);
extern void		accept_graft __P((u_int32_t src, u_int32_t dst, char *p,
					int datalen));
extern void 		accept_g_ack __P((u_int32_t src, u_int32_t dst, char *p,
					int datalen));
/* u_int is promoted u_char */
extern void		accept_mtrace __P((u_int32_t src, u_int32_t dst,
					u_int32_t group, char *data, u_int no,
					int datalen));

/* kern.c */
extern void		k_set_rcvbuf(int bufsize);
extern void		k_hdr_include(int bool);
extern void		k_set_ttl(int t);
extern void		k_set_loop(int l);
extern void		k_set_if(u_int32_t ifa);
extern void		k_join(u_int32_t grp, u_int32_t ifa);
extern void		k_leave(u_int32_t grp, u_int32_t ifa);
extern void		k_init_dvmrp(void);
extern void		k_stop_dvmrp(void);
extern void		k_add_vif(vifi_t vifi, struct uvif *v);
extern void		k_del_vif(vifi_t vifi);
extern void		k_add_rg(u_int32_t origin, struct gtable *g);
extern int		k_del_rg(u_int32_t origin, struct gtable *g);
extern int		k_get_version(void);

#ifdef SNMP
/* prune.c */
extern struct rtentry * snmp_find_route();
extern struct gtable *	find_grp();
extern struct stable *	find_grp_src();
#endif

#ifdef RSRR
/* prune.c */
extern struct gtable	*kernel_table;
extern struct gtable	*gtp;
extern int		find_src_grp __P((u_int32_t src, u_int32_t mask,
					u_int32_t grp));

/* rsrr.c */
extern void		rsrr_init(void);
extern void		rsrr_read(int f, fd_set *rfd);
extern void		rsrr_clean(void);
extern void		rsrr_cache_send(struct gtable *gt, int notify);
extern void		rsrr_cache_clean(struct gtable *gt);
#endif /* RSRR */