<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.39 (Ruby 3.4.9) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-kuehlewind-happy-qlog-00" category="info" consensus="true" submissionType="IETF" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.0 -->
  <front>
    <title abbrev="HEv3 qlog">Happy Eyeballs v3 (HEv3) Event Logging with qlog</title>
    <seriesInfo name="Internet-Draft" value="draft-kuehlewind-happy-qlog-00"/>
    <author fullname="Mirja Kühlewind">
      <organization>Ericsson</organization>
      <address>
        <email>mirja.kuehlewind@ericsson.com</email>
      </address>
    </author>
    <date year="2026" month="July" day="06"/>
    <area>Web and Internet Transport</area>
    <workgroup>Heuristics and Algorithms to Prioritize Protocol deploYment</workgroup>
    <keyword>qlog</keyword>
    <keyword>HEv3</keyword>
    <abstract>
      <?line 49?>

<t>This document specifies a qlog extension for Happy Eyeballs v3 (HEv3), enabling
logging of dual-stack and multi-protocol connection racing behavior. It defines
a dedicated event schema, event names, and data structures that capture DNS
resolution timing, SVCB/HTTPS service discovery, candidate sorting and grouping,
connection attempt scheduling and racing, NAT64 prefix discovery,
success/failure outcomes, and summary metrics.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://mirjak.github.io/draft-happy-glog/draft-kuehlewind-happy-glog.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-kuehlewind-happy-qlog/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Heuristics and Algorithms to Prioritize Protocol deploYment Working Group mailing list (<eref target="mailto:happy@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/happy/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/happy/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/mirjak/draft-happy-glog"/>.</t>
    </note>
  </front>
  <middle>
    <?line 58?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>Happy Eyeballs helps applications reduce connection latency on dual-stack
networks. Happy Eyeballs v3 (HEv3) extends racing from IPv4/IPv6 to include
TCP+TLS and QUIC/HTTP3, and incorporates SVCB/HTTPS service discovery.
Detailed logging of HEv3 behavior enables operators and developers to
diagnose connection establishment failures and identify network issues that
would otherwise be hidden by the racing algorithm.
This document defines a qlog event schema that provides logging and
visibility into HEv3 decision-making and timing.</t>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

</section>
    <section anchor="event-schema-definition">
      <name>Event Schema Definition</name>
      <t>This document  proposes a qlog schema for HEv3 using the newly defined event schema <tt>urn:ietf:params:qlog:events:hev3</tt>.</t>
      <section anchor="draft-event-schema-identification">
        <name>Draft Event Schema Identification</name>
        <t>This section is to be removed before publishing as an RFC.</t>
        <t>Only implementations of the final, published RFC can use the events belonging to the event schema with the URI <tt>urn:ietf:params:qlog:events:hev3</tt>. Until such an RFC exists, implementations <bcp14>MUST NOT</bcp14> identify themselves using this URI.</t>
        <t>Implementations of draft versions of the event schema <bcp14>MUST</bcp14> append the string "-" and the corresponding draft number to the URI. For example, draft 01 of this document is identified using the URI urn:ietf:params:qlog:events:hev3-01.</t>
        <t>The namespace identifier itself is not affected by this requirement.</t>
      </section>
    </section>
    <section anchor="he-data-types">
      <name>HE Data Types</name>
      <section anchor="attempt-target">
        <name>Attempt Target</name>
        <sourcecode type="cddl"><![CDATA[
HEAttemptTarget = {
        address: text
        port: uint16
        family: "ipv4" / "ipv6"
        interface: text ?
        path_id: text ?
        alpn: [+ text] ?
        service_name: text ?
        service_priority: uint32 ?
        ech_offered: bool ?

        * $he-attempttarget-extension
}
]]></sourcecode>
        <t>The following fields are defined:</t>
        <ul spacing="normal">
          <li>
            <t><tt>address</tt>: The IP address of the target endpoint.</t>
          </li>
          <li>
            <t><tt>port</tt>: The destination port number.</t>
          </li>
          <li>
            <t><tt>family</tt>: The address family, either <tt>"ipv4"</tt> or <tt>"ipv6"</tt>.</t>
          </li>
          <li>
            <t><tt>interface</tt>: The local network interface used for this attempt.</t>
          </li>
          <li>
            <t><tt>path_id</tt>: An implementation-defined identifier for the network path.</t>
          </li>
          <li>
            <t><tt>alpn</tt>: The negotiated ALPN set for this target derived from SVCB records.</t>
          </li>
          <li>
            <t><tt>service_name</tt>: The SVCB ServiceMode TargetName this target originates from.</t>
          </li>
          <li>
            <t><tt>service_priority</tt>: The SVCB SvcPriority value for this target's service.</t>
          </li>
          <li>
            <t><tt>ech_offered</tt>: Whether ECH will be attempted on this connection.</t>
          </li>
        </ul>
      </section>
      <section anchor="policy">
        <name>Policy</name>
        <sourcecode type="cddl"><![CDATA[
HEPolicy = {
        resolution_delay_ms: uint32 ?
        preferred_address_family_count: uint32 ?
        connection_attempt_delay_ms: uint32 ?
        min_connection_attempt_delay_ms: uint32 ?
        max_connection_attempt_delay_ms: uint32 ?
        max_parallel_attempts: uint32 ?
        last_resort_local_synthesis_delay_ms: uint32 ?
        preferred_family: "ipv4" / "ipv6" / "auto" ?
        success_definition:
                "tcp_connected" /
                "tls_handshake_complete" /
                "quic_1rtt_ready" ?
        use_historical_rtt: bool ?

        * $he-policy-extension
}
]]></sourcecode>
        <t>The fields correspond to the configurable values defined in Section 9 of HEv3:</t>
        <ul spacing="normal">
          <li>
            <t><tt>resolution_delay_ms</tt>: Time to wait for preferred-family and SVCB/HTTPS
