<?xml version="1.0" encoding="UTF-8"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.38 (Ruby 4.0.7) -->


<!DOCTYPE rfc  [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">

]>

<?rfc compact="yes"?>
<?rfc comments="yes"?>

<rfc ipr="trust200902" docName="draft-bhatti-ilnp-tcp-udp-checksums-01" category="exp" submissionType="independent" updates="6740, 6741, 6748" tocInclude="true" sortRefs="true" symRefs="true">
  <front>
    <title abbrev="ILNP TCP/UDP checksums">TCP and UDP checksum calculations for ILNP</title>

    <author initials="S. N." surname="Bhatti" fullname="Saleem N. Bhatti">
      <organization>University of St Andrews, UK</organization>
      <address>
        <email>saleem@st-andrews.ac.uk</email>
      </address>
    </author>
    <author initials="R. W." surname="Grimes" fullname="Rodney W. Grimes">
      <organization>Independent, USA</organization>
      <address>
        <email>rgrimes@FreeBSD.org</email>
      </address>
    </author>
    <author initials="G." surname="Fairhurst" fullname="Gorry Fairhurst">
      <organization>University of Aberdeen, UK</organization>
      <address>
        <email>gorry@erg.abdn.ac.uk</email>
      </address>
    </author>

    <date year="2026" month="October" day="05"/>

    <area>Network</area>
    <workgroup>Network Working Group</workgroup>
    <keyword>Identifier Locator Network Protocol (ILNP)</keyword> <keyword>Identifier-Locator Vector (I-LV)</keyword> <keyword>Locator (L64)</keyword> <keyword>Node Identifier (NID)</keyword> <keyword>DNS</keyword>

    <abstract>


<?line 101?>

<t>The Identifier Locator Network Protocol (ILNP) for IPv6 is described in Experimental RFCs 6740-6744.
ILNP defines the use of an Identifier-Locator Vector (I-LV) with a zero value L64 value and a relevant Node Identifier (NID) value in place of an IPv6 address in the pseudo-header for transport protocol checksum computations.
However, as TCP and UDP predate ILNP, this change causes TCP and UDP checksum values to be generated for ILNP flows that are different to the same flows on IPv6.
This document changes the checksum computation for TCP and UDP with ILNP so that the checksum values are the same for ILNP and IPv6.
This document updates the checksum processing for TCP and UDP described in RFC6740 and RFC6741, and the way the checksum processing should be applied for TCP and UDP in RFC6748.</t>



    </abstract>

    <note title="About This Document" removeInRFC="true">
      <t>
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-bhatti-ilnp-tcp-udp-checksums/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Network Network Working Group mailing list (<eref target="mailto:saleem@st-andrews.ac.uk"/>).
      </t>
    </note>


  </front>

  <middle>


<?line 109?>

<section anchor="s-introduction"><name>Introduction</name>

<t>The Identifier Locator Network Protocol (ILNP) redefines the IP addressing architecture by use of new addressing datatypes <xref target="RFC6740"/> <xref target="RFC6741"/>.
The ILNP addressing datatypes considered in this document are:</t>

<t><list style="symbols">
  <t><em>Locator (L64)</em>: A 64-bit value (8 bytes, in network / canonical byte order) that is a label for a network.</t>
  <t><em>Node Identifier (NID)</em>: A 64-bit value (8 bytes, in network / canonical byte order) that is a label for a node.</t>
  <t><em>Identifier-Locator Vector (I-LV)</em>: The 128-bit concatenation of a single L64 value and single NID value for use in the IPv6 packet header in the source address and destination address fields.</t>
</list></t>

<t>These datatypes are realised and used within the context of IPv6 <xref target="RFC6741"/>: an ILNP packet will use the address fields in an IPv6 packet <xref target="RFC8200"/> to carry I-LV values constructed from L64 and NID values, as shown in <xref target="f-addressing"/>.</t>

<t><xref target="RFC6740"/> and <xref target="RFC6741"/> redefine the checksum computation for TCP and UDP in light of these new datatypes and as discussed in <xref target="ss-previous_checksum"/>.</t>

