diff options
author | Eli Britstein <elibr@mellanox.com> | 2020-01-09 07:46:46 +0000 |
---|---|---|
committer | Ilya Maximets <i.maximets@ovn.org> | 2020-01-16 13:34:10 +0100 |
commit | 80944cb41d2a9cb539153202b8ee41f488f5dd6e (patch) | |
tree | bd103e5e33bb3074feab0d454a5cc5b13083b770 /lib/dpctl.c | |
parent | 2aca29df93505798643817a4613da4eecfb9bf8b (diff) | |
download | openvswitch-80944cb41d2a9cb539153202b8ee41f488f5dd6e.tar.gz |
dpctl: Support dump-flows filters "dpdk" and "partially-offloaded".
Flows that are offloaded via DPDK can be partially offloaded (matches
only) or fully offloaded (matches and actions). Set partially offloaded
display to (offloaded=partial, dp:ovs), and fully offloaded to
(offloaded=yes, dp:dpdk). Also support filter types "dpdk" and
"partially-offloaded".
Signed-off-by: Eli Britstein <elibr@mellanox.com>
Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
Diffstat (limited to 'lib/dpctl.c')
-rw-r--r-- | lib/dpctl.c | 28 |
1 files changed, 25 insertions, 3 deletions
diff --git a/lib/dpctl.c b/lib/dpctl.c index a1ea25b47..23c2682d0 100644 --- a/lib/dpctl.c +++ b/lib/dpctl.c @@ -818,7 +818,11 @@ format_dpif_flow(struct ds *ds, const struct dpif_flow *f, struct hmap *ports, dpif_flow_stats_format(&f->stats, ds); if (dpctl_p->verbosity && f->attrs.offloaded) { - ds_put_cstr(ds, ", offloaded:yes"); + if (f->attrs.dp_layer && !strcmp(f->attrs.dp_layer, "ovs")) { + ds_put_cstr(ds, ", offloaded:partial"); + } else { + ds_put_cstr(ds, ", offloaded:yes"); + } } if (dpctl_p->verbosity && f->attrs.dp_layer) { ds_put_format(ds, ", dp:%s", f->attrs.dp_layer); @@ -830,8 +834,10 @@ format_dpif_flow(struct ds *ds, const struct dpif_flow *f, struct hmap *ports, struct dump_types { bool ovs; bool tc; + bool dpdk; bool offloaded; bool non_offloaded; + bool partially_offloaded; }; static void @@ -839,8 +845,10 @@ enable_all_dump_types(struct dump_types *dump_types) { dump_types->ovs = true; dump_types->tc = true; + dump_types->dpdk = true; dump_types->offloaded = true; dump_types->non_offloaded = true; + dump_types->partially_offloaded = true; } static int @@ -865,10 +873,14 @@ populate_dump_types(char *types_list, struct dump_types *dump_types, dump_types->ovs = true; } else if (!strcmp(current_type, "tc")) { dump_types->tc = true; + } else if (!strcmp(current_type, "dpdk")) { + dump_types->dpdk = true; } else if (!strcmp(current_type, "offloaded")) { dump_types->offloaded = true; } else if (!strcmp(current_type, "non-offloaded")) { dump_types->non_offloaded = true; + } else if (!strcmp(current_type, "partially-offloaded")) { + dump_types->partially_offloaded = true; } else if (!strcmp(current_type, "all")) { enable_all_dump_types(dump_types); } else { @@ -886,7 +898,9 @@ determine_dpif_flow_dump_types(struct dump_types *dump_types, { dpif_dump_types->ovs_flows = dump_types->ovs || dump_types->non_offloaded; dpif_dump_types->netdev_flows = dump_types->tc || dump_types->offloaded - || dump_types->non_offloaded; + || dump_types->non_offloaded + || dump_types->dpdk + || dump_types->partially_offloaded; } static bool @@ -899,7 +913,15 @@ flow_passes_type_filter(const struct dpif_flow *f, if (dump_types->tc && !strcmp(f->attrs.dp_layer, "tc")) { return true; } - if (dump_types->offloaded && f->attrs.offloaded) { + if (dump_types->dpdk && !strcmp(f->attrs.dp_layer, "dpdk")) { + return true; + } + if (dump_types->offloaded && f->attrs.offloaded && + strcmp(f->attrs.dp_layer, "ovs")) { + return true; + } + if (dump_types->partially_offloaded && f->attrs.offloaded && + !strcmp(f->attrs.dp_layer, "ovs")) { return true; } if (dump_types->non_offloaded && !(f->attrs.offloaded)) { |