ICMPv6 definitions.
[kopensolaris-gnu/glibc.git] / inet / netinet / icmp6.h
1 /* Copyright (C) 1991, 92, 93, 94, 95, 96, 97 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 modify
5    it under the terms of the GNU General Public License as published by
6    the Free Software Foundation; either version 2, or (at your option)
7    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
12    GNU General Public License for more details.
13
14    You should have received a copy of the GNU Library General Public
15    License along with the GNU C Library; see the file COPYING.LIB.  If not,
16    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17    Boston, MA 02111-1307, USA.  */
18
19 #ifndef _NETINET_ICMP6_H
20 #define _NETINET_ICMP6_H 1
21
22 #include <sys/types.h>
23
24 #define ICMPV6_FILTER 1
25
26 #define ICMPV6_FILTER_BLOCK             1
27 #define ICMPV6_FILTER_PASS              2
28 #define ICMPV6_FILTER_BLOCKOTHERS       3
29 #define ICMPV6_FILTER_PASSONLY          4
30
31 struct icmpv6_filter
32   {
33     u_int32_t data[8];
34   };
35
36 struct icmpv6hdr
37   {
38     u_int8_t icmpv6_type;   /* type field */
39     u_int8_t icmpv6_code;   /* code field */
40     u_int16_t icmpv6_cksum;  /* checksum field */
41     union
42       {
43         u_int32_t un_data32[1]; /* type-specific field */
44         u_int16_t un_data16[2]; /* type-specific field */
45         u_int8_t un_data8[4];  /* type-specific field */
46       } icmpv6_dataun;
47   };
48
49 #define icmpv6_data32    icmpv6_dataun.un_data32
50 #define icmpv6_data16    icmpv6_dataun.un_data16
51 #define icmpv6_data8     icmpv6_dataun.un_data8
52 #define icmpv6_pptr      icmpv6_data32[0]  /* parameter prob */
53 #define icmpv6_mtu       icmpv6_data32[0]  /* packet too big */
54 #define icmpv6_id        icmpv6_data16[0]  /* echo request/reply */
55 #define icmpv6_seq       icmpv6_data16[1]  /* echo request/reply */
56 #define icmpv6_maxdelay  icmpv6_data16[0]  /* mcast group membership */
57
58 #define ICMPV6_DEST_UNREACH             1
59 #define ICMPV6_PACKET_TOOBIG            2
60 #define ICMPV6_TIME_EXCEEDED            3
61 #define ICMPV6_PARAMETER_PROBLEM        4
62 #define ICMPV6_INFOMSG_MASK             128 /* message is info if bit set */
63 #define ICMPV6_ECHOREQUEST              128
64 #define ICMPV6_ECHOREPLY                129
65 #define ICMPV6_MGM_QUERY                130
66 #define ICMPV6_MGM_REPORT               131
67 #define ICMPV6_MGM_REDUCTION            132
68
69 #define ICMPV6_DEST_UNREACH_NOROUTE       0
70 #define ICMPV6_DEST_UNREACH_ADMIN         1 /* administratively prohibited */
71 #define ICMPV6_DEST_UNREACH_NOTNEIGHBOR   2 /* not a neighbor (and must be) */
72 #define ICMPV6_DEST_UNREACH_ADDR          3
73 #define ICMPV6_DEST_UNREACH_NOPORT        4
74 #define ICMPV6_TIME_EXCEED_HOPS           0 /* Hop Limit == 0 in transit */
75 #define ICMPV6_TIME_EXCEED_REASSEMBLY     1 /* Reassembly time out */
76 #define ICMPV6_PARAMPROB_HEADER           0 /* erroneous header field */
77 #define ICMPV6_PARAMPROB_NEXTHEADER       1 /* unrecognized Next Header */
78 #define ICMPV6_PARAMPROB_OPTION           2 /* unrecognized option */
79
80 #if defined(__OPTIMIZE__)
81 #include <asm/bitops.h>
82
83 #define ICMPV6_FILTER_WILLPASS(type, filterp) \
84         (test_bit (type, filterp) == 0)
85
86 #define ICMPV6_FILTER_WILLBLOCK(type, filterp) \
87         test_bit (type, filterp)
88
89 #define ICMPV6_FILTER_SETPASS(type, filterp) \
90         clear_bit (type & 0x1f, &((filterp)->data[type >> 5]))
91
92 #define ICMPV6_FILTER_SETBLOCK(type, filterp) \
93         set_bit (type & 0x1f, &((filterp)->data[type >> 5]))
94 #else
95 #define ICMPV6_FILTER_WILLPASS(type, filterp) \
96         ((((filterp)->data[(type) >> 5]) & (1 << ((type) & 31))) == 0)
97
98 #define ICMPV6_FILTER_WILLBLOCK(type, filterp) \
99         ((((filterp)->data[(type) >> 5]) & (1 << ((type) & 31))) != 0)
100
101 #define ICMPV6_FILTER_SETPASS(type, filterp) \
102         ((((filterp)->data[(type) >> 5]) &= ~(1 << ((type) & 31))))
103
104 #define ICMPV6_FILTER_SETBLOCK(type, filterp) \
105         ((((filterp)->data[(type) >> 5]) |=  (1 << ((type) & 31))))
106 #endif
107
108 #define ICMPV6_FILTER_SETPASSALL(filterp) \
109         memset (filterp, 0, sizeof (struct icmpv6_filter));
110
111 #define ICMPV6_FILTER_SETBLOCKALL(filterp) \
112         memset (filterp, 0xFF, sizeof (struct icmpv6_filter));
113
114 #define ND6_ROUTER_SOLICITATION         133
115 #define ND6_ROUTER_ADVERTISEMENT        134
116 #define ND6_NEIGHBOR_SOLICITATION       135
117 #define ND6_NEIGHBOR_ADVERTISEMENT      136
118 #define ND6_REDIRECT                    137
119
120 enum nd6_option
121   {
122     ND6_OPT_SOURCE_LINKADDR=1,
123     ND6_OPT_TARGET_LINKADDR=2,
124     ND6_OPT_PREFIX_INFORMATION=3,
125     ND6_OPT_REDIRECTED_HEADER=4,
126     ND6_OPT_MTU=5,
127     ND6_OPT_ENDOFLIST=256
128   };
129
130 struct nd6_router_solicit      /* router solicitation */
131   {
132     struct icmpv6hdr            rsol_hdr;
133   };
134
135 #define rsol_type               rsol_hdr.icmpv6_type
136 #define rsol_code               rsol_hdr.icmpv6_code
137 #define rsol_cksum              rsol_hdr.icmpv6_cksum
138 #define rsol_reserved           rsol_hdr.icmpv6_data32[0]
139
140 struct nd6_router_advert
141   {
142     struct icmpv6hdr    radv_hdr;
143     u_int32_t           radv_reachable;  /* reachable time      */
144     u_int32_t           radv_retransmit; /* reachable retransmit time */
145   };
146
147 #define radv_type               radv_hdr.icmpv6_type
148 #define radv_code               radv_hdr.icmpv6_code
149 #define radv_cksum              radv_hdr.icmpv6_cksum
150 #define radv_maxhoplimit        radv_hdr.icmpv6_data8[0]
151 #define radv_m_o_res            radv_hdr.icmpv6_data8[1]
152 #define ND6_RADV_M_BIT          0x80
153 #define ND6_RADV_O_BIT          0x40
154 #define radv_router_lifetime    radv_hdr.icmpv6_data16[1]
155
156 struct nd6_nsolicitation        /* neighbor solicitation */
157   {
158     struct icmpv6hdr    nsol6_hdr;
159     struct in6_addr     nsol6_target;
160   };
161
162 struct nd6_nadvertisement       /* neighbor advertisement */
163   {
164     struct icmpv6hdr    nadv6_hdr;
165     struct in6_addr     nadv6_target;
166   };
167
168 #define nadv6_flags                     nadv6_hdr.icmpv6_data32[0]
169 #define ND6_NADVERFLAG_ISROUTER         0x80
170 #define ND6_NADVERFLAG_SOLICITED        0x40
171 #define ND6_NADVERFLAG_OVERRIDE         0x20
172
173 struct nd6_redirect            /* redirect */
174   {
175     struct icmpv6hdr    redirect_hdr;
176     struct in6_addr     redirect_target;
177     struct in6_addr     redirect_destination;
178   };
179
180 struct nd6_opt_prefix_info     /* prefix information */
181   {
182     u_int8_t            opt_type;
183     u_int8_t            opt_length;
184     u_int8_t            opt_prefix_length;
185     u_int8_t            opt_l_a_res;
186     u_int32_t           opt_valid_life;
187     u_int32_t           opt_preferred_life;
188     u_int32_t           opt_reserved2;
189     struct in6_addr     opt_prefix;
190   };
191
192 #define ND6_OPT_PI_L_BIT        0x80
193 #define ND6_OPT_PI_A_BIT        0x40
194
195 struct nd6_opt_mtu              /* MTU option */
196   {
197     u_int8_t            opt_type;
198     u_int8_t            opt_length;
199     u_int16_t           opt_reserved;
200     u_int32_t           opt_mtu;
201   };
202
203 #endif /* _NETINET6_ICMPV6_H */