in neqo-transport/src/connection/mod.rs [2701:2747]
fn process_tps(&mut self, now: Instant) -> Res<()> {
self.validate_cids()?;
self.validate_versions()?;
{
let tps = self.tps.borrow();
let remote = tps.remote.as_ref().ok_or(Error::TransportParameterError)?;
// If the peer provided a preferred address, then we have to be a client
// and they have to be using a non-empty connection ID.
if remote.get_preferred_address().is_some()
&& (self.role == Role::Server
|| self
.remote_initial_source_cid
.as_ref()
.ok_or(Error::UnknownConnectionId)?
.is_empty())
{
return Err(Error::TransportParameterError);
}
let reset_token = remote.get_bytes(StatelessResetToken).map_or_else(
|| Ok(ConnectionIdEntry::random_srt()),
|token| <[u8; 16]>::try_from(token).map_err(|_| Error::TransportParameterError),
)?;
let path = self.paths.primary().ok_or(Error::NoAvailablePath)?;
path.borrow_mut().set_reset_token(reset_token);
let max_ad = Duration::from_millis(remote.get_integer(MaxAckDelay));
let min_ad = if remote.has_value(MinAckDelay) {
let min_ad = Duration::from_micros(remote.get_integer(MinAckDelay));
if min_ad > max_ad {
return Err(Error::TransportParameterError);
}
Some(min_ad)
} else {
None
};
path.borrow_mut()
.set_ack_delay(max_ad, min_ad, self.conn_params.get_ack_ratio());
let max_active_cids = remote.get_integer(ActiveConnectionIdLimit);
self.cid_manager.set_limit(max_active_cids);
}
self.set_initial_limits();
qlog::connection_tparams_set(&self.qlog, &self.tps.borrow(), now);
Ok(())
}