1*9f20bfa6SDavid van Moolenbroek /* $NetBSD: ipv6.h,v 1.14 2015/07/09 10:15:34 roy Exp $ */ 2*9f20bfa6SDavid van Moolenbroek 3*9f20bfa6SDavid van Moolenbroek /* 4*9f20bfa6SDavid van Moolenbroek * dhcpcd - DHCP client daemon 5*9f20bfa6SDavid van Moolenbroek * Copyright (c) 2006-2015 Roy Marples <roy@marples.name> 6*9f20bfa6SDavid van Moolenbroek * All rights reserved 7*9f20bfa6SDavid van Moolenbroek 8*9f20bfa6SDavid van Moolenbroek * Redistribution and use in source and binary forms, with or without 9*9f20bfa6SDavid van Moolenbroek * modification, are permitted provided that the following conditions 10*9f20bfa6SDavid van Moolenbroek * are met: 11*9f20bfa6SDavid van Moolenbroek * 1. Redistributions of source code must retain the above copyright 12*9f20bfa6SDavid van Moolenbroek * notice, this list of conditions and the following disclaimer. 13*9f20bfa6SDavid van Moolenbroek * 2. Redistributions in binary form must reproduce the above copyright 14*9f20bfa6SDavid van Moolenbroek * notice, this list of conditions and the following disclaimer in the 15*9f20bfa6SDavid van Moolenbroek * documentation and/or other materials provided with the distribution. 16*9f20bfa6SDavid van Moolenbroek * 17*9f20bfa6SDavid van Moolenbroek * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 18*9f20bfa6SDavid van Moolenbroek * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19*9f20bfa6SDavid van Moolenbroek * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20*9f20bfa6SDavid van Moolenbroek * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 21*9f20bfa6SDavid van Moolenbroek * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22*9f20bfa6SDavid van Moolenbroek * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23*9f20bfa6SDavid van Moolenbroek * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24*9f20bfa6SDavid van Moolenbroek * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25*9f20bfa6SDavid van Moolenbroek * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26*9f20bfa6SDavid van Moolenbroek * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27*9f20bfa6SDavid van Moolenbroek * SUCH DAMAGE. 28*9f20bfa6SDavid van Moolenbroek */ 29*9f20bfa6SDavid van Moolenbroek 30*9f20bfa6SDavid van Moolenbroek #ifndef IPV6_H 31*9f20bfa6SDavid van Moolenbroek #define IPV6_H 32*9f20bfa6SDavid van Moolenbroek 33*9f20bfa6SDavid van Moolenbroek #include <sys/uio.h> 34*9f20bfa6SDavid van Moolenbroek #include <netinet/in.h> 35*9f20bfa6SDavid van Moolenbroek 36*9f20bfa6SDavid van Moolenbroek #ifndef __linux__ 37*9f20bfa6SDavid van Moolenbroek # ifndef __QNX__ 38*9f20bfa6SDavid van Moolenbroek # include <sys/endian.h> 39*9f20bfa6SDavid van Moolenbroek # endif 40*9f20bfa6SDavid van Moolenbroek # include <net/if.h> 41*9f20bfa6SDavid van Moolenbroek # ifdef __FreeBSD__ /* Needed so that including netinet6/in6_var.h works */ 42*9f20bfa6SDavid van Moolenbroek # include <net/if_var.h> 43*9f20bfa6SDavid van Moolenbroek # endif 44*9f20bfa6SDavid van Moolenbroek # ifndef __sun 45*9f20bfa6SDavid van Moolenbroek # include <netinet6/in6_var.h> 46*9f20bfa6SDavid van Moolenbroek # endif 47*9f20bfa6SDavid van Moolenbroek #endif 48*9f20bfa6SDavid van Moolenbroek 49*9f20bfa6SDavid van Moolenbroek #include "config.h" 50*9f20bfa6SDavid van Moolenbroek #include "dhcpcd.h" 51*9f20bfa6SDavid van Moolenbroek 52*9f20bfa6SDavid van Moolenbroek #define ALLROUTERS "ff02::2" 53*9f20bfa6SDavid van Moolenbroek 54*9f20bfa6SDavid van Moolenbroek #define ROUNDUP8(a) (1 + (((a) - 1) | 7)) 55*9f20bfa6SDavid van Moolenbroek #define ROUNDUP16(a) (1 + (((a) - 1) | 16)) 56*9f20bfa6SDavid van Moolenbroek 57*9f20bfa6SDavid van Moolenbroek #define EUI64_GBIT 0x01 58*9f20bfa6SDavid van Moolenbroek #define EUI64_UBIT 0x02 59*9f20bfa6SDavid van Moolenbroek #define EUI64_TO_IFID(in6) do {(in6)->s6_addr[8] ^= EUI64_UBIT; } while (0) 60*9f20bfa6SDavid van Moolenbroek #define EUI64_GROUP(in6) ((in6)->s6_addr[8] & EUI64_GBIT) 61*9f20bfa6SDavid van Moolenbroek 62*9f20bfa6SDavid van Moolenbroek #ifndef ND6_INFINITE_LIFETIME 63*9f20bfa6SDavid van Moolenbroek # define ND6_INFINITE_LIFETIME ((uint32_t)~0) 64*9f20bfa6SDavid van Moolenbroek #endif 65*9f20bfa6SDavid van Moolenbroek 66*9f20bfa6SDavid van Moolenbroek /* RFC4941 constants */ 67*9f20bfa6SDavid van Moolenbroek #define TEMP_VALID_LIFETIME 604800 /* 1 week */ 68*9f20bfa6SDavid van Moolenbroek #define TEMP_PREFERRED_LIFETIME 86400 /* 1 day */ 69*9f20bfa6SDavid van Moolenbroek #define REGEN_ADVANCE 5 /* seconds */ 70*9f20bfa6SDavid van Moolenbroek #define MAX_DESYNC_FACTOR 600 /* 10 minutes */ 71*9f20bfa6SDavid van Moolenbroek 72*9f20bfa6SDavid van Moolenbroek #define TEMP_IDGEN_RETRIES 3 73*9f20bfa6SDavid van Moolenbroek #define GEN_TEMPID_RETRY_MAX 5 74*9f20bfa6SDavid van Moolenbroek 75*9f20bfa6SDavid van Moolenbroek /* RFC7217 constants */ 76*9f20bfa6SDavid van Moolenbroek #define IDGEN_RETRIES 3 77*9f20bfa6SDavid van Moolenbroek #define IDGEN_DELAY 1 /* second */ 78*9f20bfa6SDavid van Moolenbroek 79*9f20bfa6SDavid van Moolenbroek /* 80*9f20bfa6SDavid van Moolenbroek * BSD kernels don't inform userland of DAD results. 81*9f20bfa6SDavid van Moolenbroek * See the discussion here: 82*9f20bfa6SDavid van Moolenbroek * http://mail-index.netbsd.org/tech-net/2013/03/15/msg004019.html 83*9f20bfa6SDavid van Moolenbroek */ 84*9f20bfa6SDavid van Moolenbroek #ifndef __linux__ 85*9f20bfa6SDavid van Moolenbroek /* We guard here to avoid breaking a compile on linux ppc-64 headers */ 86*9f20bfa6SDavid van Moolenbroek # include <sys/param.h> 87*9f20bfa6SDavid van Moolenbroek #endif 88*9f20bfa6SDavid van Moolenbroek #ifdef BSD 89*9f20bfa6SDavid van Moolenbroek # define IPV6_POLLADDRFLAG 90*9f20bfa6SDavid van Moolenbroek #endif 91*9f20bfa6SDavid van Moolenbroek 92*9f20bfa6SDavid van Moolenbroek /* This was fixed in NetBSD */ 93*9f20bfa6SDavid van Moolenbroek #if defined(__NetBSD_Version__) && __NetBSD_Version__ >= 699002000 94*9f20bfa6SDavid van Moolenbroek # undef IPV6_POLLADDRFLAG 95*9f20bfa6SDavid van Moolenbroek #endif 96*9f20bfa6SDavid van Moolenbroek 97*9f20bfa6SDavid van Moolenbroek /* Linux-3.18 can manage temporary addresses even with RA 98*9f20bfa6SDavid van Moolenbroek * processing disabled. */ 99*9f20bfa6SDavid van Moolenbroek //#undef IFA_F_MANAGETEMPADDR 100*9f20bfa6SDavid van Moolenbroek #if defined(__linux__) && defined(IFA_F_MANAGETEMPADDR) 101*9f20bfa6SDavid van Moolenbroek #define IPV6_MANAGETEMPADDR 102*9f20bfa6SDavid van Moolenbroek #endif 103*9f20bfa6SDavid van Moolenbroek 104*9f20bfa6SDavid van Moolenbroek /* Some BSDs do not allow userland to set temporary addresses. */ 105*9f20bfa6SDavid van Moolenbroek #if defined(BSD) && defined(IN6_IFF_TEMPORARY) 106*9f20bfa6SDavid van Moolenbroek #define IPV6_MANAGETEMPADDR 107*9f20bfa6SDavid van Moolenbroek #endif 108*9f20bfa6SDavid van Moolenbroek 109*9f20bfa6SDavid van Moolenbroek struct ipv6_addr { 110*9f20bfa6SDavid van Moolenbroek TAILQ_ENTRY(ipv6_addr) next; 111*9f20bfa6SDavid van Moolenbroek struct interface *iface; 112*9f20bfa6SDavid van Moolenbroek struct in6_addr prefix; 113*9f20bfa6SDavid van Moolenbroek uint8_t prefix_len; 114*9f20bfa6SDavid van Moolenbroek uint32_t prefix_vltime; 115*9f20bfa6SDavid van Moolenbroek uint32_t prefix_pltime; 116*9f20bfa6SDavid van Moolenbroek struct timespec created; 117*9f20bfa6SDavid van Moolenbroek struct timespec acquired; 118*9f20bfa6SDavid van Moolenbroek struct in6_addr addr; 119*9f20bfa6SDavid van Moolenbroek int addr_flags; 120*9f20bfa6SDavid van Moolenbroek short flags; 121*9f20bfa6SDavid van Moolenbroek char saddr[INET6_ADDRSTRLEN]; 122*9f20bfa6SDavid van Moolenbroek uint8_t iaid[4]; 123*9f20bfa6SDavid van Moolenbroek uint16_t ia_type; 124*9f20bfa6SDavid van Moolenbroek struct interface *delegating_iface; 125*9f20bfa6SDavid van Moolenbroek uint8_t prefix_exclude_len; 126*9f20bfa6SDavid van Moolenbroek struct in6_addr prefix_exclude; 127*9f20bfa6SDavid van Moolenbroek 128*9f20bfa6SDavid van Moolenbroek void (*dadcallback)(void *); 129*9f20bfa6SDavid van Moolenbroek int dadcounter; 130*9f20bfa6SDavid van Moolenbroek uint8_t *ns; 131*9f20bfa6SDavid van Moolenbroek size_t nslen; 132*9f20bfa6SDavid van Moolenbroek int nsprobes; 133*9f20bfa6SDavid van Moolenbroek }; 134*9f20bfa6SDavid van Moolenbroek TAILQ_HEAD(ipv6_addrhead, ipv6_addr); 135*9f20bfa6SDavid van Moolenbroek 136*9f20bfa6SDavid van Moolenbroek #define IPV6_AF_ONLINK 0x0001 137*9f20bfa6SDavid van Moolenbroek #define IPV6_AF_NEW 0x0002 138*9f20bfa6SDavid van Moolenbroek #define IPV6_AF_STALE 0x0004 139*9f20bfa6SDavid van Moolenbroek #define IPV6_AF_ADDED 0x0008 140*9f20bfa6SDavid van Moolenbroek #define IPV6_AF_AUTOCONF 0x0010 141*9f20bfa6SDavid van Moolenbroek #define IPV6_AF_DUPLICATED 0x0020 142*9f20bfa6SDavid van Moolenbroek #define IPV6_AF_DADCOMPLETED 0x0040 143*9f20bfa6SDavid van Moolenbroek #define IPV6_AF_DELEGATED 0x0080 144*9f20bfa6SDavid van Moolenbroek #define IPV6_AF_DELEGATEDPFX 0x0100 145*9f20bfa6SDavid van Moolenbroek #define IPV6_AF_DELEGATEDZERO 0x0200 146*9f20bfa6SDavid van Moolenbroek #define IPV6_AF_REQUEST 0x0400 147*9f20bfa6SDavid van Moolenbroek #ifdef IPV6_MANAGETEMPADDR 148*9f20bfa6SDavid van Moolenbroek #define IPV6_AF_TEMPORARY 0X0800 149*9f20bfa6SDavid van Moolenbroek #endif 150*9f20bfa6SDavid van Moolenbroek 151*9f20bfa6SDavid van Moolenbroek struct rt6 { 152*9f20bfa6SDavid van Moolenbroek TAILQ_ENTRY(rt6) next; 153*9f20bfa6SDavid van Moolenbroek struct in6_addr dest; 154*9f20bfa6SDavid van Moolenbroek struct in6_addr net; 155*9f20bfa6SDavid van Moolenbroek struct in6_addr gate; 156*9f20bfa6SDavid van Moolenbroek const struct interface *iface; 157*9f20bfa6SDavid van Moolenbroek unsigned int flags; 158*9f20bfa6SDavid van Moolenbroek #ifdef HAVE_ROUTE_METRIC 159*9f20bfa6SDavid van Moolenbroek unsigned int metric; 160*9f20bfa6SDavid van Moolenbroek #endif 161*9f20bfa6SDavid van Moolenbroek unsigned int mtu; 162*9f20bfa6SDavid van Moolenbroek }; 163*9f20bfa6SDavid van Moolenbroek TAILQ_HEAD(rt6_head, rt6); 164*9f20bfa6SDavid van Moolenbroek 165*9f20bfa6SDavid van Moolenbroek struct ll_callback { 166*9f20bfa6SDavid van Moolenbroek TAILQ_ENTRY(ll_callback) next; 167*9f20bfa6SDavid van Moolenbroek void (*callback)(void *); 168*9f20bfa6SDavid van Moolenbroek void *arg; 169*9f20bfa6SDavid van Moolenbroek }; 170*9f20bfa6SDavid van Moolenbroek TAILQ_HEAD(ll_callback_head, ll_callback); 171*9f20bfa6SDavid van Moolenbroek 172*9f20bfa6SDavid van Moolenbroek struct ipv6_state { 173*9f20bfa6SDavid van Moolenbroek struct ipv6_addrhead addrs; 174*9f20bfa6SDavid van Moolenbroek struct ll_callback_head ll_callbacks; 175*9f20bfa6SDavid van Moolenbroek 176*9f20bfa6SDavid van Moolenbroek #ifdef IPV6_MANAGETEMPADDR 177*9f20bfa6SDavid van Moolenbroek time_t desync_factor; 178*9f20bfa6SDavid van Moolenbroek uint8_t randomseed0[8]; /* upper 64 bits of MD5 digest */ 179*9f20bfa6SDavid van Moolenbroek uint8_t randomseed1[8]; /* lower 64 bits */ 180*9f20bfa6SDavid van Moolenbroek uint8_t randomid[8]; 181*9f20bfa6SDavid van Moolenbroek #endif 182*9f20bfa6SDavid van Moolenbroek }; 183*9f20bfa6SDavid van Moolenbroek 184*9f20bfa6SDavid van Moolenbroek #define IPV6_STATE(ifp) \ 185*9f20bfa6SDavid van Moolenbroek ((struct ipv6_state *)(ifp)->if_data[IF_DATA_IPV6]) 186*9f20bfa6SDavid van Moolenbroek #define IPV6_CSTATE(ifp) \ 187*9f20bfa6SDavid van Moolenbroek ((const struct ipv6_state *)(ifp)->if_data[IF_DATA_IPV6]) 188*9f20bfa6SDavid van Moolenbroek 189*9f20bfa6SDavid van Moolenbroek /* dhcpcd requires CMSG_SPACE to evaluate to a compile time constant. */ 190*9f20bfa6SDavid van Moolenbroek #ifdef __QNX__ 191*9f20bfa6SDavid van Moolenbroek #undef CMSG_SPACE 192*9f20bfa6SDavid van Moolenbroek #endif 193*9f20bfa6SDavid van Moolenbroek 194*9f20bfa6SDavid van Moolenbroek #ifndef ALIGNBYTES 195*9f20bfa6SDavid van Moolenbroek #define ALIGNBYTES (sizeof(int) - 1) 196*9f20bfa6SDavid van Moolenbroek #endif 197*9f20bfa6SDavid van Moolenbroek #ifndef ALIGN 198*9f20bfa6SDavid van Moolenbroek #define ALIGN(p) (((unsigned int)(p) + ALIGNBYTES) & ~ALIGNBYTES) 199*9f20bfa6SDavid van Moolenbroek #endif 200*9f20bfa6SDavid van Moolenbroek #ifndef CMSG_SPACE 201*9f20bfa6SDavid van Moolenbroek #define CMSG_SPACE(len) (ALIGN(sizeof(struct cmsghdr)) + ALIGN(len)) 202*9f20bfa6SDavid van Moolenbroek #endif 203*9f20bfa6SDavid van Moolenbroek 204*9f20bfa6SDavid van Moolenbroek #define IP6BUFLEN (CMSG_SPACE(sizeof(struct in6_pktinfo)) + \ 205*9f20bfa6SDavid van Moolenbroek CMSG_SPACE(sizeof(int))) 206*9f20bfa6SDavid van Moolenbroek 207*9f20bfa6SDavid van Moolenbroek 208*9f20bfa6SDavid van Moolenbroek #ifdef INET6 209*9f20bfa6SDavid van Moolenbroek struct ipv6_ctx { 210*9f20bfa6SDavid van Moolenbroek struct sockaddr_in6 from; 211*9f20bfa6SDavid van Moolenbroek struct msghdr sndhdr; 212*9f20bfa6SDavid van Moolenbroek struct iovec sndiov[2]; 213*9f20bfa6SDavid van Moolenbroek unsigned char sndbuf[CMSG_SPACE(sizeof(struct in6_pktinfo))]; 214*9f20bfa6SDavid van Moolenbroek struct msghdr rcvhdr; 215*9f20bfa6SDavid van Moolenbroek struct iovec rcviov[2]; 216*9f20bfa6SDavid van Moolenbroek unsigned char rcvbuf[IP6BUFLEN]; 217*9f20bfa6SDavid van Moolenbroek unsigned char ansbuf[1500]; 218*9f20bfa6SDavid van Moolenbroek char ntopbuf[INET6_ADDRSTRLEN]; 219*9f20bfa6SDavid van Moolenbroek const char *sfrom; 220*9f20bfa6SDavid van Moolenbroek 221*9f20bfa6SDavid van Moolenbroek int nd_fd; 222*9f20bfa6SDavid van Moolenbroek struct ra_head *ra_routers; 223*9f20bfa6SDavid van Moolenbroek struct rt6_head *routes; 224*9f20bfa6SDavid van Moolenbroek 225*9f20bfa6SDavid van Moolenbroek struct rt6_head kroutes; 226*9f20bfa6SDavid van Moolenbroek 227*9f20bfa6SDavid van Moolenbroek int dhcp_fd; 228*9f20bfa6SDavid van Moolenbroek }; 229*9f20bfa6SDavid van Moolenbroek 230*9f20bfa6SDavid van Moolenbroek struct ipv6_ctx *ipv6_init(struct dhcpcd_ctx *); 231*9f20bfa6SDavid van Moolenbroek ssize_t ipv6_printaddr(char *, size_t, const uint8_t *, const char *); 232*9f20bfa6SDavid van Moolenbroek int ipv6_makestableprivate(struct in6_addr *addr, 233*9f20bfa6SDavid van Moolenbroek const struct in6_addr *prefix, int prefix_len, 234*9f20bfa6SDavid van Moolenbroek const struct interface *ifp, int *dad_counter); 235*9f20bfa6SDavid van Moolenbroek int ipv6_makeaddr(struct in6_addr *, const struct interface *, 236*9f20bfa6SDavid van Moolenbroek const struct in6_addr *, int); 237*9f20bfa6SDavid van Moolenbroek int ipv6_makeprefix(struct in6_addr *, const struct in6_addr *, int); 238*9f20bfa6SDavid van Moolenbroek int ipv6_mask(struct in6_addr *, int); 239*9f20bfa6SDavid van Moolenbroek uint8_t ipv6_prefixlen(const struct in6_addr *); 240*9f20bfa6SDavid van Moolenbroek int ipv6_userprefix( const struct in6_addr *, short prefix_len, 241*9f20bfa6SDavid van Moolenbroek uint64_t user_number, struct in6_addr *result, short result_len); 242*9f20bfa6SDavid van Moolenbroek void ipv6_checkaddrflags(void *); 243*9f20bfa6SDavid van Moolenbroek int ipv6_addaddr(struct ipv6_addr *, const struct timespec *); 244*9f20bfa6SDavid van Moolenbroek ssize_t ipv6_addaddrs(struct ipv6_addrhead *addrs); 245*9f20bfa6SDavid van Moolenbroek void ipv6_freedrop_addrs(struct ipv6_addrhead *, int, 246*9f20bfa6SDavid van Moolenbroek const struct interface *); 247*9f20bfa6SDavid van Moolenbroek void ipv6_handleifa(struct dhcpcd_ctx *ctx, int, struct if_head *, 248*9f20bfa6SDavid van Moolenbroek const char *, const struct in6_addr *, uint8_t, int); 249*9f20bfa6SDavid van Moolenbroek int ipv6_handleifa_addrs(int, struct ipv6_addrhead *, 250*9f20bfa6SDavid van Moolenbroek const struct in6_addr *, int); 251*9f20bfa6SDavid van Moolenbroek int ipv6_publicaddr(const struct ipv6_addr *); 252*9f20bfa6SDavid van Moolenbroek const struct ipv6_addr *ipv6_iffindaddr(const struct interface *, 253*9f20bfa6SDavid van Moolenbroek const struct in6_addr *); 254*9f20bfa6SDavid van Moolenbroek int ipv6_hasaddr(const struct interface *); 255*9f20bfa6SDavid van Moolenbroek int ipv6_findaddrmatch(const struct ipv6_addr *, const struct in6_addr *, 256*9f20bfa6SDavid van Moolenbroek short); 257*9f20bfa6SDavid van Moolenbroek struct ipv6_addr *ipv6_findaddr(struct dhcpcd_ctx *, 258*9f20bfa6SDavid van Moolenbroek const struct in6_addr *, short); 259*9f20bfa6SDavid van Moolenbroek #define ipv6_linklocal(ifp) ipv6_iffindaddr((ifp), NULL) 260*9f20bfa6SDavid van Moolenbroek int ipv6_addlinklocalcallback(struct interface *, void (*)(void *), void *); 261*9f20bfa6SDavid van Moolenbroek void ipv6_freeaddr(struct ipv6_addr *); 262*9f20bfa6SDavid van Moolenbroek void ipv6_freedrop(struct interface *, int); 263*9f20bfa6SDavid van Moolenbroek #define ipv6_free(ifp) ipv6_freedrop((ifp), 0) 264*9f20bfa6SDavid van Moolenbroek #define ipv6_drop(ifp) ipv6_freedrop((ifp), 2) 265*9f20bfa6SDavid van Moolenbroek 266*9f20bfa6SDavid van Moolenbroek #ifdef IPV6_MANAGETEMPADDR 267*9f20bfa6SDavid van Moolenbroek void ipv6_gentempifid(struct interface *); 268*9f20bfa6SDavid van Moolenbroek void ipv6_settempstale(struct interface *); 269*9f20bfa6SDavid van Moolenbroek struct ipv6_addr *ipv6_createtempaddr(struct ipv6_addr *, 270*9f20bfa6SDavid van Moolenbroek const struct timespec *); 271*9f20bfa6SDavid van Moolenbroek struct ipv6_addr *ipv6_settemptime(struct ipv6_addr *, int); 272*9f20bfa6SDavid van Moolenbroek void ipv6_addtempaddrs(struct interface *, const struct timespec *); 273*9f20bfa6SDavid van Moolenbroek #else 274*9f20bfa6SDavid van Moolenbroek #define ipv6_gentempifid(a) {} 275*9f20bfa6SDavid van Moolenbroek #define ipv6_settempstale(a) {} 276*9f20bfa6SDavid van Moolenbroek #endif 277*9f20bfa6SDavid van Moolenbroek 278*9f20bfa6SDavid van Moolenbroek int ipv6_start(struct interface *); 279*9f20bfa6SDavid van Moolenbroek void ipv6_ctxfree(struct dhcpcd_ctx *); 280*9f20bfa6SDavid van Moolenbroek int ipv6_handlert(struct dhcpcd_ctx *, int cmd, struct rt6 *); 281*9f20bfa6SDavid van Moolenbroek void ipv6_freerts(struct rt6_head *); 282*9f20bfa6SDavid van Moolenbroek void ipv6_buildroutes(struct dhcpcd_ctx *); 283*9f20bfa6SDavid van Moolenbroek 284*9f20bfa6SDavid van Moolenbroek #else 285*9f20bfa6SDavid van Moolenbroek #define ipv6_init(a) (NULL) 286*9f20bfa6SDavid van Moolenbroek #define ipv6_start(a) (-1) 287*9f20bfa6SDavid van Moolenbroek #define ipv6_hasaddr(a) (0) 288*9f20bfa6SDavid van Moolenbroek #define ipv6_free_ll_callbacks(a) {} 289*9f20bfa6SDavid van Moolenbroek #define ipv6_free(a) {} 290*9f20bfa6SDavid van Moolenbroek #define ipv6_drop(a) {} 291*9f20bfa6SDavid van Moolenbroek #define ipv6_ctxfree(a) {} 292*9f20bfa6SDavid van Moolenbroek #define ipv6_gentempifid(a) {} 293*9f20bfa6SDavid van Moolenbroek #endif 294*9f20bfa6SDavid van Moolenbroek 295*9f20bfa6SDavid van Moolenbroek #endif 296