[ovs-dev,no-slow,v2,5/8] ofp-actions: Add action "debug_slow" for testing slow-path.

Message ID 1515623246-3820-5-git-send-email-jpettit@ovn.org
State New
Headers show
Series
  • [ovs-dev,no-slow,v2,1/8] ofproto-dpif: Use a fixed size userspace cookie.
Related show

Commit Message

Justin Pettit Jan. 10, 2018, 10:27 p.m.
It isn't otherwise useful and in fact hurts performance so it's disabled
without --enable-dummy.

An upcoming commit will make use of this.

Signed-off-by: Justin Pettit <jpettit@ovn.org>
Acked-by: Ben Pfaff <blp@ovn.org>
---
v1->v2: Unchanged.
---
 include/openvswitch/ofp-actions.h |  1 +
 lib/ofp-actions.c                 | 48 ++++++++++++++++++++++++++++++++++++++-
 ofproto/ofproto-dpif-xlate.c      |  7 ++++++
 tests/ofproto-dpif.at             | 19 ++++++++++++++++
 4 files changed, 74 insertions(+), 1 deletion(-)

Patch

diff --git a/include/openvswitch/ofp-actions.h b/include/openvswitch/ofp-actions.h
index 3d9775582f6d..a7808eb4fa60 100644
--- a/include/openvswitch/ofp-actions.h
+++ b/include/openvswitch/ofp-actions.h
@@ -128,6 +128,7 @@  struct vl_mff_map;
      * These are intentionally undocumented, subject to change, and     \
      * only accepted if ovs-vswitchd is started with --enable-dummy. */ \
     OFPACT(DEBUG_RECIRC, ofpact_null,           ofpact, "debug_recirc") \
+    OFPACT(DEBUG_SLOW,   ofpact_null,           ofpact, "debug_slow")   \
                                                                         \
     /* Instructions. */                                                 \
     OFPACT(METER,           ofpact_meter,       ofpact, "meter")        \
diff --git a/lib/ofp-actions.c b/lib/ofp-actions.c
index 4918498efb30..1d364f98bbd1 100644
--- a/lib/ofp-actions.c
+++ b/lib/ofp-actions.c
@@ -357,6 +357,9 @@  enum ofp_raw_action_type {
 /* These are intentionally undocumented, subject to change, and ovs-vswitchd */
 /* accepts them only if started with --enable-dummy. */
 
+    /* NX1.0+(254): void. */
+    NXAST_RAW_DEBUG_SLOW,
+
     /* NX1.0+(255): void. */
     NXAST_RAW_DEBUG_RECIRC,
 };
@@ -475,6 +478,7 @@  ofpact_next_flattened(const struct ofpact *ofpact)
     case OFPACT_UNROLL_XLATE:
     case OFPACT_CT_CLEAR:
     case OFPACT_DEBUG_RECIRC:
+    case OFPACT_DEBUG_SLOW:
     case OFPACT_METER:
     case OFPACT_CLEAR_ACTIONS:
     case OFPACT_WRITE_METADATA:
@@ -5802,7 +5806,7 @@  format_SAMPLE(const struct ofpact_sample *a,
     ds_put_format(s, "%s)%s", colors.paren, colors.end);
 }
 
-/* debug_recirc instruction. */
+/* debug instructions. */
 
 static bool enable_debug;
 
@@ -5849,6 +5853,43 @@  format_DEBUG_RECIRC(const struct ofpact_null *a OVS_UNUSED,
     ds_put_format(s, "%sdebug_recirc%s", colors.value, colors.end);
 }
 
+static enum ofperr
+decode_NXAST_RAW_DEBUG_SLOW(struct ofpbuf *out)
+{
+    if (!enable_debug) {
+        return OFPERR_OFPBAC_BAD_VENDOR_TYPE;
+    }
+
+    ofpact_put_DEBUG_SLOW(out);
+    return 0;
+}
+
+static void
+encode_DEBUG_SLOW(const struct ofpact_null *n OVS_UNUSED,
+                  enum ofp_version ofp_version OVS_UNUSED,
+                  struct ofpbuf *out)
+{
+    put_NXAST_DEBUG_SLOW(out);
+}
+
+static char * OVS_WARN_UNUSED_RESULT
+parse_DEBUG_SLOW(char *arg OVS_UNUSED,
+                 const struct ofputil_port_map *port_map OVS_UNUSED,
+                 struct ofpbuf *ofpacts,
+                 enum ofputil_protocol *usable_protocols OVS_UNUSED)
+{
+    ofpact_put_DEBUG_SLOW(ofpacts);
+    return NULL;
+}
+
+static void
+format_DEBUG_SLOW(const struct ofpact_null *a OVS_UNUSED,
+                  const struct ofputil_port_map *port_map OVS_UNUSED,
+                  struct ds *s)
+{
+    ds_put_format(s, "%sdebug_slow%s", colors.value, colors.end);
+}
+
 /* Action structure for NXAST_CT.
  *
  * Pass traffic to the connection tracker.
@@ -7151,6 +7192,7 @@  ofpact_is_set_or_move_action(const struct ofpact *a)
     case OFPACT_WRITE_ACTIONS:
     case OFPACT_WRITE_METADATA:
     case OFPACT_DEBUG_RECIRC:
+    case OFPACT_DEBUG_SLOW:
         return false;
     default:
         OVS_NOT_REACHED();
@@ -7219,6 +7261,7 @@  ofpact_is_allowed_in_actions_set(const struct ofpact *a)
     case OFPACT_STACK_POP:
     case OFPACT_STACK_PUSH:
     case OFPACT_DEBUG_RECIRC:
+    case OFPACT_DEBUG_SLOW:
 
     /* The action set may only include actions and thus
      * may not include any instructions */
