2 * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
3 * Use is subject to license terms.
5 * Copyright (c) 1983, 1988, 1993
6 * The Regents of the University of California. All rights reserved.
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
16 * 3. All advertising materials mentioning features or use of this software
17 * must display the following acknowledgment:
18 * This product includes software developed by the University of
19 * California, Berkeley and its contributors.
20 * 4. Neither the name of the University nor the names of its contributors
21 * may be used to endorse or promote products derived from this software
22 * without specific prior written permission.
24 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
25 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
28 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
30 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
36 * @(#)defs.h 8.1 (Berkeley) 6/5/93
38 * $FreeBSD: src/sbin/routed/defs.h,v 1.14 2000/08/11 08:24:38 sheldonh Exp $
45 * Definitions for RIPv2 routing process.
47 * This code is based on the 4.4BSD `routed` daemon, with extensions to
49 * RIPv2, including variable length subnet masks.
51 * aggregate routes in the kernel tables.
52 * aggregate advertised routes.
53 * maintain spare routes for faster selection of another gateway
54 * when the current gateway dies.
55 * timers on routes with second granularity so that selection
56 * of a new route does not wait 30-60 seconds.
57 * tolerance of static routes.
58 * tell the kernel hop counts.
59 * use of per-interface ip_forwarding state.
61 * The vestigial support for other protocols has been removed. There
62 * is no likelihood that IETF RIPv1 or RIPv2 will ever be used with
63 * other protocols. The result is far smaller, faster, cleaner, and
64 * perhaps understandable.
66 * The accumulation of special flags and kludges added over the many
67 * years have been simplified and integrated.
89 #include <sys/types.h>
90 #include <sys/param.h>
91 #include <sys/ioctl.h>
92 #include <sys/socket.h>
93 #include <sys/sysmacros.h>
96 #include <net/route.h>
97 #include <net/if_dl.h>
98 #include <netinet/in.h>
99 #include <arpa/inet.h>
100 #define RIPVERSION RIPv2
101 #include <protocols/routed.h>
104 #define DAY (24*60*60)
105 #define NEVER DAY /* a long time */
106 #define EPOCH NEVER /* bias time by this to avoid <0 */
109 * Scan the kernel regularly to see if any interfaces have appeared or been
112 #define CHECK_BAD_INTERVAL 5 /* when an interface is known bad */
113 #define CHECK_ACT_INTERVAL 30 /* when advertising */
114 #define CHECK_QUIET_INTERVAL 300 /* when not */
117 * Limit the seconds in the timeval structure "s" to "l" seconds, but only
118 * if l is less than the current seconds in s. This is used to shorten
119 * certain timers to ensure that scheduled events occur sooner than
120 * originally scheduled.
122 #define LIM_SEC(s, l) ((s).tv_sec = MIN((s).tv_sec, (l)))
125 * Metric used for fake default routes. It ought to be 15, but when
126 * processing advertised routes, previous versions of `routed` added
127 * to the received metric and discarded the route if the total was 16
130 #define FAKE_METRIC (HOPCNT_INFINITY-2)
133 /* Router Discovery parameters */
134 #define MAX_MAXADVERTISEINTERVAL 1800
135 #define MIN_MAXADVERTISEINTERVAL 4
136 #define DEF_MAXADVERTISEINTERVAL 600
137 #define DEF_PREFERENCELEVEL 0
138 #define MIN_PREFERENCELEVEL 0x80000000
140 #define MAX_INITIAL_ADVERT_INTERVAL 16
141 #define MAX_INITIAL_ADVERTS 3
142 #define MAX_RESPONSE_DELAY 2
144 #define MAX_SOLICITATION_DELAY 1
145 #define SOLICITATION_INTERVAL 3
146 #define MAX_SOLICITATIONS 3
149 * convert between signed, balanced around zero,
150 * and unsigned zero-based preferences
152 #define SIGN_PREF(p) ((p) ^ MIN_PREFERENCELEVEL)
153 #define UNSIGN_PREF(p) SIGN_PREF(p)
156 * Bloated packet size for systems that simply add authentication to
159 #define OVER_MAXPACKETSIZE (MAXPACKETSIZE+sizeof (struct netinfo)*2)
160 /* typical packet buffers */
162 uint8_t packet
[OVER_MAXPACKETSIZE
*2];
166 extern struct dr
*drs
;
169 * IF_NAME_LEN is the maximum size of interface names represented within
170 * in.routed. Regular Solaris interfaces have names of at most LIFNAMESIZ
171 * characters, but in.routed has remote interfaces represented internally
172 * as "remote(<gatewayname>)", where <gatewayname> is a hostname or IP
173 * address. IF_NAME_LEN needs to be large enough to also hold such
174 * interface names as well.
176 #define IF_NAME_LEN (MAXHOSTNAMELEN + sizeof ("remote()") + 1)
179 * No more routes than this, to protect ourself in case something goes
180 * whacko and starts broadcasting zillions of bogus routes.
182 #define MAX_ROUTES (128*1024)
185 RO_NONE
, /* empty slot */
186 RO_RIP
, /* learnt from RIP */
187 RO_RDISC
, /* learnt from RDISC */
188 RO_STATIC
, /* learnt from kernel */
189 RO_LOOPBCK
, /* loopback route */
190 RO_PTOPT
, /* point-to-point route */
191 RO_NET_SYN
, /* fake net route for subnet */
192 RO_IF
, /* interface route */
193 RO_FILE
/* from /etc/gateways */
197 * Main, daemon routing table structure
200 struct interface
*rts_ifp
;
201 uint32_t rts_gate
; /* forward packets here */
202 uint32_t rts_router
; /* on this router's authority */
204 enum origin rts_origin
;
206 time_t rts_time
; /* timer to junk stale routes */
207 uint32_t rts_de_ag
; /* de-aggregation level */
211 #define RTS_EXTERNAL 0x0001 /* handled by other routing protocol e.g. EGP */
213 #define EMPTY_RT_SPARE { NULL, 0, 0, HOPCNT_INFINITY, RO_NONE, 0, 0, 0, 0 }
216 struct radix_node rt_nodes
[2]; /* radix tree glue */
217 struct sockaddr_in rt_dst_sock
;
218 time_t rt_poison_time
; /* advertised metric */
220 uint32_t rt_seqno
; /* when last changed */
222 #define RS_IF 0x0001 /* for network interface */
223 #define RS_NET_INT 0x0002 /* authority route */
224 #define RS_NET_SYN 0x0004 /* fake net route for subnet */
225 #define RS_NO_NET_SYN (RS_LOCAL | RS_IF)
226 #define RS_SUBNET 0x0008 /* subnet route from any source */
227 #define RS_LOCAL 0x0010 /* loopback for pt-to-pt */
228 #define RS_MHOME 0x0020 /* from -m */
229 #define RS_STATIC 0x0040 /* from the kernel */
230 #define RS_NOPROPAGATE 0x0080 /* route which must not be propagated */
231 #define RS_BADIF 0x0100 /* route through dead ifp */
233 uint8_t rt_poison_metric
; /* to notice maximum recently */
234 uint_t rt_num_spares
;
235 struct rt_spare
*rt_spares
;
237 #define rt_dst rt_dst_sock.sin_addr.s_addr
238 #define rt_ifp rt_spares[0].rts_ifp
239 #define rt_gate rt_spares[0].rts_gate
240 #define rt_router rt_spares[0].rts_router
241 #define rt_metric rt_spares[0].rts_metric
242 #define rt_tag rt_spares[0].rts_tag
243 #define rt_time rt_spares[0].rts_time
244 #define rt_de_ag rt_spares[0].rts_de_ag
246 #define HOST_MASK 0xffffffffU
247 #define RT_ISHOST(rt) ((rt)->rt_mask == HOST_MASK)
250 * Determine if a route should be aged. Age all routes that are:
251 * Not from -g, -m, nor static routes from the kernel
252 * not unbroken interface routes but not broken interfaces
253 * not learnt from RDISC or from /etc/gateways
254 * nor non-passive, remote interfaces that are not aliases
255 * (i.e. remote & metric=0)
257 #define AGE_RT(rt_state, rts_origin, ifp) \
258 ((!((rt_state) & (RS_MHOME | RS_STATIC | RS_NET_SYN)) && \
259 (rts_origin != RO_RDISC) && \
260 (rts_origin != RO_FILE)) && \
261 (!((rt_state) & RS_IF) || \
263 (((ifp)->int_state & IS_REMOTE) && \
264 !((ifp)->int_state & IS_PASSIVE))))
267 * true if A is better than B
269 * - A is not a poisoned route
270 * - and A is not stale
272 * - A has a shorter path
273 * - or the router is speaking for itself
274 * - or B has the same metric and isn't stale
275 * - or A is a host route advertised by a system for itself
277 #define BETTER_LINK(rt, A, B) ((A)->rts_metric < HOPCNT_INFINITY && \
278 now_stale <= (A)->rts_time && \
279 ((A)->rts_metric < (B)->rts_metric || \
280 ((A)->rts_gate == (A)->rts_router && \
281 (B)->rts_gate != (B)->rts_router) || \
282 ((A)->rts_metric == (B)->rts_metric && \
283 now_stale > (B)->rts_time) || \
285 (rt)->rt_dst == (A)->rts_router && \
286 (A)->rts_metric == (B)->rts_metric)))
294 * A "physical_interface" represents the actual hardware. It is also
295 * a container for a list of the interfaces that have the same ifIndex
296 * number. This will consist of zero or one "main" interface plus
297 * zero or more IS_ALIAS interfaces.
299 struct physical_interface
{
300 struct hlinkage phyi_link
;
302 struct interface
*phyi_interface
;
304 uint32_t ipackets
; /* previous network stats */
308 time_t ts
; /* timestamp on network stats */
310 char phyi_name
[IF_NAME_LEN
+1];
314 * An "interface" is similar to a kernel ifnet structure, except it also
315 * handles "logical" or "IS_REMOTE" interfaces (remote gateways).
319 * We keep interfaces in a variety of data structures to
320 * optimize for different types of searches.
322 struct hlinkage int_link
;
323 #define int_next int_link.hl_next
324 struct hlinkage int_ahash
; /* by address */
325 struct hlinkage int_bhash
; /* by broadcast address */
326 struct hlinkage int_nhash
; /* by name */
327 struct hlinkage int_ilist
; /* ifIndex list */
328 struct physical_interface
*int_phys
; /* backpointer */
329 char int_name
[IF_NAME_LEN
+1];
330 in_addr_t int_addr
; /* address on this host (net order) */
331 in_addr_t int_brdaddr
; /* broadcast address (n) */
332 in_addr_t int_dstaddr
; /* other end of pt-to-pt link (n) */
333 in_addr_t int_net
; /* working network # (host order) */
334 in_addr_t int_mask
; /* working net mask (host order) */
335 in_addr_t int_ripv1_mask
; /* for inferring a mask (n) */
336 in_addr_t int_std_addr
; /* class A/B/C address (n) */
337 in_addr_t int_std_net
; /* class A/B/C network (h) */
338 in_addr_t int_std_mask
; /* class A/B/C netmask (h) */
339 in_addr_t int_ripout_addr
; /* RIP pkts sent to this addr */
340 uint64_t int_if_flags
; /* some bits copied from kernel */
342 time_t int_act_time
; /* last thought healthy (IS_REMOTE) */
343 time_t int_query_time
; /* last query (IS_REMOTE) */
344 uint32_t int_transitions
; /* times gone up-down */
346 uint8_t int_d_metric
; /* for faked default route */
347 #define MAX_AUTH_KEYS 5
348 struct auth
{ /* authentication info */
352 * Although the following key is just an array of bytes,
353 * in.routed is currently limited to ascii characters
354 * because of its configuration syntax and parsing.
356 uint8_t key
[RIP_AUTH_PW_LEN
+1];
359 } int_auth
[MAX_AUTH_KEYS
];
360 /* router discovery parameters */
361 int int_rdisc_pref
; /* signed preference to advertise */
362 uint32_t int_rdisc_int
; /* MaxAdvertiseInterval */
363 uint32_t int_rdisc_cnt
;
364 struct timeval int_rdisc_timer
;
367 /* bits in int_state */
368 #define IS_ALIAS 0x00000001 /* interface alias */
369 #define IS_SUBNET 0x00000002 /* interface on subnetted network */
370 #define IS_REMOTE 0x00000004 /* interface is not on this machine */
371 #define IS_PASSIVE 0x00000008 /* remote and does not do RIP */
372 #define IS_EXTERNAL 0x00000010 /* handled by EGP or something */
373 #define IS_CHECKED 0x00000020 /* still exists */
374 #define IS_ALL_HOSTS 0x00000040 /* in INADDR_ALLHOSTS_GROUP */
375 #define IS_ALL_ROUTERS 0x00000080 /* in INADDR_ALLROUTERS_GROUP */
376 #define IS_DISTRUST 0x00000100 /* ignore untrusted routers */
377 #define IS_REDIRECT_OK 0x00000200 /* accept ICMP redirects */
378 #define IS_BROKE 0x00000400 /* seems to be broken */
379 #define IS_SICK 0x00000800 /* seems to be broken */
380 #define IS_DUP 0x00001000 /* duplicates another interface */
381 #define IS_NEED_NET_SYN 0x00002000 /* need RS_NET_SYN route */
382 #define IS_NO_AG 0x00004000 /* do not aggregate subnets */
383 #define IS_NO_SUPER_AG 0x00008000 /* do not aggregate networks */
384 #define IS_NO_RIPV1_IN 0x00010000 /* no RIPv1 input at all */
385 #define IS_NO_RIPV2_IN 0x00020000 /* no RIPv2 input at all */
386 #define IS_NO_RIP_IN (IS_NO_RIPV1_IN | IS_NO_RIPV2_IN)
387 #define IS_RIP_IN_OFF(s) (((s) & IS_NO_RIP_IN) == IS_NO_RIP_IN)
388 #define IS_NO_RIPV1_OUT 0x00040000 /* no RIPv1 output at all */
389 #define IS_NO_RIPV2_OUT 0x00080000 /* no RIPv2 output at all */
390 #define IS_NO_RIP_OUT (IS_NO_RIPV1_OUT | IS_NO_RIPV2_OUT)
391 #define IS_NO_RIP (IS_NO_RIP_OUT | IS_NO_RIP_IN)
392 #define IS_RIP_OUT_OFF(s) (((s) & IS_NO_RIP_OUT) == IS_NO_RIP_OUT)
393 #define IS_RIP_OFF(s) (((s) & IS_NO_RIP) == IS_NO_RIP)
394 #define IS_NO_RIP_MCAST 0x00100000 /* broadcast RIPv2 */
395 #define IS_NO_ADV_IN 0x00200000 /* do not listen to advertisements */
396 #define IS_NO_SOL_OUT 0x00400000 /* send no solicitations */
397 #define IS_SOL_OUT 0x00800000 /* send solicitations */
398 #define GROUP_IS_SOL_OUT (IS_SOL_OUT | IS_NO_SOL_OUT)
399 #define IS_NO_ADV_OUT 0x01000000 /* do not advertise rdisc */
400 #define IS_ADV_OUT 0x02000000 /* advertise rdisc */
401 #define GROUP_IS_ADV_OUT (IS_NO_ADV_OUT | IS_ADV_OUT)
402 #define IS_BCAST_RDISC 0x04000000 /* broadcast instead of multicast */
403 #define IS_NO_RDISC (IS_NO_ADV_IN | IS_NO_SOL_OUT | IS_NO_ADV_OUT)
404 #define IS_PM_RDISC 0x08000000 /* poor-man's router discovery */
405 #define IS_NO_HOST 0x10000000 /* disallow host routes */
406 #define IS_SUPPRESS_RDISC 0x20000000 /* don't send rdisc advs */
407 #define IS_FLUSH_RDISC 0x40000000 /* flush client rdisc caches */
410 * passive interfaces are added through gwkludge
412 #define IS_PASSIVE_IFP(ifp) \
413 (((ifp)->int_state & (IS_REMOTE|IS_PASSIVE|IS_EXTERNAL|IS_ALIAS)) == \
414 (IS_REMOTE|IS_PASSIVE))
417 * Is an IP interface up?
419 #define IS_IFF_UP(f) (((f) & (IFF_UP|IFF_RUNNING)) == (IFF_UP|IFF_RUNNING))
422 * This defines interfaces that we should not use for advertising or
423 * soliciting routes by way of RIP and rdisc. Interfaces marked this
424 * way do not count for purposes of determining how many interfaces
427 #define IS_IFF_QUIET(f) ((f) & (IFF_LOOPBACK|IFF_NORTEXCH|IFF_NOXMIT))
430 * This defines interfaces that we can use for advertising routes by way of
433 #define IS_IFF_ROUTING(f) \
434 (((f) & IFF_ROUTER) && !((f) & (IFF_NORTEXCH|IFF_NOXMIT)))
436 /* Information for aggregating routes */
437 #define NUM_AG_SLOTS 32
439 struct ag_info
*ag_fine
; /* slot with finer netmask */
440 struct ag_info
*ag_cors
; /* more coarse netmask */
441 in_addr_t ag_dst_h
; /* destination in host byte order */
444 struct interface
*ag_ifp
;
446 uint8_t ag_metric
; /* metric to be advertised */
447 uint8_t ag_pref
; /* aggregate based on this */
451 #define AGS_SUPPRESS 0x001 /* combine with coarser mask */
452 #define AGS_AGGREGATE 0x002 /* synthesize combined routes */
453 #define AGS_REDUN0 0x004 /* redundant, finer routes output */
454 #define AGS_REDUN1 0x008
455 #define AG_IS_REDUN(state) (((state) & (AGS_REDUN0 | AGS_REDUN1)) \
456 == (AGS_REDUN0 | AGS_REDUN1))
457 #define AGS_GATEWAY 0x010 /* tell kernel RTF_GATEWAY */
458 #define AGS_IF 0x020 /* for an interface */
459 #define AGS_RIPV2 0x040 /* send only as RIPv2 */
460 #define AGS_FINE_GATE 0x080 /* ignore differing ag_gate when */
461 /* this has the finer netmask */
462 #define AGS_CORS_GATE 0x100 /* ignore differing gate when this */
463 /* has the coarser netmasks */
464 #define AGS_SPLIT_HZ 0x200 /* suppress for split horizon */
465 #define AGS_PASSIVE 0x400 /* passive "remote" interface route */
466 #define AGS_FILE 0x800 /* from /etc/gateways */
468 /* some bits are set if they are set on either route */
469 #define AGS_AGGREGATE_EITHER (AGS_RIPV2 | AGS_GATEWAY | \
470 AGS_SUPPRESS | AGS_CORS_GATE)
474 struct khash
*k_next
;
478 struct interface
*k_ifp
;
480 ushort_t k_state
; /* KS_* */
482 time_t k_redirect_time
; /* when redirected route 1st seen */
485 /* bit flags for k_state; shared between table.c and trace.c */
486 #define KS_NEW 0x0001
487 #define KS_DELETE 0x0002 /* need to delete the route */
488 #define KS_ADD 0x0004 /* add to the kernel */
489 #define KS_CHANGE 0x0008 /* tell kernel to change the route */
490 #define KS_DEL_ADD 0x0010 /* delete & add to change the kernel */
491 #define KS_STATIC 0x0020 /* Static flag in kernel */
492 #define KS_GATEWAY 0x0040 /* G flag in kernel */
493 #define KS_DYNAMIC 0x0080 /* result of redirect */
494 #define KS_DELETED 0x0100 /* already deleted from kernel */
495 #define KS_PRIVATE 0x0200 /* Private flag in kernel */
496 #define KS_CHECK 0x0400
497 #define KS_IF 0x0800 /* interface route */
498 #define KS_PASSIVE 0x1000 /* passive remote interface route */
499 #define KS_DEPRE_IF 0x2000 /* IPMP deprecated interface route */
500 #define KS_FILE 0x4000 /* from /etc/gateways */
502 /* default router structure */
503 struct dr
{ /* accumulated advertisements */
504 struct interface
*dr_ifp
;
505 in_addr_t dr_gate
; /* gateway */
506 time_t dr_ts
; /* when received */
507 time_t dr_life
; /* lifetime in host byte order */
508 uint32_t dr_recv_pref
; /* received but biased preference */
509 uint32_t dr_pref
; /* preference adjusted by metric */
511 #define DR_CHANGED 1 /* received new info for known dr */
514 /* parameters for interfaces */
516 struct parm
*parm_next
;
519 in_addr_t parm_ripout_addr
;
520 uint32_t parm_int_state
;
521 int32_t parm_rdisc_pref
; /* signed IRDP preference */
522 uint32_t parm_rdisc_int
; /* IRDP advertising interval */
523 struct auth parm_auth
[MAX_AUTH_KEYS
];
524 char parm_name
[IF_NAME_LEN
+1];
525 uint8_t parm_d_metric
;
528 /* authority for internal networks */
529 extern struct intnet
{
530 struct intnet
*intnet_next
;
531 in_addr_t intnet_addr
; /* network byte order */
532 in_addr_t intnet_mask
;
533 int8_t intnet_metric
;
537 * Defined RIPv1 netmasks. These come from ripv1_mask entries in
538 * /etc/gateways of the form:
540 * ripv1_mask=<net>/<match>,<mask>
542 * The intended use of these structures is to give RIPv1 destinations which
543 * are in <net>/<match> a netmask of <mask>, where <mask> > <match>.
545 extern struct r1net
{
546 struct r1net
*r1net_next
;
547 in_addr_t r1net_net
; /* host order */
548 in_addr_t r1net_match
;
549 in_addr_t r1net_mask
;
552 /* trusted routers */
553 extern struct tgate
{
554 struct tgate
*tgate_next
;
555 in_addr_t tgate_addr
;
556 #define MAX_TGATE_NETS 32
558 in_addr_t net
; /* host order */
560 } tgate_nets
[MAX_TGATE_NETS
];
563 enum output_type
{OUT_QUERY
, OUT_UNICAST
, OUT_BROADCAST
, OUT_MULTICAST
,
564 NO_OUT_MULTICAST
, NO_OUT_RIPV2
};
566 /* common output buffers */
567 extern struct ws_buf
{
570 struct netinfo
*base
;
572 enum output_type type
;
575 extern int stopint
; /* !=0 to stop in.routed */
577 extern int rip_sock
; /* RIP socket */
578 extern struct interface
*rip_sock_interface
; /* current output interface */
579 extern int rt_sock
; /* routing socket */
580 extern int rdisc_sock
; /* router-discovery raw socket */
581 extern int rdisc_mib_sock
; /* AF_UNIX mib info socket */
583 extern boolean_t rip_enabled
; /* is rip on? */
584 extern boolean_t supplier
; /* process should supply updates */
585 extern boolean_t supplier_set
; /* -s or -q requested */
586 extern boolean_t save_space
; /* -S option 1=treat all RIP speakers */
587 extern boolean_t ridhosts
; /* 1=reduce host routes */
588 extern boolean_t mhome
; /* 1=want multi-homed host route */
589 extern boolean_t advertise_mhome
; /* 1=must continue advertising it */
590 extern boolean_t auth_ok
; /* 1=ignore auth if we do not care */
591 extern boolean_t no_install
; /* 1=don't install in kernel */
593 extern struct timeval clk
; /* system clock's idea of time */
594 extern struct timeval epoch
; /* system clock when started */
595 extern struct timeval now
; /* current idea of time */
596 extern time_t now_stale
;
597 extern time_t now_expire
;
598 extern time_t now_garbage
;
600 extern struct timeval age_timer
; /* next check of old routes */
601 extern struct timeval no_flash
; /* inhibit flash update until then */
602 extern struct timeval rdisc_timer
; /* next advert. or solicitation */
603 extern boolean_t rdisc_ok
; /* using solicited route */
605 extern struct timeval ifscan_timer
; /* time to check interfaces */
607 extern in_addr_t loopaddr
; /* our address on loopback */
608 extern uint_t tot_interfaces
; /* # of remote and local interfaces */
609 extern uint_t rip_interfaces
; /* # of interfaces doing RIP */
610 extern uint_t ripout_interfaces
; /* # of interfaces advertising RIP */
611 extern uint_t fwd_interfaces
; /* # of interfaces ip_forwarding=1 */
612 extern struct interface
*ifnet
; /* all interfaces */
613 extern size_t hash_table_sizes
[]; /* list of primes for hash tables */
614 extern boolean_t have_ripv1_out
; /* have a RIPv1 interface */
615 extern boolean_t need_flash
; /* flash update needed */
616 extern struct timeval need_kern
; /* need to update kernel table */
617 extern uint32_t update_seqno
; /* a route has changed */
618 extern struct interface dummy_ifp
; /* wildcard interface */
620 extern int tracelevel
, new_tracelevel
;
621 #define MAX_TRACELEVEL 5
622 #define TRACERTS (tracelevel >= 5) /* log routing socket contents */
623 #define TRACEKERNEL (tracelevel >= 4) /* log kernel changes */
624 #define TRACECONTENTS (tracelevel >= 3) /* display packet contents */
625 #define TRACEPACKETS (tracelevel >= 2) /* note packets */
626 #define TRACEACTIONS (tracelevel != 0)
627 extern FILE *ftrace
; /* output trace file */
628 extern char inittracename
[MAXPATHLEN
+1];
630 extern struct radix_node_head
*rhead
;
632 extern void fix_sock(int, const char *);
633 extern void fix_select(void);
634 extern void rip_off(void);
635 extern void rip_on(struct interface
*);
637 extern void bufinit(void);
638 extern int output(enum output_type
, struct sockaddr_in
*,
639 struct interface
*, struct rip
*, int);
640 extern void clr_ws_buf(struct ws_buf
*, struct auth
*);
641 extern void rip_query(void);
642 extern void rip_bcast(int);
643 extern void supply(struct sockaddr_in
*, struct interface
*,
644 enum output_type
, int, int, boolean_t
);
646 extern void msglog(const char *, ...);
647 extern void writelog(int, const char *, ...);
653 #define MSG_SUBJECT_N 8
654 } subs
[MSG_SUBJECT_N
];
656 extern void msglim(struct msg_limit
*, in_addr_t
, const char *, ...);
657 #define LOGERR(msg) msglog(msg ": %s", rip_strerror(errno))
658 extern void logbad(boolean_t
, const char *, ...);
659 #define BADERR(dump, msg) logbad(dump, msg ": %s", rip_strerror(errno))
661 #define DBGERR(dump, msg) BADERR(dump, msg)
663 #define DBGERR(dump, msg) LOGERR(msg)
665 extern char *naddr_ntoa(in_addr_t
);
666 extern const char *saddr_ntoa(struct sockaddr_storage
*);
667 extern const char *rip_strerror(int errnum
);
668 extern char *if_bit_string(uint_t
, boolean_t
);
670 extern void *rtmalloc(size_t, const char *);
671 extern void timevaladd(struct timeval
*, struct timeval
*);
672 extern void intvl_random(struct timeval
*, ulong_t
, ulong_t
);
673 extern boolean_t
getnet(const char *, in_addr_t
*, in_addr_t
*);
674 extern int gethost(char *, in_addr_t
*);
675 extern void gwkludge(void);
676 extern const char *parse_parms(char *, boolean_t
);
677 extern const char *insert_parm(struct parm
*);
678 extern void get_parms(struct interface
*);
680 extern void lastlog(void);
681 extern void trace_close(int);
682 extern void set_tracefile(const char *, const char *, int);
683 extern void tracelevel_msg(const char *, int);
684 extern void trace_off(const char *, ...);
685 extern void set_tracelevel(void);
686 extern void trace_flush(void);
687 extern void trace_misc(const char *, ...);
688 extern void trace_act(const char *, ...);
689 extern void trace_pkt(const char *, ...);
690 extern void trace_add_del(const char *, struct rt_entry
*);
691 extern void trace_change(struct rt_entry
*, uint16_t, struct rt_spare
*,
693 extern void trace_if(const char *, struct interface
*);
694 extern void trace_khash(const struct khash
*);
695 extern void trace_dr(const struct dr
*);
696 extern void trace_upslot(struct rt_entry
*, struct rt_spare
*,
698 extern void trace_rip(const char *, const char *, struct sockaddr_in
*,
699 struct interface
*, struct rip
*, int);
700 extern char *addrname(in_addr_t
, in_addr_t
, int);
701 extern char *rtname(in_addr_t
, in_addr_t
, in_addr_t
);
703 extern void rdisc_age(in_addr_t
);
704 extern void set_rdisc_mg(struct interface
*, int);
705 extern void set_supplier(void);
706 extern void if_bad_rdisc(struct interface
*);
707 extern void if_rewire_rdisc(struct interface
*, struct interface
*);
708 extern void if_ok_rdisc(struct interface
*);
709 extern int read_rip(void);
710 extern void input_route(in_addr_t
, in_addr_t
, struct rt_spare
*,
711 struct netinfo
*, uint16_t);
712 extern void read_rt(void);
713 extern void read_d(void);
714 extern void process_d_mib_sock(void);
715 extern void rdisc_adv(boolean_t
);
716 extern void rdisc_sol(void);
717 extern struct interface
*receiving_interface(struct msghdr
*, boolean_t
);
718 extern void *find_ancillary(struct msghdr
*, int);
719 extern boolean_t
should_supply(struct interface
*);
720 extern void rdisc_dump(void);
721 extern void rdisc_suppress(struct interface
*);
722 extern void rdisc_restore(struct interface
*);
724 extern void age_peer_info(void);
726 extern void sigtrace_more(int);
727 extern void sigtrace_less(int);
728 extern void sigtrace_dump(int);
730 extern void sync_kern(void);
731 extern void age(in_addr_t
);
732 extern void kern_dump(void);
733 extern void kern_flush_ifp(struct interface
*);
734 extern void kern_rewire_ifp(struct interface
*, struct interface
*);
736 extern void ag_flush(in_addr_t
, in_addr_t
, void (*)(struct ag_info
*));
737 extern void ag_check(in_addr_t
, in_addr_t
, in_addr_t
, struct interface
*,
738 in_addr_t
, uint8_t, uint8_t, uint32_t, uint16_t, uint16_t,
739 void (*)(struct ag_info
*));
740 extern void del_static(in_addr_t
, in_addr_t
, in_addr_t
,
741 struct interface
*, int);
742 extern void del_redirects(in_addr_t
, time_t);
743 extern struct rt_entry
*rtget(in_addr_t
, in_addr_t
);
744 extern struct rt_entry
*rtfind(in_addr_t
);
745 extern void rtinit(void);
746 extern void rtadd(in_addr_t
, in_addr_t
, uint16_t, struct rt_spare
*);
747 extern void rtchange(struct rt_entry
*, uint16_t, struct rt_spare
*,
749 extern void rtdelete(struct rt_entry
*);
750 extern void rts_delete(struct rt_entry
*, struct rt_spare
*);
751 extern void rtbad_sub(struct rt_entry
*, struct interface
*);
752 extern void rtswitch(struct rt_entry
*, struct rt_spare
*);
754 #define S_ADDR(x) (((struct sockaddr_in *)(x))->sin_addr.s_addr)
755 #define INFO_DST(I) ((I)->rti_info[RTAX_DST])
756 #define INFO_GATE(I) ((I)->rti_info[RTAX_GATEWAY])
757 #define INFO_MASK(I) ((I)->rti_info[RTAX_NETMASK])
758 #define INFO_AUTHOR(I) ((I)->rti_info[RTAX_AUTHOR])
761 struct interface
*if_old
;
762 struct interface
*if_new
;
766 extern char *qstring(const uchar_t
*, int);
767 extern in_addr_t
std_mask(in_addr_t
);
768 extern int parse_quote(char **, const char *, char *, char *, int);
769 extern in_addr_t
ripv1_mask_net(in_addr_t
, const struct interface
*);
770 extern in_addr_t
ripv1_mask_host(in_addr_t
, const struct interface
*);
771 #define on_net(a, net, mask) (((ntohl(a) ^ (net)) & (mask)) == 0)
772 extern boolean_t
check_dst(in_addr_t
);
773 extern boolean_t
remote_address_ok(struct interface
*, in_addr_t
);
774 extern struct interface
*check_dup(const char *, in_addr_t
, in_addr_t
,
775 in_addr_t
, uint64_t, boolean_t
);
776 extern boolean_t
check_remote(struct interface
*);
777 extern void iftbl_alloc(void);
778 extern void ifscan(void);
779 extern int walk_bad(struct radix_node
*, void *);
780 extern int walk_rewire(struct radix_node
*, void *);
781 extern void if_ok(struct interface
*, const char *, boolean_t
);
782 extern void if_sick(struct interface
*, boolean_t
);
783 extern void if_link(struct interface
*, uint32_t);
784 extern struct interface
*ifwithaddr(in_addr_t
, boolean_t
, boolean_t
);
785 extern struct interface
*ifwithindex(ulong_t
, boolean_t
);
786 extern struct interface
*ifwithname(const char *);
787 extern struct physical_interface
*phys_byname(const char *);
788 extern boolean_t
addr_on_ifp(in_addr_t
, struct interface
*,
789 struct interface
**);
790 extern struct interface
*findremoteif(in_addr_t
);
791 extern struct interface
*findifaddr(in_addr_t
);
792 extern struct interface
*iflookup(in_addr_t
);
793 extern struct auth
*find_auth(struct interface
*);
794 extern void end_md5_auth(struct ws_buf
*, struct auth
*);
795 extern void rip_mcast_on(struct interface
*);
796 extern void rip_mcast_off(struct interface
*);
797 extern void trace_dump();
798 extern int sendtoif(int, const void *, uint_t
, uint_t
, struct sockaddr_in
*,