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