This commit is contained in:
hexchen 2020-05-03 19:24:17 +00:00
parent 487d129443
commit 87673afc26

View file

@ -4,9 +4,9 @@ use pnet::datalink::Channel::Ethernet;
use pnet::datalink::{self, NetworkInterface}; use pnet::datalink::{self, NetworkInterface};
use pnet::packet::ethernet::{EtherTypes, EthernetPacket, MutableEthernetPacket}; use pnet::packet::ethernet::{EtherTypes, EthernetPacket, MutableEthernetPacket};
use pnet::packet::ip::IpNextHeaderProtocols; use pnet::packet::ip::IpNextHeaderProtocols;
use pnet::packet::ipv4::{MutableIpv4Packet, Ipv4Packet}; use pnet::packet::ipv4::{self, MutableIpv4Packet, Ipv4Packet};
use pnet::packet::ipv6::{MutableIpv6Packet, Ipv6Packet}; use pnet::packet::ipv6::{self, MutableIpv6Packet, Ipv6Packet};
use pnet::packet::tcp::TcpPacket; use pnet::packet::tcp::{self, MutableTcpPacket, TcpPacket};
use pnet::packet::{MutablePacket, Packet}; use pnet::packet::{MutablePacket, Packet};
use pnet::util::MacAddr; use pnet::util::MacAddr;
use std::env; use std::env;
@ -35,7 +35,6 @@ fn main() {
match handle_ethernet_frame(packet, own_mac) { match handle_ethernet_frame(packet, own_mac) {
None => (),//println!("something broke. cool."), None => (),//println!("something broke. cool."),
Some(x) => { Some(x) => {
println!("Sending out packet {:?}", &x);
tx.send_to(x.packet(), None); tx.send_to(x.packet(), None);
} }
} }
@ -83,10 +82,17 @@ fn handle_ipv4_frame<'a>(ether_frame: &EthernetPacket) -> Option<Ipv4Packet<'a>>
IpNextHeaderProtocols::Tcp => handle_tcp_frame(&TcpPacket::new(frame.payload())?), IpNextHeaderProtocols::Tcp => handle_tcp_frame(&TcpPacket::new(frame.payload())?),
_ => None, _ => None,
}; };
ret.map(|x| { ret.map(|mut x| {
let destination = Ipv4Addr::new(192, 168, 129, 12);
let source = frame.get_source();
let tcpchecksum = tcp::ipv4_checksum(&x.to_immutable(), &source, &destination);
x.set_checksum(tcpchecksum);
clone.set_payload(x.packet()); clone.set_payload(x.packet());
clone.set_destination(Ipv4Addr::new(192, 168, 129, 12)); clone.set_destination(destination);
println!("{:?}", &clone);
let ipchecksum = ipv4::checksum(&clone.to_immutable());
clone.set_checksum(ipchecksum);
clone.consume_to_immutable() clone.consume_to_immutable()
}) })
} }
@ -105,13 +111,12 @@ fn handle_ipv6_frame<'a>(ether_frame: &EthernetPacket) -> Option<Ipv6Packet<'a>>
}) })
} }
fn handle_tcp_frame<'a>(packet: &TcpPacket) -> Option<TcpPacket<'a>> { fn handle_tcp_frame<'a>(packet: &TcpPacket) -> Option<MutableTcpPacket<'a>> {
match packet.get_destination() { match packet.get_destination() {
80 => { 80 => {
println!("it's HTTP! redirecting to sender!");
let vec: Vec<u8> = packet.packet().to_owned(); let vec: Vec<u8> = packet.packet().to_owned();
println!("{:?}", &packet); let clone = MutableTcpPacket::owned(vec)?;
TcpPacket::owned(vec) Some(clone)
} }
_ => { _ => {
//println!("{:?}", &packet); //println!("{:?}", &packet);