xref: /dpdk/doc/guides/prog_guide/fib_lib.rst (revision f3aa363df2b8ca80c28668cb2aa66e4f60d334f5)
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