ofproto-dpif: Restore former NORMAL action behavior when revalidating.
[sliver-openvswitch.git] / ofproto / ofproto-dpif.c
index 61685b7..a700d5e 100644 (file)
@@ -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)
@@ -3376,7 +3376,8 @@ dst_is_duplicate(const struct dst_set *set, const struct dst *test)
 static bool
 ofbundle_trunks_vlan(const struct ofbundle *bundle, uint16_t vlan)
 {
-    return bundle->vlan < 0 && vlan_bitmap_contains(bundle->trunks, vlan);
+    return (bundle->vlan < 0
+            && (!bundle->trunks || bitmap_is_set(bundle->trunks, vlan)));
 }
 
 static bool
@@ -3422,7 +3423,7 @@ compose_dsts(struct action_xlate_ctx *ctx, uint16_t vlan,
 static bool
 vlan_is_mirrored(const struct ofmirror *m, int vlan)
 {
-    return vlan_bitmap_contains(m->vlans, vlan);
+    return !m->vlans || bitmap_is_set(m->vlans, vlan);
 }
 
 /* Returns true if a packet with Ethernet destination MAC 'dst' may be mirrored
@@ -3772,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;
@@ -3806,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;
     }
@@ -3820,8 +3819,6 @@ done:
     if (in_bundle) {
         compose_actions(ctx, vlan, in_bundle, out_bundle);
     }
-
-    return true;
 }
 \f
 static bool