<figure title="An IPv6 address (RFC8200 / STD86) and an ILNP Identifier-Locator Vector (RFC6741), as used in the address fields of the IPv6 packet header." anchor="f-addressing"><artset><artwork  type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="240" width="584" viewBox="0 0 584 240" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
<path d="M 8,64 L 8,112" fill="none" stroke="black"/>
<path d="M 8,176 L 8,224" fill="none" stroke="black"/>
<path d="M 40,64 L 40,112" fill="none" stroke="black"/>
<path d="M 216,64 L 216,112" fill="none" stroke="black"/>
<path d="M 296,64 L 296,112" fill="none" stroke="black"/>
<path d="M 296,176 L 296,224" fill="none" stroke="black"/>
<path d="M 576,64 L 576,112" fill="none" stroke="black"/>
<path d="M 576,176 L 576,224" fill="none" stroke="black"/>
<path d="M 8,80 L 576,80" fill="none" stroke="black"/>
<path d="M 8,112 L 576,112" fill="none" stroke="black"/>
<path d="M 8,192 L 576,192" fill="none" stroke="black"/>
<path d="M 8,224 L 576,224" fill="none" stroke="black"/>
<g class="text">
<text x="20" y="36">IPv6</text>
<text x="76" y="36">(RFC8200</text>
<text x="120" y="36">/</text>
<text x="156" y="36">STD86)</text>
<text x="192" y="36">-</text>
<text x="232" y="36">general</text>
<text x="284" y="36">IPv6</text>
<text x="332" y="36">global</text>
<text x="392" y="36">address</text>
<text x="456" y="36">format:</text>
<text x="24" y="68">3</text>
<text x="92" y="68">45</text>
<text x="124" y="68">bits</text>
<text x="236" y="68">16</text>
<text x="268" y="68">bits</text>
<text x="412" y="68">64</text>
<text x="444" y="68">bits</text>
<text x="24" y="100">001</text>
<text x="68" y="100">global</text>
<text x="128" y="100">routing</text>
<text x="188" y="100">prefix</text>
<text x="244" y="100">subnet</text>
<text x="284" y="100">ID</text>
<text x="368" y="100">Interface</text>
<text x="452" y="100">Identifier</text>
<text x="520" y="100">(IID)</text>
<text x="20" y="148">ILNP</text>
<text x="80" y="148">(RFC6741)</text>
<text x="128" y="148">-</text>
<text x="180" y="148">Identifier</text>
<text x="256" y="148">Locator</text>
<text x="316" y="148">Vector</text>
<text x="376" y="148">(I-LV):</text>
<text x="108" y="180">64</text>
<text x="140" y="180">bits</text>
<text x="404" y="180">64</text>
<text x="436" y="180">bits</text>
<text x="112" y="212">Locator</text>
<text x="168" y="212">(L64)</text>
<text x="372" y="212">Node</text>
<text x="436" y="212">Identifier</text>
<text x="504" y="212">(NID)</text>
</g>
</svg>
</artwork><artwork  type="ascii-art"><![CDATA[
IPv6 (RFC8200 / STD86) - general IPv6 global address format:

| 3 |     45 bits         | 16 bits |             64 bits              |
+---+---------------------+---------+----------------------------------+
|001|global routing prefix|subnet ID|    Interface Identifier (IID)    |
+---+---------------------+---------+----------------------------------+

ILNP (RFC6741) - Identifier Locator Vector (I-LV):

|           64 bits                 |            64 bits               |
+---+---------------------+---------+----------------------------------+
|         Locator (L64)             |       Node Identifier (NID)      |
+---+---------------------+---------+----------------------------------+
]]></artwork></artset></figure>

<section anchor="ss-purpose"><name>Purpose</name>

<t>This document changes the guidance in <xref target="RFC6740"/> and <xref target="RFC6741"/> for the computation of the checksums for TCP and UDP when used with ILNP so that there is:</t>

<t><list style="numbers" type="1">
  <t>alignment with existing definitions and deployments of TCP and UDP for IPv6.</t>
  <t>alignment with use of TCP and UDP by existing IPv6 applications to allow operation over ILNP.</t>
</list></t>

<t><em>That is, the checksum computation for TCP and UDP for ILNP becomes the same as for IPv6.</em></t>

<t>ILNP is defined for use with IPv6 and for use with IPv4, but all references in this document to ILNP are for IPv6 only.</t>

</section>
<section anchor="ss-rationale"><name>Rationale</name>

<t>The discussion and arguments presented in <xref target="RFC6740"/> for using only NID values for transport protocol end-to-end state in ILNP still stand.
However, as ILNP packets are IPv6 packets, and existing deployments that are not ILNP-aware expect TCP and UDP checksums to be as defined for IPv6, so changing the checksum computation for ILNP creates a tension.
In keeping with enabling ILNP usage by IPv6 applications <xref target="draft-bhatti-ilnp-ip6-apps"/>, and improving the deployment capability for ILNP in general, this document removes that tension.</t>

</section>
</section>
<section anchor="s-conventions"><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 anchor="ss-previous_definitions"><name>Definitions from other documents</name>

<t>The following terms are defined in <xref target="RFC6740"/>:</t>

<t><list style="symbols">
  <t>Locator, L64</t>
  <t>Node Identifier, NID</t>
  <t>Identifier-Locator Vector, I-LV</t>
  <t>Identifier Locator Communications Cache, ILCC</t>
  <t>Source I-LV</t>
  <t>Destination I-LV</t>
</list></t>

<t>The following terms are defined in <xref target="RFC6748"/>:</t>

<t><list style="symbols">
  <t>Locator Re-writing Relay, LRR</t>
</list></t>

