Send ack with fin and handle close

This commit is contained in:
Jackson Coxson
2025-03-22 10:58:37 -06:00
parent b2c91c09be
commit 8bde49b09f
2 changed files with 36 additions and 12 deletions

2
Cargo.lock generated
View File

@@ -957,7 +957,7 @@ dependencies = [
[[package]] [[package]]
name = "idevice" name = "idevice"
version = "0.1.24" version = "0.1.25"
dependencies = [ dependencies = [
"async-recursion", "async-recursion",
"base64", "base64",

View File

@@ -63,6 +63,7 @@ impl Adapter {
pub async fn connect(&mut self, port: u16) -> Result<(), std::io::Error> { pub async fn connect(&mut self, port: u16) -> Result<(), std::io::Error> {
self.read_buffer = Vec::new(); self.read_buffer = Vec::new();
self.write_buffer = Vec::new();
// Randomize seq // Randomize seq
self.seq = rand::random(); self.seq = rand::random();
@@ -94,7 +95,7 @@ impl Adapter {
// Wait for the syn ack // Wait for the syn ack
let res = self.read_tcp_packet().await?; let res = self.read_tcp_packet().await?;
if !(res.flags.syn && res.flags.ack) { if !(res.flags.syn && res.flags.ack) {
log::error!("Didn't get syn ack"); log::error!("Didn't get syn ack: {res:#?}, {self:#?}");
return Err(std::io::Error::new( return Err(std::io::Error::new(
std::io::ErrorKind::InvalidData, std::io::ErrorKind::InvalidData,
"No syn ack", "No syn ack",
@@ -143,6 +144,7 @@ impl Adapter {
self.ack, self.ack,
TcpFlags { TcpFlags {
fin: true, fin: true,
ack: true,
..Default::default() ..Default::default()
}, },
u16::MAX - 1, u16::MAX - 1,
@@ -151,6 +153,18 @@ impl Adapter {
let ip_packet = self.ip_wrap(&tcp_packet); let ip_packet = self.ip_wrap(&tcp_packet);
self.peer.write_all(&ip_packet).await?; self.peer.write_all(&ip_packet).await?;
self.log_packet(&ip_packet).await?; self.log_packet(&ip_packet).await?;
loop {
let res = self.read_tcp_packet().await?;
if res.flags.psh || !res.payload.is_empty() {
self.ack().await?;
continue;
}
if res.flags.ack || res.flags.fin || res.flags.rst {
break;
}
}
self.state = AdapterState::None; self.state = AdapterState::None;
Ok(()) Ok(())
} }
@@ -219,6 +233,9 @@ impl Adapter {
pub async fn recv(&mut self) -> Result<Vec<u8>, std::io::Error> { pub async fn recv(&mut self) -> Result<Vec<u8>, std::io::Error> {
loop { loop {
let res = self.read_tcp_packet().await?; let res = self.read_tcp_packet().await?;
if res.destination_port != self.host_port || res.source_port != self.peer_port {
continue;
}
if res.flags.psh || !res.payload.is_empty() { if res.flags.psh || !res.payload.is_empty() {
self.ack().await?; self.ack().await?;
break Ok(res.payload); break Ok(res.payload);
@@ -265,8 +282,14 @@ impl Adapter {
} }
async fn read_tcp_packet(&mut self) -> Result<TcpPacket, std::io::Error> { async fn read_tcp_packet(&mut self) -> Result<TcpPacket, std::io::Error> {
loop {
let ip_packet = self.read_ip_packet().await?; let ip_packet = self.read_ip_packet().await?;
let tcp_packet = TcpPacket::parse(&ip_packet)?; let tcp_packet = TcpPacket::parse(&ip_packet)?;
if tcp_packet.destination_port != self.host_port
|| tcp_packet.source_port != self.peer_port
{
continue;
}
trace!("TCP packet: {tcp_packet:#?}"); trace!("TCP packet: {tcp_packet:#?}");
self.ack = tcp_packet.sequence_number self.ack = tcp_packet.sequence_number
+ if tcp_packet.payload.is_empty() { + if tcp_packet.payload.is_empty() {
@@ -274,7 +297,8 @@ impl Adapter {
} else { } else {
tcp_packet.payload.len() as u32 tcp_packet.payload.len() as u32
}; };
Ok(tcp_packet) break Ok(tcp_packet);
}
} }
fn ip_wrap(&self, packet: &[u8]) -> Vec<u8> { fn ip_wrap(&self, packet: &[u8]) -> Vec<u8> {