pub mod ip{
use pnet::packet::ipv4::{Ipv4Packet, MutableIpv4Packet};
use pnet::packet::ip::IpNextHeaderProtocol;
use pnet::transport::{TransportChannelType, transport_channel, ipv4_packet_iter};
use pnet::packet::Packet;
use std::net::{IpAddr,Ipv4Addr};
use std::time::Duration;
pub fn make_ip_packet(ip: &mut MutableIpv4Packet, target_ip: Ipv4Addr, next_level_protocol: IpNextHeaderProtocol) {
ip.set_version(4);
ip.set_header_length(5);
ip.set_total_length(28);
ip.set_identification(1);
ip.set_ttl(1);
ip.set_next_level_protocol(next_level_protocol);
ip.set_destination(target_ip);
}
pub fn send_recv_packet(ip: &mut MutableIpv4Packet,ttl: u8,next_level_protocol: IpNextHeaderProtocol) -> Result<Ipv4Addr,()>{
let (mut tx, mut rx) = transport_channel(512, TransportChannelType::Layer3(next_level_protocol)).unwrap();
let mut rx = ipv4_packet_iter(&mut rx);
ip.set_ttl(ttl);
let ipv4 = Ipv4Packet::new(&ip.packet()).unwrap();
tx.send_to(ipv4, IpAddr::V4(ip.get_destination())).unwrap();
loop {
match rx.next_with_timeout(Duration::new(1, 0)) {
Ok(ip_response) => {
let packet = match ip_response {
Some((p, _)) => p.packet().to_vec(),
None => return Err(()),
};
let i_pac = Ipv4Packet::new(&packet).unwrap();
return Ok(i_pac.get_source())
}
Err(_) => {
return Err(());
}
}
}
}
}