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