records after receiving initial answers (recommended 50ms).</t>
          </li>
          <li>
            <t><tt>preferred_address_family_count</tt>: Number of addresses of the preferred
family attempted before trying the other family (recommended 1).</t>
          </li>
          <li>
            <t><tt>connection_attempt_delay_ms</tt>: Delay between connection attempts in the
absence of RTT data (recommended 250ms).</t>
          </li>
          <li>
            <t><tt>min_connection_attempt_delay_ms</tt>: Floor for the connection attempt delay
(recommended 100ms, must not be less than 10ms).</t>
          </li>
          <li>
            <t><tt>max_connection_attempt_delay_ms</tt>: Ceiling for the connection attempt delay
(recommended 2s).</t>
          </li>
          <li>
            <t><tt>max_parallel_attempts</tt>: Maximum number of connection attempts allowed
in parallel.</t>
          </li>
          <li>
            <t><tt>last_resort_local_synthesis_delay_ms</tt>: Time to wait before querying A
records for local NAT64 synthesis when AAAA attempts are failing on
IPv6-only networks (recommended 2s).</t>
          </li>
          <li>
            <t><tt>preferred_family</tt>: The address family assumed to have better connectivity.</t>
          </li>
          <li>
            <t><tt>success_definition</tt>: What constitutes a successful connection establishment.</t>
          </li>
          <li>
            <t><tt>use_historical_rtt</tt>: Whether historical RTT data is used to order
destinations and adjust attempt delays.</t>
          </li>
        </ul>
        <t>If omitted, <tt>success_definition</tt> defaults to:</t>
        <ul spacing="normal">
          <li>
            <t><tt>tcp_connected</tt> for plain TCP stacks</t>
          </li>
          <li>
            <t><tt>tls_handshake_complete</tt> for TCP+TLS stacks </t>
          </li>
          <li>
            <t><tt>quic_1rtt_ready</tt> for QUIC stacks</t>
          </li>
        </ul>
      </section>
      <section anchor="dns-result">
        <name>DNS Result</name>
        <t>DNS results can represent either address records (A/AAAA) or service records (SVCB/HTTPS).</t>
        <sourcecode type="cddl"><![CDATA[
HEDNSResult = HEDNSAddressResult / HEDNSServiceResult

HEDNSAddressResult = {
        type: "address"
        address: text
        family: "ipv4" / "ipv6"
        ttl_s: uint32 ?

        * $he-dnsaddressresult-extension
}

HEDNSServiceResult = {
        type: "service"
        mode: "alias" / "servicemode"
        target_name: text
        priority: uint32 ?
        alpn: [+ text] ?
        no_default_alpn: bool ?
        ech_config: text ?
        ipv4hint: [+ text] ?
        ipv6hint: [+ text] ?
        ttl_s: uint32 ?

        * $he-dnsserviceresult-extension
}
]]></sourcecode>
        <t>The <tt>mode</tt> field distinguishes AliasMode records (which require a follow-up
query) from ServiceMode records that carry usable service parameters.</t>
        <t>The following fields are defined for <tt>HEDNSAddressResult</tt>:</t>
        <ul spacing="normal">
          <li>
            <t><tt>type</tt>: Always <tt>"address"</tt> for this variant.</t>
          </li>
          <li>
            <t><tt>address</tt>: The resolved IP address.</t>
          </li>
          <li>
            <t><tt>family</tt>: The address family, either <tt>"ipv4"</tt> or <tt>"ipv6"</tt>.</t>
          </li>
          <li>
            <t><tt>ttl_s</tt>: The DNS TTL in seconds.</t>
          </li>
        </ul>
        <t>The following fields are defined for <tt>HEDNSServiceResult</tt>:</t>
        <ul spacing="normal">
          <li>
            <t><tt>type</tt>: Always <tt>"service"</tt> for this variant.</t>
          </li>
          <li>
            <t><tt>mode</tt>: Either <tt>"alias"</tt> (AliasMode, requires follow-up query) or
<tt>"servicemode"</tt> (carries usable parameters).</t>
          </li>
          <li>
            <t><tt>target_name</tt>: The SVCB TargetName (use <tt>"."</tt> for the owner name).</t>
          </li>
          <li>
            <t><tt>priority</tt>: The SVCB SvcPriority value.</t>
          </li>
          <li>
            <t><tt>alpn</tt>: The list of supported application protocols from the <tt>alpn</tt> key.</t>
          </li>
          <li>
            <t><tt>no_default_alpn</tt>: Whether the <tt>no-default-alpn</tt> key is present.</t>
          </li>
          <li>
            <t><tt>ech_config</tt>: Base64-encoded ECHConfigList from the <tt>ech</tt> key.</t>
          </li>
          <li>
            <t><tt>ipv4hint</tt>: IPv4 address hints from the <tt>ipv4hint</tt> key.</t>
          </li>
          <li>
            <t><tt>ipv6hint</tt>: IPv6 address hints from the <tt>ipv6hint</tt> key.</t>
          </li>
          <li>
            <t><tt>ttl_s</tt>: The DNS TTL in seconds.</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="event-definitions">
      <name>Event Definitions</name>
      <t>Each event uses: 
        <tt>name: "hev3:&lt;event&gt;"</tt>
with the <tt>&lt;event&gt;</tt> type identifier defined below in the section headings.</t>
      <t>All events include a <tt>he_session_id</tt> field that uniquely identifies the
