2
0
mirror of https://github.com/openvswitch/ovs synced 2025-08-22 09:58:01 +00:00

odp-util: add verbose mode for displaying dp flow.

When verbose mode tuned on, all dp flow fields described by the netlink
attributes are displayed, including fully wildcarded attributes.
Otherwise, the fully wildcarded attributes are omitted for brevity.

Added -m option to "ovs-dpctl dump-flows" to enable verbose mode. It is
off by default.

Signed-off-by: Andy Zhou <azhou@nicira.com>
[blp@nicira.com added documentation]
Signed-off-by: Ben Pfaff <blp@nicira.com>
This commit is contained in:
Andy Zhou 2013-08-03 12:23:14 -07:00 committed by Ben Pfaff
parent ade6ad9cce
commit 041e71687a
10 changed files with 62 additions and 32 deletions

1
NEWS
View File

@ -45,6 +45,7 @@ v1.11.0 - xx xxx xxxx
in_port to some unused value, such as OFPP_NONE.) in_port to some unused value, such as OFPP_NONE.)
- ovs-dpctl: - ovs-dpctl:
* New debugging commands "add-flow", "mod-flow", "del-flow". * New debugging commands "add-flow", "mod-flow", "del-flow".
* "dump-flows" now has a -m option to increase output verbosity.
- In dpif-based bridges, cache action translations, which can improve - In dpif-based bridges, cache action translations, which can improve
flow set up performance by 80% with a complicated flow table. flow set up performance by 80% with a complicated flow table.
- New syslog format, prefixed with "ovs|", to be easier to filter. - New syslog format, prefixed with "ovs|", to be easier to filter.

View File

