in dc/s2n-quic-dc/src/socket/recv/pool.rs [394:484]
fn fill(&mut self, idx: usize, port: u16, segment_count: u8, segment_len: u8) {
let Self {
epoch,
references,
unfilled,
filled,
expected_free_packets,
..
} = self;
if unfilled.is_empty() {
return;
}
let idx = idx % unfilled.len();
let unfilled = unfilled.remove(idx).unwrap();
let src = SocketAddr::new(Ipv4Addr::LOCALHOST.into(), port);
let segment_len = segment_len as usize;
let segment_count = segment_count as usize;
let mut actual_segment_count = 0;
let res = unfilled.recv_with(|addr, cmsg, mut payload| {
if port == 0 {
return Err(());
}
addr.set(src.into());
if segment_count > 1 {
cmsg.set_segment_len(segment_len as _);
}
let mut offset = 0;
for segment_idx in 0..segment_count {
let remaining = &mut payload[offset..];
let len = remaining.len().min(segment_len);
if len == 0 {
break;
}
actual_segment_count += 1;
remaining[..len].fill(segment_idx as u8);
offset += len;
}
Ok(offset)
});
assert_eq!(res.is_err(), port == 0);
if let Ok(segments) = res {
if actual_segment_count > 0 {
references.insert(*epoch, actual_segment_count);
}
for (idx, segment) in segments.enumerate() {
// we allow only one segment to be empty. this makes it easier to log when we get empty packets, which are unexpected
if segment.is_empty() {
assert_eq!(actual_segment_count, 0);
assert_eq!(idx, 0);
*expected_free_packets += 1;
continue;
}
assert!(
idx < actual_segment_count,
"{idx} < {actual_segment_count}, {:?}",
segment.payload()
);
// the final segment is allowed to be undersized
if idx == actual_segment_count - 1 {
assert!(segment.len() as usize <= segment_len);
} else {
assert_eq!(segment.len() as usize, segment_len);
}
// make sure bytes match the segment pattern
for byte in segment.payload().iter() {
assert_eq!(*byte, idx as u8);
}
filled.push_back((*epoch, segment));
}
*epoch += 1;
} else {
*expected_free_packets += 1;
}
}