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