2 /* $KAME: rtadvd.h,v 1.26 2003/08/05 12:34:23 itojun Exp $ */
5 * SPDX-License-Identifier: BSD-3-Clause
7 * Copyright (C) 1998 WIDE Project.
8 * Copyright (C) 2011 Hiroki Sato <hrs@FreeBSD.org>
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
14 * 1. Redistributions of source code must retain the above copyright
15 * notice, this list of conditions and the following disclaimer.
16 * 2. Redistributions in binary form must reproduce the above copyright
17 * notice, this list of conditions and the following disclaimer in the
18 * documentation and/or other materials provided with the distribution.
19 * 3. Neither the name of the project nor the names of its contributors
20 * may be used to endorse or promote products derived from this software
21 * without specific prior written permission.
23 * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26 * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
27 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
36 #define ELM_MALLOC(p,error_action) \
38 p = malloc(sizeof(*p)); \
40 syslog(LOG_ERR, "<%s> malloc failed: %s", \
41 __func__, strerror(errno)); \
44 memset(p, 0, sizeof(*p)); \
47 #define IN6ADDR_LINKLOCAL_ALLNODES_INIT \
48 {{{ 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
49 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }}}
51 #define IN6ADDR_LINKLOCAL_ALLROUTERS_INIT \
52 {{{ 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
53 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 }}}
55 #define IN6ADDR_SITELOCAL_ALLROUTERS_INIT \
56 {{{ 0xff, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
57 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 }}}
59 extern struct sockaddr_in6 sin6_linklocal_allnodes;
60 extern struct sockaddr_in6 sin6_linklocal_allrouters;
61 extern struct sockaddr_in6 sin6_sitelocal_allrouters;
64 * RFC 3542 API deprecates IPV6_PKTINFO in favor of
67 #ifndef IPV6_RECVPKTINFO
69 #define IPV6_RECVPKTINFO IPV6_PKTINFO
74 * RFC 3542 API deprecates IPV6_HOPLIMIT in favor of
77 #ifndef IPV6_RECVHOPLIMIT
79 #define IPV6_RECVHOPLIMIT IPV6_HOPLIMIT
83 /* protocol constants and default values */
84 #define DEF_MAXRTRADVINTERVAL 600
85 #define DEF_ADVLINKMTU 0
86 #define DEF_ADVREACHABLETIME 0
87 #define DEF_ADVRETRANSTIMER 0
88 #define DEF_ADVCURHOPLIMIT 64
89 #define DEF_ADVVALIDLIFETIME 2592000
90 #define DEF_ADVPREFERREDLIFETIME 604800
92 #define MAXROUTERLIFETIME 9000
93 #define MIN_MAXINTERVAL 4
94 #define MAX_MAXINTERVAL 1800
95 #define MIN_MININTERVAL 3
96 #define MAXREACHABLETIME 3600000
98 #define MAX_INITIAL_RTR_ADVERT_INTERVAL 16
99 #define MAX_INITIAL_RTR_ADVERTISEMENTS 3
100 #define MAX_FINAL_RTR_ADVERTISEMENTS 3
101 #define MIN_DELAY_BETWEEN_RAS 3
102 #define MAX_RA_DELAY_TIME 500000 /* usec */
104 #define PREFIX_FROM_KERNEL 1
105 #define PREFIX_FROM_CONFIG 2
106 #define PREFIX_FROM_DYNAMIC 3
109 TAILQ_ENTRY(prefix) pfx_next;
111 struct rainfo *pfx_rainfo; /* back pointer to the interface */
113 * Expiration timer. This is used when a prefix derived from
114 * the kernel is deleted.
116 struct rtadvd_timer *pfx_timer;
118 uint32_t pfx_validlifetime; /* AdvValidLifetime */
119 uint32_t pfx_vltimeexpire; /* Expiration of vltime */
120 uint32_t pfx_preflifetime; /* AdvPreferredLifetime */
121 uint32_t pfx_pltimeexpire; /* Expiration of pltime */
122 int pfx_onlinkflg; /* bool: AdvOnLinkFlag */
123 int pfx_autoconfflg; /* bool: AdvAutonomousFlag */
125 int pfx_origin; /* From kernel or config */
127 struct in6_addr pfx_prefix;
131 TAILQ_ENTRY(rtinfo) rti_next;
133 uint32_t rti_ltime; /* route lifetime */
134 int rti_rtpref; /* route preference */
136 struct in6_addr rti_prefix;
140 TAILQ_ENTRY(rdnss_addr) ra_next;
142 struct in6_addr ra_dns; /* DNS server entry */
146 TAILQ_ENTRY(rdnss) rd_next;
148 TAILQ_HEAD(, rdnss_addr) rd_list; /* list of DNS servers */
149 uint32_t rd_ltime; /* number of seconds valid */
153 * The maximum length of a domain name in a DNS search list is calculated
154 * by a domain name + length fields per 63 octets + a zero octet at
155 * the tail and adding 8 octet boundary padding.
157 #define _DNAME_LABELENC_MAXLEN \
158 (NI_MAXHOST + (NI_MAXHOST / 64 + 1) + 1)
160 #define DNAME_LABELENC_MAXLEN \
161 (_DNAME_LABELENC_MAXLEN + 8 - _DNAME_LABELENC_MAXLEN % 8)
164 TAILQ_ENTRY(dnssl_addr) da_next;
166 int da_len; /* length of entry */
167 char da_dom[DNAME_LABELENC_MAXLEN]; /* search domain name entry */
171 TAILQ_ENTRY(dnssl) dn_next;
173 TAILQ_HEAD(, dnssl_addr) dn_list; /* list of search domains */
174 uint32_t dn_ltime; /* number of seconds valid */
178 TAILQ_ENTRY(soliciter) sol_next;
180 struct sockaddr_in6 sol_addr;
184 /* pointer for list */
185 TAILQ_ENTRY(rainfo) rai_next;
187 /* interface information */
188 struct ifinfo *rai_ifinfo;
190 int rai_advlinkopt; /* bool: whether include link-layer addr opt */
191 int rai_advifprefix; /* bool: gather IF prefixes? */
193 /* Router configuration variables */
194 uint16_t rai_lifetime; /* AdvDefaultLifetime */
195 uint16_t rai_maxinterval; /* MaxRtrAdvInterval */
196 uint16_t rai_mininterval; /* MinRtrAdvInterval */
197 int rai_managedflg; /* AdvManagedFlag */
198 int rai_otherflg; /* AdvOtherConfigFlag */
199 #ifdef DRAFT_IETF_6MAN_IPV6ONLY_FLAG
200 int rai_ipv6onlyflg; /* AdvIPv6OnlyFlag */
203 int rai_rtpref; /* router preference */
204 uint32_t rai_linkmtu; /* AdvLinkMTU */
205 uint32_t rai_reachabletime; /* AdvReachableTime */
206 uint32_t rai_retranstimer; /* AdvRetransTimer */
207 uint8_t rai_hoplimit; /* AdvCurHopLimit */
209 TAILQ_HEAD(, prefix) rai_prefix;/* AdvPrefixList(link head) */
210 int rai_pfxs; /* number of prefixes */
212 uint16_t rai_clockskew; /* used for consisitency check of lifetimes */
214 TAILQ_HEAD(, rdnss) rai_rdnss; /* DNS server list */
215 TAILQ_HEAD(, dnssl) rai_dnssl; /* search domain list */
216 TAILQ_HEAD(, rtinfo) rai_route; /* route information option (link head) */
217 int rai_routes; /* number of route information options */
218 /* actual RA packet data and its length */
219 size_t rai_ra_datalen;
222 /* info about soliciter */
223 TAILQ_HEAD(, soliciter) rai_soliciter; /* recent solication source */
226 /* RA information list */
227 extern TAILQ_HEAD(railist_head_t, rainfo) railist;
235 * | update_persist_ifinfo()
239 * loadconfig()| |rm_ifinfo(), ra_output()
240 * (MC join)| |(MC leave)
246 * ra_output()| |getconfig()
255 #define IFI_STATE_UNCONFIGURED 0
256 #define IFI_STATE_CONFIGURED 1
257 #define IFI_STATE_TRANSITIVE 2
260 TAILQ_ENTRY(ifinfo) ifi_next;
263 uint16_t ifi_persist;
264 uint16_t ifi_ifindex;
265 char ifi_ifname[IFNAMSIZ];
268 uint32_t ifi_nd_flags;
270 struct sockaddr_dl ifi_sdl;
272 struct rainfo *ifi_rainfo;
273 struct rainfo *ifi_rainfo_trans;
274 uint16_t ifi_burstcount;
275 uint32_t ifi_burstinterval;
276 struct rtadvd_timer *ifi_ra_timer;
277 /* timestamp when the latest RA was sent */
278 struct timespec ifi_ra_lastsent;
279 uint16_t ifi_rs_waitcount;
282 uint64_t ifi_raoutput; /* # of RAs sent */
283 uint64_t ifi_rainput; /* # of RAs received */
284 uint64_t ifi_rainconsistent; /* # of inconsistent recv'd RAs */
285 uint64_t ifi_rsinput; /* # of RSs received */
289 extern TAILQ_HEAD(ifilist_head_t, ifinfo) ifilist;
291 extern char *mcastif;
293 struct rtadvd_timer *ra_timeout(void *);
294 void ra_timer_update(void *, struct timespec *);
295 void ra_output(struct ifinfo *);
297 int prefix_match(struct in6_addr *, int,
298 struct in6_addr *, int);
299 struct ifinfo *if_indextoifinfo(int);
300 struct prefix *find_prefix(struct rainfo *,
301 struct in6_addr *, int);
302 void rtadvd_set_reload(int);
303 void rtadvd_set_shutdown(int);