1pub mod icmp{
2 use pnet::packet::icmp::IcmpTypes;
3 use pnet::packet::icmp::echo_request::{MutableEchoRequestPacket, IcmpCodes};
4
5 pub fn make_icmp_echo_packet(icmp: &mut MutableEchoRequestPacket) {
6 icmp.set_icmp_type(IcmpTypes::EchoRequest);
7 icmp.set_icmp_code(IcmpCodes::NoCode);
8 icmp.set_checksum(0);
9 icmp.set_identifier(1);
10 icmp.set_sequence_number(1);
11 }
12
13 pub fn checksum(data: &[u8]) -> u16 {
14 let mut sum: u32 = 0;
15 let mut s = data.len();
16 for i in 0..s / 2 {
17 sum += ( ( (data[i*2+1] as u16) << 8) + data[i*2] as u16) as u32;
18 s -= 2;
19 if sum & 0x80000000 == 1 {
20 sum = (sum >> 16) + (sum & 0xffff);
21 }
22 }
23
24 if s == 1 {
25 sum += data[data.len()-1] as u32;
26 }
27
28 while sum >> 16 > 1 {
29 sum = (sum >> 16) + (sum & 0xffff);
30 }
31
32 sum = (sum >> 8) + ( (sum << 8) & 0xff00);
33
34 !sum as u16
35 }
36}