1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
mod dest_unreachable_header;
pub use dest_unreachable_header::*;

mod parameter_problem_header;
pub use parameter_problem_header::*;

mod redirect_code;
pub use redirect_code::*;

mod redirect_header;
pub use redirect_header::*;

mod time_exceeded_code;
pub use time_exceeded_code::*;

mod timestamp_message;
pub use timestamp_message::*;

/// ICMPv4 type value indicating a "Echo Reply" message (defined in [RFC 792](https://tools.ietf.org/html/rfc792)).
pub const TYPE_ECHO_REPLY: u8 = 0;

/// ICMPv4 type value indicating a "Destination Unreachable" message (defined in [RFC 792](https://tools.ietf.org/html/rfc792)).
pub const TYPE_DEST_UNREACH: u8 = 3;

/// ICMPv4 type value indicating a "Source Quench (Deprecated)" message (defined in in [RFC 792](https://tools.ietf.org/html/rfc792), deprecated in [RFC 6633](https://tools.ietf.org/html/rfc6633)).
pub const TYPE_SOURCE_QUENCH: u8 = 4;

/// ICMPv4 type value indicating a "Redirect" message (defined in [RFC 792](https://tools.ietf.org/html/rfc792)).
pub const TYPE_REDIRECT: u8 = 5;

/// ICMPv4 type value indicating a "Alternate Host Address (Deprecated)" message (deprecated in [RFC 6918](https://tools.ietf.org/html/rfc6918)).
pub const TYPE_ALTERNATE_HOST_ADDRESS: u8 = 6;

/// ICMPv4 type value indicating a "Echo Request" message (defined in [RFC 792](https://tools.ietf.org/html/rfc792)).
pub const TYPE_ECHO_REQUEST: u8 = 8;

/// ICMPv4 type value indicating a "Router Advertisement" message (defined in [RFC 1256](https://tools.ietf.org/html/rfc1256)).
pub const TYPE_ROUTER_ADVERTISEMENT: u8 = 9;

/// ICMPv4 type value indicating a "Router Solicitation" message (defined in [RFC 1256](https://tools.ietf.org/html/rfc1256)).
pub const TYPE_ROUTER_SOLICITATION: u8 = 10;

/// ICMPv4 type value indicating a "Time Exceeded" message (defined in [RFC 792](https://tools.ietf.org/html/rfc792)).
pub const TYPE_TIME_EXCEEDED: u8 = 11;

/// ICMPv4 type value indicating a "Parameter Problem" message (defined in [RFC 792](https://tools.ietf.org/html/rfc792)).
pub const TYPE_PARAMETER_PROBLEM: u8 = 12;

/// ICMPv4 type value indicating a "Timestamp" message (defined in [RFC 792](https://tools.ietf.org/html/rfc792)).
pub const TYPE_TIMESTAMP: u8 = 13;

/// ICMPv4 type value indicating a "Timestamp Reply" message (defined in [RFC 792](https://tools.ietf.org/html/rfc792)).
pub const TYPE_TIMESTAMP_REPLY: u8 = 14;

/// ICMPv4 type value indicating a "Information Request (Deprecated)" message (defined in in [RFC 792](https://tools.ietf.org/html/rfc792), deprecated in [RFC 6918](https://tools.ietf.org/html/rfc6918)).
pub const TYPE_INFO_REQUEST: u8 = 15;

/// ICMPv4 type value indicating a "Information Reply (Deprecated)" message (defined in in [RFC 792](https://tools.ietf.org/html/rfc792), deprecated in [RFC 6918](https://tools.ietf.org/html/rfc6918)).
pub const TYPE_INFO_REPLY: u8 = 16;

/// ICMPv4 type value indicating a "Address Mask Request (Deprecated)" message (defined in in [RFC 950](https://tools.ietf.org/html/rfc950), deprecated in [RFC 6918](https://tools.ietf.org/html/rfc6918)).
pub const TYPE_ADDRESS: u8 = 17;

/// ICMPv4 type value indicating a "Address Mask Reply (Deprecated)" message (defined in in [RFC 950](https://tools.ietf.org/html/rfc950), deprecated in [RFC 6918](https://tools.ietf.org/html/rfc6918)).
pub const TYPE_ADDRESSREPLY: u8 = 18;

/// ICMP destination unreachable code for "Net Unreachable" (defined in [RFC 792](https://tools.ietf.org/html/rfc792))
pub const CODE_DST_UNREACH_NET: u8 = 0;

/// ICMP destination unreachable code for "Host Unreachable" (defined in [RFC 792](https://tools.ietf.org/html/rfc792))
pub const CODE_DST_UNREACH_HOST: u8 = 1;

