Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
folium-app
GitHub Repository: folium-app/Folium
Path: blob/a-new-beginning/SharedDependencies/Sources/libslirp/include/ip_icmp.h
2 views
1
/* SPDX-License-Identifier: BSD-3-Clause */
2
/*
3
* Copyright (c) 1982, 1986, 1993
4
* The Regents of the University of California. All rights reserved.
5
*
6
* Redistribution and use in source and binary forms, with or without
7
* modification, are permitted provided that the following conditions
8
* are met:
9
* 1. Redistributions of source code must retain the above copyright
10
* notice, this list of conditions and the following disclaimer.
11
* 2. Redistributions in binary form must reproduce the above copyright
12
* notice, this list of conditions and the following disclaimer in the
13
* documentation and/or other materials provided with the distribution.
14
* 3. Neither the name of the University nor the names of its contributors
15
* may be used to endorse or promote products derived from this software
16
* without specific prior written permission.
17
*
18
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
19
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
22
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28
* SUCH DAMAGE.
29
*
30
* @(#)ip_icmp.h 8.1 (Berkeley) 6/10/93
31
* ip_icmp.h,v 1.4 1995/05/30 08:09:43 rgrimes Exp
32
*/
33
34
#ifndef NETINET_IP_ICMP_H
35
#define NETINET_IP_ICMP_H
36
37
/*
38
* Interface Control Message Protocol Definitions.
39
* Per RFC 792, September 1981.
40
*/
41
42
typedef uint32_t n_time;
43
44
#ifdef RSTSLIRP
45
46
/*
47
* Structure of an icmp header.
48
*/
49
struct icmp {
50
uint8_t icmp_type; /* type of message, see below */
51
uint8_t icmp_code; /* type sub code */
52
uint16_t icmp_cksum; /* ones complement cksum of struct */
53
union {
54
uint8_t ih_pptr; /* ICMP_PARAMPROB */
55
struct in_addr ih_gwaddr; /* ICMP_REDIRECT */
56
struct ih_idseq {
57
uint16_t icd_id;
58
uint16_t icd_seq;
59
} ih_idseq;
60
int ih_void;
61
62
/* ICMP_UNREACH_NEEDFRAG -- Path MTU Discovery (RFC1191) */
63
struct ih_pmtu {
64
uint16_t ipm_void;
65
uint16_t ipm_nextmtu;
66
} ih_pmtu;
67
} icmp_hun;
68
#define icmp_pptr icmp_hun.ih_pptr
69
#define icmp_gwaddr icmp_hun.ih_gwaddr
70
#define icmp_id icmp_hun.ih_idseq.icd_id
71
#define icmp_seq icmp_hun.ih_idseq.icd_seq
72
#define icmp_void icmp_hun.ih_void
73
#define icmp_pmvoid icmp_hun.ih_pmtu.ipm_void
74
#define icmp_nextmtu icmp_hun.ih_pmtu.ipm_nextmtu
75
union {
76
struct id_ts {
77
n_time its_otime;
78
n_time its_rtime;
79
n_time its_ttime;
80
} id_ts;
81
struct id_ip {
82
struct ip idi_ip;
83
/* options and then 64 bits of data */
84
} id_ip;
85
uint32_t id_mask;
86
char id_data[1];
87
} icmp_dun;
88
#define icmp_otime icmp_dun.id_ts.its_otime
89
#define icmp_rtime icmp_dun.id_ts.its_rtime
90
#define icmp_ttime icmp_dun.id_ts.its_ttime
91
#define icmp_ip icmp_dun.id_ip.idi_ip
92
#define icmp_mask icmp_dun.id_mask
93
#define icmp_data icmp_dun.id_data
94
};
95
96
#endif
97
98
/*
99
* Lower bounds on packet lengths for various types.
100
* For the error advice packets must first ensure that the
101
* packet is large enough to contain the returned ip header.
102
* Only then can we do the check to see if 64 bits of packet
103
* data have been returned, since we need to check the returned
104
* ip header length.
105
*/
106
#define ICMP_MINLEN 8 /* abs minimum */
107
#define ICMP_TSLEN (8 + 3 * sizeof(n_time)) /* timestamp */
108
#define ICMP_MASKLEN 12 /* address mask */
109
#define ICMP_ADVLENMIN (8 + sizeof(struct ip) + 8) /* min */
110
#define ICMP_ADVLEN(p) (8 + ((p)->icmp_ip.ip_hl << 2) + 8)
111
/* N.B.: must separately check that ip_hl >= 5 */
112
113
/*
114
* Definition of type and code field values.
115
*/
116
#define ICMP_ECHOREPLY 0 /* echo reply */
117
#define ICMP_UNREACH 3 /* dest unreachable, codes: */
118
#define ICMP_UNREACH_NET 0 /* bad net */
119
#define ICMP_UNREACH_HOST 1 /* bad host */
120
#define ICMP_UNREACH_PROTOCOL 2 /* bad protocol */
121
#define ICMP_UNREACH_PORT 3 /* bad port */
122
#define ICMP_UNREACH_NEEDFRAG 4 /* IP_DF caused drop */
123
#define ICMP_UNREACH_SRCFAIL 5 /* src route failed */
124
#define ICMP_UNREACH_NET_UNKNOWN 6 /* unknown net */
125
#define ICMP_UNREACH_HOST_UNKNOWN 7 /* unknown host */
126
#define ICMP_UNREACH_ISOLATED 8 /* src host isolated */
127
#define ICMP_UNREACH_NET_PROHIB 9 /* prohibited access */
128
#define ICMP_UNREACH_HOST_PROHIB 10 /* ditto */
129
#define ICMP_UNREACH_TOSNET 11 /* bad tos for net */
130
#define ICMP_UNREACH_TOSHOST 12 /* bad tos for host */
131
#define ICMP_SOURCEQUENCH 4 /* packet lost, slow down */
132
#define ICMP_REDIRECT 5 /* shorter route, codes: */
133
#define ICMP_REDIRECT_NET 0 /* for network */
134
#define ICMP_REDIRECT_HOST 1 /* for host */
135
#define ICMP_REDIRECT_TOSNET 2 /* for tos and net */
136
#define ICMP_REDIRECT_TOSHOST 3 /* for tos and host */
137
#define ICMP_ECHO 8 /* echo service */
138
#define ICMP_ROUTERADVERT 9 /* router advertisement */
139
#define ICMP_ROUTERSOLICIT 10 /* router solicitation */
140
#define ICMP_TIMXCEED 11 /* time exceeded, code: */
141
#define ICMP_TIMXCEED_INTRANS 0 /* ttl==0 in transit */
142
#define ICMP_TIMXCEED_REASS 1 /* ttl==0 in reass */
143
#define ICMP_PARAMPROB 12 /* ip header bad */
144
#define ICMP_PARAMPROB_OPTABSENT 1 /* req. opt. absent */
145
#define ICMP_TSTAMP 13 /* timestamp request */
146
#define ICMP_TSTAMPREPLY 14 /* timestamp reply */
147
#define ICMP_IREQ 15 /* information request */
148
#define ICMP_IREQREPLY 16 /* information reply */
149
#define ICMP_MASKREQ 17 /* address mask request */
150
#define ICMP_MASKREPLY 18 /* address mask reply */
151
152
#define ICMP_MAXTYPE 18
153
154
#define ICMP_INFOTYPE(type) \
155
((type) == ICMP_ECHOREPLY || (type) == ICMP_ECHO || \
156
(type) == ICMP_ROUTERADVERT || (type) == ICMP_ROUTERSOLICIT || \
157
(type) == ICMP_TSTAMP || (type) == ICMP_TSTAMPREPLY || \
158
(type) == ICMP_IREQ || (type) == ICMP_IREQREPLY || \
159
(type) == ICMP_MASKREQ || (type) == ICMP_MASKREPLY)
160
161
/* Called from slirp_new */
162
void icmp_init(Slirp *slirp);
163
164
/* Called from slirp_cleanup */
165
void icmp_cleanup(Slirp *slirp);
166
167
/* Process an ICMP packet from the guest */
168
void icmp_input(struct mbuf *, int);
169
170
/* Send an ICMP error related to the given packet, using the given ICMP type and code, appending the given message (if enabled at compilation), and using the given source. If minsize is sent, send only header + 8B of the given packet, otherwise send it all */
171
void icmp_forward_error(struct mbuf *msrc, uint8_t type, uint8_t code, int minsize,
172
const char *message, struct in_addr *src);
173
174
/* Similar to icmp_forward_error, but use the virtual host address as source */
175
void icmp_send_error(struct mbuf *msrc, uint8_t type, uint8_t code, int minsize,
176
const char *message);
177
178
/* Forward the ICMP packet to the guest (probably a ping reply) */
179
void icmp_reflect(struct mbuf *);
180
181
/* Handle ICMP data from the ICMP socket, and forward it to the guest (using so_m as reference) */
182
void icmp_receive(struct socket *so);
183
184
/* Forget about this pending ICMP request */
185
void icmp_detach(struct socket *so);
186
187
#endif
188
189