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