/// ICMP destination unreachable code for "Protocol Unreachable" (defined in [RFC 792](https://tools.ietf.org/html/rfc792))
pub const CODE_DST_UNREACH_PROTOCOL: u8 = 2;

/// ICMP destination unreachable code for "Port Unreachable" (defined in [RFC 792](https://tools.ietf.org/html/rfc792))
pub const CODE_DST_UNREACH_PORT: u8 = 3;

/// ICMP destination unreachable code for "Fragmentation Needed and Don't Fragment was Set" (defined in [RFC 792](https://tools.ietf.org/html/rfc792))
pub const CODE_DST_UNREACH_NEED_FRAG: u8 = 4;

/// ICMP destination unreachable code for "Source Route Failed" (defined in [RFC 792](https://tools.ietf.org/html/rfc792))
pub const CODE_DST_UNREACH_SOURCE_ROUTE_FAILED: u8 = 5;

/// ICMP destination unreachable code for "Destination Network Unknown" (defined in [RFC 1122](https://tools.ietf.org/html/rfc1122))
pub const CODE_DST_UNREACH_NET_UNKNOWN: u8 = 6;

/// ICMP destination unreachable code for "Destination Host Unknown" (defined in [RFC 1122](https://tools.ietf.org/html/rfc1122))
pub const CODE_DST_UNREACH_HOST_UNKNOWN: u8 = 7;

/// ICMP destination unreachable code for "Source Host Isolated" (defined in [RFC 1122](https://tools.ietf.org/html/rfc1122))
pub const CODE_DST_UNREACH_ISOLATED: u8 = 8;

/// ICMP destination unreachable code for "Communication with Destination Network is Administratively Prohibited" (defined in [RFC 1122](https://tools.ietf.org/html/rfc1122))
pub const CODE_DST_UNREACH_NET_PROHIB: u8 = 9;

/// ICMP destination unreachable code for "Communication with Destination Host is Administratively Prohibited" (defined in [RFC 1122](https://tools.ietf.org/html/rfc1122))
pub const CODE_DST_UNREACH_HOST_PROHIB: u8 = 10;

/// ICMP destination unreachable code for "Destination Network Unreachable for Type of Service" (defined in [RFC 1122](https://tools.ietf.org/html/rfc1122))
pub const CODE_DST_UNREACH_TOS_NET: u8 = 11;

/// ICMP destination unreachable code for "Destination Host Unreachable for Type of Service" (defined in [RFC 1122](https://tools.ietf.org/html/rfc1122))
pub const CODE_DST_UNREACH_TOS_HOST: u8 = 12;

/// ICMP destination unreachable code for "Communication Administratively Prohibited" (defined in [RFC 1812](https://tools.ietf.org/html/rfc1812))
pub const CODE_DST_UNREACH_FILTER_PROHIB: u8 = 13;

/// ICMP destination unreachable code for "Host Precedence Violation" (defined in [RFC 1812](https://tools.ietf.org/html/rfc1812))
pub const CODE_DST_UNREACH_HOST_PRECEDENCE_VIOLATION: u8 = 14;

/// ICMP destination unreachable code for "Precedence cutoff in effect" (defined in [RFC 1812](https://tools.ietf.org/html/rfc1812))
pub const CODE_DST_UNREACH_PRECEDENCE_CUTOFF: u8 = 15;

/// ICMPv4 "Redirect" code value for "Redirect Datagram for the Network (or subnet)".
pub const CODE_REDIRECT_FOR_NETWORK: u8 = 0;

/// ICMPv4 "Redirect" code value for "Redirect Datagram for the Host".
pub const CODE_REDIRECT_FOR_HOST: u8 = 1;

/// ICMPv4 "Redirect" code value for "Redirect Datagram for the Type of Service and Network".
pub const CODE_REDIRECT_TYPE_OF_SERVICE_AND_NETWORK: u8 = 2;

/// ICMPv4 "Redirect" code value for "Redirect Datagram for the Type of Service and Host".
pub const CODE_REDIRECT_TYPE_OF_SERVICE_AND_HOST: u8 = 3;

/// ICMPv4 "Time Exceeded" code value for "Time to Live exceeded in Transit".
pub const CODE_TIME_EXCEEDED_TTL_EXCEEDED_IN_TRANSIT: u8 = 0;

/// ICMPv4 "Time Exceeded" code value for "Fragment Reassembly Time Exceeded".
pub const CODE_TIME_EXCEEDED_FRAG_REASSEMBLY_TIME_EXCEEDED: u8 = 1;

/// ICMPv4 "Parameter Problem" code value for "Pointer indicates the error".
pub const CODE_PARAMETER_PROBLEM_POINTER_INDICATES_ERROR: u8 = 0;