</section>
</section>
<section anchor="ss-rfc_updates"><name>Updates to previous RFC documents</name>

<t>RFC documents that are updated by this document are:</t>

<t><list style="symbols">
  <t>RFC6740 "Identifier-Locator Network Protocol (ILNP) Architectural Description" <xref target="RFC6740"/>.</t>
  <t>RFC6741 "Identifier-Locator Network Protocol (ILNP) Engineering Considerations" <xref target="RFC6741"/>.</t>
  <t>RFC6748 "Optional Advanced Deployment Scenarios for the Identifier-Locator Network Protocol (ILNP)" <xref target="RFC6748"/>.</t>
</list></t>

<section anchor="ss-rfc6740"><name>RFC6740</name>

<t><xref section="3.5" sectionFormat="of" target="RFC6740"/> is updated: the pseudo-header for a TCP or UDP checksum computation now includes the whole source I-LV and destination I-LV at the sender, and the whole source I-LV and destination I-LV in the packet that is received at the receiver.</t>

</section>
<section anchor="ss-rfc6741"><name>RFC6741</name>

<t><xref section="4.2" sectionFormat="of" target="RFC6741"/> is updated, as for <xref section="3.5" sectionFormat="of" target="RFC6740"/> described above.</t>

<t>The text in the final paragraph of <xref section="5.4" sectionFormat="of" target="RFC6741"/> is no longer relevant.</t>

<t>Note that <xref section="4.3" sectionFormat="of" target="RFC6741"/> already defined that the checksum computation for ICMPv6 messages use the whole source I-LV and whole destination I-LV for backwards compatibility with IPv6, i.e. that the checksum computation for ICMPv6 messages over ILNP are the same as for IPv6.</t>

</section>
<section anchor="ss-rfc6748"><name>RFC6748</name>

<t><xref target="RFC6748"/> describes use cases and scenarios for ILNP.
Many of the use cases employ an ILNP-aware Site Border Routers (SBR).
SBRs that change the L64 value for ILNP packets in a flow are said to contain a Locator Re-writing Relay (LRR) function.
If the LRR function is applied to a TCP or UDP flow, the checksum recomputation as described in <xref target="ss-checksum_changes"/> <bcp14>MUST</bcp14> be applied.
As these changes make ILNP flows align with the current use of TCP and UDP with IPv6, so the operation of firewall functions at SBRs is made easier and more consistent with TCP and UDP as used over IPv6.</t>

</section>
</section>
<section anchor="s-ilv_usage"><name>L64 values in checksum computations for TCP and UDP</name>

<t>Overall, the changes in <xref target="ss-checksum_changes"/> have the effect of making the ILNP checksum computation for TCP and UDP to be exactly the same as the IPv6 checksum computation for TCP and UDP.</t>

<t>TCP segments and UDP datagrams are just referred to as "packets" in this document, for ease: the principle is the same, as the checksum computation for both is the same, but using different pseudo-header fields.</t>

<section anchor="ss-checksum_changes"><name>Change to the ILNP checksum computation for TCP and UDP</name>

<t>The description in <xref target="ss-previous_checksum"/> is changed so that when TCP and UDP flows use ILNP, the pseudo-header used for the checksum computation:</t>

<t><list style="numbers" type="1">
  <t>at the sender, <bcp14>MUST</bcp14> include the whole source I-LV and whole destination I-LV values that will be used in the transmitted packet header.</t>
  <t>at the receiver, <bcp14>MUST</bcp14> include the whole source I-LV and whole destination I-LV from the received packet header.</t>
</list></t>

<t><em>So, the algorithm and pseudo-header used in the checksum computation with TCP and UDP for ILNP are now exactly the same as for IPv6.</em></t>

</section>
<section anchor="ss-benefits"><name>Benefits of the change</name>

<t>Overall, the changes in <xref target="ss-checksum_changes"/> improve compatibility of ILNP for TCP and UDP flows with IPv6 flows, and particularly in the following situations:</t>

<t><list style="numbers" type="1">
  <t>When used with existing IPv6 applications, and is in keeping with the aim of <xref target="draft-bhatti-ilnp-ip6-apps"/>.</t>
  <t>For existing firewall deployments and configurations, as ILNP flows for TCP and UDP will now appear just as IPv6 flows for TCP and UDP.
No extra processing is needed for ILNP packets for TCP and UDP compared to what is already needed for IPv6.</t>
  <t>When using off-load processing for TCP and UDP with IPv6 in hardware, e.g. server NICs, where the ILNP checksum computation as defined in <xref section="4.2" sectionFormat="of" target="RFC6741"/> is unlikely to be implemented, but where the standard IPv6 checksum algorithm for TCP and UDP is already implemented and deployed.
This means that no extra or different processing is needed for ILNP packets for TCP and UDP ath the reciever compared to what is already done for IPv6.</t>
</list></t>

</section>
<section anchor="ss-previous_checksum"><name>Previous ILNP checksum computation for TCP and UDP</name>

