Home | History | Annotate | Download | only in netinet
      1 /* Copyright (C) 1991-1997, 2001, 2003, 2006 Free Software Foundation, Inc.
      2    This file is part of the GNU C Library.
      3 
      4    The GNU C Library is free software; you can redistribute it and/or
      5    modify it under the terms of the GNU Lesser General Public
      6    License as published by the Free Software Foundation; either
      7    version 2.1 of the License, or (at your option) any later version.
      8 
      9    The GNU C Library is distributed in the hope that it will be useful,
     10    but WITHOUT ANY WARRANTY; without even the implied warranty of
     11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     12    Lesser General Public License for more details.
     13 
     14    You should have received a copy of the GNU Lesser General Public
     15    License along with the GNU C Library; if not, write to the Free
     16    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
     17    02111-1307 USA.  */
     18 
     19 #ifndef _NETINET_IP6_H
     20 #define _NETINET_IP6_H 1
     21 
     22 #include <inttypes.h>
     23 #include <netinet/in.h>
     24 
     25 struct ip6_hdr
     26   {
     27     union
     28       {
     29 	struct ip6_hdrctl
     30 	  {
     31 	    uint32_t ip6_un1_flow;   /* 4 bits version, 8 bits TC,
     32 					20 bits flow-ID */
     33 	    uint16_t ip6_un1_plen;   /* payload length */
     34 	    uint8_t  ip6_un1_nxt;    /* next header */
     35 	    uint8_t  ip6_un1_hlim;   /* hop limit */
     36 	  } ip6_un1;
     37 	uint8_t ip6_un2_vfc;       /* 4 bits version, top 4 bits tclass */
     38       } ip6_ctlun;
     39     struct in6_addr ip6_src;      /* source address */
     40     struct in6_addr ip6_dst;      /* destination address */
     41   };
     42 
     43 #define ip6_vfc   ip6_ctlun.ip6_un2_vfc
     44 #define ip6_flow  ip6_ctlun.ip6_un1.ip6_un1_flow
     45 #define ip6_plen  ip6_ctlun.ip6_un1.ip6_un1_plen
     46 #define ip6_nxt   ip6_ctlun.ip6_un1.ip6_un1_nxt
     47 #define ip6_hlim  ip6_ctlun.ip6_un1.ip6_un1_hlim
     48 #define ip6_hops  ip6_ctlun.ip6_un1.ip6_un1_hlim
     49 
     50 /* Generic extension header.  */
     51 struct ip6_ext
     52   {
     53     uint8_t  ip6e_nxt;		/* next header.  */
     54     uint8_t  ip6e_len;		/* length in units of 8 octets.  */
     55   };
     56 
     57 /* Hop-by-Hop options header.  */
     58 struct ip6_hbh
     59   {
     60     uint8_t  ip6h_nxt;		/* next header.  */
     61     uint8_t  ip6h_len;		/* length in units of 8 octets.  */
     62     /* followed by options */
     63   };
     64 
     65 /* Destination options header */
     66 struct ip6_dest
     67   {
     68     uint8_t  ip6d_nxt;		/* next header */
     69     uint8_t  ip6d_len;		/* length in units of 8 octets */
     70     /* followed by options */
     71   };
     72 
     73 /* Routing header */
     74 struct ip6_rthdr
     75   {
     76     uint8_t  ip6r_nxt;		/* next header */
     77     uint8_t  ip6r_len;		/* length in units of 8 octets */
     78     uint8_t  ip6r_type;		/* routing type */
     79     uint8_t  ip6r_segleft;	/* segments left */
     80     /* followed by routing type specific data */
     81   };
     82 
     83 /* Type 0 Routing header */
     84 struct ip6_rthdr0
     85   {
     86     uint8_t  ip6r0_nxt;		/* next header */
     87     uint8_t  ip6r0_len;		/* length in units of 8 octets */
     88     uint8_t  ip6r0_type;	/* always zero */
     89     uint8_t  ip6r0_segleft;	/* segments left */
     90     uint8_t  ip6r0_reserved;	/* reserved field */
     91     uint8_t  ip6r0_slmap[3];	/* strict/loose bit map */
     92     /* followed by up to 127 struct in6_addr */
     93     struct in6_addr ip6r0_addr[0];
     94   };
     95 
     96 /* Fragment header */
     97 struct ip6_frag
     98   {
     99     uint8_t   ip6f_nxt;		/* next header */
    100     uint8_t   ip6f_reserved;	/* reserved field */
    101     uint16_t  ip6f_offlg;	/* offset, reserved, and flag */
    102     uint32_t  ip6f_ident;	/* identification */
    103   };
    104 
    105 #if BYTE_ORDER == BIG_ENDIAN
    106 # define IP6F_OFF_MASK       0xfff8  /* mask out offset from _offlg */
    107 # define IP6F_RESERVED_MASK  0x0006  /* reserved bits in ip6f_offlg */
    108 # define IP6F_MORE_FRAG      0x0001  /* more-fragments flag */
    109 #else   /* BYTE_ORDER == LITTLE_ENDIAN */
    110 # define IP6F_OFF_MASK       0xf8ff  /* mask out offset from _offlg */
    111 # define IP6F_RESERVED_MASK  0x0600  /* reserved bits in ip6f_offlg */
    112 # define IP6F_MORE_FRAG      0x0100  /* more-fragments flag */
    113 #endif
    114 
    115 /* IPv6 options */
    116 struct ip6_opt
    117   {
    118     uint8_t  ip6o_type;
    119     uint8_t  ip6o_len;
    120   };
    121 
    122 /* The high-order 3 bits of the option type define the behavior
    123  * when processing an unknown option and whether or not the option
    124  * content changes in flight.
    125  */
    126 #define IP6OPT_TYPE(o)		((o) & 0xc0)
    127 #define IP6OPT_TYPE_SKIP	0x00
    128 #define IP6OPT_TYPE_DISCARD	0x40
    129 #define IP6OPT_TYPE_FORCEICMP	0x80
    130 #define IP6OPT_TYPE_ICMP	0xc0
    131 #define IP6OPT_TYPE_MUTABLE	0x20
    132 
    133 /* Special option types for padding.  */
    134 #define IP6OPT_PAD1	0
    135 #define IP6OPT_PADN	1
    136 
    137 #define IP6OPT_JUMBO		0xc2
    138 #define IP6OPT_NSAP_ADDR	0xc3
    139 #define IP6OPT_TUNNEL_LIMIT	0x04
    140 #define IP6OPT_ROUTER_ALERT	0x05
    141 
    142 /* Jumbo Payload Option */
    143 struct ip6_opt_jumbo
    144   {
    145     uint8_t  ip6oj_type;
    146     uint8_t  ip6oj_len;
    147     uint8_t  ip6oj_jumbo_len[4];
    148   };
    149 #define IP6OPT_JUMBO_LEN	6
    150 
    151 /* NSAP Address Option */
    152 struct ip6_opt_nsap
    153   {
    154     uint8_t  ip6on_type;
    155     uint8_t  ip6on_len;
    156     uint8_t  ip6on_src_nsap_len;
    157     uint8_t  ip6on_dst_nsap_len;
    158       /* followed by source NSAP */
    159       /* followed by destination NSAP */
    160   };
    161 
    162 /* Tunnel Limit Option */
    163 struct ip6_opt_tunnel
    164   {
    165     uint8_t  ip6ot_type;
    166     uint8_t  ip6ot_len;
    167     uint8_t  ip6ot_encap_limit;
    168   };
    169 
    170 /* Router Alert Option */
    171 struct ip6_opt_router
    172   {
    173     uint8_t  ip6or_type;
    174     uint8_t  ip6or_len;
    175     uint8_t  ip6or_value[2];
    176   };
    177 
    178 /* Router alert values (in network byte order) */
    179 #if BYTE_ORDER == BIG_ENDIAN
    180 # define IP6_ALERT_MLD	0x0000
    181 # define IP6_ALERT_RSVP	0x0001
    182 # define IP6_ALERT_AN	0x0002
    183 #else /* BYTE_ORDER == LITTLE_ENDING */
    184 # define IP6_ALERT_MLD	0x0000
    185 # define IP6_ALERT_RSVP	0x0100
    186 # define IP6_ALERT_AN	0x0200
    187 #endif
    188 
    189 #endif /* netinet/ip6.h */
    190