[BACK]Return to icmp6.h CVS log [TXT][DIR] Up to [local] / sys / netinet

Annotation of sys/netinet/icmp6.h, Revision 1.1

1.1     ! nbrk        1: /*     $OpenBSD: icmp6.h,v 1.32 2006/07/06 02:56:58 brad Exp $ */
        !             2: /*     $KAME: icmp6.h,v 1.84 2003/04/23 10:26:51 itojun Exp $  */
        !             3:
        !             4: /*
        !             5:  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
        !             6:  * All rights reserved.
        !             7:  *
        !             8:  * Redistribution and use in source and binary forms, with or without
        !             9:  * modification, are permitted provided that the following conditions
        !            10:  * are met:
        !            11:  * 1. Redistributions of source code must retain the above copyright
        !            12:  *    notice, this list of conditions and the following disclaimer.
        !            13:  * 2. Redistributions in binary form must reproduce the above copyright
        !            14:  *    notice, this list of conditions and the following disclaimer in the
        !            15:  *    documentation and/or other materials provided with the distribution.
        !            16:  * 3. Neither the name of the project nor the names of its contributors
        !            17:  *    may be used to endorse or promote products derived from this software
        !            18:  *    without specific prior written permission.
        !            19:  *
        !            20:  * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
        !            21:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
        !            22:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
        !            23:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
        !            24:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
        !            25:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
        !            26:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
        !            27:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
        !            28:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
        !            29:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
        !            30:  * SUCH DAMAGE.
        !            31:  */
        !            32:
        !            33: /*
        !            34:  * Copyright (c) 1982, 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:  *     @(#)ip_icmp.h   8.1 (Berkeley) 6/10/93
        !            62:  */
        !            63:
        !            64: #ifndef _NETINET_ICMP6_H_
        !            65: #define _NETINET_ICMP6_H_
        !            66:
        !            67: #define ICMPV6_PLD_MAXLEN      1232    /* IPV6_MMTU - sizeof(struct ip6_hdr)
        !            68:                                           - sizeof(struct icmp6_hdr) */
        !            69:
        !            70: struct icmp6_hdr {
        !            71:        u_int8_t        icmp6_type;     /* type field */
        !            72:        u_int8_t        icmp6_code;     /* code field */
        !            73:        u_int16_t       icmp6_cksum;    /* checksum field */
        !            74:        union {
        !            75:                u_int32_t       icmp6_un_data32[1]; /* type-specific field */
        !            76:                u_int16_t       icmp6_un_data16[2]; /* type-specific field */
        !            77:                u_int8_t        icmp6_un_data8[4];  /* type-specific field */
        !            78:        } icmp6_dataun;
        !            79: } __packed;
        !            80:
        !            81: #define icmp6_data32   icmp6_dataun.icmp6_un_data32
        !            82: #define icmp6_data16   icmp6_dataun.icmp6_un_data16
        !            83: #define icmp6_data8    icmp6_dataun.icmp6_un_data8
        !            84: #define icmp6_pptr     icmp6_data32[0]         /* parameter prob */
        !            85: #define icmp6_mtu      icmp6_data32[0]         /* packet too big */
        !            86: #define icmp6_id       icmp6_data16[0]         /* echo request/reply */
        !            87: #define icmp6_seq      icmp6_data16[1]         /* echo request/reply */
        !            88: #define icmp6_maxdelay icmp6_data16[0]         /* mcast group membership */
        !            89:
        !            90: #define ICMP6_DST_UNREACH              1       /* dest unreachable, codes: */
        !            91: #define ICMP6_PACKET_TOO_BIG           2       /* packet too big */
        !            92: #define ICMP6_TIME_EXCEEDED            3       /* time exceeded, code: */
        !            93: #define ICMP6_PARAM_PROB               4       /* ip6 header bad */
        !            94:
        !            95: #define ICMP6_ECHO_REQUEST             128     /* echo service */
        !            96: #define ICMP6_ECHO_REPLY               129     /* echo reply */
        !            97: #define MLD_LISTENER_QUERY             130     /* multicast listener query */
        !            98: #define MLD_LISTENER_REPORT            131     /* multicast listener report */
        !            99: #define MLD_LISTENER_DONE              132     /* multicast listener done */
        !           100:
        !           101: /* RFC2292 decls */
        !           102: #define ICMP6_MEMBERSHIP_QUERY         130     /* group membership query */
        !           103: #define ICMP6_MEMBERSHIP_REPORT                131     /* group membership report */
        !           104: #define ICMP6_MEMBERSHIP_REDUCTION     132     /* group membership termination */
        !           105:
        !           106: #ifndef _KERNEL
        !           107: /* the followings are for backward compatibility to old KAME apps. */
        !           108: #define MLD6_LISTENER_QUERY    MLD_LISTENER_QUERY
        !           109: #define MLD6_LISTENER_REPORT   MLD_LISTENER_REPORT
        !           110: #define MLD6_LISTENER_DONE     MLD_LISTENER_DONE
        !           111: #endif
        !           112:
        !           113: #define ND_ROUTER_SOLICIT              133     /* router solicitation */
        !           114: #define ND_ROUTER_ADVERT               134     /* router advertisement */
        !           115: #define ND_NEIGHBOR_SOLICIT            135     /* neighbor solicitation */
        !           116: #define ND_NEIGHBOR_ADVERT             136     /* neighbor advertisement */
        !           117: #define ND_REDIRECT                    137     /* redirect */
        !           118:
        !           119: #define ICMP6_ROUTER_RENUMBERING       138     /* router renumbering */
        !           120:
        !           121: #define ICMP6_WRUREQUEST               139     /* who are you request */
        !           122: #define ICMP6_WRUREPLY                 140     /* who are you reply */
        !           123: #define ICMP6_FQDN_QUERY               139     /* FQDN query */
        !           124: #define ICMP6_FQDN_REPLY               140     /* FQDN reply */
        !           125: #define ICMP6_NI_QUERY                 139     /* node information request */
        !           126: #define ICMP6_NI_REPLY                 140     /* node information reply */
        !           127:
        !           128: /* The definitions below are experimental. TBA */
        !           129: #define MLD_MTRACE_RESP                        200     /* mtrace response(to sender) */
        !           130: #define MLD_MTRACE                     201     /* mtrace messages */
        !           131:
        !           132: #ifndef _KERNEL
        !           133: /* the followings are for backward compatibility to old KAME apps. */
        !           134: #define MLD6_MTRACE_RESP       MLD_MTRACE_RESP
        !           135: #define MLD6_MTRACE            MLD_MTRACE
        !           136: #endif
        !           137:
        !           138: #define ICMP6_MAXTYPE                  201
        !           139:
        !           140: #define ICMP6_DST_UNREACH_NOROUTE      0       /* no route to destination */
        !           141: #define ICMP6_DST_UNREACH_ADMIN                1       /* administratively prohibited */
        !           142: #define ICMP6_DST_UNREACH_NOTNEIGHBOR  2       /* not a neighbor(obsolete) */
        !           143: #define ICMP6_DST_UNREACH_BEYONDSCOPE  2       /* beyond scope of source address */
        !           144: #define ICMP6_DST_UNREACH_ADDR         3       /* address unreachable */
        !           145: #define ICMP6_DST_UNREACH_NOPORT       4       /* port unreachable */
        !           146:
        !           147: #define ICMP6_TIME_EXCEED_TRANSIT      0       /* ttl==0 in transit */
        !           148: #define ICMP6_TIME_EXCEED_REASSEMBLY   1       /* ttl==0 in reass */
        !           149:
        !           150: #define ICMP6_PARAMPROB_HEADER                 0       /* erroneous header field */
        !           151: #define ICMP6_PARAMPROB_NEXTHEADER     1       /* unrecognized next header */
        !           152: #define ICMP6_PARAMPROB_OPTION         2       /* unrecognized option */
        !           153:
        !           154: #define ICMP6_INFOMSG_MASK             0x80    /* all informational messages */
        !           155:
        !           156: #define ICMP6_NI_SUBJ_IPV6     0       /* Query Subject is an IPv6 address */
        !           157: #define ICMP6_NI_SUBJ_FQDN     1       /* Query Subject is a Domain name */
        !           158: #define ICMP6_NI_SUBJ_IPV4     2       /* Query Subject is an IPv4 address */
        !           159:
        !           160: #define ICMP6_NI_SUCCESS       0       /* node information successful reply */
        !           161: #define ICMP6_NI_REFUSED       1       /* node information request is refused */
        !           162: #define ICMP6_NI_UNKNOWN       2       /* unknown Qtype */
        !           163:
        !           164: #define ICMP6_ROUTER_RENUMBERING_COMMAND  0    /* rr command */
        !           165: #define ICMP6_ROUTER_RENUMBERING_RESULT   1    /* rr result */
        !           166: #define ICMP6_ROUTER_RENUMBERING_SEQNUM_RESET   255    /* rr seq num reset */
        !           167:
        !           168: /* Used in kernel only */
        !           169: #define ND_REDIRECT_ONLINK     0       /* redirect to an on-link node */
        !           170: #define ND_REDIRECT_ROUTER     1       /* redirect to a better router */
        !           171:
        !           172: /*
        !           173:  * Multicast Listener Discovery
        !           174:  */
        !           175: struct mld_hdr {
        !           176:        struct icmp6_hdr        mld_icmp6_hdr;
        !           177:        struct in6_addr         mld_addr; /* multicast address */
        !           178: } __packed;
        !           179:
        !           180: /* definitions to provide backward compatibility to old KAME applications */
        !           181: #ifndef _KERNEL
        !           182: #define mld6_hdr       mld_hdr
        !           183: #define mld6_type      mld_type
        !           184: #define mld6_code      mld_code
        !           185: #define mld6_cksum     mld_cksum
        !           186: #define mld6_maxdelay  mld_maxdelay
        !           187: #define mld6_reserved  mld_reserved
        !           188: #define mld6_addr      mld_addr
        !           189: #endif
        !           190:
        !           191: /* shortcut macro definitions */
        !           192: #define mld_type       mld_icmp6_hdr.icmp6_type
        !           193: #define mld_code       mld_icmp6_hdr.icmp6_code
        !           194: #define mld_cksum      mld_icmp6_hdr.icmp6_cksum
        !           195: #define mld_maxdelay   mld_icmp6_hdr.icmp6_data16[0]
        !           196: #define mld_reserved   mld_icmp6_hdr.icmp6_data16[1]
        !           197:
        !           198: /*
        !           199:  * Neighbor Discovery
        !           200:  */
        !           201:
        !           202: struct nd_router_solicit {     /* router solicitation */
        !           203:        struct icmp6_hdr        nd_rs_hdr;
        !           204:        /* could be followed by options */
        !           205: } __packed;
        !           206:
        !           207: #define nd_rs_type     nd_rs_hdr.icmp6_type
        !           208: #define nd_rs_code     nd_rs_hdr.icmp6_code
        !           209: #define nd_rs_cksum    nd_rs_hdr.icmp6_cksum
        !           210: #define nd_rs_reserved nd_rs_hdr.icmp6_data32[0]
        !           211:
        !           212: struct nd_router_advert {      /* router advertisement */
        !           213:        struct icmp6_hdr        nd_ra_hdr;
        !           214:        u_int32_t               nd_ra_reachable;        /* reachable time */
        !           215:        u_int32_t               nd_ra_retransmit;       /* retransmit timer */
        !           216:        /* could be followed by options */
        !           217: } __packed;
        !           218:
        !           219: #define nd_ra_type             nd_ra_hdr.icmp6_type
        !           220: #define nd_ra_code             nd_ra_hdr.icmp6_code
        !           221: #define nd_ra_cksum            nd_ra_hdr.icmp6_cksum
        !           222: #define nd_ra_curhoplimit      nd_ra_hdr.icmp6_data8[0]
        !           223: #define nd_ra_flags_reserved   nd_ra_hdr.icmp6_data8[1]
        !           224: #define ND_RA_FLAG_MANAGED     0x80
        !           225: #define ND_RA_FLAG_OTHER       0x40
        !           226: #define nd_ra_router_lifetime  nd_ra_hdr.icmp6_data16[1]
        !           227:
        !           228: struct nd_neighbor_solicit {   /* neighbor solicitation */
        !           229:        struct icmp6_hdr        nd_ns_hdr;
        !           230:        struct in6_addr         nd_ns_target;   /*target address */
        !           231:        /* could be followed by options */
        !           232: } __packed;
        !           233:
        !           234: #define nd_ns_type             nd_ns_hdr.icmp6_type
        !           235: #define nd_ns_code             nd_ns_hdr.icmp6_code
        !           236: #define nd_ns_cksum            nd_ns_hdr.icmp6_cksum
        !           237: #define nd_ns_reserved         nd_ns_hdr.icmp6_data32[0]
        !           238:
        !           239: struct nd_neighbor_advert {    /* neighbor advertisement */
        !           240:        struct icmp6_hdr        nd_na_hdr;
        !           241:        struct in6_addr         nd_na_target;   /* target address */
        !           242:        /* could be followed by options */
        !           243: } __packed;
        !           244:
        !           245: #define nd_na_type             nd_na_hdr.icmp6_type
        !           246: #define nd_na_code             nd_na_hdr.icmp6_code
        !           247: #define nd_na_cksum            nd_na_hdr.icmp6_cksum
        !           248: #define nd_na_flags_reserved   nd_na_hdr.icmp6_data32[0]
        !           249: #if _BYTE_ORDER == _BIG_ENDIAN
        !           250: #define ND_NA_FLAG_ROUTER              0x80000000
        !           251: #define ND_NA_FLAG_SOLICITED           0x40000000
        !           252: #define ND_NA_FLAG_OVERRIDE            0x20000000
        !           253: #else
        !           254: #if _BYTE_ORDER == _LITTLE_ENDIAN
        !           255: #define ND_NA_FLAG_ROUTER              0x80
        !           256: #define ND_NA_FLAG_SOLICITED           0x40
        !           257: #define ND_NA_FLAG_OVERRIDE            0x20
        !           258: #endif
        !           259: #endif
        !           260:
        !           261: struct nd_redirect {           /* redirect */
        !           262:        struct icmp6_hdr        nd_rd_hdr;
        !           263:        struct in6_addr         nd_rd_target;   /* target address */
        !           264:        struct in6_addr         nd_rd_dst;      /* destination address */
        !           265:        /* could be followed by options */
        !           266: } __packed;
        !           267:
        !           268: #define nd_rd_type             nd_rd_hdr.icmp6_type
        !           269: #define nd_rd_code             nd_rd_hdr.icmp6_code
        !           270: #define nd_rd_cksum            nd_rd_hdr.icmp6_cksum
        !           271: #define nd_rd_reserved         nd_rd_hdr.icmp6_data32[0]
        !           272:
        !           273: struct nd_opt_hdr {            /* Neighbor discovery option header */
        !           274:        u_int8_t        nd_opt_type;
        !           275:        u_int8_t        nd_opt_len;
        !           276:        /* followed by option specific data*/
        !           277: } __packed;
        !           278:
        !           279: #define ND_OPT_SOURCE_LINKADDR         1
        !           280: #define ND_OPT_TARGET_LINKADDR         2
        !           281: #define ND_OPT_PREFIX_INFORMATION      3
        !           282: #define ND_OPT_REDIRECTED_HEADER       4
        !           283: #define ND_OPT_MTU                     5
        !           284:
        !           285: struct nd_opt_prefix_info {    /* prefix information */
        !           286:        u_int8_t        nd_opt_pi_type;
        !           287:        u_int8_t        nd_opt_pi_len;
        !           288:        u_int8_t        nd_opt_pi_prefix_len;
        !           289:        u_int8_t        nd_opt_pi_flags_reserved;
        !           290:        u_int32_t       nd_opt_pi_valid_time;
        !           291:        u_int32_t       nd_opt_pi_preferred_time;
        !           292:        u_int32_t       nd_opt_pi_reserved2;
        !           293:        struct in6_addr nd_opt_pi_prefix;
        !           294: } __packed;
        !           295:
        !           296: #define ND_OPT_PI_FLAG_ONLINK          0x80
        !           297: #define ND_OPT_PI_FLAG_AUTO            0x40
        !           298:
        !           299: struct nd_opt_rd_hdr {         /* redirected header */
        !           300:        u_int8_t        nd_opt_rh_type;
        !           301:        u_int8_t        nd_opt_rh_len;
        !           302:        u_int16_t       nd_opt_rh_reserved1;
        !           303:        u_int32_t       nd_opt_rh_reserved2;
        !           304:        /* followed by IP header and data */
        !           305: } __packed;
        !           306:
        !           307: struct nd_opt_mtu {            /* MTU option */
        !           308:        u_int8_t        nd_opt_mtu_type;
        !           309:        u_int8_t        nd_opt_mtu_len;
        !           310:        u_int16_t       nd_opt_mtu_reserved;
        !           311:        u_int32_t       nd_opt_mtu_mtu;
        !           312: } __packed;
        !           313:
        !           314: /*
        !           315:  * icmp6 namelookup
        !           316:  */
        !           317:
        !           318: struct icmp6_namelookup {
        !           319:        struct icmp6_hdr        icmp6_nl_hdr;
        !           320:        u_int8_t        icmp6_nl_nonce[8];
        !           321:        int32_t         icmp6_nl_ttl;
        !           322: #if 0
        !           323:        u_int8_t        icmp6_nl_len;
        !           324:        u_int8_t        icmp6_nl_name[3];
        !           325: #endif
        !           326:        /* could be followed by options */
        !           327: } __packed;
        !           328:
        !           329: /*
        !           330:  * icmp6 node information
        !           331:  */
        !           332: struct icmp6_nodeinfo {
        !           333:        struct icmp6_hdr icmp6_ni_hdr;
        !           334:        u_int8_t icmp6_ni_nonce[8];
        !           335:        /* could be followed by reply data */
        !           336: } __packed;
        !           337:
        !           338: #define ni_type                icmp6_ni_hdr.icmp6_type
        !           339: #define ni_code                icmp6_ni_hdr.icmp6_code
        !           340: #define ni_cksum       icmp6_ni_hdr.icmp6_cksum
        !           341: #define ni_qtype       icmp6_ni_hdr.icmp6_data16[0]
        !           342: #define ni_flags       icmp6_ni_hdr.icmp6_data16[1]
        !           343:
        !           344: #define NI_QTYPE_NOOP          0 /* NOOP  */
        !           345: #define NI_QTYPE_SUPTYPES      1 /* Supported Qtypes */
        !           346: #define NI_QTYPE_FQDN          2 /* FQDN (draft 04) */
        !           347: #define NI_QTYPE_DNSNAME       2 /* DNS Name */
        !           348: #define NI_QTYPE_NODEADDR      3 /* Node Addresses */
        !           349: #define NI_QTYPE_IPV4ADDR      4 /* IPv4 Addresses */
        !           350:
        !           351: #if _BYTE_ORDER == _BIG_ENDIAN
        !           352: #define NI_SUPTYPE_FLAG_COMPRESS       0x1
        !           353: #define NI_FQDN_FLAG_VALIDTTL          0x1
        !           354: #elif _BYTE_ORDER == _LITTLE_ENDIAN
        !           355: #define NI_SUPTYPE_FLAG_COMPRESS       0x0100
        !           356: #define NI_FQDN_FLAG_VALIDTTL          0x0100
        !           357: #endif
        !           358:
        !           359: #ifdef NAME_LOOKUPS_04
        !           360: #if _BYTE_ORDER == _BIG_ENDIAN
        !           361: #define NI_NODEADDR_FLAG_LINKLOCAL     0x1
        !           362: #define NI_NODEADDR_FLAG_SITELOCAL     0x2
        !           363: #define NI_NODEADDR_FLAG_GLOBAL                0x4
        !           364: #define NI_NODEADDR_FLAG_ALL           0x8
        !           365: #define NI_NODEADDR_FLAG_TRUNCATE      0x10
        !           366: #define NI_NODEADDR_FLAG_ANYCAST       0x20 /* just experimental. not in spec */
        !           367: #elif _BYTE_ORDER == _LITTLE_ENDIAN
        !           368: #define NI_NODEADDR_FLAG_LINKLOCAL     0x0100
        !           369: #define NI_NODEADDR_FLAG_SITELOCAL     0x0200
        !           370: #define NI_NODEADDR_FLAG_GLOBAL                0x0400
        !           371: #define NI_NODEADDR_FLAG_ALL           0x0800
        !           372: #define NI_NODEADDR_FLAG_TRUNCATE      0x1000
        !           373: #define NI_NODEADDR_FLAG_ANYCAST       0x2000 /* just experimental. not in spec */
        !           374: #endif
        !           375: #else  /* draft-ietf-ipngwg-icmp-name-lookups-05 (and later?) */
        !           376: #if _BYTE_ORDER == _BIG_ENDIAN
        !           377: #define NI_NODEADDR_FLAG_TRUNCATE      0x1
        !           378: #define NI_NODEADDR_FLAG_ALL           0x2
        !           379: #define NI_NODEADDR_FLAG_COMPAT                0x4
        !           380: #define NI_NODEADDR_FLAG_LINKLOCAL     0x8
        !           381: #define NI_NODEADDR_FLAG_SITELOCAL     0x10
        !           382: #define NI_NODEADDR_FLAG_GLOBAL                0x20
        !           383: #define NI_NODEADDR_FLAG_ANYCAST       0x40 /* just experimental. not in spec */
        !           384: #elif _BYTE_ORDER == _LITTLE_ENDIAN
        !           385: #define NI_NODEADDR_FLAG_TRUNCATE      0x0100
        !           386: #define NI_NODEADDR_FLAG_ALL           0x0200
        !           387: #define NI_NODEADDR_FLAG_COMPAT                0x0400
        !           388: #define NI_NODEADDR_FLAG_LINKLOCAL     0x0800
        !           389: #define NI_NODEADDR_FLAG_SITELOCAL     0x1000
        !           390: #define NI_NODEADDR_FLAG_GLOBAL                0x2000
        !           391: #define NI_NODEADDR_FLAG_ANYCAST       0x4000 /* just experimental. not in spec */
        !           392: #endif
        !           393: #endif
        !           394:
        !           395: struct ni_reply_fqdn {
        !           396:        u_int32_t ni_fqdn_ttl;  /* TTL */
        !           397:        u_int8_t ni_fqdn_namelen; /* length in octets of the FQDN */
        !           398:        u_int8_t ni_fqdn_name[3]; /* XXX: alignment */
        !           399: } __packed;
        !           400:
        !           401: /*
        !           402:  * Router Renumbering. as router-renum-08.txt
        !           403:  */
        !           404: struct icmp6_router_renum {    /* router renumbering header */
        !           405:        struct icmp6_hdr        rr_hdr;
        !           406:        u_int8_t        rr_segnum;
        !           407:        u_int8_t        rr_flags;
        !           408:        u_int16_t       rr_maxdelay;
        !           409:        u_int32_t       rr_reserved;
        !           410: } __packed;
        !           411:
        !           412: #define ICMP6_RR_FLAGS_TEST            0x80
        !           413: #define ICMP6_RR_FLAGS_REQRESULT       0x40
        !           414: #define ICMP6_RR_FLAGS_FORCEAPPLY      0x20
        !           415: #define ICMP6_RR_FLAGS_SPECSITE                0x10
        !           416: #define ICMP6_RR_FLAGS_PREVDONE                0x08
        !           417:
        !           418: #define rr_type                rr_hdr.icmp6_type
        !           419: #define rr_code                rr_hdr.icmp6_code
        !           420: #define rr_cksum       rr_hdr.icmp6_cksum
        !           421: #define rr_seqnum      rr_hdr.icmp6_data32[0]
        !           422:
        !           423: struct rr_pco_match {          /* match prefix part */
        !           424:        u_int8_t        rpm_code;
        !           425:        u_int8_t        rpm_len;
        !           426:        u_int8_t        rpm_ordinal;
        !           427:        u_int8_t        rpm_matchlen;
        !           428:        u_int8_t        rpm_minlen;
        !           429:        u_int8_t        rpm_maxlen;
        !           430:        u_int16_t       rpm_reserved;
        !           431:        struct  in6_addr        rpm_prefix;
        !           432: } __packed;
        !           433:
        !           434: #define RPM_PCO_ADD            1
        !           435: #define RPM_PCO_CHANGE         2
        !           436: #define RPM_PCO_SETGLOBAL      3
        !           437: #define RPM_PCO_MAX            4
        !           438:
        !           439: struct rr_pco_use {            /* use prefix part */
        !           440:        u_int8_t        rpu_uselen;
        !           441:        u_int8_t        rpu_keeplen;
        !           442:        u_int8_t        rpu_ramask;
        !           443:        u_int8_t        rpu_raflags;
        !           444:        u_int32_t       rpu_vltime;
        !           445:        u_int32_t       rpu_pltime;
        !           446:        u_int32_t       rpu_flags;
        !           447:        struct  in6_addr rpu_prefix;
        !           448: } __packed;
        !           449: #define ICMP6_RR_PCOUSE_RAFLAGS_ONLINK 0x80
        !           450: #define ICMP6_RR_PCOUSE_RAFLAGS_AUTO   0x40
        !           451:
        !           452: #if _BYTE_ORDER == _BIG_ENDIAN
        !           453: #define ICMP6_RR_PCOUSE_FLAGS_DECRVLTIME     0x80000000
        !           454: #define ICMP6_RR_PCOUSE_FLAGS_DECRPLTIME     0x40000000
        !           455: #elif _BYTE_ORDER == _LITTLE_ENDIAN
        !           456: #define ICMP6_RR_PCOUSE_FLAGS_DECRVLTIME     0x80
        !           457: #define ICMP6_RR_PCOUSE_FLAGS_DECRPLTIME     0x40
        !           458: #endif
        !           459:
        !           460: struct rr_result {             /* router renumbering result message */
        !           461:        u_int16_t       rrr_flags;
        !           462:        u_int8_t        rrr_ordinal;
        !           463:        u_int8_t        rrr_matchedlen;
        !           464:        u_int32_t       rrr_ifid;
        !           465:        struct  in6_addr rrr_prefix;
        !           466: } __packed;
        !           467: #if _BYTE_ORDER == _BIG_ENDIAN
        !           468: #define ICMP6_RR_RESULT_FLAGS_OOB              0x0002
        !           469: #define ICMP6_RR_RESULT_FLAGS_FORBIDDEN                0x0001
        !           470: #elif _BYTE_ORDER == _LITTLE_ENDIAN
        !           471: #define ICMP6_RR_RESULT_FLAGS_OOB              0x0200
        !           472: #define ICMP6_RR_RESULT_FLAGS_FORBIDDEN                0x0100
        !           473: #endif
        !           474:
        !           475: /*
        !           476:  * icmp6 filter structures.
        !           477:  */
        !           478:
        !           479: struct icmp6_filter {
        !           480:        u_int32_t icmp6_filt[8];
        !           481: };
        !           482:
        !           483: #ifdef _KERNEL
        !           484: #define        ICMP6_FILTER_SETPASSALL(filterp) \
        !           485: do {                                                           \
        !           486:        int i; u_char *p;                                       \
        !           487:        p = (u_char *)filterp;                                  \
        !           488:        for (i = 0; i < sizeof(struct icmp6_filter); i++)       \
        !           489:                p[i] = 0xff;                                    \
        !           490: } while (0)
        !           491: #define        ICMP6_FILTER_SETBLOCKALL(filterp) \
        !           492:        bzero(filterp, sizeof(struct icmp6_filter))
        !           493: #else /* _KERNEL */
        !           494: #define        ICMP6_FILTER_SETPASSALL(filterp) \
        !           495:        memset(filterp, 0xff, sizeof(struct icmp6_filter))
        !           496: #define        ICMP6_FILTER_SETBLOCKALL(filterp) \
        !           497:        memset(filterp, 0x00, sizeof(struct icmp6_filter))
        !           498: #endif /* _KERNEL */
        !           499:
        !           500: #define        ICMP6_FILTER_SETPASS(type, filterp) \
        !           501:        (((filterp)->icmp6_filt[(type) >> 5]) |= (1 << ((type) & 31)))
        !           502: #define        ICMP6_FILTER_SETBLOCK(type, filterp) \
        !           503:        (((filterp)->icmp6_filt[(type) >> 5]) &= ~(1 << ((type) & 31)))
        !           504: #define        ICMP6_FILTER_WILLPASS(type, filterp) \
        !           505:        ((((filterp)->icmp6_filt[(type) >> 5]) & (1 << ((type) & 31))) != 0)
        !           506: #define        ICMP6_FILTER_WILLBLOCK(type, filterp) \
        !           507:        ((((filterp)->icmp6_filt[(type) >> 5]) & (1 << ((type) & 31))) == 0)
        !           508:
        !           509: /*
        !           510:  * Variables related to this implementation
        !           511:  * of the internet control message protocol version 6.
        !           512:  */
        !           513: struct icmp6errstat {
        !           514:        u_int64_t icp6errs_dst_unreach_noroute;
        !           515:        u_int64_t icp6errs_dst_unreach_admin;
        !           516:        u_int64_t icp6errs_dst_unreach_beyondscope;
        !           517:        u_int64_t icp6errs_dst_unreach_addr;
        !           518:        u_int64_t icp6errs_dst_unreach_noport;
        !           519:        u_int64_t icp6errs_packet_too_big;
        !           520:        u_int64_t icp6errs_time_exceed_transit;
        !           521:        u_int64_t icp6errs_time_exceed_reassembly;
        !           522:        u_int64_t icp6errs_paramprob_header;
        !           523:        u_int64_t icp6errs_paramprob_nextheader;
        !           524:        u_int64_t icp6errs_paramprob_option;
        !           525:        u_int64_t icp6errs_redirect; /* we regard redirect as an error here */
        !           526:        u_int64_t icp6errs_unknown;
        !           527: };
        !           528:
        !           529: struct icmp6stat {
        !           530: /* statistics related to icmp6 packets generated */
        !           531:        u_int64_t icp6s_error;          /* # of calls to icmp6_error */
        !           532:        u_int64_t icp6s_canterror;      /* no error because old was icmp */
        !           533:        u_int64_t icp6s_toofreq;        /* no error because rate limitation */
        !           534:        u_int64_t icp6s_outhist[256];
        !           535: /* statistics related to input message processed */
        !           536:        u_int64_t icp6s_badcode;        /* icmp6_code out of range */
        !           537:        u_int64_t icp6s_tooshort;       /* packet < sizeof(struct icmp6_hdr) */
        !           538:        u_int64_t icp6s_checksum;       /* bad checksum */
        !           539:        u_int64_t icp6s_badlen;         /* calculated bound mismatch */
        !           540:        /*
        !           541:         * number of responses: this member is inherited from netinet code, but
        !           542:         * for netinet6 code, it is already available in icp6s_outhist[].
        !           543:         */
        !           544:        u_int64_t icp6s_reflect;
        !           545:        u_int64_t icp6s_inhist[256];
        !           546:        u_int64_t icp6s_nd_toomanyopt;  /* too many ND options */
        !           547:        struct icmp6errstat icp6s_outerrhist;
        !           548: #define icp6s_odst_unreach_noroute \
        !           549:        icp6s_outerrhist.icp6errs_dst_unreach_noroute
        !           550: #define icp6s_odst_unreach_admin icp6s_outerrhist.icp6errs_dst_unreach_admin
        !           551: #define icp6s_odst_unreach_beyondscope \
        !           552:        icp6s_outerrhist.icp6errs_dst_unreach_beyondscope
        !           553: #define icp6s_odst_unreach_addr icp6s_outerrhist.icp6errs_dst_unreach_addr
        !           554: #define icp6s_odst_unreach_noport icp6s_outerrhist.icp6errs_dst_unreach_noport
        !           555: #define icp6s_opacket_too_big icp6s_outerrhist.icp6errs_packet_too_big
        !           556: #define icp6s_otime_exceed_transit \
        !           557:        icp6s_outerrhist.icp6errs_time_exceed_transit
        !           558: #define icp6s_otime_exceed_reassembly \
        !           559:        icp6s_outerrhist.icp6errs_time_exceed_reassembly
        !           560: #define icp6s_oparamprob_header icp6s_outerrhist.icp6errs_paramprob_header
        !           561: #define icp6s_oparamprob_nextheader \
        !           562:        icp6s_outerrhist.icp6errs_paramprob_nextheader
        !           563: #define icp6s_oparamprob_option icp6s_outerrhist.icp6errs_paramprob_option
        !           564: #define icp6s_oredirect icp6s_outerrhist.icp6errs_redirect
        !           565: #define icp6s_ounknown icp6s_outerrhist.icp6errs_unknown
        !           566:        u_int64_t icp6s_pmtuchg;        /* path MTU changes */
        !           567:        u_int64_t icp6s_nd_badopt;      /* bad ND options */
        !           568:        u_int64_t icp6s_badns;          /* bad neighbor solicitation */
        !           569:        u_int64_t icp6s_badna;          /* bad neighbor advertisement */
        !           570:        u_int64_t icp6s_badrs;          /* bad router advertisement */
        !           571:        u_int64_t icp6s_badra;          /* bad router advertisement */
        !           572:        u_int64_t icp6s_badredirect;    /* bad redirect message */
        !           573: };
        !           574:
        !           575: /*
        !           576:  * Names for ICMP sysctl objects
        !           577:  */
        !           578: #define ICMPV6CTL_STATS                1
        !           579: #define ICMPV6CTL_REDIRACCEPT  2       /* accept/process redirects */
        !           580: #define ICMPV6CTL_REDIRTIMEOUT 3       /* redirect cache time */
        !           581: #if 0  /*obsoleted*/
        !           582: #define ICMPV6CTL_ERRRATELIMIT 5       /* ICMPv6 error rate limitation */
        !           583: #endif
        !           584: #define ICMPV6CTL_ND6_PRUNE    6
        !           585: #define ICMPV6CTL_ND6_DELAY    8
        !           586: #define ICMPV6CTL_ND6_UMAXTRIES        9
        !           587: #define ICMPV6CTL_ND6_MMAXTRIES                10
        !           588: #define ICMPV6CTL_ND6_USELOOPBACK      11
        !           589: /*#define ICMPV6CTL_ND6_PROXYALL       12      obsoleted, do not reuse here */
        !           590: #define ICMPV6CTL_NODEINFO     13
        !           591: #define ICMPV6CTL_ERRPPSLIMIT  14      /* ICMPv6 error pps limitation */
        !           592: #define ICMPV6CTL_ND6_MAXNUDHINT       15
        !           593: #define ICMPV6CTL_MTUDISC_HIWAT        16
        !           594: #define ICMPV6CTL_MTUDISC_LOWAT        17
        !           595: #define ICMPV6CTL_ND6_DEBUG    18
        !           596: #define ICMPV6CTL_ND6_DRLIST   19
        !           597: #define ICMPV6CTL_ND6_PRLIST   20
        !           598: #define ICMPV6CTL_MAXID                21
        !           599:
        !           600: #define ICMPV6CTL_NAMES { \
        !           601:        { 0, 0 }, \
        !           602:        { 0, 0 }, \
        !           603:        { "rediraccept", CTLTYPE_INT }, \
        !           604:        { "redirtimeout", CTLTYPE_INT }, \
        !           605:        { 0, 0 }, \
        !           606:        { 0, 0 }, \
        !           607:        { "nd6_prune", CTLTYPE_INT }, \
        !           608:        { 0, 0 }, \
        !           609:        { "nd6_delay", CTLTYPE_INT }, \
        !           610:        { "nd6_umaxtries", CTLTYPE_INT }, \
        !           611:        { "nd6_mmaxtries", CTLTYPE_INT }, \
        !           612:        { "nd6_useloopback", CTLTYPE_INT }, \
        !           613:        { 0, 0 }, \
        !           614:        { "nodeinfo", CTLTYPE_INT }, \
        !           615:        { "errppslimit", CTLTYPE_INT }, \
        !           616:        { "nd6_maxnudhint", CTLTYPE_INT }, \
        !           617:        { "mtudisc_hiwat", CTLTYPE_INT }, \
        !           618:        { "mtudisc_lowat", CTLTYPE_INT }, \
        !           619:        { "nd6_debug", CTLTYPE_INT }, \
        !           620:        { 0, 0 }, \
        !           621:        { 0, 0 }, \
        !           622: }
        !           623:
        !           624: #define ICMPV6CTL_VARS { \
        !           625:        NULL, \
        !           626:        NULL, \
        !           627:        &icmp6_rediraccept, \
        !           628:        &icmp6_redirtimeout, \
        !           629:        NULL, \
        !           630:        NULL, \
        !           631:        &nd6_prune, \
        !           632:        NULL, \
        !           633:        &nd6_delay, \
        !           634:        &nd6_umaxtries, \
        !           635:        &nd6_mmaxtries, \
        !           636:        &nd6_useloopback, \
        !           637:        NULL, \
        !           638:        &icmp6_nodeinfo, \
        !           639:        &icmp6errppslim, \
        !           640:        &nd6_maxnudhint, \
        !           641:        &icmp6_mtudisc_hiwat, \
        !           642:        &icmp6_mtudisc_lowat, \
        !           643:        &nd6_debug, \
        !           644:        NULL, \
        !           645:        NULL, \
        !           646: }
        !           647:
        !           648: #define RTF_PROBEMTU   RTF_PROTO1
        !           649:
        !           650: #ifdef _KERNEL
        !           651: # ifdef __STDC__
        !           652: struct rtentry;
        !           653: struct rttimer;
        !           654: struct in6_multi;
        !           655: # endif
        !           656: void   icmp6_init(void);
        !           657: void   icmp6_paramerror(struct mbuf *, int);
        !           658: void   icmp6_error(struct mbuf *, int, int, int);
        !           659: int    icmp6_input(struct mbuf **, int *, int);
        !           660: void   icmp6_fasttimo(void);
        !           661: void   icmp6_reflect(struct mbuf *, size_t);
        !           662: void   icmp6_prepare(struct mbuf *);
        !           663: void   icmp6_redirect_input(struct mbuf *, int);
        !           664: void   icmp6_redirect_output(struct mbuf *, struct rtentry *);
        !           665: int    icmp6_sysctl(int *, u_int, void *, size_t *, void *, size_t);
        !           666:
        !           667: struct ip6ctlparam;
        !           668: void   icmp6_mtudisc_update(struct ip6ctlparam *, int);
        !           669: void   icmp6_mtudisc_callback_register(void (*)(struct in6_addr *));
        !           670:
        !           671: /* XXX: is this the right place for these macros? */
        !           672: #define icmp6_ifstat_inc(ifp, tag) \
        !           673: do {                                                           \
        !           674:        if (ifp)                                                \
        !           675:                ((struct in6_ifextra *)((ifp)->if_afdata[AF_INET6]))->icmp6_ifstat->tag++; \
        !           676: } while (0)
        !           677:
        !           678: #define icmp6_ifoutstat_inc(ifp, type, code) \
        !           679: do { \
        !           680:                icmp6_ifstat_inc(ifp, ifs6_out_msg); \
        !           681:                switch(type) { \
        !           682:                 case ICMP6_DST_UNREACH: \
        !           683:                         icmp6_ifstat_inc(ifp, ifs6_out_dstunreach); \
        !           684:                         if (code == ICMP6_DST_UNREACH_ADMIN) \
        !           685:                                 icmp6_ifstat_inc(ifp, ifs6_out_adminprohib); \
        !           686:                         break; \
        !           687:                 case ICMP6_PACKET_TOO_BIG: \
        !           688:                         icmp6_ifstat_inc(ifp, ifs6_out_pkttoobig); \
        !           689:                         break; \
        !           690:                 case ICMP6_TIME_EXCEEDED: \
        !           691:                         icmp6_ifstat_inc(ifp, ifs6_out_timeexceed); \
        !           692:                         break; \
        !           693:                 case ICMP6_PARAM_PROB: \
        !           694:                         icmp6_ifstat_inc(ifp, ifs6_out_paramprob); \
        !           695:                         break; \
        !           696:                 case ICMP6_ECHO_REQUEST: \
        !           697:                         icmp6_ifstat_inc(ifp, ifs6_out_echo); \
        !           698:                         break; \
        !           699:                 case ICMP6_ECHO_REPLY: \
        !           700:                         icmp6_ifstat_inc(ifp, ifs6_out_echoreply); \
        !           701:                         break; \
        !           702:                 case MLD_LISTENER_QUERY: \
        !           703:                         icmp6_ifstat_inc(ifp, ifs6_out_mldquery); \
        !           704:                         break; \
        !           705:                 case MLD_LISTENER_REPORT: \
        !           706:                         icmp6_ifstat_inc(ifp, ifs6_out_mldreport); \
        !           707:                         break; \
        !           708:                 case MLD_LISTENER_DONE: \
        !           709:                         icmp6_ifstat_inc(ifp, ifs6_out_mlddone); \
        !           710:                         break; \
        !           711:                 case ND_ROUTER_SOLICIT: \
        !           712:                         icmp6_ifstat_inc(ifp, ifs6_out_routersolicit); \
        !           713:                         break; \
        !           714:                 case ND_ROUTER_ADVERT: \
        !           715:                         icmp6_ifstat_inc(ifp, ifs6_out_routeradvert); \
        !           716:                         break; \
        !           717:                 case ND_NEIGHBOR_SOLICIT: \
        !           718:                         icmp6_ifstat_inc(ifp, ifs6_out_neighborsolicit); \
        !           719:                         break; \
        !           720:                 case ND_NEIGHBOR_ADVERT: \
        !           721:                         icmp6_ifstat_inc(ifp, ifs6_out_neighboradvert); \
        !           722:                         break; \
        !           723:                 case ND_REDIRECT: \
        !           724:                         icmp6_ifstat_inc(ifp, ifs6_out_redirect); \
        !           725:                         break; \
        !           726:                } \
        !           727: } while (0)
        !           728:
        !           729: extern int     icmp6_rediraccept;      /* accept/process redirects */
        !           730: extern int     icmp6_redirtimeout;     /* cache time for redirect routes */
        !           731: #endif /* _KERNEL */
        !           732: #endif /* _NETINET_ICMP6_H_ */

CVSweb