Happy Eyeballs session. This allows correlation of all events belonging
to a single connection establishment attempt.</t>
      <section anchor="event-configset">
        <name>Event: config_set</name>
        <t>Logged when the HE policy is configured or updated during a session.</t>
        <sourcecode type="cddl"><![CDATA[
HEConfigSet = {
        he_session_id: text
        policy: HEPolicy
        reason:
                "startup" /
                "app_config" /
                "network_change"

        * $$he-configset-extension
}
]]></sourcecode>
        <t>The <tt>policy</tt> field contains the policy configuration. The <tt>reason</tt> field
indicates what triggered the configuration:</t>
        <ul spacing="normal">
          <li>
            <t><tt>"startup"</tt>: Default policy applied at application start.</t>
          </li>
          <li>
            <t><tt>"app_config"</tt>: Policy provided by the application.</t>
          </li>
          <li>
            <t><tt>"network_change"</tt>: Policy updated in response to a network transition.</t>
          </li>
        </ul>
        <t>The first occurrence of this event in a session represents the initial
configuration; typical reasons are <tt>"startup"</tt> or <tt>"app_config"</tt>.
Subsequent occurrences represent policy updates.</t>
      </section>
      <section anchor="event-dnsquerystarted">
        <name>Event: dns_query_started</name>
        <t>Logged when a DNS query is initiated as part of hostname resolution.</t>
        <sourcecode type="cddl"><![CDATA[
HEDNSQueryStarted = {
        he_session_id: text
        dns_id: text
        hostname: text
        qtypes: [+ "A" / "AAAA" / "SVCB" / "HTTPS"]
        bootstrap_hint: text ?

        * $$he-dnsquerystarted-extension
}
]]></sourcecode>
        <t>The <tt>dns_id</tt> uniquely identifies this query within the session and is used
to correlate with the corresponding <tt>dns_query_finished</tt> event. The
<tt>hostname</tt> is the name being resolved. The <tt>qtypes</tt> array lists the DNS
record types being queried. The <tt>bootstrap_hint</tt> field optionally contains
an address hint used to reach the DNS resolver itself.</t>
      </section>
      <section anchor="event-dnsqueryfinished">
        <name>Event: dns_query_finished</name>
        <t>Logged when a DNS query completes with results, an error, or a negative
response.</t>
        <sourcecode type="cddl"><![CDATA[
HEDNSQueryFinished = {
        he_session_id: text
        dns_id: text
        hostname: text
        results: [* HEDNSResult]
        answer_type: "positive" / "negative" / "error" ?
        error_code: text ?
        error_message: text ?
        duration_ms: uint32
        dnssec_validated: bool ?
        is_alias_follow: bool ?

        * $$he-dnsqueryfinished-extension
}
]]></sourcecode>
        <t>The <tt>answer_type</tt> field distinguishes positive (non-empty) from negative
(empty, no error) and error responses, which is significant for HEv3's
async resolution logic (Section 4.2). The <tt>dnssec_validated</tt> field indicates
whether the response was cryptographically validated, relevant for
determining whether SVCB-dependent handshakes must be pended (Section 6.3).
The <tt>is_alias_follow</tt> field is set to true when this query was triggered
by an AliasMode SVCB/HTTPS record requiring a follow-up resolution.</t>
      </section>
      <section anchor="event-nat64prefixdiscovered">
        <name>Event: nat64_prefix_discovered</name>
        <t>Logged when the client discovers a NAT64 prefix for use on an IPv6-only
network (Section 8 of HEv3).</t>
        <sourcecode type="cddl"><![CDATA[
HENat64PrefixDiscovered = {
        he_session_id: text
        prefix: text
        prefix_length: uint32
        source: "pref64_ra" / "rfc7050_discovery" / "dns64_inferred"

        * $$he-nat64prefixdiscovered-extension
}
]]></sourcecode>
        <t>The <tt>source</tt> field indicates how the prefix was obtained:</t>
        <ul spacing="normal">
          <li>
            <t><tt>"pref64_ra"</tt>: Learned from a Router Advertisement (RFC 8781).</t>
          </li>
          <li>
            <t><tt>"rfc7050_discovery"</tt>: Discovered via the well-known name lookup (RFC 7050).</t>
          </li>
          <li>
            <t><tt>"dns64_inferred"</tt>: Inferred from DNS64 behavior on the network.</t>
          </li>
        </ul>
      </section>
      <section anchor="event-candidatediscovered">
        <name>Event: candidate_discovered</name>
        <sourcecode type="cddl"><![CDATA[
HECandidateDiscovered = {
        he_session_id: text
        source: "dns" / "svcb_hint" / "nat64_synthesis"
        target: HEAttemptTarget
        group_id: text ?
        supersedes: text ?

        * $$he-candidatediscovered-extension
}
]]></sourcecode>
        <t>The <tt>source</tt> value <tt>"dns"</tt> indicates the address came from A or AAAA
records. The <tt>"svcb_hint"</tt> value indicates the address came from ipv4hint
or ipv6hint parameters in a SVCB/HTTPS record. The <tt>"nat64_synthesis"</tt>
value indicates a locally synthesized IPv6 address for NAT64 traversal.</t>
        <t>The <tt>group_id</tt> field identifies which protocol/priority group this candidate
belongs to (per Section 5.1 and 5.2 of HEv3). The <tt>supersedes</tt> field
contains the address of an SVCB hint that this candidate replaces once
authoritative A/AAAA records arrive (per Section 7 of HEv3).</t>
      </section>
      <section anchor="event-candidatessorted">
        <name>Event: candidates_sorted</name>
        <t>Logged once sufficient DNS answers have been received (per Section 4.2 of
HEv3) and the implementation has applied the three-level sorting algorithm
(Section 5). This event captures the full grouped and ordered candidate list
before racing begins.</t>
        <sourcecode type="cddl"><![CDATA[
HECandidatesSorted = {
        he_session_id: text
        groups: [+ HECandidateGroup]

        * $$he-candidatessorted-extension
}

HECandidateGroup = {
        group_id: text
        alpn: [+ text] ?
        ech_available: bool ?
        service_priority: uint32 ?
        candidates: [+ HEAttemptTarget]
}
]]></sourcecode>
        <t>The <tt>groups</tt> array is ordered by priority. Within each group:</t>
        <ul spacing="normal">
          <li>
            <t><tt>alpn</tt> captures the application protocol set that defines this group
