in6_var.h revision 1.72
1/* $NetBSD: in6_var.h,v 1.72 2015/02/26 09:54:46 roy Exp $ */ 2/* $KAME: in6_var.h,v 1.81 2002/06/08 11:16:51 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#include <sys/callout.h> 68 69/* 70 * Interface address, Internet version. One of these structures 71 * is allocated for each interface with an Internet address. 72 * The ifaddr structure contains the protocol-independent part 73 * of the structure and is assumed to be first. 74 */ 75 76/* 77 * pltime/vltime are just for future reference (required to implements 2 78 * hour rule for hosts). they should never be modified by nd6_timeout or 79 * anywhere else. 80 * userland -> kernel: accept pltime/vltime 81 * kernel -> userland: throw up everything 82 * in kernel: modify preferred/expire only 83 */ 84struct in6_addrlifetime { 85 time_t ia6t_expire; /* valid lifetime expiration time */ 86 time_t ia6t_preferred; /* preferred lifetime expiration time */ 87 u_int32_t ia6t_vltime; /* valid lifetime */ 88 u_int32_t ia6t_pltime; /* prefix lifetime */ 89}; 90 91struct nd_ifinfo; 92struct in6_ifextra { 93 struct in6_ifstat *in6_ifstat; 94 struct icmp6_ifstat *icmp6_ifstat; 95 struct nd_ifinfo *nd_ifinfo; 96 struct scope6_id *scope6_id; 97 int nprefixes; 98 int ndefrouters; 99}; 100 101LIST_HEAD(in6_multihead, in6_multi); 102struct in6_ifaddr { 103 struct ifaddr ia_ifa; /* protocol-independent info */ 104#define ia_ifp ia_ifa.ifa_ifp 105#define ia_flags ia_ifa.ifa_flags 106 struct sockaddr_in6 ia_addr; /* interface address */ 107 struct sockaddr_in6 ia_net; /* network number of interface */ 108 struct sockaddr_in6 ia_dstaddr; /* space for destination addr */ 109 struct sockaddr_in6 ia_prefixmask; /* prefix mask */ 110 u_int32_t ia_plen; /* prefix length */ 111 struct in6_ifaddr *ia_next; /* next in6 list of IP6 addresses */ 112 struct in6_multihead ia6_multiaddrs; 113 /* list of multicast addresses */ 114 int ia6_flags; 115 116 struct in6_addrlifetime ia6_lifetime; 117 time_t ia6_createtime; /* the creation time of this address, which is 118 * currently used for temporary addresses only. 119 */ 120 time_t ia6_updatetime; 121 122 /* back pointer to the ND prefix (for autoconfigured addresses only) */ 123 struct nd_prefix *ia6_ndpr; 124 125 /* multicast addresses joined from the kernel */ 126 LIST_HEAD(, in6_multi_mship) ia6_memberships; 127}; 128 129/* control structure to manage address selection policy */ 130struct in6_addrpolicy { 131 struct sockaddr_in6 addr; /* prefix address */ 132 struct sockaddr_in6 addrmask; /* prefix mask */ 133 int preced; /* precedence */ 134 int label; /* matching label */ 135 u_quad_t use; /* statistics */ 136}; 137 138/* 139 * IPv6 interface statistics, as defined in RFC2465 Ipv6IfStatsEntry (p12). 140 */ 141struct in6_ifstat { 142 u_quad_t ifs6_in_receive; /* # of total input datagram */ 143 u_quad_t ifs6_in_hdrerr; /* # of datagrams with invalid hdr */ 144 u_quad_t ifs6_in_toobig; /* # of datagrams exceeded MTU */ 145 u_quad_t ifs6_in_noroute; /* # of datagrams with no route */ 146 u_quad_t ifs6_in_addrerr; /* # of datagrams with invalid dst */ 147 u_quad_t ifs6_in_protounknown; /* # of datagrams with unknown proto */ 148 /* NOTE: increment on final dst if */ 149 u_quad_t ifs6_in_truncated; /* # of truncated datagrams */ 150 u_quad_t ifs6_in_discard; /* # of discarded datagrams */ 151 /* NOTE: fragment timeout is not here */ 152 u_quad_t ifs6_in_deliver; /* # of datagrams delivered to ULP */ 153 /* NOTE: increment on final dst if */ 154 u_quad_t ifs6_out_forward; /* # of datagrams forwarded */ 155 /* NOTE: increment on outgoing if */ 156 u_quad_t ifs6_out_request; /* # of outgoing datagrams from ULP */ 157 /* NOTE: does not include forwrads */ 158 u_quad_t ifs6_out_discard; /* # of discarded datagrams */ 159 u_quad_t ifs6_out_fragok; /* # of datagrams fragmented */ 160 u_quad_t ifs6_out_fragfail; /* # of datagrams failed on fragment */ 161 u_quad_t ifs6_out_fragcreat; /* # of fragment datagrams */ 162 /* NOTE: this is # after fragment */ 163 u_quad_t ifs6_reass_reqd; /* # of incoming fragmented packets */ 164 /* NOTE: increment on final dst if */ 165 u_quad_t ifs6_reass_ok; /* # of reassembled packets */ 166 /* NOTE: this is # after reass */ 167 /* NOTE: increment on final dst if */ 168 u_quad_t ifs6_reass_fail; /* # of reass failures */ 169 /* NOTE: may not be packet count */ 170 /* NOTE: increment on final dst if */ 171 u_quad_t ifs6_in_mcast; /* # of inbound multicast datagrams */ 172 u_quad_t ifs6_out_mcast; /* # of outbound multicast datagrams */ 173}; 174 175/* 176 * ICMPv6 interface statistics, as defined in RFC2466 Ipv6IfIcmpEntry. 177 * XXX: I'm not sure if this file is the right place for this structure... 178 */ 179struct icmp6_ifstat { 180 /* 181 * Input statistics 182 */ 183 /* ipv6IfIcmpInMsgs, total # of input messages */ 184 u_quad_t ifs6_in_msg; 185 /* ipv6IfIcmpInErrors, # of input error messages */ 186 u_quad_t ifs6_in_error; 187 /* ipv6IfIcmpInDestUnreachs, # of input dest unreach errors */ 188 u_quad_t ifs6_in_dstunreach; 189 /* ipv6IfIcmpInAdminProhibs, # of input administratively prohibited errs */ 190 u_quad_t ifs6_in_adminprohib; 191 /* ipv6IfIcmpInTimeExcds, # of input time exceeded errors */ 192 u_quad_t ifs6_in_timeexceed; 193 /* ipv6IfIcmpInParmProblems, # of input parameter problem errors */ 194 u_quad_t ifs6_in_paramprob; 195 /* ipv6IfIcmpInPktTooBigs, # of input packet too big errors */ 196 u_quad_t ifs6_in_pkttoobig; 197 /* ipv6IfIcmpInEchos, # of input echo requests */ 198 u_quad_t ifs6_in_echo; 199 /* ipv6IfIcmpInEchoReplies, # of input echo replies */ 200 u_quad_t ifs6_in_echoreply; 201 /* ipv6IfIcmpInRouterSolicits, # of input router solicitations */ 202 u_quad_t ifs6_in_routersolicit; 203 /* ipv6IfIcmpInRouterAdvertisements, # of input router advertisements */ 204 u_quad_t ifs6_in_routeradvert; 205 /* ipv6IfIcmpInNeighborSolicits, # of input neighbor solicitations */ 206 u_quad_t ifs6_in_neighborsolicit; 207 /* ipv6IfIcmpInNeighborAdvertisements, # of input neighbor advertisements */ 208 u_quad_t ifs6_in_neighboradvert; 209 /* ipv6IfIcmpInRedirects, # of input redirects */ 210 u_quad_t ifs6_in_redirect; 211 /* ipv6IfIcmpInGroupMembQueries, # of input MLD queries */ 212 u_quad_t ifs6_in_mldquery; 213 /* ipv6IfIcmpInGroupMembResponses, # of input MLD reports */ 214 u_quad_t ifs6_in_mldreport; 215 /* ipv6IfIcmpInGroupMembReductions, # of input MLD done */ 216 u_quad_t ifs6_in_mlddone; 217 218 /* 219 * Output statistics. We should solve unresolved routing problem... 220 */ 221 /* ipv6IfIcmpOutMsgs, total # of output messages */ 222 u_quad_t ifs6_out_msg; 223 /* ipv6IfIcmpOutErrors, # of output error messages */ 224 u_quad_t ifs6_out_error; 225 /* ipv6IfIcmpOutDestUnreachs, # of output dest unreach errors */ 226 u_quad_t ifs6_out_dstunreach; 227 /* ipv6IfIcmpOutAdminProhibs, # of output administratively prohibited errs */ 228 u_quad_t ifs6_out_adminprohib; 229 /* ipv6IfIcmpOutTimeExcds, # of output time exceeded errors */ 230 u_quad_t ifs6_out_timeexceed; 231 /* ipv6IfIcmpOutParmProblems, # of output parameter problem errors */ 232 u_quad_t ifs6_out_paramprob; 233 /* ipv6IfIcmpOutPktTooBigs, # of output packet too big errors */ 234 u_quad_t ifs6_out_pkttoobig; 235 /* ipv6IfIcmpOutEchos, # of output echo requests */ 236 u_quad_t ifs6_out_echo; 237 /* ipv6IfIcmpOutEchoReplies, # of output echo replies */ 238 u_quad_t ifs6_out_echoreply; 239 /* ipv6IfIcmpOutRouterSolicits, # of output router solicitations */ 240 u_quad_t ifs6_out_routersolicit; 241 /* ipv6IfIcmpOutRouterAdvertisements, # of output router advertisements */ 242 u_quad_t ifs6_out_routeradvert; 243 /* ipv6IfIcmpOutNeighborSolicits, # of output neighbor solicitations */ 244 u_quad_t ifs6_out_neighborsolicit; 245 /* ipv6IfIcmpOutNeighborAdvertisements, # of output neighbor advertisements */ 246 u_quad_t ifs6_out_neighboradvert; 247 /* ipv6IfIcmpOutRedirects, # of output redirects */ 248 u_quad_t ifs6_out_redirect; 249 /* ipv6IfIcmpOutGroupMembQueries, # of output MLD queries */ 250 u_quad_t ifs6_out_mldquery; 251 /* ipv6IfIcmpOutGroupMembResponses, # of output MLD reports */ 252 u_quad_t ifs6_out_mldreport; 253 /* ipv6IfIcmpOutGroupMembReductions, # of output MLD done */ 254 u_quad_t ifs6_out_mlddone; 255}; 256 257/* 258 * If you make changes that change the size of in6_ifreq, 259 * make sure you fix compat/netinet6/in6_var.h 260 */ 261struct in6_ifreq { 262 char ifr_name[IFNAMSIZ]; 263 union { 264 struct sockaddr_in6 ifru_addr; 265 struct sockaddr_in6 ifru_dstaddr; 266 short ifru_flags; 267 int ifru_flags6; 268 int ifru_metric; 269 void * ifru_data; 270 struct in6_addrlifetime ifru_lifetime; 271 struct in6_ifstat ifru_stat; 272 struct icmp6_ifstat ifru_icmp6stat; 273 } ifr_ifru; 274}; 275 276struct in6_aliasreq { 277 char ifra_name[IFNAMSIZ]; 278 struct sockaddr_in6 ifra_addr; 279 struct sockaddr_in6 ifra_dstaddr; 280 struct sockaddr_in6 ifra_prefixmask; 281 int ifra_flags; 282 struct in6_addrlifetime ifra_lifetime; 283}; 284 285/* prefix type macro */ 286#define IN6_PREFIX_ND 1 287#define IN6_PREFIX_RR 2 288 289/* 290 * prefix related flags passed between kernel(NDP related part) and 291 * user land command(ifconfig) and daemon(rtadvd). 292 * Note: We originally intended to use prf_ra{} only within in6_prflags{}, but 293 * it was (probably unintentionally) used in nd6.h as well. Since C++ does 294 * not allow such a reference, prf_ra{} was then moved outside. In general, 295 * however, this structure should not be used directly. 296 */ 297struct prf_ra { 298 u_int32_t onlink : 1; 299 u_int32_t autonomous : 1; 300 u_int32_t router : 1; 301 u_int32_t reserved : 5; 302}; 303 304struct in6_prflags { 305 struct prf_ra prf_ra; 306 u_char prf_reserved1; 307 u_short prf_reserved2; 308 /* want to put this on 4byte offset */ 309 struct prf_rr { 310 u_int32_t decrvalid : 1; 311 u_int32_t decrprefd : 1; 312 u_int32_t reserved : 6; 313 } prf_rr; 314 u_char prf_reserved3; 315 u_short prf_reserved4; 316}; 317 318struct in6_prefixreq { 319 char ipr_name[IFNAMSIZ]; 320 u_char ipr_origin; 321 u_char ipr_plen; 322 u_int32_t ipr_vltime; 323 u_int32_t ipr_pltime; 324 struct in6_prflags ipr_flags; 325 struct sockaddr_in6 ipr_prefix; 326}; 327 328#define PR_ORIG_RA 0 329#define PR_ORIG_RR 1 330#define PR_ORIG_STATIC 2 331#define PR_ORIG_KERNEL 3 332 333#define ipr_raf_onlink ipr_flags.prf_ra.onlink 334#define ipr_raf_auto ipr_flags.prf_ra.autonomous 335 336#define ipr_statef_onlink ipr_flags.prf_state.onlink 337 338#define ipr_rrf_decrvalid ipr_flags.prf_rr.decrvalid 339#define ipr_rrf_decrprefd ipr_flags.prf_rr.decrprefd 340 341struct in6_rrenumreq { 342 char irr_name[IFNAMSIZ]; 343 u_char irr_origin; 344 u_char irr_m_len; /* match len for matchprefix */ 345 u_char irr_m_minlen; /* minlen for matching prefix */ 346 u_char irr_m_maxlen; /* maxlen for matching prefix */ 347 u_char irr_u_uselen; /* uselen for adding prefix */ 348 u_char irr_u_keeplen; /* keeplen from matching prefix */ 349 struct irr_raflagmask { 350 u_int32_t onlink : 1; 351 u_int32_t autonomous : 1; 352 u_int32_t reserved : 6; 353 } irr_raflagmask; 354 u_int32_t irr_vltime; 355 u_int32_t irr_pltime; 356 struct in6_prflags irr_flags; 357 struct sockaddr_in6 irr_matchprefix; 358 struct sockaddr_in6 irr_useprefix; 359}; 360 361#define irr_raf_mask_onlink irr_raflagmask.onlink 362#define irr_raf_mask_auto irr_raflagmask.autonomous 363#define irr_raf_mask_reserved irr_raflagmask.reserved 364 365#define irr_raf_onlink irr_flags.prf_ra.onlink 366#define irr_raf_auto irr_flags.prf_ra.autonomous 367 368#define irr_statef_onlink irr_flags.prf_state.onlink 369 370#define irr_rrf irr_flags.prf_rr 371#define irr_rrf_decrvalid irr_flags.prf_rr.decrvalid 372#define irr_rrf_decrprefd irr_flags.prf_rr.decrprefd 373 374/* 375 * Given a pointer to an in6_ifaddr (ifaddr), 376 * return a pointer to the addr as a sockaddr_in6 377 */ 378#define IA6_IN6(ia) (&((ia)->ia_addr.sin6_addr)) 379#define IA6_DSTIN6(ia) (&((ia)->ia_dstaddr.sin6_addr)) 380#define IA6_MASKIN6(ia) (&((ia)->ia_prefixmask.sin6_addr)) 381#define IA6_SIN6(ia) (&((ia)->ia_addr)) 382#define IA6_DSTSIN6(ia) (&((ia)->ia_dstaddr)) 383#define IFA_IN6(x) (&((struct sockaddr_in6 *)((x)->ifa_addr))->sin6_addr) 384#define IFA_DSTIN6(x) (&((struct sockaddr_in6 *)((x)->ifa_dstaddr))->sin6_addr) 385 386#ifdef _KERNEL 387#define IN6_ARE_MASKED_ADDR_EQUAL(d, a, m) ( \ 388 (((d)->s6_addr32[0] ^ (a)->s6_addr32[0]) & (m)->s6_addr32[0]) == 0 && \ 389 (((d)->s6_addr32[1] ^ (a)->s6_addr32[1]) & (m)->s6_addr32[1]) == 0 && \ 390 (((d)->s6_addr32[2] ^ (a)->s6_addr32[2]) & (m)->s6_addr32[2]) == 0 && \ 391 (((d)->s6_addr32[3] ^ (a)->s6_addr32[3]) & (m)->s6_addr32[3]) == 0 ) 392#endif 393 394#define SIOCSIFADDR_IN6 _IOW('i', 12, struct in6_ifreq) 395#define SIOCGIFADDR_IN6 _IOWR('i', 33, struct in6_ifreq) 396 397#ifdef _KERNEL 398/* 399 * SIOCSxxx ioctls should be unused (see comments in in6.c), but 400 * we do not shift numbers for binary compatibility. 401 */ 402#define SIOCSIFDSTADDR_IN6 _IOW('i', 14, struct in6_ifreq) 403#define SIOCSIFNETMASK_IN6 _IOW('i', 22, struct in6_ifreq) 404#endif 405 406#define SIOCGIFDSTADDR_IN6 _IOWR('i', 34, struct in6_ifreq) 407#define SIOCGIFNETMASK_IN6 _IOWR('i', 37, struct in6_ifreq) 408 409#define SIOCDIFADDR_IN6 _IOW('i', 25, struct in6_ifreq) 410/* 26 was OSIOCAIFADDR_IN6 */ 411 412/* 70 was OSIOCSIFPHYADDR_IN6 */ 413#define SIOCGIFPSRCADDR_IN6 _IOWR('i', 71, struct in6_ifreq) 414#define SIOCGIFPDSTADDR_IN6 _IOWR('i', 72, struct in6_ifreq) 415 416#define SIOCGIFAFLAG_IN6 _IOWR('i', 73, struct in6_ifreq) 417 418#define SIOCGDRLST_IN6 _IOWR('i', 74, struct in6_drlist) 419#define SIOCGPRLST_IN6 _IOWR('i', 75, struct in6_oprlist) 420#ifdef _KERNEL 421#define OSIOCGIFINFO_IN6 _IOWR('i', 76, struct in6_ondireq) 422#endif 423#define SIOCSNDFLUSH_IN6 _IOWR('i', 77, struct in6_ifreq) 424#define SIOCGNBRINFO_IN6 _IOWR('i', 78, struct in6_nbrinfo) 425#define SIOCSPFXFLUSH_IN6 _IOWR('i', 79, struct in6_ifreq) 426#define SIOCSRTRFLUSH_IN6 _IOWR('i', 80, struct in6_ifreq) 427/* 81 was old SIOCGIFALIFETIME_IN6 */ 428#if 0 429/* withdrawn - do not reuse number 82 */ 430#define SIOCSIFALIFETIME_IN6 _IOWR('i', 82, struct in6_ifreq) 431#endif 432#define SIOCGIFSTAT_IN6 _IOWR('i', 83, struct in6_ifreq) 433#define SIOCGIFSTAT_ICMP6 _IOWR('i', 84, struct in6_ifreq) 434 435#define SIOCSDEFIFACE_IN6 _IOWR('i', 85, struct in6_ndifreq) 436#define SIOCGDEFIFACE_IN6 _IOWR('i', 86, struct in6_ndifreq) 437 438#define SIOCSIFINFO_FLAGS _IOWR('i', 87, struct in6_ndireq) /* XXX */ 439 440#define SIOCSIFPREFIX_IN6 _IOW('i', 100, struct in6_prefixreq) /* set */ 441#define SIOCGIFPREFIX_IN6 _IOWR('i', 101, struct in6_prefixreq) /* get */ 442#define SIOCDIFPREFIX_IN6 _IOW('i', 102, struct in6_prefixreq) /* del */ 443#define SIOCAIFPREFIX_IN6 _IOW('i', 103, struct in6_rrenumreq) /* add */ 444#define SIOCCIFPREFIX_IN6 _IOW('i', 104, \ 445 struct in6_rrenumreq) /* change */ 446#define SIOCSGIFPREFIX_IN6 _IOW('i', 105, \ 447 struct in6_rrenumreq) /* set global */ 448#define SIOCGIFALIFETIME_IN6 _IOWR('i', 106, struct in6_ifreq) 449#define SIOCAIFADDR_IN6 _IOW('i', 107, struct in6_aliasreq) 450#define SIOCGIFINFO_IN6 _IOWR('i', 108, struct in6_ndireq) 451#define SIOCSIFINFO_IN6 _IOWR('i', 109, struct in6_ndireq) 452#define SIOCSIFPHYADDR_IN6 _IOW('i', 110, struct in6_aliasreq) 453 454 455/* XXX: Someone decided to switch to 'u' here for unknown reasons! */ 456#define SIOCGETSGCNT_IN6 _IOWR('u', 106, \ 457 struct sioc_sg_req6) /* get s,g pkt cnt */ 458#define SIOCGETMIFCNT_IN6 _IOWR('u', 107, \ 459 struct sioc_mif_req6) /* get pkt cnt per if */ 460#define SIOCAADDRCTL_POLICY _IOW('u', 108, struct in6_addrpolicy) 461#define SIOCDADDRCTL_POLICY _IOW('u', 109, struct in6_addrpolicy) 462 463#define IN6_IFF_ANYCAST 0x01 /* anycast address */ 464#define IN6_IFF_TENTATIVE 0x02 /* tentative address */ 465#define IN6_IFF_DUPLICATED 0x04 /* DAD detected duplicate */ 466#define IN6_IFF_DETACHED 0x08 /* may be detached from the link */ 467#define IN6_IFF_DEPRECATED 0x10 /* deprecated address */ 468#define IN6_IFF_NODAD 0x20 /* don't perform DAD on this address 469 * (used only at first SIOC* call) 470 */ 471#define IN6_IFF_AUTOCONF 0x40 /* autoconfigurable address. */ 472#define IN6_IFF_TEMPORARY 0x80 /* temporary (anonymous) address. */ 473 474/* do not input/output */ 475#define IN6_IFF_NOTREADY (IN6_IFF_TENTATIVE|IN6_IFF_DUPLICATED) 476 477#ifdef _KERNEL 478#define IN6_ARE_SCOPE_CMP(a,b) ((a)-(b)) 479#define IN6_ARE_SCOPE_EQUAL(a,b) ((a)==(b)) 480#endif 481 482#ifdef _KERNEL 483 484#include <net/pktqueue.h> 485 486extern pktqueue_t *ip6_pktq; 487 488MALLOC_DECLARE(M_IP6OPT); 489 490extern struct in6_ifaddr *in6_ifaddr; 491 492#define in6_ifstat_inc(ifp, tag) \ 493do { \ 494 if (ifp) \ 495 ((struct in6_ifextra *)((ifp)->if_afdata[AF_INET6]))->in6_ifstat->tag++; \ 496} while (/*CONSTCOND*/ 0) 497 498extern const struct in6_addr zeroin6_addr; 499extern const u_char inet6ctlerrmap[]; 500extern unsigned long in6_maxmtu; 501extern bool in6_present; 502 503/* 504 * Macro for finding the internet address structure (in6_ifaddr) corresponding 505 * to a given interface (ifnet structure). 506 */ 507static inline struct in6_ifaddr * 508ifp_to_ia6(struct ifnet *ifp) 509{ 510 struct ifaddr *ifa; 511 512 IFADDR_FOREACH(ifa, ifp) { 513 if (ifa->ifa_addr == NULL) 514 continue; 515 if (ifa->ifa_addr->sa_family == AF_INET6) 516 break; 517 } 518 return (struct in6_ifaddr *)ifa; 519} 520 521#define IFP_TO_IA6(__ifp, __ia) \ 522do { \ 523 (__ia) = ifp_to_ia6((__ifp)); \ 524} while (/*CONSTCOND*/0) 525 526 527#endif /* _KERNEL */ 528 529/* 530 * Multi-cast membership entry. One for each group/ifp that a PCB 531 * belongs to. 532 */ 533struct in6_multi_mship { 534 struct in6_multi *i6mm_maddr; /* Multicast address pointer */ 535 LIST_ENTRY(in6_multi_mship) i6mm_chain; /* multicast options chain */ 536}; 537 538struct in6_multi { 539 LIST_ENTRY(in6_multi) in6m_entry; /* list glue */ 540 struct in6_addr in6m_addr; /* IP6 multicast address */ 541 struct ifnet *in6m_ifp; /* back pointer to ifnet */ 542 struct in6_ifaddr *in6m_ia; /* back pointer to in6_ifaddr */ 543 u_int in6m_refcount; /* # membership claims by sockets */ 544 u_int in6m_state; /* state of the membership */ 545 int in6m_timer; /* delay to send the 1st report */ 546 struct timeval in6m_timer_expire; /* when the timer expires */ 547 callout_t in6m_timer_ch; 548}; 549 550#define IN6M_TIMER_UNDEF -1 551 552 553#ifdef _KERNEL 554/* flags to in6_update_ifa */ 555#define IN6_IFAUPDATE_DADDELAY 0x1 /* first time to configure an address */ 556 557/* 558 * Structure used by macros below to remember position when stepping through 559 * all of the in6_multi records. 560 */ 561struct in6_multistep { 562 struct in6_ifaddr *i_ia; 563 struct in6_multi *i_in6m; 564}; 565 566/* 567 * Macros for looking up the in6_multi record for a given IP6 multicast 568 * address on a given interface. If no matching record is found, "in6m" 569 * returns NULL. 570 */ 571 572static inline struct in6_multi * 573in6_lookup_multi(struct in6_addr *addr, struct ifnet *ifp) 574{ 575 struct in6_multi *in6m; 576 struct in6_ifaddr *ia; 577 578 if ((ia = ifp_to_ia6(ifp)) == NULL) 579 return NULL; 580 LIST_FOREACH(in6m, &ia->ia6_multiaddrs, in6m_entry) { 581 if (IN6_ARE_ADDR_EQUAL(&in6m->in6m_addr, addr)) 582 break; 583 } 584 return in6m; 585} 586 587#define IN6_LOOKUP_MULTI(__addr, __ifp, __in6m) \ 588/* struct in6_addr __addr; */ \ 589/* struct ifnet *__ifp; */ \ 590/* struct in6_multi *__in6m; */ \ 591do { \ 592 (__in6m) = in6_lookup_multi(&(__addr), (__ifp)); \ 593} while (/*CONSTCOND*/ 0) 594 595/* 596 * Macro to step through all of the in6_multi records, one at a time. 597 * The current position is remembered in "step", which the caller must 598 * provide. IN6_FIRST_MULTI(), below, must be called to initialize "step" 599 * and get the first record. Both macros return a NULL "in6m" when there 600 * are no remaining records. 601 */ 602static inline struct in6_multi * 603in6_next_multi(struct in6_multistep *step) 604{ 605 struct in6_multi *in6m; 606 607 if ((in6m = step->i_in6m) != NULL) { 608 step->i_in6m = LIST_NEXT(in6m, in6m_entry); 609 return in6m; 610 } 611 while (step->i_ia != NULL) { 612 in6m = LIST_FIRST(&step->i_ia->ia6_multiaddrs); 613 step->i_ia = step->i_ia->ia_next; 614 if (in6m != NULL) { 615 step->i_in6m = LIST_NEXT(in6m, in6m_entry); 616 break; 617 } 618 } 619 return in6m; 620} 621 622static inline struct in6_multi * 623in6_first_multi(struct in6_multistep *step) 624{ 625 step->i_ia = in6_ifaddr; 626 step->i_in6m = NULL; 627 return in6_next_multi(step); 628} 629 630#define IN6_NEXT_MULTI(__step, __in6m) \ 631/* struct in6_multistep __step; */ \ 632/* struct in6_multi *__in6m; */ \ 633do { \ 634 (__in6m) = in6_next_multi(&(__step)); \ 635} while (/*CONSTCOND*/ 0) 636 637#define IN6_FIRST_MULTI(__step, __in6m) \ 638/* struct in6_multistep __step; */ \ 639/* struct in6_multi *__in6m */ \ 640do { \ 641 (__in6m) = in6_first_multi(&(__step)); \ 642} while (/*CONSTCOND*/ 0) 643 644 645#if 0 646/* 647 * Macros for looking up the in6_multi_mship record for a given IP6 multicast 648 * address on a given interface. If no matching record is found, "imm" 649 * returns NULL. 650 */ 651static inline struct in6_multi_mship * 652in6_lookup_mship(struct in6_addr *addr, struct ifnet *ifp, 653 struct ip6_moptions *imop) 654{ 655 struct in6_multi_mship *imm; 656 657 LIST_FOREACH(imm, &imop->im6o_memberships, i6mm_chain) { 658 if (imm->i6mm_maddr->in6m_ifp != ifp) 659 continue; 660 if (IN6_ARE_ADDR_EQUAL(&imm->i6mm_maddr->in6m_addr, 661 addr)) 662 break; 663 } 664 return imm; 665} 666 667#define IN6_LOOKUP_MSHIP(__addr, __ifp, __imop, __imm) \ 668/* struct in6_addr __addr; */ \ 669/* struct ifnet *__ifp; */ \ 670/* struct ip6_moptions *__imop */ \ 671/* struct in6_multi_mship *__imm; */ \ 672do { \ 673 (__imm) = in6_lookup_mship(&(__addr), (__ifp), (__imop)); \ 674} while (/*CONSTCOND*/ 0) 675#endif 676 677struct in6_multi *in6_addmulti(struct in6_addr *, struct ifnet *, 678 int *, int); 679void in6_delmulti(struct in6_multi *); 680struct in6_multi_mship *in6_joingroup(struct ifnet *, struct in6_addr *, 681 int *, int); 682int in6_leavegroup(struct in6_multi_mship *); 683int in6_mask2len(struct in6_addr *, u_char *); 684int in6_control(struct socket *, u_long, void *, struct ifnet *); 685int in6_update_ifa(struct ifnet *, struct in6_aliasreq *, 686 struct in6_ifaddr *, int); 687void in6_purgeaddr(struct ifaddr *); 688int in6if_do_dad(struct ifnet *); 689void in6_purgeif(struct ifnet *); 690void in6_savemkludge(struct in6_ifaddr *); 691void in6_setmaxmtu (void); 692int in6_if2idlen (struct ifnet *); 693void *in6_domifattach(struct ifnet *); 694void in6_domifdetach(struct ifnet *, void *); 695void in6_restoremkludge(struct in6_ifaddr *, struct ifnet *); 696void in6_ifremlocal(struct ifaddr *); 697void in6_ifaddlocal(struct ifaddr *); 698void in6_createmkludge(struct ifnet *); 699void in6_purgemkludge(struct ifnet *); 700struct in6_ifaddr *in6ifa_ifpforlinklocal(const struct ifnet *, int); 701struct in6_ifaddr *in6ifa_ifpwithaddr(const struct ifnet *, 702 const struct in6_addr *); 703char *ip6_sprintf(const struct in6_addr *); 704int in6_matchlen(struct in6_addr *, struct in6_addr *); 705int in6_are_prefix_equal(struct in6_addr *, struct in6_addr *, int); 706void in6_prefixlen2mask(struct in6_addr *, int); 707void in6_purgeprefix(struct ifnet *); 708 709int ip6flow_fastforward(struct mbuf **); /* IPv6 fast forward routine */ 710 711int in6_src_ioctl(u_long, void *); 712int in6_is_addr_deprecated(struct sockaddr_in6 *); 713struct in6pcb; 714#endif /* _KERNEL */ 715 716#endif /* !_NETINET6_IN6_VAR_H_ */ 717