ip6.h raw

   1  #ifndef _NETINET_IP6_H
   2  #define _NETINET_IP6_H
   3  
   4  #ifdef __cplusplus
   5  extern "C" {
   6  #endif
   7  
   8  #include <stdint.h>
   9  #include <netinet/in.h>
  10  
  11  struct ip6_hdr {
  12  	union {
  13  		struct ip6_hdrctl {
  14  			uint32_t ip6_un1_flow;
  15  			uint16_t ip6_un1_plen;
  16  			uint8_t  ip6_un1_nxt;
  17  			uint8_t  ip6_un1_hlim;
  18  		} ip6_un1;
  19  		uint8_t ip6_un2_vfc;
  20  	} ip6_ctlun;
  21  	struct in6_addr ip6_src;
  22  	struct in6_addr ip6_dst;
  23  };
  24  
  25  #define ip6_vfc   ip6_ctlun.ip6_un2_vfc
  26  #define ip6_flow  ip6_ctlun.ip6_un1.ip6_un1_flow
  27  #define ip6_plen  ip6_ctlun.ip6_un1.ip6_un1_plen
  28  #define ip6_nxt   ip6_ctlun.ip6_un1.ip6_un1_nxt
  29  #define ip6_hlim  ip6_ctlun.ip6_un1.ip6_un1_hlim
  30  #define ip6_hops  ip6_ctlun.ip6_un1.ip6_un1_hlim
  31  
  32  struct ip6_ext {
  33  	uint8_t  ip6e_nxt;
  34  	uint8_t  ip6e_len;
  35  };
  36  
  37  struct ip6_hbh {
  38  	uint8_t  ip6h_nxt;
  39  	uint8_t  ip6h_len;
  40  };
  41  
  42  struct ip6_dest {
  43  	uint8_t  ip6d_nxt;
  44  	uint8_t  ip6d_len;
  45  };
  46  
  47  struct ip6_rthdr {
  48  	uint8_t  ip6r_nxt;
  49  	uint8_t  ip6r_len;
  50  	uint8_t  ip6r_type;
  51  	uint8_t  ip6r_segleft;
  52  };
  53  
  54  struct ip6_rthdr0 {
  55  	uint8_t  ip6r0_nxt;
  56  	uint8_t  ip6r0_len;
  57  	uint8_t  ip6r0_type;
  58  	uint8_t  ip6r0_segleft;
  59  	uint8_t  ip6r0_reserved;
  60  	uint8_t  ip6r0_slmap[3];
  61  	struct in6_addr ip6r0_addr[];
  62  };
  63  
  64  struct ip6_frag {
  65  	uint8_t   ip6f_nxt;
  66  	uint8_t   ip6f_reserved;
  67  	uint16_t  ip6f_offlg;
  68  	uint32_t  ip6f_ident;
  69  };
  70  
  71  #if __BYTE_ORDER == __BIG_ENDIAN
  72  #define IP6F_OFF_MASK       0xfff8
  73  #define IP6F_RESERVED_MASK  0x0006
  74  #define IP6F_MORE_FRAG      0x0001
  75  #else
  76  #define IP6F_OFF_MASK       0xf8ff
  77  #define IP6F_RESERVED_MASK  0x0600
  78  #define IP6F_MORE_FRAG      0x0100
  79  #endif
  80  
  81  struct ip6_opt {
  82  	uint8_t  ip6o_type;
  83  	uint8_t  ip6o_len;
  84  };
  85  
  86  #define IP6OPT_TYPE(o)		((o) & 0xc0)
  87  #define IP6OPT_TYPE_SKIP	0x00
  88  #define IP6OPT_TYPE_DISCARD	0x40
  89  #define IP6OPT_TYPE_FORCEICMP	0x80
  90  #define IP6OPT_TYPE_ICMP	0xc0
  91  #define IP6OPT_TYPE_MUTABLE	0x20
  92  
  93  #define IP6OPT_PAD1	0
  94  #define IP6OPT_PADN	1
  95  
  96  #define IP6OPT_JUMBO		0xc2
  97  #define IP6OPT_NSAP_ADDR	0xc3
  98  #define IP6OPT_TUNNEL_LIMIT	0x04
  99  #define IP6OPT_ROUTER_ALERT	0x05
 100  
 101  struct ip6_opt_jumbo {
 102  	uint8_t  ip6oj_type;
 103  	uint8_t  ip6oj_len;
 104  	uint8_t  ip6oj_jumbo_len[4];
 105  };
 106  #define IP6OPT_JUMBO_LEN	6
 107  
 108  struct ip6_opt_nsap {
 109  	uint8_t  ip6on_type;
 110  	uint8_t  ip6on_len;
 111  	uint8_t  ip6on_src_nsap_len;
 112  	uint8_t  ip6on_dst_nsap_len;
 113  };
 114  
 115  struct ip6_opt_tunnel {
 116  	uint8_t  ip6ot_type;
 117  	uint8_t  ip6ot_len;
 118  	uint8_t  ip6ot_encap_limit;
 119  };
 120  
 121  struct ip6_opt_router {
 122  	uint8_t  ip6or_type;
 123  	uint8_t  ip6or_len;
 124  	uint8_t  ip6or_value[2];
 125  };
 126  
 127  #if __BYTE_ORDER == __BIG_ENDIAN
 128  #define IP6_ALERT_MLD	0x0000
 129  #define IP6_ALERT_RSVP	0x0001
 130  #define IP6_ALERT_AN	0x0002
 131  #else
 132  #define IP6_ALERT_MLD	0x0000
 133  #define IP6_ALERT_RSVP	0x0100
 134  #define IP6_ALERT_AN	0x0200
 135  #endif
 136  
 137  #ifdef __cplusplus
 138  }
 139  #endif
 140  
 141  #endif
 142