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