in neqo-transport/src/server.rs [196:262]
fn handle_initial(
&mut self,
initial: InitialDetails,
dgram: Datagram<impl AsRef<[u8]> + AsMut<[u8]>>,
now: Instant,
) -> Output {
qdebug!("[{self}] Handle initial");
let res = self
.address_validation
.borrow()
.validate(&initial.token, dgram.source(), now);
match res {
AddressValidationResult::Invalid => Output::None,
AddressValidationResult::Pass => self.accept_connection(initial, dgram, None, now),
AddressValidationResult::ValidRetry(orig_dcid) => {
self.accept_connection(initial, dgram, Some(orig_dcid), now)
}
AddressValidationResult::Validate => {
qinfo!("[{self}] Send retry for {:?}", initial.dst_cid);
let res = self.address_validation.borrow().generate_retry_token(
&initial.dst_cid,
dgram.source(),
now,
);
let Ok(token) = res else {
qerror!("[{self}] unable to generate token, dropping packet");
return Output::None;
};
if let Some(new_dcid) = self.cid_generator.borrow_mut().generate_cid() {
let packet = PacketBuilder::retry(
initial.version,
&initial.src_cid,
&new_dcid,
&token,
&initial.dst_cid,
);
packet.map_or_else(
|_| {
qerror!("[{self}] unable to encode retry, dropping packet");
Output::None
},
|p| {
qdebug!(
"[{self}] type={:?} path:{} {}->{} {:?} len {}",
PacketType::Retry,
initial.dst_cid,
dgram.destination(),
dgram.source(),
IpTos::default(),
p.len(),
);
Output::Datagram(Datagram::new(
dgram.destination(),
dgram.source(),
IpTos::default(),
p,
))
},
)
} else {
qerror!("[{self}] no connection ID for retry, dropping packet");
Output::None
}
}
}
}