pub mod icmp{
use pnet::packet::icmp::IcmpTypes;
use pnet::packet::icmp::echo_request::{MutableEchoRequestPacket, IcmpCodes};
pub fn make_icmp_echo_packet(icmp: &mut MutableEchoRequestPacket) {
icmp.set_icmp_type(IcmpTypes::EchoRequest);
icmp.set_icmp_code(IcmpCodes::NoCode);
icmp.set_checksum(0);
icmp.set_identifier(1);
icmp.set_sequence_number(1);
}
pub fn checksum(data: &[u8]) -> u16 {
let mut sum: u32 = 0;
let mut s = data.len();
for i in 0..s / 2 {
sum += ( ( (data[i*2+1] as u16) << 8) + data[i*2] as u16) as u32;
s -= 2;
if sum & 0x80000000 == 1 {
sum = (sum >> 16) + (sum & 0xffff);
}
}
if s == 1 {
sum += data[data.len()-1] as u32;
}
while sum >> 16 > 1 {
sum = (sum >> 16) + (sum & 0xffff);
}
sum = (sum >> 8) + ( (sum << 8) & 0xff00);
!sum as u16
}
}