1 /* $NetBSD: defs.h,v 1.8 2000/10/11 20:23:53 is Exp $ */ 2 3 /* 4 * The mrouted program is covered by the license in the accompanying file 5 * named "LICENSE". Use of the mrouted program represents acceptance of 6 * the terms and conditions listed in that file. 7 * 8 * The mrouted program is COPYRIGHT 1989 by The Board of Trustees of 9 * Leland Stanford Junior University. 10 */ 11 12 13 #include <stdio.h> 14 #include <stdlib.h> 15 #include <unistd.h> 16 #include <ctype.h> 17 #include <errno.h> 18 #include <syslog.h> 19 #include <signal.h> 20 #include <string.h> 21 #include <sys/param.h> 22 #include <sys/types.h> 23 #include <sys/socket.h> 24 #include <sys/ioctl.h> 25 #ifdef SYSV 26 #include <sys/sockio.h> 27 #endif 28 #include <sys/time.h> 29 #include <net/if.h> 30 #include <netinet/in.h> 31 #include <netinet/in_systm.h> 32 #include <netinet/ip.h> 33 #include <netinet/igmp.h> 34 #include <netinet/ip_mroute.h> 35 #ifdef RSRR 36 #include <sys/un.h> 37 #endif /* RSRR */ 38 39 #ifndef __P 40 #ifdef __STDC__ 41 #define __P(x) x 42 #else 43 #define __P(x) () 44 #endif 45 #endif 46 47 typedef void (*cfunc_t) __P((void *)); 48 typedef void (*ihfunc_t) __P((int, fd_set *)); 49 50 #include "dvmrp.h" 51 #include "vif.h" 52 #include "route.h" 53 #include "prune.h" 54 #include "pathnames.h" 55 #ifdef RSRR 56 #include "rsrr.h" 57 #include "rsrr_var.h" 58 #endif /* RSRR */ 59 60 /* 61 * Miscellaneous constants and macros. 62 */ 63 #define FALSE 0 64 #define TRUE 1 65 66 #define EQUAL(s1, s2) (strcmp((s1), (s2)) == 0) 67 68 #define TIMER_INTERVAL ROUTE_MAX_REPORT_DELAY 69 70 #define VENDOR_CODE 1 /* Get a new vendor code if you make significant 71 * changes to mrouted. */ 72 73 #define PROTOCOL_VERSION 3 /* increment when packet format/content changes */ 74 75 #define MROUTED_VERSION 8 /* increment on local changes or bug fixes, */ 76 /* reset to 0 whever PROTOCOL_VERSION increments */ 77 78 #define MROUTED_LEVEL ((MROUTED_VERSION << 8) | PROTOCOL_VERSION | \ 79 ((NF_PRUNE | NF_GENID | NF_MTRACE) << 16) | \ 80 (VENDOR_CODE << 24)) 81 /* for IGMP 'group' field of DVMRP messages */ 82 83 #define LEAF_FLAGS (( vifs_with_neighbors == 1 ) ? 0x010000 : 0) 84 /* more for IGMP 'group' field of DVMRP messages */ 85 #define DEL_RTE_GROUP 0 86 #define DEL_ALL_ROUTES 1 87 /* for Deleting kernel table entries */ 88 89 /* obnoxious gcc gives an extraneous warning about this constant... */ 90 #if defined(__STDC__) || defined(__GNUC__) 91 #define JAN_1970 2208988800UL /* 1970 - 1900 in seconds */ 92 #else 93 #define JAN_1970 2208988800L /* 1970 - 1900 in seconds */ 94 #define const /**/ 95 #endif 96 97 #ifdef RSRR 98 #define BIT_ZERO(X) ((X) = 0) 99 #define BIT_SET(X,n) ((X) |= 1 << (n)) 100 #define BIT_CLR(X,n) ((X) &= ~(1 << (n))) 101 #define BIT_TST(X,n) ((X) & 1 << (n)) 102 #endif /* RSRR */ 103 104 #ifdef SYSV 105 #define bcopy(a, b, c) memcpy(b, a, c) 106 #define bzero(s, n) memset((s), 0, (n)) 107 #define setlinebuf(s) setvbuf(s, NULL, _IOLBF, 0) 108 #define signal(s,f) sigset(s,f) 109 #endif 110 111 /* 112 * External declarations for global variables and functions. 113 */ 114 #define RECV_BUF_SIZE 8192 115 extern char *recv_buf; 116 extern char *send_buf; 117 extern int igmp_socket; 118 #ifdef RSRR 119 extern int rsrr_socket; 120 #endif /* RSRR */ 121 extern u_int32_t allhosts_group; 122 extern u_int32_t allrtrs_group; 123 extern u_int32_t dvmrp_group; 124 extern u_int32_t dvmrp_genid; 125 126 #define DEFAULT_DEBUG 2 /* default if "-d" given without value */ 127 128 extern int debug; 129 extern u_char pruning; 130 131 extern int routes_changed; 132 extern int delay_change_reports; 133 extern unsigned nroutes; 134 135 extern struct uvif uvifs[MAXVIFS]; 136 extern vifi_t numvifs; 137 extern int vifs_down; 138 extern int udp_socket; 139 extern int vifs_with_neighbors; 140 141 extern char s1[]; 142 extern char s2[]; 143 extern char s3[]; 144 extern char s4[]; 145 146 #if !(defined(BSD) && (BSD >= 199103)) 147 extern int errno; 148 extern int sys_nerr; 149 extern char * sys_errlist[]; 150 #endif 151 152 #ifdef OLD_KERNEL 153 #define MRT_INIT DVMRP_INIT 154 #define MRT_DONE DVMRP_DONE 155 #define MRT_ADD_VIF DVMRP_ADD_VIF 156 #define MRT_DEL_VIF DVMRP_DEL_VIF 157 #define MRT_ADD_MFC DVMRP_ADD_MFC 158 #define MRT_DEL_MFC DVMRP_DEL_MFC 159 160 #define IGMP_PIM 0x14 161 #endif 162 163 /* main.c */ 164 extern void log __P((int, int, const char *, ...)) 165 __attribute__((__format__(__printf__, 3, 4))); 166 extern int register_input_handler __P((int fd, ihfunc_t func)); 167 168 /* igmp.c */ 169 extern void init_igmp __P((void)); 170 extern void accept_igmp __P((int recvlen)); 171 extern void send_igmp __P((u_int32_t src, u_int32_t dst, int type, 172 int code, u_int32_t group, 173 int datalen)); 174 175 /* callout.c */ 176 extern void callout_init __P((void)); 177 extern void age_callout_queue __P((void)); 178 extern int timer_setTimer __P((int delay, cfunc_t action, 179 char *data)); 180 extern void timer_clearTimer __P((int timer_id)); 181 182 /* route.c */ 183 extern void init_routes __P((void)); 184 extern void start_route_updates __P((void)); 185 extern void update_route __P((u_int32_t origin, u_int32_t mask, 186 u_int metric, u_int32_t src, 187 vifi_t vifi)); 188 extern void age_routes __P((void)); 189 extern void expire_all_routes __P((void)); 190 extern void free_all_routes __P((void)); 191 extern void accept_probe __P((u_int32_t src, u_int32_t dst, 192 char *p, int datalen, 193 u_int32_t level)); 194 extern void accept_report __P((u_int32_t src, u_int32_t dst, 195 char *p, int datalen, 196 u_int32_t level)); 197 extern struct rtentry * determine_route __P((u_int32_t src)); 198 extern void report __P((int which_routes, vifi_t vifi, 199 u_int32_t dst)); 200 extern void report_to_all_neighbors __P((int which_routes)); 201 extern int report_next_chunk __P((void)); 202 extern void add_vif_to_routes __P((vifi_t vifi)); 203 extern void delete_vif_from_routes __P((vifi_t vifi)); 204 extern void delete_neighbor_from_routes __P((u_int32_t addr, 205 vifi_t vifi)); 206 extern void dump_routes __P((FILE *fp)); 207 extern void start_route_updates __P((void)); 208 209 /* vif.c */ 210 extern void init_vifs __P((void)); 211 extern void check_vif_state __P((void)); 212 extern vifi_t find_vif __P((u_int32_t src, u_int32_t dst)); 213 extern void age_vifs __P((void)); 214 extern void dump_vifs __P((FILE *fp)); 215 extern void stop_all_vifs __P((void)); 216 extern struct listaddr *neighbor_info __P((vifi_t vifi, u_int32_t addr)); 217 extern void accept_group_report __P((u_int32_t src, u_int32_t dst, 218 u_int32_t group, int r_type)); 219 extern void query_groups __P((void)); 220 extern void probe_for_neighbors __P((void)); 221 extern int update_neighbor __P((vifi_t vifi, u_int32_t addr, 222 int msgtype, char *p, int datalen, 223 u_int32_t level)); 224 extern void accept_neighbor_request __P((u_int32_t src, u_int32_t dst)); 225 extern void accept_neighbor_request2 __P((u_int32_t src, 226 u_int32_t dst)); 227 extern void accept_neighbors __P((u_int32_t src, u_int32_t dst, 228 u_char *p, int datalen, u_int32_t level)); 229 extern void accept_neighbors2 __P((u_int32_t src, u_int32_t dst, 230 u_char *p, int datalen, u_int32_t level)); 231 extern void accept_leave_message __P((u_int32_t src, u_int32_t dst, 232 u_int32_t group)); 233 extern void accept_membership_query __P((u_int32_t src, u_int32_t dst, 234 u_int32_t group, int tmo)); 235 236 /* config.c */ 237 extern void config_vifs_from_kernel __P((void)); 238 239 /* cfparse.y */ 240 extern void config_vifs_from_file __P((void)); 241 242 /* inet.c */ 243 extern int inet_valid_host __P((u_int32_t naddr)); 244 extern int inet_valid_mask __P((u_int32_t mask)); 245 extern int inet_valid_subnet __P((u_int32_t nsubnet, u_int32_t nmask)); 246 extern char * inet_fmt __P((u_int32_t addr, char *s)); 247 extern char * inet_fmts __P((u_int32_t addr, u_int32_t mask, char *s)); 248 extern u_int32_t inet_parse __P((char *s)); 249 extern int inet_cksum __P((u_short *addr, u_int len)); 250 251 /* prune.c */ 252 extern unsigned kroutes; 253 extern void add_table_entry __P((u_int32_t origin, u_int32_t mcastgrp)); 254 extern void del_table_entry __P((struct rtentry *r, 255 u_int32_t mcastgrp, u_int del_flag)); 256 extern void update_table_entry __P((struct rtentry *r)); 257 extern void init_ktable __P((void)); 258 extern void accept_prune __P((u_int32_t src, u_int32_t dst, char *p, 259 int datalen)); 260 extern void steal_sources __P((struct rtentry *rt)); 261 extern void reset_neighbor_state __P((vifi_t vifi, u_int32_t addr)); 262 extern int grplst_mem __P((vifi_t vifi, u_int32_t mcastgrp)); 263 extern int scoped_addr __P((vifi_t vifi, u_int32_t addr)); 264 extern void free_all_prunes __P((void)); 265 extern void age_table_entry __P((void)); 266 extern void dump_cache __P((FILE *fp2)); 267 extern void update_lclgrp __P((vifi_t vifi, u_int32_t mcastgrp)); 268 extern void delete_lclgrp __P((vifi_t vifi, u_int32_t mcastgrp)); 269 extern void chkgrp_graft __P((vifi_t vifi, u_int32_t mcastgrp)); 270 extern void accept_graft __P((u_int32_t src, u_int32_t dst, char *p, 271 int datalen)); 272 extern void accept_g_ack __P((u_int32_t src, u_int32_t dst, char *p, 273 int datalen)); 274 /* u_int is promoted u_char */ 275 extern void accept_mtrace __P((u_int32_t src, u_int32_t dst, 276 u_int32_t group, char *data, u_int no, 277 int datalen)); 278 extern int find_src_grp __P((u_int32_t, u_int32_t, u_int32_t)); 279 280 /* kern.c */ 281 extern void k_set_rcvbuf __P((int bufsize)); 282 extern void k_hdr_include __P((int bool)); 283 extern void k_set_ttl __P((int t)); 284 extern void k_set_loop __P((int l)); 285 extern void k_set_if __P((u_int32_t ifa)); 286 extern void k_join __P((u_int32_t grp, u_int32_t ifa)); 287 extern void k_leave __P((u_int32_t grp, u_int32_t ifa)); 288 extern void k_init_dvmrp __P((void)); 289 extern void k_stop_dvmrp __P((void)); 290 extern void k_add_vif __P((vifi_t vifi, struct uvif *v)); 291 extern void k_del_vif __P((vifi_t vifi)); 292 extern void k_add_rg __P((u_int32_t origin, struct gtable *g)); 293 extern int k_del_rg __P((u_int32_t origin, struct gtable *g)); 294 extern int k_get_version __P((void)); 295 296 #ifdef SNMP 297 /* prune.c */ 298 extern struct rtentry * snmp_find_route __P(()); 299 extern struct gtable * find_grp __P(()); 300 extern struct stable * find_grp_src __P(()); 301 #endif 302 303 #ifdef RSRR 304 /* prune.c */ 305 extern struct gtable *kernel_table; 306 extern struct gtable *gtp; 307 extern int find_src_grp __P((u_int32_t src, u_int32_t mask, 308 u_int32_t grp)); 309 310 /* rsrr.c */ 311 extern void rsrr_init __P((void)); 312 extern void rsrr_read __P((int f, fd_set *rfd)); 313 extern void rsrr_clean __P((void)); 314 extern void rsrr_cache_send __P((struct gtable *gt, int notify)); 315 extern void rsrr_cache_clean __P((struct gtable *gt)); 316 #endif /* RSRR */ 317 318 /* vif.c */ 319 extern void accept_info_reply __P((u_int32_t, u_int32_t, 320 u_char *, int)); 321 extern void accept_info_request __P((u_int32_t, u_int32_t, 322 u_char *, int)); 323 extern void init_installvifs __P((void)); 324