mirror of
https://github.com/jkcoxson/idevice.git
synced 2026-03-02 14:36:16 +01:00
Fix retransmission and debug_proxy not swallowing 2 digit checksum issue (#14)
* Fix retransmission and debug_proxy not swallowing 2 digit checksum issue * cargo fmt * Fix wrong ACK number when connection is establish but empty packet arrives
This commit is contained in:
@@ -156,6 +156,9 @@ impl<R: ReadWrite> DebugProxyClient<R> {
|
|||||||
}
|
}
|
||||||
buffer.push(received_char[0]);
|
buffer.push(received_char[0]);
|
||||||
}
|
}
|
||||||
|
// swallow checksum
|
||||||
|
let mut checksum_chars = [0u8; 2];
|
||||||
|
self.socket.read_exact(&mut checksum_chars).await?;
|
||||||
|
|
||||||
if !self.noack_mode {
|
if !self.noack_mode {
|
||||||
self.send_ack().await?;
|
self.send_ack().await?;
|
||||||
|
|||||||
@@ -78,6 +78,7 @@ struct ConnectionState {
|
|||||||
read_buffer: Vec<u8>,
|
read_buffer: Vec<u8>,
|
||||||
write_buffer: Vec<u8>,
|
write_buffer: Vec<u8>,
|
||||||
status: ConnectionStatus,
|
status: ConnectionStatus,
|
||||||
|
peer_seq: u32,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)]
|
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)]
|
||||||
@@ -97,6 +98,7 @@ impl ConnectionState {
|
|||||||
read_buffer: Vec::new(),
|
read_buffer: Vec::new(),
|
||||||
write_buffer: Vec::new(),
|
write_buffer: Vec::new(),
|
||||||
status: ConnectionStatus::WaitingForSyn,
|
status: ConnectionStatus::WaitingForSyn,
|
||||||
|
peer_seq: 0,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -516,19 +518,26 @@ impl Adapter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async fn process_tcp_packet(&mut self) -> Result<(), std::io::Error> {
|
async fn process_tcp_packet(&mut self) -> Result<(), std::io::Error> {
|
||||||
|
loop {
|
||||||
let ip_packet = self.read_ip_packet().await?;
|
let ip_packet = self.read_ip_packet().await?;
|
||||||
let res = TcpPacket::parse(&ip_packet)?;
|
let res = TcpPacket::parse(&ip_packet)?;
|
||||||
let mut ack_me = None;
|
let mut ack_me = None;
|
||||||
if let Some(state) = self.states.get_mut(&res.destination_port) {
|
if let Some(state) = self.states.get_mut(&res.destination_port) {
|
||||||
|
if state.peer_seq > res.sequence_number {
|
||||||
|
// ignore retransmission
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
state.peer_seq = res.sequence_number + res.payload.len() as u32;
|
||||||
state.ack = res.sequence_number
|
state.ack = res.sequence_number
|
||||||
+ if res.payload.is_empty() {
|
+ if res.payload.is_empty() && state.status != ConnectionStatus::Connected {
|
||||||
1
|
1
|
||||||
} else {
|
} else {
|
||||||
res.payload.len() as u32
|
res.payload.len() as u32
|
||||||
};
|
};
|
||||||
if res.flags.psh || !res.payload.is_empty() {
|
if res.flags.psh || !res.payload.is_empty() {
|
||||||
ack_me = Some(res.destination_port);
|
ack_me = Some(res.destination_port);
|
||||||
state.read_buffer.extend(res.payload)
|
state.read_buffer.extend(res.payload);
|
||||||
}
|
}
|
||||||
if res.flags.rst {
|
if res.flags.rst {
|
||||||
state.status = ConnectionStatus::Error(ErrorKind::ConnectionReset);
|
state.status = ConnectionStatus::Error(ErrorKind::ConnectionReset);
|
||||||
@@ -548,6 +557,8 @@ impl Adapter {
|
|||||||
if let Some(a) = ack_me {
|
if let Some(a) = ack_me {
|
||||||
self.ack(a).await?;
|
self.ack(a).await?;
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user