1 /* $NetBSD: defs.h,v 1.6 1995/12/10 10:06:59 mycroft 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/types.h> 22 #include <sys/socket.h> 23 #include <sys/ioctl.h> 24 #include <sys/time.h> 25 #include <net/if.h> 26 #include <netinet/in.h> 27 #include <netinet/ip.h> 28 #include <netinet/igmp.h> 29 #include <netinet/ip_mroute.h> 30 #ifdef RSRR 31 #include <sys/un.h> 32 #endif /* RSRR */ 33 34 typedef void (*cfunc_t)(void *); 35 typedef void (*ihfunc_t)(int); 36 37 #include "dvmrp.h" 38 #include "vif.h" 39 #include "route.h" 40 #include "prune.h" 41 #include "pathnames.h" 42 #ifdef RSRR 43 #include "rsrr.h" 44 #include "rsrr_var.h" 45 #endif /* RSRR */ 46 47 /* 48 * Miscellaneous constants and macros. 49 */ 50 #define FALSE 0 51 #define TRUE 1 52 53 #define EQUAL(s1, s2) (strcmp((s1), (s2)) == 0) 54 55 #define TIMER_INTERVAL ROUTE_MAX_REPORT_DELAY 56 57 #define VENDOR_CODE 1 /* Get a new vendor code if you make significant 58 * changes to mrouted. */ 59 60 #define PROTOCOL_VERSION 3 /* increment when packet format/content changes */ 61 62 #define MROUTED_VERSION 8 /* increment on local changes or bug fixes, */ 63 /* reset to 0 whenever PROTOCOL_VERSION increments */ 64 65 #define MROUTED_LEVEL ((MROUTED_VERSION << 8) | PROTOCOL_VERSION | \ 66 ((NF_PRUNE | NF_GENID | NF_MTRACE) << 16) | \ 67 (VENDOR_CODE << 24)) 68 /* for IGMP 'group' field of DVMRP messages */ 69 70 #define LEAF_FLAGS (( vifs_with_neighbors == 1 ) ? 0x010000 : 0) 71 /* more for IGMP 'group' field of DVMRP messages */ 72 #define DEL_RTE_GROUP 0 73 #define DEL_ALL_ROUTES 1 74 /* for Deleting kernel table entries */ 75 76 #define JAN_1970 2208988800UL /* 1970 - 1900 in seconds */ 77 78 #ifdef RSRR 79 #define BIT_ZERO(X) ((X) = 0) 80 #define BIT_SET(X,n) ((X) |= 1 << (n)) 81 #define BIT_CLR(X,n) ((X) &= ~(1 << (n))) 82 #define BIT_TST(X,n) ((X) & 1 << (n)) 83 #endif /* RSRR */ 84 85 /* 86 * External declarations for global variables and functions. 87 */ 88 #define RECV_BUF_SIZE 8192 89 extern char *recv_buf; 90 extern char *send_buf; 91 extern int igmp_socket; 92 #ifdef RSRR 93 extern int rsrr_socket; 94 #endif /* RSRR */ 95 extern u_int32_t allhosts_group; 96 extern u_int32_t allrtrs_group; 97 extern u_int32_t dvmrp_group; 98 extern u_int32_t dvmrp_genid; 99 100 #define DEFAULT_DEBUG 2 /* default if "-d" given without value */ 101 102 extern int debug; 103 extern u_char pruning; 104 105 extern int routes_changed; 106 extern int delay_change_reports; 107 extern unsigned nroutes; 108 109 extern struct uvif uvifs[MAXVIFS]; 110 extern vifi_t numvifs; 111 extern int vifs_down; 112 extern int udp_socket; 113 extern int vifs_with_neighbors; 114 115 extern char s1[]; 116 extern char s2[]; 117 extern char s3[]; 118 extern char s4[]; 119 120 #ifdef OLD_KERNEL 121 #define MRT_INIT DVMRP_INIT 122 #define MRT_DONE DVMRP_DONE 123 #define MRT_ADD_VIF DVMRP_ADD_VIF 124 #define MRT_DEL_VIF DVMRP_DEL_VIF 125 #define MRT_ADD_MFC DVMRP_ADD_MFC 126 #define MRT_DEL_MFC DVMRP_DEL_MFC 127 128 #define IGMP_PIM 0x14 129 #endif 130 131 /* main.c */ 132 extern void logit(int, int, char *, ...); 133 extern int register_input_handler(int fd, ihfunc_t func); 134 135 /* igmp.c */ 136 extern void init_igmp(void); 137 extern void accept_igmp(int recvlen); 138 extern void send_igmp(u_int32_t src, u_int32_t dst, int type, 139 int code, u_int32_t group, int datalen); 140 141 /* callout.c */ 142 extern void callout_init(void); 143 extern void age_callout_queue(void); 144 extern int timer_setTimer(int delay, cfunc_t action, char *data); 145 extern void timer_clearTimer(int timer_id); 146 147 /* route.c */ 148 extern void init_routes(void); 149 extern void start_route_updates(void); 150 extern void update_route(u_int32_t origin, u_int32_t mask, 151 u_int metric, u_int32_t src, vifi_t vifi); 152 extern void age_routes(void); 153 extern void expire_all_routes(void); 154 extern void free_all_routes(void); 155 extern void accept_probe(u_int32_t src, u_int32_t dst, char *p, 156 int datalen, u_int32_t level); 157 extern void accept_report(u_int32_t src, u_int32_t dst, char *p, 158 int datalen, u_int32_t level); 159 extern struct rtentry * determine_route(u_int32_t src); 160 extern void report(int which_routes, vifi_t vifi, u_int32_t dst); 161 extern void report_to_all_neighbors(int which_routes); 162 extern int report_next_chunk(void); 163 extern void add_vif_to_routes(vifi_t vifi); 164 extern void delete_vif_from_routes(vifi_t vifi); 165 extern void delete_neighbor_from_routes(u_int32_t addr, 166 vifi_t vifi); 167 extern void dump_routes(FILE *fp); 168 extern void start_route_updates(void); 169 170 /* vif.c */ 171 extern void init_vifs(void); 172 extern void check_vif_state(void); 173 extern vifi_t find_vif(u_int32_t src, u_int32_t dst); 174 extern void age_vifs(void); 175 extern void dump_vifs(FILE *fp); 176 extern void stop_all_vifs(void); 177 extern struct listaddr *neighbor_info(vifi_t vifi, u_int32_t addr); 178 extern void accept_group_report(u_int32_t src, u_int32_t dst, 179 u_int32_t group, int r_type); 180 extern void query_groups(void); 181 extern void probe_for_neighbors(void); 182 extern int update_neighbor(vifi_t vifi, u_int32_t addr, 183 int msgtype, char *p, int datalen, u_int32_t level); 184 extern void accept_neighbor_request(u_int32_t src, u_int32_t dst); 185 extern void accept_neighbor_request2(u_int32_t src, u_int32_t dst); 186 extern void accept_neighbors(u_int32_t src, u_int32_t dst, 187 u_char *p, int datalen, u_int32_t level); 188 extern void accept_neighbors2(u_int32_t src, u_int32_t dst, 189 u_char *p, int datalen, u_int32_t level); 190 extern void accept_leave_message(u_int32_t src, u_int32_t dst, 191 u_int32_t group); 192 extern void accept_membership_query(u_int32_t src, u_int32_t dst, 193 u_int32_t group, int tmo); 194 extern void init_installvifs(void); 195 196 /* config.c */ 197 extern void config_vifs_from_kernel(void); 198 199 /* cfparse.y */ 200 extern void config_vifs_from_file(void); 201 202 /* inet.c */ 203 extern int inet_valid_host(u_int32_t naddr); 204 extern int inet_valid_subnet(u_int32_t nsubnet, u_int32_t nmask); 205 extern char * inet_fmt(u_int32_t addr, char *s); 206 extern char * inet_fmts(u_int32_t addr, u_int32_t mask, char *s); 207 extern u_int32_t inet_parse(char *s); 208 extern int inet_cksum(u_int16_t *addr, u_int len); 209 extern int inet_valid_host(u_int32_t naddr); 210 extern int inet_valid_mask(u_int32_t mask); 211 212 /* prune.c */ 213 extern unsigned kroutes; 214 extern void add_table_entry(u_int32_t origin, u_int32_t mcastgrp); 215 extern void del_table_entry(struct rtentry *r, 216 u_int32_t mcastgrp, u_int del_flag); 217 extern void update_table_entry(struct rtentry *r); 218 extern void init_ktable(void); 219 extern void accept_prune(u_int32_t src, u_int32_t dst, char *p, 220 int datalen); 221 extern void steal_sources(struct rtentry *rt); 222 extern void reset_neighbor_state(vifi_t vifi, u_int32_t addr); 223 extern int grplst_mem(vifi_t vifi, u_int32_t mcastgrp); 224 extern int scoped_addr(vifi_t vifi, u_int32_t addr); 225 extern void free_all_prunes(void); 226 extern void age_table_entry(void); 227 extern void dump_cache(FILE *fp2); 228 extern void update_lclgrp(vifi_t vifi, u_int32_t mcastgrp); 229 extern void delete_lclgrp(vifi_t vifi, u_int32_t mcastgrp); 230 extern void chkgrp_graft(vifi_t vifi, u_int32_t mcastgrp); 231 extern void accept_graft(u_int32_t src, u_int32_t dst, char *p, 232 int datalen); 233 extern void accept_g_ack(u_int32_t src, u_int32_t dst, char *p, 234 int datalen); 235 /* u_int is promoted u_char */ 236 extern void accept_mtrace(u_int32_t src, u_int32_t dst, 237 u_int32_t group, char *data, u_int no, int datalen); 238 extern void accept_info_request(u_int32_t src, u_int32_t dst, 239 u_char *p, int datalen); 240 extern void accept_info_reply(u_int32_t src, u_int32_t dst, 241 u_char *p, int datalen); 242 243 /* kern.c */ 244 extern void k_set_rcvbuf(int bufsize); 245 extern void k_hdr_include(int bool); 246 extern void k_set_ttl(int t); 247 extern void k_set_loop(int l); 248 extern void k_set_if(u_int32_t ifa); 249 extern void k_join(u_int32_t grp, u_int32_t ifa); 250 extern void k_leave(u_int32_t grp, u_int32_t ifa); 251 extern void k_init_dvmrp(void); 252 extern void k_stop_dvmrp(void); 253 extern void k_add_vif(vifi_t vifi, struct uvif *v); 254 extern void k_del_vif(vifi_t vifi); 255 extern void k_add_rg(u_int32_t origin, struct gtable *g); 256 extern int k_del_rg(u_int32_t origin, struct gtable *g); 257 extern int k_get_version(void); 258 259 #ifdef RSRR 260 /* prune.c */ 261 extern struct gtable *kernel_table; 262 extern struct gtable *gtp; 263 extern int find_src_grp(u_int32_t src, u_int32_t mask, 264 u_int32_t grp); 265 266 /* rsrr.c */ 267 extern void rsrr_init(void); 268 extern void rsrr_read(int f); 269 extern void rsrr_clean(void); 270 extern void rsrr_cache_send(struct gtable *gt, int notify); 271 extern void rsrr_cache_clean(struct gtable *gt); 272 #endif /* RSRR */ 273