[ovs-dev] [RFCv3 10/13] dpif-netdev: Support unique flow identifiers.

Joe Stringer joestringer at nicira.com
Tue Sep 2 10:48:48 UTC 2014


Signed-off-by: Joe Stringer <joestringer at nicira.com>
---
v3: Rebase.
v2: No change.
---
 lib/dpif-netdev.c       |  211 ++++++++++++++++++++++++++++++++---------------
 lib/flow.h              |    6 ++
 tests/dpif-netdev.at    |    3 +
 tests/ofproto-dpif.at   |   20 +++--
 tests/ofproto-macros.at |    1 +
 5 files changed, 166 insertions(+), 75 deletions(-)

diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
index 66795fd..681a6b2 100644
--- a/lib/dpif-netdev.c
+++ b/lib/dpif-netdev.c
@@ -280,8 +280,9 @@ struct dp_netdev_flow {
     /* Packet classification. */
     const struct cls_rule cr;   /* In owning dp_netdev's 'cls'. */
 
-    /* Hash table index by unmasked flow. */
+    /* Hash table index by uid. */
     const struct cmap_node node; /* In owning dp_netdev's 'flow_table'. */
+    const ovs_u128 uid;          /* Unique flow identifier. */
     const struct flow flow;      /* The flow that created this entry. */
 
     /* Number of references.
@@ -1009,7 +1010,7 @@ dp_netdev_remove_flow(struct dp_netdev *dp, struct dp_netdev_flow *flow)
     struct cmap_node *node = CONST_CAST(struct cmap_node *, &flow->node);
 
     classifier_remove(&dp->cls, cr);
-    cmap_remove(&dp->flow_table, node, flow_hash(&flow->flow, 0));
+    cmap_remove(&dp->flow_table, node, flow_uid_hash(&flow->uid, 0));
     flow->dead = true;
 
     dp_netdev_flow_unref(flow);
@@ -1220,13 +1221,13 @@ dp_netdev_lookup_flow(const struct dp_netdev *dp, const struct miniflow *key)
 }
 
 static struct dp_netdev_flow *
-dp_netdev_find_flow(const struct dp_netdev *dp, const struct flow *flow)
+dp_netdev_find_flow(const struct dp_netdev *dp, const ovs_u128 *uid)
 {
     struct dp_netdev_flow *netdev_flow;
 
-    CMAP_FOR_EACH_WITH_HASH (netdev_flow, node, flow_hash(flow, 0),
+    CMAP_FOR_EACH_WITH_HASH (netdev_flow, node, flow_uid_hash(uid, 0),
                              &dp->flow_table) {
-        if (flow_equal(&netdev_flow->flow, flow)) {
+        if (!memcmp(&netdev_flow->uid, uid, sizeof *uid)) {
             return netdev_flow;
         }
     }
@@ -1252,30 +1253,82 @@ get_dpif_flow_stats(const struct dp_netdev_flow *netdev_flow,
     }
 }
 
+struct dp_netdev_flow_convert_buf {
+    struct ofpbuf *key, *mask, *uid;
+    bool actions;
+};
+
 static void
-dp_netdev_flow_to_dpif_flow(const struct dp_netdev_flow *netdev_flow,
-                            struct ofpbuf *buffer, struct dpif_flow *flow)
+dp_netdev_init_flow_convert(struct dp_netdev_flow_convert_buf *convert,
+                            uint32_t flags, struct ofpbuf *key,
+                            struct ofpbuf *mask, struct ofpbuf *uid)
+{
+    memset(convert, 0, sizeof *convert);
+    if (!(flags & OVS_UID_F_SKIP_KEY)) {
+        convert->key = key;
+    }
+    if (!(flags & OVS_UID_F_SKIP_MASK)) {
+        convert->mask = mask;
+    }
+    if (!(flags & OVS_UID_F_SKIP_ACTIONS)) {
+        convert->actions = true;
+    }
+    convert->uid = uid;
+}
+
+static void
+dp_netdev_flow_to_dpif_flow__(const struct dp_netdev_flow *netdev_flow,
+                              struct dpif_flow *flow,
+                              struct dp_netdev_flow_convert_buf *buf)
 {
     struct flow_wildcards wc;
-    struct dp_netdev_actions *actions;
+    size_t offset;
 
     minimask_expand(&netdev_flow->cr.match.mask, &wc);
-    odp_flow_key_from_mask(buffer, &wc.masks, &netdev_flow->flow,
-                           odp_to_u32(wc.masks.in_port.odp_port),
-                           SIZE_MAX, true);
-    flow->mask = ofpbuf_data(buffer);
-    flow->mask_len = ofpbuf_size(buffer);
 
-    actions = dp_netdev_flow_get_actions(netdev_flow);
-    flow->actions = actions->actions;
-    flow->actions_len = actions->size;
+    memset(flow, 0, sizeof *flow);
+    if (buf->key) {
+        offset = ofpbuf_size(buf->key);
+        flow->key = ofpbuf_tail(buf->key);
+        odp_flow_key_from_flow(buf->key, &netdev_flow->flow, &wc.masks,
+                               netdev_flow->flow.in_port.odp_port, true);
+        flow->key_len = ofpbuf_size(buf->key) - offset;
+    }
+    if (buf->mask) {
+        offset = ofpbuf_size(buf->mask);
+        flow->mask = ofpbuf_tail(buf->mask);
+        odp_flow_key_from_mask(buf->mask, &wc.masks, &netdev_flow->flow,
+                               odp_to_u32(wc.masks.in_port.odp_port),
+                               SIZE_MAX, true);
+        flow->mask_len = ofpbuf_size(buf->mask) - offset;
+    }
+
+    if (buf->actions) {
+        struct dp_netdev_actions *netdev_actions;
 
-    flow->uid = NULL;
-    flow->uid_len = 0;
+        netdev_actions = dp_netdev_flow_get_actions(netdev_flow);
+        flow->actions = netdev_actions->actions;
+        flow->actions_len = netdev_actions->size;
+    }
 
+    offset = ofpbuf_size(buf->uid);
+    flow->uid = ofpbuf_tail(buf->uid);
+    odp_uid_to_nlattrs(buf->uid, &netdev_flow->uid, 0);
+    flow->uid_len = ofpbuf_size(buf->uid) - offset;
     get_dpif_flow_stats(netdev_flow, &flow->stats);
 }
 
+static void
+dp_netdev_flow_to_dpif_flow(const struct dp_netdev_flow *netdev_flow,
+                            struct ofpbuf *buffer, struct dpif_flow *flow,
+                            uint32_t flags)
+{
+    struct dp_netdev_flow_convert_buf convert;
+
+    dp_netdev_init_flow_convert(&convert, flags, buffer, buffer, buffer);
+    dp_netdev_flow_to_dpif_flow__(netdev_flow, flow, &convert);
+}
+
 static int
 dpif_netdev_mask_from_nlattrs(const struct nlattr *key, uint32_t key_len,
                               const struct nlattr *mask_key,
@@ -1369,22 +1422,45 @@ dpif_netdev_flow_from_nlattrs(const struct nlattr *key, uint32_t key_len,
 }
 
 static int
+dpif_netdev_uid_from_nlattrs(const struct nlattr *nla, size_t nla_len,
+                             ovs_u128 *uid, uint32_t *flags)
+{
+    if (odp_uid_from_nlattrs(nla, nla_len, uid, flags)) {
+        static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 5);
+
+        if (!VLOG_DROP_ERR(&rl)) {
+            VLOG_ERR("Failed to parse UID for flow_add (%p, len:%"PRIuSIZE")",
+                     nla, nla_len);
+        }
+        return EINVAL;
+    }
+
+    return 0;
+}
+
+static int
 dpif_netdev_flow_get(const struct dpif *dpif, const struct dpif_flow_get *get)
 {
     struct dp_netdev *dp = get_dp_netdev(dpif);
     struct dp_netdev_flow *netdev_flow;
-    struct flow key;
+    ovs_u128 uid;
+    uint32_t flags;
     int error;
 
-    error = dpif_netdev_flow_from_nlattrs(get->key, get->key_len, &key);
+    if (!get->uid) {
+        return EINVAL;
+    }
+
+    error = dpif_netdev_uid_from_nlattrs(get->uid, get->uid_len, &uid, &flags);
     if (error) {
         return error;
     }
 
-    netdev_flow = dp_netdev_find_flow(dp, &key);
+    netdev_flow = dp_netdev_find_flow(dp, &uid);
 
     if (netdev_flow) {
-        dp_netdev_flow_to_dpif_flow(netdev_flow, get->buffer, get->flow);
+        dp_netdev_flow_to_dpif_flow(netdev_flow, get->buffer, get->flow,
+                                    flags);
      } else {
         error = ENOENT;
     }
@@ -1393,7 +1469,7 @@ dpif_netdev_flow_get(const struct dpif *dpif, const struct dpif_flow_get *get)
 }
 
 static int
-dp_netdev_flow_add(struct dp_netdev *dp, struct match *match,
+dp_netdev_flow_add(struct dp_netdev *dp, struct match *match, ovs_u128 *uid,
                    const struct nlattr *actions, size_t actions_len)
     OVS_REQUIRES(dp->flow_mutex)
 {
@@ -1401,7 +1477,7 @@ dp_netdev_flow_add(struct dp_netdev *dp, struct match *match,
 
     netdev_flow = xzalloc(sizeof *netdev_flow);
     *CONST_CAST(struct flow *, &netdev_flow->flow) = match->flow;
-
+    *CONST_CAST(ovs_u128 *, &netdev_flow->uid) = *uid;
     ovs_refcount_init(&netdev_flow->ref_cnt);
 
     ovsthread_stats_init(&netdev_flow->stats);
@@ -1413,7 +1489,7 @@ dp_netdev_flow_add(struct dp_netdev *dp, struct match *match,
                   match, NETDEV_RULE_PRIORITY);
     cmap_insert(&dp->flow_table,
                 CONST_CAST(struct cmap_node *, &netdev_flow->node),
-                flow_hash(&match->flow, 0));
+                flow_uid_hash(uid, 0));
     classifier_insert(&dp->cls,
                       CONST_CAST(struct cls_rule *, &netdev_flow->cr));
 
@@ -1421,6 +1497,8 @@ dp_netdev_flow_add(struct dp_netdev *dp, struct match *match,
         struct ds ds = DS_EMPTY_INITIALIZER;
 
         ds_put_cstr(&ds, "flow_add: ");
+        odp_format_uid(uid, &ds);
+        ds_put_cstr(&ds, " ");
         match_format(match, &ds, OFP_DEFAULT_PRIORITY);
         ds_put_cstr(&ds, ", actions:");
         format_odp_actions(&ds, actions, actions_len);
@@ -1456,6 +1534,7 @@ dpif_netdev_flow_put(struct dpif *dpif, const struct dpif_flow_put *put)
     struct dp_netdev_flow *netdev_flow;
     struct miniflow miniflow;
     struct match match;
+    ovs_u128 uid;
     int error;
 
     error = dpif_netdev_flow_from_nlattrs(put->key, put->key_len, &match.flow);
@@ -1470,6 +1549,11 @@ dpif_netdev_flow_put(struct dpif *dpif, const struct dpif_flow_put *put)
     }
     miniflow_init(&miniflow, &match.flow);
 
+    error = dpif_netdev_uid_from_nlattrs(put->uid, put->uid_len, &uid, NULL);
+    if (error) {
+        return error;
+    }
+
     ovs_mutex_lock(&dp->flow_mutex);
     netdev_flow = dp_netdev_lookup_flow(dp, &miniflow);
     if (!netdev_flow) {
@@ -1478,7 +1562,7 @@ dpif_netdev_flow_put(struct dpif *dpif, const struct dpif_flow_put *put)
                 if (put->stats) {
                     memset(put->stats, 0, sizeof *put->stats);
                 }
-                error = dp_netdev_flow_add(dp, &match, put->actions,
+                error = dp_netdev_flow_add(dp, &match, &uid, put->actions,
                                            put->actions_len);
             } else {
                 error = EFBIG;
@@ -1524,16 +1608,20 @@ dpif_netdev_flow_del(struct dpif *dpif, const struct dpif_flow_del *del)
 {
     struct dp_netdev *dp = get_dp_netdev(dpif);
     struct dp_netdev_flow *netdev_flow;
-    struct flow key;
+    ovs_u128 uid;
     int error;
 
-    error = dpif_netdev_flow_from_nlattrs(del->key, del->key_len, &key);
+    if (!del->uid) {
+        return EINVAL;
+    }
+
+    error = dpif_netdev_uid_from_nlattrs(del->uid, del->uid_len, &uid, NULL);
     if (error) {
         return error;
     }
 
     ovs_mutex_lock(&dp->flow_mutex);
-    netdev_flow = dp_netdev_find_flow(dp, &key);
+    netdev_flow = dp_netdev_find_flow(dp, &uid);
     if (netdev_flow) {
         if (del->stats) {
             get_dpif_flow_stats(netdev_flow, del->stats);
@@ -1551,6 +1639,7 @@ struct dpif_netdev_flow_dump {
     struct dpif_flow_dump up;
     struct cmap_position pos;
     int status;
+    uint32_t dump_flags;       /* Bitmask of OVS_UID_F_* */
     struct ovs_mutex mutex;
 };
 
