xref: /minix3/external/bsd/dhcpcd/dist/ipv6.h (revision 9f20bfa6c4c442e2e798d91b11c2a5f8d6833a41)
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