| .. SPDX-License-Identifier: GPL-2.0 | |
| =================================== | |
| Identifier Locator Addressing (ILA) | |
| =================================== | |
| Introduction | |
| ============ | |
| Identifier-locator addressing (ILA) is a technique used with IPv6 that | |
| differentiates between location and identity of a network node. Part of an | |
| address expresses the immutable identity of the node, and another part | |
| indicates the location of the node which can be dynamic. Identifier-locator | |
| addressing can be used to efficiently implement overlay networks for | |
| network virtualization as well as solutions for use cases in mobility. | |
| ILA can be thought of as means to implement an overlay network without | |
| encapsulation. This is accomplished by performing network address | |
| translation on destination addresses as a packet traverses a network. To | |
| the network, an ILA translated packet appears to be no different than any | |
| other IPv6 packet. For instance, if the transport protocol is TCP then an | |
| ILA translated packet looks like just another TCP/IPv6 packet. The | |
| advantage of this is that ILA is transparent to the network so that | |
| optimizations in the network, such as ECMP, RSS, GRO, GSO, etc., just work. | |
| The ILA protocol is described in Internet-Draft draft-herbert-intarea-ila. | |
| ILA terminology | |
| =============== | |
| - Identifier | |
| A number that identifies an addressable node in the network | |
| independent of its location. ILA identifiers are sixty-four | |
| bit values. | |
| - Locator | |
| A network prefix that routes to a physical host. Locators | |
| provide the topological location of an addressed node. ILA | |
| locators are sixty-four bit prefixes. | |
| - ILA mapping | |
| A mapping of an ILA identifier to a locator (or to a | |
| locator and meta data). An ILA domain maintains a database | |
| that contains mappings for all destinations in the domain. | |
| - SIR address | |
| An IPv6 address composed of a SIR prefix (upper sixty- | |
| four bits) and an identifier (lower sixty-four bits). | |
| SIR addresses are visible to applications and provide a | |
| means for them to address nodes independent of their | |
| location. | |
| - ILA address | |
| An IPv6 address composed of a locator (upper sixty-four | |
| bits) and an identifier (low order sixty-four bits). ILA | |
| addresses are never visible to an application. | |
| - ILA host | |
| An end host that is capable of performing ILA translations | |
| on transmit or receive. | |
| - ILA router | |
| A network node that performs ILA translation and forwarding | |
| of translated packets. | |
| - ILA forwarding cache | |
| A type of ILA router that only maintains a working set | |
| cache of mappings. | |
| - ILA node | |
| A network node capable of performing ILA translations. This | |
| can be an ILA router, ILA forwarding cache, or ILA host. | |
| Operation | |
| ========= | |
| There are two fundamental operations with ILA: | |
| - Translate a SIR address to an ILA address. This is performed on ingress | |
| to an ILA overlay. | |
| - Translate an ILA address to a SIR address. This is performed on egress | |
| from the ILA overlay. | |
| ILA can be deployed either on end hosts or intermediate devices in the | |
| network; these are provided by "ILA hosts" and "ILA routers" respectively. | |
| Configuration and datapath for these two points of deployment is somewhat | |
| different. | |
| The diagram below illustrates the flow of packets through ILA as well | |
| as showing ILA hosts and routers:: | |
| +--------+ +--------+ | |
| | Host A +-+ +--->| Host B | | |
| | | | (2) ILA (') | | | |
| +--------+ | ...addressed.... ( ) +--------+ | |
| V +---+--+ . packet . +---+--+ (_) | |
| (1) SIR | | ILA |----->-------->---->| ILA | | (3) SIR | |
| addressed +->|router| . . |router|->-+ addressed | |
| packet +---+--+ . IPv6 . +---+--+ packet | |
| / . Network . | |
| / . . +--+-++--------+ | |
| +--------+ / . . |ILA || Host | | |
| | Host +--+ . .- -|host|| | | |
| | | . . +--+-++--------+ | |
| +--------+ ................ | |
| Transport checksum handling | |
| =========================== | |
| When an address is translated by ILA, an encapsulated transport checksum | |
| that includes the translated address in a pseudo header may be rendered | |
| incorrect on the wire. This is a problem for intermediate devices, | |
| including checksum offload in NICs, that process the checksum. There are | |
| three options to deal with this: | |
| - no action Allow the checksum to be incorrect on the wire. Before | |
| a receiver verifies a checksum the ILA to SIR address | |
| translation must be done. | |
| - adjust transport checksum | |
| When ILA translation is performed the packet is parsed | |
| and if a transport layer checksum is found then it is | |
| adjusted to reflect the correct checksum per the | |
| translated address. | |
| - checksum neutral mapping | |
| When an address is translated the difference can be offset | |
| elsewhere in a part of the packet that is covered by | |
| the checksum. The low order sixteen bits of the identifier | |
| are used. This method is preferred since it doesn't require | |
| parsing a packet beyond the IP header and in most cases the | |
| adjustment can be precomputed and saved with the mapping. | |
| Note that the checksum neutral adjustment affects the low order sixteen | |
| bits of the identifier. When ILA to SIR address translation is done on | |
| egress the low order bits are restored to the original value which | |
| restores the identifier as it was originally sent. | |
| Identifier types | |
| ================ | |
| ILA defines different types of identifiers for different use cases. | |
| The defined types are: | |
| 0: interface identifier | |
| 1: locally unique identifier | |
| 2: virtual networking identifier for IPv4 address | |
| 3: virtual networking identifier for IPv6 unicast address | |
| 4: virtual networking identifier for IPv6 multicast address | |
| 5: non-local address identifier | |
| In the current implementation of kernel ILA only locally unique identifiers | |
| (LUID) are supported. LUID allows for a generic, unformatted 64 bit | |
| identifier. | |
| Identifier formats | |
| ================== | |
| Kernel ILA supports two optional fields in an identifier for formatting: | |
| "C-bit" and "identifier type". The presence of these fields is determined | |
| by configuration as demonstrated below. | |
| If the identifier type is present it occupies the three highest order | |
| bits of an identifier. The possible values are given in the above list. | |
| If the C-bit is present, this is used as an indication that checksum | |
| neutral mapping has been done. The C-bit can only be set in an | |
| ILA address, never a SIR address. | |
| In the simplest format the identifier types, C-bit, and checksum | |
| adjustment value are not present so an identifier is considered an | |
| unstructured sixty-four bit value:: | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |
| | Identifier | | |
| + + | |
| | | | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |
| The checksum neutral adjustment may be configured to always be | |
| present using neutral-map-auto. In this case there is no C-bit, but the | |
| checksum adjustment is in the low order 16 bits. The identifier is | |
| still sixty-four bits:: | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |
| | Identifier | | |
| | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |
| | | Checksum-neutral adjustment | | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |
| The C-bit may used to explicitly indicate that checksum neutral | |
| mapping has been applied to an ILA address. The format is:: | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |
| | |C| Identifier | | |
| | +-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |
| | | Checksum-neutral adjustment | | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |
| The identifier type field may be present to indicate the identifier | |
| type. If it is not present then the type is inferred based on mapping | |
| configuration. The checksum neutral adjustment may automatically | |
| used with the identifier type as illustrated below:: | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |
| | Type| Identifier | | |
| +-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |
| | | Checksum-neutral adjustment | | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |
| If the identifier type and the C-bit can be present simultaneously so | |
| the identifier format would be:: | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |
| | Type|C| Identifier | | |
| +-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |
| | | Checksum-neutral adjustment | | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |
| Configuration | |
| ============= | |
| There are two methods to configure ILA mappings. One is by using LWT routes | |
| and the other is ila_xlat (called from NFHOOK PREROUTING hook). ila_xlat | |
| is intended to be used in the receive path for ILA hosts . | |
| An ILA router has also been implemented in XDP. Description of that is | |
| outside the scope of this document. | |
| The usage of for ILA LWT routes is: | |
| ip route add DEST/128 encap ila LOC csum-mode MODE ident-type TYPE via ADDR | |
| Destination (DEST) can either be a SIR address (for an ILA host or ingress | |
| ILA router) or an ILA address (egress ILA router). LOC is the sixty-four | |
| bit locator (with format W:X:Y:Z) that overwrites the upper sixty-four | |
| bits of the destination address. Checksum MODE is one of "no-action", | |
| "adj-transport", "neutral-map", and "neutral-map-auto". If neutral-map is | |
| set then the C-bit will be present. Identifier TYPE one of "luid" or | |
| "use-format." In the case of use-format, the identifier type field is | |
| present and the effective type is taken from that. | |
| The usage of ila_xlat is: | |
| ip ila add loc_match MATCH loc LOC csum-mode MODE ident-type TYPE | |
| MATCH indicates the incoming locator that must be matched to apply | |
| a the translaiton. LOC is the locator that overwrites the upper | |
| sixty-four bits of the destination address. MODE and TYPE have the | |
| same meanings as described above. | |
| Some examples | |
| ============= | |
| :: | |
| # Configure an ILA route that uses checksum neutral mapping as well | |
| # as type field. Note that the type field is set in the SIR address | |
| # (the 2000 implies type is 1 which is LUID). | |
| ip route add 3333:0:0:1:2000:0:1:87/128 encap ila 2001:0:87:0 \ | |
| csum-mode neutral-map ident-type use-format | |
| # Configure an ILA LWT route that uses auto checksum neutral mapping | |
| # (no C-bit) and configure identifier type to be LUID so that the | |
| # identifier type field will not be present. | |
| ip route add 3333:0:0:1:2000:0:2:87/128 encap ila 2001:0:87:1 \ | |
| csum-mode neutral-map-auto ident-type luid | |
| ila_xlat configuration | |
| # Configure an ILA to SIR mapping that matches a locator and overwrites | |
| # it with a SIR address (3333:0:0:1 in this example). The C-bit and | |
| # identifier field are used. | |
| ip ila add loc_match 2001:0:119:0 loc 3333:0:0:1 \ | |
| csum-mode neutral-map-auto ident-type use-format | |
| # Configure an ILA to SIR mapping where checksum neutral is automatically | |
| # set without the C-bit and the identifier type is configured to be LUID | |
| # so that the identifier type field is not present. | |
| ip ila add loc_match 2001:0:119:0 loc 3333:0:0:1 \ | |
| csum-mode neutral-map-auto ident-type use-format |