Line data Source code
1 : /* $OpenBSD: in6_var.h,v 1.72 2018/05/06 15:21:25 florian Exp $ */
2 : /* $KAME: in6_var.h,v 1.55 2001/02/16 12:49:45 itojun Exp $ */
3 :
4 : /*
5 : * Copyright (C) 1995, 1996, 1997, and 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 : /*
34 : * Copyright (c) 1985, 1986, 1993
35 : * The Regents of the University of California. All rights reserved.
36 : *
37 : * Redistribution and use in source and binary forms, with or without
38 : * modification, are permitted provided that the following conditions
39 : * are met:
40 : * 1. Redistributions of source code must retain the above copyright
41 : * notice, this list of conditions and the following disclaimer.
42 : * 2. Redistributions in binary form must reproduce the above copyright
43 : * notice, this list of conditions and the following disclaimer in the
44 : * documentation and/or other materials provided with the distribution.
45 : * 3. Neither the name of the University nor the names of its contributors
46 : * may be used to endorse or promote products derived from this software
47 : * without specific prior written permission.
48 : *
49 : * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
50 : * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
51 : * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
52 : * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
53 : * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
54 : * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
55 : * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
56 : * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
57 : * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
58 : * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
59 : * SUCH DAMAGE.
60 : *
61 : * @(#)in_var.h 8.1 (Berkeley) 6/10/93
62 : */
63 :
64 : #ifndef _NETINET6_IN6_VAR_H_
65 : #define _NETINET6_IN6_VAR_H_
66 :
67 : /*
68 : * Interface address, Internet version. One of these structures
69 : * is allocated for each interface with an Internet address.
70 : * The ifaddr structure contains the protocol-independent part
71 : * of the structure and is assumed to be first.
72 : */
73 :
74 : /*
75 : * pltime/vltime are just for future reference (required to implements 2
76 : * hour rule for hosts). they should never be modified by nd6_timeout or
77 : * anywhere else.
78 : * userland -> kernel: accept pltime/vltime
79 : * kernel -> userland: throw up everything
80 : * in kernel: modify preferred/expire only
81 : */
82 : struct in6_addrlifetime {
83 : time_t ia6t_expire; /* valid lifetime expiration time */
84 : time_t ia6t_preferred; /* preferred lifetime expiration time */
85 : u_int32_t ia6t_vltime; /* valid lifetime */
86 : u_int32_t ia6t_pltime; /* prefix lifetime */
87 : };
88 :
89 : #ifdef _KERNEL
90 : struct nd_ifinfo;
91 : struct in6_ifextra {
92 : struct nd_ifinfo *nd_ifinfo;
93 : void *rs_lhcookie;
94 : int nprefixes;
95 : int ndefrouters;
96 : };
97 :
98 : struct in6_ifaddr {
99 : struct ifaddr ia_ifa; /* protocol-independent info */
100 : #define ia_ifp ia_ifa.ifa_ifp
101 : #define ia_flags ia_ifa.ifa_flags
102 :
103 : struct sockaddr_in6 ia_addr; /* interface address */
104 : struct sockaddr_in6 ia_dstaddr; /* space for destination addr */
105 : struct sockaddr_in6 ia_prefixmask; /* prefix mask */
106 : TAILQ_ENTRY(in6_ifaddr) ia_list; /* list of IP6 addresses */
107 : int ia6_flags;
108 :
109 : struct in6_addrlifetime ia6_lifetime;
110 : time_t ia6_updatetime;
111 :
112 : /* multicast addresses joined from the kernel */
113 : LIST_HEAD(, in6_multi_mship) ia6_memberships;
114 : };
115 : #endif /* _KERNEL */
116 :
117 : /*
118 : * IPv6 interface statistics, as defined in RFC2465 Ipv6IfStatsEntry (p12).
119 : */
120 : struct in6_ifstat {
121 : u_int64_t ifs6_in_receive; /* # of total input datagram */
122 : u_int64_t ifs6_in_hdrerr; /* # of datagrams with invalid hdr */
123 : u_int64_t ifs6_in_toobig; /* # of datagrams exceeded MTU */
124 : u_int64_t ifs6_in_noroute; /* # of datagrams with no route */
125 : u_int64_t ifs6_in_addrerr; /* # of datagrams with invalid dst */
126 : u_int64_t ifs6_in_protounknown; /* # of datagrams with unknown proto */
127 : /* NOTE: increment on final dst if */
128 : u_int64_t ifs6_in_truncated; /* # of truncated datagrams */
129 : u_int64_t ifs6_in_discard; /* # of discarded datagrams */
130 : /* NOTE: fragment timeout is not here */
131 : u_int64_t ifs6_in_deliver; /* # of datagrams delivered to ULP */
132 : /* NOTE: increment on final dst if */
133 : u_int64_t ifs6_out_forward; /* # of datagrams forwarded */
134 : /* NOTE: increment on outgoing if */
135 : u_int64_t ifs6_out_request; /* # of outgoing datagrams from ULP */
136 : /* NOTE: does not include forwrads */
137 : u_int64_t ifs6_out_discard; /* # of discarded datagrams */
138 : u_int64_t ifs6_out_fragok; /* # of datagrams fragmented */
139 : u_int64_t ifs6_out_fragfail; /* # of datagrams failed on fragment */
140 : u_int64_t ifs6_out_fragcreat; /* # of fragment datagrams */
141 : /* NOTE: this is # after fragment */
142 : u_int64_t ifs6_reass_reqd; /* # of incoming fragmented packets */
143 : /* NOTE: increment on final dst if */
144 : u_int64_t ifs6_reass_ok; /* # of reassembled packets */
145 : /* NOTE: this is # after reass */
146 : /* NOTE: increment on final dst if */
147 : u_int64_t ifs6_reass_fail; /* # of reass failures */
148 : /* NOTE: may not be packet count */
149 : /* NOTE: increment on final dst if */
150 : u_int64_t ifs6_in_mcast; /* # of inbound multicast datagrams */
151 : u_int64_t ifs6_out_mcast; /* # of outbound multicast datagrams */
152 : };
153 :
154 : /*
155 : * ICMPv6 interface statistics, as defined in RFC2466 Ipv6IfIcmpEntry.
156 : * XXX: I'm not sure if this file is the right place for this structure...
157 : */
158 : struct icmp6_ifstat {
159 : /*
160 : * Input statistics
161 : */
162 : /* ipv6IfIcmpInMsgs, total # of input messages */
163 : u_int64_t ifs6_in_msg;
164 : /* ipv6IfIcmpInErrors, # of input error messages */
165 : u_int64_t ifs6_in_error;
166 : /* ipv6IfIcmpInDestUnreachs, # of input dest unreach errors */
167 : u_int64_t ifs6_in_dstunreach;
168 : /* ipv6IfIcmpInAdminProhibs, # of input administratively prohibited errs */
169 : u_int64_t ifs6_in_adminprohib;
170 : /* ipv6IfIcmpInTimeExcds, # of input time exceeded errors */
171 : u_int64_t ifs6_in_timeexceed;
172 : /* ipv6IfIcmpInParmProblems, # of input parameter problem errors */
173 : u_int64_t ifs6_in_paramprob;
174 : /* ipv6IfIcmpInPktTooBigs, # of input packet too big errors */
175 : u_int64_t ifs6_in_pkttoobig;
176 : /* ipv6IfIcmpInEchos, # of input echo requests */
177 : u_int64_t ifs6_in_echo;
178 : /* ipv6IfIcmpInEchoReplies, # of input echo replies */
179 : u_int64_t ifs6_in_echoreply;
180 : /* ipv6IfIcmpInRouterSolicits, # of input router solicitations */
181 : u_int64_t ifs6_in_routersolicit;
182 : /* ipv6IfIcmpInRouterAdvertisements, # of input router advertisements */
183 : u_int64_t ifs6_in_routeradvert;
184 : /* ipv6IfIcmpInNeighborSolicits, # of input neighbor solicitations */
185 : u_int64_t ifs6_in_neighborsolicit;
186 : /* ipv6IfIcmpInNeighborAdvertisements, # of input neighbor advertisements */
187 : u_int64_t ifs6_in_neighboradvert;
188 : /* ipv6IfIcmpInRedirects, # of input redirects */
189 : u_int64_t ifs6_in_redirect;
190 : /* ipv6IfIcmpInGroupMembQueries, # of input MLD queries */
191 : u_int64_t ifs6_in_mldquery;
192 : /* ipv6IfIcmpInGroupMembResponses, # of input MLD reports */
193 : u_int64_t ifs6_in_mldreport;
194 : /* ipv6IfIcmpInGroupMembReductions, # of input MLD done */
195 : u_int64_t ifs6_in_mlddone;
196 :
197 : /*
198 : * Output statistics. We should solve unresolved routing problem...
199 : */
200 : /* ipv6IfIcmpOutMsgs, total # of output messages */
201 : u_int64_t ifs6_out_msg;
202 : /* ipv6IfIcmpOutErrors, # of output error messages */
203 : u_int64_t ifs6_out_error;
204 : /* ipv6IfIcmpOutDestUnreachs, # of output dest unreach errors */
205 : u_int64_t ifs6_out_dstunreach;
206 : /* ipv6IfIcmpOutAdminProhibs, # of output administratively prohibited errs */
207 : u_int64_t ifs6_out_adminprohib;
208 : /* ipv6IfIcmpOutTimeExcds, # of output time exceeded errors */
209 : u_int64_t ifs6_out_timeexceed;
210 : /* ipv6IfIcmpOutParmProblems, # of output parameter problem errors */
211 : u_int64_t ifs6_out_paramprob;
212 : /* ipv6IfIcmpOutPktTooBigs, # of output packet too big errors */
213 : u_int64_t ifs6_out_pkttoobig;
214 : /* ipv6IfIcmpOutEchos, # of output echo requests */
215 : u_int64_t ifs6_out_echo;
216 : /* ipv6IfIcmpOutEchoReplies, # of output echo replies */
217 : u_int64_t ifs6_out_echoreply;
218 : /* ipv6IfIcmpOutRouterSolicits, # of output router solicitations */
219 : u_int64_t ifs6_out_routersolicit;
220 : /* ipv6IfIcmpOutRouterAdvertisements, # of output router advertisements */
221 : u_int64_t ifs6_out_routeradvert;
222 : /* ipv6IfIcmpOutNeighborSolicits, # of output neighbor solicitations */
223 : u_int64_t ifs6_out_neighborsolicit;
224 : /* ipv6IfIcmpOutNeighborAdvertisements, # of output neighbor advertisements */
225 : u_int64_t ifs6_out_neighboradvert;
226 : /* ipv6IfIcmpOutRedirects, # of output redirects */
227 : u_int64_t ifs6_out_redirect;
228 : /* ipv6IfIcmpOutGroupMembQueries, # of output MLD queries */
229 : u_int64_t ifs6_out_mldquery;
230 : /* ipv6IfIcmpOutGroupMembResponses, # of output MLD reports */
231 : u_int64_t ifs6_out_mldreport;
232 : /* ipv6IfIcmpOutGroupMembReductions, # of output MLD done */
233 : u_int64_t ifs6_out_mlddone;
234 : };
235 :
236 : struct in6_ifreq {
237 : char ifr_name[IFNAMSIZ];
238 : union {
239 : struct sockaddr_in6 ifru_addr;
240 : struct sockaddr_in6 ifru_dstaddr;
241 : short ifru_flags;
242 : int ifru_flags6;
243 : int ifru_metric;
244 : caddr_t ifru_data;
245 : struct in6_addrlifetime ifru_lifetime;
246 : struct in6_ifstat ifru_stat;
247 : struct icmp6_ifstat ifru_icmp6stat;
248 : } ifr_ifru;
249 : };
250 :
251 : struct in6_aliasreq {
252 : char ifra_name[IFNAMSIZ];
253 : union {
254 : struct sockaddr_in6 ifrau_addr;
255 : int ifrau_align;
256 : } ifra_ifrau;
257 : #ifndef ifra_addr
258 : #define ifra_addr ifra_ifrau.ifrau_addr
259 : #endif
260 : struct sockaddr_in6 ifra_dstaddr;
261 : struct sockaddr_in6 ifra_prefixmask;
262 : int ifra_flags;
263 : struct in6_addrlifetime ifra_lifetime;
264 : };
265 :
266 : /*
267 : * Given a pointer to an in6_ifaddr (ifaddr),
268 : * return a pointer to the addr as a sockaddr_in6
269 : */
270 : #define IA6_IN6(ia) (&((ia)->ia_addr.sin6_addr))
271 : #define IA6_DSTIN6(ia) (&((ia)->ia_dstaddr.sin6_addr))
272 : #define IA6_MASKIN6(ia) (&((ia)->ia_prefixmask.sin6_addr))
273 : #define IA6_SIN6(ia) (&((ia)->ia_addr))
274 : #define IA6_DSTSIN6(ia) (&((ia)->ia_dstaddr))
275 : #define IFA_IN6(x) (&((struct sockaddr_in6 *)((x)->ifa_addr))->sin6_addr)
276 : #define IFA_DSTIN6(x) (&((struct sockaddr_in6 *)((x)->ifa_dstaddr))->sin6_addr)
277 :
278 : #define SIOCDIFADDR_IN6 _IOW('i', 25, struct in6_ifreq)
279 : #define SIOCAIFADDR_IN6 _IOW('i', 26, struct in6_aliasreq)
280 :
281 : #define SIOCGIFDSTADDR_IN6 _IOWR('i', 34, struct in6_ifreq)
282 : #define SIOCGIFNETMASK_IN6 _IOWR('i', 37, struct in6_ifreq)
283 :
284 : #define SIOCGIFAFLAG_IN6 _IOWR('i', 73, struct in6_ifreq)
285 :
286 : #define SIOCGIFINFO_IN6 _IOWR('i', 108, struct in6_ndireq)
287 : #define SIOCGNBRINFO_IN6 _IOWR('i', 78, struct in6_nbrinfo)
288 :
289 : #define SIOCGIFALIFETIME_IN6 _IOWR('i', 81, struct in6_ifreq)
290 :
291 : #define SIOCGETSGCNT_IN6 _IOWR('u', 106, struct sioc_sg_req6)
292 : #define SIOCGETMIFCNT_IN6 _IOWR('u', 107, struct sioc_mif_req6)
293 :
294 : #define IN6_IFF_ANYCAST 0x01 /* anycast address */
295 : #define IN6_IFF_TENTATIVE 0x02 /* tentative address */
296 : #define IN6_IFF_DUPLICATED 0x04 /* DAD detected duplicate */
297 : #define IN6_IFF_DETACHED 0x08 /* may be detached from the link */
298 : #define IN6_IFF_DEPRECATED 0x10 /* deprecated address */
299 : #define IN6_IFF_AUTOCONF 0x40 /* autoconfigurable address. */
300 : #define IN6_IFF_PRIVACY 0x80 /* RFC 4941 temporary address */
301 :
302 : #ifdef _KERNEL
303 : #define IN6_ARE_MASKED_ADDR_EQUAL(d, a, m) ( \
304 : (((d)->s6_addr32[0] ^ (a)->s6_addr32[0]) & (m)->s6_addr32[0]) == 0 && \
305 : (((d)->s6_addr32[1] ^ (a)->s6_addr32[1]) & (m)->s6_addr32[1]) == 0 && \
306 : (((d)->s6_addr32[2] ^ (a)->s6_addr32[2]) & (m)->s6_addr32[2]) == 0 && \
307 : (((d)->s6_addr32[3] ^ (a)->s6_addr32[3]) & (m)->s6_addr32[3]) == 0 )
308 :
309 : #define IN6_ARE_SCOPE_CMP(a,b) ((a)-(b))
310 : #define IN6_ARE_SCOPE_EQUAL(a,b) ((a)==(b))
311 :
312 : /*
313 : * Multi-cast membership entry. One for each group/ifp that a PCB
314 : * belongs to.
315 : */
316 : struct in6_multi_mship {
317 : struct in6_multi *i6mm_maddr; /* Multicast address pointer */
318 : LIST_ENTRY(in6_multi_mship) i6mm_chain; /* multicast options chain */
319 : };
320 :
321 : struct in6_multi {
322 : struct ifmaddr in6m_ifma; /* Protocol-independent info */
323 : #define in6m_refcnt in6m_ifma.ifma_refcnt
324 : #define in6m_ifidx in6m_ifma.ifma_ifidx
325 :
326 : struct sockaddr_in6 in6m_sin; /* IPv6 multicast address */
327 : #define in6m_addr in6m_sin.sin6_addr
328 :
329 : u_int in6m_state; /* state of membership */
330 : u_int in6m_timer; /* MLD6 membership report timer */
331 : };
332 :
333 : static __inline struct in6_multi *
334 0 : ifmatoin6m(struct ifmaddr *ifma)
335 : {
336 0 : return ((struct in6_multi *)(ifma));
337 : }
338 :
339 : /*
340 : * Macros for looking up the in6_multi record for a given IP6 multicast
341 : * address on a given interface. If no matching record is found, "in6m"
342 : * returns NULL.
343 : */
344 : #define IN6_LOOKUP_MULTI(addr, ifp, in6m) \
345 : /* struct in6_addr addr; */ \
346 : /* struct ifnet *ifp; */ \
347 : /* struct in6_multi *in6m; */ \
348 : do { \
349 : struct ifmaddr *ifma; \
350 : \
351 : (in6m) = NULL; \
352 : TAILQ_FOREACH(ifma, &(ifp)->if_maddrlist, ifma_list) \
353 : if (ifma->ifma_addr->sa_family == AF_INET6 && \
354 : IN6_ARE_ADDR_EQUAL(&ifmatoin6m(ifma)->in6m_addr, \
355 : &(addr))) { \
356 : (in6m) = ifmatoin6m(ifma); \
357 : break; \
358 : } \
359 : } while (/* CONSTCOND */ 0)
360 :
361 : struct in6_multi *in6_addmulti(struct in6_addr *, struct ifnet *, int *);
362 : void in6_delmulti(struct in6_multi *);
363 : int in6_hasmulti(struct in6_addr *, struct ifnet *);
364 : struct in6_multi_mship *in6_joingroup(struct ifnet *, struct in6_addr *, int *);
365 : void in6_leavegroup(struct in6_multi_mship *);
366 : int in6_control(struct socket *, u_long, caddr_t, struct ifnet *);
367 : int in6_ioctl(u_long, caddr_t, struct ifnet *, int);
368 : int in6_update_ifa(struct ifnet *, struct in6_aliasreq *,
369 : struct in6_ifaddr *);
370 : void in6_purgeaddr(struct ifaddr *);
371 : int in6if_do_dad(struct ifnet *);
372 : void *in6_domifattach(struct ifnet *);
373 : void in6_domifdetach(struct ifnet *, void *);
374 : struct in6_ifaddr *in6ifa_ifpforlinklocal(struct ifnet *, int);
375 : struct in6_ifaddr *in6ifa_ifpwithaddr(struct ifnet *, struct in6_addr *);
376 : int in6_addr2scopeid(unsigned int, struct in6_addr *);
377 : int in6_matchlen(struct in6_addr *, struct in6_addr *);
378 : void in6_prefixlen2mask(struct in6_addr *, int);
379 : void in6_purgeprefix(struct ifnet *);
380 : #endif /* _KERNEL */
381 :
382 : #endif /* _NETINET6_IN6_VAR_H_ */
|