network_search/
icmp.rs

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}