From 4468099e7cabab8c6a290a5a883469c1986e0bb8 Mon Sep 17 00:00:00 2001 From: Ethan Jackson Date: Sat, 27 Jul 2013 12:24:15 -0700 Subject: [PATCH] ofproto-dpif-xlate: Don't try to optimize goto table. This patch reverts commit 5559942 (ofproto-dpif: GOTO_TABLE recursion removal.) by reintroducing the recursion through xlate_table_action(). The main reason to do this is the introduction of new rule locking in future patches. The code before this patch was relatively difficult to lock in a clean straight-forward manner. Signed-off-by: Ethan Jackson --- ofproto/ofproto-dpif-xlate.c | 30 ++---------------------------- tests/ofproto-dpif.at | 4 ++-- 2 files changed, 4 insertions(+), 30 deletions(-) diff --git a/ofproto/ofproto-dpif-xlate.c b/ofproto/ofproto-dpif-xlate.c index 18b0257e7..6f54b7669 100644 --- a/ofproto/ofproto-dpif-xlate.c +++ b/ofproto/ofproto-dpif-xlate.c @@ -1927,7 +1927,6 @@ do_xlate_actions(const struct ofpact *ofpacts, size_t ofpacts_len, ctx->rule->up.evictable = false; } - do_xlate_actions_again: OFPACT_FOR_EACH (a, ofpacts, ofpacts_len) { struct ofpact_controller *controller; const struct ofpact_metadata *metadata; @@ -2128,35 +2127,10 @@ do_xlate_actions(const struct ofpact *ofpacts, size_t ofpacts_len, case OFPACT_GOTO_TABLE: { /* It is assumed that goto-table is the last action. */ struct ofpact_goto_table *ogt = ofpact_get_GOTO_TABLE(a); - struct rule_dpif *rule; ovs_assert(ctx->table_id < ogt->table_id); - - ctx->table_id = ogt->table_id; - - /* Look up a flow from the new table. */ - rule = rule_dpif_lookup_in_table(ctx->xbridge->ofproto, flow, wc, - ctx->table_id); - - ctx->xout->tags |= calculate_flow_tag(ctx->xbridge->ofproto, - &ctx->xin->flow, - ctx->table_id, rule); - - rule = ctx_rule_hooks(ctx, rule, true); - - if (rule) { - if (ctx->rule) { - ctx->rule->up.evictable = was_evictable; - } - ctx->rule = rule; - was_evictable = rule->up.evictable; - rule->up.evictable = false; - - /* Tail recursion removal. */ - ofpacts = rule->up.ofpacts; - ofpacts_len = rule->up.ofpacts_len; - goto do_xlate_actions_again; - } + xlate_table_action(ctx, ctx->xin->flow.in_port.ofp_port, + ogt->table_id, true); break; } diff --git a/tests/ofproto-dpif.at b/tests/ofproto-dpif.at index 027f1c223..d5e5e3c6c 100644 --- a/tests/ofproto-dpif.at +++ b/tests/ofproto-dpif.at @@ -24,8 +24,8 @@ AT_SETUP([ofproto-dpif - goto table]) OVS_VSWITCHD_START ADD_OF_PORTS([br0], [1], [10], [11]) echo "table=0 in_port=1 actions=output(10),goto_table(1)" > flows.txt -for i in `seq 1 252`; do echo "table=$i actions=goto_table($(($i+1)))"; done >> flows.txt -echo "table=253 actions=output(11)" >> flows.txt +for i in `seq 1 63`; do echo "table=$i actions=goto_table($(($i+1)))"; done >> flows.txt +echo "table=64 actions=output(11)" >> flows.txt AT_CHECK([ovs-ofctl -O OpenFlow12 add-flows br0 flows.txt]) AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,dl_type=0x0800,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=1,nw_tos=0,nw_ttl=128,icmp_type=8,icmp_code=0'], [0], [stdout]) AT_CHECK([tail -1 stdout], [0], -- 2.43.0