diff --git a/tcp-test/client/src/main.rs b/tcp-test/client/src/main.rs index 510e40f..0c97ada 100644 --- a/tcp-test/client/src/main.rs +++ b/tcp-test/client/src/main.rs @@ -1,6 +1,6 @@ use std::{ collections::VecDeque, - net::{Ipv4Addr, SocketAddr}, + net::{Ipv4Addr, SocketAddr}, time::Duration, }; use anyhow::anyhow; @@ -8,7 +8,7 @@ use anyhow::anyhow; use log::{debug, info, trace}; use nl_sys::{netlink, route}; -use packets::{self, EthernetPacket, IPv4Pkt, TCPPacket, TCPPkt}; +use packets::{self, EthernetPacket, IPv4Pkt, TCPPacket, TCPPacketBuilder, TCPPkt}; use pcap_sys; struct PeerInfo { @@ -30,6 +30,7 @@ struct TcpSocket { local_rx_last_ack: Option, state: TcpState, peer_info: Option, + ack_timeout: Option } #[derive(Default)] @@ -64,7 +65,7 @@ fn connect( remote_addr: Ipv4Addr, remote_port: u16, local_addr: Ipv4Addr, -) -> anyhow::Result { +) -> TCPPacket { socket.state = TcpState::SynSent; let local_port: u16 = loop { let port = rand::random(); @@ -79,10 +80,22 @@ fn connect( local_port, }); - Ok(()) + socket.local_seq_no = rand::random(); + + TCPPacketBuilder::default() + .srcport(local_port) + .dstport(remote_port) + . + .syn(true) + .window(64240) + .seqnumber(socket.local_seq_no) + .build(local_addr, remote_addr, vec![], None) } -fn process_packet(socket: &mut TcpSocket, packet: TCPPkt<'_>) -> anyhow::Result> { +fn process_packet( + socket: &mut TcpSocket, + packet: TCPPkt<'_>, +) -> anyhow::Result)>> { match socket.state { TcpState::SynSent if packet.ack() && packet.syn() => {} _ => {}