(Section 5.1 of HEv3).</t>
          </li>
          <li>
            <t><tt>ech_available</tt> indicates whether ECH configuration is available for
endpoints in this group (Section 5.1 of HEv3).</t>
          </li>
          <li>
            <t><tt>service_priority</tt> reflects the SVCB SvcPriority value for this group
(Section 5.2 of HEv3). Groups with equal priority are shuffled
randomly.</t>
          </li>
          <li>
            <t><tt>candidates</tt> is ordered per Section 5.3 of HEv3: RFC 6724 destination
address selection, historical RTT preferences, and address family
interleaving applied.</t>
          </li>
        </ul>
        <t>For simple cases without SVCB records, a single group with all candidates
is sufficient.</t>
      </section>
      <section anchor="event-candidateremoved">
        <name>Event: candidate_removed</name>
        <t>Logged when a candidate address is removed from the list during connection
setup (per Section 7 of HEv3).</t>
        <sourcecode type="cddl"><![CDATA[
HECandidateRemoved = {
        he_session_id: text
        target: HEAttemptTarget
        reason: "ttl_expired" / "svcb_hint_replaced" / "dns_negative" / "alpn_mismatch"
        had_active_attempt: bool ?

        * $$he-candidateremoved-extension
}
]]></sourcecode>
        <t>The <tt>reason</tt> field indicates why the candidate was removed:</t>
        <ul spacing="normal">
          <li>
            <t><tt>"ttl_expired"</tt>: The DNS TTL for this address expired before an attempt
was started.</t>
          </li>
          <li>
            <t><tt>"svcb_hint_replaced"</tt>: Authoritative A/AAAA records arrived and this
hint address was absent from them (Section 7.3 of SVCB).</t>
          </li>
          <li>
            <t><tt>"dns_negative"</tt>: A previously positive record was replaced by a negative
response (e.g., via DNS push notification).</t>
          </li>
          <li>
            <t><tt>"alpn_mismatch"</tt>: The SVCB ALPN set does not contain protocols the
client supports (Section 6.2 of HEv3).</t>
          </li>
        </ul>
        <t>The <tt>had_active_attempt</tt> field indicates whether an in-progress attempt
exists for this target; per HEv3 Section 7, such attempts are not
canceled.</t>
      </section>
      <section anchor="event-candidatesresorted">
        <name>Event: candidates_resorted</name>
        <t>Logged when the candidate list is re-sorted due to new addresses arriving
mid-race (per Section 7 of HEv3). Re-sorting ensures that address family
interleaving and priority rules are maintained correctly regardless of when
addresses arrive.</t>
        <sourcecode type="cddl"><![CDATA[
HECandidatesResorted = {
        he_session_id: text
        reason: "new_addresses" / "new_svcb" / "dns_push"
        new_order: [+ HEAttemptTarget]

        * $$he-candidatesresorted-extension
}
]]></sourcecode>
        <t>The <tt>reason</tt> field captures why re-sorting occurred:</t>
        <ul spacing="normal">
          <li>
            <t><tt>"new_addresses"</tt>: New A/AAAA records arrived (e.g., delayed IPv4 after
an IPv6-only start).</t>
          </li>
          <li>
            <t><tt>"new_svcb"</tt>: New SVCB/HTTPS ServiceMode records changed grouping or
priorities.</t>
          </li>
          <li>
            <t><tt>"dns_push"</tt>: A DNS push notification added addresses.</t>
          </li>
        </ul>
        <t>The <tt>new_order</tt> array contains the full re-sorted candidate list as
<tt>HEAttemptTarget</tt> elements. Position in the array implies the new rank.
Only pending candidates (those not yet attempted or currently in progress)
are included.</t>
      </section>
      <section anchor="event-attemptscheduled">
        <name>Event: attempt_scheduled</name>
        <t>Logged when a connection attempt is scheduled to start after a delay.</t>
        <sourcecode type="cddl"><![CDATA[
HEAttemptScheduled = {
        he_session_id: text
        attempt_id: text
        target: HEAttemptTarget
        scheduled_after_ms: uint32
        reason:
                "policy_timer" /
                "dns_completed" /
                "resolution_delay_expired" /
                "last_resort_synthesis"

        * $$he-attemptscheduled-extension
}
]]></sourcecode>
        <t>The <tt>attempt_id</tt> uniquely identifies this attempt within the session. The
<tt>scheduled_after_ms</tt> field indicates the delay before the attempt will
start. The <tt>reason</tt> field indicates what triggered scheduling:</t>
        <ul spacing="normal">
          <li>
            <t><tt>"policy_timer"</tt>: The Next Connection Attempt Timer fired.</t>
          </li>
          <li>
            <t><tt>"dns_completed"</tt>: DNS resolution completed, enabling the first attempt.</t>
          </li>
          <li>
            <t><tt>"resolution_delay_expired"</tt>: The Resolution Delay timer expired
(Section 4.2 of HEv3).</t>
          </li>
          <li>
            <t><tt>"last_resort_synthesis"</tt>: The Last Resort Local Synthesis Delay expired,
