xref: /minix3/usr.sbin/rtadvd/rtadvd.h (revision 8f957290eb976b379733d0b3811fcb43f8fbaf1a)
1*8f957290SDavid van Moolenbroek /*	$NetBSD: rtadvd.h,v 1.14 2015/06/05 14:09:20 roy Exp $	*/
2*8f957290SDavid van Moolenbroek /*	$KAME: rtadvd.h,v 1.30 2005/10/17 14:40:02 suz Exp $	*/
3*8f957290SDavid van Moolenbroek 
4*8f957290SDavid van Moolenbroek /*
5*8f957290SDavid van Moolenbroek  * Copyright (C) 1998 WIDE Project.
6*8f957290SDavid van Moolenbroek  * All rights reserved.
7*8f957290SDavid van Moolenbroek  *
8*8f957290SDavid van Moolenbroek  * Redistribution and use in source and binary forms, with or without
9*8f957290SDavid van Moolenbroek  * modification, are permitted provided that the following conditions
10*8f957290SDavid van Moolenbroek  * are met:
11*8f957290SDavid van Moolenbroek  * 1. Redistributions of source code must retain the above copyright
12*8f957290SDavid van Moolenbroek  *    notice, this list of conditions and the following disclaimer.
13*8f957290SDavid van Moolenbroek  * 2. Redistributions in binary form must reproduce the above copyright
14*8f957290SDavid van Moolenbroek  *    notice, this list of conditions and the following disclaimer in the
15*8f957290SDavid van Moolenbroek  *    documentation and/or other materials provided with the distribution.
16*8f957290SDavid van Moolenbroek  * 3. Neither the name of the project nor the names of its contributors
17*8f957290SDavid van Moolenbroek  *    may be used to endorse or promote products derived from this software
18*8f957290SDavid van Moolenbroek  *    without specific prior written permission.
19*8f957290SDavid van Moolenbroek  *
20*8f957290SDavid van Moolenbroek  * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
21*8f957290SDavid van Moolenbroek  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22*8f957290SDavid van Moolenbroek  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23*8f957290SDavid van Moolenbroek  * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
24*8f957290SDavid van Moolenbroek  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25*8f957290SDavid van Moolenbroek  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26*8f957290SDavid van Moolenbroek  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27*8f957290SDavid van Moolenbroek  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28*8f957290SDavid van Moolenbroek  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29*8f957290SDavid van Moolenbroek  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30*8f957290SDavid van Moolenbroek  * SUCH DAMAGE.
31*8f957290SDavid van Moolenbroek  */
32*8f957290SDavid van Moolenbroek 
33*8f957290SDavid van Moolenbroek #define RTADVD_USER	"_rtadvd"
34*8f957290SDavid van Moolenbroek 
35*8f957290SDavid van Moolenbroek #define ALLNODES "ff02::1"
36*8f957290SDavid van Moolenbroek #define ALLROUTERS_LINK "ff02::2"
37*8f957290SDavid van Moolenbroek #define ALLROUTERS_SITE "ff05::2"
38*8f957290SDavid van Moolenbroek 
39*8f957290SDavid van Moolenbroek #define IN6ADDR_SITELOCAL_ALLROUTERS_INIT \
40*8f957290SDavid van Moolenbroek 	{{{ 0xff, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
41*8f957290SDavid van Moolenbroek  	    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 }}}
42*8f957290SDavid van Moolenbroek 
43*8f957290SDavid van Moolenbroek //extern struct sockaddr_in6 sin6_linklocal_allnodes;
44*8f957290SDavid van Moolenbroek //extern struct sockaddr_in6 sin6_linklocal_allrouters;
45*8f957290SDavid van Moolenbroek extern struct sockaddr_in6 sin6_sitelocal_allrouters;
46*8f957290SDavid van Moolenbroek 
47*8f957290SDavid van Moolenbroek /* protocol constants and default values */
48*8f957290SDavid van Moolenbroek #define DEF_MAXRTRADVINTERVAL 600
49*8f957290SDavid van Moolenbroek #define DEF_ADVLINKMTU 0
50*8f957290SDavid van Moolenbroek #define DEF_ADVREACHABLETIME 0
51*8f957290SDavid van Moolenbroek #define DEF_ADVRETRANSTIMER 0
52*8f957290SDavid van Moolenbroek #define DEF_ADVCURHOPLIMIT 64
53*8f957290SDavid van Moolenbroek #define DEF_ADVVALIDLIFETIME 2592000
54*8f957290SDavid van Moolenbroek #define DEF_ADVPREFERREDLIFETIME 604800
55*8f957290SDavid van Moolenbroek 
56*8f957290SDavid van Moolenbroek #define MAXROUTERLIFETIME 9000
57*8f957290SDavid van Moolenbroek #define MIN_MAXINTERVAL 4
58*8f957290SDavid van Moolenbroek #define MAX_MAXINTERVAL 1800
59*8f957290SDavid van Moolenbroek #define MIN_MININTERVAL 3
60*8f957290SDavid van Moolenbroek #define MAXREACHABLETIME 3600000
61*8f957290SDavid van Moolenbroek 
62*8f957290SDavid van Moolenbroek #define MAX_INITIAL_RTR_ADVERT_INTERVAL  16
63*8f957290SDavid van Moolenbroek #define MAX_INITIAL_RTR_ADVERTISEMENTS    3
64*8f957290SDavid van Moolenbroek #define MAX_FINAL_RTR_ADVERTISEMENTS      3
65*8f957290SDavid van Moolenbroek #define MIN_DELAY_BETWEEN_RAS             3
66*8f957290SDavid van Moolenbroek #define MAX_RA_DELAY_TIME                500000000 /* nsec */
67*8f957290SDavid van Moolenbroek 
68*8f957290SDavid van Moolenbroek #define PREFIX_FROM_KERNEL 1
69*8f957290SDavid van Moolenbroek #define PREFIX_FROM_CONFIG 2
70*8f957290SDavid van Moolenbroek #define PREFIX_FROM_DYNAMIC 3
71*8f957290SDavid van Moolenbroek 
72*8f957290SDavid van Moolenbroek struct prefix {
73*8f957290SDavid van Moolenbroek 	TAILQ_ENTRY(prefix) next;
74*8f957290SDavid van Moolenbroek 
75*8f957290SDavid van Moolenbroek 	struct rainfo *rainfo;	/* back pointer to the interface */
76*8f957290SDavid van Moolenbroek 
77*8f957290SDavid van Moolenbroek 	struct rtadvd_timer *timer; /* expiration timer.  used when a prefix
78*8f957290SDavid van Moolenbroek 				     * derived from the kernel is deleted.
79*8f957290SDavid van Moolenbroek 				     */
80*8f957290SDavid van Moolenbroek 
81*8f957290SDavid van Moolenbroek 	uint32_t validlifetime; /* AdvValidLifetime */
82*8f957290SDavid van Moolenbroek 	long	vltimeexpire;	/* expiration of vltime; decrement case only */
83*8f957290SDavid van Moolenbroek 	uint32_t preflifetime;	/* AdvPreferredLifetime */
84*8f957290SDavid van Moolenbroek 	long	pltimeexpire;	/* expiration of pltime; decrement case only */
85*8f957290SDavid van Moolenbroek 	uint16_t onlinkflg;	/* bool: AdvOnLinkFlag */
86*8f957290SDavid van Moolenbroek 	uint16_t autoconfflg;	/* bool: AdvAutonomousFlag */
87*8f957290SDavid van Moolenbroek 	int prefixlen;
88*8f957290SDavid van Moolenbroek 	int origin;		/* from kernel or config */
89*8f957290SDavid van Moolenbroek 	struct in6_addr prefix;
90*8f957290SDavid van Moolenbroek };
91*8f957290SDavid van Moolenbroek 
92*8f957290SDavid van Moolenbroek struct rtinfo {
93*8f957290SDavid van Moolenbroek 	TAILQ_ENTRY(rtinfo) next;
94*8f957290SDavid van Moolenbroek 
95*8f957290SDavid van Moolenbroek 	uint32_t ltime;	/* route lifetime */
96*8f957290SDavid van Moolenbroek 	uint16_t rtpref;		/* route preference */
97*8f957290SDavid van Moolenbroek 	int prefixlen;
98*8f957290SDavid van Moolenbroek 	struct in6_addr prefix;
99*8f957290SDavid van Moolenbroek };
100*8f957290SDavid van Moolenbroek 
101*8f957290SDavid van Moolenbroek struct rdnss_addr {
102*8f957290SDavid van Moolenbroek 	TAILQ_ENTRY(rdnss_addr) next;
103*8f957290SDavid van Moolenbroek 
104*8f957290SDavid van Moolenbroek 	struct in6_addr addr;
105*8f957290SDavid van Moolenbroek };
106*8f957290SDavid van Moolenbroek 
107*8f957290SDavid van Moolenbroek struct rdnss {
108*8f957290SDavid van Moolenbroek 	TAILQ_ENTRY(rdnss) next;
109*8f957290SDavid van Moolenbroek 
110*8f957290SDavid van Moolenbroek 	TAILQ_HEAD(, rdnss_addr) list;
111*8f957290SDavid van Moolenbroek 	uint32_t lifetime;
112*8f957290SDavid van Moolenbroek };
113*8f957290SDavid van Moolenbroek 
114*8f957290SDavid van Moolenbroek struct dnssl_domain {
115*8f957290SDavid van Moolenbroek 	TAILQ_ENTRY(dnssl_domain) next;
116*8f957290SDavid van Moolenbroek 
117*8f957290SDavid van Moolenbroek 	int len;
118*8f957290SDavid van Moolenbroek 	char domain[256];
119*8f957290SDavid van Moolenbroek };
120*8f957290SDavid van Moolenbroek 
121*8f957290SDavid van Moolenbroek struct dnssl {
122*8f957290SDavid van Moolenbroek 	TAILQ_ENTRY(dnssl) next;
123*8f957290SDavid van Moolenbroek 
124*8f957290SDavid van Moolenbroek 	TAILQ_HEAD(, dnssl_domain) list;
125*8f957290SDavid van Moolenbroek 	uint32_t lifetime;
126*8f957290SDavid van Moolenbroek };
127*8f957290SDavid van Moolenbroek 
128*8f957290SDavid van Moolenbroek struct soliciter {
129*8f957290SDavid van Moolenbroek 	TAILQ_ENTRY(soliciter) next;
130*8f957290SDavid van Moolenbroek 
131*8f957290SDavid van Moolenbroek 	struct sockaddr_in6 addr;
132*8f957290SDavid van Moolenbroek };
133*8f957290SDavid van Moolenbroek 
134*8f957290SDavid van Moolenbroek struct	rainfo {
135*8f957290SDavid van Moolenbroek 	TAILQ_ENTRY(rainfo) next;
136*8f957290SDavid van Moolenbroek 
137*8f957290SDavid van Moolenbroek 	/* timer related parameters */
138*8f957290SDavid van Moolenbroek 	struct rtadvd_timer *timer;
139*8f957290SDavid van Moolenbroek 	int initcounter; /* counter for the first few advertisements */
140*8f957290SDavid van Moolenbroek 	struct timespec lastsent; /* timestamp when the latest RA was sent */
141*8f957290SDavid van Moolenbroek 	int waiting;		/* number of RS waiting for RA */
142*8f957290SDavid van Moolenbroek 	struct rainfo *leaving;		/* the config which is leaving */
143*8f957290SDavid van Moolenbroek 	struct rainfo *leaving_for;	/* the new config to activate */
144*8f957290SDavid van Moolenbroek 	int leaving_adv;		/* number of RA left to send */
145*8f957290SDavid van Moolenbroek 
146*8f957290SDavid van Moolenbroek 	/* interface information */
147*8f957290SDavid van Moolenbroek 	uint16_t	ifindex;
148*8f957290SDavid van Moolenbroek 	int		ifflags;
149*8f957290SDavid van Moolenbroek 	int	advlinkopt;	/* bool: whether include link-layer addr opt */
150*8f957290SDavid van Moolenbroek 	struct sockaddr_dl *sdl;
151*8f957290SDavid van Moolenbroek 	char	ifname[16];
152*8f957290SDavid van Moolenbroek 	uint32_t	phymtu;		/* mtu of the physical interface */
153*8f957290SDavid van Moolenbroek 
154*8f957290SDavid van Moolenbroek 	/* Router configuration variables */
155*8f957290SDavid van Moolenbroek 	uint16_t	lifetime;	/* AdvDefaultLifetime */
156*8f957290SDavid van Moolenbroek 	uint16_t	maxinterval;	/* MaxRtrAdvInterval */
157*8f957290SDavid van Moolenbroek 	uint16_t	mininterval;	/* MinRtrAdvInterval */
158*8f957290SDavid van Moolenbroek 	int 	managedflg;	/* AdvManagedFlag */
159*8f957290SDavid van Moolenbroek 	int	otherflg;	/* AdvOtherConfigFlag */
160*8f957290SDavid van Moolenbroek 
161*8f957290SDavid van Moolenbroek 	int	rtpref;		/* router preference */
162*8f957290SDavid van Moolenbroek 	uint32_t linkmtu;	/* AdvLinkMTU */
163*8f957290SDavid van Moolenbroek 	uint32_t reachabletime; /* AdvReachableTime */
164*8f957290SDavid van Moolenbroek 	uint32_t retranstimer;	/* AdvRetransTimer */
165*8f957290SDavid van Moolenbroek 	uint16_t	hoplimit;	/* AdvCurHopLimit */
166*8f957290SDavid van Moolenbroek 	TAILQ_HEAD(, prefix) prefix;	/* AdvPrefixList(link head) */
167*8f957290SDavid van Moolenbroek 	int	pfxs;
168*8f957290SDavid van Moolenbroek 	uint16_t	clockskew;/* used for consisitency check of lifetimes */
169*8f957290SDavid van Moolenbroek 
170*8f957290SDavid van Moolenbroek 	TAILQ_HEAD(, rtinfo) route;
171*8f957290SDavid van Moolenbroek 	TAILQ_HEAD(, rdnss) rdnss;	/* RDNSS list */
172*8f957290SDavid van Moolenbroek 	TAILQ_HEAD(, dnssl) dnssl;	/* DNS Search List */
173*8f957290SDavid van Moolenbroek 
174*8f957290SDavid van Moolenbroek 	/* actual RA packet data and its length */
175*8f957290SDavid van Moolenbroek 	size_t ra_datalen;
176*8f957290SDavid van Moolenbroek 	char *ra_data;
177*8f957290SDavid van Moolenbroek 
178*8f957290SDavid van Moolenbroek 	/* statistics */
179*8f957290SDavid van Moolenbroek 	uint64_t raoutput;	/* number of RAs sent */
180*8f957290SDavid van Moolenbroek 	uint64_t rainput;	/* number of RAs received */
181*8f957290SDavid van Moolenbroek 	uint64_t rainconsistent; /* number of RAs inconsistent with ours */
182*8f957290SDavid van Moolenbroek 	uint64_t rsinput;	/* number of RSs received */
183*8f957290SDavid van Moolenbroek 
184*8f957290SDavid van Moolenbroek 	/* info about soliciter */
185*8f957290SDavid van Moolenbroek 	TAILQ_HEAD(, soliciter) soliciter;	/* recent solication source */
186*8f957290SDavid van Moolenbroek };
187*8f957290SDavid van Moolenbroek 
188*8f957290SDavid van Moolenbroek extern TAILQ_HEAD(ralist_head_t, rainfo) ralist;
189*8f957290SDavid van Moolenbroek 
190*8f957290SDavid van Moolenbroek struct rtadvd_timer *ra_timeout(void *);
191*8f957290SDavid van Moolenbroek void ra_timer_update(void *, struct timespec *);
192*8f957290SDavid van Moolenbroek void ra_timer_set_short_delay(struct rainfo *);
193*8f957290SDavid van Moolenbroek 
194*8f957290SDavid van Moolenbroek int prefix_match(struct in6_addr *, int, struct in6_addr *, int);
195*8f957290SDavid van Moolenbroek struct rainfo *if_indextorainfo(unsigned int);
196*8f957290SDavid van Moolenbroek struct prefix *find_prefix(struct rainfo *, struct in6_addr *, int);
197