An upcoming commit will make classifier_lookup() sometimes modify its
'flow' argument temporarily during the lookup.

Signed-off-by: Ben Pfaff <b...@nicira.com>
---
v2: New patch.
---
 lib/classifier.c       |    7 +++++--
 lib/classifier.h       |    3 +--
 ofproto/ofproto-dpif.c |   15 ++++++++++-----
 ofproto/ofproto-dpif.h |    2 +-
 4 files changed, 17 insertions(+), 10 deletions(-)

diff --git a/lib/classifier.c b/lib/classifier.c
index dab43ec..589d969 100644
--- a/lib/classifier.c
+++ b/lib/classifier.c
@@ -659,9 +659,12 @@ trie_ctx_init(struct trie_ctx *ctx, const struct cls_trie 
*trie)
  * If a rule is found and 'wc' is non-null, bitwise-OR's 'wc' with the
  * set of bits that were significant in the lookup.  At some point
  * earlier, 'wc' should have been initialized (e.g., by
- * flow_wildcards_init_catchall()). */
+ * flow_wildcards_init_catchall()).
+ *
+ * 'flow' is non-const to allow for temporary modifications during the lookup.
+ * Any changes are restored before returning. */
 struct cls_rule *
-classifier_lookup(const struct classifier *cls, const struct flow *flow,
+classifier_lookup(const struct classifier *cls, struct flow *flow,
                   struct flow_wildcards *wc)
 {
     const struct cls_partition *partition;
diff --git a/lib/classifier.h b/lib/classifier.h
index 92be5bf..9ce2b83 100644
--- a/lib/classifier.h
+++ b/lib/classifier.h
@@ -292,8 +292,7 @@ struct cls_rule *classifier_replace(struct classifier *, 
struct cls_rule *);
 
 struct cls_rule *classifier_remove(struct classifier *, struct cls_rule *);
 struct cls_rule *classifier_lookup(const struct classifier *,
-                                   const struct flow *,
-                                   struct flow_wildcards *);
+                                   struct flow *, struct flow_wildcards *);
 bool classifier_rule_overlaps(const struct classifier *,
                               const struct cls_rule *);
 
diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c
index d965d38..8e3500f 100644
--- a/ofproto/ofproto-dpif.c
+++ b/ofproto/ofproto-dpif.c
@@ -3644,10 +3644,13 @@ rule_dpif_lookup(struct ofproto_dpif *ofproto, struct 
flow *flow,
 
 /* The returned rule is valid at least until the next RCU quiescent period.
  * If the '*rule' needs to stay around longer, a non-zero 'take_ref' must be
- * passed in to cause a reference to be taken on it before this returns. */
+ * passed in to cause a reference to be taken on it before this returns.
+ *
+ * 'flow' is non-const to allow for temporary modifications during the lookup.
+ * Any changes are restored before returning. */
 static struct rule_dpif *
 rule_dpif_lookup_in_table(struct ofproto_dpif *ofproto, uint8_t table_id,
-                          const struct flow *flow, struct flow_wildcards *wc,
+                          struct flow *flow, struct flow_wildcards *wc,
                           bool take_ref)
 {
     struct classifier *cls = &ofproto->up.tables[table_id].cls;
@@ -3724,11 +3727,13 @@ rule_dpif_lookup_in_table(struct ofproto_dpif *ofproto, 
uint8_t table_id,
  * The rule is returned in '*rule', which is valid at least until the next
  * RCU quiescent period.  If the '*rule' needs to stay around longer,
  * a non-zero 'take_ref' must be passed in to cause a reference to be taken
- * on it before this returns. */
+ * on it before this returns.
+ *
+ * 'flow' is non-const to allow for temporary modifications during the lookup.
+ * Any changes are restored before returning. */
 enum rule_dpif_lookup_verdict
 rule_dpif_lookup_from_table(struct ofproto_dpif *ofproto,
-                            const struct flow *flow,
-                            struct flow_wildcards *wc,
+                            struct flow *flow, struct flow_wildcards *wc,
                             bool honor_table_miss,
                             uint8_t *table_id, struct rule_dpif **rule,
                             bool take_ref, const struct dpif_flow_stats *stats)
diff --git a/ofproto/ofproto-dpif.h b/ofproto/ofproto-dpif.h
index a8c5d48..ba153fe 100644
--- a/ofproto/ofproto-dpif.h
+++ b/ofproto/ofproto-dpif.h
@@ -93,7 +93,7 @@ uint8_t rule_dpif_lookup(struct ofproto_dpif *, struct flow *,
                          bool take_ref, const struct dpif_flow_stats *);
 
 enum rule_dpif_lookup_verdict rule_dpif_lookup_from_table(struct ofproto_dpif 
*,
-                                                          const struct flow *,
+                                                          struct flow *,
                                                           struct 
flow_wildcards *,
                                                           bool 
force_controller_on_miss,
                                                           uint8_t *table_id,
-- 
1.7.10.4

_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to