triggering a fallback A query and NAT64 synthesis (Section 8.4 of HEv3).</t>
          </li>
        </ul>
      </section>
      <section anchor="event-attemptstarted">
        <name>Event: attempt_started</name>
        <t>Logged when a connection attempt begins (i.e., the first packet is sent).</t>
        <sourcecode type="cddl"><![CDATA[
HEAttemptStarted = {
        he_session_id: text
        attempt_id: text
        target: HEAttemptTarget
        transport: "tcp" / "quic"
        ref_event_id: text ?

        * $$he-attemptstarted-extension
}
]]></sourcecode>
        <t>The <tt>transport</tt> field indicates the transport protocol used for this
attempt. The <tt>ref_event_id</tt> field may reference a related event in another
qlog event schema; QUIC implementations should set it to the relevant
<tt>connectivity:connection_started</tt> event.</t>
      </section>
      <section anchor="event-attemptpended">
        <name>Event: attempt_pended</name>
        <t>Logged when a connection attempt's TLS handshake must be paused until
SVCB/HTTPS responses are received, as required by Section 6.3 of HEv3
(e.g., when DNS is cryptographically protected and ECH configuration
is expected from SVCB records).</t>
        <sourcecode type="cddl"><![CDATA[
HEAttemptPended = {
        he_session_id: text
        attempt_id: text
        reason: "awaiting_svcb" / "awaiting_ech_config" / "dnssec_validation"
        waiting_for: text ?

        * $$he-attemptpended-extension
}
]]></sourcecode>
        <t>The <tt>waiting_for</tt> field may reference the <tt>dns_id</tt> of the outstanding
SVCB/HTTPS query.</t>
      </section>
      <section anchor="event-attemptresumed">
        <name>Event: attempt_resumed</name>
        <t>Logged when a previously pended attempt resumes its handshake.</t>
        <sourcecode type="cddl"><![CDATA[
HEAttemptResumed = {
        he_session_id: text
        attempt_id: text
        reason: "svcb_received" / "timeout" / "policy_override"

        * $$he-attemptresumed-extension
}
]]></sourcecode>
        <t>The <tt>reason</tt> field indicates what unblocked the attempt:</t>
        <ul spacing="normal">
          <li>
            <t><tt>"svcb_received"</tt>: The awaited SVCB/HTTPS response arrived.</t>
          </li>
          <li>
            <t><tt>"timeout"</tt>: A timeout expired while waiting; proceeding without the
expected information.</t>
          </li>
          <li>
            <t><tt>"policy_override"</tt>: The implementation decided to proceed despite not
receiving the expected response (e.g., opportunistic ECH).</t>
          </li>
        </ul>
      </section>
      <section anchor="event-attemptoutcome">
        <name>Event: attempt_outcome</name>
        <t>Logged when a connection attempt reaches a terminal state.</t>
        <sourcecode type="cddl"><![CDATA[
HEAttemptOutcome = {
        he_session_id: text
        attempt_id: text
        result: "success" / "failure" / "timeout" / "canceled"
        error_code: text ?
        connect_duration_ms: uint32 ?

        * $$he-attemptoutcome-extension
}
]]></sourcecode>
        <t>The <tt>result</tt> field indicates the outcome:</t>
        <ul spacing="normal">
          <li>
            <t><tt>"success"</tt>: The connection was established per the <tt>success_definition</tt>
in the policy.</t>
          </li>
          <li>
            <t><tt>"failure"</tt>: The attempt failed (e.g., connection refused, TLS error).</t>
          </li>
          <li>
            <t><tt>"timeout"</tt>: The attempt timed out without completing.</t>
          </li>
          <li>
            <t><tt>"canceled"</tt>: The attempt was canceled because another attempt succeeded.</t>
          </li>
        </ul>
        <t>The <tt>error_code</tt> field contains a protocol-specific error code on failure.
The <tt>connect_duration_ms</tt> field records the time from attempt start to
outcome.</t>
      </section>
      <section anchor="event-nextattempttimerset">
        <name>Event: next_attempt_timer_set</name>
        <t>Logged when the Next Connection Attempt Timer is set or adjusted. This
timer controls when the next connection attempt begins (Section 6 of HEv3).</t>
        <sourcecode type="cddl"><![CDATA[
HENextAttemptTimerSet = {
        he_session_id: text
        delay_ms: uint32
        reason: "initial" / "rtt_based" / "handshake_progress" ?

        * $$he-nextattemptimerset-extension
}
]]></sourcecode>
        <t>The <tt>reason</tt> field captures why the delay was chosen:</t>
        <ul spacing="normal">
          <li>
            <t><tt>"initial"</tt>: Using the configured Connection Attempt Delay.</t>
          </li>
          <li>
            <t><tt>"rtt_based"</tt>: Delay derived from historical RTT data or estimated
retransmission timeout.</t>
          </li>
          <li>
            <t><tt>"handshake_progress"</tt>: Timer extended after partial handshake completion
(e.g., TCP connected, waiting for TLS — per Section 6.1 of HEv3).</t>
          </li>
        </ul>
      </section>
      <section anchor="event-nextattempttimerfired">
        <name>Event: next_attempt_timer_fired</name>
        <t>Logged when the timer fires and the next connection attempt is triggered.</t>
        <sourcecode type="cddl"><![CDATA[
HENextAttemptTimerFired = {
        he_session_id: text

        * $$he-nextattemptimerfired-extension
}
]]></sourcecode>
      </section>
      <section anchor="event-nextattempttimercanceled">
        <name>Event: next_attempt_timer_canceled</name>
        <t>Logged when the timer is canceled before firing.</t>
        <sourcecode type="cddl"><![CDATA[
HENextAttemptTimerCanceled = {
        he_session_id: text
        reason: "success" / "abort" / "list_exhausted"

        * $$he-nextattemptimercanceled-extension
}
]]></sourcecode>
        <t>The <tt>reason</tt> field indicates why the timer was canceled:</t>
        <ul spacing="normal">
          <li>
            <t><tt>"success"</tt>: A connection attempt succeeded.</t>
          </li>
          <li>
            <t><tt>"abort"</tt>: The HE session was aborted.</t>
          </li>
          <li>
            <t><tt>"list_exhausted"</tt>: All candidates have been attempted.</t>
          </li>
        </ul>
      </section>
      <section anchor="event-connectionselected">
        <name>Event: connection_selected</name>
        <t>Logged when a successful connection attempt is chosen as the winning
