Annotation of embedaddon/mrouted/defs.h, revision 1.1.1.1
1.1 misho 1: /*
2: * The mrouted program is covered by the license in the accompanying file
3: * named "LICENSE". Use of the mrouted program represents acceptance of
4: * the terms and conditions listed in that file.
5: *
6: * The mrouted program is COPYRIGHT 1989 by The Board of Trustees of
7: * Leland Stanford Junior University.
8: */
9: #ifndef __MROUTED_DEFS_H__
10: #define __MROUTED_DEFS_H__
11:
12: #include <stdio.h>
13: #include <stdlib.h>
14: #include <unistd.h>
15: #include <ctype.h>
16: #include <errno.h>
17: #include <syslog.h>
18: #include <signal.h>
19: #include <string.h>
20: #include <sys/param.h>
21: #include <sys/types.h>
22: #include <sys/socket.h>
23: #include <sys/ioctl.h>
24: #if ((defined(SYSV)) || (defined(__bsdi__)) || ((defined SunOS) && (SunOS < 50)))
25: #include <sys/sockio.h>
26: #endif /* SYSV || bsdi || SunOS 4.x */
27: #include <time.h>
28: #include <sys/time.h>
29: #include <sys/uio.h>
30: #include <net/if.h>
31: #include <netinet/in.h>
32: #include <netinet/in_systm.h>
33: #include <netinet/ip.h>
34: #include <netinet/ip_icmp.h>
35: #include <netinet/igmp.h>
36: #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
37: #include <osreldate.h>
38: #endif /* __FreeBSD__ */
39: #if (defined(__bsdi__)) || (defined(__FreeBSD__) && (__FreeBSD_version >= 220000)) || defined(__FreeBSD_kernel__)
40: #define rtentry kernel_rtentry
41: #include <net/route.h>
42: #undef rtentry
43: #endif /* bsdi or __FreeBSD_version >= 220000 */
44: #ifdef __linux__
45: #define _LINUX_IN_H /* For Linux <= 2.6.25 */
46: #include <linux/types.h>
47: #include <linux/mroute.h>
48: #else
49: #include <netinet/ip_mroute.h>
50: #endif
51: #if defined(HAVE_STRLCPY)
52: #include <string.h>
53: #endif
54: #if defined(HAVE_STRTONUM)
55: #include <stdlib.h>
56: #endif
57: #if defined(HAVE_PIDFILE)
58: #if defined(OpenBSD) || defined(NetBSD)
59: #include <util.h>
60: #else
61: #include <libutil.h>
62: #endif
63: #endif
64: #ifdef RSRR
65: #include <sys/un.h>
66: #endif /* RSRR */
67:
68: /*XXX*/
69: typedef u_int u_int32;
70:
71: typedef void (*cfunc_t) (void*);
72: typedef void (*ihfunc_t) (int, fd_set *);
73:
74: #include "dvmrp.h"
75: #include "igmpv2.h"
76: #include "vif.h"
77: #include "route.h"
78: #include "prune.h"
79: #include "pathnames.h"
80: #ifdef RSRR
81: #include "rsrr.h"
82: #include "rsrr_var.h"
83: #endif /* RSRR */
84:
85: /*
86: * Miscellaneous constants and macros.
87: */
88: #define FALSE 0
89: #define TRUE 1
90:
91: #define EQUAL(s1, s2) (strcmp((s1), (s2)) == 0)
92: #define ARRAY_LEN(a) (sizeof((a)) / sizeof((a)[0]))
93:
94: #define TIMER_INTERVAL ROUTE_MAX_REPORT_DELAY
95:
96: #define PROTOCOL_VERSION 3 /* increment when packet format/content changes */
97: #define MROUTED_VERSION 9 /* not in DVMRP packets at all */
98:
99: #define DVMRP_CONSTANT 0x000eff00 /* constant portion of 'group' field */
100:
101: #define MROUTED_LEVEL (DVMRP_CONSTANT | PROTOCOL_VERSION)
102: /* for IGMP 'group' field of DVMRP messages */
103:
104: #define LEAF_FLAGS (( vifs_with_neighbors == 1 ) ? 0x010000 : 0)
105: /* more for IGMP 'group' field of DVMRP messages */
106:
107: #define DEL_RTE_GROUP 0
108: #define DEL_ALL_ROUTES 1
109: /* for Deleting kernel table entries */
110:
111: #define JAN_1970 2208988800UL /* 1970 - 1900 in seconds */
112:
113: #ifdef RSRR
114: #define BIT_ZERO(X) ((X) = 0)
115: #define BIT_SET(X,n) ((X) |= 1 << (n))
116: #define BIT_CLR(X,n) ((X) &= ~(1 << (n)))
117: #define BIT_TST(X,n) ((X) & 1 << (n))
118: #endif /* RSRR */
119:
120: #ifdef SYSV
121: #define setlinebuf(s) setvbuf(s, NULL, _IOLBF, 0)
122: #endif
123:
124: #if defined(_AIX) || (defined(BSD) && (BSD >= 199103))
125: #define HAVE_SA_LEN
126: #endif
127:
128: /*
129: * External declarations for global variables and functions.
130: */
131: #define RECV_BUF_SIZE 8192
132: extern char *recv_buf;
133: extern char *send_buf;
134: extern int igmp_socket;
135: extern u_int32 allhosts_group;
136: extern u_int32 allrtrs_group;
137: extern u_int32 dvmrp_group;
138: extern u_int32 dvmrp_genid;
139:
140: #define IF_DEBUG(l) if (debug && debug & (l))
141:
142: #define DEBUG_PKT 0x0001
143: #define DEBUG_PRUNE 0x0002
144: #define DEBUG_ROUTE 0x0004
145: #define DEBUG_PEER 0x0008
146: #define DEBUG_CACHE 0x0010
147: #define DEBUG_TIMEOUT 0x0020
148: #define DEBUG_IF 0x0040
149: #define DEBUG_MEMBER 0x0080
150: #define DEBUG_TRACE 0x0100
151: #define DEBUG_IGMP 0x0200
152: #define DEBUG_RTDETAIL 0x0400
153: #define DEBUG_KERN 0x0800
154: #define DEBUG_RSRR 0x1000
155: #define DEBUG_ICMP 0x2000
156:
157: #define DEFAULT_DEBUG 0x02de /* default if "-d" given without value */
158:
159: extern int debug;
160: extern int did_final_init;
161:
162: extern int routes_changed;
163: extern int delay_change_reports;
164: extern unsigned nroutes;
165:
166: extern struct uvif uvifs[MAXVIFS];
167: extern vifi_t numvifs;
168: extern int vifs_down;
169: extern int udp_socket;
170: extern int vifs_with_neighbors;
171:
172: #define MAX_INET_BUF_LEN 19
173: extern char s1[MAX_INET_BUF_LEN];
174: extern char s2[MAX_INET_BUF_LEN];
175: extern char s3[MAX_INET_BUF_LEN];
176: extern char s4[MAX_INET_BUF_LEN];
177:
178: #define MAX_VERSION_LEN 100
179: extern char versionstring[MAX_VERSION_LEN];
180:
181: #if !(defined(BSD) && (BSD >= 199103)) && !defined(__linux__)
182: extern int errno;
183: #endif
184:
185: #ifdef OLD_KERNEL
186: #define MRT_INIT DVMRP_INIT
187: #define MRT_DONE DVMRP_DONE
188: #define MRT_ADD_VIF DVMRP_ADD_VIF
189: #define MRT_DEL_VIF DVMRP_DEL_VIF
190: #define MRT_ADD_MFC DVMRP_ADD_MFC
191: #define MRT_DEL_MFC DVMRP_DEL_MFC
192: #endif
193:
194: #ifndef IGMP_PIM
195: #define IGMP_PIM 0x14
196: #endif
197: #ifndef IPPROTO_IPIP
198: #define IPPROTO_IPIP 4
199: #endif
200:
201: /*
202: * The original multicast releases defined
203: * IGMP_HOST_{MEMBERSHIP_QUERY,MEMBERSHIP_REPORT,NEW_MEMBERSHIP_REPORT
204: * ,LEAVE_MESSAGE}. Later releases removed the HOST and inserted
205: * the IGMP version number. NetBSD inserted the version number in
206: * a different way. mrouted uses the new names, so we #define them
207: * to the old ones if needed.
208: */
209: #if !defined(IGMP_MEMBERSHIP_QUERY) && defined(IGMP_HOST_MEMBERSHIP_QUERY)
210: #define IGMP_MEMBERSHIP_QUERY IGMP_HOST_MEMBERSHIP_QUERY
211: #define IGMP_V2_LEAVE_GROUP IGMP_HOST_LEAVE_MESSAGE
212: #endif
213: #ifndef IGMP_V1_MEMBERSHIP_REPORT
214: #ifdef IGMP_HOST_MEMBERSHIP_REPORT
215: #define IGMP_V1_MEMBERSHIP_REPORT IGMP_HOST_MEMBERSHIP_REPORT
216: #define IGMP_V2_MEMBERSHIP_REPORT IGMP_HOST_NEW_MEMBERSHIP_REPORT
217: #endif
218: #ifdef IGMP_v1_HOST_MEMBERSHIP_REPORT
219: #define IGMP_V1_MEMBERSHIP_REPORT IGMP_v1_HOST_MEMBERSHIP_REPORT
220: #define IGMP_V2_MEMBERSHIP_REPORT IGMP_v2_HOST_MEMBERSHIP_REPORT
221: #endif
222: #endif
223:
224: /*
225: * NetBSD also renamed the mtrace types.
226: */
227: #if !defined(IGMP_MTRACE_RESP) && defined(IGMP_MTRACE_REPLY)
228: #define IGMP_MTRACE_RESP IGMP_MTRACE_REPLY
229: #define IGMP_MTRACE IGMP_MTRACE_QUERY
230: #endif
231:
232: /* main.c */
233: extern char * scaletime(u_long);
234: extern void logit(int, int, const char *, ...);
235: extern int register_input_handler(int, ihfunc_t);
236:
237: /* igmp.c */
238: extern void init_igmp(void);
239: extern void accept_igmp(size_t);
240: extern size_t build_igmp(u_int32, u_int32, int, int, u_int32, int);
241: extern void send_igmp(u_int32, u_int32, int, int, u_int32, int);
242: extern char * igmp_packet_kind(u_int, u_int);
243: extern int igmp_debug_kind(u_int, u_int);
244:
245: /* icmp.c */
246: extern void init_icmp(void);
247:
248: /* ipip.c */
249: extern void init_ipip(void);
250: extern void init_ipip_on_vif(struct uvif *);
251: extern void send_ipip(u_int32, u_int32, int, int, u_int32, int, struct uvif *);
252:
253: /* callout.c */
254: extern void callout_init(void);
255: extern void free_all_callouts(void);
256: extern void age_callout_queue(int);
257: extern int timer_nextTimer(void);
258: extern int timer_setTimer(int, cfunc_t, void *);
259: extern int timer_clearTimer(int);
260: extern int timer_leftTimer(int);
261:
262: /* route.c */
263: extern void init_routes(void);
264: extern void start_route_updates(void);
265: extern void update_route(u_int32, u_int32, u_int, u_int32, vifi_t, struct listaddr *);
266: extern void age_routes(void);
267: extern void expire_all_routes(void);
268: extern void free_all_routes(void);
269: extern void accept_probe(u_int32, u_int32, char *, size_t, u_int32);
270: extern void accept_report(u_int32, u_int32, char *, size_t, u_int32);
271: extern struct rtentry * determine_route(u_int32 src);
272: extern void report(int, vifi_t, u_int32);
273: extern void report_to_all_neighbors(int);
274: extern int report_next_chunk(void);
275: extern void blaster_alloc(vifi_t);
276: extern void add_vif_to_routes(vifi_t);
277: extern void delete_vif_from_routes(vifi_t);
278: extern void add_neighbor_to_routes(vifi_t, u_int);
279: extern void delete_neighbor_from_routes(u_int32, vifi_t, u_int);
280: extern void dump_routes(FILE *fp);
281:
282: /* vif.c */
283: extern void init_vifs(void);
284: extern void zero_vif(struct uvif *, int);
285: extern void init_installvifs(void);
286: extern void check_vif_state(void);
287: extern void send_on_vif(struct uvif *, u_int32, int, size_t);
288: extern vifi_t find_vif(u_int32, u_int32);
289: extern void age_vifs(void);
290: extern void dump_vifs(FILE *);
291: extern void stop_all_vifs(void);
292: extern struct listaddr *neighbor_info(vifi_t, u_int32);
293: extern void accept_group_report(u_int32, u_int32, u_int32, int);
294: extern void query_groups(void);
295: extern void probe_for_neighbors(void);
296: extern struct listaddr *update_neighbor(vifi_t, u_int32, int, char *, size_t, u_int32);
297: extern void accept_neighbor_request(u_int32, u_int32);
298: extern void accept_neighbor_request2(u_int32, u_int32);
299: extern void accept_info_request(u_int32, u_int32, u_char *, size_t);
300: extern void accept_info_reply(u_int32, u_int32, u_char *, size_t);
301: extern void accept_neighbors(u_int32, u_int32, u_char *, size_t, u_int32);
302: extern void accept_neighbors2(u_int32, u_int32, u_char *, size_t, u_int32);
303: extern void accept_leave_message(u_int32, u_int32, u_int32);
304: extern void accept_membership_query(u_int32, u_int32, u_int32, int);
305:
306: /* config.c */
307: extern void config_vifs_from_kernel(void);
308:
309: /* cfparse.y */
310: extern void config_vifs_from_file(void);
311:
312: /* inet.c */
313: extern int inet_valid_host(u_int32);
314: extern int inet_valid_mask(u_int32);
315: extern int inet_valid_subnet(u_int32, u_int32);
316: extern char * inet_fmt(u_int32, char *, size_t);
317: extern char * inet_fmts(u_int32, u_int32, char *, size_t);
318: extern u_int32 inet_parse(char *, int);
319: extern int inet_cksum(u_int16_t *, u_int);
320:
321: /* prune.c */
322: extern unsigned kroutes;
323: extern void determine_forwvifs(struct gtable *);
324: extern void send_prune_or_graft(struct gtable *);
325: extern void add_table_entry(u_int32, u_int32);
326: extern void del_table_entry(struct rtentry *,
327: u_int32, u_int);
328: extern void update_table_entry(struct rtentry *, u_int32);
329: extern int find_src_grp(u_int32, u_int32, u_int32);
330: extern void init_ktable(void);
331: extern void steal_sources(struct rtentry *);
332: extern void reset_neighbor_state(vifi_t, u_int32);
333: extern int grplst_mem(vifi_t, u_int32);
334: extern void free_all_prunes(void);
335: extern void age_table_entry(void);
336: extern void dump_cache(FILE *);
337: extern void update_lclgrp(vifi_t, u_int32);
338: extern void delete_lclgrp(vifi_t, u_int32);
339: extern void chkgrp_graft(vifi_t, u_int32);
340: extern void accept_prune(u_int32, u_int32, char *, size_t);
341: extern void accept_graft(u_int32, u_int32, char *, size_t);
342: extern void accept_g_ack(u_int32, u_int32, char *, size_t);
343: /* u_int is promoted u_char */
344: extern void accept_mtrace(u_int32, u_int32, u_int32, char *, u_int8_t, size_t);
345:
346: /* kern.c */
347: extern void k_set_rcvbuf(int, int);
348: extern void k_hdr_include(int);
349: extern void k_set_ttl(int);
350: extern void k_set_loop(int);
351: extern void k_set_if(u_int32);
352: extern void k_join(u_int32, u_int32);
353: extern void k_leave(u_int32, u_int32);
354: extern void k_init_dvmrp(void);
355: extern void k_stop_dvmrp(void);
356: extern void k_add_vif(vifi_t, struct uvif *);
357: extern void k_del_vif(vifi_t, struct uvif *);
358: extern void k_add_rg(u_int32, struct gtable *);
359: extern int k_del_rg(u_int32, struct gtable *);
360: extern int k_get_version(void);
361:
362: #ifdef SNMP
363: /* prune.c */
364: extern struct gtable * find_grp(u_int32);
365: extern struct stable * find_grp_src(struct gtable *, u_int32);
366: extern int next_grp_src_mask(struct gtable **, struct stable **, u_int32, u_int32, u_int32);
367: extern void refresh_sg(struct sioc_sg_req *, struct gtable *, struct stable *);
368: extern int next_child(struct gtable **, struct stable **,
369: u_int32, u_int32, u_int32, vifi_t *);
370:
371: /* route.c */
372: extern struct rtentry * snmp_find_route(u_int32, u_int32);
373: extern int next_route(struct rtentry **, u_int32, u_int32);
374: extern int next_route_child(struct rtentry **, u_int32, u_int32, vifi_t *);
375: #endif
376:
377: #ifdef RSRR
378: /* prune.c */
379: extern struct gtable *kernel_table;
380: extern struct gtable *gtp;
381:
382: /* rsrr.c */
383: extern void rsrr_init(void);
384: extern void rsrr_clean(void);
385: extern void rsrr_cache_send(struct gtable *, int);
386: extern void rsrr_cache_clean(struct gtable *);
387: #endif /* RSRR */
388:
389: #ifdef __GNUC__
390: # define UNUSED __attribute__((unused))
391: #else
392: # define UNUSED /*empty*/
393: #endif
394:
395: #ifndef HAVE_STRLCPY
396: size_t strlcpy(char *dst, const char *src, size_t siz);
397: #endif
398: #ifndef HAVE_STRTONUM
399: long long strtonum(const char *numstr, long long minval, long long maxval, const char **errstrp);
400: #endif
401: #ifndef HAVE_PIDFILE
402: int pidfile(const char *basename);
403: #endif
404:
405: #endif /* __MROUTED_DEFS_H__ */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>