1use crate::{Address, Flags, Timeval};
2use deku::prelude::*;
3
4#[derive(Debug, PartialEq, DekuRead, DekuWrite)]
6#[deku(ctx = "endian: deku::ctx::Endian", endian = "endian", type = "u8")]
7pub enum PingStopReason {
8 None = 0x00,
10 Completed = 0x01,
12 Error = 0x02,
14 Halted = 0x03,
16}
17
18#[derive(Debug, PartialEq, DekuRead, DekuWrite)]
20#[deku(ctx = "endian: deku::ctx::Endian", endian = "endian")]
21pub struct Ping {
22 pub length: u32,
23 pub flags: Flags,
25 #[deku(cond = "flags.any()")]
27 pub param_length: Option<u16>,
28 #[deku(cond = "flags.get(1)")]
30 pub list_id: Option<u32>,
31 #[deku(cond = "flags.get(2)")]
33 pub cycle_id: Option<u32>,
34 #[deku(cond = "flags.get(3)")]
36 pub src_addr_id: Option<u32>,
37 #[deku(cond = "flags.get(4)")]
39 pub dst_addr_id: Option<u32>,
40 #[deku(cond = "flags.get(5)")]
42 pub start_time: Option<Timeval>,
43 #[deku(cond = "flags.get(6)")]
44 pub stop_reason: Option<PingStopReason>,
46 #[deku(cond = "flags.get(7)")]
48 pub stop_data: Option<u8>,
49 #[deku(cond = "flags.get(8)")]
51 pub data_length: Option<u8>,
52 #[deku(cond = "flags.get(9)", count = "data_length.unwrap()")]
54 pub data: Vec<u8>,
55 #[deku(cond = "flags.get(10)")]
57 pub probe_count: Option<u16>,
58 #[deku(cond = "flags.get(11)")]
60 pub probe_size: Option<u16>,
61 #[deku(cond = "flags.get(12)")]
63 pub probe_wait: Option<u8>,
64 #[deku(cond = "flags.get(13)")]
66 pub probe_ttl: Option<u8>,
67 #[deku(cond = "flags.get(14)")]
69 pub reply_count1: Option<u16>,
70 #[deku(cond = "flags.get(15)")]
72 pub pings_sent: Option<u16>,
73 #[deku(cond = "flags.get(16)")]
76 pub ping_method: Option<u8>,
77 #[deku(cond = "flags.get(17)")]
79 pub src_port: Option<u16>,
80 #[deku(cond = "flags.get(18)")]
82 pub dst_port: Option<u16>,
83 #[deku(cond = "flags.get(19)")]
85 pub user_id: Option<u32>,
86 #[deku(cond = "flags.get(20)")]
88 pub src_addr: Option<Address>,
89 #[deku(cond = "flags.get(21)")]
91 pub dst_addr: Option<Address>,
92 #[deku(cond = "flags.get(22)")]
95 pub ping_flags1: Option<u8>,
96 #[deku(cond = "flags.get(23)")]
98 pub probe_tos: Option<u8>,
99 #[deku(cond = "flags.get(24)", count = "0")]
102 pub tsprespec: Vec<u8>,
103 #[deku(cond = "flags.get(25)")]
105 pub icmp_checksum: Option<u16>,
106 #[deku(cond = "flags.get(26)")]
108 pub pseudo_pmtu: Option<u16>,
109 #[deku(cond = "flags.get(27)")]
111 pub probe_timeout: Option<u8>,
112 #[deku(cond = "flags.get(28)")]
114 pub probe_wait_usec: Option<u32>,
115 #[deku(cond = "flags.get(29)")]
117 pub tcp_ack: Option<u32>,
118 #[deku(cond = "flags.get(30)")]
120 pub ping_flags2: Option<Address>,
121 #[deku(cond = "flags.get(31)")]
123 pub tcp_seq: Option<Address>,
124 #[deku(cond = "flags.get(32)")]
126 pub router_addr: Option<Address>,
127 pub reply_count2: u16,
129 #[deku(count = "reply_count2")]
131 pub reply: Vec<PingProbe>,
132}
133
134#[derive(Debug, PartialEq, DekuRead, DekuWrite)]
136#[deku(ctx = "endian: deku::ctx::Endian", endian = "endian")]
137pub struct PingProbe {
138 pub flags: Flags,
139 #[deku(cond = "flags.any()")]
140 pub param_length: Option<u16>,
141 #[deku(cond = "flags.get(1)")]
142 pub addr_id: Option<u32>,
143 #[deku(cond = "flags.get(2)")]
145 pub flags2: Option<u8>,
146 #[deku(cond = "flags.get(3)")]
147 pub reply_ttl: Option<u8>,
148 #[deku(cond = "flags.get(4)")]
149 pub reply_size: Option<u16>,
150 #[deku(cond = "flags.get(5)")]
151 pub icmp_type: Option<u8>,
152 #[deku(cond = "flags.get(5)")]
153 pub icmp_code: Option<u8>,
154 #[deku(cond = "flags.get(6)")]
155 pub rtt_usec: Option<u32>,
156 #[deku(cond = "flags.get(7)")]
157 pub probe_id: Option<u16>,
158 #[deku(cond = "flags.get(8)")]
159 pub reply_ipid: Option<u16>,
160 #[deku(cond = "flags.get(9)")]
161 pub probe_ipid: Option<u16>,
162 #[deku(cond = "flags.get(10)")]
164 pub reply_proto: Option<u8>,
165 #[deku(cond = "flags.get(11)")]
166 pub tcp_flags: Option<u8>,
167 #[deku(cond = "flags.get(12)")]
168 pub addr: Option<Address>,
169 #[deku(cond = "flags.get(13)")]
171 pub rr: Option<u8>,
172 #[deku(cond = "flags.get(14)")]
173 pub ts: Option<u8>,
174 #[deku(cond = "flags.get(15)")]
175 pub reply_ipid32: Option<u32>,
176 #[deku(cond = "flags.get(16)")]
177 pub tx: Option<Timeval>,
178 }