mirror of
https://github.com/openvswitch/ovs
synced 2025-10-29 15:28:56 +00:00
Classifier: Track address prefixes.
Add a prefix tree (trie) structure for tracking the used address space, enabling skipping classifier tables containing longer masks than necessary for an address field value in a packet header being classified. This enables less unwildcarding for datapath flows in parts of the address space without host routes. Trie lookup is interwoven to the staged lookup, so that a trie is searched only when the configured trie field becomes relevant for the lookup. The trie lookup results are retained so that each trie is checked at most once for each classifier lookup. This implementation tracks the number of rules at each address prefix for the whole classifier. More aggressive table skipping would be possible by maintaining lists of tables that have prefixes at the lengths encountered on tree traversal, or by maintaining separate tries for subsets of rules separated by metadata fields. Prefix tracking is configured via OVSDB. A new column "prefixes" is added to the database table "Flow_Table". "prefixes" is a set of string values listing the field names for which prefix lookup should be used. As of now, the fields for which prefix lookup can be enabled are: - tun_id, tun_src, tun_dst - nw_src, nw_dst (or aliases ip_src and ip_dst) - ipv6_src, ipv6_dst There is a maximum number of fields that can be enabled for any one flow table. Currently this limit is 3. Examples: ovs-vsctl set Bridge br0 flow_tables:0=@N1 -- \ --id=@N1 create Flow_Table name=table0 ovs-vsctl set Bridge br0 flow_tables:1=@N1 -- \ --id=@N1 create Flow_Table name=table1 ovs-vsctl set Flow_Table table0 prefixes=ip_dst,ip_src ovs-vsctl set Flow_Table table1 prefixes=[] Signed-off-by: Jarno Rajahalme <jrajahalme@nicira.com> Acked-by: Ben Pfaff <blp@nicira.com>
This commit is contained in:
12
lib/flow.c
12
lib/flow.c
@@ -1241,12 +1241,16 @@ miniflow_alloc_values(struct miniflow *flow, int n)
|
||||
|
||||
/* Completes an initialization of 'dst' as a miniflow copy of 'src' begun by
|
||||
* the caller. The caller must have already initialized 'dst->map' properly
|
||||
* to indicate the nonzero uint32_t elements of 'src'. 'n' must be the number
|
||||
* of 1-bits in 'dst->map'.
|
||||
* to indicate the significant uint32_t elements of 'src'. 'n' must be the
|
||||
* number of 1-bits in 'dst->map'.
|
||||
*
|
||||
* Normally the significant elements are the ones that are non-zero. However,
|
||||
* when a miniflow is initialized from a (mini)mask, the values can be zeroes,
|
||||
* so that the flow and mask always have the same maps.
|
||||
*
|
||||
* This function initializes 'dst->values' (either inline if possible or with
|
||||
* malloc() otherwise) and copies the nonzero uint32_t elements of 'src' into
|
||||
* it. */
|
||||
* malloc() otherwise) and copies the uint32_t elements of 'src' indicated by
|
||||
* 'dst->map' into it. */
|
||||
static void
|
||||
miniflow_init__(struct miniflow *dst, const struct flow *src, int n)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user