Skip to main content

include/masque_ip.hrl

%%% -*- 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.