Annotation of embedaddon/pimd/defs.h, revision 1.1.1.1
1.1 misho 1: /*
2: * Copyright (c) 1998-2001
3: * University of Southern California/Information Sciences Institute.
4: * All rights reserved.
5: *
6: * Redistribution and use in source and binary forms, with or without
7: * modification, are permitted provided that the following conditions
8: * are met:
9: * 1. Redistributions of source code must retain the above copyright
10: * notice, this list of conditions and the following disclaimer.
11: * 2. Redistributions in binary form must reproduce the above copyright
12: * notice, this list of conditions and the following disclaimer in the
13: * documentation and/or other materials provided with the distribution.
14: * 3. Neither the name of the project nor the names of its contributors
15: * may be used to endorse or promote products derived from this software
16: * without specific prior written permission.
17: *
18: * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
19: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21: * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
22: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28: * SUCH DAMAGE.
29: */
30: /*
31: * Part of this program has been derived from mrouted.
32: * The mrouted program is covered by the license in the accompanying file
33: * named "LICENSE.mrouted".
34: *
35: * The mrouted program is COPYRIGHT 1989 by The Board of Trustees of
36: * Leland Stanford Junior University.
37: *
38: */
39: #ifndef __PIMD_DEFS_H__
40: #define __PIMD_DEFS_H__
41:
42: #ifndef __linux__
43: # include <sys/cdefs.h> /* Defines __BSD_VISIBLE, needed for arc4random() etc. */
44: #endif
45:
46: #include <stdio.h>
47: #include <stdlib.h>
48: #include <stdint.h>
49: #include <unistd.h>
50: #include <ctype.h>
51: #include <errno.h>
52: #include <syslog.h>
53: #include <signal.h>
54: #include <string.h>
55: #include <sys/param.h>
56: #include <sys/types.h>
57: #include <sys/socket.h>
58: #include <sys/ioctl.h>
59: #include <fcntl.h>
60: #if ((defined(SYSV)) || (defined(__bsdi__)) || ((defined SunOS) && (SunOS < 50)))
61: #include <sys/sockio.h>
62: #endif /* SYSV || bsdi || SunOS 4.x */
63: #include <time.h>
64: #include <sys/time.h>
65: #include <net/if.h>
66: #include <netinet/in.h>
67: #include <arpa/inet.h>
68: #include <netinet/in_systm.h>
69: #include <netinet/ip.h>
70: #include <netinet/igmp.h>
71: #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
72: #include <osreldate.h>
73: #endif /* __FreeBSD__ */
74: #if defined(__bsdi__) || defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
75: #define rtentry kernel_rtentry
76: #include <net/route.h>
77: #undef rtentry
78: #endif /* bsdi or __FreeBSD_version >= 220000 */
79: #ifdef __linux__
80: #define _LINUX_IN_H /* For Linux <= 2.6.25 */
81: #include <linux/types.h>
82: #include <linux/mroute.h>
83: #else
84: #include <netinet/ip_mroute.h>
85: #endif /* __linux__ */
86:
87: /* If using any of the BSD distributions of UNIX the configure script
88: * links with -lutil, but on Linux we link with -lite. All required
89: * APIs are forward declared in lite.h, so we can use it everywhere. */
90: #include "libite/lite.h"
91:
92: #include <strings.h>
93: #ifdef RSRR
94: #include <sys/un.h>
95: #endif /* RSRR */
96:
97: #ifndef BYTE_ORDER
98: #if (BSD >= 199103)
99: #include <machine/endian.h>
100: #else
101: #ifdef __linux__
102: #include <endian.h>
103: #else
104: #define LITTLE_ENDIAN 1234 /* least-significant byte first (vax, pc) */
105: #define BIG_ENDIAN 4321 /* most-significant byte first (IBM, net) */
106: #define PDP_ENDIAN 3412 /* LSB first in word, MSW first in long (pdp) */
107:
108: #if defined(vax) || defined(ns32000) || defined(sun386) || defined(i386) || \
109: defined(__ia64) || \
110: defined(MIPSEL) || defined(_MIPSEL) || defined(BIT_ZERO_ON_RIGHT) || \
111: defined(__alpha__) || defined(__alpha)
112: #define BYTE_ORDER LITTLE_ENDIAN
113: #endif
114:
115: #if defined(sel) || defined(pyr) || defined(mc68000) || defined(sparc) || \
116: defined(is68k) || defined(tahoe) || defined(ibm032) || defined(ibm370) || \
117: defined(MIPSEB) || defined(_MIPSEB) || defined(_IBMR2) || defined(DGUX) ||\
118: defined(apollo) || defined(__convex__) || defined(_CRAY) || \
119: defined(__hppa) || defined(__hp9000) || \
120: defined(__hp9000s300) || defined(__hp9000s700) || \
121: defined(BIT_ZERO_ON_LEFT) || defined(m68k)
122: #define BYTE_ORDER BIG_ENDIAN
123: #endif
124: #endif /* linux */
125: #endif /* BSD */
126: #endif /* BYTE_ORDER */
127:
128: typedef void (*cfunc_t) (void *);
129: typedef void (*ihfunc_t) (int, fd_set *);
130:
131: #include "dvmrp.h" /* Added for further compatibility and convenience */
132: #include "pimd.h"
133: #include "mrt.h"
134: #include "igmpv2.h"
135: #include "igmpv3.h"
136: #include "vif.h"
137: #include "debug.h"
138: #include "pathnames.h"
139: #ifdef RSRR
140: #include "rsrr.h"
141: #include "rsrr_var.h"
142: #endif /* RSRR */
143:
144: /*
145: * Miscellaneous constants and macros
146: */
147:
148: #define ENABLINGSTR(val) (val) ? "enabling" : "disabling"
149:
150: /*
151: * Various definitions to make it working for different platforms
152: */
153: /* The old style sockaddr definition doesn't have sa_len */
154: #if defined(_AIX) || (defined(BSD) && (BSD >= 199006)) /* sa_len was added with 4.3-Reno */
155: #define HAVE_SA_LEN
156: #endif
157:
158: /* Versions of Solaris older than 2.6 don't have routing sockets. */
159: /* XXX TODO: check FreeBSD version and add all other platforms */
160: #if defined(__linux__) || (defined(SunOS) && SunOS >=56) || \
161: defined (IRIX) || defined (__bsdi__) || \
162: defined (__FreeBSD__) || defined(__FreeBSD_kernel__) || \
163: defined(NetBSD) || defined(OpenBSD)
164: #define HAVE_ROUTING_SOCKETS 1
165: #endif
166:
167: /* Older versions of UNIX don't really give us true raw sockets.
168: * Instead, they expect ip_len and ip_off in host byte order, and also
169: * provide them to us in that format when receiving raw frames.
170: *
171: * This list could probably be made longer, e.g., SunOS and __bsdi__
172: */
173: #if defined(__NetBSD__) || \
174: (defined(__FreeBSD__) && (__FreeBSD_version < 1100030)) || \
175: (defined(__OpenBSD__) && (OpenBSD < 200311))
176: #define HAVE_IP_HDRINCL_BSD_ORDER
177: #endif
178:
179: #define TRUE 1
180: #define FALSE 0
181:
182: #ifndef MAX
183: #define MAX(a,b) (((a) >= (b))? (a) : (b))
184: #define MIN(a,b) (((a) <= (b))? (a) : (b))
185: #endif /* MAX & MIN */
186:
187: #define CREATE TRUE
188: #define DONT_CREATE FALSE
189:
190: #define MFC_MOVE_FORCE 0x1
191: #define MFC_UPDATE_FORCE 0x2
192:
193: #define EQUAL(s1, s2) (strcmp((s1), (s2)) == 0)
194: #define ARRAY_LEN(a) (sizeof((a)) / sizeof((a)[0]))
195:
196: #define JAN_1970 2208988800UL /* 1970 - 1900 in seconds */
197:
198: #define MINTTL 1 /* min TTL in the packets send locally */
199:
200: #define MAX_IP_PACKET_LEN 576
201: #define MIN_IP_HEADER_LEN 20 /* sizeof(struct ip) */
202: #define IP_IGMP_HEADER_LEN 24 /* MIN + Router Alert */
203: #define MAX_IP_HEADER_LEN 60
204:
205:
206: /*
207: * The IGMPv2 <netinet/in.h> defines INADDR_ALLRTRS_GROUP, but earlier
208: * ones don't, so we define it conditionally here.
209: */
210: #ifndef INADDR_ALLRTRS_GROUP
211: /* address for multicast mtrace msg */
212: #define INADDR_ALLRTRS_GROUP (uint32_t)0xe0000002 /* 224.0.0.2 */
213: #endif
214:
215: #ifndef INADDR_ALLRPTS_GROUP
216: #define INADDR_ALLRPTS_GROUP ((in_addr_t)0xe0000016) /* 224.0.0.22, IGMPv3 */
217: #endif
218:
219: #ifndef INADDR_MAX_LOCAL_GROUP
220: #define INADDR_MAX_LOCAL_GROUP (uint32_t)0xe00000ff /* 224.0.0.255 */
221: #endif
222:
223: #define INADDR_ANY_N (uint32_t)0x00000000 /* INADDR_ANY in
224: * network order */
225: #define CLASSD_PREFIX (uint32_t)0xe0000000 /* 224.0.0.0 */
226: #define STAR_STAR_RP_MSKLEN 4 /* Masklen for
227: * 224.0.0.0 :
228: * to encode (*,*,RP)
229: */
230: #define ALL_MCAST_GROUPS_ADDR (uint32_t)0xe0000000 /* 224.0.0.0 */
231: #define ALL_MCAST_GROUPS_LEN 4
232:
233: /* Used by DVMRP */
234: #define DEFAULT_METRIC 1 /* default subnet/tunnel metric */
235: #define DEFAULT_THRESHOLD 1 /* default subnet/tunnel threshold */
236:
237: /* Used if no relaible unicast routing information available */
238: #define UCAST_DEFAULT_ROUTE_DISTANCE 101
239: #define UCAST_DEFAULT_ROUTE_METRIC 1024
240:
241: #define TIMER_INTERVAL 5 /* 5 sec virtual timer granularity */
242:
243: /*
244: * TODO: recalculate the messages sizes, probably with regard to the MTU
245: * TODO: cleanup
246: */
247: #define MAX_JP_MESSAGE_SIZE 8192
248: #define MAX_JP_MESSAGE_POOL_NUMBER 8
249: #define MAX_JOIN_LIST_SIZE 1500
250: #define MAX_PRUNE_LIST_SIZE 1500
251:
252:
253: #ifdef RSRR
254: #define BIT_ZERO(X) ((X) = 0)
255: #define BIT_SET(X,n) ((X) |= 1 << (n))
256: #define BIT_CLR(X,n) ((X) &= ~(1 << (n)))
257: #define BIT_TST(X,n) ((X) & 1 << (n))
258: #endif /* RSRR */
259:
260: #ifndef __linux__
261: #define RANDOM() arc4random()
262: #else
263: #define RANDOM() (uint32_t)random()
264: #endif
265:
266: /* NetBSD 6.1, for instance, does not have IPOPT_RA defined. */
267: #ifndef IPOPT_RA
268: #define IPOPT_RA 148
269: #endif
270:
271: /*
272: * External declarations for global variables and functions.
273: */
274: #define SEND_BUF_SIZE (128*1024) /* Maximum buff size to
275: * send a packet */
276: #define RECV_BUF_SIZE (128*1024) /* Maximum buff size to
277: * receive a packet */
278: #define SO_SEND_BUF_SIZE_MAX (256*1024)
279: #define SO_SEND_BUF_SIZE_MIN (48*1024)
280: #define SO_RECV_BUF_SIZE_MAX (256*1024)
281: #define SO_RECV_BUF_SIZE_MIN (48*1024)
282:
283:
284: /*
285: * Global settings, from config.c
286: */
287: extern uint16_t pim_timer_hello_interval;
288: extern uint16_t pim_timer_hello_holdtime;
289:
290: /* TODO: describe the variables and clean up */
291: extern char *igmp_recv_buf;
292: extern char *igmp_send_buf;
293: extern char *pim_recv_buf;
294: extern char *pim_send_buf;
295: extern int igmp_socket;
296: extern int pim_socket;
297: extern uint32_t allhosts_group;
298: extern uint32_t allrouters_group;
299: extern uint32_t allreports_group;
300: extern uint32_t allpimrouters_group;
301: extern build_jp_message_t *build_jp_message_pool;
302: extern int build_jp_message_pool_counter;
303:
304: extern uint32_t virtual_time;
305: extern char *config_file;
306: extern int haveterminal;
307: extern char *__progname;
308:
309: extern struct cand_rp_adv_message_ {
310: uint8_t *buffer;
311: uint8_t *insert_data_ptr;
312: uint8_t *prefix_cnt_ptr;
313: uint16_t message_size;
314: } cand_rp_adv_message;
315:
316: extern int disable_all_by_default;
317: extern int mrt_table_id;
318:
319: /*
320: * Used to contol the switching to the shortest path:
321: */
322: typedef enum {
323: SPT_RATE,
324: SPT_PACKETS,
325: SPT_INF
326: } spt_mode_t;
327:
328: typedef struct {
329: uint8_t mode;
330: uint32_t bytes;
331: uint32_t packets;
332: uint32_t interval;
333: } spt_threshold_t;
334: extern spt_threshold_t spt_threshold;
335:
336: extern cand_rp_t *cand_rp_list;
337: extern grp_mask_t *grp_mask_list;
338: extern cand_rp_t *segmented_cand_rp_list;
339: extern grp_mask_t *segmented_grp_mask_list;
340:
341: extern uint16_t curr_bsr_fragment_tag;
342: extern uint8_t curr_bsr_priority;
343: extern uint32_t curr_bsr_address;
344: extern uint32_t curr_bsr_hash_mask;
345: extern uint8_t cand_bsr_flag; /* candidate BSR flag */
346: extern uint8_t my_bsr_priority;
347: extern uint32_t my_bsr_address;
348: extern uint32_t my_bsr_hash_mask;
349: extern uint8_t cand_rp_flag; /* Candidate RP flag */
350: extern uint32_t my_cand_rp_address;
351: extern uint8_t my_cand_rp_priority;
352: extern uint16_t my_cand_rp_holdtime;
353: extern uint16_t my_cand_rp_adv_period; /* The locally configured
354: * Cand-RP adv. period.
355: */
356: extern uint16_t pim_bootstrap_timer;
357: extern uint32_t rp_my_ipv4_hashmask;
358: extern uint16_t pim_cand_rp_adv_timer;
359:
360: /* route.c */
361: extern uint32_t default_route_metric;
362: extern uint32_t default_route_distance;
363:
364: /* igmp_proto.c */
365: extern uint32_t igmp_query_interval;
366: extern uint32_t igmp_querier_timeout;
367:
368: /* mrt.c */
369: extern srcentry_t *srclist;
370: extern grpentry_t *grplist;
371:
372: /* vif.c */
373: extern struct uvif uvifs[MAXVIFS];
374: extern vifi_t numvifs;
375: extern int total_interfaces;
376: extern vifi_t reg_vif_num;
377: extern int phys_vif;
378: extern int udp_socket;
379:
380: extern int vifs_down;
381:
382: #define MAX_INET_BUF_LEN 19
383: extern char s1[MAX_INET_BUF_LEN];
384: extern char s2[MAX_INET_BUF_LEN];
385: extern char s3[MAX_INET_BUF_LEN];
386: extern char s4[MAX_INET_BUF_LEN];
387:
388: #if !((defined(BSD) && (BSD >= 199103)) || (defined(__linux__)))
389: extern int errno;
390: #endif
391:
392:
393: #ifndef IGMP_MEMBERSHIP_QUERY
394: #define IGMP_MEMBERSHIP_QUERY IGMP_HOST_MEMBERSHIP_QUERY
395: #if !(defined(NetBSD) || defined(OpenBSD) || defined(__FreeBSD__))
396: #define IGMP_V1_MEMBERSHIP_REPORT IGMP_HOST_MEMBERSHIP_REPORT
397: #define IGMP_V2_MEMBERSHIP_REPORT IGMP_HOST_NEW_MEMBERSHIP_REPORT
398: #else
399: #define IGMP_V1_MEMBERSHIP_REPORT IGMP_v1_HOST_MEMBERSHIP_REPORT
400: #define IGMP_V2_MEMBERSHIP_REPORT IGMP_v2_HOST_MEMBERSHIP_REPORT
401: #endif
402: #define IGMP_V2_LEAVE_GROUP IGMP_HOST_LEAVE_MESSAGE
403: #endif
404: #if defined(__FreeBSD__) /* From FreeBSD 8.x */
405: #define IGMP_V3_MEMBERSHIP_REPORT IGMP_v3_HOST_MEMBERSHIP_REPORT
406: #else
407: #define IGMP_V3_MEMBERSHIP_REPORT 0x22 /* Ver. 3 membership report */
408: #endif
409:
410: #if defined(NetBSD) || defined(OpenBSD) || defined(__FreeBSD__)
411: #define IGMP_MTRACE_RESP IGMP_MTRACE_REPLY
412: #define IGMP_MTRACE IGMP_MTRACE_QUERY
413: #endif
414:
415: /* For timeout. The timers count down */
416: #define SET_TIMER(timer, value) (timer) = (value)
417: #define RESET_TIMER(timer) (timer) = 0
418: #define COPY_TIMER(timer_1, timer_2) (timer_2) = (timer_1)
419: #define IF_TIMER_SET(timer) if ((timer) > 0)
420: #define IF_TIMER_NOT_SET(timer) if ((timer) <= 0)
421: #define FIRE_TIMER(timer) (timer) = 0
422:
423: #define IF_TIMEOUT(timer) \
424: if (!((timer) -= (MIN(timer, TIMER_INTERVAL))))
425:
426: #define IF_NOT_TIMEOUT(timer) \
427: if ((timer) -= (MIN(timer, TIMER_INTERVAL)))
428:
429: #define TIMEOUT(timer) \
430: (!((timer) -= (MIN(timer, TIMER_INTERVAL))))
431:
432: #define NOT_TIMEOUT(timer) \
433: ((timer) -= (MIN(timer, TIMER_INTERVAL)))
434:
435: #define ELSE else /* To make emacs cc-mode happy */
436:
437: #define MASK_TO_VAL(x, i) { \
438: uint32_t _x = ntohl(x); \
439: (i) = 1; \
440: while ((_x) <<= 1) \
441: (i)++; \
442: };
443:
444: #define VAL_TO_MASK(x, i) { \
445: x = htonl(~((1 << (32 - (i))) - 1)); \
446: };
447:
448: /*
449: * External function definitions
450: */
451:
452: /* callout.c */
453: extern void callout_init (void);
454: extern void free_all_callouts (void);
455: extern void age_callout_queue (int);
456: extern int timer_nextTimer (void);
457: extern int timer_setTimer (int, cfunc_t, void *);
458: extern void timer_clearTimer (int);
459: extern int timer_leftTimer (int);
460:
461: /* config.c */
462: extern void config_vifs_from_kernel (void);
463: extern void config_vifs_from_file (void);
464:
465: /* debug.c */
466: extern char *packet_kind (int proto, int type, int code);
467: extern int debug_kind (int proto, int type, int code);
468: extern void logit (int, int, const char *, ...);
469: extern void dump_frame (char *desc, void *dump, size_t len);
470: extern int log_level (int proto, int type, int code);
471: extern void dump (int i);
472: extern void fdump (int i);
473: extern void cdump (int i);
474: extern void dump_vifs (FILE *fp);
475: extern void dump_pim_mrt (FILE *fp);
476: extern int dump_rp_set (FILE *fp);
477:
478: /* dvmrp_proto.c */
479: extern void dvmrp_accept_probe (uint32_t src, uint32_t dst, uint8_t *p, int datalen, uint32_t level);
480: extern void dvmrp_accept_report (uint32_t src, uint32_t dst, uint8_t *p, int datalen, uint32_t level);
481: extern void dvmrp_accept_info_request (uint32_t src, uint32_t dst, uint8_t *p, int datalen);
482: extern void dvmrp_accept_info_reply (uint32_t src, uint32_t dst, uint8_t *p, int datalen);
483: extern void dvmrp_accept_neighbors (uint32_t src, uint32_t dst, uint8_t *p, int datalen, uint32_t level);
484: extern void dvmrp_accept_neighbors2 (uint32_t src, uint32_t dst, uint8_t *p, int datalen, uint32_t level);
485: extern void dvmrp_accept_prune (uint32_t src, uint32_t dst, uint8_t *p, int datalen);
486: extern void dvmrp_accept_graft (uint32_t src, uint32_t dst, uint8_t *p, int datalen);
487: extern void dvmrp_accept_g_ack (uint32_t src, uint32_t dst, uint8_t *p, int datalen);
488:
489: /* igmp.c */
490: extern void init_igmp (void);
491: extern void send_igmp (char *buf, uint32_t src, uint32_t dst, int type, int code, uint32_t group, int datalen);
492:
493: /* igmp_proto.c */
494: extern void query_groups (struct uvif *v);
495: extern void accept_membership_query (uint32_t src, uint32_t dst, uint32_t group, int tmo, int igmp_version);
496: extern void accept_group_report (uint32_t src, uint32_t dst, uint32_t group, int r_type);
497: extern void accept_leave_message (uint32_t src, uint32_t dst, uint32_t group);
498: extern void accept_membership_report(uint32_t src, uint32_t dst, struct igmpv3_report *report, ssize_t reportlen);
499:
500: /* inet.c */
501: extern int inet_cksum (uint16_t *addr, u_int len);
502: extern int inet_valid_host (uint32_t naddr);
503: extern int inet_valid_mask (uint32_t mask);
504: extern int inet_valid_subnet (uint32_t nsubnet, uint32_t nmask);
505: extern char *inet_fmt (uint32_t addr, char *s, size_t len);
506: extern char *netname (uint32_t addr, uint32_t mask);
507: extern uint32_t inet_parse (char *s, int n);
508:
509: /* kern.c */
510: extern void k_set_sndbuf (int socket, int bufsize, int minsize);
511: extern void k_set_rcvbuf (int socket, int bufsize, int minsize);
512: extern void k_hdr_include (int socket, int val);
513: extern void k_set_ttl (int socket, int t);
514: extern void k_set_loop (int socket, int l);
515: extern void k_set_if (int socket, uint32_t ifa);
516: extern void k_set_router_alert (int socket);
517: extern void k_join (int socket, uint32_t grp, struct uvif *v);
518: extern void k_leave (int socket, uint32_t grp, struct uvif *v);
519: extern void k_init_pim (int socket);
520: extern void k_stop_pim (int socket);
521: extern int k_del_mfc (int socket, uint32_t source, uint32_t group);
522: extern int k_chg_mfc (int socket, uint32_t source, uint32_t group, vifi_t iif, vifbitmap_t oifs,
523: uint32_t rp_addr);
524: extern void k_add_vif (int socket, vifi_t vifi, struct uvif *v);
525: extern void k_del_vif (int socket, vifi_t vifi, struct uvif *v);
526: extern int k_get_vif_count (vifi_t vifi, struct vif_count *retval);
527: extern int k_get_sg_cnt (int socket, uint32_t source, uint32_t group, struct sg_count *retval);
528:
529: /* main.c */
530: extern int register_input_handler (int fd, ihfunc_t func);
531:
532: /* mrt.c */
533: extern void init_pim_mrt (void);
534: extern mrtentry_t *find_route (uint32_t source, uint32_t group, uint16_t flags, char create);
535: extern grpentry_t *find_group (uint32_t group);
536: extern srcentry_t *find_source (uint32_t source);
537: extern void delete_mrtentry (mrtentry_t *mrtentry_ptr);
538: extern void delete_srcentry (srcentry_t *srcentry_ptr);
539: extern void delete_grpentry (grpentry_t *grpentry_ptr);
540: extern void delete_mrtentry_all_kernel_cache (mrtentry_t *mrtentry_ptr);
541: extern void delete_single_kernel_cache (mrtentry_t *mrtentry_ptr, kernel_cache_t *kernel_cache_ptr);
542: extern void delete_single_kernel_cache_addr (mrtentry_t *mrtentry_ptr, uint32_t source, uint32_t group);
543: extern void add_kernel_cache (mrtentry_t *mrtentry_ptr, uint32_t source, uint32_t group, uint16_t flags);
544: /* pim.c */
545: extern void init_pim (void);
546: extern void send_pim (char *buf, uint32_t src, uint32_t dst, int type, size_t len);
547: extern void send_pim_unicast (char *buf, int mtu, uint32_t src, uint32_t dst, int type, size_t len);
548:
549: /* pim_proto.c */
550: extern int receive_pim_hello (uint32_t src, uint32_t dst, char *msg, size_t len);
551: extern int send_pim_hello (struct uvif *v, uint16_t holdtime);
552: extern void delete_pim_nbr (pim_nbr_entry_t *nbr_delete);
553: extern int receive_pim_register (uint32_t src, uint32_t dst, char *msg, size_t len);
554: extern int send_pim_null_register (mrtentry_t *r);
555: extern int receive_pim_register_stop (uint32_t src, uint32_t dst, char *msg, size_t len);
556: extern int send_pim_register (char *pkt);
557: extern int receive_pim_join_prune (uint32_t src, uint32_t dst, char *msg, size_t len);
558: extern int join_or_prune (mrtentry_t *mrtentry_ptr, pim_nbr_entry_t *upstream_router);
559: extern int receive_pim_assert (uint32_t src, uint32_t dst, char *msg, size_t len);
560: extern int send_pim_assert (uint32_t source, uint32_t group, vifi_t vifi, mrtentry_t *mrtentry_ptr);
561: extern int send_periodic_pim_join_prune (vifi_t vifi, pim_nbr_entry_t *pim_nbr, uint16_t holdtime);
562: extern int add_jp_entry (pim_nbr_entry_t *pim_nbr, uint16_t holdtime, uint32_t group, uint8_t grp_msklen,
563: uint32_t source, uint8_t src_msklen, uint16_t addr_flags, uint8_t join_prune);
564: extern void pack_and_send_jp_message (pim_nbr_entry_t *pim_nbr);
565: extern int receive_pim_cand_rp_adv (uint32_t src, uint32_t dst, char *msg, size_t len);
566: extern int receive_pim_bootstrap (uint32_t src, uint32_t dst, char *msg, size_t len);
567: extern int send_pim_cand_rp_adv (void);
568: extern void send_pim_bootstrap (void);
569:
570: /* route.c */
571: extern int set_incoming (srcentry_t *srcentry_ptr, int srctype);
572: extern vifi_t get_iif (uint32_t source);
573: extern pim_nbr_entry_t *find_pim_nbr (uint32_t source);
574: extern int add_sg_oif (mrtentry_t *mrtentry_ptr, vifi_t vifi, uint16_t holdtime, int update_holdtime);
575: extern void add_leaf (vifi_t vifi, uint32_t source, uint32_t group);
576: extern void delete_leaf (vifi_t vifi, uint32_t source, uint32_t group);
577: extern int change_interfaces (mrtentry_t *mrtentry_ptr, vifi_t new_iif,
578: vifbitmap_t new_joined_oifs_, vifbitmap_t new_pruned_oifs,
579: vifbitmap_t new_leaves_, vifbitmap_t new_asserted_oifs, uint16_t flags);
580: extern void calc_oifs (mrtentry_t *mrtentry_ptr, vifbitmap_t *oifs_ptr);
581: extern void process_kernel_call (void);
582: extern int delete_vif_from_mrt (vifi_t vifi);
583: extern mrtentry_t *switch_shortest_path (uint32_t source, uint32_t group);
584:
585: /* routesock.c and netlink.c */
586: extern int k_req_incoming (uint32_t source, struct rpfctl *rpfp);
587: extern int init_routesock (void);
588: extern int routing_socket;
589:
590: /* rp.c */
591: extern void init_rp_and_bsr (void);
592: extern uint16_t bootstrap_initial_delay (void);
593: extern rp_grp_entry_t *add_rp_grp_entry (cand_rp_t **used_cand_rp_list,
594: grp_mask_t **used_grp_mask_list,
595: uint32_t rp_addr,
596: uint8_t rp_priority,
597: uint16_t rp_holdtime,
598: uint32_t group_addr,
599: uint32_t group_mask,
600: uint32_t bsr_hash_mask,
601: uint16_t fragment_tag);
602: extern void delete_rp_grp_entry (cand_rp_t **used_cand_rp_list, grp_mask_t **used_grp_mask_list,
603: rp_grp_entry_t *rp_grp_entry_delete);
604: extern void delete_grp_mask (cand_rp_t **used_cand_rp_list, grp_mask_t **used_grp_mask_list,
605: uint32_t group_addr, uint32_t group_mask);
606: extern void delete_rp (cand_rp_t **used_cand_rp_list, grp_mask_t **used_grp_mask_list,
607: uint32_t rp_addr);
608: extern void delete_rp_list (cand_rp_t **used_cand_rp_list, grp_mask_t **used_grp_mask_list);
609: extern rpentry_t *rp_match (uint32_t group);
610: extern rp_grp_entry_t *rp_grp_match (uint32_t group);
611: extern rpentry_t *rp_find (uint32_t rp_address);
612: extern int remap_grpentry (grpentry_t *grpentry_ptr);
613: extern int create_pim_bootstrap_message (char *send_buff);
614: extern int check_mrtentry_rp (mrtentry_t *mrtentry_ptr, uint32_t rp_addr);
615:
616: #ifdef RSRR
617: #ifdef PIM
618: #define gtable mrtentry
619: #endif /* PIM */
620: #define RSRR_NOTIFICATION_OK TRUE
621: #define RSRR_NOTIFICATION_FALSE FALSE
622:
623: /* rsrr.c */
624: extern void rsrr_init (void);
625: extern void rsrr_clean (void);
626: extern void rsrr_cache_send (struct gtable *, int);
627: extern void rsrr_cache_clean (struct gtable *);
628: extern void rsrr_cache_bring_up (struct gtable *);
629: #endif /* RSRR */
630:
631: /* timer.c */
632: extern void init_timers (void);
633: extern void age_vifs (void);
634: extern void age_routes (void);
635: extern void age_misc (void);
636: extern int unicast_routing_changes (srcentry_t *src_ent);
637: extern int clean_srclist (void);
638:
639: /* trace.c */
640: /* u_int is promoted uint8_t */
641: extern void accept_mtrace (uint32_t src, uint32_t dst, uint32_t group, char *data, u_int no, int datalen);
642: extern void accept_neighbor_request (uint32_t src, uint32_t dst);
643: extern void accept_neighbor_request2 (uint32_t src, uint32_t dst);
644:
645: /* vif.c */
646: extern void init_vifs (void);
647: extern void zero_vif (struct uvif *, int);
648: extern void stop_all_vifs (void);
649: extern void check_vif_state (void);
650: extern vifi_t local_address (uint32_t src);
651: extern vifi_t find_vif_direct (uint32_t src);
652: extern vifi_t find_vif_direct_local (uint32_t src);
653: extern uint32_t max_local_address (void);
654:
655: struct rp_hold {
656: struct rp_hold *next;
657: uint32_t address;
658: uint32_t group;
659: uint32_t mask;
660: uint8_t priority;
661: };
662:
663: #endif /* __PIMD_DEFS_H__ */
664:
665: /**
666: * Local Variables:
667: * version-control: t
668: * indent-tabs-mode: t
669: * c-file-style: "ellemtel"
670: * c-basic-offset: 4
671: * End:
672: */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>