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

Annotation of sys/netinet/ip6.h, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: ip6.h,v 1.18 2006/12/09 01:12:28 itojun Exp $ */
                      2: /*     $KAME: ip6.h,v 1.45 2003/06/05 04:46:38 keiichi 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.h        8.1 (Berkeley) 6/10/93
                     62:  */
                     63:
                     64: #ifndef _NETINET_IP6_H_
                     65: #define _NETINET_IP6_H_
                     66:
                     67: /*
                     68:  * Definition for internet protocol version 6.
                     69:  * RFC 2460
                     70:  */
                     71:
                     72: struct ip6_hdr {
                     73:        union {
                     74:                struct ip6_hdrctl {
                     75:                        u_int32_t ip6_un1_flow; /* 20 bits of flow-ID */
                     76:                        u_int16_t ip6_un1_plen; /* payload length */
                     77:                        u_int8_t  ip6_un1_nxt;  /* next header */
                     78:                        u_int8_t  ip6_un1_hlim; /* hop limit */
                     79:                } ip6_un1;
                     80:                u_int8_t ip6_un2_vfc;   /* 4 bits version, top 4 bits class */
                     81:        } ip6_ctlun;
                     82:        struct in6_addr ip6_src;        /* source address */
                     83:        struct in6_addr ip6_dst;        /* destination address */
                     84: } __packed;
                     85:
                     86: #define ip6_vfc                ip6_ctlun.ip6_un2_vfc
                     87: #define ip6_flow       ip6_ctlun.ip6_un1.ip6_un1_flow
                     88: #define ip6_plen       ip6_ctlun.ip6_un1.ip6_un1_plen
                     89: #define ip6_nxt                ip6_ctlun.ip6_un1.ip6_un1_nxt
                     90: #define ip6_hlim       ip6_ctlun.ip6_un1.ip6_un1_hlim
                     91: #define ip6_hops       ip6_ctlun.ip6_un1.ip6_un1_hlim
                     92:
                     93: #define IPV6_VERSION           0x60
                     94: #define IPV6_VERSION_MASK      0xf0
                     95:
                     96: #if _BYTE_ORDER == _BIG_ENDIAN
                     97: #define IPV6_FLOWINFO_MASK     0x0fffffff      /* flow info (28 bits) */
                     98: #define IPV6_FLOWLABEL_MASK    0x000fffff      /* flow label (20 bits) */
                     99: #else
                    100: #if _BYTE_ORDER == _LITTLE_ENDIAN
                    101: #define IPV6_FLOWINFO_MASK     0xffffff0f      /* flow info (28 bits) */
                    102: #define IPV6_FLOWLABEL_MASK    0xffff0f00      /* flow label (20 bits) */
                    103: #endif /* _LITTLE_ENDIAN */
                    104: #endif
                    105: #if 1
                    106: /* ECN bits proposed by Sally Floyd */
                    107: #define IP6TOS_CE              0x01    /* congestion experienced */
                    108: #define IP6TOS_ECT             0x02    /* ECN-capable transport */
                    109: #endif
                    110:
                    111: #ifdef _KERNEL
                    112: /*
                    113:  * for IPv6 pseudo header checksum
                    114:  * XXX nonstandard
                    115:  */
                    116: struct ip6_hdr_pseudo {
                    117:        struct in6_addr ip6ph_src;
                    118:        struct in6_addr ip6ph_dst;
                    119:        u_int32_t       ip6ph_len;
                    120:        u_int8_t        ip6ph_zero[3];
                    121:        u_int8_t        ip6ph_nxt;
                    122: } __packed;
                    123: #endif
                    124:
                    125: /*
                    126:  * Extension Headers
                    127:  */
                    128: struct ip6_ext {
                    129:        u_int8_t ip6e_nxt;
                    130:        u_int8_t ip6e_len;
                    131: } __packed;
                    132:
                    133: /* Hop-by-Hop options header */
                    134: /* XXX should we pad it to force alignment on an 8-byte boundary? */
                    135: struct ip6_hbh {
                    136:        u_int8_t ip6h_nxt;      /* next header */
                    137:        u_int8_t ip6h_len;      /* length in units of 8 octets */
                    138:        /* followed by options */
                    139: } __packed;
                    140:
                    141: /* Destination options header */
                    142: /* XXX should we pad it to force alignment on an 8-byte boundary? */
                    143: struct ip6_dest {
                    144:        u_int8_t ip6d_nxt;      /* next header */
                    145:        u_int8_t ip6d_len;      /* length in units of 8 octets */
                    146:        /* followed by options */
                    147: } __packed;
                    148:
                    149: /* Option types and related macros */
                    150: #define IP6OPT_PAD1            0x00    /* 00 0 00000 */
                    151: #define IP6OPT_PADN            0x01    /* 00 0 00001 */
                    152: #define IP6OPT_JUMBO           0xC2    /* 11 0 00010 = 194 */
                    153: #define IP6OPT_NSAP_ADDR       0xC3    /* 11 0 00011 */
                    154: #define IP6OPT_TUNNEL_LIMIT    0x04    /* 00 0 00100 */
                    155: #define IP6OPT_ROUTER_ALERT    0x05    /* 00 0 00101 (RFC3542, recommended) */
                    156:
                    157: #define IP6OPT_RTALERT_LEN     4
                    158: #define IP6OPT_RTALERT_MLD     0       /* Datagram contains an MLD message */
                    159: #define IP6OPT_RTALERT_RSVP    1       /* Datagram contains an RSVP message */
                    160: #define IP6OPT_RTALERT_ACTNET  2       /* contains an Active Networks msg */
                    161: #define IP6OPT_MINLEN          2
                    162:
                    163: #define IP6OPT_TYPE(o)         ((o) & 0xC0)
                    164: #define IP6OPT_TYPE_SKIP       0x00
                    165: #define IP6OPT_TYPE_DISCARD    0x40
                    166: #define IP6OPT_TYPE_FORCEICMP  0x80
                    167: #define IP6OPT_TYPE_ICMP       0xC0
                    168:
                    169: #define IP6OPT_MUTABLE         0x20
                    170:
                    171: /* IPv6 options: common part */
                    172: struct ip6_opt {
                    173:        u_int8_t ip6o_type;
                    174:        u_int8_t ip6o_len;
                    175: } __packed;
                    176:
                    177: /* Jumbo Payload Option */
                    178: struct ip6_opt_jumbo {
                    179:        u_int8_t ip6oj_type;
                    180:        u_int8_t ip6oj_len;
                    181:        u_int8_t ip6oj_jumbo_len[4];
                    182: } __packed;
                    183: #define IP6OPT_JUMBO_LEN 6
                    184:
                    185: /* NSAP Address Option */
                    186: struct ip6_opt_nsap {
                    187:        u_int8_t ip6on_type;
                    188:        u_int8_t ip6on_len;
                    189:        u_int8_t ip6on_src_nsap_len;
                    190:        u_int8_t ip6on_dst_nsap_len;
                    191:        /* followed by source NSAP */
                    192:        /* followed by destination NSAP */
                    193: } __packed;
                    194:
                    195: /* Tunnel Limit Option */
                    196: struct ip6_opt_tunnel {
                    197:        u_int8_t ip6ot_type;
                    198:        u_int8_t ip6ot_len;
                    199:        u_int8_t ip6ot_encap_limit;
                    200: } __packed;
                    201:
                    202: /* Router Alert Option */
                    203: struct ip6_opt_router {
                    204:        u_int8_t ip6or_type;
                    205:        u_int8_t ip6or_len;
                    206:        u_int8_t ip6or_value[2];
                    207: } __packed;
                    208: /* Router alert values (in network byte order) */
                    209: #if _BYTE_ORDER == _BIG_ENDIAN
                    210: #define IP6_ALERT_MLD  0x0000
                    211: #define IP6_ALERT_RSVP 0x0001
                    212: #define IP6_ALERT_AN   0x0002
                    213: #else
                    214: #if _BYTE_ORDER == _LITTLE_ENDIAN
                    215: #define IP6_ALERT_MLD  0x0000
                    216: #define IP6_ALERT_RSVP 0x0100
                    217: #define IP6_ALERT_AN   0x0200
                    218: #endif /* _LITTLE_ENDIAN */
                    219: #endif
                    220:
                    221: /* Routing header */
                    222: struct ip6_rthdr {
                    223:        u_int8_t  ip6r_nxt;     /* next header */
                    224:        u_int8_t  ip6r_len;     /* length in units of 8 octets */
                    225:        u_int8_t  ip6r_type;    /* routing type */
                    226:        u_int8_t  ip6r_segleft; /* segments left */
                    227:        /* followed by routing type specific data */
                    228: } __packed;
                    229:
                    230: /* Type 0 Routing header */
                    231: struct ip6_rthdr0 {
                    232:        u_int8_t  ip6r0_nxt;            /* next header */
                    233:        u_int8_t  ip6r0_len;            /* length in units of 8 octets */
                    234:        u_int8_t  ip6r0_type;           /* always zero */
                    235:        u_int8_t  ip6r0_segleft;        /* segments left */
                    236:        u_int32_t ip6r0_reserved;       /* reserved field */
                    237: } __packed;
                    238:
                    239: /* Fragment header */
                    240: struct ip6_frag {
                    241:        u_int8_t  ip6f_nxt;             /* next header */
                    242:        u_int8_t  ip6f_reserved;        /* reserved field */
                    243:        u_int16_t ip6f_offlg;           /* offset, reserved, and flag */
                    244:        u_int32_t ip6f_ident;           /* identification */
                    245: } __packed;
                    246:
                    247: #if _BYTE_ORDER == _BIG_ENDIAN
                    248: #define IP6F_OFF_MASK          0xfff8  /* mask out offset from _offlg */
                    249: #define IP6F_RESERVED_MASK     0x0006  /* reserved bits in ip6f_offlg */
                    250: #define IP6F_MORE_FRAG         0x0001  /* more-fragments flag */
                    251: #else /* _BYTE_ORDER == _LITTLE_ENDIAN */
                    252: #define IP6F_OFF_MASK          0xf8ff  /* mask out offset from _offlg */
                    253: #define IP6F_RESERVED_MASK     0x0600  /* reserved bits in ip6f_offlg */
                    254: #define IP6F_MORE_FRAG         0x0100  /* more-fragments flag */
                    255: #endif /* _BYTE_ORDER == _LITTLE_ENDIAN */
                    256:
                    257: /*
                    258:  * Internet implementation parameters.
                    259:  */
                    260: #define IPV6_MAXHLIM   255     /* maximum hoplimit */
                    261: #define IPV6_DEFHLIM   64      /* default hlim */
                    262: #define IPV6_FRAGTTL   120     /* ttl for fragment packets, in slowtimo tick */
                    263: #define IPV6_HLIMDEC   1       /* subtracted when forwarding */
                    264:
                    265: #define IPV6_MMTU      1280    /* minimal MTU and reassembly. 1024 + 256 */
                    266: #define IPV6_MAXPACKET 65535   /* ip6 max packet size without Jumbo payload*/
                    267:
                    268: #ifdef _KERNEL
                    269: /*
                    270:  * IP6_EXTHDR_GET ensures that intermediate protocol header (from "off" to
                    271:  * "len") is located in single mbuf, on contiguous memory region.
                    272:  * The pointer to the region will be returned to pointer variable "val",
                    273:  * with type "typ".
                    274:  * IP6_EXTHDR_GET0 does the same, except that it aligns the structure at the
                    275:  * very top of mbuf.  GET0 is likely to make memory copy than GET.
                    276:  */
                    277: #define IP6_EXTHDR_GET(val, typ, m, off, len) \
                    278: do {                                                                   \
                    279:        struct mbuf *t;                                                 \
                    280:        int tmp;                                                        \
                    281:        if ((m)->m_len >= (off) + (len))                                \
                    282:                (val) = (typ)(mtod((m), caddr_t) + (off));              \
                    283:        else {                                                          \
                    284:                t = m_pulldown((m), (off), (len), &tmp);                \
                    285:                if (t) {                                                \
                    286:                        if (t->m_len < tmp + (len))                     \
                    287:                                panic("m_pulldown malfunction");        \
                    288:                        (val) = (typ)(mtod(t, caddr_t) + tmp);          \
                    289:                } else {                                                \
                    290:                        (val) = (typ)NULL;                              \
                    291:                        (m) = NULL;                                     \
                    292:                }                                                       \
                    293:        }                                                               \
                    294: } while (0)
                    295:
                    296: #define IP6_EXTHDR_GET0(val, typ, m, off, len) \
                    297: do {                                                                   \
                    298:        struct mbuf *t;                                                 \
                    299:        if ((off) == 0 && (m)->m_len >= len)                            \
                    300:                (val) = (typ)mtod((m), caddr_t);                        \
                    301:        else {                                                          \
                    302:                t = m_pulldown((m), (off), (len), NULL);                \
                    303:                if (t) {                                                \
                    304:                        if (t->m_len < (len))                           \
                    305:                                panic("m_pulldown malfunction");        \
                    306:                        (val) = (typ)mtod(t, caddr_t);                  \
                    307:                } else {                                                \
                    308:                        (val) = (typ)NULL;                              \
                    309:                        (m) = NULL;                                     \
                    310:                }                                                       \
                    311:        }                                                               \
                    312: } while (0)
                    313: #endif /* _KERNEL */
                    314: #endif /* _NETINET_IP6_H_ */

CVSweb