fn new()

in quic/s2n-quic-transport/src/connection/connection_impl.rs [589:705]


    fn new(parameters: ConnectionParameters<Self::Config>) -> Result<Self, connection::Error> {
        let mut event_context = EventContext {
            context: parameters.event_context,
            internal_connection_id: parameters.internal_connection_id,
            quic_version: parameters.quic_version,
        };

        let rtt_estimator = RttEstimator::new(parameters.limits.initial_round_trip_time());
        // Assume clients validate the server's address implicitly.
        let peer_validated = Self::Config::ENDPOINT_TYPE.is_server();
        // The path manager always starts with a single path containing the known peer and local
        // connection ids.
        let initial_path = path::Path::new(
            parameters.path_handle,
            parameters.peer_connection_id,
            parameters.local_connection_id,
            rtt_estimator,
            parameters.congestion_controller,
            peer_validated,
            parameters.mtu_config,
            parameters.limits.anti_amplification_multiplier(),
        );

        let path_manager = path::Manager::new(initial_path, parameters.peer_id_registry);

        let mut publisher =
            event_context.publisher(parameters.timestamp, parameters.event_subscriber);

        publisher.on_connection_started(event::builder::ConnectionStarted {
            path: event::builder::Path {
                local_addr: parameters.path_handle.local_address().into_event(),
                local_cid: parameters.local_connection_id.into_event(),
                remote_addr: parameters.path_handle.remote_address().into_event(),
                remote_cid: parameters.peer_connection_id.into_event(),
                id: path_manager.active_path_id().into_event(),
                is_active: true,
            },
        });

        publisher.on_mtu_updated(event::builder::MtuUpdated {
            path_id: path_manager.active_path_id().into_event(),
            mtu: path_manager
                .active_path()
                .mtu_controller
                .max_datagram_size() as u16,
            cause: MtuUpdatedCause::NewPath,
            search_complete: path_manager
                .active_path()
                .mtu_controller
                .is_search_completed(),
        });

        let wakeup_handle = Arc::from(parameters.wakeup_handle);
        let waker = Waker::from(wakeup_handle.clone());
        let mut connection = Self {
            local_id_registry: parameters.local_id_registry,
            open_registry: parameters.open_registry,
            timers: Default::default(),
            accept_state: AcceptState::Handshaking,
            state: ConnectionState::Handshaking,
            path_manager,
            limits: parameters.limits,
            error: Ok(()),
            close_sender: CloseSender::default(),
            space_manager: parameters.space_manager,
            wakeup_handle,
            waker,
            event_context,
        };

        if Config::ENDPOINT_TYPE.is_client() {
            if let Err(error) = connection.update_crypto_state(
                parameters.timestamp,
                parameters.event_subscriber,
                parameters.datagram_endpoint,
                parameters.dc_endpoint,
                parameters.limits_endpoint,
            ) {
                connection.with_event_publisher(
                    parameters.timestamp,
                    None,
                    parameters.event_subscriber,
                    |publisher, _path| {
                        use s2n_quic_core::event::{
                            builder::ConnectionClosed, ConnectionPublisher,
                        };
                        publisher.on_connection_closed(ConnectionClosed { error });
                    },
                );
                return Err(error);
            }
        }

        let meta = event::builder::ConnectionMeta {
            endpoint_type: Config::ENDPOINT_TYPE,
            id: connection.internal_connection_id().into(),
            timestamp: parameters.timestamp,
        };

        if let Some(duration) = parameters.event_subscriber.supervisor_timeout(
            &mut connection.event_context.context,
            &meta.into_event(),
            parameters.supervisor_context,
        ) {
            connection
                .timers
                .supervisor_timer
                .set(parameters.timestamp + duration);
        }

        connection
            .timers
            .max_handshake_duration_timer
            .set(parameters.timestamp + connection.limits.max_handshake_duration());

        Ok(connection)
    }