%%% -*- erlang -*-
%%%
%%% CONNECT-IP (RFC 9484) protocol constants — IANA "HTTP Capsule Types"
%%% registrations, context-ID assignments, and IP-layer wire constants.
-ifndef(MASQUE_IP_HRL).
-define(MASQUE_IP_HRL, true).
%%====================================================================
%% Extended CONNECT
%%====================================================================
-define(MASQUE_CONNECT_IP_PROTOCOL, <<"connect-ip">>).
-define(MASQUE_DEFAULT_IP_URI_PATH_PATTERN,
<<"/.well-known/masque/ip/{target}/{ipproto}/">>).
%%====================================================================
%% Capsule types (RFC 9484 §5)
%%====================================================================
-define(MASQUE_CAPSULE_ADDRESS_ASSIGN, 16#01).
-define(MASQUE_CAPSULE_ADDRESS_REQUEST, 16#02).
-define(MASQUE_CAPSULE_ROUTE_ADVERTISEMENT, 16#03).
%%====================================================================
%% Datagram context IDs (RFC 9484 §6)
%%====================================================================
%% Context ID 0 carries full IP packets. Non-zero context IDs are
%% reserved for extensions; the receiver must buffer briefly then
%% drop unregistered context IDs.
-define(MASQUE_CONTEXT_ID_IP, 0).
%%====================================================================
%% IP layer
%%====================================================================
-define(MASQUE_IP_VERSION_V4, 4).
-define(MASQUE_IP_VERSION_V6, 6).
%% "Any protocol" wildcard for ROUTE_ADVERTISEMENT ranges.
-define(MASQUE_IP_PROTO_ALL, 0).
%% IPv6 minimum MTU (RFC 8200 §5). The mandatory abort in RFC 9484 §8
%% for H3+QUIC-DATAGRAM tunnels uses this value.
-define(MASQUE_IPV6_MIN_MTU, 1280).
%% IPv4 minimum reassembly buffer size from RFC 791.
-define(MASQUE_IPV4_MIN_MTU, 576).
%%====================================================================
%% Records
%%====================================================================
-record(ip_assignment, {
request_id :: non_neg_integer(), %% 0 = unprompted
version :: 4 | 6,
address :: inet:ip_address(),
prefix_len :: 0..128
}).
-record(ip_prefix_request, {
request_id :: pos_integer(), %% nonzero per §4.7.2
version :: 4 | 6,
address :: inet:ip_address(),
prefix_len :: 0..128
}).
-record(ip_route, {
version :: 4 | 6,
start_addr :: inet:ip_address(),
end_addr :: inet:ip_address(),
ip_protocol :: 0..255
}).
-endif.