[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

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