in6_var.h revision 1.28
1/* $NetBSD: in6_var.h,v 1.28 2002/06/07 14:35:55 itojun Exp $ */ 2/* $KAME: in6_var.h,v 1.53 2001/02/10 02:44:27 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. All advertising materials mentioning features or use of this software 46 * must display the following acknowledgement: 47 * This product includes software developed by the University of 48 * California, Berkeley and its contributors. 49 * 4. Neither the name of the University nor the names of its contributors 50 * may be used to endorse or promote products derived from this software 51 * without specific prior written permission. 52 * 53 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 54 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 55 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 56 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 57 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 58 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 59 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 60 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 61 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 62 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 63 * SUCH DAMAGE. 64 * 65 * @(#)in_var.h 8.1 (Berkeley) 6/10/93 66 */ 67 68#ifndef _NETINET6_IN6_VAR_H_ 69#define _NETINET6_IN6_VAR_H_ 70 71/* 72 * Interface address, Internet version. One of these structures 73 * is allocated for each interface with an Internet address. 74 * The ifaddr structure contains the protocol-independent part 75 * of the structure and is assumed to be first. 76 */ 77 78/* 79 * pltime/vltime are just for future reference (required to implements 2 80 * hour rule for hosts). they should never be modified by nd6_timeout or 81 * anywhere else. 82 * userland -> kernel: accept pltime/vltime 83 * kernel -> userland: throw up everything 84 * in kernel: modify preferred/expire only 85 */ 86struct in6_addrlifetime { 87 time_t ia6t_expire; /* valid lifetime expiration time */ 88 time_t ia6t_preferred; /* preferred lifetime expiration time */ 89 u_int32_t ia6t_vltime; /* valid lifetime */ 90 u_int32_t ia6t_pltime; /* prefix lifetime */ 91}; 92 93struct nd_ifinfo; 94struct in6_ifextra { 95 struct in6_ifstat *in6_ifstat; 96 struct icmp6_ifstat *icmp6_ifstat; 97 struct nd_ifinfo *nd_ifinfo; 98}; 99 100struct in6_ifaddr { 101 struct ifaddr ia_ifa; /* protocol-independent info */ 102#define ia_ifp ia_ifa.ifa_ifp 103#define ia_flags ia_ifa.ifa_flags 104 struct sockaddr_in6 ia_addr; /* interface address */ 105 struct sockaddr_in6 ia_net; /* network number of interface */ 106 struct sockaddr_in6 ia_dstaddr; /* space for destination addr */ 107 struct sockaddr_in6 ia_prefixmask; /* prefix mask */ 108 u_int32_t ia_plen; /* prefix length */ 109 struct in6_ifaddr *ia_next; /* next in6 list of IP6 addresses */ 110 LIST_HEAD(in6_multihead, in6_multi) ia6_multiaddrs; 111 /* list of multicast addresses */ 112 int ia6_flags; 113 114 struct in6_addrlifetime ia6_lifetime; /* NULL = infty */ 115 struct ifprefix *ia6_ifpr; /* back pointer to ifprefix */ 116}; 117 118/* 119 * IPv6 interface statistics, as defined in RFC2465 Ipv6IfStatsEntry (p12). 120 */ 121struct in6_ifstat { 122 u_quad_t ifs6_in_receive; /* # of total input datagram */ 123 u_quad_t ifs6_in_hdrerr; /* # of datagrams with invalid hdr */ 124 u_quad_t ifs6_in_toobig; /* # of datagrams exceeded MTU */ 125 u_quad_t ifs6_in_noroute; /* # of datagrams with no route */ 126 u_quad_t ifs6_in_addrerr; /* # of datagrams with invalid dst */ 127 u_quad_t ifs6_in_protounknown; /* # of datagrams with unknown proto */ 128 /* NOTE: increment on final dst if */ 129 u_quad_t ifs6_in_truncated; /* # of truncated datagrams */ 130 u_quad_t ifs6_in_discard; /* # of discarded datagrams */ 131 /* NOTE: fragment timeout is not here */ 132 u_quad_t ifs6_in_deliver; /* # of datagrams delivered to ULP */ 133 /* NOTE: increment on final dst if */ 134 u_quad_t ifs6_out_forward; /* # of datagrams forwarded */ 135 /* NOTE: increment on outgoing if */ 136 u_quad_t ifs6_out_request; /* # of outgoing datagrams from ULP */ 137 /* NOTE: does not include forwrads */ 138 u_quad_t ifs6_out_discard; /* # of discarded datagrams */ 139 u_quad_t ifs6_out_fragok; /* # of datagrams fragmented */ 140 u_quad_t ifs6_out_fragfail; /* # of datagrams failed on fragment */ 141 u_quad_t ifs6_out_fragcreat; /* # of fragment datagrams */ 142 /* NOTE: this is # after fragment */ 143 u_quad_t ifs6_reass_reqd; /* # of incoming fragmented packets */ 144 /* NOTE: increment on final dst if */ 145 u_quad_t ifs6_reass_ok; /* # of reassembled packets */ 146 /* NOTE: this is # after reass */ 147 /* NOTE: increment on final dst if */ 148 u_quad_t ifs6_reass_fail; /* # of reass failures */ 149 /* NOTE: may not be packet count */ 150 /* NOTE: increment on final dst if */ 151 u_quad_t ifs6_in_mcast; /* # of inbound multicast datagrams */ 152 u_quad_t ifs6_out_mcast; /* # of outbound multicast datagrams */ 153}; 154 155/* 156 * ICMPv6 interface statistics, as defined in RFC2466 Ipv6IfIcmpEntry. 157 * XXX: I'm not sure if this file is the right place for this structure... 158 */ 159struct icmp6_ifstat { 160 /* 161 * Input statistics 162 */ 163 /* ipv6IfIcmpInMsgs, total # of input messages */ 164 u_quad_t ifs6_in_msg; 165 /* ipv6IfIcmpInErrors, # of input error messages */ 166 u_quad_t ifs6_in_error; 167 /* ipv6IfIcmpInDestUnreachs, # of input dest unreach errors */ 168 u_quad_t ifs6_in_dstunreach; 169 /* ipv6IfIcmpInAdminProhibs, # of input administratively prohibited errs */ 170 u_quad_t ifs6_in_adminprohib; 171 /* ipv6IfIcmpInTimeExcds, # of input time exceeded errors */ 172 u_quad_t ifs6_in_timeexceed; 173 /* ipv6IfIcmpInParmProblems, # of input parameter problem errors */ 174 u_quad_t ifs6_in_paramprob; 175 /* ipv6IfIcmpInPktTooBigs, # of input packet too big errors */ 176 u_quad_t ifs6_in_pkttoobig; 177 /* ipv6IfIcmpInEchos, # of input echo requests */ 178 u_quad_t ifs6_in_echo; 179 /* ipv6IfIcmpInEchoReplies, # of input echo replies */ 180 u_quad_t ifs6_in_echoreply; 181 /* ipv6IfIcmpInRouterSolicits, # of input router solicitations */ 182 u_quad_t ifs6_in_routersolicit; 183 /* ipv6IfIcmpInRouterAdvertisements, # of input router advertisements */ 184 u_quad_t ifs6_in_routeradvert; 185 /* ipv6IfIcmpInNeighborSolicits, # of input neighbor solicitations */ 186 u_quad_t ifs6_in_neighborsolicit; 187 /* ipv6IfIcmpInNeighborAdvertisements, # of input neighbor advertisements */ 188 u_quad_t ifs6_in_neighboradvert; 189 /* ipv6IfIcmpInRedirects, # of input redirects */ 190 u_quad_t ifs6_in_redirect; 191 /* ipv6IfIcmpInGroupMembQueries, # of input MLD queries */ 192 u_quad_t ifs6_in_mldquery; 193 /* ipv6IfIcmpInGroupMembResponses, # of input MLD reports */ 194 u_quad_t ifs6_in_mldreport; 195 /* ipv6IfIcmpInGroupMembReductions, # of input MLD done */ 196 u_quad_t ifs6_in_mlddone; 197 198 /* 199 * Output statistics. We should solve unresolved routing problem... 200 */ 201 /* ipv6IfIcmpOutMsgs, total # of output messages */ 202 u_quad_t ifs6_out_msg; 203 /* ipv6IfIcmpOutErrors, # of output error messages */ 204 u_quad_t ifs6_out_error; 205 /* ipv6IfIcmpOutDestUnreachs, # of output dest unreach errors */ 206 u_quad_t ifs6_out_dstunreach; 207 /* ipv6IfIcmpOutAdminProhibs, # of output administratively prohibited errs */ 208 u_quad_t ifs6_out_adminprohib; 209 /* ipv6IfIcmpOutTimeExcds, # of output time exceeded errors */ 210 u_quad_t ifs6_out_timeexceed; 211 /* ipv6IfIcmpOutParmProblems, # of output parameter problem errors */ 212 u_quad_t ifs6_out_paramprob; 213 /* ipv6IfIcmpOutPktTooBigs, # of output packet too big errors */ 214 u_quad_t ifs6_out_pkttoobig; 215 /* ipv6IfIcmpOutEchos, # of output echo requests */ 216 u_quad_t ifs6_out_echo; 217 /* ipv6IfIcmpOutEchoReplies, # of output echo replies */ 218 u_quad_t ifs6_out_echoreply; 219 /* ipv6IfIcmpOutRouterSolicits, # of output router solicitations */ 220 u_quad_t ifs6_out_routersolicit; 221 /* ipv6IfIcmpOutRouterAdvertisements, # of output router advertisements */ 222 u_quad_t ifs6_out_routeradvert; 223 /* ipv6IfIcmpOutNeighborSolicits, # of output neighbor solicitations */ 224 u_quad_t ifs6_out_neighborsolicit; 225 /* ipv6IfIcmpOutNeighborAdvertisements, # of output neighbor advertisements */ 226 u_quad_t ifs6_out_neighboradvert; 227 /* ipv6IfIcmpOutRedirects, # of output redirects */ 228 u_quad_t ifs6_out_redirect; 229 /* ipv6IfIcmpOutGroupMembQueries, # of output MLD queries */ 230 u_quad_t ifs6_out_mldquery; 231 /* ipv6IfIcmpOutGroupMembResponses, # of output MLD reports */ 232 u_quad_t ifs6_out_mldreport; 233 /* ipv6IfIcmpOutGroupMembReductions, # of output MLD done */ 234 u_quad_t ifs6_out_mlddone; 235}; 236 237struct in6_ifreq { 238 char ifr_name[IFNAMSIZ]; 239 union { 240 struct sockaddr_in6 ifru_addr; 241 struct sockaddr_in6 ifru_dstaddr; 242 short ifru_flags; 243 int ifru_flags6; 244 int ifru_metric; 245 caddr_t ifru_data; 246 struct in6_addrlifetime ifru_lifetime; 247 struct in6_ifstat ifru_stat; 248 struct icmp6_ifstat ifru_icmp6stat; 249 } ifr_ifru; 250}; 251 252struct in6_aliasreq { 253 char ifra_name[IFNAMSIZ]; 254 struct sockaddr_in6 ifra_addr; 255 struct sockaddr_in6 ifra_dstaddr; 256 struct sockaddr_in6 ifra_prefixmask; 257 int ifra_flags; 258 struct in6_addrlifetime ifra_lifetime; 259}; 260 261/* prefix type macro */ 262#define IN6_PREFIX_ND 1 263#define IN6_PREFIX_RR 2 264 265/* 266 * prefix related flags passed between kernel(NDP related part) and 267 * user land command(ifconfig) and daemon(rtadvd). 268 */ 269struct in6_prflags { 270 struct prf_ra { 271 u_char onlink : 1; 272 u_char autonomous : 1; 273 u_char reserved : 6; 274 } prf_ra; 275 u_char prf_reserved1; 276 u_short prf_reserved2; 277 /* want to put this on 4byte offset */ 278 struct prf_rr { 279 u_char decrvalid : 1; 280 u_char decrprefd : 1; 281 u_char reserved : 6; 282 } prf_rr; 283 u_char prf_reserved3; 284 u_short prf_reserved4; 285}; 286 287struct in6_prefixreq { 288 char ipr_name[IFNAMSIZ]; 289 u_char ipr_origin; 290 u_char ipr_plen; 291 u_int32_t ipr_vltime; 292 u_int32_t ipr_pltime; 293 struct in6_prflags ipr_flags; 294 struct sockaddr_in6 ipr_prefix; 295}; 296 297#define PR_ORIG_RA 0 298#define PR_ORIG_RR 1 299#define PR_ORIG_STATIC 2 300#define PR_ORIG_KERNEL 3 301 302#define ipr_raf_onlink ipr_flags.prf_ra.onlink 303#define ipr_raf_auto ipr_flags.prf_ra.autonomous 304 305#define ipr_statef_onlink ipr_flags.prf_state.onlink 306 307#define ipr_rrf_decrvalid ipr_flags.prf_rr.decrvalid 308#define ipr_rrf_decrprefd ipr_flags.prf_rr.decrprefd 309 310struct in6_rrenumreq { 311 char irr_name[IFNAMSIZ]; 312 u_char irr_origin; 313 u_char irr_m_len; /* match len for matchprefix */ 314 u_char irr_m_minlen; /* minlen for matching prefix */ 315 u_char irr_m_maxlen; /* maxlen for matching prefix */ 316 u_char irr_u_uselen; /* uselen for adding prefix */ 317 u_char irr_u_keeplen; /* keeplen from matching prefix */ 318 struct irr_raflagmask { 319 u_char onlink : 1; 320 u_char autonomous : 1; 321 u_char reserved : 6; 322 } irr_raflagmask; 323 u_int32_t irr_vltime; 324 u_int32_t irr_pltime; 325 struct in6_prflags irr_flags; 326 struct sockaddr_in6 irr_matchprefix; 327 struct sockaddr_in6 irr_useprefix; 328}; 329 330#define irr_raf_mask_onlink irr_raflagmask.onlink 331#define irr_raf_mask_auto irr_raflagmask.autonomous 332#define irr_raf_mask_reserved irr_raflagmask.reserved 333 334#define irr_raf_onlink irr_flags.prf_ra.onlink 335#define irr_raf_auto irr_flags.prf_ra.autonomous 336 337#define irr_statef_onlink irr_flags.prf_state.onlink 338 339#define irr_rrf irr_flags.prf_rr 340#define irr_rrf_decrvalid irr_flags.prf_rr.decrvalid 341#define irr_rrf_decrprefd irr_flags.prf_rr.decrprefd 342 343/* 344 * Given a pointer to an in6_ifaddr (ifaddr), 345 * return a pointer to the addr as a sockaddr_in6 346 */ 347#define IA6_IN6(ia) (&((ia)->ia_addr.sin6_addr)) 348#define IA6_DSTIN6(ia) (&((ia)->ia_dstaddr.sin6_addr)) 349#define IA6_MASKIN6(ia) (&((ia)->ia_prefixmask.sin6_addr)) 350#define IA6_SIN6(ia) (&((ia)->ia_addr)) 351#define IA6_DSTSIN6(ia) (&((ia)->ia_dstaddr)) 352#define IFA_IN6(x) (&((struct sockaddr_in6 *)((x)->ifa_addr))->sin6_addr) 353#define IFA_DSTIN6(x) (&((struct sockaddr_in6 *)((x)->ifa_dstaddr))->sin6_addr) 354 355#define IFPR_IN6(x) (&((struct sockaddr_in6 *)((x)->ifpr_prefix))->sin6_addr) 356 357#ifdef _KERNEL 358#define IN6_ARE_MASKED_ADDR_EQUAL(d, a, m) ( \ 359 (((d)->s6_addr32[0] ^ (a)->s6_addr32[0]) & (m)->s6_addr32[0]) == 0 && \ 360 (((d)->s6_addr32[1] ^ (a)->s6_addr32[1]) & (m)->s6_addr32[1]) == 0 && \ 361 (((d)->s6_addr32[2] ^ (a)->s6_addr32[2]) & (m)->s6_addr32[2]) == 0 && \ 362 (((d)->s6_addr32[3] ^ (a)->s6_addr32[3]) & (m)->s6_addr32[3]) == 0 ) 363#endif 364 365#define SIOCSIFADDR_IN6 _IOW('i', 12, struct in6_ifreq) 366#define SIOCGIFADDR_IN6 _IOWR('i', 33, struct in6_ifreq) 367 368#ifdef _KERNEL 369/* 370 * SIOCSxxx ioctls should be unused (see comments in in6.c), but 371 * we do not shift numbers for binary compatibility. 372 */ 373#define SIOCSIFDSTADDR_IN6 _IOW('i', 14, struct in6_ifreq) 374#define SIOCSIFNETMASK_IN6 _IOW('i', 22, struct in6_ifreq) 375#endif 376 377#define SIOCGIFDSTADDR_IN6 _IOWR('i', 34, struct in6_ifreq) 378#define SIOCGIFNETMASK_IN6 _IOWR('i', 37, struct in6_ifreq) 379 380#define SIOCDIFADDR_IN6 _IOW('i', 25, struct in6_ifreq) 381#define SIOCAIFADDR_IN6 _IOW('i', 26, struct in6_aliasreq) 382 383#define SIOCSIFPHYADDR_IN6 _IOW('i', 70, struct in6_aliasreq) 384#define SIOCGIFPSRCADDR_IN6 _IOWR('i', 71, struct in6_ifreq) 385#define SIOCGIFPDSTADDR_IN6 _IOWR('i', 72, struct in6_ifreq) 386 387#define SIOCGIFAFLAG_IN6 _IOWR('i', 73, struct in6_ifreq) 388 389#define SIOCGDRLST_IN6 _IOWR('i', 74, struct in6_drlist) 390#define SIOCGPRLST_IN6 _IOWR('i', 75, struct in6_prlist) 391#ifdef _KERNEL 392#define OSIOCGIFINFO_IN6 _IOWR('i', 76, struct in6_ondireq) 393#endif 394#define SIOCGIFINFO_IN6 _IOWR('i', 108, struct in6_ndireq) 395#define SIOCSNDFLUSH_IN6 _IOWR('i', 77, struct in6_ifreq) 396#define SIOCGNBRINFO_IN6 _IOWR('i', 78, struct in6_nbrinfo) 397#define SIOCSPFXFLUSH_IN6 _IOWR('i', 79, struct in6_ifreq) 398#define SIOCSRTRFLUSH_IN6 _IOWR('i', 80, struct in6_ifreq) 399 400#define SIOCGIFALIFETIME_IN6 _IOWR('i', 81, struct in6_ifreq) 401#define SIOCSIFALIFETIME_IN6 _IOWR('i', 82, struct in6_ifreq) 402#define SIOCGIFSTAT_IN6 _IOWR('i', 83, struct in6_ifreq) 403#define SIOCGIFSTAT_ICMP6 _IOWR('i', 84, struct in6_ifreq) 404 405#define SIOCSDEFIFACE_IN6 _IOWR('i', 85, struct in6_ndifreq) 406#define SIOCGDEFIFACE_IN6 _IOWR('i', 86, struct in6_ndifreq) 407 408#define SIOCSIFINFO_FLAGS _IOWR('i', 87, struct in6_ndireq) /* XXX */ 409 410#define SIOCSIFPREFIX_IN6 _IOW('i', 100, struct in6_prefixreq) /* set */ 411#define SIOCGIFPREFIX_IN6 _IOWR('i', 101, struct in6_prefixreq) /* get */ 412#define SIOCDIFPREFIX_IN6 _IOW('i', 102, struct in6_prefixreq) /* del */ 413#define SIOCAIFPREFIX_IN6 _IOW('i', 103, struct in6_rrenumreq) /* add */ 414#define SIOCCIFPREFIX_IN6 _IOW('i', 104, \ 415 struct in6_rrenumreq) /* change */ 416#define SIOCSGIFPREFIX_IN6 _IOW('i', 105, \ 417 struct in6_rrenumreq) /* set global */ 418 419#define SIOCGETSGCNT_IN6 _IOWR('u', 106, \ 420 struct sioc_sg_req6) /* get s,g pkt cnt */ 421#define SIOCGETMIFCNT_IN6 _IOWR('u', 107, \ 422 struct sioc_mif_req6) /* get pkt cnt per if */ 423 424#define IN6_IFF_ANYCAST 0x01 /* anycast address */ 425#define IN6_IFF_TENTATIVE 0x02 /* tentative address */ 426#define IN6_IFF_DUPLICATED 0x04 /* DAD detected duplicate */ 427#define IN6_IFF_DETACHED 0x08 /* may be detached from the link */ 428#define IN6_IFF_DEPRECATED 0x10 /* deprecated address */ 429 430/* do not input/output */ 431#define IN6_IFF_NOTREADY (IN6_IFF_TENTATIVE|IN6_IFF_DUPLICATED) 432 433#ifdef _KERNEL 434#define IN6_ARE_SCOPE_CMP(a,b) ((a)-(b)) 435#define IN6_ARE_SCOPE_EQUAL(a,b) ((a)==(b)) 436#endif 437 438#ifdef _KERNEL 439extern struct in6_ifaddr *in6_ifaddr; 440 441extern struct icmp6stat icmp6stat; 442#define in6_ifstat_inc(ifp, tag) \ 443do { \ 444 if (ifp) \ 445 ((struct in6_ifextra *)((ifp)->if_afdata[AF_INET6]))->in6_ifstat->tag++; \ 446} while (0) 447 448extern struct ifqueue ip6intrq; /* IP6 packet input queue */ 449extern struct in6_addr zeroin6_addr; 450extern u_char inet6ctlerrmap[]; 451extern unsigned long in6_maxmtu; 452 453/* 454 * Macro for finding the internet address structure (in6_ifaddr) corresponding 455 * to a given interface (ifnet structure). 456 */ 457 458#define IFP_TO_IA6(ifp, ia) \ 459/* struct ifnet *ifp; */ \ 460/* struct in6_ifaddr *ia; */ \ 461do { \ 462 struct ifaddr *ifa; \ 463 for (ifa = (ifp)->if_addrlist.tqh_first; ifa; ifa = ifa->ifa_list.tqe_next) { \ 464 if (!ifa->ifa_addr) \ 465 continue; \ 466 if (ifa->ifa_addr->sa_family == AF_INET6) \ 467 break; \ 468 } \ 469 (ia) = (struct in6_ifaddr *)ifa; \ 470} while (0) 471 472#endif /* _KERNEL */ 473 474/* 475 * Multi-cast membership entry. One for each group/ifp that a PCB 476 * belongs to. 477 */ 478struct in6_multi_mship { 479 struct in6_multi *i6mm_maddr; /* Multicast address pointer */ 480 LIST_ENTRY(in6_multi_mship) i6mm_chain; /* multicast options chain */ 481}; 482 483struct in6_multi { 484 LIST_ENTRY(in6_multi) in6m_entry; /* list glue */ 485 struct in6_addr in6m_addr; /* IP6 multicast address */ 486 struct ifnet *in6m_ifp; /* back pointer to ifnet */ 487 struct in6_ifaddr *in6m_ia; /* back pointer to in6_ifaddr */ 488 u_int in6m_refcount; /* # membership claims by sockets */ 489 u_int in6m_state; /* state of the membership */ 490 u_int in6m_timer; /* MLD6 listener report timer */ 491}; 492 493#ifdef _KERNEL 494 495/* 496 * Structure used by macros below to remember position when stepping through 497 * all of the in6_multi records. 498 */ 499struct in6_multistep { 500 struct in6_ifaddr *i_ia; 501 struct in6_multi *i_in6m; 502}; 503 504/* 505 * Macros for looking up the in6_multi record for a given IP6 multicast 506 * address on a given interface. If no matching record is found, "in6m" 507 * returns NLL. 508 */ 509 510#define IN6_LOOKUP_MULTI(addr, ifp, in6m) \ 511/* struct in6_addr addr; */ \ 512/* struct ifnet *ifp; */ \ 513/* struct in6_multi *in6m; */ \ 514do { \ 515 struct in6_ifaddr *ia; \ 516 \ 517 IFP_TO_IA6((ifp), ia); \ 518 if (ia == NULL) \ 519 (in6m) = NULL; \ 520 else \ 521 for ((in6m) = ia->ia6_multiaddrs.lh_first; \ 522 (in6m) != NULL && \ 523 !IN6_ARE_ADDR_EQUAL(&(in6m)->in6m_addr, &(addr)); \ 524 (in6m) = in6m->in6m_entry.le_next) \ 525 continue; \ 526} while (0) 527 528/* 529 * Macro to step through all of the in6_multi records, one at a time. 530 * The current position is remembered in "step", which the caller must 531 * provide. IN6_FIRST_MULTI(), below, must be called to initialize "step" 532 * and get the first record. Both macros return a NULL "in6m" when there 533 * are no remaining records. 534 */ 535#define IN6_NEXT_MULTI(step, in6m) \ 536/* struct in6_multistep step; */ \ 537/* struct in6_multi *in6m; */ \ 538do { \ 539 if (((in6m) = (step).i_in6m) != NULL) \ 540 (step).i_in6m = (in6m)->in6m_entry.le_next; \ 541 else \ 542 while ((step).i_ia != NULL) { \ 543 (in6m) = (step).i_ia->ia6_multiaddrs.lh_first; \ 544 (step).i_ia = (step).i_ia->ia_next; \ 545 if ((in6m) != NULL) { \ 546 (step).i_in6m = (in6m)->in6m_entry.le_next; \ 547 break; \ 548 } \ 549 } \ 550} while (0) 551 552#define IN6_FIRST_MULTI(step, in6m) \ 553/* struct in6_multistep step; */ \ 554/* struct in6_multi *in6m */ \ 555do { \ 556 (step).i_ia = in6_ifaddr; \ 557 (step).i_in6m = NULL; \ 558 IN6_NEXT_MULTI((step), (in6m)); \ 559} while (0) 560 561struct in6_multi *in6_addmulti __P((struct in6_addr *, struct ifnet *, 562 int *)); 563void in6_delmulti __P((struct in6_multi *)); 564struct in6_multi_mship *in6_joingroup __P((struct ifnet *, struct in6_addr *, 565 int *)); 566int in6_leavegroup __P((struct in6_multi_mship *)); 567void in6_ifscrub __P((struct ifnet *, struct in6_ifaddr *)); 568int in6_ifindex2scopeid __P((int)); 569int in6_mask2len __P((struct in6_addr *, u_char *)); 570void in6_len2mask __P((struct in6_addr *, int)); 571int in6_control __P((struct socket *, u_long, caddr_t, struct ifnet *, 572 struct proc *)); 573void in6_purgeaddr __P((struct ifaddr *, struct ifnet *)); 574int in6if_do_dad __P((struct ifnet *)); 575void in6_purgeif __P((struct ifnet *)); 576void in6_savemkludge __P((struct in6_ifaddr *)); 577void in6_setmaxmtu __P((void)); 578void *in6_domifattach __P((struct ifnet *)); 579void in6_domifdetach __P((struct ifnet *, void *)); 580void in6_restoremkludge __P((struct in6_ifaddr *, struct ifnet *)); 581void in6_createmkludge __P((struct ifnet *)); 582void in6_purgemkludge __P((struct ifnet *)); 583struct in6_ifaddr *in6ifa_ifpforlinklocal __P((struct ifnet *, int)); 584struct in6_ifaddr *in6ifa_ifpwithaddr __P((struct ifnet *, struct in6_addr *)); 585char *ip6_sprintf __P((const struct in6_addr *)); 586int in6_addr2scopeid __P((struct ifnet *, struct in6_addr *)); 587int in6_matchlen __P((struct in6_addr *, struct in6_addr *)); 588int in6_are_prefix_equal __P((struct in6_addr *, struct in6_addr *, int)); 589void in6_prefixlen2mask __P((struct in6_addr *, int)); 590int in6_prefix_add_ifid __P((int, struct in6_ifaddr *)); 591void in6_prefix_remove_ifid __P((int, struct in6_ifaddr *)); 592void in6_purgeprefix __P((struct ifnet *)); 593 594struct in6pcb; 595int in6_embedscope __P((struct in6_addr *, const struct sockaddr_in6 *, 596 struct in6pcb *, struct ifnet **)); 597int in6_recoverscope __P((struct sockaddr_in6 *, const struct in6_addr *, 598 struct ifnet *)); 599void in6_clearscope __P((struct in6_addr *)); 600#endif /* _KERNEL */ 601 602#endif /* _NETINET6_IN6_VAR_H_ */ 603