feat: added more robust handling of actions
This commit is contained in:
parent
ed13defb07
commit
867464f673
@ -1,6 +1,6 @@
|
|||||||
use std::{
|
use std::{
|
||||||
collections::VecDeque,
|
collections::VecDeque,
|
||||||
net::{Ipv4Addr, SocketAddr},
|
net::{Ipv4Addr, SocketAddr}, time::Duration,
|
||||||
};
|
};
|
||||||
|
|
||||||
use anyhow::anyhow;
|
use anyhow::anyhow;
|
||||||
@ -8,7 +8,7 @@ use anyhow::anyhow;
|
|||||||
use log::{debug, info, trace};
|
use log::{debug, info, trace};
|
||||||
use nl_sys::{netlink, route};
|
use nl_sys::{netlink, route};
|
||||||
|
|
||||||
use packets::{self, EthernetPacket, IPv4Pkt, TCPPacket, TCPPkt};
|
use packets::{self, EthernetPacket, IPv4Pkt, TCPPacket, TCPPacketBuilder, TCPPkt};
|
||||||
use pcap_sys;
|
use pcap_sys;
|
||||||
|
|
||||||
struct PeerInfo {
|
struct PeerInfo {
|
||||||
@ -30,6 +30,7 @@ struct TcpSocket {
|
|||||||
local_rx_last_ack: Option<u32>,
|
local_rx_last_ack: Option<u32>,
|
||||||
state: TcpState,
|
state: TcpState,
|
||||||
peer_info: Option<PeerInfo>,
|
peer_info: Option<PeerInfo>,
|
||||||
|
ack_timeout: Option<Duration>
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Default)]
|
#[derive(Default)]
|
||||||
@ -64,7 +65,7 @@ fn connect(
|
|||||||
remote_addr: Ipv4Addr,
|
remote_addr: Ipv4Addr,
|
||||||
remote_port: u16,
|
remote_port: u16,
|
||||||
local_addr: Ipv4Addr,
|
local_addr: Ipv4Addr,
|
||||||
) -> anyhow::Result<TCPPacket> {
|
) -> TCPPacket {
|
||||||
socket.state = TcpState::SynSent;
|
socket.state = TcpState::SynSent;
|
||||||
let local_port: u16 = loop {
|
let local_port: u16 = loop {
|
||||||
let port = rand::random();
|
let port = rand::random();
|
||||||
@ -79,10 +80,22 @@ fn connect(
|
|||||||
local_port,
|
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<Option<TCPPacket>> {
|
fn process_packet(
|
||||||
|
socket: &mut TcpSocket,
|
||||||
|
packet: TCPPkt<'_>,
|
||||||
|
) -> anyhow::Result<Option<(TCPPacketBuilder, Vec<u8>)>> {
|
||||||
match socket.state {
|
match socket.state {
|
||||||
TcpState::SynSent if packet.ack() && packet.syn() => {}
|
TcpState::SynSent if packet.ack() && packet.syn() => {}
|
||||||
_ => {}
|
_ => {}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user