nquic_receiver (nquic v1.0.0)
View SourceQUIC packet receiver process.
Each receiver owns one UDP socket and runs an async recv loop using completion-based I/O. Multiple receivers can share the same port via SO_REUSEPORT. Incoming packets are dispatched via ETS lookup: existing connections get a direct message (fast path), new connections are spawned in a separate process (slow path).
Summary
Functions
Return the port number this receiver's socket is bound to.
Start a receiver process with the given options.
Functions
-spec bump_rate(#state{socket :: nquic_socket:t(), select_info :: nquic_socket:select_info() | undefined, dispatch_table :: nquic_dispatch:t(), listener :: pid(), opts :: map(), static_key :: binary(), max_new_conns_per_sec :: non_neg_integer(), rate_count :: non_neg_integer(), rate_window_start :: integer(), retry :: boolean(), retry_token_lifetime :: pos_integer(), ecn :: boolean(), gro :: boolean()}) -> #state{socket :: nquic_socket:t(), select_info :: nquic_socket:select_info() | undefined, dispatch_table :: nquic_dispatch:t(), listener :: pid(), opts :: map(), static_key :: binary(), max_new_conns_per_sec :: non_neg_integer(), rate_count :: non_neg_integer(), rate_window_start :: integer(), retry :: boolean(), retry_token_lifetime :: pos_integer(), ecn :: boolean(), gro :: boolean()}.
-spec check_rate_limit(#state{socket :: nquic_socket:t(), select_info :: nquic_socket:select_info() | undefined, dispatch_table :: nquic_dispatch:t(), listener :: pid(), opts :: map(), static_key :: binary(), max_new_conns_per_sec :: non_neg_integer(), rate_count :: non_neg_integer(), rate_window_start :: integer(), retry :: boolean(), retry_token_lifetime :: pos_integer(), ecn :: boolean(), gro :: boolean()}) -> {boolean(), #state{socket :: nquic_socket:t(), select_info :: nquic_socket:select_info() | undefined, dispatch_table :: nquic_dispatch:t(), listener :: pid(), opts :: map(), static_key :: binary(), max_new_conns_per_sec :: non_neg_integer(), rate_count :: non_neg_integer(), rate_window_start :: integer(), retry :: boolean(), retry_token_lifetime :: pos_integer(), ecn :: boolean(), gro :: boolean()}}.
-spec dispatch_packet(nquic_socket:sockaddr(), binary(), #state{socket :: nquic_socket:t(), select_info :: nquic_socket:select_info() | undefined, dispatch_table :: nquic_dispatch:t(), listener :: pid(), opts :: map(), static_key :: binary(), max_new_conns_per_sec :: non_neg_integer(), rate_count :: non_neg_integer(), rate_window_start :: integer(), retry :: boolean(), retry_token_lifetime :: pos_integer(), ecn :: boolean(), gro :: boolean()}) -> #state{socket :: nquic_socket:t(), select_info :: nquic_socket:select_info() | undefined, dispatch_table :: nquic_dispatch:t(), listener :: pid(), opts :: map(), static_key :: binary(), max_new_conns_per_sec :: non_neg_integer(), rate_count :: non_neg_integer(), rate_window_start :: integer(), retry :: boolean(), retry_token_lifetime :: pos_integer(), ecn :: boolean(), gro :: boolean()}.
-spec fast_dispatch(binary(), nquic_dispatch:t()) -> {ok, pid()} | slow.
-spec get_dcid(#long_header{type :: initial | handshake | rtt0 | retry | version_negotiation, version :: 0..4294967295, dcid :: nquic:connection_id(), scid :: nquic:connection_id(), token :: binary() | undefined, payload_len :: non_neg_integer() | undefined, packet_number :: nquic_packet_number:t() | undefined, pn_len :: 1..4 | undefined} | #short_header{dcid :: nquic:connection_id(), packet_number :: nquic_packet_number:t() | undefined, key_phase :: boolean(), spin :: 0..1, pn_len :: 1..4 | undefined}) -> binary().
-spec get_port(pid()) -> {ok, inet:port_number()} | {error, nquic_error:any_reason()}.
Return the port number this receiver's socket is bound to.
-spec handle_call(get_port | term(), gen_server:from(), #state{socket :: nquic_socket:t(), select_info :: nquic_socket:select_info() | undefined, dispatch_table :: nquic_dispatch:t(), listener :: pid(), opts :: map(), static_key :: binary(), max_new_conns_per_sec :: non_neg_integer(), rate_count :: non_neg_integer(), rate_window_start :: integer(), retry :: boolean(), retry_token_lifetime :: pos_integer(), ecn :: boolean(), gro :: boolean()}) -> {reply, term(), #state{socket :: nquic_socket:t(), select_info :: nquic_socket:select_info() | undefined, dispatch_table :: nquic_dispatch:t(), listener :: pid(), opts :: map(), static_key :: binary(), max_new_conns_per_sec :: non_neg_integer(), rate_count :: non_neg_integer(), rate_window_start :: integer(), retry :: boolean(), retry_token_lifetime :: pos_integer(), ecn :: boolean(), gro :: boolean()}}.
-spec handle_cast(term(), #state{socket :: nquic_socket:t(), select_info :: nquic_socket:select_info() | undefined, dispatch_table :: nquic_dispatch:t(), listener :: pid(), opts :: map(), static_key :: binary(), max_new_conns_per_sec :: non_neg_integer(), rate_count :: non_neg_integer(), rate_window_start :: integer(), retry :: boolean(), retry_token_lifetime :: pos_integer(), ecn :: boolean(), gro :: boolean()}) -> {noreply, #state{socket :: nquic_socket:t(), select_info :: nquic_socket:select_info() | undefined, dispatch_table :: nquic_dispatch:t(), listener :: pid(), opts :: map(), static_key :: binary(), max_new_conns_per_sec :: non_neg_integer(), rate_count :: non_neg_integer(), rate_window_start :: integer(), retry :: boolean(), retry_token_lifetime :: pos_integer(), ecn :: boolean(), gro :: boolean()}}.
-spec handle_info(term(), #state{socket :: nquic_socket:t(), select_info :: nquic_socket:select_info() | undefined, dispatch_table :: nquic_dispatch:t(), listener :: pid(), opts :: map(), static_key :: binary(), max_new_conns_per_sec :: non_neg_integer(), rate_count :: non_neg_integer(), rate_window_start :: integer(), retry :: boolean(), retry_token_lifetime :: pos_integer(), ecn :: boolean(), gro :: boolean()}) -> {noreply, #state{socket :: nquic_socket:t(), select_info :: nquic_socket:select_info() | undefined, dispatch_table :: nquic_dispatch:t(), listener :: pid(), opts :: map(), static_key :: binary(), max_new_conns_per_sec :: non_neg_integer(), rate_count :: non_neg_integer(), rate_window_start :: integer(), retry :: boolean(), retry_token_lifetime :: pos_integer(), ecn :: boolean(), gro :: boolean()}}.
-spec init(map()) -> {ok, #state{socket :: nquic_socket:t(), select_info :: nquic_socket:select_info() | undefined, dispatch_table :: nquic_dispatch:t(), listener :: pid(), opts :: map(), static_key :: binary(), max_new_conns_per_sec :: non_neg_integer(), rate_count :: non_neg_integer(), rate_window_start :: integer(), retry :: boolean(), retry_token_lifetime :: pos_integer(), ecn :: boolean(), gro :: boolean()}} | {stop, term()}.
-spec maybe_retry(binary() | undefined, nquic_socket:sockaddr(), #state{socket :: nquic_socket:t(), select_info :: nquic_socket:select_info() | undefined, dispatch_table :: nquic_dispatch:t(), listener :: pid(), opts :: map(), static_key :: binary(), max_new_conns_per_sec :: non_neg_integer(), rate_count :: non_neg_integer(), rate_window_start :: integer(), retry :: boolean(), retry_token_lifetime :: pos_integer(), ecn :: boolean(), gro :: boolean()}) -> proceed | {retry, nquic:connection_id()} | send_retry.
-spec slow_dispatch(nquic_socket:sockaddr(), binary(), nquic_dispatch:t(), #state{socket :: nquic_socket:t(), select_info :: nquic_socket:select_info() | undefined, dispatch_table :: nquic_dispatch:t(), listener :: pid(), opts :: map(), static_key :: binary(), max_new_conns_per_sec :: non_neg_integer(), rate_count :: non_neg_integer(), rate_window_start :: integer(), retry :: boolean(), retry_token_lifetime :: pos_integer(), ecn :: boolean(), gro :: boolean()}) -> #state{socket :: nquic_socket:t(), select_info :: nquic_socket:select_info() | undefined, dispatch_table :: nquic_dispatch:t(), listener :: pid(), opts :: map(), static_key :: binary(), max_new_conns_per_sec :: non_neg_integer(), rate_count :: non_neg_integer(), rate_window_start :: integer(), retry :: boolean(), retry_token_lifetime :: pos_integer(), ecn :: boolean(), gro :: boolean()}.
Start a receiver process with the given options.
-spec terminate(term(), #state{socket :: nquic_socket:t(), select_info :: nquic_socket:select_info() | undefined, dispatch_table :: nquic_dispatch:t(), listener :: pid(), opts :: map(), static_key :: binary(), max_new_conns_per_sec :: non_neg_integer(), rate_count :: non_neg_integer(), rate_window_start :: integer(), retry :: boolean(), retry_token_lifetime :: pos_integer(), ecn :: boolean(), gro :: boolean()}) -> ok.