1f3aa363dSVladimir Medvedkin.. SPDX-License-Identifier: BSD-3-Clause 2f3aa363dSVladimir Medvedkin Copyright(c) 2021 Intel Corporation. 3f3aa363dSVladimir Medvedkin 4*41dd9a6bSDavid YoungForwarding Information Base (FIB) Library 5*41dd9a6bSDavid Young========================================= 6f3aa363dSVladimir Medvedkin 7f3aa363dSVladimir MedvedkinThe FIB library provides a fast Longest Prefix Match (LPM) search for 32-bit 8f3aa363dSVladimir Medvedkinkeys or 128-bit for IPv6. It can be used in a variety of applications, 9f3aa363dSVladimir Medvedkinthe most typical of which is IPv4/IPv6 forwarding. 10f3aa363dSVladimir Medvedkin 11f3aa363dSVladimir Medvedkin.. note:: 12f3aa363dSVladimir Medvedkin 13f3aa363dSVladimir Medvedkin The API and implementation are very similar for IPv4 ``rte_fib`` API and IPv6 ``rte_fib6`` 14f3aa363dSVladimir Medvedkin API, therefore only the ``rte_fib`` API will be discussed here. 15f3aa363dSVladimir Medvedkin Everything within this document except for the size of the prefixes is applicable to the 16f3aa363dSVladimir Medvedkin ``rte_fib6`` API. 17f3aa363dSVladimir Medvedkin 18f3aa363dSVladimir Medvedkin 19f3aa363dSVladimir MedvedkinFIB API Overview 20f3aa363dSVladimir Medvedkin---------------- 21f3aa363dSVladimir Medvedkin 22f3aa363dSVladimir MedvedkinThe main configuration struct contains: 23f3aa363dSVladimir Medvedkin 24f3aa363dSVladimir Medvedkin* Type of :ref:`dataplane algorithm <fib_dataplane_algorithms>`. 25f3aa363dSVladimir Medvedkin 26f3aa363dSVladimir Medvedkin* Default next hop ID. 27f3aa363dSVladimir Medvedkin 28f3aa363dSVladimir Medvedkin* The maximum number of routes. 29f3aa363dSVladimir Medvedkin 30f3aa363dSVladimir Medvedkin* Settings for the data algorithm (:ref:`will be discussed later <fib_dataplane_algorithms>`). 31f3aa363dSVladimir Medvedkin 32f3aa363dSVladimir MedvedkinA FIB rule consists of a prefix and an associated next hop ID. The prefix consists 33f3aa363dSVladimir Medvedkinof an IPv4 network address (``uint32_t``) and the corresponding prefix length. 34f3aa363dSVladimir MedvedkinThe prefix serves as the key and the next hop ID as the value while doing an LPM 35f3aa363dSVladimir Medvedkinsearch within FIB. The size of the next hop ID is variable and must be configured 36f3aa363dSVladimir Medvedkinduring initialization. 37f3aa363dSVladimir Medvedkin 38f3aa363dSVladimir MedvedkinThe main methods within the ``rte_fib`` API are: 39f3aa363dSVladimir Medvedkin 40f3aa363dSVladimir Medvedkin* ``rte_fib_add()``: Add a new route with a corresponding next hop ID to the 41f3aa363dSVladimir Medvedkin table or update the next hop ID if the prefix already exists in a table. 42f3aa363dSVladimir Medvedkin 43f3aa363dSVladimir Medvedkin* ``rte_fib_delete()``: Delete an existing route from the table. 44f3aa363dSVladimir Medvedkin 45f3aa363dSVladimir Medvedkin* ``rte_fib_lookup_bulk()``: Provides a bulk Longest Prefix Match (LPM) lookup function 46f3aa363dSVladimir Medvedkin for a set of IP addresses, it will return a set of corresponding next hop IDs. 47f3aa363dSVladimir Medvedkin 48f3aa363dSVladimir Medvedkin 49f3aa363dSVladimir MedvedkinImplementation details 50f3aa363dSVladimir Medvedkin---------------------- 51f3aa363dSVladimir Medvedkin 52f3aa363dSVladimir MedvedkinInternally FIB contains the ``rte_rib`` data struct to help maintain the dataplane struct. 53f3aa363dSVladimir MedvedkinThe dataplane struct is opaque, so that users can add their own algorithm implementations. 54f3aa363dSVladimir Medvedkin 55f3aa363dSVladimir Medvedkin.. _fib_dataplane_algorithms: 56f3aa363dSVladimir Medvedkin 57f3aa363dSVladimir Medvedkin 58f3aa363dSVladimir MedvedkinDataplane Algorithms 59f3aa363dSVladimir Medvedkin-------------------- 60f3aa363dSVladimir Medvedkin 61f3aa363dSVladimir Medvedkin 62f3aa363dSVladimir MedvedkinDummy 63f3aa363dSVladimir Medvedkin~~~~~ 64f3aa363dSVladimir Medvedkin 65f3aa363dSVladimir MedvedkinThis algorithm uses ``rte_rib`` as a dataplane struct. Lookups are relatively slow, 66f3aa363dSVladimir Medvedkinbut extra memory isn't used for the dataplane struct. This algorithm should only 67f3aa363dSVladimir Medvedkinbe used for testing and debugging purposes. 68f3aa363dSVladimir Medvedkin 69f3aa363dSVladimir MedvedkinThis algorithm will be used if the ``RTE_FIB_DUMMY`` type is configured as the 70f3aa363dSVladimir Medvedkindataplane algorithm on FIB creation. 71f3aa363dSVladimir Medvedkin 72f3aa363dSVladimir Medvedkin 73f3aa363dSVladimir MedvedkinDIR-24-8 74f3aa363dSVladimir Medvedkin~~~~~~~~ 75f3aa363dSVladimir Medvedkin 76f3aa363dSVladimir MedvedkinThe current implementation of this algorithm uses a variation of the DIR-24-8 77f3aa363dSVladimir Medvedkinalgorithm that trades memory usage for improved LPM lookup speed. 78f3aa363dSVladimir MedvedkinThis algorithm allows the lookup operation to be performed using only a single 79f3aa363dSVladimir Medvedkinmemory read access in most cases. In the statistically rare case where the best 80f3aa363dSVladimir Medvedkinmatch rule has a depth larger than 24, the lookup operation will require two 81f3aa363dSVladimir Medvedkinmemory read accesses. 82f3aa363dSVladimir Medvedkin 83f3aa363dSVladimir MedvedkinThis algorithm will be used if the ``RTE_FIB_DIR24_8`` type is configured as the 84f3aa363dSVladimir Medvedkindataplane algorithm on FIB creation. 85f3aa363dSVladimir Medvedkin 86f3aa363dSVladimir MedvedkinThe main FIB configuration struct stores the dataplane parameters inside ``dir24_8`` 87f3aa363dSVladimir Medvedkinwithin the ``rte_fib_conf`` and it consists of: 88f3aa363dSVladimir Medvedkin 89f3aa363dSVladimir Medvedkin* ``nh_sz``: The size of the entry containing the next hop ID. 90f3aa363dSVladimir Medvedkin This could be 1, 2, 4 or 8 bytes long. 91f3aa363dSVladimir Medvedkin Note that all available bits except one are used to store the actual next hop ID. 92f3aa363dSVladimir Medvedkin 93f3aa363dSVladimir Medvedkin* ``num_tbl8``: The number of tbl8 groups, each group consists of 256 entries 94f3aa363dSVladimir Medvedkin corresponding to the ``nh_sz`` size. 95f3aa363dSVladimir Medvedkin 96f3aa363dSVladimir MedvedkinThe main elements of the dataplane struct for the DIR-24-8 algorithm are: 97f3aa363dSVladimir Medvedkin 98f3aa363dSVladimir Medvedkin* TBL24: An array with 2\ :sup:`24` entries, corresponding to the ``nh_sz`` size. 99f3aa363dSVladimir Medvedkin 100f3aa363dSVladimir Medvedkin* TBL8: An array of ``num_tbl8`` tbl8 groups. 101f3aa363dSVladimir Medvedkin 102f3aa363dSVladimir MedvedkinThe lookup algorithms logic can be seen in :numref:`figure_dir_24_8_alg`: 103f3aa363dSVladimir Medvedkin 104f3aa363dSVladimir Medvedkin.. _figure_dir_24_8_alg: 105f3aa363dSVladimir Medvedkin 106f3aa363dSVladimir Medvedkin.. figure:: img/dir_24_8_alg.* 107f3aa363dSVladimir Medvedkin 108f3aa363dSVladimir Medvedkin DIR-24-8 Lookup algorithm 109f3aa363dSVladimir Medvedkin 110f3aa363dSVladimir MedvedkinThe first table ``tbl24``, is indexed using the first 24 bits of the IP address to be looked up, 111f3aa363dSVladimir Medvedkinwhile the second table(s) ``tbl8``, is indexed using the last 8 bits of the IP address. 112f3aa363dSVladimir MedvedkinThis means that depending on the outcome of trying to match the IP address of an incoming packet 113f3aa363dSVladimir Medvedkinto a rule stored in the tbl24 we might need to continue the lookup process in the second level. 114f3aa363dSVladimir Medvedkin 115f3aa363dSVladimir MedvedkinSince every entry of the tbl24 can potentially point to a tbl8, 116f3aa363dSVladimir Medvedkinideally we would have 2\ :sup:`24` tbl8s, which would be the same as having a 117f3aa363dSVladimir Medvedkinsingle table with 2\ :sup:`32` entries. This is not feasible due to resource restrictions. 118f3aa363dSVladimir MedvedkinInstead, this approach takes advantage of the fact that rules longer than 24 bits are very rare. 119f3aa363dSVladimir MedvedkinBy splitting the process into two different tables/levels and limiting the number of tbl8s, 120f3aa363dSVladimir Medvedkinwe can greatly reduce memory consumption while maintaining a very good lookup speed. 121f3aa363dSVladimir MedvedkinThis method generally results in one memory access per lookup. 122f3aa363dSVladimir Medvedkin 123f3aa363dSVladimir MedvedkinAn entry in a tbl8 contains the following fields: 124f3aa363dSVladimir Medvedkin 125f3aa363dSVladimir Medvedkin* The next hop ID. 126f3aa363dSVladimir Medvedkin 127f3aa363dSVladimir Medvedkin* 1 bit indicating if the lookup should proceed inside the tbl8. 128f3aa363dSVladimir Medvedkin 129f3aa363dSVladimir Medvedkin 130f3aa363dSVladimir MedvedkinUse cases 131f3aa363dSVladimir Medvedkin--------- 132f3aa363dSVladimir Medvedkin 133f3aa363dSVladimir MedvedkinThe FIB library is useful for any use cases that rely on the Longest Prefix Match (LPM) 134f3aa363dSVladimir Medvedkinalgorithm such as IP forwarding or packet classification. 135f3aa363dSVladimir Medvedkin 136f3aa363dSVladimir MedvedkinMore complex use cases are also possible, as it is possible to have next hop IDs 137f3aa363dSVladimir Medvedkinwhich are 63 bits long (using ``RTE_FIB_DIR24_8_8B`` as a next hop size). 138f3aa363dSVladimir MedvedkinThese use cases could include storing two next hop IDs inside the 63 bits of the next hop. 139f3aa363dSVladimir MedvedkinThis may be useful to provide a fallback next hop ID, ASN or forwarding class 140f3aa363dSVladimir Medvedkincorresponding to a given prefix without having to perform an additional lookup. 141