<t>In <xref section="4.2" sectionFormat="of" target="RFC6741"/> is the following text:</t>

<t><spanx style="verb">
To minimise the changes required within transport protocol implementations, and to maximise interoperability, current implementations are modified to zero the Locator fields (only for the purpose of TCP or UDP checksum calculations).
</spanx></t>

<t>That is, the checksum computation is the same as for IPv6, but the top 64 bits of the 128-bit values for the source I-LV and destination I-LV (carried, respectively, in the source and destination IPv6 address fields of the packet header) are set to zero.
This is a small change in terms of overall implementation footprint for the checksum, but it results in a checksum value for TCP and UDP with ILNP that is different compared to IPv6.</t>

</section>
<section anchor="ss-principle"><name>Principle of end-to-end transport state for ILNP</name>

<t>In <xref section="3.5" sectionFormat="of" target="RFC6740"/> is the following text:</t>

<t><spanx style="verb">
In ILNP, protocols above the network layer do not use the Locator values. Thus, the transport layer uses only the I values for the transport-layer session state [ ... ]
</spanx></t>

<t>The changes in <xref target="ss-checksum_changes"/> do not negate that general principle proposed for ILNP: that transport layer state needs to use (I values) NID values only, and not L64 values, i.e. not the whole of the 128-bit I-LV.
This is so that there is end-to-end state invariance for the duration of the transport flow, and that end-to-end state does not use datatypes that are bound to any topological state or forwarding state.
This remains true for end-to-end state for TCP and UDP operating over ILNP.
However, the checksum for TCP and UDP is not part of the end-to-end state and is only used on a per-packet basis for detecting errors in transmission.
So, we can maintain the principle stated above for ILNP, but achieve better compatibility with existing IPv6 deployments by aligning the checksum computation for TCP and UDP with IPv6.
This will give a wire-image for a TCP packet and UDP packet that is fully-compatible with IPv6.</t>

<t>TCP and UDP and their respective checksum algorithm definitions predate ILNP.
Future transport protocols that are designed specifically to operate over ILNP might define a checksum algorithm that uses the NID values only as part of a pseudo-header, but that is not a requirement.</t>

<t>So, the changes in <xref target="ss-checksum_changes"/> recognise the need for, and value of, improved backwards compatibility with TCP and UDP when used over ILNP for IPv6 applications <xref target="draft-bhatti-ilnp-ip6-apps"/>, as well as the improved deployment compatibility for ILNP.</t>

<t>Indeed, as noted in <xref target="ss-previous_checksum"/>, the intention for <xref section="4.2" sectionFormat="of" target="RFC6741"/> was:</t>

<t><spanx style="verb">
To minimise the changes required within transport protocol implementations, and to maximise interoperability, ...
</spanx></t>

<t>So the change introduced in this document aligns better with that intention from <xref target="RFC6741"/>, and is still in keeping with the ILNP principle of end-to-end transport state.</t>

</section>
<section anchor="ss-operational"><name>Operational considerations</name>

<t>ILNP functionality overall is not impacted.
The changes in <xref target="ss-checksum_changes"/> should have a minimal code-change footprint for existing ILNP implementations, and will be easy to implement and deploy -- example implementations are provided in <xref target="s-incremental_update"/>.</t>

<t>The changes documented here mean that existing firewalls and hardware offload implementations for IPv6 should not need to be updated when ILNP is used with TCP and UDP.</t>

</section>
</section>
<section anchor="s-incremental_update"><name>Incremental checksum update for TCP and UDP</name>

<t>Essentially, the incremental checksum update for TCP and UDP over ILNP requires the source and destination L64 values to be included in the pseudo-header.</t>

<t>An existing ILNP implementation executes the checksum algorithm as noted in <xref target="ss-previous_checksum"/>, which would be the same for TCP and UDP, albeit with different pseudo-headers in each case.
However, in both cases, the source and destination NID values are included, while the source and destination L64 values are not.
So, one implementation approach is simply that the transport layer checksum is (re-)calculated with the source L64 and destination L64 values included in the pseudo-header.
However, it is <bcp14>RECOMMENDED</bcp14> that <em>incremental checksum update</em> methods are used for improved efficiency and performance.</t>

<t>We describe simple methods below to perform incremental checksum updates for TCP and UDP over ILNP.
These allow the checksum to be recalculated just-in-time, just before transmission, after a forwarding decision has been made, and so both the source L64 and destination L64 values are known.</t>

<section anchor="background"><name> Background</name>

<t>The incremental update to the checksum is in keeping with previous checksum update mechanisms defined in <xref target="RFC1624"/>, <xref target="RFC1141"/>, and <xref target="RFC1071"/>.
<xref target="RFC1624"/> updates <xref target="RFC1141"/>, and <xref target="RFC1141"/> obsoletes <xref target="RFC1071"/>.
Nevertheless, <xref target="RFC1624"/> states:</t>

