blob: 34886e18a44ad6e8b97a2fd250c6f95c06caded8 [file] [log] [blame]
jdenisco0923a232018-08-29 13:19:43 -04001.. _dataplane:
2
3The Data Plane
4---------------
5
6The data-plane data model is a directed, acyclic [#f16]_ graph of heterogeneous objects.
7A packet will forward walk the graph as it is switched. Each object describes
8the actions to perform on the packet. Each object type has an associated VLIB
9graph node. For a packet to forward walk the graph is therefore to move from one
10VLIB node to the next, with each performing the required actions. This is the
11heart of the VPP model.
12
13The data-plane graph is composed of generic data-path objects (DPOs). A parent
14DPO is identified by the tuple:{type,index,next_node}. The *next_node* parameter
15is the index of the VLIB node to which the packets should be sent next, this is
16present to maximise performance - it is important to ensure that the parent does
17not need to be read [#f17]_ whilst processing the child. Specialisations [#f18]_ of the DPO
18perform distinct actions. The most common DPOs and briefly what they represent are:
19
20- Load-balance: a choice in an ECMP set.
21- Adjacency: apply a rewrite and forward through an interface
22- MPLS-label: impose an MPLS label.
23- Lookup: perform another lookup in a different table.
24
25The data-plane graph is derived from the control-plane graph by the objects
26therein 'contributing' a DPO to the data-plane graph. Objects in the data-plane
27contain only the information needed to switch a packet, they are therefore
28simpler, and in memory terms smaller, with the aim to fit one DPO on a single
29cache-line. The derivation from the control plane means that the data-plane
30graph contains only object whose current state can forward packets. For example,
31the difference between a *fib_path_list_t* and a *load_balance_t* is that the former
32expresses the control-plane's desired state, the latter the data-plane available
33state. If some paths in the path-list are unresolved or down, then the
34load-balance will not include them in the forwarding choice.
35
36.. figure:: /_images/fib20fig8.png
37
38Figure 8: DPO contributions for a non-recursive route
39
40Figure 8 shows a simplified view of the control-plane graph indicating those
41objects that contribute DPOs. Also shown are the VLIB node graphs at which the DPO is used.
42
43Each *fib_entry_t* contributes it own *load_balance_t*, for three reasons;
44
45- The result of a lookup in a IPv[46] table is a single 32 bit unsigned integer. This is an index into a memory pool. Consequently the object type must be the same for each result. Some routes will need a load-balance and some will not, but to insert another object in the graph to represent this choice is a waste of cycles, so the load-balance object is always the result. If the route does not have ECMP, then the load-balance has only one choice.
46
47- In order to collect per-route counters, the lookup result must in some way uniquely identify the *fib_entry_t*. A shared load-balance (contributed by the path-list) would not allow this.
48- In the case the *fib_entry_t* has MPLS out labels, and hence a *fib_path_ext_t*, then the load-balance must be per-prefix, since the MPLS labels that are its parents are themselves per-fib_entry_t.
49
50.. figure:: /_images/fib20fig9.png
51
52Figure 9: DPO contribution for a recursive route.
53
54Figure 9 shows the load-balance objects contributed for a recursive route.
55
56.. figure:: /_images/fib20fig10.png
57
58Figure 10: DPO Contributions from labelled recursive routes.
59
60Figure 10 shows the derived data-plane graph for a labelled recursive route.
61There can be as many MPLS-label DPO instances as there are routes multiplied by
62the number of paths per-route. For this reason the mpls-label DPO should be as
63small as possible [#f19]_.
64
65The data-plane graph is constructed by 'stacking' one
66instance of a DPO on another to form the child-parent relationship. When this
67stacking occurs, the necessary VLIB graph arcs are automatically constructed
68from the respected DPO type's registered graph nodes.
69
70The diagrams above show that for any given route the full data-plane graph is
Paul Vinciguerra7fa3dd22019-10-27 17:28:10 -040071known before any packet arrives. If that graph is composed of n objects, then the
jdenisco0923a232018-08-29 13:19:43 -040072packet will visit n nodes and thus incur a forwarding cost of approximately n
73times the graph node cost. This could be reduced if the graph were *collapsed*
Neale Rannsdfd39542020-11-09 10:09:42 +000074into fewer DPOs and nodes. There are two ways we might consider doing
75this:
jdenisco0923a232018-08-29 13:19:43 -040076
Neale Rannsdfd39542020-11-09 10:09:42 +000077- write custom DPOs/nodes for combinded functions, e.g. pop MPLS label
78 and lookup in v4 table. This has the disadvantage that the number of
79 such nodes would be, well, combinatorial, and resolving a path via
80 a combined DPO would be more difficult as it would involve a
81 forward walk of the graph to determine what the combination
82 is. However, VPP power users might consider this option for a
83 limited set of their use cases where performance is truely king.
84- collapse multiple levels of load-balancing into one. For example,
85 if there were two levels of load-balancing each with two choices,
86 this could equally be represented by one level with 4 choices.
jdenisco0923a232018-08-29 13:19:43 -040087
Neale Rannsdfd39542020-11-09 10:09:42 +000088In either case a disadvantage to collapsing the graph is that it
89removes the indirection objects that provide fast convergence (see
90section Fast Convergence). To collapse is then a trade-off between
91faster forwarding and fast convergence; VPP favours the latter.
92
jdenisco0923a232018-08-29 13:19:43 -040093
94.. rubric:: Footnotes:
95
96.. [#f16] Directed implies it cannot be back-walked. It is acyclic even in the presence of a recursion loop.
97.. [#f17] Loaded into cache, and hence potentially incurring a d-cache miss.
98.. [#f18] The engaged reader is directed to vnet/vnet/dpo/*
99.. [#f19] i.e. we should not re-use the adjacency structure.
100