]> git.proxmox.com Git - mirror_qemu.git/blame - slirp/ip6_icmp.h
slirp: Propagate host TCP RST to the guest.
[mirror_qemu.git] / slirp / ip6_icmp.h
CommitLineData
0d6ff71a
GS
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
17struct icmp6_echo { /* Echo Messages */
18 uint16_t id;
19 uint16_t seq_num;
20};
21
fc6c9257
YB
22union icmp6_error_body {
23 uint32_t unused;
24 uint32_t pointer;
25 uint32_t mtu;
26};
27
0d6ff71a
GS
28/*
29 * NDP Messages
30 */
31struct ndp_rs { /* Router Solicitation Message */
32 uint32_t reserved;
33};
34
35struct 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
53struct ndp_ns { /* Neighbor Solicitation Message */
54 uint32_t reserved;
55 struct in6_addr target; /* Target Address */
56} QEMU_PACKED;
57
58struct 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
77struct 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 */
86struct 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 {
fc6c9257 91 union icmp6_error_body error_body;
0d6ff71a
GS
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;
fc6c9257 99#define icmp6_err icmp6_body.error_body
0d6ff71a
GS
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
fc6c9257 109#define ICMP6_ERROR_MINLEN 8
0d6ff71a
GS
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 */
120struct 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
206void icmp6_init(Slirp *slirp);
207void icmp6_cleanup(Slirp *slirp);
208void icmp6_input(struct mbuf *);
fc6c9257 209void icmp6_send_error(struct mbuf *m, uint8_t type, uint8_t code);
0d6ff71a
GS
210void ndp_send_ra(Slirp *slirp);
211void ndp_send_ns(Slirp *slirp, struct in6_addr addr);
212
213#endif