<t><spanx style="verb">
It is recommended that intermediate systems compute incremental
checksum using the method described in this document, and end systems
verify checksum as per the method described in RFC 1071.
</spanx></t>

<t>That is, as written in <xref section="1" sectionFormat="of" target="RFC1071"/>:</t>

<t><spanx style="verb">
To check a checksum, the 1's complement sum is computed over the
same set of octets, including the checksum field.  If the result
is all 1 bits (-0 in 1's complement arithmetic), the check
succeeds.
</spanx></t>

<t>The simple algorithms described in this section are in the same spirit as described in <xref target="RFC1624"/>, <xref target="RFC1141"/>, and <xref target="RFC1071"/>.</t>

</section>
<section anchor="example-implementations"><name>Example implementations</name>

<t>Also, in keeping with <xref target="RFC1141"/> and <xref target="RFC1071"/>, we provide example implementations in C -- <xref target="f-checksum_update_c"/>, <xref target="f-checksum_packet_c"/>, <xref target="f-checksum_lrr_c"/>.
These perform incremental update of the checksum value in place, for efficiency and performance, using only the values of the changed header fields:</t>

<t><list style="symbols">
  <t>All arithmetic uses one's complement sum for 16-bit values, as in <xref target="RFC1624"/>, <xref target="RFC1141"/>, and <xref target="RFC1071"/>.</t>
  <t>In all cases, 32-bit unsigned integer accumulator variables are used for arithmetic of 16-bit values to maintain carry bits correctly, and then a cast is used for 16-bit values when required.</t>
  <t>As unsigned integer values are used, when subtraction of a value is required (in <xref target="f-checksum_lrr_c"/>) the one's complement of that value is used with addition.</t>
</list></t>

<t>However, other implementations are possible, of course: these are only examples.</t>

</section>
<section anchor="ss-tcp_udp_checksum"><name>TCP and UDP and incremental checksum update</name>

<t>The general approach in <xref target="f-checksum_update"/> relies on the simplicity of the checksum algorithm, and is similar to approaches taken previously, e.g. <xref target="RFC1624"/>.</t>

<figure title="The general algorithm for an incremental checksum update for the value in the transport layer header checksum for a TCP or UDP packet over ILNP." anchor="f-checksum_update"><artwork><![CDATA[
Let:

  c_z     be the 16-bit value in the checksum field when
          calculated with zero'd L64 values.
  s_L64   be the one's complement sum of the 16-bit words
          for the source L64.
  d_L64   be the one's complement sum of the 16-bit words
          for the destination L64.
  c_i     be the incrementally updated checksum value,
          including s_L64 and d_L64.

  c_i = ~(~c_z + s_L64 + d_L64)
]]></artwork></figure>

<t><list style="symbols">
  <t><spanx style="verb">c_i</spanx> is then copied back into the checksum field for the packet, over-writing the value <spanx style="verb">c_z</spanx>.</t>
</list></t>

<section anchor="ss-checksum_update"><name>Example implementation: pre-calculated s_L64 and d_L64</name>

<t>The source L64 and destination L64 will be relatively stable, therefore so will <spanx style="verb">s_L64</spanx> and <spanx style="verb">d_l64</spanx>.
<spanx style="verb">s_L64</spanx> and <spanx style="verb">d_L64</spanx> would be (re-)calculated once, when new source L64 or destination L64 values become known, and cached in the ILCC.
For communication between multihomed nodes, there could be multiple source L64 and destination L64 values in use.
Overall, pre-calculating <spanx style="verb">s_L64</spanx> and <spanx style="verb">d_L64</spanx> for each L64 in use, when it becomes known, would reduce the per-packet overhead at transmission time.
The C example in <xref target="f-checksum_update_c"/> is a simple implementation example for the algorithm of <xref target="f-checksum_update"/>.
It assumes that these pre-calculated values are available, and a pointer to the checksum field in the transport layer header is given for the packet buffer that is to be transmitted:</t>

<t><list style="numbers" type="1">
  <t>The <spanx style="verb">s_L64</spanx> and <spanx style="verb">d_L64</spanx> values are the pre-calculated values from the ILCC.</t>
  <t>The transport checksum field contains an ILNP version of the checksum, <spanx style="verb">c_z</spanx>, i.e. with zero'd source L64 and destination L64 values.</t>
</list></t>

<figure title="A simple implementation example for the incremental checksum update algorithm for the TCP or UDP header checksum." anchor="f-checksum_update_c"><sourcecode type="C"><![CDATA[
void
ilnp_checksum_update(const uint32_t s_L64, /* src L64 sum */
                     const uint32_t d_L64, /* dst L64 sum */
                     uint8_t *checksum)  /* checksum field */
{
  uint32_t c_z = ntohs(*((uint16_t *) checksum));
  uint32_t c_i;

  c_i = (~c_z & 0x0000ffff) + s_L64 + d_L64;
  c_i = (c_i >> 16) + (c_i & 0x0000ffff); /* carry */
  c_i = ~c_i & 0x0000ffff;

  *((uint16_t *) checksum) = htons((uint16_t) c_i);
}
]]></sourcecode></figure>

</section>
<section anchor="ss-checksum_packet"><name>Example implementation: packet buffer</name>

<t>As an alternative, if <spanx style="verb">s_L64</spanx> and <spanx style="verb">s_L64</spanx> cannot be pre-calculated, it is possible to operate directly on the packet buffer, as in <xref target="f-checksum_packet_c"/>.
This assumes that pointers are provided to header fields in the packet buffer, for the source L64, destination L64, and checksum:</t>

<t><list style="numbers" type="1">
  <t>The correct source L64 and destination L64 values to be used are in place in the packet buffer.</t>
  <t>The transport checksum field contains an ILNP version of the checksum, <spanx style="verb">c_z</spanx>, i.e. calculated with zero'd source L64 and destination L64 values.</t>
</list></t>

<figure title="An alternative implementation example for the incremental checksum update algorithm, working directly with packet header fields for a transmission buffer." anchor="f-checksum_packet_c"><sourcecode type="C"><![CDATA[
void
ilnp_checksum_packet(const uint8_t *src_L64, /* src L64 field */
                     const uint8_t *dst_L64, /* dst L64 field */
                     uint8_t *checksum) /* checksum field */
{
  uint32_t c_z = ntohs(*((uint16_t *) checksum));
  uint32_t s_L64 = 0;
  uint32_t d_L64 = 0;
  uint32_t c_i;

  for (int i = 0; i < 4; ++i) {
    s_L64 += ntohs(((uint16_t *) src_L64)[i]);
    d_L64 += ntohs(((uint16_t *) dst_L64)[i]);
  }

  c_i = (~c_z & 0x0000ffff) + s_L64 + d_L64;
  c_i = (c_i >> 16) + (c_i & 0x0000ffff); /* carry */
  c_i = ~c_i & 0x0000ffff;

  *((uint16_t *) checksum) = htons((uint16_t) c_i);
}
]]></sourcecode></figure>

</section>
</section>
<section anchor="ss-checksum_lrr"><name>Incremental update for an ILNP-aware packet forwarder</name>

<t>An ILNP-aware packet forwarder, such as described in <xref section="2" sectionFormat="of" target="RFC6748"/> or <xref section="7" sectionFormat="of" target="RFC6748"/>, can change the source L64 and/or the destination L64 before it forwards a packet -- this is a Locator Re-writing Relay (LRR) function.
With the ILNP checksum algorithm as defined <xref target="ss-previous_checksum"/>, the LRR would simply re-write the source and/or destination L64 values in the packet and forward the packet.
With the checksum algorithm implemented as in <xref target="ss-tcp_udp_checksum"/>, the LRR must now also update the transport header checksum.</t>

<t>The incremental checksum update for the LRR function is a logical extension of the incremental update described in <xref target="ss-tcp_udp_checksum"/>.
For the incremental checksum evaluation for a LRR:</t>

<t><list style="symbols">
  <t>the sums of the 16-bit words of the "old" L64 values, <spanx style="verb">o_s_L64</spanx> and/or <spanx style="verb">o_d_L64</spanx>, must be subtracted from the checksum; and</t>
  <t>the sums of the 16-bit words of the "new" L64 values, <spanx style="verb">n_s_L64</spanx> and/or <spanx style="verb">n_s_L64</spanx>, must be added to the checksum.</t>
</list></t>

<t>The description of the algorithm is given in <xref target="f-checksum_lrr"/>.
This general approach is also suitable for any other ILNP-aware packet forwarder that makes changes to L64 values.</t>

<figure title="The general algorithm for an incremental checksum update for the TCP or UDP header checksum for an ILNP-aware packet-forwarder that changes the source and/or destination L64 values, such as a LRR function." anchor="f-checksum_lrr"><artwork><![CDATA[
Let:

  c_o       be the old 16-bit value in the checksum field.
  o_s_L64   be the one's complement sum of the 16-bit words
            of the old source L64.
  o_d_L64   be the one's complement sum of the 16-bit words
            of the old destination L64.
  n_s_L64   be the one's complement sum of the 16-bit words
            of the new source L64.
  n_d_L64   be the one's complement sum of the 16-bit words
            of the new destination L64.
  l_o       be the complement of the of sum of o_s_L64 and
            o_d_L64 (i.e. the negative value of the sum).
  c_n       be the new, incrementally updated checksum value,
            including n_s_L64 and n_d_L64.

  l_o = ~(o_s_L64 + o_d_L64)
  c_n = ~(~c_o + l_o + n_s_L64 + n_d_L64)
]]></artwork></figure>

<t><list style="symbols">
  <t><spanx style="verb">l_o</spanx> is the accumulator for the negative of the sum of the old L64 values, and is shown separately as a reminder to correctly handle the carry bits for this accumulator before adding it to <spanx style="verb">c_n</spanx>.</t>
  <t><spanx style="verb">c_n</spanx> is then copied back into the checksum field for the packet, over-writing the value <spanx style="verb">c_o</spanx>.</t>
</list></t>

<section anchor="ss-lrr_example"><name> Example implementation for the LRR</name>

<t>The example of <xref target="f-checksum_lrr_c"/> is a simple implementation of <xref target="f-checksum_lrr"/>.
This assumes the use of pre-calculated values for <spanx style="verb">o_s_L64</spanx>, <spanx style="verb">o_d_L64</spanx>, <spanx style="verb">n_s_L64</spanx>, and <spanx style="verb">n_d_L64</spanx>.
Of course, a similar mechanism can be applied as for <xref target="f-checksum_packet_c"/> if there is a requirement to operate directly on the packet buffer.</t>

<figure title="A simple implementation example for the incremental checksum update algorithm for an ILNP-aware forwarder, such as a LRR function." anchor="f-checksum_lrr_c"><sourcecode type="C"><![CDATA[
void
ilnp_checksum_lrr(const uint32_t o_s_L64, /* old src L64 sum */
                  const uint32_t o_d_L64, /* old dst L64 sum */
                  const uint32_t n_s_L64, /* new src L64 sum */
                  const uint32_t n_d_L64, /* new dst L64 sum */
                  uint8_t *checksum) /* checksum field */
{
  uint32_t c_o = ntohs(*((uint16_t *) checksum));
  uint32_t l_o;
  uint32_t c_n;

  l_o = ~(o_s_L64 + o_d_L64);
  l_o = (l_o >> 16) + (l_o & 0x0000ffff); /* carry */

  c_n = (~c_o & 0x0000ffff) + l_o + n_s_L64 + n_d_L64;
  c_n = (c_n >> 16) + (c_n & 0x0000ffff); /* carry */
  c_n = ~c_n & 0x0000ffff;

  *((uint16_t *) checksum) = htons((uint16_t) c_n);
}
]]></sourcecode></figure>

</section>
</section>
</section>
<section anchor="s-security"><name>Security Considerations</name>

<t>There are no new security considerations.</t>

<t>Security considerations remain unchanged from those already defined for ILNP (please see <xref section="9" sectionFormat="of" target="RFC6740"/>, <xref section="11" sectionFormat="of" target="RFC6741"/>).</t>

</section>
<section anchor="s-privacy"><name>Privacy Considerations</name>

<t>There are no new privacy considerations.</t>

<t>The existing identity privacy and location privacy mechanisms already defined for ILNP remain unchanged (please see <xref section="10" sectionFormat="of" target="RFC6740"/>, <xref section="12" sectionFormat="of" target="RFC6741"/>).</t>

</section>
<section anchor="s-iana"><name>IANA Considerations</name>

<t>This document has no IANA actions.</t>

</section>


  </middle>

  <back>


<references title='References' anchor="sec-combined-references">

    <references title='Normative References' anchor="sec-normative-references">



<reference anchor="RFC1071">
  <front>
    <title>Computing the Internet checksum</title>
    <author fullname="R.T. Braden" initials="R.T." surname="Braden"/>
    <author fullname="D.A. Borman" initials="D.A." surname="Borman"/>
    <author fullname="C. Partridge" initials="C." surname="Partridge"/>
    <date month="September" year="1988"/>
    <abstract>
      <t>This RFC summarizes techniques and algorithms for efficiently computing the Internet checksum. It is not a standard, but a set of useful implementation techniques.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="1071"/>
  <seriesInfo name="DOI" value="10.17487/RFC1071"/>
</reference>
<reference anchor="RFC1141">
  <front>
    <title>Incremental updating of the Internet checksum</title>
    <author fullname="T. Mallory" initials="T." surname="Mallory"/>
    <author fullname="A. Kullberg" initials="A." surname="Kullberg"/>
    <date month="January" year="1990"/>
    <abstract>
      <t>This memo correctly describes the incremental update procedure for use with the standard Internet checksum. It is intended to replace the description of Incremental Update in RFC 1071. This is not a standard but rather, an implementation technique.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="1141"/>
  <seriesInfo name="DOI" value="10.17487/RFC1141"/>
</reference>
<reference anchor="RFC1624">
  <front>
    <title>Computation of the Internet Checksum via Incremental Update</title>
    <author fullname="A. Rijsinghani" initials="A." role="editor" surname="Rijsinghani"/>
    <date month="May" year="1994"/>
    <abstract>
      <t>This memo describes an updated technique for incremental computation of the standard Internet checksum. It updates the method described in RFC 1141. This memo provides information for the Internet community. This memo does not specify an Internet standard of any kind.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="1624"/>
  <seriesInfo name="DOI" value="10.17487/RFC1624"/>
</reference>
<reference anchor="RFC6740">
  <front>
    <title>Identifier-Locator Network Protocol (ILNP) Architectural Description</title>
    <author fullname="RJ Atkinson" initials="RJ" surname="Atkinson"/>
    <author fullname="SN Bhatti" initials="SN" surname="Bhatti"/>
    <date month="November" year="2012"/>
    <abstract>
      <t>This document provides an architectural description and the concept of operations for the Identifier-Locator Network Protocol (ILNP), which is an experimental, evolutionary enhancement to IP. This is a product of the IRTF Routing Research Group. This document defines an Experimental Protocol for the Internet community.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="6740"/>
  <seriesInfo name="DOI" value="10.17487/RFC6740"/>
</reference>
<reference anchor="RFC6741">
  <front>
    <title>Identifier-Locator Network Protocol (ILNP) Engineering Considerations</title>
    <author fullname="RJ Atkinson" initials="RJ" surname="Atkinson"/>
    <author fullname="SN Bhatti" initials="SN" surname="Bhatti"/>
    <date month="November" year="2012"/>
    <abstract>
      <t>This document describes common (i.e., version independent) engineering details for the Identifier-Locator Network Protocol (ILNP), which is an experimental, evolutionary enhancement to IP. This document is a product of the IRTF Routing Research Group. This document defines an Experimental Protocol for the Internet community.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="6741"/>
  <seriesInfo name="DOI" value="10.17487/RFC6741"/>
</reference>
<reference anchor="RFC6748">
  <front>
    <title>Optional Advanced Deployment Scenarios for the Identifier-Locator Network Protocol (ILNP)</title>
    <author fullname="RJ Atkinson" initials="RJ" surname="Atkinson"/>
    <author fullname="SN Bhatti" initials="SN" surname="Bhatti"/>
    <date month="November" year="2012"/>
    <abstract>
      <t>This document provides an Architectural description and the Concept of Operations of some optional advanced deployment scenarios for the Identifier-Locator Network Protocol (ILNP), which is an evolutionary enhancement to IP. None of the functions described here is required for the use or deployment of ILNP. Instead, it offers descriptions of engineering and deployment options that might provide either enhanced capability or convenience in administration or management of ILNP-based systems. This document defines an Experimental Protocol for the Internet community.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="6748"/>
  <seriesInfo name="DOI" value="10.17487/RFC6748"/>
</reference>
<reference anchor="RFC8200">
  <front>
    <title>Internet Protocol, Version 6 (IPv6) Specification</title>
    <author fullname="S. Deering" initials="S." surname="Deering"/>
    <author fullname="R. Hinden" initials="R." surname="Hinden"/>
    <date month="July" year="2017"/>
    <abstract>
      <t>This document specifies version 6 of the Internet Protocol (IPv6). It obsoletes RFC 2460.</t>
    </abstract>
  </front>
  <seriesInfo name="STD" value="86"/>
  <seriesInfo name="RFC" value="8200"/>
  <seriesInfo name="DOI" value="10.17487/RFC8200"/>
</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>

    <references title='Informative References' anchor="sec-informative-references">

<reference anchor="draft-bhatti-ilnp-ip6-apps" >
  <front>
    <title>ILNP usage by IPv6 applications</title>
    <author initials="S. N." surname="Bhatti" fullname="Saleem N. Bhatti">
      <organization>University of St Andrews, UK</organization>
    </author>
    <author initials="G. T." surname="Haywood" fullname="Gregor T. Haywood">
      <organization>Abertay University, UK</organization>
    </author>
    <author initials="R." surname="Yanagida" fullname="Ryo Yanagida">
      <organization>University of St Andrews, UK</organization>
    </author>
    <author initials="R. W." surname="Grimes" fullname="Rodney W. Grimes">
      <organization>Independent, USA</organization>
    </author>
    <date year="2026" month="October" day="05"/>
  </front>
<annotation>A related draft that is being produced in parallel.</annotation></reference>


    </references>

</references>


<?line 540?>

<section numbered="false" anchor="s-acknowledgements"><name>Acknowledgements</name>

<t>The authors are grateful to the many members of the IETF community for their feedback on ILNP during IETF meetings, and to the IETF NOC Team who made possible testing and experiments for ILNP during those meetings and the IETF Hackathon events.</t>

<t>The authors also thank those participants of the RIPE92 meeting (18-22 May 2026, Edinburgh, UK) who gave comments, feedback, and encouragement that led to this document being written.</t>

<t>Thanks to Mike Heard (C. M. Heard) for comments to help clarify some of the text in this draft.</t>

<t>This work was partly supported by the <em>ICANN Grant Program</em>.</t>

</section>


  </back>

<!-- ##markdown-source:
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
U/FdhW+Df1uV+FKO+1Hwv1BE9eYiaQAA

-->

</rfc>

