[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

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