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