[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     ! 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