Handle buffer wraparound in TCP reassembly code.
This commit is contained in:
parent
075a2ebb83
commit
8166037a91
|
@ -1082,7 +1082,7 @@ impl<'a> TcpSocket<'a> {
|
||||||
net_trace!("[{}]{}:{}: tx buffer: dequeueing {} octets (now {})",
|
net_trace!("[{}]{}:{}: tx buffer: dequeueing {} octets (now {})",
|
||||||
self.debug_id, self.local_endpoint, self.remote_endpoint,
|
self.debug_id, self.local_endpoint, self.remote_endpoint,
|
||||||
ack_len, self.tx_buffer.len() - ack_len);
|
ack_len, self.tx_buffer.len() - ack_len);
|
||||||
self.tx_buffer.dequeue_many(ack_len);
|
self.tx_buffer.dequeue_allocated(ack_len);
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(ack_number) = repr.ack_number {
|
if let Some(ack_number) = repr.ack_number {
|
||||||
|
@ -1102,8 +1102,7 @@ impl<'a> TcpSocket<'a> {
|
||||||
net_trace!("[{}]{}:{}: rx buffer: writing {} octets at offset {}",
|
net_trace!("[{}]{}:{}: rx buffer: writing {} octets at offset {}",
|
||||||
self.debug_id, self.local_endpoint, self.remote_endpoint,
|
self.debug_id, self.local_endpoint, self.remote_endpoint,
|
||||||
payload_len, payload_offset);
|
payload_len, payload_offset);
|
||||||
self.rx_buffer.get_unallocated(payload_offset, payload_len)
|
self.rx_buffer.write_unallocated(payload_offset, repr.payload);
|
||||||
.copy_from_slice(repr.payload);
|
|
||||||
}
|
}
|
||||||
Err(()) => {
|
Err(()) => {
|
||||||
net_debug!("[{}]{}:{}: assembler: too many holes to add {} octets at offset {}",
|
net_debug!("[{}]{}:{}: assembler: too many holes to add {} octets at offset {}",
|
||||||
|
@ -1119,7 +1118,7 @@ impl<'a> TcpSocket<'a> {
|
||||||
net_trace!("[{}]{}:{}: rx buffer: enqueueing {} octets (now {})",
|
net_trace!("[{}]{}:{}: rx buffer: enqueueing {} octets (now {})",
|
||||||
self.debug_id, self.local_endpoint, self.remote_endpoint,
|
self.debug_id, self.local_endpoint, self.remote_endpoint,
|
||||||
contig_len, self.rx_buffer.len() + contig_len);
|
contig_len, self.rx_buffer.len() + contig_len);
|
||||||
self.rx_buffer.enqueue_many(contig_len);
|
self.rx_buffer.enqueue_unallocated(contig_len);
|
||||||
}
|
}
|
||||||
|
|
||||||
if self.assembler.is_empty() {
|
if self.assembler.is_empty() {
|
||||||
|
@ -3293,6 +3292,29 @@ mod test {
|
||||||
assert_eq!(s.recv(10), Ok(&b"abcdef"[..]));
|
assert_eq!(s.recv(10), Ok(&b"abcdef"[..]));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_buffer_wraparound() {
|
||||||
|
let mut s = socket_established();
|
||||||
|
s.rx_buffer = SocketBuffer::new(vec![0; 6]);
|
||||||
|
s.assembler = Assembler::new(s.rx_buffer.capacity());
|
||||||
|
send!(s, TcpRepr {
|
||||||
|
seq_number: REMOTE_SEQ + 1,
|
||||||
|
ack_number: Some(LOCAL_SEQ + 1),
|
||||||
|
payload: &b"abc"[..],
|
||||||
|
..SEND_TEMPL
|
||||||
|
});
|
||||||
|
assert_eq!(s.recv(3), Ok(&b"abc"[..]));
|
||||||
|
send!(s, TcpRepr {
|
||||||
|
seq_number: REMOTE_SEQ + 1 + 3,
|
||||||
|
ack_number: Some(LOCAL_SEQ + 1),
|
||||||
|
payload: &b"defghi"[..],
|
||||||
|
..SEND_TEMPL
|
||||||
|
});
|
||||||
|
let mut data = [0; 6];
|
||||||
|
assert_eq!(s.recv_slice(&mut data[..]), Ok(6));
|
||||||
|
assert_eq!(data, &b"defghi"[..]);
|
||||||
|
}
|
||||||
|
|
||||||
// =========================================================================================//
|
// =========================================================================================//
|
||||||
// Tests for packet filtering.
|
// Tests for packet filtering.
|
||||||
// =========================================================================================//
|
// =========================================================================================//
|
||||||
|
|
Loading…
Reference in New Issue