@@ -7441,6 +7484,7 @@  ovs_instruction_type_from_ofpact_type(enum ofpact_type type)
     case OFPACT_UNROLL_XLATE:
     case OFPACT_SAMPLE:
     case OFPACT_DEBUG_RECIRC:
+    case OFPACT_DEBUG_SLOW:
     case OFPACT_CT:
     case OFPACT_CT_CLEAR:
     case OFPACT_NAT:
@@ -8107,6 +8151,7 @@  ofpact_check__(enum ofputil_protocol *usable_protocols, struct ofpact *a,
         return OFPERR_OFPBAC_BAD_TYPE;
 
     case OFPACT_DEBUG_RECIRC:
+    case OFPACT_DEBUG_SLOW:
         return 0;
 
     case OFPACT_ENCAP:
@@ -8622,6 +8667,7 @@  ofpact_outputs_to_port(const struct ofpact *ofpact, ofp_port_t port)
     case OFPACT_METER:
     case OFPACT_GROUP:
     case OFPACT_DEBUG_RECIRC:
+    case OFPACT_DEBUG_SLOW:
     case OFPACT_CT:
     case OFPACT_CT_CLEAR:
     case OFPACT_NAT:
diff --git a/ofproto/ofproto-dpif-xlate.c b/ofproto/ofproto-dpif-xlate.c
index 804b8b88681a..63d15e94331f 100644
--- a/ofproto/ofproto-dpif-xlate.c
+++ b/ofproto/ofproto-dpif-xlate.c
@@ -5302,6 +5302,7 @@  reversible_actions(const struct ofpact *ofpacts, size_t ofpacts_len)
         case OFPACT_CONTROLLER:
         case OFPACT_CT_CLEAR:
         case OFPACT_DEBUG_RECIRC:
+        case OFPACT_DEBUG_SLOW:
         case OFPACT_DEC_MPLS_TTL:
         case OFPACT_DEC_TTL:
         case OFPACT_ENQUEUE:
@@ -5635,6 +5636,7 @@  freeze_unroll_actions(const struct ofpact *a, const struct ofpact *end,
         case OFPACT_ENCAP:
         case OFPACT_DECAP:
         case OFPACT_DEBUG_RECIRC:
+        case OFPACT_DEBUG_SLOW:
         case OFPACT_CT:
         case OFPACT_CT_CLEAR:
         case OFPACT_NAT:
@@ -6130,6 +6132,7 @@  recirc_for_mpls(const struct ofpact *a, struct xlate_ctx *ctx)
     case OFPACT_CT_CLEAR:
     case OFPACT_NAT:
     case OFPACT_DEBUG_RECIRC:
+    case OFPACT_DEBUG_SLOW:
     case OFPACT_METER:
     case OFPACT_CLEAR_ACTIONS:
     case OFPACT_WRITE_ACTIONS:
@@ -6578,6 +6581,10 @@  do_xlate_actions(const struct ofpact *ofpacts, size_t ofpacts_len,
             ctx_trigger_freeze(ctx);
             a = ofpact_next(a);
             break;
+
+        case OFPACT_DEBUG_SLOW:
+            ctx->xout->slow |= SLOW_ACTION;
+            break;
         }
 
         /* Check if need to store this and the remaining actions for later
diff --git a/tests/ofproto-dpif.at b/tests/ofproto-dpif.at
index 9a51a1364157..d9dab9ba159a 100644
--- a/tests/ofproto-dpif.at
+++ b/tests/ofproto-dpif.at
@@ -4816,6 +4816,25 @@  AT_CHECK_UNQUOTED([tail -1 stdout], [0], [Datapath actions: 2
 OVS_VSWITCHD_STOP
 AT_CLEANUP
 
+
+AT_SETUP([ofproto-dpif - debug_slow action])
+OVS_VSWITCHD_START
+add_of_ports br0 1 2 3
+
+AT_CHECK([ovs-ofctl add-flow br0 "in_port=1,actions=debug_slow,2"])
+
+flow="in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=128,frag=no),icmp(type=8,code=0)"
+
+AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow" -generate], [0], [stdout])
+AT_CHECK_UNQUOTED([tail -3 stdout], [0], [Datapath actions: 2
+This flow is handled by the userspace slow path because it:
+	- Uses action(s) not supported by datapath.
+])
+
+OVS_VSWITCHD_STOP
+AT_CLEANUP
+
+
 dnl CHECK_CONTINUATION(TITLE, N_PORTS0, N_PORTS1, ACTIONS0, ACTIONS1, [EXTRA_SETUP])
 dnl
 dnl Checks the implementation of the continuation mechanism that allows the