[BACK]Return to in6_var.h CVS log [TXT][DIR] Up to [local] / sys / netinet6

Annotation of sys/netinet6/in6_var.h, Revision 1.1

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

CVSweb