1 | /* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */ |
2 | /* |
3 | * INET An implementation of the TCP/IP protocol suite for the LINUX |
4 | * operating system. INET is implemented using the BSD Socket |
5 | * interface as the means of communication with the user level. |
6 | * |
7 | * Definitions for the ICMP protocol. |
8 | * |
9 | * Version: @(#)icmp.h 1.0.3 04/28/93 |
10 | * |
11 | * Author: Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG> |
12 | * |
13 | * This program is free software; you can redistribute it and/or |
14 | * modify it under the terms of the GNU General Public License |
15 | * as published by the Free Software Foundation; either version |
16 | * 2 of the License, or (at your option) any later version. |
17 | */ |
18 | #ifndef _UAPI_LINUX_ICMP_H |
19 | #define _UAPI_LINUX_ICMP_H |
20 | |
21 | #include <linux/types.h> |
22 | #include <asm/byteorder.h> |
23 | #include <linux/if.h> |
24 | #include <linux/in6.h> |
25 | |
26 | #define ICMP_ECHOREPLY 0 /* Echo Reply */ |
27 | #define ICMP_DEST_UNREACH 3 /* Destination Unreachable */ |
28 | #define ICMP_SOURCE_QUENCH 4 /* Source Quench */ |
29 | #define ICMP_REDIRECT 5 /* Redirect (change route) */ |
30 | #define ICMP_ECHO 8 /* Echo Request */ |
31 | #define ICMP_TIME_EXCEEDED 11 /* Time Exceeded */ |
32 | #define ICMP_PARAMETERPROB 12 /* Parameter Problem */ |
33 | #define ICMP_TIMESTAMP 13 /* Timestamp Request */ |
34 | #define ICMP_TIMESTAMPREPLY 14 /* Timestamp Reply */ |
35 | #define ICMP_INFO_REQUEST 15 /* Information Request */ |
36 | #define ICMP_INFO_REPLY 16 /* Information Reply */ |
37 | #define ICMP_ADDRESS 17 /* Address Mask Request */ |
38 | #define ICMP_ADDRESSREPLY 18 /* Address Mask Reply */ |
39 | #define NR_ICMP_TYPES 18 |
40 | |
41 | |
42 | /* Codes for UNREACH. */ |
43 | #define ICMP_NET_UNREACH 0 /* Network Unreachable */ |
44 | #define ICMP_HOST_UNREACH 1 /* Host Unreachable */ |
45 | #define ICMP_PROT_UNREACH 2 /* Protocol Unreachable */ |
46 | #define ICMP_PORT_UNREACH 3 /* Port Unreachable */ |
47 | #define ICMP_FRAG_NEEDED 4 /* Fragmentation Needed/DF set */ |
48 | #define ICMP_SR_FAILED 5 /* Source Route failed */ |
49 | #define ICMP_NET_UNKNOWN 6 |
50 | #define ICMP_HOST_UNKNOWN 7 |
51 | #define ICMP_HOST_ISOLATED 8 |
52 | #define ICMP_NET_ANO 9 |
53 | #define ICMP_HOST_ANO 10 |
54 | #define ICMP_NET_UNR_TOS 11 |
55 | #define ICMP_HOST_UNR_TOS 12 |
56 | #define ICMP_PKT_FILTERED 13 /* Packet filtered */ |
57 | #define ICMP_PREC_VIOLATION 14 /* Precedence violation */ |
58 | #define ICMP_PREC_CUTOFF 15 /* Precedence cut off */ |
59 | #define NR_ICMP_UNREACH 15 /* instead of hardcoding immediate value */ |
60 | |
61 | /* Codes for REDIRECT. */ |
62 | #define ICMP_REDIR_NET 0 /* Redirect Net */ |
63 | #define ICMP_REDIR_HOST 1 /* Redirect Host */ |
64 | #define ICMP_REDIR_NETTOS 2 /* Redirect Net for TOS */ |
65 | #define ICMP_REDIR_HOSTTOS 3 /* Redirect Host for TOS */ |
66 | |
67 | /* Codes for TIME_EXCEEDED. */ |
68 | #define ICMP_EXC_TTL 0 /* TTL count exceeded */ |
69 | #define ICMP_EXC_FRAGTIME 1 /* Fragment Reass time exceeded */ |
70 | |
71 | /* Codes for EXT_ECHO (PROBE) */ |
72 | #define ICMP_EXT_ECHO 42 |
73 | #define ICMP_EXT_ECHOREPLY 43 |
74 | #define ICMP_EXT_CODE_MAL_QUERY 1 /* Malformed Query */ |
75 | #define ICMP_EXT_CODE_NO_IF 2 /* No such Interface */ |
76 | #define ICMP_EXT_CODE_NO_TABLE_ENT 3 /* No such Table Entry */ |
77 | #define ICMP_EXT_CODE_MULT_IFS 4 /* Multiple Interfaces Satisfy Query */ |
78 | |
79 | /* Constants for EXT_ECHO (PROBE) */ |
80 | #define ICMP_EXT_ECHOREPLY_ACTIVE (1 << 2)/* active bit in reply message */ |
81 | #define ICMP_EXT_ECHOREPLY_IPV4 (1 << 1)/* ipv4 bit in reply message */ |
82 | #define ICMP_EXT_ECHOREPLY_IPV6 1 /* ipv6 bit in reply message */ |
83 | #define ICMP_EXT_ECHO_CTYPE_NAME 1 |
84 | #define ICMP_EXT_ECHO_CTYPE_INDEX 2 |
85 | #define ICMP_EXT_ECHO_CTYPE_ADDR 3 |
86 | #define ICMP_AFI_IP 1 /* Address Family Identifier for ipv4 */ |
87 | #define ICMP_AFI_IP6 2 /* Address Family Identifier for ipv6 */ |
88 | |
89 | struct icmphdr { |
90 | __u8 type; |
91 | __u8 code; |
92 | __sum16 checksum; |
93 | union { |
94 | struct { |
95 | __be16 id; |
96 | __be16 sequence; |
97 | } echo; |
98 | __be32 gateway; |
99 | struct { |
100 | __be16 __unused; |
101 | __be16 mtu; |
102 | } frag; |
103 | __u8 reserved[4]; |
104 | } un; |
105 | }; |
106 | |
107 | |
108 | /* |
109 | * constants for (set|get)sockopt |
110 | */ |
111 | |
112 | #define ICMP_FILTER 1 |
113 | |
114 | struct icmp_filter { |
115 | __u32 data; |
116 | }; |
117 | |
118 | /* RFC 4884 extension struct: one per message */ |
119 | struct icmp_ext_hdr { |
120 | #if defined(__LITTLE_ENDIAN_BITFIELD) |
121 | __u8 reserved1:4, |
122 | version:4; |
123 | #elif defined(__BIG_ENDIAN_BITFIELD) |
124 | __u8 version:4, |
125 | reserved1:4; |
126 | #else |
127 | #error "Please fix <asm/byteorder.h>" |
128 | #endif |
129 | __u8 reserved2; |
130 | __sum16 checksum; |
131 | }; |
132 | |
133 | /* RFC 4884 extension object header: one for each object */ |
134 | struct icmp_extobj_hdr { |
135 | __be16 length; |
136 | __u8 class_num; |
137 | __u8 class_type; |
138 | }; |
139 | |
140 | /* RFC 8335: 2.1 Header for c-type 3 payload */ |
141 | struct icmp_ext_echo_ctype3_hdr { |
142 | __be16 afi; |
143 | __u8 addrlen; |
144 | __u8 reserved; |
145 | }; |
146 | |
147 | /* RFC 8335: 2.1 Interface Identification Object */ |
148 | struct icmp_ext_echo_iio { |
149 | struct icmp_extobj_hdr extobj_hdr; |
150 | union { |
151 | char name[IFNAMSIZ]; |
152 | __be32 ifindex; |
153 | struct { |
154 | struct icmp_ext_echo_ctype3_hdr ctype3_hdr; |
155 | union { |
156 | __be32 ipv4_addr; |
157 | struct in6_addr ipv6_addr; |
158 | } ip_addr; |
159 | } addr; |
160 | } ident; |
161 | }; |
162 | #endif /* _UAPI_LINUX_ICMP_H */ |
163 | |