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