feat: added modified TCP packet parser
checksum generation code is different, to allow for some sneaky tricks with regards to identifying the sparse session but binding to the same port multiple times
This commit is contained in:
@@ -105,7 +105,9 @@ pub fn spawn_connection_handler(
|
||||
let packet = connection_packet.pkt();
|
||||
|
||||
let Layer3Pkt::IPv4Pkt(ip_pkt) = packet.get_layer3_pkt()?;
|
||||
let Layer4Pkt::UDP(udp_pkt) = ip_pkt.get_layer4_packet()?;
|
||||
let Layer4Pkt::UDP(udp_pkt) = ip_pkt.get_layer4_packet()? else {
|
||||
todo!()
|
||||
};
|
||||
|
||||
let data = udp_pkt.get_data();
|
||||
|
||||
@@ -198,7 +200,9 @@ fn authenticate<F: Fn()>(
|
||||
use packets::*;
|
||||
let p = p.pkt();
|
||||
let Layer3Pkt::IPv4Pkt(ip_pkt) = p.get_layer3_pkt()?;
|
||||
let Layer4Pkt::UDP(udp_pkt) = ip_pkt.get_layer4_packet()?;
|
||||
let Layer4Pkt::UDP(udp_pkt) = ip_pkt.get_layer4_packet()? else {
|
||||
todo!()
|
||||
};
|
||||
|
||||
let Ok(data) = conninfo.try_decrypt_and_verify(udp_pkt.get_data()) else {
|
||||
counter += 1;
|
||||
@@ -246,7 +250,9 @@ where
|
||||
let pkt = msg.pkt();
|
||||
|
||||
let Layer3Pkt::IPv4Pkt(ip_pkt) = pkt.get_layer3_pkt()?;
|
||||
let Layer4Pkt::UDP(udp_pkt) = ip_pkt.get_layer4_packet()?;
|
||||
let Layer4Pkt::UDP(udp_pkt) = ip_pkt.get_layer4_packet()? else {
|
||||
todo!()
|
||||
};
|
||||
|
||||
if ip_pkt.source_ip() != conninfo.srcip || udp_pkt.srcport() != conninfo.srcport {
|
||||
continue;
|
||||
|
||||
@@ -111,7 +111,9 @@ impl InterfaceSender {
|
||||
Self::Udp(interf) => {
|
||||
use packets::*;
|
||||
let Layer3Pkt::IPv4Pkt(ip_pkt) = packet.get_layer3_pkt()?;
|
||||
let Layer4Pkt::UDP(udp_pkt) = ip_pkt.get_layer4_packet()?;
|
||||
let Layer4Pkt::UDP(udp_pkt) = ip_pkt.get_layer4_packet()? else {
|
||||
todo!()
|
||||
};
|
||||
|
||||
let addr = SocketAddrV4::new(ip_pkt.dest_ip(), udp_pkt.dstport());
|
||||
|
||||
|
||||
@@ -49,7 +49,9 @@ fn main() -> anyhow::Result<()> {
|
||||
let (kill_connection, kill_connection_recv) = channel::<(Ipv4Addr, u16)>();
|
||||
|
||||
thread::spawn(move || loop {
|
||||
let Ok(packet) = recv_eth_packet.recv() else { continue };
|
||||
let Ok(packet) = recv_eth_packet.recv() else {
|
||||
continue;
|
||||
};
|
||||
if let Err(_) = interface_sender.sendpacket(packet.pkt()) {}
|
||||
});
|
||||
|
||||
@@ -57,7 +59,9 @@ fn main() -> anyhow::Result<()> {
|
||||
s.spawn({
|
||||
let connections = &connections;
|
||||
move || loop {
|
||||
let Ok(connection) = kill_connection_recv.recv() else { continue };
|
||||
let Ok(connection) = kill_connection_recv.recv() else {
|
||||
continue;
|
||||
};
|
||||
if let Ok(mut e) = connections.lock() {
|
||||
e.remove(&connection);
|
||||
}
|
||||
@@ -71,7 +75,9 @@ fn main() -> anyhow::Result<()> {
|
||||
let pkt = pkt.pkt();
|
||||
|
||||
let Layer3Pkt::IPv4Pkt(ip_pkt) = pkt.get_layer3_pkt()?;
|
||||
let Layer4Pkt::UDP(udp_pkt) = ip_pkt.get_layer4_packet()?;
|
||||
let Layer4Pkt::UDP(udp_pkt) = ip_pkt.get_layer4_packet()? else {
|
||||
todo!()
|
||||
};
|
||||
|
||||
let connection_handle = &(ip_pkt.dest_ip(), udp_pkt.srcport());
|
||||
|
||||
|
||||
Reference in New Issue
Block a user