[ovs-dev] [PATCH 3/4] ofproto-dpip: Set generated_by_table_miss for miss rule
Simon Horman
horms at verge.net.au
Wed Mar 12 02:22:39 UTC 2014
An assumption for this change is assuming that miss-rules are added by
add_internal_flow().
If so it seems to me that the current rule_is_table_miss() does not match
such rules. This is because add_internal_flows() adds rules with the mask
of register 0 set to all 1s due to the following line in
add_internal_flow().
match_set_reg(&fm.match, 0, id);
This patch proposes an alternate approach which is to provide
a function to determine if a rule is a miss rule. And infer
that any rule that results in execute_controller_action() being
called has a controller action present and if that rule is internal
then it is the miss rule. This allows generated_by_table_miss for miss
rules.
Signed-off-by: Simon Horman <horms at verge.net.au>
---
ofproto/ofproto-dpif-xlate.c | 5 ++++-
ofproto/ofproto-dpif.c | 12 ++++++++++--
ofproto/ofproto-dpif.h | 2 +-
ofproto/ofproto-provider.h | 12 +-----------
4 files changed, 16 insertions(+), 15 deletions(-)
diff --git a/ofproto/ofproto-dpif-xlate.c b/ofproto/ofproto-dpif-xlate.c
index 7f78460..52f55ad 100644
--- a/ofproto/ofproto-dpif-xlate.c
+++ b/ofproto/ofproto-dpif-xlate.c
@@ -2140,8 +2140,11 @@ execute_controller_action(struct xlate_ctx *ctx, int len,
pin->controller_id = controller_id;
pin->send_len = len;
+ /* If a rule is internal and has a controller action,
+ * which is implied by the rule being processed here,
+ * then it is the rule to handle a table miss. */
pin->generated_by_table_miss = (ctx->rule
- && rule_dpif_is_table_miss(ctx->rule));
+ && rule_dpif_is_internal(ctx->rule));
ofproto_dpif_send_packet_in(ctx->xbridge->ofproto, pin);
ofpbuf_delete(packet);
}
diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c
index 61521ed..433c0c0 100644
--- a/ofproto/ofproto-dpif.c
+++ b/ofproto/ofproto-dpif.c
@@ -3023,9 +3023,9 @@ rule_dpif_is_fail_open(const struct rule_dpif *rule)
}
bool
-rule_dpif_is_table_miss(const struct rule_dpif *rule)
+rule_dpif_is_internal(const struct rule_dpif *rule)
{
- return rule_is_table_miss(&rule->up);
+ return rule_is_internal(&rule->up);
}
ovs_be64
@@ -4408,6 +4408,14 @@ ofproto_dpif_unixctl_init(void)
unixctl_command_register("dpif/dump-flows", "[-m] bridge", 1, 2,
ofproto_unixctl_dpif_dump_flows, NULL);
}
+
+
+/* Returns true if 'rule' is an internal rule, false otherwise. */
+bool
+rule_is_internal(const struct rule *rule)
+{
+ return rule->table_id == TBL_INTERNAL;
+}
/* Linux VLAN device support (e.g. "eth0.10" for VLAN 10.)
*
diff --git a/ofproto/ofproto-dpif.h b/ofproto/ofproto-dpif.h
index f526104..df8d79e 100644
--- a/ofproto/ofproto-dpif.h
+++ b/ofproto/ofproto-dpif.h
@@ -89,7 +89,7 @@ void rule_dpif_credit_stats(struct rule_dpif *rule ,
const struct dpif_flow_stats *);
bool rule_dpif_is_fail_open(const struct rule_dpif *);
-bool rule_dpif_is_table_miss(const struct rule_dpif *);
+bool rule_dpif_is_internal(const struct rule_dpif *);
struct rule_actions *rule_dpif_get_actions(const struct rule_dpif *);
diff --git a/ofproto/ofproto-provider.h b/ofproto/ofproto-provider.h
index d116451..e8ed2e9 100644
--- a/ofproto/ofproto-provider.h
+++ b/ofproto/ofproto-provider.h
@@ -408,17 +408,7 @@ struct rule_actions *rule_get_actions(const struct rule *rule)
struct rule_actions *rule_get_actions__(const struct rule *rule)
OVS_REQUIRES(rule->mutex);
-/* Returns true if 'rule' is an OpenFlow 1.3 "table-miss" rule, false
- * otherwise.
- *
- * ("Table-miss" rules are special because a packet_in generated through one
- * uses OFPR_NO_MATCH as its reason, whereas packet_ins generated by any other
- * rule use OFPR_ACTION.) */
-static inline bool
-rule_is_table_miss(const struct rule *rule)
-{
- return rule->cr.priority == 0 && cls_rule_is_catchall(&rule->cr);
-}
+bool rule_is_internal(const struct rule *);
/* A set of actions within a "struct rule".
*
--
1.8.5.2
More information about the dev
mailing list