1 1.108 andvar /* $NetBSD: in6_var.h,v 1.108 2025/06/27 21:36:23 andvar Exp $ */ 2 1.32 itojun /* $KAME: in6_var.h,v 1.81 2002/06/08 11:16:51 itojun Exp $ */ 3 1.3 thorpej 4 1.2 itojun /* 5 1.2 itojun * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. 6 1.2 itojun * All rights reserved. 7 1.15 itojun * 8 1.2 itojun * Redistribution and use in source and binary forms, with or without 9 1.2 itojun * modification, are permitted provided that the following conditions 10 1.2 itojun * are met: 11 1.2 itojun * 1. Redistributions of source code must retain the above copyright 12 1.2 itojun * notice, this list of conditions and the following disclaimer. 13 1.2 itojun * 2. Redistributions in binary form must reproduce the above copyright 14 1.2 itojun * notice, this list of conditions and the following disclaimer in the 15 1.2 itojun * documentation and/or other materials provided with the distribution. 16 1.2 itojun * 3. Neither the name of the project nor the names of its contributors 17 1.2 itojun * may be used to endorse or promote products derived from this software 18 1.2 itojun * without specific prior written permission. 19 1.15 itojun * 20 1.2 itojun * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND 21 1.2 itojun * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22 1.2 itojun * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 23 1.2 itojun * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE 24 1.2 itojun * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25 1.2 itojun * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 26 1.2 itojun * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 27 1.2 itojun * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 28 1.2 itojun * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 29 1.2 itojun * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 30 1.2 itojun * SUCH DAMAGE. 31 1.2 itojun */ 32 1.2 itojun 33 1.2 itojun /* 34 1.2 itojun * Copyright (c) 1985, 1986, 1993 35 1.2 itojun * The Regents of the University of California. All rights reserved. 36 1.2 itojun * 37 1.2 itojun * Redistribution and use in source and binary forms, with or without 38 1.2 itojun * modification, are permitted provided that the following conditions 39 1.2 itojun * are met: 40 1.2 itojun * 1. Redistributions of source code must retain the above copyright 41 1.2 itojun * notice, this list of conditions and the following disclaimer. 42 1.2 itojun * 2. Redistributions in binary form must reproduce the above copyright 43 1.2 itojun * notice, this list of conditions and the following disclaimer in the 44 1.2 itojun * documentation and/or other materials provided with the distribution. 45 1.35 agc * 3. Neither the name of the University nor the names of its contributors 46 1.2 itojun * may be used to endorse or promote products derived from this software 47 1.2 itojun * without specific prior written permission. 48 1.2 itojun * 49 1.2 itojun * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 50 1.2 itojun * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 51 1.2 itojun * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 52 1.2 itojun * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 53 1.2 itojun * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 54 1.2 itojun * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 55 1.2 itojun * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 56 1.2 itojun * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 57 1.2 itojun * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 58 1.2 itojun * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 59 1.2 itojun * SUCH DAMAGE. 60 1.2 itojun * 61 1.2 itojun * @(#)in_var.h 8.1 (Berkeley) 6/10/93 62 1.2 itojun */ 63 1.2 itojun 64 1.2 itojun #ifndef _NETINET6_IN6_VAR_H_ 65 1.2 itojun #define _NETINET6_IN6_VAR_H_ 66 1.2 itojun 67 1.55 jld #include <sys/callout.h> 68 1.74 dholland #include <sys/ioccom.h> 69 1.55 jld 70 1.2 itojun /* 71 1.2 itojun * Interface address, Internet version. One of these structures 72 1.2 itojun * is allocated for each interface with an Internet address. 73 1.2 itojun * The ifaddr structure contains the protocol-independent part 74 1.2 itojun * of the structure and is assumed to be first. 75 1.2 itojun */ 76 1.2 itojun 77 1.2 itojun /* 78 1.2 itojun * pltime/vltime are just for future reference (required to implements 2 79 1.2 itojun * hour rule for hosts). they should never be modified by nd6_timeout or 80 1.2 itojun * anywhere else. 81 1.2 itojun * userland -> kernel: accept pltime/vltime 82 1.22 itojun * kernel -> userland: throw up everything 83 1.2 itojun * in kernel: modify preferred/expire only 84 1.2 itojun */ 85 1.2 itojun struct in6_addrlifetime { 86 1.62 christos time_t ia6t_expire; /* valid lifetime expiration time */ 87 1.62 christos time_t ia6t_preferred; /* preferred lifetime expiration time */ 88 1.2 itojun u_int32_t ia6t_vltime; /* valid lifetime */ 89 1.2 itojun u_int32_t ia6t_pltime; /* prefix lifetime */ 90 1.2 itojun }; 91 1.2 itojun 92 1.75 ozaki struct lltable; 93 1.103 roy struct nd_kifinfo; 94 1.26 itojun struct in6_ifextra { 95 1.26 itojun struct in6_ifstat *in6_ifstat; 96 1.26 itojun struct icmp6_ifstat *icmp6_ifstat; 97 1.103 roy struct nd_kifinfo *nd_ifinfo; 98 1.41 rpaulo struct scope6_id *scope6_id; 99 1.75 ozaki struct lltable *lltable; 100 1.26 itojun }; 101 1.26 itojun 102 1.71 matt LIST_HEAD(in6_multihead, in6_multi); 103 1.2 itojun struct in6_ifaddr { 104 1.2 itojun struct ifaddr ia_ifa; /* protocol-independent info */ 105 1.2 itojun #define ia_ifp ia_ifa.ifa_ifp 106 1.2 itojun #define ia_flags ia_ifa.ifa_flags 107 1.2 itojun struct sockaddr_in6 ia_addr; /* interface address */ 108 1.2 itojun struct sockaddr_in6 ia_net; /* network number of interface */ 109 1.2 itojun struct sockaddr_in6 ia_dstaddr; /* space for destination addr */ 110 1.2 itojun struct sockaddr_in6 ia_prefixmask; /* prefix mask */ 111 1.4 itojun u_int32_t ia_plen; /* prefix length */ 112 1.78 ozaki /* DEPRECATED. Keep it to avoid breaking kvm(3) users */ 113 1.2 itojun struct in6_ifaddr *ia_next; /* next in6 list of IP6 addresses */ 114 1.93 ozaki /* DEPRECATED. Keep it to avoid breaking kvm(3) users */ 115 1.93 ozaki struct in6_multihead _ia6_multiaddrs; 116 1.2 itojun /* list of multicast addresses */ 117 1.2 itojun int ia6_flags; 118 1.2 itojun 119 1.32 itojun struct in6_addrlifetime ia6_lifetime; 120 1.32 itojun time_t ia6_createtime; /* the creation time of this address, which is 121 1.32 itojun * currently used for temporary addresses only. 122 1.32 itojun */ 123 1.32 itojun time_t ia6_updatetime; 124 1.32 itojun 125 1.32 itojun /* multicast addresses joined from the kernel */ 126 1.32 itojun LIST_HEAD(, in6_multi_mship) ia6_memberships; 127 1.78 ozaki 128 1.79 ozaki #ifdef _KERNEL 129 1.78 ozaki struct pslist_entry ia6_pslist_entry; 130 1.79 ozaki #endif 131 1.5 itojun }; 132 1.5 itojun 133 1.84 ozaki #ifdef _KERNEL 134 1.98 christos static __inline void 135 1.84 ozaki ia6_acquire(struct in6_ifaddr *ia, struct psref *psref) 136 1.84 ozaki { 137 1.84 ozaki 138 1.84 ozaki KASSERT(ia != NULL); 139 1.84 ozaki ifa_acquire(&ia->ia_ifa, psref); 140 1.84 ozaki } 141 1.84 ozaki 142 1.98 christos static __inline void 143 1.84 ozaki ia6_release(struct in6_ifaddr *ia, struct psref *psref) 144 1.84 ozaki { 145 1.84 ozaki 146 1.84 ozaki if (ia == NULL) 147 1.84 ozaki return; 148 1.84 ozaki ifa_release(&ia->ia_ifa, psref); 149 1.84 ozaki } 150 1.84 ozaki #endif 151 1.84 ozaki 152 1.41 rpaulo /* control structure to manage address selection policy */ 153 1.41 rpaulo struct in6_addrpolicy { 154 1.41 rpaulo struct sockaddr_in6 addr; /* prefix address */ 155 1.41 rpaulo struct sockaddr_in6 addrmask; /* prefix mask */ 156 1.41 rpaulo int preced; /* precedence */ 157 1.41 rpaulo int label; /* matching label */ 158 1.41 rpaulo u_quad_t use; /* statistics */ 159 1.41 rpaulo }; 160 1.41 rpaulo 161 1.5 itojun /* 162 1.5 itojun * IPv6 interface statistics, as defined in RFC2465 Ipv6IfStatsEntry (p12). 163 1.5 itojun */ 164 1.5 itojun struct in6_ifstat { 165 1.5 itojun u_quad_t ifs6_in_receive; /* # of total input datagram */ 166 1.5 itojun u_quad_t ifs6_in_hdrerr; /* # of datagrams with invalid hdr */ 167 1.5 itojun u_quad_t ifs6_in_toobig; /* # of datagrams exceeded MTU */ 168 1.5 itojun u_quad_t ifs6_in_noroute; /* # of datagrams with no route */ 169 1.5 itojun u_quad_t ifs6_in_addrerr; /* # of datagrams with invalid dst */ 170 1.5 itojun u_quad_t ifs6_in_protounknown; /* # of datagrams with unknown proto */ 171 1.5 itojun /* NOTE: increment on final dst if */ 172 1.5 itojun u_quad_t ifs6_in_truncated; /* # of truncated datagrams */ 173 1.5 itojun u_quad_t ifs6_in_discard; /* # of discarded datagrams */ 174 1.5 itojun /* NOTE: fragment timeout is not here */ 175 1.5 itojun u_quad_t ifs6_in_deliver; /* # of datagrams delivered to ULP */ 176 1.5 itojun /* NOTE: increment on final dst if */ 177 1.5 itojun u_quad_t ifs6_out_forward; /* # of datagrams forwarded */ 178 1.5 itojun /* NOTE: increment on outgoing if */ 179 1.5 itojun u_quad_t ifs6_out_request; /* # of outgoing datagrams from ULP */ 180 1.108 andvar /* NOTE: does not include forwards */ 181 1.5 itojun u_quad_t ifs6_out_discard; /* # of discarded datagrams */ 182 1.5 itojun u_quad_t ifs6_out_fragok; /* # of datagrams fragmented */ 183 1.5 itojun u_quad_t ifs6_out_fragfail; /* # of datagrams failed on fragment */ 184 1.5 itojun u_quad_t ifs6_out_fragcreat; /* # of fragment datagrams */ 185 1.5 itojun /* NOTE: this is # after fragment */ 186 1.5 itojun u_quad_t ifs6_reass_reqd; /* # of incoming fragmented packets */ 187 1.5 itojun /* NOTE: increment on final dst if */ 188 1.5 itojun u_quad_t ifs6_reass_ok; /* # of reassembled packets */ 189 1.5 itojun /* NOTE: this is # after reass */ 190 1.5 itojun /* NOTE: increment on final dst if */ 191 1.5 itojun u_quad_t ifs6_reass_fail; /* # of reass failures */ 192 1.5 itojun /* NOTE: may not be packet count */ 193 1.5 itojun /* NOTE: increment on final dst if */ 194 1.5 itojun u_quad_t ifs6_in_mcast; /* # of inbound multicast datagrams */ 195 1.5 itojun u_quad_t ifs6_out_mcast; /* # of outbound multicast datagrams */ 196 1.5 itojun }; 197 1.5 itojun 198 1.5 itojun /* 199 1.5 itojun * ICMPv6 interface statistics, as defined in RFC2466 Ipv6IfIcmpEntry. 200 1.5 itojun * XXX: I'm not sure if this file is the right place for this structure... 201 1.5 itojun */ 202 1.5 itojun struct icmp6_ifstat { 203 1.5 itojun /* 204 1.5 itojun * Input statistics 205 1.5 itojun */ 206 1.5 itojun /* ipv6IfIcmpInMsgs, total # of input messages */ 207 1.5 itojun u_quad_t ifs6_in_msg; 208 1.5 itojun /* ipv6IfIcmpInErrors, # of input error messages */ 209 1.5 itojun u_quad_t ifs6_in_error; 210 1.5 itojun /* ipv6IfIcmpInDestUnreachs, # of input dest unreach errors */ 211 1.5 itojun u_quad_t ifs6_in_dstunreach; 212 1.5 itojun /* ipv6IfIcmpInAdminProhibs, # of input administratively prohibited errs */ 213 1.5 itojun u_quad_t ifs6_in_adminprohib; 214 1.5 itojun /* ipv6IfIcmpInTimeExcds, # of input time exceeded errors */ 215 1.5 itojun u_quad_t ifs6_in_timeexceed; 216 1.5 itojun /* ipv6IfIcmpInParmProblems, # of input parameter problem errors */ 217 1.5 itojun u_quad_t ifs6_in_paramprob; 218 1.5 itojun /* ipv6IfIcmpInPktTooBigs, # of input packet too big errors */ 219 1.5 itojun u_quad_t ifs6_in_pkttoobig; 220 1.5 itojun /* ipv6IfIcmpInEchos, # of input echo requests */ 221 1.5 itojun u_quad_t ifs6_in_echo; 222 1.5 itojun /* ipv6IfIcmpInEchoReplies, # of input echo replies */ 223 1.5 itojun u_quad_t ifs6_in_echoreply; 224 1.5 itojun /* ipv6IfIcmpInRouterSolicits, # of input router solicitations */ 225 1.5 itojun u_quad_t ifs6_in_routersolicit; 226 1.5 itojun /* ipv6IfIcmpInRouterAdvertisements, # of input router advertisements */ 227 1.5 itojun u_quad_t ifs6_in_routeradvert; 228 1.5 itojun /* ipv6IfIcmpInNeighborSolicits, # of input neighbor solicitations */ 229 1.5 itojun u_quad_t ifs6_in_neighborsolicit; 230 1.5 itojun /* ipv6IfIcmpInNeighborAdvertisements, # of input neighbor advertisements */ 231 1.5 itojun u_quad_t ifs6_in_neighboradvert; 232 1.5 itojun /* ipv6IfIcmpInRedirects, # of input redirects */ 233 1.5 itojun u_quad_t ifs6_in_redirect; 234 1.5 itojun /* ipv6IfIcmpInGroupMembQueries, # of input MLD queries */ 235 1.5 itojun u_quad_t ifs6_in_mldquery; 236 1.5 itojun /* ipv6IfIcmpInGroupMembResponses, # of input MLD reports */ 237 1.5 itojun u_quad_t ifs6_in_mldreport; 238 1.5 itojun /* ipv6IfIcmpInGroupMembReductions, # of input MLD done */ 239 1.5 itojun u_quad_t ifs6_in_mlddone; 240 1.5 itojun 241 1.5 itojun /* 242 1.15 itojun * Output statistics. We should solve unresolved routing problem... 243 1.5 itojun */ 244 1.5 itojun /* ipv6IfIcmpOutMsgs, total # of output messages */ 245 1.5 itojun u_quad_t ifs6_out_msg; 246 1.5 itojun /* ipv6IfIcmpOutErrors, # of output error messages */ 247 1.5 itojun u_quad_t ifs6_out_error; 248 1.5 itojun /* ipv6IfIcmpOutDestUnreachs, # of output dest unreach errors */ 249 1.5 itojun u_quad_t ifs6_out_dstunreach; 250 1.5 itojun /* ipv6IfIcmpOutAdminProhibs, # of output administratively prohibited errs */ 251 1.5 itojun u_quad_t ifs6_out_adminprohib; 252 1.5 itojun /* ipv6IfIcmpOutTimeExcds, # of output time exceeded errors */ 253 1.5 itojun u_quad_t ifs6_out_timeexceed; 254 1.5 itojun /* ipv6IfIcmpOutParmProblems, # of output parameter problem errors */ 255 1.5 itojun u_quad_t ifs6_out_paramprob; 256 1.5 itojun /* ipv6IfIcmpOutPktTooBigs, # of output packet too big errors */ 257 1.5 itojun u_quad_t ifs6_out_pkttoobig; 258 1.5 itojun /* ipv6IfIcmpOutEchos, # of output echo requests */ 259 1.5 itojun u_quad_t ifs6_out_echo; 260 1.5 itojun /* ipv6IfIcmpOutEchoReplies, # of output echo replies */ 261 1.5 itojun u_quad_t ifs6_out_echoreply; 262 1.5 itojun /* ipv6IfIcmpOutRouterSolicits, # of output router solicitations */ 263 1.5 itojun u_quad_t ifs6_out_routersolicit; 264 1.5 itojun /* ipv6IfIcmpOutRouterAdvertisements, # of output router advertisements */ 265 1.5 itojun u_quad_t ifs6_out_routeradvert; 266 1.5 itojun /* ipv6IfIcmpOutNeighborSolicits, # of output neighbor solicitations */ 267 1.5 itojun u_quad_t ifs6_out_neighborsolicit; 268 1.5 itojun /* ipv6IfIcmpOutNeighborAdvertisements, # of output neighbor advertisements */ 269 1.5 itojun u_quad_t ifs6_out_neighboradvert; 270 1.5 itojun /* ipv6IfIcmpOutRedirects, # of output redirects */ 271 1.5 itojun u_quad_t ifs6_out_redirect; 272 1.5 itojun /* ipv6IfIcmpOutGroupMembQueries, # of output MLD queries */ 273 1.5 itojun u_quad_t ifs6_out_mldquery; 274 1.5 itojun /* ipv6IfIcmpOutGroupMembResponses, # of output MLD reports */ 275 1.5 itojun u_quad_t ifs6_out_mldreport; 276 1.5 itojun /* ipv6IfIcmpOutGroupMembReductions, # of output MLD done */ 277 1.5 itojun u_quad_t ifs6_out_mlddone; 278 1.2 itojun }; 279 1.2 itojun 280 1.64 christos /* 281 1.64 christos * If you make changes that change the size of in6_ifreq, 282 1.64 christos * make sure you fix compat/netinet6/in6_var.h 283 1.64 christos */ 284 1.2 itojun struct in6_ifreq { 285 1.2 itojun char ifr_name[IFNAMSIZ]; 286 1.2 itojun union { 287 1.2 itojun struct sockaddr_in6 ifru_addr; 288 1.2 itojun struct sockaddr_in6 ifru_dstaddr; 289 1.2 itojun short ifru_flags; 290 1.2 itojun int ifru_flags6; 291 1.2 itojun int ifru_metric; 292 1.50 christos void * ifru_data; 293 1.2 itojun struct in6_addrlifetime ifru_lifetime; 294 1.5 itojun struct in6_ifstat ifru_stat; 295 1.5 itojun struct icmp6_ifstat ifru_icmp6stat; 296 1.2 itojun } ifr_ifru; 297 1.2 itojun }; 298 1.2 itojun 299 1.2 itojun struct in6_aliasreq { 300 1.2 itojun char ifra_name[IFNAMSIZ]; 301 1.2 itojun struct sockaddr_in6 ifra_addr; 302 1.2 itojun struct sockaddr_in6 ifra_dstaddr; 303 1.2 itojun struct sockaddr_in6 ifra_prefixmask; 304 1.2 itojun int ifra_flags; 305 1.2 itojun struct in6_addrlifetime ifra_lifetime; 306 1.2 itojun }; 307 1.2 itojun 308 1.2 itojun /* 309 1.2 itojun * Given a pointer to an in6_ifaddr (ifaddr), 310 1.2 itojun * return a pointer to the addr as a sockaddr_in6 311 1.2 itojun */ 312 1.5 itojun #define IA6_IN6(ia) (&((ia)->ia_addr.sin6_addr)) 313 1.5 itojun #define IA6_DSTIN6(ia) (&((ia)->ia_dstaddr.sin6_addr)) 314 1.5 itojun #define IA6_MASKIN6(ia) (&((ia)->ia_prefixmask.sin6_addr)) 315 1.5 itojun #define IA6_SIN6(ia) (&((ia)->ia_addr)) 316 1.5 itojun #define IA6_DSTSIN6(ia) (&((ia)->ia_dstaddr)) 317 1.5 itojun #define IFA_IN6(x) (&((struct sockaddr_in6 *)((x)->ifa_addr))->sin6_addr) 318 1.5 itojun #define IFA_DSTIN6(x) (&((struct sockaddr_in6 *)((x)->ifa_dstaddr))->sin6_addr) 319 1.2 itojun 320 1.5 itojun #ifdef _KERNEL 321 1.2 itojun #define IN6_ARE_MASKED_ADDR_EQUAL(d, a, m) ( \ 322 1.2 itojun (((d)->s6_addr32[0] ^ (a)->s6_addr32[0]) & (m)->s6_addr32[0]) == 0 && \ 323 1.2 itojun (((d)->s6_addr32[1] ^ (a)->s6_addr32[1]) & (m)->s6_addr32[1]) == 0 && \ 324 1.2 itojun (((d)->s6_addr32[2] ^ (a)->s6_addr32[2]) & (m)->s6_addr32[2]) == 0 && \ 325 1.2 itojun (((d)->s6_addr32[3] ^ (a)->s6_addr32[3]) & (m)->s6_addr32[3]) == 0 ) 326 1.5 itojun #endif 327 1.2 itojun 328 1.2 itojun #define SIOCSIFADDR_IN6 _IOW('i', 12, struct in6_ifreq) 329 1.2 itojun #define SIOCGIFADDR_IN6 _IOWR('i', 33, struct in6_ifreq) 330 1.11 itojun 331 1.11 itojun #ifdef _KERNEL 332 1.11 itojun /* 333 1.11 itojun * SIOCSxxx ioctls should be unused (see comments in in6.c), but 334 1.11 itojun * we do not shift numbers for binary compatibility. 335 1.11 itojun */ 336 1.2 itojun #define SIOCSIFDSTADDR_IN6 _IOW('i', 14, struct in6_ifreq) 337 1.11 itojun #define SIOCSIFNETMASK_IN6 _IOW('i', 22, struct in6_ifreq) 338 1.15 itojun #endif 339 1.11 itojun 340 1.2 itojun #define SIOCGIFDSTADDR_IN6 _IOWR('i', 34, struct in6_ifreq) 341 1.2 itojun #define SIOCGIFNETMASK_IN6 _IOWR('i', 37, struct in6_ifreq) 342 1.2 itojun 343 1.2 itojun #define SIOCDIFADDR_IN6 _IOW('i', 25, struct in6_ifreq) 344 1.63 christos /* 26 was OSIOCAIFADDR_IN6 */ 345 1.2 itojun 346 1.63 christos /* 70 was OSIOCSIFPHYADDR_IN6 */ 347 1.2 itojun #define SIOCGIFPSRCADDR_IN6 _IOWR('i', 71, struct in6_ifreq) 348 1.2 itojun #define SIOCGIFPDSTADDR_IN6 _IOWR('i', 72, struct in6_ifreq) 349 1.2 itojun 350 1.2 itojun #define SIOCGIFAFLAG_IN6 _IOWR('i', 73, struct in6_ifreq) 351 1.2 itojun 352 1.103 roy /* 353 1.103 roy * 74 was SIOCGDRLST_IN6 354 1.103 roy * 75 was SIOCGPRLST_IN6 355 1.103 roy * 76 was OSIOCGIFINFO_IN6 356 1.103 roy * 77 was SIOCSNDFLUSH_IN6 357 1.103 roy */ 358 1.2 itojun #define SIOCGNBRINFO_IN6 _IOWR('i', 78, struct in6_nbrinfo) 359 1.103 roy /* 360 1.103 roy * 79 was SIOCSPFXFLUSH_IN6 361 1.103 roy * 80 was SIOCSRTRFLUSH_IN6 362 1.103 roy * 81 was SIOCGIFALIFETIME_IN6 363 1.103 roy */ 364 1.53 gdt #if 0 365 1.53 gdt /* withdrawn - do not reuse number 82 */ 366 1.2 itojun #define SIOCSIFALIFETIME_IN6 _IOWR('i', 82, struct in6_ifreq) 367 1.53 gdt #endif 368 1.5 itojun #define SIOCGIFSTAT_IN6 _IOWR('i', 83, struct in6_ifreq) 369 1.5 itojun #define SIOCGIFSTAT_ICMP6 _IOWR('i', 84, struct in6_ifreq) 370 1.5 itojun 371 1.103 roy /* 372 1.103 roy * 85 was SIOCSDEFIFACE_IN6 373 1.103 roy * 86 was SIOCGDEFIFACE_IN6 374 1.103 roy * 87 was OSIOCSIFINFO_FLAGS 375 1.103 roy * 100 was SIOCSIFPREFIX_IN6 376 1.103 roy * 101 was SIOCGIFPREFIX_IN6 377 1.103 roy * 102 was SIOCDIFPREFIX_IN6 378 1.103 roy * 103 was SIOCAIFPREFIX_IN6 379 1.103 roy * 104 was SIOCCIFPREFIX_IN6 380 1.103 roy * 105 was SIOCSGIFPREFIX_IN6 381 1.103 roy */ 382 1.62 christos #define SIOCGIFALIFETIME_IN6 _IOWR('i', 106, struct in6_ifreq) 383 1.63 christos #define SIOCAIFADDR_IN6 _IOW('i', 107, struct in6_aliasreq) 384 1.103 roy /* 108 was OSIOCGIFINFO_IN6_90 385 1.103 roy * 109 was OSIOCSIFINFO_IN6_90 */ 386 1.63 christos #define SIOCSIFPHYADDR_IN6 _IOW('i', 110, struct in6_aliasreq) 387 1.103 roy /* 110 - 112 are defined in net/if_pppoe.h */ 388 1.103 roy #define SIOCGIFINFO_IN6 _IOWR('i', 113, struct in6_ndireq) 389 1.103 roy #define SIOCSIFINFO_IN6 _IOWR('i', 114, struct in6_ndireq) 390 1.103 roy #define SIOCSIFINFO_FLAGS _IOWR('i', 115, struct in6_ndireq) 391 1.2 itojun 392 1.62 christos /* XXX: Someone decided to switch to 'u' here for unknown reasons! */ 393 1.2 itojun #define SIOCGETSGCNT_IN6 _IOWR('u', 106, \ 394 1.2 itojun struct sioc_sg_req6) /* get s,g pkt cnt */ 395 1.2 itojun #define SIOCGETMIFCNT_IN6 _IOWR('u', 107, \ 396 1.2 itojun struct sioc_mif_req6) /* get pkt cnt per if */ 397 1.41 rpaulo #define SIOCAADDRCTL_POLICY _IOW('u', 108, struct in6_addrpolicy) 398 1.41 rpaulo #define SIOCDADDRCTL_POLICY _IOW('u', 109, struct in6_addrpolicy) 399 1.2 itojun 400 1.2 itojun #define IN6_IFF_ANYCAST 0x01 /* anycast address */ 401 1.2 itojun #define IN6_IFF_TENTATIVE 0x02 /* tentative address */ 402 1.2 itojun #define IN6_IFF_DUPLICATED 0x04 /* DAD detected duplicate */ 403 1.2 itojun #define IN6_IFF_DETACHED 0x08 /* may be detached from the link */ 404 1.2 itojun #define IN6_IFF_DEPRECATED 0x10 /* deprecated address */ 405 1.32 itojun #define IN6_IFF_NODAD 0x20 /* don't perform DAD on this address 406 1.32 itojun * (used only at first SIOC* call) 407 1.32 itojun */ 408 1.32 itojun #define IN6_IFF_AUTOCONF 0x40 /* autoconfigurable address. */ 409 1.43 rpaulo #define IN6_IFF_TEMPORARY 0x80 /* temporary (anonymous) address. */ 410 1.2 itojun 411 1.86 christos #define IN6_IFFBITS \ 412 1.87 christos "\020\1ANYCAST\2TENTATIVE\3DUPLICATED\4DETACHED\5DEPRECATED\6NODAD" \ 413 1.85 christos "\7AUTOCONF\10TEMPORARY" 414 1.85 christos 415 1.85 christos 416 1.2 itojun /* do not input/output */ 417 1.2 itojun #define IN6_IFF_NOTREADY (IN6_IFF_TENTATIVE|IN6_IFF_DUPLICATED) 418 1.11 itojun 419 1.11 itojun #ifdef _KERNEL 420 1.11 itojun #define IN6_ARE_SCOPE_CMP(a,b) ((a)-(b)) 421 1.11 itojun #define IN6_ARE_SCOPE_EQUAL(a,b) ((a)==(b)) 422 1.11 itojun #endif 423 1.2 itojun 424 1.2 itojun #ifdef _KERNEL 425 1.69 rmind 426 1.84 ozaki #include <sys/mutex.h> 427 1.84 ozaki #include <sys/pserialize.h> 428 1.84 ozaki 429 1.69 rmind #include <net/pktqueue.h> 430 1.69 rmind 431 1.69 rmind extern pktqueue_t *ip6_pktq; 432 1.69 rmind 433 1.34 thorpej MALLOC_DECLARE(M_IP6OPT); 434 1.34 thorpej 435 1.84 ozaki extern struct pslist_head in6_ifaddr_list; 436 1.84 ozaki extern kmutex_t in6_ifaddr_lock; 437 1.78 ozaki 438 1.78 ozaki #define IN6_ADDRLIST_ENTRY_INIT(__ia) \ 439 1.78 ozaki PSLIST_ENTRY_INIT((__ia), ia6_pslist_entry) 440 1.80 ozaki #define IN6_ADDRLIST_ENTRY_DESTROY(__ia) \ 441 1.80 ozaki PSLIST_ENTRY_DESTROY((__ia), ia6_pslist_entry) 442 1.78 ozaki #define IN6_ADDRLIST_READER_EMPTY() \ 443 1.78 ozaki (PSLIST_READER_FIRST(&in6_ifaddr_list, struct in6_ifaddr, \ 444 1.78 ozaki ia6_pslist_entry) == NULL) 445 1.78 ozaki #define IN6_ADDRLIST_READER_FIRST() \ 446 1.78 ozaki PSLIST_READER_FIRST(&in6_ifaddr_list, struct in6_ifaddr, \ 447 1.78 ozaki ia6_pslist_entry) 448 1.78 ozaki #define IN6_ADDRLIST_READER_NEXT(__ia) \ 449 1.78 ozaki PSLIST_READER_NEXT((__ia), struct in6_ifaddr, ia6_pslist_entry) 450 1.78 ozaki #define IN6_ADDRLIST_READER_FOREACH(__ia) \ 451 1.78 ozaki PSLIST_READER_FOREACH((__ia), &in6_ifaddr_list, \ 452 1.78 ozaki struct in6_ifaddr, ia6_pslist_entry) 453 1.78 ozaki #define IN6_ADDRLIST_WRITER_INSERT_HEAD(__ia) \ 454 1.78 ozaki PSLIST_WRITER_INSERT_HEAD(&in6_ifaddr_list, (__ia), ia6_pslist_entry) 455 1.78 ozaki #define IN6_ADDRLIST_WRITER_REMOVE(__ia) \ 456 1.78 ozaki PSLIST_WRITER_REMOVE((__ia), ia6_pslist_entry) 457 1.78 ozaki #define IN6_ADDRLIST_WRITER_FOREACH(__ia) \ 458 1.78 ozaki PSLIST_WRITER_FOREACH((__ia), &in6_ifaddr_list, struct in6_ifaddr, \ 459 1.78 ozaki ia6_pslist_entry) 460 1.78 ozaki #define IN6_ADDRLIST_WRITER_FIRST() \ 461 1.78 ozaki PSLIST_WRITER_FIRST(&in6_ifaddr_list, struct in6_ifaddr, \ 462 1.78 ozaki ia6_pslist_entry) 463 1.78 ozaki #define IN6_ADDRLIST_WRITER_NEXT(__ia) \ 464 1.78 ozaki PSLIST_WRITER_NEXT((__ia), struct in6_ifaddr, ia6_pslist_entry) 465 1.78 ozaki #define IN6_ADDRLIST_WRITER_INSERT_AFTER(__ia, __new) \ 466 1.78 ozaki PSLIST_WRITER_INSERT_AFTER((__ia), (__new), ia6_pslist_entry) 467 1.78 ozaki #define IN6_ADDRLIST_WRITER_EMPTY() \ 468 1.78 ozaki (PSLIST_WRITER_FIRST(&in6_ifaddr_list, struct in6_ifaddr, \ 469 1.78 ozaki ia6_pslist_entry) == NULL) 470 1.78 ozaki #define IN6_ADDRLIST_WRITER_INSERT_TAIL(__new) \ 471 1.78 ozaki do { \ 472 1.78 ozaki if (IN6_ADDRLIST_WRITER_EMPTY()) { \ 473 1.78 ozaki IN6_ADDRLIST_WRITER_INSERT_HEAD((__new)); \ 474 1.78 ozaki } else { \ 475 1.78 ozaki struct in6_ifaddr *__ia; \ 476 1.78 ozaki IN6_ADDRLIST_WRITER_FOREACH(__ia) { \ 477 1.78 ozaki if (IN6_ADDRLIST_WRITER_NEXT(__ia) == NULL) { \ 478 1.78 ozaki IN6_ADDRLIST_WRITER_INSERT_AFTER(__ia,\ 479 1.78 ozaki (__new)); \ 480 1.78 ozaki break; \ 481 1.78 ozaki } \ 482 1.78 ozaki } \ 483 1.78 ozaki } \ 484 1.78 ozaki } while (0) 485 1.5 itojun 486 1.5 itojun #define in6_ifstat_inc(ifp, tag) \ 487 1.5 itojun do { \ 488 1.26 itojun if (ifp) \ 489 1.26 itojun ((struct in6_ifextra *)((ifp)->if_afdata[AF_INET6]))->in6_ifstat->tag++; \ 490 1.33 perry } while (/*CONSTCOND*/ 0) 491 1.5 itojun 492 1.60 matt extern const struct in6_addr zeroin6_addr; 493 1.60 matt extern const u_char inet6ctlerrmap[]; 494 1.67 pooka extern bool in6_present; 495 1.2 itojun #endif /* _KERNEL */ 496 1.2 itojun 497 1.2 itojun /* 498 1.2 itojun * Multi-cast membership entry. One for each group/ifp that a PCB 499 1.2 itojun * belongs to. 500 1.2 itojun */ 501 1.2 itojun struct in6_multi_mship { 502 1.2 itojun struct in6_multi *i6mm_maddr; /* Multicast address pointer */ 503 1.2 itojun LIST_ENTRY(in6_multi_mship) i6mm_chain; /* multicast options chain */ 504 1.2 itojun }; 505 1.2 itojun 506 1.2 itojun struct in6_multi { 507 1.2 itojun LIST_ENTRY(in6_multi) in6m_entry; /* list glue */ 508 1.2 itojun struct in6_addr in6m_addr; /* IP6 multicast address */ 509 1.2 itojun struct ifnet *in6m_ifp; /* back pointer to ifnet */ 510 1.93 ozaki /* DEPRECATED. Keep it to avoid breaking kvm(3) users */ 511 1.93 ozaki struct in6_ifaddr *_in6m_ia; /* back pointer to in6_ifaddr */ 512 1.2 itojun u_int in6m_refcount; /* # membership claims by sockets */ 513 1.2 itojun u_int in6m_state; /* state of the membership */ 514 1.43 rpaulo int in6m_timer; /* delay to send the 1st report */ 515 1.43 rpaulo struct timeval in6m_timer_expire; /* when the timer expires */ 516 1.54 joerg callout_t in6m_timer_ch; 517 1.2 itojun }; 518 1.43 rpaulo 519 1.43 rpaulo #define IN6M_TIMER_UNDEF -1 520 1.43 rpaulo 521 1.2 itojun 522 1.2 itojun #ifdef _KERNEL 523 1.43 rpaulo /* flags to in6_update_ifa */ 524 1.43 rpaulo #define IN6_IFAUPDATE_DADDELAY 0x1 /* first time to configure an address */ 525 1.5 itojun 526 1.52 dyoung #if 0 527 1.43 rpaulo /* 528 1.43 rpaulo * Macros for looking up the in6_multi_mship record for a given IP6 multicast 529 1.43 rpaulo * address on a given interface. If no matching record is found, "imm" 530 1.43 rpaulo * returns NULL. 531 1.43 rpaulo */ 532 1.98 christos static __inline struct in6_multi_mship * 533 1.52 dyoung in6_lookup_mship(struct in6_addr *addr, struct ifnet *ifp, 534 1.52 dyoung struct ip6_moptions *imop) 535 1.52 dyoung { 536 1.52 dyoung struct in6_multi_mship *imm; 537 1.52 dyoung 538 1.52 dyoung LIST_FOREACH(imm, &imop->im6o_memberships, i6mm_chain) { 539 1.52 dyoung if (imm->i6mm_maddr->in6m_ifp != ifp) 540 1.52 dyoung continue; 541 1.52 dyoung if (IN6_ARE_ADDR_EQUAL(&imm->i6mm_maddr->in6m_addr, 542 1.52 dyoung addr)) 543 1.52 dyoung break; 544 1.52 dyoung } 545 1.52 dyoung return imm; 546 1.52 dyoung } 547 1.52 dyoung 548 1.52 dyoung #define IN6_LOOKUP_MSHIP(__addr, __ifp, __imop, __imm) \ 549 1.52 dyoung /* struct in6_addr __addr; */ \ 550 1.52 dyoung /* struct ifnet *__ifp; */ \ 551 1.52 dyoung /* struct ip6_moptions *__imop */ \ 552 1.52 dyoung /* struct in6_multi_mship *__imm; */ \ 553 1.43 rpaulo do { \ 554 1.52 dyoung (__imm) = in6_lookup_mship(&(__addr), (__ifp), (__imop)); \ 555 1.43 rpaulo } while (/*CONSTCOND*/ 0) 556 1.52 dyoung #endif 557 1.43 rpaulo 558 1.81 ozaki void in6_init(void); 559 1.81 ozaki 560 1.96 ozaki void in6_multi_lock(int); 561 1.96 ozaki void in6_multi_unlock(void); 562 1.97 ozaki bool in6_multi_locked(int); 563 1.93 ozaki struct in6_multi * 564 1.93 ozaki in6_lookup_multi(const struct in6_addr *, const struct ifnet *); 565 1.94 ozaki bool in6_multi_group(const struct in6_addr *, const struct ifnet *); 566 1.93 ozaki void in6_purge_multi(struct ifnet *); 567 1.48 dyoung struct in6_multi *in6_addmulti(struct in6_addr *, struct ifnet *, 568 1.48 dyoung int *, int); 569 1.48 dyoung void in6_delmulti(struct in6_multi *); 570 1.99 ozaki void in6_delmulti_locked(struct in6_multi *); 571 1.100 ozaki void in6_lookup_and_delete_multi(const struct in6_addr *, 572 1.100 ozaki const struct ifnet *); 573 1.48 dyoung struct in6_multi_mship *in6_joingroup(struct ifnet *, struct in6_addr *, 574 1.48 dyoung int *, int); 575 1.48 dyoung int in6_leavegroup(struct in6_multi_mship *); 576 1.48 dyoung int in6_mask2len(struct in6_addr *, u_char *); 577 1.70 rtr int in6_control(struct socket *, u_long, void *, struct ifnet *); 578 1.88 christos int in6_update_ifa(struct ifnet *, struct in6_aliasreq *, int); 579 1.48 dyoung void in6_purgeaddr(struct ifaddr *); 580 1.48 dyoung void in6_purgeif(struct ifnet *); 581 1.48 dyoung void *in6_domifattach(struct ifnet *); 582 1.48 dyoung void in6_domifdetach(struct ifnet *, void *); 583 1.72 roy void in6_ifremlocal(struct ifaddr *); 584 1.72 roy void in6_ifaddlocal(struct ifaddr *); 585 1.84 ozaki struct in6_ifaddr * 586 1.84 ozaki in6ifa_ifpforlinklocal(const struct ifnet *, int); 587 1.84 ozaki struct in6_ifaddr * 588 1.84 ozaki in6ifa_ifpforlinklocal_psref(const struct ifnet *, int, struct psref *); 589 1.84 ozaki struct in6_ifaddr * 590 1.84 ozaki in6ifa_ifpwithaddr(const struct ifnet *, const struct in6_addr *); 591 1.84 ozaki struct in6_ifaddr * 592 1.84 ozaki in6ifa_ifpwithaddr_psref(const struct ifnet *, const struct in6_addr *, 593 1.84 ozaki struct psref *); 594 1.75 ozaki struct in6_ifaddr *in6ifa_ifwithaddr(const struct in6_addr *, uint32_t); 595 1.106 ozaki struct ifaddr * 596 1.106 ozaki in6ifa_first_lladdr(const struct ifnet *); 597 1.106 ozaki struct ifaddr * 598 1.106 ozaki in6ifa_first_lladdr_psref(const struct ifnet *, struct psref *); 599 1.106 ozaki 600 1.48 dyoung int in6_matchlen(struct in6_addr *, struct in6_addr *); 601 1.48 dyoung void in6_prefixlen2mask(struct in6_addr *, int); 602 1.95 ozaki void in6_purge_mcast_references(struct in6_multi *); 603 1.17 itojun 604 1.66 christos int ip6flow_fastforward(struct mbuf **); /* IPv6 fast forward routine */ 605 1.51 liamjfoy 606 1.50 christos int in6_src_ioctl(u_long, void *); 607 1.48 dyoung int in6_is_addr_deprecated(struct sockaddr_in6 *); 608 1.17 itojun struct in6pcb; 609 1.75 ozaki 610 1.75 ozaki #define LLTABLE6(ifp) (((struct in6_ifextra *)(ifp)->if_afdata[AF_INET6])->lltable) 611 1.75 ozaki 612 1.89 ozaki void in6_sysctl_multicast_setup(struct sysctllog **); 613 1.89 ozaki 614 1.2 itojun #endif /* _KERNEL */ 615 1.2 itojun 616 1.40 elad #endif /* !_NETINET6_IN6_VAR_H_ */ 617