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;
use std::io::{Error, ErrorKind};
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,Error>{
let (mut tx, mut rx) = match transport_channel(512, TransportChannelType::Layer3(next_level_protocol)){
Ok(tx_rx) => tx_rx,
Err(e) => return Err(e)
};
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(Error::new(ErrorKind::Other, "oh no!")),
};
let i_pac = Ipv4Packet::new(&packet).unwrap();
return Ok(i_pac.get_source())
}
Err(e) => {
return Err(e);
}
}
}
}
}