@@ -1561,8 +1650,7 @@ dpif_netdev_flow_dump_cast(struct dpif_flow_dump *dump)
 }
 
 static struct dpif_flow_dump *
-dpif_netdev_flow_dump_create(const struct dpif *dpif_,
-                             uint32_t dump_flags OVS_UNUSED)
+dpif_netdev_flow_dump_create(const struct dpif *dpif_, uint32_t dump_flags)
 {
     struct dpif_netdev_flow_dump *dump;
 
@@ -1570,6 +1658,7 @@ dpif_netdev_flow_dump_create(const struct dpif *dpif_,
     dpif_flow_dump_init(&dump->up, dpif_);
     memset(&dump->pos, 0, sizeof dump->pos);
     dump->status = 0;
+    dump->dump_flags = dump_flags;
     ovs_mutex_init(&dump->mutex);
 
     return &dump->up;
@@ -1590,6 +1679,7 @@ struct dpif_netdev_flow_dump_thread {
     struct dpif_netdev_flow_dump *dump;
     struct odputil_keybuf keybuf[FLOW_DUMP_MAX_BATCH];
     struct odputil_keybuf maskbuf[FLOW_DUMP_MAX_BATCH];
+    struct odputil_uidbuf uidbuf[FLOW_DUMP_MAX_BATCH];
 };
 
 static struct dpif_netdev_flow_dump_thread *
@@ -1629,6 +1719,7 @@ dpif_netdev_flow_dump_next(struct dpif_flow_dump_thread *thread_,
     struct dpif_netdev *dpif = dpif_netdev_cast(thread->up.dpif);
     struct dp_netdev_flow *netdev_flows[FLOW_DUMP_MAX_BATCH];
     struct dp_netdev *dp = get_dp_netdev(&dpif->dpif);
+    uint32_t dump_flags;
     int n_flows = 0;
     int i;
 
@@ -1647,45 +1738,28 @@ dpif_netdev_flow_dump_next(struct dpif_flow_dump_thread *thread_,
                                                  node);
         }
     }
+    dump_flags = dump->dump_flags;
     ovs_mutex_unlock(&dump->mutex);
 
     for (i = 0; i < n_flows; i++) {
-        struct odputil_keybuf *maskbuf = &thread->maskbuf[i];
         struct odputil_keybuf *keybuf = &thread->keybuf[i];
+        struct odputil_keybuf *maskbuf = &thread->maskbuf[i];
+        struct odputil_uidbuf *uidbuf = &thread->uidbuf[i];
         struct dp_netdev_flow *netdev_flow = netdev_flows[i];
+        struct dp_netdev_flow_convert_buf convert;
         struct dpif_flow *f = &flows[i];
-        struct dp_netdev_actions *dp_actions;
-        struct flow_wildcards wc;
-        struct ofpbuf buf;
+        struct ofpbuf key, mask, uid;
 
-        minimask_expand(&netdev_flow->cr.match.mask, &wc);
-
-        /* Key. */
-        ofpbuf_use_stack(&buf, keybuf, sizeof *keybuf);
-        odp_flow_key_from_flow(&buf, &netdev_flow->flow, &wc.masks,
-                               netdev_flow->flow.in_port.odp_port, true);
-        f->key = ofpbuf_data(&buf);
-        f->key_len = ofpbuf_size(&buf);
-
-        /* Mask. */
-        ofpbuf_use_stack(&buf, maskbuf, sizeof *maskbuf);
-        odp_flow_key_from_mask(&buf, &wc.masks, &netdev_flow->flow,
-                               odp_to_u32(wc.masks.in_port.odp_port),
-                               SIZE_MAX, true);
-        f->mask = ofpbuf_data(&buf);
-        f->mask_len = ofpbuf_size(&buf);
-
-        /* Actions. */
-        dp_actions = dp_netdev_flow_get_actions(netdev_flow);
-        f->actions = dp_actions->actions;
-        f->actions_len = dp_actions->size;
+        if (dump_flags) {
+            memset(f, 0, sizeof *f);
+        }
 
-        /* UID. */
-        f->uid = NULL;
-        f->uid_len = 0;
+        ofpbuf_use_stack(&key, keybuf, sizeof *keybuf);
+        ofpbuf_use_stack(&mask, maskbuf, sizeof *maskbuf);
+        ofpbuf_use_stack(&uid, uidbuf, sizeof *uidbuf);
 
-        /* Stats. */
-        get_dpif_flow_stats(netdev_flow, &f->stats);
+        dp_netdev_init_flow_convert(&convert, dump_flags, &key, &mask, &uid);
+        dp_netdev_flow_to_dpif_flow__(netdev_flow, f, &convert);
     }
 
     return n_flows;
@@ -2067,7 +2141,8 @@ static int
 dp_netdev_upcall(struct dp_netdev *dp, struct dpif_packet *packet_,
                  struct flow *flow, struct flow_wildcards *wc,
                  enum dpif_upcall_type type, const struct nlattr *userdata,
-                 struct ofpbuf *actions, struct ofpbuf *put_actions)
+                 ovs_u128 *uid, struct ofpbuf *actions,
+                 struct ofpbuf *put_actions)
 {
     struct ofpbuf *packet = &packet_->ofpbuf;
 
@@ -2101,7 +2176,7 @@ dp_netdev_upcall(struct dp_netdev *dp, struct dpif_packet *packet_,
         ds_destroy(&ds);
     }
 
-    return dp->upcall_cb(packet, flow, type, userdata, actions, wc, NULL,
+    return dp->upcall_cb(packet, flow, type, userdata, actions, wc, uid,
                          put_actions, dp->upcall_aux);
 }
 
@@ -2291,6 +2366,7 @@ fast_path_processing(struct dp_netdev *dp, struct emc_cache *flow_cache,
         uint64_t actions_stub[512 / 8], slow_stub[512 / 8];
         struct ofpbuf actions, put_actions;
         struct match match;
+        ovs_u128 uid;
 
         ofpbuf_use_stub(&actions, actions_stub, sizeof actions_stub);
         ofpbuf_use_stub(&put_actions, slow_stub, sizeof slow_stub);
@@ -2319,7 +2395,7 @@ fast_path_processing(struct dp_netdev *dp, struct emc_cache *flow_cache,
             ofpbuf_clear(&put_actions);
 
             error = dp_netdev_upcall(dp, packets[i], &match.flow, &match.wc,
-                                      DPIF_UC_MISS, NULL, &actions,
+                                      DPIF_UC_MISS, NULL, &uid, &actions,
                                       &put_actions);
             if (OVS_UNLIKELY(error && error != ENOSPC)) {
                 continue;
@@ -2345,7 +2421,8 @@ fast_path_processing(struct dp_netdev *dp, struct emc_cache *flow_cache,
              * reasonable. */
             if (OVS_LIKELY(error != ENOSPC)
                 && !dp_netdev_lookup_flow(dp, mfs[i])) {
-                dp_netdev_flow_add(dp, &match, ofpbuf_data(add_actions),
+                dp_netdev_flow_add(dp, &match, &uid,
+                                   ofpbuf_data(add_actions),
                                    ofpbuf_size(add_actions));
             }
             ovs_mutex_unlock(&dp->flow_mutex);
@@ -2462,8 +2539,8 @@ dp_execute_cb(void *aux_, struct dpif_packet **packets, int cnt,
 
                 flow_extract(&packets[i]->ofpbuf, md, &flow);
                 error = dp_netdev_upcall(dp, packets[i], &flow, NULL,
-                                         DPIF_UC_ACTION, userdata, &actions,
-                                         NULL);
+                                         DPIF_UC_ACTION, userdata, NULL,
+                                         &actions, NULL);
                 if (!error || error == ENOSPC) {
                     dp_netdev_execute_actions(dp, &packets[i], 1, false, md,
                                               aux->flow_cache,
diff --git a/lib/flow.h b/lib/flow.h
index 9c59037..a7d3dee 100644
--- a/lib/flow.h
+++ b/lib/flow.h
@@ -246,6 +246,12 @@ flow_hash(const struct flow *flow, uint32_t basis)
     return hash_words((const uint32_t *) flow, sizeof *flow / 4, basis);
 }
 
+static inline uint32_t
+flow_uid_hash(const ovs_u128 *uid, uint32_t basis)
+{
+    return hash_words((const uint32_t *) uid, sizeof *uid / 4, basis);
+}
+
 static inline uint16_t
 ofp_to_u16(ofp_port_t ofp_port)
 {
diff --git a/tests/dpif-netdev.at b/tests/dpif-netdev.at
index c50b1a8..13c93ba 100644
--- a/tests/dpif-netdev.at
+++ b/tests/dpif-netdev.at
@@ -3,6 +3,7 @@ AT_BANNER([dpif-netdev])
 # Strips out uninteresting parts of flow output, as well as parts
 # that vary from one run to another (e.g., timing and bond actions).
 m4_define([STRIP_XOUT], [[sed '
+    s/uid:[0-9a-f]* //
     s/used:[0-9]*\.[0-9]*/used:0.0/
     s/actions:.*/actions: <del>/
     s/packets:[0-9]*/packets:0/
@@ -93,6 +94,8 @@ OVS_VSWITCHD_START(
   [add-port br0 p1 -- set interface p1 type=dummy options:pstream=punix:$OVS_RUNDIR/p0.sock
    set bridge br0 datapath-type=dummy other-config:datapath-id=1234 \
                   fail-mode=secure])
+AT_CHECK([ovs-appctl upcall/disable-terse-dump], [0], [Datapath dumping tersely using UID disabled
+], [])
 AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
 
 AT_CHECK([ovs-ofctl add-flow br0 action=normal])
diff --git a/tests/ofproto-dpif.at b/tests/ofproto-dpif.at
index 79ec4f6..028a7d9 100644
--- a/tests/ofproto-dpif.at
+++ b/tests/ofproto-dpif.at
@@ -4672,7 +4672,7 @@ for dl_src in 00 01; do
 done
 sleep 1  # wait for the datapath flow installed
 for dl_src in 00 01; do
-    AT_CHECK_UNQUOTED([cat ovs-vswitchd.log | FILTER_FLOW_INSTALL | grep "$dl_src," | STRIP_USED], [0], [dnl
+    AT_CHECK_UNQUOTED([cat ovs-vswitchd.log | STRIP_UID | FILTER_FLOW_INSTALL | grep "$dl_src," | STRIP_USED], [0], [dnl
 recirc_id=0,skb_priority=0,mpls,in_port=1,dl_src=60:66:66:66:66:$dl_src,mpls_label=20,mpls_tc=0,mpls_ttl=32,mpls_bos=0,mpls_lse1=82208,mpls_lse2=0, actions:userspace(pid=0,slow_path(controller))
 ])
 done
@@ -4712,7 +4712,7 @@ for dl_src in 00 01; do
 done
 sleep 1  # wait for the datapath flow installed
 for dl_src in 00 01; do
-    AT_CHECK_UNQUOTED([cat ovs-vswitchd.log | FILTER_FLOW_INSTALL | grep "$dl_src," | STRIP_USED], [0], [dnl
+    AT_CHECK_UNQUOTED([cat ovs-vswitchd.log | STRIP_UID | FILTER_FLOW_INSTALL | grep "$dl_src," | STRIP_USED], [0], [dnl
 recirc_id=0,skb_priority=0,mpls,in_port=1,dl_src=60:66:66:66:66:$dl_src,mpls_label=20,mpls_tc=0,mpls_ttl=32,mpls_bos=0,mpls_lse1=82208,mpls_lse2=0, actions:userspace(pid=0,slow_path(controller))
 ])
 done
@@ -4729,6 +4729,8 @@ OVS_VSWITCHD_START([add-br br1 \
 ADD_OF_PORTS([br0], [2])
 ADD_OF_PORTS([br1], [3])
 
+AT_CHECK([ovs-appctl upcall/disable-terse-dump], [0], [Datapath dumping tersely using UID disabled
+], [])
 AT_CHECK([ovs-appctl time/stop])
 AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
 
@@ -4766,15 +4768,15 @@ dummy at ovs-dummy: hit:13 missed:2
 		pbr1 1/none: (patch: peer=pbr0)
 ])
 
-AT_CHECK([cat ovs-vswitchd.log | FILTER_FLOW_INSTALL | STRIP_USED], [0], [dnl
+AT_CHECK([cat ovs-vswitchd.log | STRIP_UID | FILTER_FLOW_INSTALL | STRIP_USED], [0], [dnl
 recirc_id=0,skb_priority=0,ip,in_port=100,nw_frag=no, actions:101,3,2
 recirc_id=0,skb_priority=0,ip,in_port=101,nw_frag=no, actions:100,2,3
 ])
 
-AT_CHECK([cat ovs-vswitchd.log | grep -e 'in_port(100).*packets:9' | FILTER_FLOW_DUMP], [0], [dnl
+AT_CHECK([cat ovs-vswitchd.log | grep -e 'in_port(100).*packets:9' | STRIP_UID | FILTER_FLOW_DUMP], [0], [dnl
 skb_priority(0),skb_mark(0/0),recirc_id(0),dp_hash(0/0),in_port(100),eth(src=50:54:00:00:00:05/00:00:00:00:00:00,dst=50:54:00:00:00:07/00:00:00:00:00:00),eth_type(0x0800),ipv4(src=192.168.0.1/0.0.0.0,dst=192.168.0.2/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff),icmp(type=8/0,code=0/0), packets:9, bytes:540, used:0.0s, actions:101,3,2
 ])
-AT_CHECK([cat ovs-vswitchd.log | grep -e 'in_port(101).*packets:4' | FILTER_FLOW_DUMP], [0], [dnl
+AT_CHECK([cat ovs-vswitchd.log | grep -e 'in_port(101).*packets:4' | STRIP_UID | FILTER_FLOW_DUMP], [0], [dnl
 skb_priority(0),skb_mark(0/0),recirc_id(0),dp_hash(0/0),in_port(101),eth(src=50:54:00:00:00:07/00:00:00:00:00:00,dst=50:54:00:00:00:05/00:00:00:00:00:00),eth_type(0x0800),ipv4(src=192.168.0.2/0.0.0.0,dst=192.168.0.1/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff),icmp(type=8/0,code=0/0), packets:4, bytes:240, used:0.0s, actions:100,2,3
 ])
 
@@ -5294,7 +5296,7 @@ dnl ofproto-dpif).  The second entry actually updates the destination
 dnl MAC, so both the source and destination MAC addresses are
 dnl un-wildcarded, since the ODP commit functions update both the source
 dnl and destination MAC addresses.
-AT_CHECK([cat ovs-vswitchd.log | FILTER_FLOW_INSTALL | STRIP_USED], [0], [dnl
+AT_CHECK([cat ovs-vswitchd.log | STRIP_UID | FILTER_FLOW_INSTALL | STRIP_USED], [0], [dnl
 recirc_id=0,skb_priority=0,ip,in_port=1,dl_dst=50:54:00:00:00:0a,nw_frag=no, actions:2
 recirc_id=0,skb_priority=0,ip,in_port=1,dl_src=50:54:00:00:00:0b,dl_dst=50:54:00:00:00:0c,nw_frag=no, actions:set(eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0a)),2
 ])
@@ -5311,6 +5313,8 @@ table=0 in_port=1,ip,nw_dst=10.0.0.3 actions=drop
 ])
 AT_CHECK([ovs-appctl upcall/disable-megaflows], [0], [megaflows disabled
 ], [])
+AT_CHECK([ovs-appctl upcall/disable-terse-dump], [0], [Datapath dumping tersely using UID disabled
+], [])
 AT_CHECK([ovs-appctl vlog/set dpif_netdev:dbg], [0], [], [])
 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
 for i in 1 2 3 4; do
@@ -5321,11 +5325,11 @@ for i in 1 2 3 4; do
     fi
 done
 sleep 1
-AT_CHECK([cat ovs-vswitchd.log | FILTER_FLOW_INSTALL | STRIP_USED], [0], [dnl
+AT_CHECK([cat ovs-vswitchd.log | STRIP_UID | FILTER_FLOW_INSTALL | STRIP_USED], [0], [dnl
 pkt_mark=0,recirc_id=0,skb_priority=0,icmp,tun_id=0,tun_src=0.0.0.0,tun_dst=0.0.0.0,tun_tos=0,tun_ttl=0,,in_port=1,vlan_tci=0x0000,dl_src=50:54:00:00:00:09,dl_dst=50:54:00:00:00:0a,nw_src=10.0.0.2,nw_dst=10.0.0.1,nw_tos=0,nw_ecn=0,nw_ttl=64,mpls_label=0,mpls_tc=0,mpls_ttl=0,mpls_bos=0,mpls_lse1=0,mpls_lse2=0,icmp_type=8,icmp_code=0, actions:2
 pkt_mark=0,recirc_id=0,skb_priority=0,icmp,tun_id=0,tun_src=0.0.0.0,tun_dst=0.0.0.0,tun_tos=0,tun_ttl=0,,in_port=1,vlan_tci=0x0000,dl_src=50:54:00:00:00:0b,dl_dst=50:54:00:00:00:0c,nw_src=10.0.0.4,nw_dst=10.0.0.3,nw_tos=0,nw_ecn=0,nw_ttl=64,mpls_label=0,mpls_tc=0,mpls_ttl=0,mpls_bos=0,mpls_lse1=0,mpls_lse2=0,icmp_type=8,icmp_code=0, actions:drop
 ])
-AT_CHECK([cat ovs-vswitchd.log | FILTER_FLOW_DUMP | grep 'packets:3'], [0], [dnl
+AT_CHECK([cat ovs-vswitchd.log | STRIP_UID | FILTER_FLOW_DUMP | grep 'packets:3'], [0], [dnl
 skb_priority(0),skb_mark(0),recirc_id(0),dp_hash(0),in_port(1),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0), packets:3, bytes:180, used:0.0s, actions:2
 skb_priority(0),skb_mark(0),recirc_id(0),dp_hash(0),in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0), packets:3, bytes:180, used:0.0s, actions:drop
 ])
diff --git a/tests/ofproto-macros.at b/tests/ofproto-macros.at
index 77b9b39..80ec8d3 100644
--- a/tests/ofproto-macros.at
+++ b/tests/ofproto-macros.at
@@ -36,6 +36,7 @@ m4_divert_pop([PREPARE_TESTS])
 m4_define([STRIP_XIDS], [[sed 's/ (xid=0x[0-9a-fA-F]*)//']])
 m4_define([STRIP_DURATION], [[sed 's/\bduration=[0-9.]*s/duration=?s/']])
 m4_define([STRIP_USED], [[sed 's/used:[0-9]\.[0-9]*/used:0.0/']])
+m4_define([STRIP_UID], [[sed 's/uid:[0-9a-f]* //']])
 m4_define([TESTABLE_LOG], [-vPATTERN:ANY:'%c|%p|%m'])
 
 # OVS_VSWITCHD_START([vsctl-args], [vsctl-output], [=override])
-- 
1.7.10.4




More information about the dev mailing list