summaryrefslogtreecommitdiff
path: root/lib/classifier.h
Commit message (Collapse)AuthorAgeFilesLines
* flow, match, classifier: Add new functions for miniflow and minimatch.Ben Pfaff2018-03-311-0/+4
| | | | | | | | | | | The miniflow and minimatch APIs lack several of the features of the flow and match APIs. This commit adds a few of the missing functions. These functions will be used for the first time in an upcoming commit. Signed-off-by: Ben Pfaff <blp@ovn.org> Reviewed-by: Yifeng Sun <pkusunyifeng@gmail.com> Reviewed-by: Armando Migliaccio <armamig@gmail.com>
* Clean up some minor spelling and typos.Justin Pettit2018-03-141-2/+2
| | | | | Signed-off-by: Justin Pettit <jpettit@ovn.org> Acked-by: Ben Pfaff <blp@ovn.org>
* classifier: Refactor interface for classifier_remove().Ben Pfaff2018-01-311-2/+2
| | | | | | | | | | | | | | Until now, classifier_remove() returned either null or the classifier rule passed to it, which is an unusual interface. This commit changes it to return true if it succeeds or false on failure. In addition, most of classifier_remove()'s callers know ahead of time that it must succeed, even though most of them didn't bother with an assertion, so this commit adds a classifier_remove_assert() function as a helper. Signed-off-by: Ben Pfaff <blp@ovn.org> Tested-by: Yifeng Sun <pkusunyifeng@gmail.com> Reviewed-by: Yifeng Sun <pkusunyifeng@gmail.com>
* classifier: Fix typo in comment.Ben Pfaff2018-01-301-1/+1
| | | | | Signed-off-by: Ben Pfaff <blp@ovn.org> Reviewed-by: Yifeng Sun <pkusunyifeng@gmail.com>
* Support accepting and displaying port names in OVS tools.Ben Pfaff2017-05-311-2/+2
| | | | | | | | | | | | | | Until now, most ovs-ofctl commands have not accepted names for ports, only numbers, and have not been able to display port names either. It's a lot easier for users if they can use and see meaningful names instead of arbitrary numbers. This commit adds that support. For backward compatibility, only interactive ovs-ofctl commands by default display port names; to display them in scripts, use the new --names option. Signed-off-by: Ben Pfaff <blp@ovn.org> Tested-by: Aaron Conole <aconole@redhat.com>
* tun-metadata: Manage tunnel TLV mapping table on a per-bridge basis.Jesse Gross2016-09-191-1/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | When using tunnel TLVs (at the moment, this means Geneve options), a controller must first map the class and type onto an appropriate OXM field so that it can be used in OVS flow operations. This table is managed using OpenFlow extensions. The original code that added support for TLVs made the mapping table global as a simplification. However, this is not really logically correct as the OpenFlow management commands are operating on a per-bridge basis. This removes the original limitation to make the table per-bridge. One nice result of this change is that it is generally clearer whether the tunnel metadata is in datapath or OpenFlow format. Rather than allowing ad-hoc format changes and trying to handle both formats in the tunnel metadata functions, the format is more clearly separated by function. Datapaths (both kernel and userspace) use datapath format and it is not changed during the upcall process. At the beginning of action translation, tunnel metadata is converted to OpenFlow format and flows and wildcards are translated back at the end of the process. As an additional benefit, this change improves performance in some flow setup situations by keeping the tunnel metadata in the original packet format in more cases. This helps when copies need to be made as the amount of data touched is only what is present in the packet rather than the maximum amount of metadata supported. Co-authored-by: Madhu Challa <challa@noironetworks.com> Signed-off-by: Madhu Challa <challa@noironetworks.com> Signed-off-by: Jesse Gross <jesse@kernel.org> Acked-by: Ben Pfaff <blp@ovn.org>
* Revert "pvector: Expose non-concurrent priority vector."Jarno Rajahalme2016-08-101-3/+3
| | | | | | | | | | | | | | | This reverts commit 8bdfe1313894047d44349fa4cf4402970865950f. I failed to see that lib/dpif-netdev.c actually needs the concurrency provided by pvector prior to this change. More specifically, when a subtable is removed, concurrent lookups may skip over another subtable swapped in to the place of the removed subtable in the vector. Since this was the only use of the non-concurrent pvector, it is cleaner to revert the whole patch. Reported-by: Jan Scheurich <jan.scheurich@ericsson.com> Signed-off-by: Jarno Rajahalme <jarno@ovn.org> Acked-by: Daniele Di Proietto <diproiettod@vmware.com>
* lib: Separate versioning to its own module.Jarno Rajahalme2016-07-291-17/+12
| | | | | | | | Separate rule versioning to lib/versions.h to make it easier to use versioning for other data types. Signed-off-by: Jarno Rajahalme <jarno@ovn.org> Acked-by: Ben Pfaff <blp@ovn.org>
* pvector: Expose non-concurrent priority vector.Jarno Rajahalme2016-07-291-3/+3
| | | | | | | | | | | | PMD threads use pvectors but do not need the overhead of the concurrent version. Expose the non-concurrent version for that use. Note that struct pvector is renamed as struct cpvector (for concurrent priority vector), and the former struct pvector_impl is now struct pvector. Signed-off-by: Jarno Rajahalme <jarno@ovn.org> Acked-by: Ben Pfaff <blp@ovn.org>
* classifier: Reorganize classifier.hJarno Rajahalme2016-04-171-15/+18
| | | | | | | Group functions clearly to ones accessible by exclusive writers only and ones accessible to RCU readers as well. Signed-off-by: Jarno Rajahalme <jarno@ovn.org>
* classifier: Fix race condition leading to NULL dereference.Jarno Rajahalme2016-04-171-1/+2
| | | | | | | | | | | | | | | | | | Addition of table versioning exposed struct cls_rule member 'cls_match' to RCU readers and made it possible for 'cls_match' become NULL while being accessed by an RCU reader, but we failed to check for this condition. This may have resulted in NULL pointer dereference and ovs-vswitchd crash. Fix this by making the 'cls_match' member an RCU pointer and checking the value whenever it potentially read by an RCU reader. In these instances we use ovsrcu_get(), whereas functions accessible only by the exclusive writers use ovsrcu_get_protected() and do not need to check the result. VMware-BZ: 1643642 Fixes: 2b7b1427 ("classifier: Support table versioning") Signed-off-by: Jarno Rajahalme <jarno@ovn.org>
* Move lib/type-props.h to include/openvswitch directoryBen Warren2016-04-141-1/+1
| | | | | Signed-off-by: Ben Warren <ben@skyportsystems.com> Signed-off-by: Ben Pfaff <blp@ovn.org>
* Move lib/meta-flow.h to include/openvswitch directoryBen Warren2016-04-141-1/+1
| | | | | | | | | This commit also moves some bitmap macros into public header files and adds some #include directives in soure files in order to make the 'meta-flow.h' move possible. Signed-off-by: Ben Warren <ben@skyportsystems.com> Signed-off-by: Ben Pfaff <blp@ovn.org>
* Move lib/match.h to include/openvswitch directoryBen Warren2016-04-141-1/+1
| | | | | Signed-off-by: Ben Warren <ben@skyportsystems.com> Signed-off-by: Ben Pfaff <blp@ovn.org>
* classifier: Remove unused hash functions.Jarno Rajahalme2015-08-121-1/+0
| | | | | | Remove unused cls_rule_hash() and minimatch_hash() functions. Signed-off-by: Jarno Rajahalme <jrajahalme@nicira.com> Acked-by: Joe Stringer <joestringer@nicira.com>
* classifier: Make versioning more explicit.Jarno Rajahalme2015-07-061-17/+19
| | | | | | | | | | Now that struct cls_match has 'add_version' the 'version' in cls_match was largely redundant. Remove 'version' from struct cls_rule, and add it to function prototypes that need it. This makes versioning more explicit (or less indirect) in the API. Suggested-by: Ben Pfaff <blp@nicira.com> Signed-off-by: Jarno Rajahalme <jrajahalme@nicira.com> Acked-by: Ben Pfaff <blp@nicira.com>
* classifier: Simplify versioning.Jarno Rajahalme2015-06-121-23/+22
| | | | | | | | | | | | | After all, there are some cases in which both the insertion version and removal version of a rule need to be considered. This makes the cls_match a bit bigger, but makes classifier versioning much simpler to understand. Also, avoid using type larger than int in an enum, as it is not portable C. Signed-off-by: Jarno Rajahalme <jrajahalme@nicira.com> Acked-by: Ben Pfaff <blp@nicira.com>
* Use classifier versioning.Jarno Rajahalme2015-06-111-0/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | Each rule is now added or deleted in a specific tables version. Flow tables are versioned with a monotonically increasing 64-bit integer, where positive values are valid version numbers. Rule modifications are implemented as an insertion of a new rule and a deletion of the old rule, both taking place in the same tables version. Since concurrent lookups may use different versions, both the old and new rule must be available for lookups at the same time. The ofproto provider interface is changed to accomodate the above. As rule's actions need not be modified any more, we no longer need 'rule_premodify_actions', nor 'rule_modify_actions'. 'rule_insert' now takes a pointer to the old rule and adds a flag that tells whether the old stats should be forwarded to the new rule or not (this replaces the 'reset_counters' flag of the now removed 'rule_modify_actions'). Versioning all flow table changes has the side effect of making learned flows visible for future lookups only. I.e., the upcall that executes the learn action, will not see the newly learned action in it's classifier lookups. Only upcalls that start executing after the new flow was added will match on it. Signed-off-by: Jarno Rajahalme <jrajahalme@nicira.com> Acked-by: Ben Pfaff <blp@nicira.com>
* classifier: Support table versioningJarno Rajahalme2015-06-101-47/+101
| | | | | | | | | | | | | | | | | | | This patch allows classifier rules to become visible and invisible in specific versions. A 'version' is defined as a positive monotonically increasing integer, which never wraps around. The new 'visibility' attribute replaces the prior 'to_be_removed' and 'visible' attributes. When versioning is not used, the 'version' parameter should be passed as 'CLS_MIN_VERSION' when creating rules, and 'CLS_MAX_VERSION' when looking up flows. This feature enables the support for atomic OpenFlow bundles without significant performance penalty on 64-bit systems. There is a performance decrease in 32-bit systems due to 64-bit atomics used. Signed-off-by: Jarno Rajahalme <jrajahalme@nicira.com> Acked-by: Ben Pfaff <blp@nicira.com>
* classifier: Support duplicate rules.Jarno Rajahalme2015-06-011-3/+48
| | | | | | | | | | | | OpenFlow 1.4 bundles are easier to implement when it is possible to mark a rule as 'to_be_removed' and then insert a new, identical rule with the same priority. All but one out of the identical rules must be marked as 'to_be_removed', and the one rule that is not 'to_be_removed' must have been inserted last. Signed-off-by: Jarno Rajahalme <jrajahalme@nicira.com> Acked-by: Ben Pfaff <blp@nicira.com>
* classifier: Add support for invisible flows.Jarno Rajahalme2015-06-011-1/+1
| | | | | | | This makes it possible to tentatively add flows to the classifier without the datapath seeing them. Signed-off-by: Jarno Rajahalme <jrajahalme@nicira.com> Acked-by: Ben Pfaff <blp@nicira.com>
* classifier: Add support for conjunctive matches.Ben Pfaff2015-01-111-3/+16
| | | | | | | | | | A "conjunctive match" allows higher-level matches in the flow table, such as set membership matches, without causing a cross-product explosion for multidimensional matches. Please refer to the documentation that this commit adds to ovs-ofctl(8) for a better explanation, including an example. Signed-off-by: Ben Pfaff <blp@nicira.com> Acked-by: Jarno Rajahalme <jrajahalme@nicira.com>
* classifier: Make classifier_lookup() 'flow' parameter non-const.Ben Pfaff2015-01-111-1/+1
| | | | | | | | | | | | An upcoming commit will make classifier_lookup() sometimes modify its 'flow' argument temporarily during the lookup. Signed-off-by: Ben Pfaff <blp@nicira.com> Acked-by: Jarno Rajahalme <jrajahalme@nicira.com> --- v2: New patch. v2.1: Rebase. v3: Rebase.
* classifier: Defer pvector publication.Jarno Rajahalme2014-11-141-0/+16
| | | | | | | | | | | | | | | | | | | | | | | | This patch adds a new functions classifier_defer() and classifier_publish(), which control when the classifier modifications are made available to lookups. By default, all modifications are made available to lookups immediately. Modifications made after a classifier_defer() call MAY be 'deferred' for later 'publication'. A call to classifier_publish() will both publish any deferred modifications, and cause subsequent changes to to be published immediately. Currently any deferring is limited to the visibility of the subtable vector changes. pvector now processes modifications mostly in a working copy, which needs to be explicitly published with pvector_publish(). pvector_publish() sorts the working copy and removes gaps before publishing it. This change helps avoiding O(n**2) memory behavior in corner cases, where large number of rules with different masks are inserted or deleted. VMware-BZ: #1322017 Signed-off-by: Jarno Rajahalme <jrajahalme@nicira.com> Acked-by: Ben Pfaff <blp@nicira.com>
* classifier: Make insert and replace take a const rule, too.Jarno Rajahalme2014-11-141-2/+2
| | | | | | | | | classifier_remove() was recently changed to take a const struct cls_rule *. Make the corresponding change to classifier_replace() and classifier_insert(). This simplifies existing calling sites in ofproto. Signed-off-by: Jarno Rajahalme <jrajahalme@nicira.com> Acked-by: Ben Pfaff <blp@nicira.com>
* classifier: Remove internal mutex.Jarno Rajahalme2014-11-141-13/+10
| | | | | | | | | | | | | | Almost all classifier users already exclude concurrent modifications, or are single-threaded, hence the classifier internal mutex can be removed. Due to this change, ovs-router.c and tnl-ports.c need new mutexes, which are added. As noted by Ben in review, ovs_router_flush() should also free the entries it removes from the classifier. It now calls ovsrcu_postpone() to that effect. Suggested-by: Ben Pfaff <blp@nicira.com> Signed-off-by: Jarno Rajahalme <jrajahalme@nicira.com> Acked-by: Ben Pfaff <blp@nicira.com>
* classifier: Lockless and robust classifier iteration.Jarno Rajahalme2014-11-141-27/+21
| | | | | | | | | | | | | | | | | | | | | | | Previously, accurate iteration required writers to be excluded during iteration. This patch adds an rculist to struct cls_subtable, and a corresponding list node to struct cls_rule, which makes iteration more straightforward, and allows the iterators to remain ignorant of the internals of the cls_match. This new list allows iteration of rules in the classifier by traversing the RCU-friendly subtables vector, and the rculist of rules in each subtable. Classifier modifications may be performed concurrently, but whether or not the concurrent iterator sees those changes depends on the timing of change. More specifically, an concurrent iterator: - May or may not see a rule that is being inserted or removed. - Will see either the new or the old version of a rule that is replaced. - Will see all the other rules (that are not being modified). Finally, The subtable's rculist also allows to make classifier_rule_overlaps() lockless, which this patch also does. Signed-off-by: Jarno Rajahalme <jrajahalme@nicira.com> Acked-by: Ben Pfaff <blp@nicira.com>
* classifier: Constify RCU pointers.Jarno Rajahalme2014-11-061-12/+13
| | | | | | | Returning const struct cls_rule pointers from the classifier API helps callers to remember that they should not modify the rules returned. Signed-off-by: Jarno Rajahalme <jrajahalme@nicira.com> Acked-by: Ben Pfaff <blp@nicira.com>
* classifier: Change type used for priorities from 'unsigned int' to 'int'.Ben Pfaff2014-10-301-5/+4
| | | | | | | | | | | | | | | | OpenFlow has priorities in the 16-bit unsigned range, from 0 to 65535. In the classifier, it is sometimes useful to be able to have values below and above this range. With the 'unsigned int' type used for priorities until now, there were no values below the range, so some code worked around it by converting priorities to 64-bit signed integers. This didn't seem so great to me given that a plain 'int' also had the needed range. This commit therefore changes the type used for priorities to int. The interesting parts of this change are in pvector.h and classifier.c, where one can see the elimination of the use of int64_t. Signed-off-by: Ben Pfaff <blp@nicira.com> Acked-by: Jarno Rajahalme <jrajahalme@nicira.com>
* lib/dpif-netdev: Integrate megaflow classifier.Jarno Rajahalme2014-10-171-5/+0
| | | | | | | | | | | | | | | Megaflow inserts and removals are simplified: - No need for classifier internal mutex, as dpif-netdev already has a 'flow_mutex'. - Number of memory allocations/frees can be halved. - Lookup code path can rely on netdev_flow_key always having inline data. This will also be easier to simplify further when moving to per-thread megaflow classifiers in the future. Signed-off-by: Jarno Rajahalme <jrajahalme@nicira.com> Acked-by: Alex Wang <alexw@nicira.com>
* lib/classifier: Make classifier_remove() more robust.Jarno Rajahalme2014-10-101-1/+1
| | | | | | | | | | | | | | | | classifier already provides lockless lookups, and protected modifications. When user wants to remove a flow, we currently require the flow to exist in the classifier. To be thread safe, this requires the caller to introduce their own mutex, lock it before a lookup, and then issue classifier_remove() while the lock is still held. This patch relaxes the "existence requirement" of the rule in classifier_remove(), allowing it to be called on a rule that may have already been removed from the classifier. This allows users to do a classifier_lookup() and classifier_remove() without additional syncronization. Signed-off-by: Jarno Rajahalme <jrajahalme@nicira.com> Acked-by: Ben Pfaff <blp@nicira.com>
* lib/cmap: cmap_find_batch().Jarno Rajahalme2014-10-061-1/+3
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Batching the cmap find improves the memory behavior with large cmaps and can make searches twice as fast: $ tests/ovstest test-cmap benchmark 2000000 8 0.1 16 Benchmarking with n=2000000, 8 threads, 0.10% mutations, batch size 16: cmap insert: 533 ms cmap iterate: 57 ms batch search: 146 ms cmap destroy: 233 ms cmap insert: 552 ms cmap iterate: 56 ms cmap search: 299 ms cmap destroy: 229 ms hmap insert: 222 ms hmap iterate: 198 ms hmap search: 2061 ms hmap destroy: 209 ms Batch size 1 has small performance penalty, but all other batch sizes are faster than non-batched cmap_find(). The batch size 16 was experimentally found better than 8 or 32, so now classifier_lookup_miniflow_batch() performs the cmap find operations in batches of 16. Signed-off-by: Jarno Rajahalme <jrajahalme@nicira.com> Acked-by: Ben Pfaff <blp@nicira.com>
* Avoid uninitialized variable warnings with OBJECT_OFFSETOF() in MSVC.Gurucharan Shetty2014-09-121-2/+2
| | | | | | | | | | | | | | Implementation of OBJECT_OFFSETOF() for non-GNUC compilers like MSVC causes "uninitialized variable" warnings. Since OBJECT_OFFSETOF() is indirectly used through all the *_FOR_EACH() (through ASSIGN_CONTAINER() and OBJECT_CONTAINING()) macros, the OVS build on Windows gets littered with "uninitialized variable" warnings. This patch attempts to workaround the problem. Signed-off-by: Gurucharan Shetty <gshetty@nicira.com> Acked-by: Alin Gabriel Serdean <aserdean@cloudbasesolutions.com> Acked-by: Saurabh Shah <ssaurabh@vmware.com> Acked-by: Ben Pfaff <blp@nicira.com>
* classifier: classifier_lookup_miniflow_batch() indicate failures.Ethan Jackson2014-08-051-1/+1
| | | | | | | | | This patch causes classifier_lookup_miniflow_batch() to return a boolean indicating whether any rules could not be successfully looked up. Used in future patches. Signed-off-by: Ethan Jackson <ethan@nicira.com> Acked-by: Ben Pfaff <blp@nicira.com>
* cmap, classifier: Avoid unsafe aliasing in iterators.Ben Pfaff2014-07-211-47/+24
| | | | | | | | | | | | | | | | CMAP_FOR_EACH and CLS_FOR_EACH and their variants tried to use void ** as a "pointer to any kind of pointer". That is a violation of the aliasing rules in ISO C which technically yields undefined behavior. With GCC 4.1, it causes both warnings and actual misbehavior. One option would to add -fno-strict-aliasing to the compiler flags, but that would only help with GCC; who knows whether this can be worked around with other compilers. Instead, this commit rewrites the iterators to avoid disallowed pointer aliasing. VMware-BZ: #1287651 Signed-off-by: Ben Pfaff <blp@nicira.com> Acked-by: Jarno Rajahalme <jrajahalme@nicira.com>
* lib/classifier: Unify struct classifier and cls_classifier.Jarno Rajahalme2014-07-181-5/+24
| | | | | | | | | | | Now that it is clear that struct cls_classifier itself does not need RCU indirection and pvector is defined in its own header, it is possible get rid of the indirection from struct classifier to struct cls_classifier. Suggested-by: YAMAMOTO Takashi <yamamoto@valinux.co.jp> Signed-off-by: Jarno Rajahalme <jrajahalme@nicira.com> Acked-by: Ben Pfaff <blp@nicira.com>
* lib/classifier: Lockless lookups.Jarno Rajahalme2014-07-111-29/+16
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Now that all the relevant classifier structures use RCU and internal mutual exclusion for modifications, we can remove the fat-rwlock and thus make the classifier lookups lockless. As the readers are operating concurrently with the writers, a concurrent reader may or may not see a new rule being added by a writer, depending on how the concurrent events overlap with each other. Overall, this is no different from the former locked behavior, but there the visibility of the new rule only depended on the timing of the locking functions. A new rule is first added to the segment indices, so the readers may find the rule in the indices before the rule is visible in the subtables 'rules' map. This may result in us losing the opportunity to quit lookups earlier, resulting in sub-optimal wildcarding. This will be fixed by forthcoming revalidation always scheduled after flow table changes. Similar behavior may happen due to us removing the overlapping rule (if any) from the indices only after the corresponding new rule has been added. The subtable's max priority is updated only after a rule is inserted to the maps, so the concurrent readers may not see the rule, as the updated priority ordered subtable list will only be visible after the subtable's max priority is updated. Similarly, the classifier's partitions are updated by the caller after the rule is inserted to the maps, so the readers may keep skipping the subtable until they see the updated partitions. Signed-off-by: Jarno Rajahalme <jrajahalme@nicira.com> Acked-by: YAMAMOTO Takashi <yamamoto@valinux.co.jp>
* lib/classifier: RCUify prefix trie code.Jarno Rajahalme2014-07-111-1/+1
| | | | | | | | cls_set_prefix_fields() now synchronizes explicitly with the readers, waiting them to finish using the old configuration before changing to the new configuration. Signed-off-by: Jarno Rajahalme <jrajahalme@nicira.com> Acked-by: YAMAMOTO Takashi <yamamoto@valinux.co.jp>
* lib/classifier: Use internal mutex.Jarno Rajahalme2014-07-111-8/+8
| | | | | | | | | | | | | | | Add an internal mutex to struct cls_classifier, and reorganize classifier internal structures according to the user of each field, marking the fields that need to be protected by the mutex. This makes locking requirements easier to track, and may make lookup more memory efficient. After this patch there is some double locking, as callers are taking the fat-rwlock, and we take the mutex internally. A following patch will remove the classifier fat-rwlock, removing the (double) locking overhead. Signed-off-by: Jarno Rajahalme <jrajahalme@nicira.com> Acked-by: YAMAMOTO Takashi <yamamoto@valinux.co.jp>
* lib/classifier: Simplify iteration with C99 declaration.Jarno Rajahalme2014-07-111-15/+51
| | | | | | | | Hide the cursor from the classifier iteration users and move locking to the iterators. This will make following RCU changes simpler, as the call sites of the iterators need not be changed at that point. Signed-off-by: Jarno Rajahalme <jrajahalme@nicira.com> Acked-by: YAMAMOTO Takashi <yamamoto@valinux.co.jp>
* lib/classifier: Use cmap.Jarno Rajahalme2014-07-111-0/+3
| | | | | | | Use cmap instead of hmap & hindex in classifier. Signed-off-by: Jarno Rajahalme <jrajahalme@nicira.com> Acked-by: Ben Pfaff <blp@nicira.com> Acked-by: YAMAMOTO Takashi <yamamoto@valinux.co.jp>
* lib/classifier: Remove unused typedef cls_cb_func.Jarno Rajahalme2014-07-071-2/+0
| | | | Signed-off-by: Jarno Rajahalme <jrajahalme@nicira.com> Acked-by: Ben Pfaff <blp@nicira.com>
* classifier: Add a batched miniflow lookup function.Ethan Jackson2014-06-301-2/+3
| | | | | | | Used in a future patch. Signed-off-by: Ethan Jackson <ethan@nicira.com> Acked-by: Jarno Rajahalme <jrajahalme@nicira.com>
* lib/classifier: Clean up includes.Jarno Rajahalme2014-06-111-9/+0
| | | | | | | Remove unnecessary includes from lib/classifier.h and add them to lib/classifier.c as needed. Signed-off-by: Jarno Rajahalme <jrajahalme@nicira.com>
* lib/classifier: Separate cls_rule internals from the API.Jarno Rajahalme2014-04-291-13/+9
| | | | | | | | | Keep an internal representation of a rule separate from the one embedded into user's structs. This allows for further memory optimization in the classifier. Signed-off-by: Jarno Rajahalme <jrajahalme@nicira.com> Acked-by: Ethan Jackson <ethan@nicira.com>
* lib/classifier: Hide more of the internal data structures.Jarno Rajahalme2014-04-291-56/+9
| | | | | | | It is better not to expose definitions not needed by users. Signed-off-by: Jarno Rajahalme <jrajahalme@nicira.com> Acked-by: Ethan Jackson <ethan@nicira.com>
* classifier: Support miniflow as a key.Jarno Rajahalme2014-04-181-0/+3
| | | | | | | | | | | | Support struct miniflow as a key for datapath flow lookup. The new classifier interface classifier_lookup_miniflow_first() takes a miniflow as a key and stops at the first match with no regard to flow prioritites. This works only if the classifier has no conflicting rules (as is the case with the userspace datapath classifier). Signed-off-by: Jarno Rajahalme <jrajahalme@nicira.com> Reviewed-by: YAMAMOTO Takashi <yamamoto@valinux.co.jp>
* classifier: Use fat_rwlock instead of ovs_rwlock.Ben Pfaff2014-01-141-1/+2
| | | | | | | | | | Jarno Rajahalme reported up to 40% performance gain on netperf TCP_CRR with an earlier version of this patch in combination with a kernel NUMA patch, together with a reduction in variance: http://openvswitch.org/pipermail/dev/2014-January/035867.html Signed-off-by: Ben Pfaff <blp@nicira.com> Acked-by: Ethan Jackson <ethan@nicira.com>
* Classifier: Track address prefixes.Jarno Rajahalme2013-12-111-16/+136
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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>
* Classifier: Staged subtable matching.Jarno Rajahalme2013-11-191-1/+23
| | | | | | | | | | | Subtable lookup is performed in ranges defined for struct flow, starting from metadata (registers, in_port, etc.), then L2 header, L3, and finally L4 ports. Whenever it is found that there are no matches in the current subtable, the rest of the subtable can be skipped. The rationale of this logic is that as many fields as possible can remain wildcarded. Signed-off-by: Jarno Rajahalme <jrajahalme@nicira.com>