From: Ben Pfaff Date: Fri, 22 Jul 2011 22:31:32 +0000 (-0700) Subject: ofproto-dpif: Restore former NORMAL action behavior when revalidating. X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4cd78906a0c30cc2de0a6a0370c6b2cf1b7853b2;p=openvswitch ofproto-dpif: Restore former NORMAL action behavior when revalidating. Before commit fa066f015 "bridge: Move packet processing functionality into ofproto," the code that called into what became xlate_normal() prevented a flow from being installed if it was called at revalidation time and the MAC learning table lacked an entry for the flow's destination MAC. That commit instead started dropping packets in that case (because it incorrectly ignored xlate_normal()'s return value). This restores the former behavior. It's not clear that the former behavior is the best possible, but it is strictly better than starting to drop packets at revalidation time. Along with the previously fixed problem where flood_vlans were interpreted incorrectly, this bug broke controller connectivity when flood_vlans was set to any nonempty value that did not include the VLAN used for the controller connection (that is, when flood_vlans was interpreted as flooding the controller VLAN). Reported-by: David Tsai --- diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c index b99c91fd..a700d5ed 100644 --- a/ofproto/ofproto-dpif.c +++ b/ofproto/ofproto-dpif.c @@ -2784,7 +2784,7 @@ send_packet(struct ofproto_dpif *ofproto, uint32_t odp_port, static void do_xlate_actions(const union ofp_action *in, size_t n_in, struct action_xlate_ctx *ctx); -static bool xlate_normal(struct action_xlate_ctx *); +static void xlate_normal(struct action_xlate_ctx *); static void commit_odp_actions(struct action_xlate_ctx *ctx) @@ -3773,10 +3773,7 @@ is_admissible(struct ofproto_dpif *ofproto, const struct flow *flow, return true; } -/* If the composed actions may be applied to any packet in the given 'flow', - * returns true. Otherwise, the actions should only be applied to 'packet', or - * not at all, if 'packet' was NULL. */ -static bool +static void xlate_normal(struct action_xlate_ctx *ctx) { struct ofbundle *in_bundle; @@ -3807,7 +3804,8 @@ xlate_normal(struct action_xlate_ctx *ctx) * of time where we could learn from a packet reflected on a bond and * blackhole packets before the learning table is updated to reflect * the correct port. */ - return false; + ctx->may_set_up_flow = false; + return; } else { out_bundle = OFBUNDLE_FLOOD; } @@ -3821,8 +3819,6 @@ done: if (in_bundle) { compose_actions(ctx, vlan, in_bundle, out_bundle); } - - return true; } static bool