Annotation of src/external/bsd/dhcpcd/dist/src/ipv6.h, Revision 1.1.1.2.2.1
1.1 roy 1: /*
2: * dhcpcd - DHCP client daemon
1.1.1.2.2.1! snj 3: * Copyright (c) 2006-2018 Roy Marples <roy@marples.name>
1.1 roy 4: * All rights reserved
5:
6: * Redistribution and use in source and binary forms, with or without
7: * modification, are permitted provided that the following conditions
8: * are met:
9: * 1. Redistributions of source code must retain the above copyright
10: * notice, this list of conditions and the following disclaimer.
11: * 2. Redistributions in binary form must reproduce the above copyright
12: * notice, this list of conditions and the following disclaimer in the
13: * documentation and/or other materials provided with the distribution.
14: *
15: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18: * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25: * SUCH DAMAGE.
26: */
27:
28: #ifndef IPV6_H
29: #define IPV6_H
30:
31: #include <sys/uio.h>
32: #include <netinet/in.h>
33:
34: #include "config.h"
35: #include "if.h"
36:
37: #ifndef __linux__
38: # if !defined(__QNX__) && !defined(__sun)
39: # include <sys/endian.h>
40: # endif
41: # include <net/if.h>
42: # ifndef __sun
43: # include <netinet6/in6_var.h>
44: # endif
45: #endif
46:
47: #define ALLROUTERS "ff02::2"
48:
49: #define EUI64_GBIT 0x01
50: #define EUI64_UBIT 0x02
51: #define EUI64_TO_IFID(in6) do {(in6)->s6_addr[8] ^= EUI64_UBIT; } while (0)
52: #define EUI64_GROUP(in6) ((in6)->s6_addr[8] & EUI64_GBIT)
53:
54: #ifndef ND6_INFINITE_LIFETIME
55: # define ND6_INFINITE_LIFETIME ((uint32_t)~0)
56: #endif
57:
58: /* RFC4941 constants */
59: #define TEMP_VALID_LIFETIME 604800 /* 1 week */
60: #define TEMP_PREFERRED_LIFETIME 86400 /* 1 day */
61: #define REGEN_ADVANCE 5 /* seconds */
62: #define MAX_DESYNC_FACTOR 600 /* 10 minutes */
63:
64: #define TEMP_IDGEN_RETRIES 3
65: #define GEN_TEMPID_RETRY_MAX 5
66:
67: /* RFC7217 constants */
68: #define IDGEN_RETRIES 3
69: #define IDGEN_DELAY 1 /* second */
70:
71: #ifndef IN6_ARE_MASKED_ADDR_EQUAL
72: #define IN6_ARE_MASKED_ADDR_EQUAL(d, a, m) ( \
73: (((d)->s6_addr32[0] ^ (a)->s6_addr32[0]) & (m)->s6_addr32[0]) == 0 && \
74: (((d)->s6_addr32[1] ^ (a)->s6_addr32[1]) & (m)->s6_addr32[1]) == 0 && \
75: (((d)->s6_addr32[2] ^ (a)->s6_addr32[2]) & (m)->s6_addr32[2]) == 0 && \
76: (((d)->s6_addr32[3] ^ (a)->s6_addr32[3]) & (m)->s6_addr32[3]) == 0 )
77: #endif
78:
79: /*
80: * BSD kernels don't inform userland of DAD results.
81: * See the discussion here:
82: * http://mail-index.netbsd.org/tech-net/2013/03/15/msg004019.html
83: */
84: #ifndef __linux__
85: /* We guard here to avoid breaking a compile on linux ppc-64 headers */
86: # include <sys/param.h>
87: #endif
88: #ifdef BSD
89: # define IPV6_POLLADDRFLAG
90: #endif
91:
92: /* This was fixed in NetBSD */
93: #if defined(__NetBSD_Version__) && __NetBSD_Version__ >= 699002000
94: # undef IPV6_POLLADDRFLAG
95: #endif
96:
1.1.1.2.2.1! snj 97: #ifdef __sun
! 98: /* Solaris lacks these defines.
! 99: * While it supports DaD, to seems to only expose IFF_DUPLICATE
! 100: * so we have no way of knowing if it's tentative or not.
! 101: * I don't even know if Solaris has any special treatment for tentative. */
! 102: # define IN6_IFF_TENTATIVE 0
! 103: # define IN6_IFF_DUPLICATED 0x04
! 104: # define IN6_IFF_DETACHED 0
! 105: #endif
! 106:
! 107: #define IN6_IFF_NOTUSEABLE \
! 108: (IN6_IFF_TENTATIVE | IN6_IFF_DUPLICATED | IN6_IFF_DETACHED)
! 109:
1.1 roy 110: /*
111: * If dhcpcd handles RA processing instead of the kernel, the kernel needs
112: * to either allow userland to set temporary addresses or mark an address
113: * for the kernel to manage temporary addresses from.
114: * If the kernel allows the former, a global #define is needed, otherwise
115: * the address marking will be handled in the platform specific address handler.
116: *
117: * Some BSDs do not allow userland to set temporary addresses.
118: * Linux-3.18 allows the marking of addresses from which to manage temp addrs.
119: */
1.1.1.2.2.1! snj 120: #if defined(IN6_IFF_TEMPORARY) && !defined(__linux__)
! 121: #define IPV6_MANAGETEMPADDR
1.1 roy 122: #endif
123:
124: #ifdef __linux__
125: /* Match Linux defines to BSD */
1.1.1.2.2.1! snj 126: # ifdef IFA_F_TEMPORARY
! 127: # define IN6_IFF_TEMPORARY IFA_F_TEMPORARY
! 128: # endif
1.1 roy 129: # ifdef IFA_F_OPTIMISTIC
130: # define IN6_IFF_TENTATIVE (IFA_F_TENTATIVE | IFA_F_OPTIMISTIC)
131: # else
132: # define IN6_IFF_TENTATIVE (IFA_F_TENTATIVE | 0x04)
133: # endif
134: # ifdef IF_F_DADFAILED
135: # define IN6_IFF_DUPLICATED IFA_F_DADFAILED
136: # else
137: # define IN6_IFF_DUPLICATED 0x08
138: # endif
139: # define IN6_IFF_DETACHED 0
140: #endif
141:
142: TAILQ_HEAD(ipv6_addrhead, ipv6_addr);
143: struct ipv6_addr {
144: TAILQ_ENTRY(ipv6_addr) next;
145: struct interface *iface;
146: struct in6_addr prefix;
147: uint8_t prefix_len;
148: uint32_t prefix_vltime;
149: uint32_t prefix_pltime;
150: struct timespec created;
151: struct timespec acquired;
152: struct in6_addr addr;
153: int addr_flags;
1.1.1.2.2.1! snj 154: unsigned int flags;
1.1 roy 155: char saddr[INET6_ADDRSTRLEN];
156: uint8_t iaid[4];
157: uint16_t ia_type;
1.1.1.2.2.1! snj 158: int dhcp6_fd;
1.1 roy 159:
1.1.1.2 roy 160: #ifndef SMALL
1.1 roy 161: struct ipv6_addr *delegating_prefix;
162: struct ipv6_addrhead pd_pfxs;
163: TAILQ_ENTRY(ipv6_addr) pd_next;
164:
165: uint8_t prefix_exclude_len;
166: struct in6_addr prefix_exclude;
1.1.1.2 roy 167: #endif
1.1 roy 168:
169: void (*dadcallback)(void *);
170: int dadcounter;
171:
172: #ifdef ALIAS_ADDR
173: char alias[IF_NAMESIZE];
174: #endif
175: };
176:
1.1.1.2.2.1! snj 177: #define IPV6_AF_ONLINK (1U << 0)
! 178: #define IPV6_AF_NEW (1U << 1)
! 179: #define IPV6_AF_STALE (1U << 2)
! 180: #define IPV6_AF_ADDED (1U << 3)
! 181: #define IPV6_AF_AUTOCONF (1U << 4)
! 182: #define IPV6_AF_DUPLICATED (1U << 5)
! 183: #define IPV6_AF_DADCOMPLETED (1U << 6)
! 184: #define IPV6_AF_DELEGATED (1U << 7)
! 185: #define IPV6_AF_DELEGATEDPFX (1U << 8)
! 186: #define IPV6_AF_NOREJECT (1U << 9)
! 187: #define IPV6_AF_REQUEST (1U << 10)
! 188: #define IPV6_AF_STATIC (1U << 11)
! 189: #define IPV6_AF_DELEGATEDLOG (1U << 12)
! 190: #define IPV6_AF_RAPFX (1U << 13)
! 191: #define IPV6_AF_EXTENDED (1U << 14)
1.1 roy 192: #ifdef IPV6_MANAGETEMPADDR
1.1.1.2.2.1! snj 193: #define IPV6_AF_TEMPORARY (1U << 15)
1.1 roy 194: #endif
195:
196: struct ll_callback {
197: TAILQ_ENTRY(ll_callback) next;
198: void (*callback)(void *);
199: void *arg;
200: };
201: TAILQ_HEAD(ll_callback_head, ll_callback);
202:
203: struct ipv6_state {
204: struct ipv6_addrhead addrs;
205: struct ll_callback_head ll_callbacks;
206:
207: #ifdef IPV6_MANAGETEMPADDR
208: time_t desync_factor;
209: uint8_t randomseed0[8]; /* upper 64 bits of MD5 digest */
210: uint8_t randomseed1[8]; /* lower 64 bits */
211: uint8_t randomid[8];
212: #endif
213: };
214:
215: #define IPV6_STATE(ifp) \
216: ((struct ipv6_state *)(ifp)->if_data[IF_DATA_IPV6])
217: #define IPV6_CSTATE(ifp) \
218: ((const struct ipv6_state *)(ifp)->if_data[IF_DATA_IPV6])
219: #define IPV6_STATE_RUNNING(ifp) ipv6_staticdadcompleted((ifp))
220:
221: #ifdef INET6
222:
223: int ipv6_init(struct dhcpcd_ctx *);
224: int ipv6_makestableprivate(struct in6_addr *addr,
225: const struct in6_addr *prefix, int prefix_len,
226: const struct interface *ifp, int *dad_counter);
227: int ipv6_makeaddr(struct in6_addr *, struct interface *,
228: const struct in6_addr *, int);
229: int ipv6_mask(struct in6_addr *, int);
230: uint8_t ipv6_prefixlen(const struct in6_addr *);
231: int ipv6_userprefix( const struct in6_addr *, short prefix_len,
232: uint64_t user_number, struct in6_addr *result, short result_len);
233: void ipv6_checkaddrflags(void *);
234: int ipv6_addaddr(struct ipv6_addr *, const struct timespec *);
235: ssize_t ipv6_addaddrs(struct ipv6_addrhead *addrs);
1.1.1.2.2.1! snj 236: void ipv6_deleteaddr(struct ipv6_addr *);
1.1 roy 237: void ipv6_freedrop_addrs(struct ipv6_addrhead *, int,
238: const struct interface *);
239: void ipv6_handleifa(struct dhcpcd_ctx *ctx, int, struct if_head *,
240: const char *, const struct in6_addr *, uint8_t, int);
241: int ipv6_handleifa_addrs(int, struct ipv6_addrhead *, const struct ipv6_addr *);
242: struct ipv6_addr *ipv6_iffindaddr(struct interface *,
243: const struct in6_addr *, int);
244: int ipv6_hasaddr(const struct interface *);
245: int ipv6_findaddrmatch(const struct ipv6_addr *, const struct in6_addr *,
1.1.1.2.2.1! snj 246: unsigned int);
1.1 roy 247: struct ipv6_addr *ipv6_findaddr(struct dhcpcd_ctx *,
1.1.1.2.2.1! snj 248: const struct in6_addr *, unsigned int);
1.1 roy 249: struct ipv6_addr *ipv6_findmaskaddr(struct dhcpcd_ctx *,
250: const struct in6_addr *);
251: #define ipv6_linklocal(ifp) ipv6_iffindaddr((ifp), NULL, IN6_IFF_NOTUSEABLE)
252: int ipv6_addlinklocalcallback(struct interface *, void (*)(void *), void *);
1.1.1.2.2.1! snj 253: struct ipv6_addr *ipv6_newaddr(struct interface *, const struct in6_addr *, uint8_t,
! 254: unsigned int);
1.1 roy 255: void ipv6_freeaddr(struct ipv6_addr *);
256: void ipv6_freedrop(struct interface *, int);
257: #define ipv6_free(ifp) ipv6_freedrop((ifp), 0)
258: #define ipv6_drop(ifp) ipv6_freedrop((ifp), 2)
259:
260: #ifdef IPV6_MANAGETEMPADDR
261: void ipv6_gentempifid(struct interface *);
262: void ipv6_settempstale(struct interface *);
263: struct ipv6_addr *ipv6_createtempaddr(struct ipv6_addr *,
264: const struct timespec *);
265: struct ipv6_addr *ipv6_settemptime(struct ipv6_addr *, int);
266: void ipv6_addtempaddrs(struct interface *, const struct timespec *);
267: #else
268: #define ipv6_gentempifid(a) {}
269: #define ipv6_settempstale(a) {}
270: #endif
271:
272: int ipv6_start(struct interface *);
273: int ipv6_staticdadcompleted(const struct interface *);
274: int ipv6_startstatic(struct interface *);
275: ssize_t ipv6_env(char **, const char *, const struct interface *);
276: void ipv6_ctxfree(struct dhcpcd_ctx *);
277: bool inet6_getroutes(struct dhcpcd_ctx *, struct rt_head *);
278:
279: #else
280: #define ipv6_start(a) (-1)
281: #define ipv6_startstatic(a)
282: #define ipv6_staticdadcompleted(a) (0)
283: #define ipv6_hasaddr(a) (0)
284: #define ipv6_free_ll_callbacks(a) {}
285: #define ipv6_free(a) {}
286: #define ipv6_drop(a) {}
287: #define ipv6_ctxfree(a) {}
288: #define ipv6_gentempifid(a) {}
289: #endif
290:
291: #endif
CVSweb <webmaster@jp.NetBSD.org>