/// ICMPv4 "Parameter Problem" code value for "Missing a Required Option".
pub const CODE_PARAMETER_PROBLEM_MISSING_REQUIRED_OPTION: u8 = 1;

/// ICMPv4 "Parameter Problem" code value for "Bad Length".
pub const CODE_PARAMETER_PROBLEM_BAD_LENGTH: u8 = 2;

#[cfg(test)]
mod test {
    use super::*;

    #[test]
    fn constants() {
        // icmp type numbers according to
        // https://www.iana.org/assignments/icmp-parameters/icmp-parameters.xhtml#icmp-parameters-types
        assert_eq!(TYPE_ECHO_REPLY, 0);
        assert_eq!(TYPE_DEST_UNREACH, 3);
        assert_eq!(TYPE_SOURCE_QUENCH, 4);
        assert_eq!(TYPE_REDIRECT, 5);
        assert_eq!(TYPE_ALTERNATE_HOST_ADDRESS, 6);
        assert_eq!(TYPE_ECHO_REQUEST, 8);
        assert_eq!(TYPE_ROUTER_ADVERTISEMENT, 9);
        assert_eq!(TYPE_ROUTER_SOLICITATION, 10);
        assert_eq!(TYPE_TIME_EXCEEDED, 11);
        assert_eq!(TYPE_PARAMETER_PROBLEM, 12);
        assert_eq!(TYPE_TIMESTAMP, 13);
        assert_eq!(TYPE_TIMESTAMP_REPLY, 14);
        assert_eq!(TYPE_INFO_REQUEST, 15);
        assert_eq!(TYPE_INFO_REPLY, 16);
        assert_eq!(TYPE_ADDRESS, 17);
        assert_eq!(TYPE_ADDRESSREPLY, 18);

        // destination unreachable code numbers according to
        // https://www.iana.org/assignments/icmp-parameters/icmp-parameters.xhtml#icmp-parameters-codes-3
        assert_eq!(0, CODE_DST_UNREACH_NET);
        assert_eq!(1, CODE_DST_UNREACH_HOST);
        assert_eq!(2, CODE_DST_UNREACH_PROTOCOL);
        assert_eq!(3, CODE_DST_UNREACH_PORT);
        assert_eq!(4, CODE_DST_UNREACH_NEED_FRAG);
        assert_eq!(5, CODE_DST_UNREACH_SOURCE_ROUTE_FAILED);
        assert_eq!(6, CODE_DST_UNREACH_NET_UNKNOWN);
        assert_eq!(7, CODE_DST_UNREACH_HOST_UNKNOWN);
        assert_eq!(8, CODE_DST_UNREACH_ISOLATED);
        assert_eq!(9, CODE_DST_UNREACH_NET_PROHIB);
        assert_eq!(10, CODE_DST_UNREACH_HOST_PROHIB);
        assert_eq!(11, CODE_DST_UNREACH_TOS_NET);
        assert_eq!(12, CODE_DST_UNREACH_TOS_HOST);
        assert_eq!(13, CODE_DST_UNREACH_FILTER_PROHIB);
        assert_eq!(14, CODE_DST_UNREACH_HOST_PRECEDENCE_VIOLATION);
        assert_eq!(15, CODE_DST_UNREACH_PRECEDENCE_CUTOFF);

        // redirect code numbers according to
        // https://www.iana.org/assignments/icmp-parameters/icmp-parameters.xhtml#icmp-parameters-codes-5
        assert_eq!(0, CODE_REDIRECT_FOR_NETWORK);
        assert_eq!(1, CODE_REDIRECT_FOR_HOST);
        assert_eq!(2, CODE_REDIRECT_TYPE_OF_SERVICE_AND_NETWORK);
        assert_eq!(3, CODE_REDIRECT_TYPE_OF_SERVICE_AND_HOST);

        // time exceeded code numbers according to
        // https://www.iana.org/assignments/icmp-parameters/icmp-parameters.xhtml#icmp-parameters-codes-11
        assert_eq!(0, CODE_TIME_EXCEEDED_TTL_EXCEEDED_IN_TRANSIT);
        assert_eq!(1, CODE_TIME_EXCEEDED_FRAG_REASSEMBLY_TIME_EXCEEDED);

        // parameter problem code numbers according to
        // https://www.iana.org/assignments/icmp-parameters/icmp-parameters.xhtml#icmp-parameters-codes-12
        assert_eq!(0, CODE_PARAMETER_PROBLEM_POINTER_INDICATES_ERROR);
        assert_eq!(1, CODE_PARAMETER_PROBLEM_MISSING_REQUIRED_OPTION);
        assert_eq!(2, CODE_PARAMETER_PROBLEM_BAD_LENGTH);
    }
}