connection for this HE session.</t>
        <sourcecode type="cddl"><![CDATA[
HEConnectionSelected = {
        he_session_id: text
        attempt_id: text
        ref_event_id: text ?

        * $$he-connectionselected-extension
}
]]></sourcecode>
        <t>The <tt>attempt_id</tt> identifies which attempt won. The <tt>ref_event_id</tt> field
may reference the corresponding transport-level event (e.g., a QUIC
<tt>connectivity:connection_started</tt> or TLS <tt>handshake_complete</tt>).</t>
      </section>
      <section anchor="event-connectionaborted">
        <name>Event: connection_aborted</name>
        <t>Logged when the entire HE session fails without establishing any connection.</t>
        <sourcecode type="cddl"><![CDATA[
HEConnectionAborted = {
        he_session_id: text
        reason: text

        * $$he-connectionaborted-extension
}
]]></sourcecode>
        <t>The <tt>reason</tt> field contains a human-readable or implementation-defined
description of why the session was aborted (e.g., "all attempts failed",
"no addresses resolved", "user canceled").</t>
      </section>
      <section anchor="event-metrics">
        <name>Event: metrics</name>
        <t>Logged at the end of an HE session to provide summary statistics.</t>
        <sourcecode type="cddl"><![CDATA[
HEMetrics = {
        he_session_id: text
        outcome: "success" / "aborted"
        total_duration_ms: uint32
        tt_first_success_ms: uint32 ?
        first_success_family: "ipv4" / "ipv6" ?
        first_success_transport: "tcp" / "quic" ?
        attempts_total: uint32
        attempts_success: uint32
        attempts_failure: uint32

        * $$he-metrics-extension
}
]]></sourcecode>
        <t>The fields capture end-to-end session statistics:</t>
        <ul spacing="normal">
          <li>
            <t><tt>outcome</tt>: Whether the session established a connection (<tt>"success"</tt>) or
failed entirely (<tt>"aborted"</tt>).</t>
          </li>
          <li>
            <t><tt>total_duration_ms</tt>: Total time from session start to final outcome
(connection selected or session aborted).</t>
          </li>
          <li>
            <t><tt>tt_first_success_ms</tt>: Time from session start to the first successful
connection attempt (i.e., time-to-first-byte readiness).</t>
          </li>
          <li>
            <t><tt>first_success_family</tt>: The address family of the first successful attempt.</t>
          </li>
          <li>
            <t><tt>first_success_transport</tt>: The transport protocol of the first successful
attempt.</t>
          </li>
          <li>
            <t><tt>attempts_total</tt>: Total number of connection attempts initiated.</t>
          </li>
          <li>
            <t><tt>attempts_success</tt>: Number of attempts that completed successfully.</t>
          </li>
          <li>
            <t><tt>attempts_failure</tt>: Number of attempts that failed, timed out, or were
canceled.</t>
          </li>
        </ul>
        <t>When <tt>outcome</tt> is <tt>"aborted"</tt>, the fields <tt>tt_first_success_ms</tt>,
<tt>first_success_family</tt>, and <tt>first_success_transport</tt> are not present.</t>
      </section>
      <section anchor="conformance-requirements">
        <name>Conformance Requirements</name>
        <ul spacing="normal">
          <li>
            <t>Every <tt>attempt_started</tt> <bcp14>MUST</bcp14> have exactly one <tt>attempt_outcome</tt>.</t>
          </li>
          <li>
            <t><tt>connection_selected</tt> <bcp14>MUST</bcp14> reference an attempt whose <tt>result</tt> is <tt>"success"</tt>.</t>
          </li>
          <li>
            <t>Exactly one <tt>metrics</tt> event <bcp14>SHOULD</bcp14> appear per HE session.</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="correlation-with-transport-protocols">
      <name>Correlation with transport protocols</name>
      <t>TCP/TLS implementation can correlate HE events with:</t>
      <ul spacing="normal">
        <li>
          <t><tt>tls:handshake_started</tt> </t>
        </li>
        <li>
          <t><tt>tls:handshake_complete</tt> </t>
        </li>
        <li>
          <t>TCP state transitions (if available in logs)</t>
        </li>
      </ul>
      <t>TBD</t>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>TBD</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document registers a new entry in the "qlog event schema URIs" registry (created in {Section 15 of QLOG-MAIN}):</t>
      <dl>
        <dt>Event schema URI:</dt>
        <dd>
          <t>urn:ietf:params:qlog:events:hev3</t>
        </dd>
        <dt>Namespace:</dt>
        <dd>
          <t>hev3</t>
        </dd>
        <dt>Event Types:</dt>
        <dd>
          <t>config_set, dns_query_started, dns_query_finished, nat64_prefix_discovered, candidate_discovered, candidates_sorted, candidate_removed, candidates_resorted, attempt_scheduled, attempt_started, attempt_pended, attempt_resumed, attempt_outcome, next_attempt_timer_set, next_attempt_timer_fired, next_attempt_timer_canceled, connection_selected, connection_aborted, metrics</t>
        </dd>
        <dt>Description:</dt>
        <dd>
          <t>Event definitions for logging HEv3 events</t>
        </dd>
        <dt>Reference:</dt>
        <dd>
          <t>This document</t>
        </dd>
      </dl>
    </section>
  </middle>
  <back>
    <references anchor="sec-normative-references">
      <name>Normative References</name>
      <reference anchor="QLOG-MAIN">
        <front>
          <title>qlog: Structured Logging for Network Protocols</title>
          <author fullname="Robin Marx" initials="R." surname="Marx">
            <organization>Akamai</organization>
          </author>
          <author fullname="Luca Niccolini" initials="L." surname="Niccolini">
            <organization>Meta</organization>
          </author>
          <author fullname="Marten Seemann" initials="M." surname="Seemann">
         </author>
          <author fullname="Lucas Pardue" initials="L." surname="Pardue">
            <organization>Cloudflare</organization>
          </author>
          <date day="6" month="July" year="2026"/>
          <abstract>
            <t>   qlog provides extensible structured logging for network protocols,
   allowing for easy sharing of data that benefits common debug and
   analysis methods and tooling.  This document describes key concepts
   of qlog: formats, files, traces, events, and extension points.  This
   definition includes the high-level log file schemas, and generic
   event schemas.  Requirements and guidelines for creating protocol-
   specific event schemas are also presented.  All schemas are defined
   independent of serialization format, allowing logs to be represented
   in various ways such as JSON, CSV, or protobuf.

