These changes are the raw update to qemu-2.6.
[kvmfornfv.git] / qemu / slirp / ip6_icmp.h
1 /*
2  * Copyright (c) 2013
3  * Guillaume Subiron, Yann Bordenave, Serigne Modou Wagne.
4  */
5
6 #ifndef SLIRP_NETINET_ICMP6_H_
7 #define SLIRP_NETINET_ICMP6_H_
8
9 /*
10  * Interface Control Message Protocol version 6 Definitions.
11  * Per RFC 4443, March 2006.
12  *
13  * Network Discover Protocol Definitions.
14  * Per RFC 4861, September 2007.
15  */
16
17 struct icmp6_echo { /* Echo Messages */
18     uint16_t id;
19     uint16_t seq_num;
20 };
21
22 union icmp6_error_body {
23     uint32_t unused;
24     uint32_t pointer;
25     uint32_t mtu;
26 };
27
28 /*
29  * NDP Messages
30  */
31 struct ndp_rs {     /* Router Solicitation Message */
32     uint32_t reserved;
33 };
34
35 struct ndp_ra {     /* Router Advertisement Message */
36     uint8_t chl;    /* Cur Hop Limit */
37 #ifdef HOST_WORDS_BIGENDIAN
38     uint8_t
39         M:1,
40         O:1,
41         reserved:6;
42 #else
43     uint8_t
44         reserved:6,
45         O:1,
46         M:1;
47 #endif
48     uint16_t lifetime;      /* Router Lifetime */
49     uint32_t reach_time;    /* Reachable Time */
50     uint32_t retrans_time;  /* Retrans Timer */
51 } QEMU_PACKED;
52
53 struct ndp_ns {     /* Neighbor Solicitation Message */
54     uint32_t reserved;
55     struct in6_addr target; /* Target Address */
56 } QEMU_PACKED;
57
58 struct ndp_na {     /* Neighbor Advertisement Message */
59 #ifdef HOST_WORDS_BIGENDIAN
60     uint32_t
61         R:1,                /* Router Flag */
62         S:1,                /* Solicited Flag */
63         O:1,                /* Override Flag */
64         reserved_hi:5,
65         reserved_lo:24;
66 #else
67     uint32_t
68         reserved_hi:5,
69         O:1,
70         S:1,
71         R:1,
72         reserved_lo:24;
73 #endif
74     struct in6_addr target; /* Target Address */
75 } QEMU_PACKED;
76
77 struct ndp_redirect {
78     uint32_t reserved;
79     struct in6_addr target; /* Target Address */
80     struct in6_addr dest;   /* Destination Address */
81 } QEMU_PACKED;
82
83 /*
84  * Structure of an icmpv6 header.
85  */
86 struct icmp6 {
87     uint8_t     icmp6_type;         /* type of message, see below */
88     uint8_t     icmp6_code;         /* type sub code */
89     uint16_t    icmp6_cksum;        /* ones complement cksum of struct */
90     union {
91         union icmp6_error_body error_body;
92         struct icmp6_echo echo;
93         struct ndp_rs ndp_rs;
94         struct ndp_ra ndp_ra;
95         struct ndp_ns ndp_ns;
96         struct ndp_na ndp_na;
97         struct ndp_redirect ndp_redirect;
98     } icmp6_body;
99 #define icmp6_err icmp6_body.error_body
100 #define icmp6_echo icmp6_body.echo
101 #define icmp6_nrs icmp6_body.ndp_rs
102 #define icmp6_nra icmp6_body.ndp_ra
103 #define icmp6_nns icmp6_body.ndp_ns
104 #define icmp6_nna icmp6_body.ndp_na
105 #define icmp6_redirect icmp6_body.ndp_redirect
106 } QEMU_PACKED;
107
108 #define ICMP6_MINLEN    4
109 #define ICMP6_ERROR_MINLEN  8
110 #define ICMP6_ECHO_MINLEN   8
111 #define ICMP6_NDP_RS_MINLEN 8
112 #define ICMP6_NDP_RA_MINLEN 16
113 #define ICMP6_NDP_NS_MINLEN 24
114 #define ICMP6_NDP_NA_MINLEN 24
115 #define ICMP6_NDP_REDIRECT_MINLEN 40
116
117 /*
118  * NDP Options
119  */
120 struct ndpopt {
121     uint8_t     ndpopt_type;                    /* Option type */
122     uint8_t     ndpopt_len;                     /* /!\ In units of 8 octets */
123     union {
124         unsigned char   linklayer_addr[6];      /* Source/Target Link-layer */
125         struct prefixinfo {                     /* Prefix Information */
126             uint8_t     prefix_length;
127 #ifdef HOST_WORDS_BIGENDIAN
128             uint8_t     L:1, A:1, reserved1:6;
129 #else
130             uint8_t     reserved1:6, A:1, L:1;
131 #endif
132             uint32_t    valid_lt;               /* Valid Lifetime */
133             uint32_t    pref_lt;                /* Preferred Lifetime */
134             uint32_t    reserved2;
135             struct in6_addr prefix;
136         } QEMU_PACKED prefixinfo;
137     } ndpopt_body;
138 #define ndpopt_linklayer ndpopt_body.linklayer_addr
139 #define ndpopt_prefixinfo ndpopt_body.prefixinfo
140 } QEMU_PACKED;
141
142 /* NDP options type */
143 #define NDPOPT_LINKLAYER_SOURCE     1   /* Source Link-Layer Address */
144 #define NDPOPT_LINKLAYER_TARGET     2   /* Target Link-Layer Address */
145 #define NDPOPT_PREFIX_INFO          3   /* Prefix Information */
146
147 /* NDP options size, in octets. */
148 #define NDPOPT_LINKLAYER_LEN    8
149 #define NDPOPT_PREFIXINFO_LEN   32
150
151 /*
152  * Definition of type and code field values.
153  * Per https://www.iana.org/assignments/icmpv6-parameters/icmpv6-parameters.xml
154  * Last Updated 2012-11-12
155  */
156
157 /* Errors */
158 #define ICMP6_UNREACH   1   /* Destination Unreachable */
159 #define     ICMP6_UNREACH_NO_ROUTE      0   /* no route to dest */
160 #define     ICMP6_UNREACH_DEST_PROHIB   1   /* com with dest prohibited */
161 #define     ICMP6_UNREACH_SCOPE         2   /* beyond scope of src addr */
162 #define     ICMP6_UNREACH_ADDRESS       3   /* address unreachable */
163 #define     ICMP6_UNREACH_PORT          4   /* port unreachable */
164 #define     ICMP6_UNREACH_SRC_FAIL      5   /* src addr failed */
165 #define     ICMP6_UNREACH_REJECT_ROUTE  6   /* reject route to dest */
166 #define     ICMP6_UNREACH_SRC_HDR_ERROR 7   /* error in src routing header */
167 #define ICMP6_TOOBIG    2   /* Packet Too Big */
168 #define ICMP6_TIMXCEED  3   /* Time Exceeded */
169 #define     ICMP6_TIMXCEED_INTRANS      0   /* hop limit exceeded in transit */
170 #define     ICMP6_TIMXCEED_REASS        1   /* ttl=0 in reass */
171 #define ICMP6_PARAMPROB 4   /* Parameter Problem */
172 #define     ICMP6_PARAMPROB_HDR_FIELD   0   /* err header field */
173 #define     ICMP6_PARAMPROB_NXTHDR_TYPE 1   /* unrecognized Next Header type */
174 #define     ICMP6_PARAMPROB_IPV6_OPT    2   /* unrecognized IPv6 option */
175
176 /* Informational Messages */
177 #define ICMP6_ECHO_REQUEST      128 /* Echo Request */
178 #define ICMP6_ECHO_REPLY        129 /* Echo Reply */
179 #define ICMP6_NDP_RS            133 /* Router Solicitation (NDP) */
180 #define ICMP6_NDP_RA            134 /* Router Advertisement (NDP) */
181 #define ICMP6_NDP_NS            135 /* Neighbor Solicitation (NDP) */
182 #define ICMP6_NDP_NA            136 /* Neighbor Advertisement (NDP) */
183 #define ICMP6_NDP_REDIRECT      137 /* Redirect Message (NDP) */
184
185 /*
186  * Router Configuration Variables (rfc4861#section-6)
187  */
188 #define NDP_IsRouter                1
189 #define NDP_AdvSendAdvertisements   1
190 #define NDP_MaxRtrAdvInterval       600000
191 #define NDP_MinRtrAdvInterval       ((NDP_MaxRtrAdvInterval >= 9) ? \
192                                         NDP_MaxRtrAdvInterval / 3 : \
193                                         NDP_MaxRtrAdvInterval)
194 #define NDP_AdvManagedFlag          0
195 #define NDP_AdvOtherConfigFlag      0
196 #define NDP_AdvLinkMTU              0
197 #define NDP_AdvReachableTime        0
198 #define NDP_AdvRetransTime          0
199 #define NDP_AdvCurHopLimit          64
200 #define NDP_AdvDefaultLifetime      ((3 * NDP_MaxRtrAdvInterval) / 1000)
201 #define NDP_AdvValidLifetime        86400
202 #define NDP_AdvOnLinkFlag           1
203 #define NDP_AdvPrefLifetime         14400
204 #define NDP_AdvAutonomousFlag       1
205
206 void icmp6_init(Slirp *slirp);
207 void icmp6_cleanup(Slirp *slirp);
208 void icmp6_input(struct mbuf *);
209 void icmp6_send_error(struct mbuf *m, uint8_t type, uint8_t code);
210 void ndp_send_ra(Slirp *slirp);
211 void ndp_send_ns(Slirp *slirp, struct in6_addr addr);
212
213 #endif