1
2
3
4
5
6#ifndef SLIRP_IP6_ICMP_H
7#define SLIRP_IP6_ICMP_H
8
9
10
11
12
13
14
15
16
17struct icmp6_echo {
18 uint16_t id;
19 uint16_t seq_num;
20};
21
22union icmp6_error_body {
23 uint32_t unused;
24 uint32_t pointer;
25 uint32_t mtu;
26};
27
28
29
30
31struct ndp_rs {
32 uint32_t reserved;
33};
34
35struct ndp_ra {
36 uint8_t chl;
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;
49 uint32_t reach_time;
50 uint32_t retrans_time;
51} QEMU_PACKED;
52
53struct ndp_ns {
54 uint32_t reserved;
55 struct in6_addr target;
56} QEMU_PACKED;
57
58struct ndp_na {
59#ifdef HOST_WORDS_BIGENDIAN
60 uint32_t
61 R:1,
62 S:1,
63 O:1,
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;
75} QEMU_PACKED;
76
77struct ndp_redirect {
78 uint32_t reserved;
79 struct in6_addr target;
80 struct in6_addr dest;
81} QEMU_PACKED;
82
83
84
85
86struct icmp6 {
87 uint8_t icmp6_type;
88 uint8_t icmp6_code;
89 uint16_t icmp6_cksum;
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
119
120struct ndpopt {
121 uint8_t ndpopt_type;
122 uint8_t ndpopt_len;
123 union {
124 unsigned char linklayer_addr[6];
125#define ndpopt_linklayer ndpopt_body.linklayer_addr
126 struct prefixinfo {
127 uint8_t prefix_length;
128#ifdef HOST_WORDS_BIGENDIAN
129 uint8_t L:1, A:1, reserved1:6;
130#else
131 uint8_t reserved1:6, A:1, L:1;
132#endif
133 uint32_t valid_lt;
134 uint32_t pref_lt;
135 uint32_t reserved2;
136 struct in6_addr prefix;
137 } QEMU_PACKED prefixinfo;
138#define ndpopt_prefixinfo ndpopt_body.prefixinfo
139 struct rdnss {
140 uint16_t reserved;
141 uint32_t lifetime;
142 struct in6_addr addr;
143 } QEMU_PACKED rdnss;
144#define ndpopt_rdnss ndpopt_body.rdnss
145 } ndpopt_body;
146} QEMU_PACKED;
147
148
149#define NDPOPT_LINKLAYER_SOURCE 1
150#define NDPOPT_LINKLAYER_TARGET 2
151#define NDPOPT_PREFIX_INFO 3
152#define NDPOPT_RDNSS 25
153
154
155#define NDPOPT_LINKLAYER_LEN 8
156#define NDPOPT_PREFIXINFO_LEN 32
157#define NDPOPT_RDNSS_LEN 24
158
159
160
161
162
163
164
165
166#define ICMP6_UNREACH 1
167#define ICMP6_UNREACH_NO_ROUTE 0
168#define ICMP6_UNREACH_DEST_PROHIB 1
169#define ICMP6_UNREACH_SCOPE 2
170#define ICMP6_UNREACH_ADDRESS 3
171#define ICMP6_UNREACH_PORT 4
172#define ICMP6_UNREACH_SRC_FAIL 5
173#define ICMP6_UNREACH_REJECT_ROUTE 6
174#define ICMP6_UNREACH_SRC_HDR_ERROR 7
175#define ICMP6_TOOBIG 2
176#define ICMP6_TIMXCEED 3
177#define ICMP6_TIMXCEED_INTRANS 0
178#define ICMP6_TIMXCEED_REASS 1
179#define ICMP6_PARAMPROB 4
180#define ICMP6_PARAMPROB_HDR_FIELD 0
181#define ICMP6_PARAMPROB_NXTHDR_TYPE 1
182#define ICMP6_PARAMPROB_IPV6_OPT 2
183
184
185#define ICMP6_ECHO_REQUEST 128
186#define ICMP6_ECHO_REPLY 129
187#define ICMP6_NDP_RS 133
188#define ICMP6_NDP_RA 134
189#define ICMP6_NDP_NS 135
190#define ICMP6_NDP_NA 136
191#define ICMP6_NDP_REDIRECT 137
192
193
194
195
196#define NDP_IsRouter 1
197#define NDP_AdvSendAdvertisements 1
198#define NDP_MaxRtrAdvInterval 600000
199#define NDP_MinRtrAdvInterval ((NDP_MaxRtrAdvInterval >= 9) ? \
200 NDP_MaxRtrAdvInterval / 3 : \
201 NDP_MaxRtrAdvInterval)
202#define NDP_AdvManagedFlag 0
203#define NDP_AdvOtherConfigFlag 0
204#define NDP_AdvLinkMTU 0
205#define NDP_AdvReachableTime 0
206#define NDP_AdvRetransTime 0
207#define NDP_AdvCurHopLimit 64
208#define NDP_AdvDefaultLifetime ((3 * NDP_MaxRtrAdvInterval) / 1000)
209#define NDP_AdvValidLifetime 86400
210#define NDP_AdvOnLinkFlag 1
211#define NDP_AdvPrefLifetime 14400
212#define NDP_AdvAutonomousFlag 1
213
214void icmp6_init(Slirp *slirp);
215void icmp6_cleanup(Slirp *slirp);
216void icmp6_input(struct mbuf *);
217void icmp6_send_error(struct mbuf *m, uint8_t type, uint8_t code);
218void ndp_send_ra(Slirp *slirp);
219void ndp_send_ns(Slirp *slirp, struct in6_addr addr);
220
221#endif
222