@ -1351,7 +1351,7 @@ log_flow_message(const struct dpif *dpif, int error, const char *operation,
if (error) { if (error) {
ds_put_format(&ds, "(%s) ", ovs_strerror(error)); ds_put_format(&ds, "(%s) ", ovs_strerror(error));
} }
odp_flow_format(key, key_len, mask, mask_len, &ds); odp_flow_format(key, key_len, mask, mask_len, &ds, true);
if (stats) { if (stats) {
ds_put_cstr(&ds, ", "); ds_put_cstr(&ds, ", ");
dpif_flow_stats_format(stats, &ds); dpif_flow_stats_format(stats, &ds);

View File

@ -51,7 +51,8 @@ static const char *delimiters = ", \t\r\n";
static int parse_odp_key_mask_attr(const char *, const struct simap *port_names, static int parse_odp_key_mask_attr(const char *, const struct simap *port_names,
struct ofpbuf *, struct ofpbuf *); struct ofpbuf *, struct ofpbuf *);
static void format_odp_key_attr(const struct nlattr *a, static void format_odp_key_attr(const struct nlattr *a,
const struct nlattr *ma, struct ds *ds); const struct nlattr *ma, struct ds *ds,
bool verbose);
/* Returns one the following for the action with the given OVS_ACTION_ATTR_* /* Returns one the following for the action with the given OVS_ACTION_ATTR_*
* 'type': * 'type':
@ -399,7 +400,7 @@ format_odp_action(struct ds *ds, const struct nlattr *a)
break; break;
case OVS_ACTION_ATTR_SET: case OVS_ACTION_ATTR_SET:
ds_put_cstr(ds, "set("); ds_put_cstr(ds, "set(");
format_odp_key_attr(nl_attr_get(a), NULL, ds); format_odp_key_attr(nl_attr_get(a), NULL, ds, true);
ds_put_cstr(ds, ")"); ds_put_cstr(ds, ")");
break; break;
case OVS_ACTION_ATTR_PUSH_VLAN: case OVS_ACTION_ATTR_PUSH_VLAN:
@ -897,6 +898,12 @@ tun_key_to_attr(struct ofpbuf *a, const struct flow_tnl *tun_key)
nl_msg_end_nested(a, tun_key_ofs); nl_msg_end_nested(a, tun_key_ofs);
} }
static bool
odp_mask_attr_is_wildcard(const struct nlattr *ma)
{
return is_all_zeros(nl_attr_get(ma), nl_attr_get_size(ma));
}
static bool static bool
odp_mask_attr_is_exact(const struct nlattr *ma) odp_mask_attr_is_exact(const struct nlattr *ma)
{ {
@ -929,7 +936,7 @@ odp_mask_attr_is_exact(const struct nlattr *ma)
static void static void
format_odp_key_attr(const struct nlattr *a, const struct nlattr *ma, format_odp_key_attr(const struct nlattr *a, const struct nlattr *ma,
struct ds *ds) struct ds *ds, bool verbose)
{ {
struct flow_tnl tun_key; struct flow_tnl tun_key;
enum ovs_key_attr attr = nl_attr_type(a); enum ovs_key_attr attr = nl_attr_type(a);
@ -972,9 +979,10 @@ format_odp_key_attr(const struct nlattr *a, const struct nlattr *ma,
case OVS_KEY_ATTR_ENCAP: case OVS_KEY_ATTR_ENCAP:
if (ma && nl_attr_get_size(ma) && nl_attr_get_size(a)) { if (ma && nl_attr_get_size(ma) && nl_attr_get_size(a)) {
odp_flow_format(nl_attr_get(a), nl_attr_get_size(a), odp_flow_format(nl_attr_get(a), nl_attr_get_size(a),
nl_attr_get(ma), nl_attr_get_size(ma), ds); nl_attr_get(ma), nl_attr_get_size(ma), ds, verbose);
} else if (nl_attr_get_size(a)) { } else if (nl_attr_get_size(a)) {
odp_flow_format(nl_attr_get(a), nl_attr_get_size(a), NULL, 0, ds); odp_flow_format(nl_attr_get(a), nl_attr_get_size(a), NULL, 0, ds,
verbose);
} }
break; break;
@ -1337,7 +1345,7 @@ generate_all_wildcard_mask(struct ofpbuf *ofp, const struct nlattr *key)
void void
odp_flow_format(const struct nlattr *key, size_t key_len, odp_flow_format(const struct nlattr *key, size_t key_len,
const struct nlattr *mask, size_t mask_len, const struct nlattr *mask, size_t mask_len,
struct ds *ds) struct ds *ds, bool verbose)
{ {
if (key_len) { if (key_len) {
const struct nlattr *a; const struct nlattr *a;
@ -1345,22 +1353,35 @@ odp_flow_format(const struct nlattr *key, size_t key_len,
bool has_ethtype_key = false; bool has_ethtype_key = false;
const struct nlattr *ma = NULL; const struct nlattr *ma = NULL;
struct ofpbuf ofp; struct ofpbuf ofp;
bool first_field = true;
ofpbuf_init(&ofp, 100); ofpbuf_init(&ofp, 100);
NL_ATTR_FOR_EACH (a, left, key, key_len) { NL_ATTR_FOR_EACH (a, left, key, key_len) {
if (a != key) { bool is_nested_attr;
ds_put_char(ds, ','); bool is_wildcard = false;
} int attr_type = nl_attr_type(a);
if (nl_attr_type(a) == OVS_KEY_ATTR_ETHERTYPE) {
if (attr_type == OVS_KEY_ATTR_ETHERTYPE) {
has_ethtype_key = true; has_ethtype_key = true;
} }
is_nested_attr = (odp_flow_key_attr_len(attr_type) == -2);
if (mask && mask_len) { if (mask && mask_len) {
ma = nl_attr_find__(mask, mask_len, nl_attr_type(a)); ma = nl_attr_find__(mask, mask_len, nl_attr_type(a));
if (!ma) { is_wildcard = ma ? odp_mask_attr_is_wildcard(ma) : true;
}
if (verbose || !is_wildcard || is_nested_attr) {
if (is_wildcard && !ma) {
ma = generate_all_wildcard_mask(&ofp, a); ma = generate_all_wildcard_mask(&ofp, a);
} }
if (!first_field) {
ds_put_char(ds, ',');
}
format_odp_key_attr(a, ma, ds, verbose);
first_field = false;
} }
format_odp_key_attr(a, ma, ds);
ofpbuf_clear(&ofp); ofpbuf_clear(&ofp);
} }
ofpbuf_uninit(&ofp); ofpbuf_uninit(&ofp);
@ -1395,7 +1416,7 @@ void
odp_flow_key_format(const struct nlattr *key, odp_flow_key_format(const struct nlattr *key,
size_t key_len, struct ds *ds) size_t key_len, struct ds *ds)
{ {
odp_flow_format(key, key_len, NULL, 0, ds); odp_flow_format(key, key_len, NULL, 0, ds, true);
} }
static void static void

View File

@ -94,7 +94,7 @@ enum odp_key_fitness odp_tun_key_from_attr(const struct nlattr *,
void odp_flow_format(const struct nlattr *key, size_t key_len, void odp_flow_format(const struct nlattr *key, size_t key_len,
const struct nlattr *mask, size_t mask_len, const struct nlattr *mask, size_t mask_len,
struct ds *); struct ds *, bool verbose);
void odp_flow_key_format(const struct nlattr *, size_t, struct ds *); void odp_flow_key_format(const struct nlattr *, size_t, struct ds *);
int odp_flow_from_string(const char *s, int odp_flow_from_string(const char *s,
const struct simap *port_names, const struct simap *port_names,

View File

@ -6248,7 +6248,7 @@ ofproto_unixctl_dpif_dump_flows(struct unixctl_conn *conn,
} }
odp_flow_format(subfacet->key, subfacet->key_len, odp_flow_format(subfacet->key, subfacet->key_len,
mask.data, mask.size, &ds); mask.data, mask.size, &ds, false);
ds_put_format(&ds, ", packets:%"PRIu64", bytes:%"PRIu64", used:", ds_put_format(&ds, ", packets:%"PRIu64", bytes:%"PRIu64", used:",
subfacet->dp_packet_count, subfacet->dp_byte_count); subfacet->dp_packet_count, subfacet->dp_byte_count);

View File

@ -88,7 +88,7 @@ in_port(1),eth(src=00:01:02:03:04:05,dst=10:11:12:13:14:15),eth_type(0x1234/0xff
in_port(1),eth(src=00:01:02:03:04:05,dst=10:11:12:13:14:15),eth_type(0x0800),ipv4(src=35.8.2.41/255.255.255.0,dst=172.16.0.20/255.255.255.0,proto=5/0xf0,tos=0x80/0xf0,ttl=128/0xf0,frag=no/0xf0) in_port(1),eth(src=00:01:02:03:04:05,dst=10:11:12:13:14:15),eth_type(0x0800),ipv4(src=35.8.2.41/255.255.255.0,dst=172.16.0.20/255.255.255.0,proto=5/0xf0,tos=0x80/0xf0,ttl=128/0xf0,frag=no/0xf0)
in_port(1),eth(src=00:01:02:03:04:05,dst=10:11:12:13:14:15),eth_type(0x0800),ipv4(src=35.8.2.41,dst=172.16.0.20,proto=6,tos=0,ttl=128,frag=no),tcp(src=80/0xff00,dst=8080/0xff) in_port(1),eth(src=00:01:02:03:04:05,dst=10:11:12:13:14:15),eth_type(0x0800),ipv4(src=35.8.2.41,dst=172.16.0.20,proto=6,tos=0,ttl=128,frag=no),tcp(src=80/0xff00,dst=8080/0xff)
in_port(1),eth(src=00:01:02:03:04:05,dst=10:11:12:13:14:15),eth_type(0x0800),ipv4(src=35.8.2.41,dst=172.16.0.20,proto=17,tos=0,ttl=128,frag=no),udp(src=81/0xff00,dst=6632/0xff) in_port(1),eth(src=00:01:02:03:04:05,dst=10:11:12:13:14:15),eth_type(0x0800),ipv4(src=35.8.2.41,dst=172.16.0.20,proto=17,tos=0,ttl=128,frag=no),udp(src=81/0xff00,dst=6632/0xff)
in_port(1),eth(src=00:01:02:03:04:05,dst=10:11:12:13:14:15),eth_type(0x0800),ipv4(src=35.8.2.41,dst=172.16.0.20,proto=17,tos=0,ttl=128,frag=no),udp(src=81/0,dst=6632/0) in_port(1),eth(src=00:01:02:03:04:05,dst=10:11:12:13:14:15),eth_type(0x0800),ipv4(src=35.8.2.41,dst=172.16.0.20,proto=17,tos=0,ttl=128,frag=no),udp(src=81/0xff,dst=6632/0xff00)
in_port(1),eth(src=00:01:02:03:04:05,dst=10:11:12:13:14:15),eth_type(0x0800),ipv4(src=35.8.2.41,dst=172.16.0.20,proto=1,tos=0,ttl=128,frag=no),icmp(type=1/0xf0,code=2/0xff) in_port(1),eth(src=00:01:02:03:04:05,dst=10:11:12:13:14:15),eth_type(0x0800),ipv4(src=35.8.2.41,dst=172.16.0.20,proto=1,tos=0,ttl=128,frag=no),icmp(type=1/0xf0,code=2/0xff)
in_port(1),eth(src=00:01:02:03:04:05,dst=10:11:12:13:14:15),eth_type(0x86dd),ipv6(src=::1/::255,dst=::2/::255,label=0/0xf0,proto=10/0xf0,tclass=0x70/0xf0,hlimit=128/0xf0,frag=no/0xf0) in_port(1),eth(src=00:01:02:03:04:05,dst=10:11:12:13:14:15),eth_type(0x86dd),ipv6(src=::1/::255,dst=::2/::255,label=0/0xf0,proto=10/0xf0,tclass=0x70/0xf0,hlimit=128/0xf0,frag=no/0xf0)
in_port(1),eth(src=00:01:02:03:04:05,dst=10:11:12:13:14:15),eth_type(0x86dd),ipv6(src=::1,dst=::2,label=0,proto=6,tclass=0,hlimit=128,frag=no),tcp(src=80/0xff00,dst=8080/0xff) in_port(1),eth(src=00:01:02:03:04:05,dst=10:11:12:13:14:15),eth_type(0x86dd),ipv6(src=::1,dst=::2,label=0,proto=6,tclass=0,hlimit=128,frag=no),tcp(src=80/0xff00,dst=8080/0xff)

View File

@ -2088,12 +2088,12 @@ AT_CHECK([ovs-appctl netdev-dummy/receive p2 'in_port(2),eth(src=50:54:00:00:00:
AT_CHECK([ovs-appctl netdev-dummy/receive p3 'in_port(3),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)']) AT_CHECK([ovs-appctl netdev-dummy/receive p3 'in_port(3),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)'])
AT_CHECK([ovs-appctl dpif/dump-flows br0 | sort | STRIP_USED], [0], [dnl AT_CHECK([ovs-appctl dpif/dump-flows br0 | sort | STRIP_USED], [0], [dnl
in_port(1),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:0, bytes:0, used:0.0s, actions:userspace(pid=0,slow_path(controller)) in_port(1),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), packets:0, bytes:0, used:0.0s, actions:userspace(pid=0,slow_path(controller))
in_port(2),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=0/0,code=0/0), packets:0, bytes:0, used:0.0s, actions:userspace(pid=0,slow_path(controller)) in_port(2),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), packets:0, bytes:0, used:0.0s, actions:userspace(pid=0,slow_path(controller))
]) ])
AT_CHECK([ovs-appctl dpif/dump-flows br1 | sort | STRIP_USED], [0], [dnl AT_CHECK([ovs-appctl dpif/dump-flows br1 | sort | STRIP_USED], [0], [dnl
in_port(3),eth(src=50:54:00:00:00:09/00:00:00:00:00:00,dst=50:54:00:00:00:0a/00:00:00:00:00:00),eth_type(0x0800),ipv4(src=10.0.0.2/0.0.0.0,dst=10.0.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:0, bytes:0, used:0.0s, actions:userspace(pid=0,slow_path(controller)) in_port(3),eth_type(0x0800),ipv4(src=10.0.0.2/0.0.0.0,dst=10.0.0.1/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:0.0s, actions:userspace(pid=0,slow_path(controller))
]) ])
OVS_VSWITCHD_STOP OVS_VSWITCHD_STOP
@ -2110,12 +2110,12 @@ AT_CHECK([ovs-appctl netdev-dummy/receive p2 'in_port(2),eth(src=50:54:00:00:00:
AT_CHECK([ovs-appctl netdev-dummy/receive p3 'in_port(3),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)']) AT_CHECK([ovs-appctl netdev-dummy/receive p3 'in_port(3),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)'])
AT_CHECK([ovs-appctl dpif/dump-flows br0 | sort | STRIP_USED], [0], [dnl AT_CHECK([ovs-appctl dpif/dump-flows br0 | sort | STRIP_USED], [0], [dnl
in_port(1),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:0, bytes:0, used:0.0s, actions:userspace(pid=0,slow_path(controller)) in_port(1),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), packets:0, bytes:0, used:0.0s, actions:userspace(pid=0,slow_path(controller))
in_port(2),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=0/0,code=0/0), packets:0, bytes:0, used:0.0s, actions:userspace(pid=0,slow_path(controller)) in_port(2),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), packets:0, bytes:0, used:0.0s, actions:userspace(pid=0,slow_path(controller))
]) ])
AT_CHECK([ovs-appctl dpif/dump-flows br1 | sort | STRIP_USED], [0], [dnl AT_CHECK([ovs-appctl dpif/dump-flows br1 | sort | STRIP_USED], [0], [dnl
in_port(3),eth(src=50:54:00:00:00:09/00:00:00:00:00:00,dst=50:54:00:00:00:0a/00:00:00:00:00:00),eth_type(0x0800),ipv4(src=10.0.0.2/0.0.0.0,dst=10.0.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:0, bytes:0, used:0.0s, actions:userspace(pid=0,slow_path(controller)) in_port(3),eth_type(0x0800),ipv4(src=10.0.0.2/0.0.0.0,dst=10.0.0.1/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:0.0s, actions:userspace(pid=0,slow_path(controller))
]) ])
AT_CHECK([ovs-appctl dpif/del-flows br0]) AT_CHECK([ovs-appctl dpif/del-flows br0])
@ -2123,7 +2123,7 @@ AT_CHECK([ovs-appctl dpif/dump-flows br0 | sort | STRIP_USED], [0], [dnl
]) ])
AT_CHECK([ovs-appctl dpif/dump-flows br1 | sort | STRIP_USED], [0], [dnl AT_CHECK([ovs-appctl dpif/dump-flows br1 | sort | STRIP_USED], [0], [dnl
in_port(3),eth(src=50:54:00:00:00:09/00:00:00:00:00:00,dst=50:54:00:00:00:0a/00:00:00:00:00:00),eth_type(0x0800),ipv4(src=10.0.0.2/0.0.0.0,dst=10.0.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:0, bytes:0, used:0.0s, actions:userspace(pid=0,slow_path(controller)) in_port(3),eth_type(0x0800),ipv4(src=10.0.0.2/0.0.0.0,dst=10.0.0.1/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:0.0s, actions:userspace(pid=0,slow_path(controller))
]) ])
OVS_VSWITCHD_STOP OVS_VSWITCHD_STOP
@ -2170,10 +2170,10 @@ dummy@ovs-dummy: hit:13 missed:2
]) ])
AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_USED], [0], [dnl AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_USED], [0], [dnl
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 in_port(100),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), packets:9, bytes:540, used:0.0s, actions:101,3,2
]), ]),
AT_CHECK([ovs-appctl dpif/dump-flows br1 | STRIP_USED], [0], [dnl AT_CHECK([ovs-appctl dpif/dump-flows br1 | STRIP_USED], [0], [dnl
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 in_port(101),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), packets:4, bytes:240, used:0.0s, actions:100,2,3
]) ])
AT_CHECK([ovs-ofctl dump-ports br0 pbr0], [0], [dnl AT_CHECK([ovs-ofctl dump-ports br0 pbr0], [0], [dnl

View File

@ -86,7 +86,7 @@ parse_keys(bool wc_keys)
ds_init(&out); ds_init(&out);
if (wc_keys) { if (wc_keys) {
odp_flow_format(odp_key.data, odp_key.size, odp_flow_format(odp_key.data, odp_key.size,
odp_mask.data, odp_mask.size, &out); odp_mask.data, odp_mask.size, &out, false);
} else { } else {
odp_flow_key_format(odp_key.data, odp_key.size, &out); odp_flow_key_format(odp_key.data, odp_key.size, &out);
} }

View File

@ -118,9 +118,11 @@ exactly one datapath exists, in which case that datapath is the
default. When multiple datapaths exist, then a datapath name is default. When multiple datapaths exist, then a datapath name is
required. required.
. .
.IP "\fBdump\-flows\fR [\fIdp\fR]" .IP "[\fB\-m \fR| \fB\-\-more\fR] \fBdump\-flows\fR [\fIdp\fR]"
Prints to the console all flow entries in datapath \fIdp\fR's Prints to the console all flow entries in datapath \fIdp\fR's flow
flow table. table. Without \fB\-m\fR or \fB\-\-more\fR, output omits match fields
that a flow wildcards entirely; with \fB\-m\fR or \fB\-\-more\fR,
output includes all wildcarded fields.
. .
.IP "\fBadd\-flow\fR [\fIdp\fR] \fIflow actions\fR" .IP "\fBadd\-flow\fR [\fIdp\fR] \fIflow actions\fR"
.IQ "[\fB\-\-clear\fR] [\fB\-\-may-create\fR] [\fB\-s\fR | \fB\-\-statistics\fR] \fBmod\-flow\fR [\fIdp\fR] \fIflow actions\fR" .IQ "[\fB\-\-clear\fR] [\fB\-\-may-create\fR] [\fB\-s\fR | \fB\-\-statistics\fR] \fBmod\-flow\fR [\fIdp\fR] \fIflow actions\fR"
@ -159,6 +161,10 @@ Deletes all flow entries from datapath \fIdp\fR's flow table.
Causes the \fBshow\fR command to print packet and byte counters for Causes the \fBshow\fR command to print packet and byte counters for
each port within the datapaths that it shows. each port within the datapaths that it shows.
. .
.IP "\fB\-m\fR"
.IQ "\fB\-\-more\fR"
Increases the verbosity of \fBdump\-flows\fR output.
.
.IP "\fB\-t\fR" .IP "\fB\-t\fR"
.IQ "\fB\-\-timeout=\fIsecs\fR" .IQ "\fB\-\-timeout=\fIsecs\fR"
Limits \fBovs\-dpctl\fR runtime to approximately \fIsecs\fR seconds. If Limits \fBovs\-dpctl\fR runtime to approximately \fIsecs\fR seconds. If

View File

@ -182,6 +182,8 @@ usage(void)
vlog_usage(); vlog_usage();
printf("\nOptions for show and mod-flow:\n" printf("\nOptions for show and mod-flow:\n"
" -s, --statistics print statistics for port or flow\n" " -s, --statistics print statistics for port or flow\n"
"\nOptions for dump-flows:\n"
" -m, --more increase verbosity of output\n"
"\nOptions for mod-flow:\n" "\nOptions for mod-flow:\n"
" --may-create create flow if it doesn't exist\n" " --may-create create flow if it doesn't exist\n"
" --clear reset existing stats to zero\n" " --clear reset existing stats to zero\n"
@ -761,7 +763,7 @@ dpctl_dump_flows(int argc, char *argv[])
&mask, &mask_len, &mask, &mask_len,
&actions, &actions_len, &stats)) { &actions, &actions_len, &stats)) {
ds_clear(&ds); ds_clear(&ds);
odp_flow_format(key, key_len, mask, mask_len, &ds); odp_flow_format(key, key_len, mask, mask_len, &ds, verbosity);
ds_put_cstr(&ds, ", "); ds_put_cstr(&ds, ", ");
dpif_flow_stats_format(stats, &ds); dpif_flow_stats_format(stats, &ds);
@ -1050,7 +1052,7 @@ dpctl_normalize_actions(int argc, char *argv[])
"odp_flow_key_from_string"); "odp_flow_key_from_string");
ds_clear(&s); ds_clear(&s);
odp_flow_format(keybuf.data, keybuf.size, NULL, 0, &s); odp_flow_format(keybuf.data, keybuf.size, NULL, 0, &s, verbosity);
printf("input flow: %s\n", ds_cstr(&s)); printf("input flow: %s\n", ds_cstr(&s));
run(odp_flow_key_to_flow(keybuf.data, keybuf.size, &flow), run(odp_flow_key_to_flow(keybuf.data, keybuf.size, &flow),