mirror of
https://github.com/EasyTier/EasyTier.git
synced 2026-09-02 09:09:17 +00:00
fix QuicSocket payload offset (#2306)
This commit is contained in:
@@ -133,7 +133,7 @@ impl AsyncUdpSocket for QuicSocket {
|
|||||||
unsafe {
|
unsafe {
|
||||||
copy_nonoverlapping(
|
copy_nonoverlapping(
|
||||||
chunk.as_ptr(),
|
chunk.as_ptr(),
|
||||||
payload.as_mut_ptr().add(self.margins.header),
|
payload.chunk_mut().as_mut_ptr().add(self.margins.header),
|
||||||
len,
|
len,
|
||||||
);
|
);
|
||||||
payload.advance_mut(len + self.margins.len());
|
payload.advance_mut(len + self.margins.len());
|
||||||
@@ -1383,4 +1383,56 @@ mod tests {
|
|||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[tokio::test]
|
||||||
|
async fn test_gso() {
|
||||||
|
let margins = PacketMargins {
|
||||||
|
header: 20,
|
||||||
|
trailer: 25,
|
||||||
|
};
|
||||||
|
let (tx, rx) = channel(10);
|
||||||
|
|
||||||
|
let socket = QuicSocket {
|
||||||
|
addr: "127.0.0.1:0".parse().unwrap(),
|
||||||
|
rx: AtomicRefCell::new(rx),
|
||||||
|
tx,
|
||||||
|
margins,
|
||||||
|
};
|
||||||
|
|
||||||
|
let total_len = 3000;
|
||||||
|
let segment_size = 1000;
|
||||||
|
let mut contents = Vec::with_capacity(total_len);
|
||||||
|
|
||||||
|
contents.extend(vec![1u8; 1000]);
|
||||||
|
contents.extend(vec![2u8; 1000]);
|
||||||
|
contents.extend(vec![3u8; 1000]);
|
||||||
|
|
||||||
|
let transmit = Transmit {
|
||||||
|
destination: "127.0.0.1:8000".parse().unwrap(),
|
||||||
|
ecn: None,
|
||||||
|
contents: &contents,
|
||||||
|
segment_size: Some(segment_size),
|
||||||
|
src_ip: None,
|
||||||
|
};
|
||||||
|
|
||||||
|
socket.try_send(&transmit).unwrap();
|
||||||
|
|
||||||
|
let mut rx = socket.rx.into_inner();
|
||||||
|
let packet = rx.recv().await.unwrap();
|
||||||
|
|
||||||
|
let actual_segment_size = segment_size + margins.len();
|
||||||
|
let payload = packet.payload;
|
||||||
|
|
||||||
|
let chunk1_start = margins.header;
|
||||||
|
let chunk1_data = &payload[chunk1_start..chunk1_start + segment_size];
|
||||||
|
assert_eq!(chunk1_data[0], 1u8, "Chunk 1 corrupted");
|
||||||
|
|
||||||
|
let chunk2_start = actual_segment_size + margins.header;
|
||||||
|
let chunk2_data = &payload[chunk2_start..chunk2_start + segment_size];
|
||||||
|
assert_eq!(chunk2_data[0], 2u8, "Chunk 2 corrupted");
|
||||||
|
|
||||||
|
let chunk3_start = actual_segment_size * 2 + margins.header;
|
||||||
|
let chunk3_data = &payload[chunk3_start..chunk3_start + segment_size];
|
||||||
|
assert_eq!(chunk3_data[0], 3u8, "Chunk 3 corrupted");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user