Note to Readers

      Note to RFC editor: Please remove this section before publication.

   Feedback and discussion are welcome at https://github.com/quicwg/qlog
   (https://github.com/quicwg/qlog).  Readers are advised to refer to
   the "editor's draft" at that URL for an up-to-date version of this
   document.

            </t>
          </abstract>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-ietf-quic-qlog-main-schema-14"/>
      </reference>
      <reference anchor="HEV3">
        <front>
          <title>Happy Eyeballs Version 3: Better Connectivity Using Concurrency</title>
          <author fullname="Tommy Pauly" initials="T." surname="Pauly">
            <organization>Apple Inc</organization>
          </author>
          <author fullname="David Schinazi" initials="D." surname="Schinazi">
            <organization>Google LLC</organization>
          </author>
          <author fullname="Nidhi Jaju" initials="N." surname="Jaju">
            <organization>Google LLC</organization>
          </author>
          <author fullname="Kenichi Ishibashi" initials="K." surname="Ishibashi">
            <organization>Google LLC</organization>
          </author>
          <date day="1" month="July" year="2026"/>
          <abstract>
            <t>   Many communication protocols operating over the modern Internet use
   hostnames.  These often resolve to multiple IP addresses, each of
   which may have different performance and connectivity
   characteristics.  Since specific addresses or address families (IPv4
   or IPv6) may be blocked, broken, or sub-optimal on a network, clients
   that attempt multiple connections in parallel have a chance of
   establishing a connection more quickly.  This document defines the
   algorithm for "Happy Eyeballs", a technique for reducing user-visible
   delays on dual-stack hosts.  This document updates the algorithm in
   RFC 8305.

            </t>
          </abstract>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-ietf-happy-happyeyeballs-v3-04"/>
      </reference>
      <reference anchor="RFC2119">
        <front>
          <title>Key words for use in RFCs to Indicate Requirement Levels</title>
          <author fullname="S. Bradner" initials="S." surname="Bradner"/>
          <date month="March" year="1997"/>
          <abstract>
            <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
          </abstract>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="2119"/>
        <seriesInfo name="DOI" value="10.17487/RFC2119"/>
      </reference>
      <reference anchor="RFC8174">
        <front>
          <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
          <author fullname="B. Leiba" initials="B." surname="Leiba"/>
          <date month="May" year="2017"/>
          <abstract>
            <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
          </abstract>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="8174"/>
        <seriesInfo name="DOI" value="10.17487/RFC8174"/>
      </reference>
    </references>
    <?line 779?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
    </section>
  </back>
  <!-- ##markdown-source:
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
3vRaB1+Tqep3RXa7WZZoT9I9zgVB1VN6xEt63yqdJvTYywfE3aEMROKoOYgD
mCNuKUQbGuREWPvsj90GhAxZO4ij+noUuKDi7+ZxvVsYINXGqxNCKqmSXvFH
ptKJ51Mrng771sFrhDTkg3uGbwlDbKJZi14zpTksgPjzsuDCjq2RigO5RmfA
2Isy6MG8H/OFFEylkbl1JFZ7oJQNybDa6irsdC4V12WQ0VlHkdLYxwvQtuDa
lHfbKChXGXscg26bILoZdjjKOpFSGkdjJv247z7EtZv0VAGy0H20N+DgmxJY
fUnmnZVRLmNNq3Sty976J3KWTf73Nxx3unK9Q9IdHDZABgmYtoxb/W1PtiuX
7VD2QJHIUrJbJpLaThd/XQNV0ZUKbqblHt2VDlbOsohLqD3lW7WzfOuv1Np0
X0gNMc0XmE468YzpruLgICyWWq+mSSlM89n6DyfX3Tt/qVmue5WmalzQ2E1S
genKr8odxgSxdcLCsOao4RDg2v0cIAu/hpeKTY96TX2t166jlXeSPYawiSBS
Et8QHszxRvaxZNHRTrabYn1OenzUn0BxKqK/ctujIDjfoPbSsR4PA4RuABjN
+gNW3u9XEh9Zvf3ZKqKy336Y0BUCMsTYQToINMRySjmYML25SywfrNq6vfql
yL32sX/jqlBkOdGKkofLLriO0YJLAApU4dpuEjQI5NQ3H3WuH3/BLbLtC4Vm
RVee0fdNK3tHwZaGolnYwjwJGs8FD7ZS3MdHXBx6nI1+bRR2+Lrykq8uxYSd
Gi9HRo2cq5TZyPuzeTu61Cu9chQqBEUpy/CRuC0EC+qItK9GhsTha4IoSJ0k
CobfIIo8onOjqp/bL7lQ9i8zu/M0Y+yPB/H3zqV74nvcrNMZlA9hO8/4dgbw
32N8z8TcwfbBOv18WoUtDXIbpKgr+mAKhgsBcUmD9fITFrfXXYYKg0fGslVP
PMFg/d9zVy95rnjpX5A+FGdb1iQ6oJ2AM9NvMXZYCinTpKe1SjaQI390goE6
6uZZAWo4Cc217ZFqAGc7aZGKOlE9gma9frZi9iDkb8sfLglxv0ozbRnrCxSl
hdaJ/VQQjuQw2gmQ+5iJbadq40bAa+Xc8eMICbulsgcm8jZwAop5VXCzCc/v
tmunDAoK48GBwk/poKz320T5hMcTbCL1oFChhwvqYMeBzat+vnvLy/4SfId9
Hsh3fC+DuEw+e9HhPpsQ8Irgge4OOeK0p49jt7YQdO3kW2qY7jWRMtMyqpxG
eCBAN+aFXPem5HkrrlN1LqbwZSTfdsh8ZrFj2V/ot+Qvkgh7hB+00Us0R0My
Vtz60ZGHcCF8nOB5HOeLF0of8MCJjg6tmdS5Ie/ADi7QDFq77r9Jg+fUHOYR
Vj0NOx2XsfM3RvIxoIV0rOBwLFULMqR3o4fmdk1/f0DTCaUib4GiCLEqIiFj
s/0CuMFdWCOvub+t9mGvXxpIsOWK7ilx+xj4TuyH45lLzNa55XDbh5xX5ybs
6tWA+dazxC0+pl23fU+2ayekbZO7MapqOo+N2At/I8qG94MegcPTyYkQuN3N
uA9khHyAR5yHSQfbTWvBAw595z7LELQ695DplPMCFEu5A7n7mI2b6H031PCL
EaCL1+jVkhonp1m+BmfNDS/fgyG5QFjKp4zQGaB0BTaX4u1W72RaYaSqj0g7
Xktz99WG1orxPTQQ+v/9z/9q1JNeNgpjD3M6BatdXq9cJGtcdXkXw6ZBa9TD
LPp1+pSOkUdYiSDuMtODp7Raa9dB04Zio2TCktq3Hj7PiZ3z0QnZ0BzGc/wA
IP7CBB7E9auY9EdPg1MTExbkn1nn4aOHSr1r3Y77CB6oeKpeEPxiK16duYZf
rr8UvsbTOh5dRwrrh0HTg8spti89uDiP6qBdr7v/hmrAqqxGMCajHqs0x9bC
8ONqrqLhj9K5HSFjrwWIX8JPekKo74G0p39CDq7TiuOseXCzoRPPR904qdmd
7VIG0k/CEb3oq5hC+icE6aLAZj23bPd3UV5YqivKeM6ywYHoPfhytnPLuGSz
bX6Qo5fAx/OfV3Dp1WN+OznC0yyid5ZW9TrOR3i3mNoksBOs90st8pmyjb15
ZAW+RzAtxQZYyXcVOvY18XtpeRFU0WxTPX5bDVy/0umNQZNY8gVBRyHqtEL6
JNKGFZCI4yS8yOI+QIhhCX9BtEmWN7zsk4lhXfYebRvGGFVRxVlfGBFcoJ1S
/nBqffjeD4w0h+z6yMiu8TuzgeG1YqHPlEDugOley5q7B4hX7Qa0OVUI+PAH
RORbl0DVUVWMkLiWpp6AbFCEEK17kXZ0GC01Ite9wBLJnVIJgljS8esbM0fP
mdwibVMT7RI+C6KCAE6KCvjrapZf0O0KoLCqlq/cy1UW3lN27HKH/VxE/24+
H+2NVaT6zJVNYMNaiGOaNJpvqVURrzRiaY2vHvfwXv8XIdz35Jr7N2oNOzhT
FuxJFu9YNFKNZZvs6+jy8Hc73FWs5hKySfO7LnYO3yG3pZUAIGnJasvBA6sw
ww190EyXau7BLEZKBQ0M36ARcoyOfkbAmbYEQXLTyy/DqJ+E3Mi1kyC2lcJf
JUYtjLc3MXWFhvvKf0fOoCyeYb+5dxCcIaZP65H7pT/E1KdQ5IEjYQ/W/ryN
FQ5ZICgAeCa+p2KxS64Qapxc44Jn4Y6ieiR/r+Q7lPK5TO4tCbwy+tqov2XL
N8k6/ImfHT25PEBPo5Wtw49u+ItosLRc0MWF5N58ZibeO7H44u99NN85z4Ve
ypdEKh1cpsSK1DLoc0zpdo3ZB/C+OsWzQABXUw8JkNCASWQlZuQ9foP3+OK4
+7LxzcJS34Lu5cshWMqHZ+XW5pkG3Y+/vrs6B8PIs2Dg3gJUi1wO/d4GlIef
omS4L0f/sA+4OWstMokmj34TMYou7LcQcTg/4oXou4b4MLjZPOxe2xz23JAb
7rpAM+y90TDsdmQPu/2Jw75OpGG3XSF4ZCFs1pn835I09w9EqoY7MlC9zyn6
7X1jtdGwL0wa9njQQ++onXqHEWnAJPGZSvtRI/4wMHV3MVWj6MqKPM5rcGLE
H5DGAjCy7vECr7IAfLesjL6fsOLXye8HyzgzevBDFP0fnOj12upfAAA=

-->

</rfc>
