home *** CD-ROM | disk | FTP | other *** search
/ H4CK3R 4 / hacker04 / 04_HACK04.ISO / darwin / darwinx86.iso / usr / include / netinet / ip6.h < prev    next >
Encoding:
C/C++ Source or Header  |  2001-09-30  |  14.0 KB  |  428 lines

  1. /*
  2.  * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
  3.  *
  4.  * @APPLE_LICENSE_HEADER_START@
  5.  * 
  6.  * The contents of this file constitute Original Code as defined in and
  7.  * are subject to the Apple Public Source License Version 1.1 (the
  8.  * "License").  You may not use this file except in compliance with the
  9.  * License.  Please obtain a copy of the License at
  10.  * http://www.apple.com/publicsource and read it before using this file.
  11.  * 
  12.  * This Original Code and all software distributed under the License are
  13.  * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
  14.  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
  15.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
  16.  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
  17.  * License for the specific language governing rights and limitations
  18.  * under the License.
  19.  * 
  20.  * @APPLE_LICENSE_HEADER_END@
  21.  */
  22. /*    $KAME: ip6.h,v 1.6 2000/02/26 12:53:07 jinmei Exp $    */
  23.  
  24. /*
  25.  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
  26.  * All rights reserved.
  27.  *
  28.  * Redistribution and use in source and binary forms, with or without
  29.  * modification, are permitted provided that the following conditions
  30.  * are met:
  31.  * 1. Redistributions of source code must retain the above copyright
  32.  *    notice, this list of conditions and the following disclaimer.
  33.  * 2. Redistributions in binary form must reproduce the above copyright
  34.  *    notice, this list of conditions and the following disclaimer in the
  35.  *    documentation and/or other materials provided with the distribution.
  36.  * 3. Neither the name of the project nor the names of its contributors
  37.  *    may be used to endorse or promote products derived from this software
  38.  *    without specific prior written permission.
  39.  *
  40.  * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
  41.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  42.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  43.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
  44.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  45.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  46.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  47.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  48.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  49.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  50.  * SUCH DAMAGE.
  51.  */
  52.  
  53. /*
  54.  * Copyright (c) 1982, 1986, 1993
  55.  *    The Regents of the University of California.  All rights reserved.
  56.  *
  57.  * Redistribution and use in source and binary forms, with or without
  58.  * modification, are permitted provided that the following conditions
  59.  * are met:
  60.  * 1. Redistributions of source code must retain the above copyright
  61.  *    notice, this list of conditions and the following disclaimer.
  62.  * 2. Redistributions in binary form must reproduce the above copyright
  63.  *    notice, this list of conditions and the following disclaimer in the
  64.  *    documentation and/or other materials provided with the distribution.
  65.  * 3. All advertising materials mentioning features or use of this software
  66.  *    must display the following acknowledgement:
  67.  *    This product includes software developed by the University of
  68.  *    California, Berkeley and its contributors.
  69.  * 4. Neither the name of the University nor the names of its contributors
  70.  *    may be used to endorse or promote products derived from this software
  71.  *    without specific prior written permission.
  72.  *
  73.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  74.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  75.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  76.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  77.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  78.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  79.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  80.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  81.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  82.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  83.  * SUCH DAMAGE.
  84.  *
  85.  *    @(#)ip.h    8.1 (Berkeley) 6/10/93
  86.  */
  87.  
  88. #ifndef _NETINET_IP6_H_
  89. #define _NETINET_IP6_H_
  90.  
  91. /*
  92.  * Definition for internet protocol version 6.
  93.  * RFC 2460
  94.  */
  95.  
  96. struct ip6_hdr {
  97.     union {
  98.         struct ip6_hdrctl {
  99.             u_int32_t ip6_un1_flow;    /* 20 bits of flow-ID */
  100.             u_int16_t ip6_un1_plen;    /* payload length */
  101.             u_int8_t  ip6_un1_nxt;    /* next header */
  102.             u_int8_t  ip6_un1_hlim;    /* hop limit */
  103.         } ip6_un1;
  104.         u_int8_t ip6_un2_vfc;    /* 4 bits version, top 4 bits class */
  105.     } ip6_ctlun;
  106.     struct in6_addr ip6_src;    /* source address */
  107.     struct in6_addr ip6_dst;    /* destination address */
  108. };
  109.  
  110. #define ip6_vfc        ip6_ctlun.ip6_un2_vfc
  111. #define ip6_flow    ip6_ctlun.ip6_un1.ip6_un1_flow
  112. #define ip6_plen    ip6_ctlun.ip6_un1.ip6_un1_plen
  113. #define ip6_nxt        ip6_ctlun.ip6_un1.ip6_un1_nxt
  114. #define ip6_hlim    ip6_ctlun.ip6_un1.ip6_un1_hlim
  115. #define ip6_hops    ip6_ctlun.ip6_un1.ip6_un1_hlim
  116.  
  117. #define IPV6_VERSION        0x60
  118. #define IPV6_VERSION_MASK    0xf0
  119.  
  120. #if BYTE_ORDER == BIG_ENDIAN
  121. #define IPV6_FLOWINFO_MASK    0x0fffffff    /* flow info (28 bits) */
  122. #define IPV6_FLOWLABEL_MASK    0x000fffff    /* flow label (20 bits) */
  123. #else
  124. #if BYTE_ORDER == LITTLE_ENDIAN
  125. #define IPV6_FLOWINFO_MASK    0xffffff0f    /* flow info (28 bits) */
  126. #define IPV6_FLOWLABEL_MASK    0xffff0f00    /* flow label (20 bits) */
  127. #endif /* LITTLE_ENDIAN */
  128. #endif
  129. #if 1
  130. /* ECN bits proposed by Sally Floyd */
  131. #define IP6TOS_CE        0x01    /* congestion experienced */
  132. #define IP6TOS_ECT        0x02    /* ECN-capable transport */
  133. #endif
  134.  
  135. /*
  136.  * Extension Headers
  137.  */
  138.  
  139. struct    ip6_ext {
  140.     u_char    ip6e_nxt;
  141.     u_char    ip6e_len;
  142. };
  143.  
  144. /* Hop-by-Hop options header */
  145. /* XXX should we pad it to force alignment on an 8-byte boundary? */
  146. struct ip6_hbh {
  147.     u_int8_t ip6h_nxt;    /* next header */
  148.     u_int8_t ip6h_len;    /* length in units of 8 octets */
  149.     /* followed by options */
  150. };
  151.  
  152. /* Destination options header */
  153. /* XXX should we pad it to force alignment on an 8-byte boundary? */
  154. struct ip6_dest {
  155.     u_int8_t ip6d_nxt;    /* next header */
  156.     u_int8_t ip6d_len;    /* length in units of 8 octets */
  157.     /* followed by options */
  158. };
  159.  
  160. /* Option types and related macros */
  161. #define IP6OPT_PAD1        0x00    /* 00 0 00000 */
  162. #define IP6OPT_PADN        0x01    /* 00 0 00001 */
  163. #define IP6OPT_JUMBO        0xC2    /* 11 0 00010 = 194 */
  164. #define IP6OPT_NSAP_ADDR    0xC3    /* 11 0 00011 */
  165. #define IP6OPT_TUNNEL_LIMIT    0x04    /* 00 0 00100 */
  166. #define IP6OPT_RTALERT        0x05    /* 00 0 00101 (KAME definition) */
  167. #define IP6OPT_ROUTER_ALERT    0x05    /* (2292bis def, recommended) */
  168.  
  169. #define IP6OPT_RTALERT_LEN    4
  170. #define IP6OPT_RTALERT_MLD    0    /* Datagram contains an MLD message */
  171. #define IP6OPT_RTALERT_RSVP    1    /* Datagram contains an RSVP message */
  172. #define IP6OPT_RTALERT_ACTNET    2     /* contains an Active Networks msg */
  173. #define IP6OPT_MINLEN        2
  174.  
  175. #define IP6OPT_BINDING_UPDATE    0xc6 /* 11 0 00110 */
  176. #define IP6OPT_BINDING_ACK    0x07 /* 00 0 00111 */
  177. #define IP6OPT_BINDING_REQ    0x08 /* 00 0 01000 */
  178. #define IP6OPT_HOME_ADDRESS    0xc9 /* 11 0 01001 */
  179. #define IP6OPT_EID        0x8a /* 10 0 01010 */
  180.  
  181. #define IP6OPT_TYPE(o)        ((o) & 0xC0)
  182. #define IP6OPT_TYPE_SKIP    0x00
  183. #define IP6OPT_TYPE_DISCARD    0x40
  184. #define IP6OPT_TYPE_FORCEICMP    0x80
  185. #define IP6OPT_TYPE_ICMP    0xC0
  186.  
  187. #define IP6OPT_MUTABLE        0x20
  188.  
  189. /* IPv6 options: common part */
  190. struct ip6_opt {
  191.     u_int8_t ip6o_type;
  192.     u_int8_t ip6o_len;
  193. };
  194.  
  195. /* Jumbo Payload Option */
  196. struct ip6_opt_jumbo {
  197.     u_int8_t ip6oj_type;
  198.     u_int8_t ip6oj_len;
  199.     u_int8_t ip6oj_jumbo_len[4];
  200. };
  201. #define IP6OPT_JUMBO_LEN 6
  202.  
  203. /* NSAP Address Option */
  204. struct ip6_opt_nsap {
  205.     u_int8_t ip6on_type;
  206.     u_int8_t ip6on_len;
  207.     u_int8_t ip6on_src_nsap_len;
  208.     u_int8_t ip6on_dst_nsap_len;
  209.     /* followed by source NSAP */
  210.     /* followed by destination NSAP */
  211. };
  212.  
  213. /* Tunnel Limit Option */
  214. struct ip6_opt_tunnel {
  215.     u_int8_t ip6ot_type;
  216.     u_int8_t ip6ot_len;
  217.     u_int8_t ip6ot_encap_limit;
  218. };
  219.  
  220. /* Router Alert Option */
  221. struct ip6_opt_router {
  222.     u_int8_t ip6or_type;
  223.     u_int8_t ip6or_len;
  224.     u_int8_t ip6or_value[2];
  225. };
  226. /* Router alert values (in network byte order) */
  227. #if BYTE_ORDER == BIG_ENDIAN
  228. #define IP6_ALERT_MLD    0x0000
  229. #define IP6_ALERT_RSVP    0x0001
  230. #define IP6_ALERT_AN    0x0002
  231. #else
  232. #if BYTE_ORDER == LITTLE_ENDIAN
  233. #define IP6_ALERT_MLD    0x0000
  234. #define IP6_ALERT_RSVP    0x0100
  235. #define IP6_ALERT_AN    0x0200
  236. #endif /* LITTLE_ENDIAN */
  237. #endif
  238.  
  239. /* Binding Update Option */
  240. struct ip6_opt_binding_update {
  241.     u_int8_t ip6ou_type;
  242.     u_int8_t ip6ou_len;
  243.     u_int8_t ip6ou_flags;
  244.     u_int8_t ip6ou_prefixlen;
  245.     u_int8_t ip6ou_seqno[2];
  246.     u_int8_t ip6ou_lifetime[4];
  247.     u_int8_t ip6ou_coa[16];/* Optional based on flags */
  248.     /* followed by sub-options */
  249. };
  250.  
  251. /* Binding Update Flags */
  252. #define IP6_BUF_ACK    0x80    /* Request a binding ack */
  253. #define IP6_BUF_HOME    0x40    /* Home Registration */
  254. #define IP6_BUF_COA    0x20    /* Care-of-address present in option */
  255. #define IP6_BUF_ROUTER    0x10    /* Sending mobile node is a router */
  256.  
  257. /* Binding Ack Option */
  258. struct ip6_opt_binding_ack {
  259.     u_int8_t ip6oa_type;
  260.     u_int8_t ip6oa_len;
  261.     u_int8_t ip6oa_status;
  262.     u_int8_t ip6oa_seqno[2];
  263.     u_int8_t ip6oa_lifetime[4];
  264.     u_int8_t ip6oa_refresh[4];
  265.     /* followed by sub-options */
  266. };
  267.  
  268. /* Binding Request Option */
  269. struct ip6_opt_binding_request {
  270.     u_int8_t ip6or_type;
  271.     u_int8_t ip6or_len;
  272.     /* followed by sub-options */
  273. };
  274.  
  275. /* Home Address Option */
  276. struct ip6_opt_home_address {
  277.     u_int8_t ip6oh_type;
  278.     u_int8_t ip6oh_len;
  279.     u_int8_t ip6oh_addr[16];/* Home Address */
  280.       /* followed by sub-options */
  281. };
  282.  
  283. /* Routing header */
  284. struct ip6_rthdr {
  285.     u_int8_t  ip6r_nxt;    /* next header */
  286.     u_int8_t  ip6r_len;    /* length in units of 8 octets */
  287.     u_int8_t  ip6r_type;    /* routing type */
  288.     u_int8_t  ip6r_segleft;    /* segments left */
  289.     /* followed by routing type specific data */
  290. };
  291.  
  292. /* Type 0 Routing header */
  293. struct ip6_rthdr0 {
  294.     u_int8_t  ip6r0_nxt;        /* next header */
  295.     u_int8_t  ip6r0_len;        /* length in units of 8 octets */
  296.     u_int8_t  ip6r0_type;        /* always zero */
  297.     u_int8_t  ip6r0_segleft;    /* segments left */
  298.     u_int32_t  ip6r0_reserved;    /* reserved field */
  299.     /* followed by up to 127 struct in6_addr */
  300.  
  301. #ifdef COMPAT_RFC2292
  302.     struct in6_addr  ip6r0_addr[1];    /* up to 127 addresses */
  303. #endif
  304. };
  305.  
  306. /* Fragment header */
  307. struct ip6_frag {
  308.     u_int8_t  ip6f_nxt;        /* next header */
  309.     u_int8_t  ip6f_reserved;    /* reserved field */
  310.     u_int16_t ip6f_offlg;        /* offset, reserved, and flag */
  311.     u_int32_t ip6f_ident;        /* identification */
  312. };
  313.  
  314. #if BYTE_ORDER == BIG_ENDIAN
  315. #define IP6F_OFF_MASK        0xfff8    /* mask out offset from _offlg */
  316. #define IP6F_RESERVED_MASK    0x0006    /* reserved bits in ip6f_offlg */
  317. #define IP6F_MORE_FRAG        0x0001    /* more-fragments flag */
  318. #else /* BYTE_ORDER == LITTLE_ENDIAN */
  319. #define IP6F_OFF_MASK        0xf8ff    /* mask out offset from _offlg */
  320. #define IP6F_RESERVED_MASK    0x0600    /* reserved bits in ip6f_offlg */
  321. #define IP6F_MORE_FRAG        0x0100    /* more-fragments flag */
  322. #endif /* BYTE_ORDER == LITTLE_ENDIAN */
  323.  
  324. /*
  325.  * Internet implementation parameters.
  326.  */
  327. #define IPV6_MAXHLIM    255    /* maximun hoplimit */
  328. #define IPV6_DEFHLIM    64    /* default hlim */
  329. #define IPV6_FRAGTTL    120    /* ttl for fragment packets, in slowtimo tick */
  330. #define IPV6_HLIMDEC    1    /* subtracted when forwaeding */
  331.  
  332. #define IPV6_MMTU    1280    /* minimal MTU and reassembly. 1024 + 256 */
  333. #define IPV6_MAXPACKET    65535    /* ip6 max packet size without Jumbo payload*/
  334.  
  335. #ifdef KERNEL
  336. /*
  337.  * IP6_EXTHDR_CHECK ensures that region between the IP6 header and the
  338.  * target header (including IPv6 itself, extension headers and
  339.  * TCP/UDP/ICMP6 headers) are continuous. KAME requires drivers
  340.  * to store incoming data into one internal mbuf or one or more external
  341.  * mbufs(never into two or more internal mbufs). Thus, the third case is
  342.  * supposed to never be matched but is prepared just in case.
  343.  */
  344.  
  345. #define IP6_EXTHDR_CHECK(m, off, hlen, ret)                \
  346. do {                                    \
  347.     if ((m)->m_next != NULL) {                        \
  348.     if (((m)->m_flags & M_LOOP) &&                    \
  349.         ((m)->m_len < (off) + (hlen)) &&                \
  350.         (((m) = m_pullup((m), (off) + (hlen))) == NULL)) {        \
  351.         ip6stat.ip6s_exthdrtoolong++;                \
  352.         return ret;                        \
  353.     } else if ((m)->m_flags & M_EXT) {                \
  354.         if ((m)->m_len < (off) + (hlen)) {            \
  355.             ip6stat.ip6s_exthdrtoolong++;            \
  356.             m_freem(m);                    \
  357.             return ret;                    \
  358.         }                            \
  359.     } else {                            \
  360.         if ((m)->m_len < (off) + (hlen)) {            \
  361.             ip6stat.ip6s_exthdrtoolong++;            \
  362.             m_freem(m);                    \
  363.             return ret;                    \
  364.         }                            \
  365.     }                                \
  366.     }                                    \
  367.     else {                                \
  368.     if ((m)->m_len < (off) + (hlen)) {                \
  369.         ip6stat.ip6s_tooshort++;                \
  370.         in6_ifstat_inc(m->m_pkthdr.rcvif, ifs6_in_truncated);    \
  371.         m_freem(m);                        \
  372.         return ret;                        \
  373.     }                                \
  374.     }                                    \
  375. } while (0)
  376.  
  377. /*
  378.  * IP6_EXTHDR_GET ensures that intermediate protocol header (from "off" to
  379.  * "len") is located in single mbuf, on contiguous memory region.
  380.  * The pointer to the region will be returned to pointer variable "val",
  381.  * with type "typ".
  382.  * IP6_EXTHDR_GET0 does the same, except that it aligns the structure at the
  383.  * very top of mbuf.  GET0 is likely to make memory copy than GET.
  384.  *
  385.  * XXX we're now testing this, needs m_pulldown()
  386.  */
  387. #define IP6_EXTHDR_GET(val, typ, m, off, len) \
  388. do {                                    \
  389.     struct mbuf *t;                            \
  390.     int tmp;                            \
  391.     ip6stat.ip6s_exthdrget++;                    \
  392.     if ((m)->m_len >= (off) + (len))                \
  393.         (val) = (typ)(mtod((m), caddr_t) + (off));        \
  394.     else {                                \
  395.         t = m_pulldown((m), (off), (len), &tmp);        \
  396.         if (t) {                        \
  397.             if (t->m_len < tmp + (len))            \
  398.                 panic("m_pulldown malfunction");    \
  399.             (val) = (typ)(mtod(t, caddr_t) + tmp);        \
  400.         } else {                        \
  401.             (val) = (typ)NULL;                \
  402.             (m) = NULL;                    \
  403.         }                            \
  404.     }                                \
  405. } while (0)
  406.  
  407. #define IP6_EXTHDR_GET0(val, typ, m, off, len) \
  408. do {                                    \
  409.     struct mbuf *t;                            \
  410.     ip6stat.ip6s_exthdrget0++;                    \
  411.     if ((off) == 0)                            \
  412.         (val) = (typ)mtod(m, caddr_t);                \
  413.     else {                                \
  414.         t = m_pulldown((m), (off), (len), NULL);        \
  415.         if (t) {                        \
  416.             if (t->m_len < (len))                \
  417.                 panic("m_pulldown malfunction");    \
  418.             (val) = (typ)mtod(t, caddr_t);            \
  419.         } else {                        \
  420.             (val) = (typ)NULL;                \
  421.             (m) = NULL;                    \
  422.         }                            \
  423.     }                                \
  424. } while (0)
  425. #endif /*KERNEL*/
  426.  
  427. #endif /* not _NETINET_IP6_H_ */
  428.