<?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.2) -->


<!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-00" 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="June" day="17"/>

    <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 source L64 and destination L64 values are written into place in the packet and then the transport layer checksum is recalculated over the <em>whole</em> packet.
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.</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_i</spanx>.</t>
  <t><spanx style="verb">c_n</spanx> is then copied back into the checksum field for the packet.</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="May" day="08"/>
  </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>This work was partly supported by the <em>ICANN Grant Program</em>.</t>

</section>


  </back>

<!-- ##markdown-source:
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
szPxXYkvZH9TFvhejL0o+F+HmfFwpWgAAA==

-->

</rfc>

