[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