On 10 Dec 2025, at 17:41, Eli Britstein wrote:
>> -----Original Message-----
>> From: dev <[email protected]> On Behalf Of Eelco Chaudron
>> Sent: Tuesday, 2 December 2025 16:05
>> To: [email protected]
>> Subject: [ovs-dev] [PATCH v2 12/41] dpif-offload: Introduce provider debug
>> information API.
>>
>> This patch adds a new API that allows offload providers to expose free-form
>> debug information. The information can be used for troubleshooting the
>> offload
>> providers state.
>>
>> The new API is integrated into the existing 'ovs-appctl dpif/offload/show'
>> command, which now displays this debug output when available.
>>
>> Support for this API has been implemented for all currently supported offload
>> providers.
>>
>> Signed-off-by: Eelco Chaudron <[email protected]>
>> ---
>> include/openvswitch/json.h | 1 +
>> lib/dpif-offload-dpdk.c | 53 ++++++++++++++++
>> lib/dpif-offload-dummy.c | 55 ++++++++++++++++
>> lib/dpif-offload-provider.h | 9 +++
>> lib/dpif-offload-tc.c | 55 ++++++++++++++++
>> lib/dpif-offload.c | 12 ++++
>> lib/dpif-offload.h | 2 +
>> lib/json.c | 7 +++
>> ofproto/ofproto-dpif.c | 18 +++++-
>> tests/ofproto-dpif.at | 104 +++++++++++++++++++++++++++++--
>> tests/system-dpdk.at | 13 +++-
>> tests/system-offloads-traffic.at | 33 ++++++++--
>> 12 files changed, 347 insertions(+), 15 deletions(-)
>>
>> diff --git a/include/openvswitch/json.h b/include/openvswitch/json.h index
>> 134890553..ea2c4da04 100644
>> --- a/include/openvswitch/json.h
>> +++ b/include/openvswitch/json.h
>> @@ -123,6 +123,7 @@ struct json *json_array_create_3(struct json *, struct
>> json *, struct json *); bool json_array_contains_string(const struct json
>> *, const
>> char *);
>>
>> struct json *json_object_create(void);
>> +bool json_object_is_empty(struct json *);
>> void json_object_put(struct json *, const char *name, struct json *value);
>> void
>> json_object_put_nocopy(struct json *, char *name, struct json *value); void
>> json_object_put_string(struct json *, diff --git a/lib/dpif-offload-dpdk.c
>> b/lib/dpif-offload-dpdk.c index be33346a4..1f097bfc9 100644
>> --- a/lib/dpif-offload-dpdk.c
>> +++ b/lib/dpif-offload-dpdk.c
>> @@ -23,6 +23,7 @@
>> #include "netdev-vport.h"
>> #include "util.h"
>>
>> +#include "openvswitch/json.h"
>> #include "openvswitch/vlog.h"
>>
>> VLOG_DEFINE_THIS_MODULE(dpif_offload_dpdk);
>> @@ -186,6 +187,57 @@ dpif_offload_dpdk_set_config(struct dpif_offload
>> *offload_,
>> }
>> }
>>
>> +static bool
>> +dpif_offload_dpdk_get_port_debug_ds(struct dpif_offload_port_mgr_port
>> *port,
>> + void *aux) {
>> + struct ds *ds = aux;
>> +
>> + ds_put_format(ds, " - %s: port_no: %u\n",
>> + netdev_get_name(port->netdev), port->port_no);
>> +
>> + return false;
>> +}
>> +
>> +static bool
>> +dpif_offload_dpdk_get_port_debug_json(struct dpif_offload_port_mgr_port
>> *port,
>> + void *aux) {
>> + struct json *json_port = json_object_create();
>> + struct json *json = aux;
>> +
>> + json_object_put(json_port, "port_no",
>> + json_integer_create(odp_to_u32(port->port_no)));
>> +
>> + json_object_put(json, netdev_get_name(port->netdev), json_port);
>> + return false;
>> +}
>> +
>> +static void
>> +dpif_offload_dpdk_get_debug(const struct dpif_offload *offload_, struct ds
>> *ds,
>> + struct json *json) {
>> + struct dpif_offload_dpdk *offload =
>> +dpif_offload_dpdk_cast(offload_);
>> +
>> + if (json) {
>> + struct json *json_ports = json_object_create();
>> +
>> + dpif_offload_port_mgr_traverse_ports(
>> + offload->port_mgr, dpif_offload_dpdk_get_port_debug_json,
>> + json_ports);
>> +
>> + if (!json_object_is_empty(json_ports)) {
>> + json_object_put(json, "ports", json_ports);
>> + } else {
>> + json_destroy(json_ports);
>> + }
>> +
> Remove blank line. Also below occurrences.
ACK.
>> + } else if (ds) {
>> + dpif_offload_port_mgr_traverse_ports(
>> + offload->port_mgr, dpif_offload_dpdk_get_port_debug_ds, ds);
>> + }
>> +}
>> +
>> static bool
>> dpif_offload_dpdk_can_offload(struct dpif_offload *offload OVS_UNUSED,
>> struct netdev *netdev) @@ -208,6 +260,7 @@
>> struct
>> dpif_offload_class dpif_offload_dpdk_class = {
>> .open = dpif_offload_dpdk_open,
>> .close = dpif_offload_dpdk_close,
>> .set_config = dpif_offload_dpdk_set_config,
>> + .get_debug = dpif_offload_dpdk_get_debug,
>> .can_offload = dpif_offload_dpdk_can_offload,
>> .port_add = dpif_offload_dpdk_port_add,
>> .port_del = dpif_offload_dpdk_port_del, diff --git
>> a/lib/dpif-offload-dummy.c
>> b/lib/dpif-offload-dummy.c index 827165ba2..1a226a38f 100644
>> --- a/lib/dpif-offload-dummy.c
>> +++ b/lib/dpif-offload-dummy.c
>> @@ -24,6 +24,7 @@
>> #include "netdev-provider.h"
>> #include "util.h"
>>
>> +#include "openvswitch/json.h"
>>
>> struct dpif_offload_dummy {
>> struct dpif_offload offload;
>> @@ -171,6 +172,59 @@ dpif_offload_dummy_set_config(struct dpif_offload
>> *dpif_offload,
>> }
>> }
>>
>> +static bool
>> +dpif_offload_dummy_get_port_debug_ds(struct dpif_offload_port_mgr_port
>> *port,
>> + void *aux) {
>> + struct ds *ds = aux;
>> +
>> + ds_put_format(ds, " - %s: port_no: %u\n", netdev_get_name(port-
>>> netdev),
>> + port->port_no);
>> +
>> + return false;
>> +}
>> +
>> +static bool
>> +dpif_offload_dummy_get_port_debug_json(struct
>> dpif_offload_port_mgr_port *port,
>> + void *aux) {
>> + struct json *json_port = json_object_create();
>> + struct json *json = aux;
>> +
>> + json_object_put(json_port, "port_no",
>> + json_integer_create(odp_to_u32(port->port_no)));
>> +
>> + json_object_put(json, netdev_get_name(port->netdev), json_port);
>> + return false;
>> +}
>> +
>> +static void
>> +dpif_offload_dummy_get_debug(const struct dpif_offload *offload, struct ds
>> *ds,
>> + struct json *json) {
>> + struct dpif_offload_dummy *offload_dummy;
>> +
>> + offload_dummy = dpif_offload_dummy_cast(offload);
>> +
>> + if (json) {
>> + struct json *json_ports = json_object_create();
>> +
>> + dpif_offload_port_mgr_traverse_ports(
>> + offload_dummy->port_mgr,
>> dpif_offload_dummy_get_port_debug_json,
>> + json_ports);
>> +
>> + if (!json_object_is_empty(json_ports)) {
>> + json_object_put(json, "ports", json_ports);
>> + } else {
>> + json_destroy(json_ports);
>> + }
>> +
>> + } else if (ds) {
>> + dpif_offload_port_mgr_traverse_ports(
>> + offload_dummy->port_mgr, dpif_offload_dummy_get_port_debug_ds,
>> ds);
>> + }
>> +}
>> +
>> static bool
>> dpif_offload_dummy_can_offload(struct dpif_offload *dpif_offload
>> OVS_UNUSED,
>> struct netdev *netdev) @@ -187,6 +241,7 @@
>> dpif_offload_dummy_can_offload(struct dpif_offload *dpif_offload
>> OVS_UNUSED,
>> .open = dpif_offload_dummy_open, \
>> .close = dpif_offload_dummy_close, \
>> .set_config = dpif_offload_dummy_set_config, \
>> + .get_debug = dpif_offload_dummy_get_debug, \
>> .can_offload = dpif_offload_dummy_can_offload, \
>> .port_add = dpif_offload_dummy_port_add, \
>> .port_del = dpif_offload_dummy_port_del, \
>> diff --git a/lib/dpif-offload-provider.h b/lib/dpif-offload-provider.h index
>> 496959ea3..50f9a53c2 100644
>> --- a/lib/dpif-offload-provider.h
>> +++ b/lib/dpif-offload-provider.h
>> @@ -93,6 +93,15 @@ struct dpif_offload_class {
>> void (*set_config)(struct dpif_offload *,
>> const struct smap *other_config);
>>
>> + /* Retrieve debug information from the offload provider in either string
>> + * (ds) or JSON format. If both formats are requested, the provider may
>> + * choose which one to return. Note that the actual format is
>> unspecified,
>> + * it's up to the provider to decide what to return. If 'ds' is
>> supplied,
>> + * it should be initialized, and might already contain data. The
>> caller is
>> + * responsible for freeing any returned 'ds' or 'json' pointers. */
>> + void (*get_debug)(const struct dpif_offload *offload, struct ds *ds,
>> + struct json *json);
>> +
>> /* Verifies whether the offload provider supports offloading flows for
>> the
>> * given 'netdev'. Returns 'false' if the provider lacks the
>> capabilities
>> * to offload on this port, otherwise returns 'true'. */ diff --git
>> a/lib/dpif-
>> offload-tc.c b/lib/dpif-offload-tc.c index c3090829b..66d52851a 100644
>> --- a/lib/dpif-offload-tc.c
>> +++ b/lib/dpif-offload-tc.c
>> @@ -24,6 +24,7 @@
>> #include "util.h"
>> #include "tc.h"
>>
>> +#include "openvswitch/json.h"
>> #include "openvswitch/vlog.h"
>>
>> VLOG_DEFINE_THIS_MODULE(dpif_offload_tc);
>> @@ -169,6 +170,59 @@ dpif_offload_tc_set_config(struct dpif_offload
>> *offload,
>> }
>> }
>>
>> +static bool
>> +dpif_offload_tc_get_port_debug_ds(struct dpif_offload_port_mgr_port *port,
>> + void *aux) {
>> + struct ds *ds = aux;
>> +
>> + ds_put_format(ds, " - %s: port_no: %u, ifindex: %d\n",
>> + netdev_get_name(port->netdev), port->port_no,
>> + port->ifindex);
>> +
>> + return false;
>> +}
>> +
>> +static bool
>> +dpif_offload_tc_get_port_debug_json(struct dpif_offload_port_mgr_port
>> *port,
>> + void *aux) {
>> + struct json *json_port = json_object_create();
>> + struct json *json = aux;
>> +
>> + json_object_put(json_port, "port_no",
>> + json_integer_create(odp_to_u32(port->port_no)));
>> + json_object_put(json_port, "ifindex",
>> + json_integer_create(port->ifindex));
>> +
>> + json_object_put(json, netdev_get_name(port->netdev), json_port);
>> + return false;
>> +}
>> +
>> +static void
>> +dpif_offload_tc_get_debug(const struct dpif_offload *offload, struct ds *ds,
>> + struct json *json) {
>> + struct dpif_offload_tc *offload_tc = dpif_offload_tc_cast(offload);
>> +
>> + if (json) {
>> + struct json *json_ports = json_object_create();
>> +
>> + dpif_offload_port_mgr_traverse_ports(
>> + offload_tc->port_mgr, dpif_offload_tc_get_port_debug_json,
>> + json_ports);
>> +
>> + if (!json_object_is_empty(json_ports)) {
>> + json_object_put(json, "ports", json_ports);
>> + } else {
>> + json_destroy(json_ports);
>> + }
>> +
>> + } else if (ds) {
>> + dpif_offload_port_mgr_traverse_ports(offload_tc->port_mgr,
>> +
>> dpif_offload_tc_get_port_debug_ds,
>> + ds);
>> + }
>> +}
>> +
>> static bool
>> dpif_offload_tc_can_offload(struct dpif_offload *dpif_offload OVS_UNUSED,
>> struct netdev *netdev) @@ -190,6 +244,7 @@ struct
>> dpif_offload_class dpif_offload_tc_class = {
>> .open = dpif_offload_tc_open,
>> .close = dpif_offload_tc_close,
>> .set_config = dpif_offload_tc_set_config,
>> + .get_debug = dpif_offload_tc_get_debug,
>> .can_offload = dpif_offload_tc_can_offload,
>> .port_add = dpif_offload_tc_port_add,
>> .port_del = dpif_offload_tc_port_del, diff --git a/lib/dpif-offload.c
>> b/lib/dpif-
>> offload.c index 42055008e..bfaa953b5 100644
>> --- a/lib/dpif-offload.c
>> +++ b/lib/dpif-offload.c
>> @@ -406,6 +406,18 @@ dpif_offload_class_type(const struct dpif_offload
>> *offload)
>> return offload->class->type;
>> }
>>
>> +bool
>> +dpif_offload_get_debug(const struct dpif_offload *offload, struct ds *ds,
>> + struct json *json) {
>> + if (!offload->class->get_debug) {
>> + return false;
>> + }
>> +
>> + offload->class->get_debug(offload, ds, json);
>> + return true;
>> +}
>> +
>> bool
>> dpif_offload_is_offload_enabled(void)
>> {
>> diff --git a/lib/dpif-offload.h b/lib/dpif-offload.h index
>> 9cee3a8f4..5b6c3038e
>> 100644
>> --- a/lib/dpif-offload.h
>> +++ b/lib/dpif-offload.h
>> @@ -44,6 +44,8 @@ int dpif_offload_attach_providers(struct dpif *); void
>> dpif_offload_detach_providers(struct dpif *); const char
>> *dpif_offload_name(const struct dpif_offload *); const char
>> *dpif_offload_class_type(const struct dpif_offload *);
>> +bool dpif_offload_get_debug(const struct dpif_offload *, struct ds *,
>> + struct json *);
>> void dpif_offload_dump_start(struct dpif_offload_dump *, const struct dpif
>> *);
>> bool dpif_offload_dump_next(struct dpif_offload_dump *,
>> struct dpif_offload **); diff --git a/lib/json.c
>> b/lib/json.c index
>> 23622ab36..23000f195 100644
>> --- a/lib/json.c
>> +++ b/lib/json.c
>> @@ -397,6 +397,13 @@ json_object_create(void)
>> return json;
>> }
>>
>> +bool
>> +json_object_is_empty(struct json *json) {
>> + return json && json->type == JSON_OBJECT
>> + && shash_is_empty(json->object); }
>> +
>> struct json *
>> json_integer_create(long long int integer) { diff --git
>> a/ofproto/ofproto-dpif.c
>> b/ofproto/ofproto-dpif.c index 7f76c7864..de7657db3 100644
>> --- a/ofproto/ofproto-dpif.c
>> +++ b/ofproto/ofproto-dpif.c
>> @@ -6719,6 +6719,7 @@ dpif_offload_show_backer_text(const struct
>> dpif_backer *backer, struct ds *ds)
>>
>> DPIF_OFFLOAD_FOR_EACH (offload, &dump, backer->dpif) {
>> ds_put_format(ds, " %s\n", dpif_offload_class_type(offload));
>> + dpif_offload_get_debug(offload, ds, NULL);
>> }
>> }
>>
>> @@ -6733,15 +6734,26 @@ dpif_offload_show_backer_json(struct json
>> *backers,
>> /* Add datapath as new JSON object using its name as key. */
>> json_object_put(backers, dpif_name(backer->dpif), json_backer);
>>
>> - /* Add provider to "providers" array using its name as key. */
>> - struct json *json_providers = json_array_create_empty();
>> + /* Add provider to "providers" object using its name as key. */
>> + struct json *json_providers = json_object_create();
>> +
>> + /* Add provider to "priority" array using its name as key. */
>> + struct json *json_priority = json_array_create_empty();
>>
>> /* Add offload provides as new JSON objects using its type as key. */
>> DPIF_OFFLOAD_FOR_EACH (offload, &dump, backer->dpif) {
>> - json_array_add(json_providers,
>> + struct json *debug_data = json_object_create();
>> +
>> + json_array_add(json_priority,
>> json_string_create(dpif_offload_class_type(offload)));
>> +
>> + dpif_offload_get_debug(offload, NULL, debug_data);
>> +
>> + json_object_put(json_providers, dpif_offload_class_type(offload),
>> + debug_data);
>> }
>>
>> + json_object_put(json_backer, "priority", json_priority);
>> json_object_put(json_backer, "providers", json_providers);
>> return json_backer;
>> }
>> diff --git a/tests/ofproto-dpif.at b/tests/ofproto-dpif.at index
>> 0ed8334d5..10596a968 100644
>> --- a/tests/ofproto-dpif.at
>> +++ b/tests/ofproto-dpif.at
>> @@ -20,6 +20,28 @@ check_dpflow_stats () {
>> echo "n_flows=$flows n_buckets=$buckets"
>> }
>>
>> +sort_dpif_offload_show () {
>> + awk '
>> + /^ -/ { dashlines[[++n]] = $0; next }
>> + { print }
>> + END {
>> + # asort(dashlines) is a GNU extension, so we need to do it
>> + # manually here as ofproto-dpif is also executed on FreeBSD.
>> + for (i = 1; i <= n; i++) {
>> + for (j = i + 1; j <= n; j++) {
>> + if (dashlines[[i]] > dashlines[[j]]) {
>> + tmp = dashlines[[i]]
>> + dashlines[[i]] = dashlines[[j]]
>> + dashlines[[j]] = tmp
>> + }
>> + }
>> + }
>> +
>> + for (i=1; i<=n; i++) print dashlines[[i]]
>> + }
>> + '
>> +}
>> +
>> m4_divert_pop([PREPARE_TESTS])
>>
>>
>> @@ -10079,20 +10101,34 @@ AT_SETUP([ofproto-dpif - offload - ovs-appctl
>> dpif/offload/])
>> AT_KEYWORDS([dpif-offload])
>> OVS_VSWITCHD_START([add-br br1 -- set bridge br1 datapath-type=dummy])
>>
>> -AT_CHECK([ovs-appctl dpif/offload/show], [0], [dnl
>> +AT_CHECK([ovs-appctl dpif/offload/show | sort_dpif_offload_show], [0],
>> +[dnl
>> Globally enabled: false
>> Datapaths:
>> dummy@ovs-dummy:
>> dummy
>> dummy_x
>> + - br0: port_no: 100
>> + - br1: port_no: 101
>> + - ovs-dummy: port_no: 0
>> ])
>>
>> AT_CHECK([ovs-appctl --format json --pretty dpif/offload/show], [0], [dnl {
>> "dummy@ovs-dummy": {
>> - "providers": [[
>> + "priority": [[
>> "dummy",
>> - "dummy_x"]]},
>> + "dummy_x"]],
>> + "providers": {
>> + "dummy": {
>> + "ports": {
>> + "br0": {
>> + "port_no": 100},
>> + "br1": {
>> + "port_no": 101},
>> + "ovs-dummy": {
>> + "port_no": 0}}},
>> + "dummy_x": {
>> + }}},
>> "enabled": false}
>> ])
>>
>> @@ -10117,26 +10153,82 @@ AT_KEYWORDS([dpif-offload])
>> OVS_VSWITCHD_START([add-br br1 -- set bridge br1 datapath-type=dummy],
>> [], [],
>> [], [-- set Open_vSwitch . other_config:hw-offload-
>> priority=dummy_x,dummy])
>>
>> -AT_CHECK([ovs-appctl dpif/offload/show], [0], [dnl
>> +AT_CHECK([ovs-appctl dpif/offload/show | sort_dpif_offload_show], [0],
>> +[dnl
>> Globally enabled: false
>> Datapaths:
>> dummy@ovs-dummy:
>> dummy_x
>> dummy
>> + - br0: port_no: 100
>> + - br1: port_no: 101
>> + - ovs-dummy: port_no: 0
>> ])
>>
>> AT_CHECK([ovs-appctl --format json --pretty dpif/offload/show], [0], [dnl {
>> "dummy@ovs-dummy": {
>> - "providers": [[
>> + "priority": [[
>> "dummy_x",
>> - "dummy"]]},
>> + "dummy"]],
>> + "providers": {
>> + "dummy": {
>> + },
>> + "dummy_x": {
>> + "ports": {
>> + "br0": {
>> + "port_no": 100},
>> + "br1": {
>> + "port_no": 101},
>> + "ovs-dummy": {
>> + "port_no": 0}}}}},
>> "enabled": false}
>> ])
>>
>> OVS_TRAFFIC_VSWITCHD_STOP
>> AT_CLEANUP
>>
>> +AT_SETUP([ofproto-dpif - offload - port priority order])
>> +AT_KEYWORDS([dpif-offload])
>> +OVS_VSWITCHD_START([add-port br0 p1 -- \
>> + set Interface p1 type=dummy ofport_request=1 -- \
>> + set port p1 other_config:hw-offload-priority=dummy_x,dummy -- \
>> + add-port br0 p2 -- \
>> + set Interface p2 type=dummy ofport_request=2 -- \
>> + set port p2 other_config:hw-offload-priority=none -- \
>> + add-port br0 p3 -- \
>> + set Interface p3 type=dummy ofport_request=3 -- \
>> + set port p3 other_config:hw-offload-priority=dummy_x -- \
>> + add-port br0 p4 -- \
>> + set Interface p4 type=dummy ofport_request=4 -- \
>> + set port p4 other_config:hw-offload-priority=dummy])
>> +
>> +AT_CHECK([ovs-appctl --format json --pretty dpif/offload/show], [0],
>> +[dnl {
>> + "dummy@ovs-dummy": {
>> + "priority": [[
>> + "dummy",
>> + "dummy_x"]],
>> + "providers": {
>> + "dummy": {
>> + "ports": {
>> + "br0": {
>> + "port_no": 100},
>> + "ovs-dummy": {
>> + "port_no": 0},
>> + "p4": {
>> + "port_no": 4}}},
>> + "dummy_x": {
>> + "ports": {
>> + "p1": {
>> + "port_no": 1},
>> + "p3": {
>> + "port_no": 3}}}}},
>> + "enabled": false}
>> +])
>> +
>> +OVS_VSWITCHD_STOP
>> +AT_CLEANUP
>> +
>> dnl ----------------------------------------------------------------------
>> AT_BANNER([ofproto-dpif -- megaflows])
>>
>> diff --git a/tests/system-dpdk.at b/tests/system-dpdk.at index
>> c1910b756..17d3d2595 100644
>> --- a/tests/system-dpdk.at
>> +++ b/tests/system-dpdk.at
>> @@ -948,20 +948,29 @@ AT_KEYWORDS([dpdk dpif-offload])
>> OVS_DPDK_PRE_CHECK()
>> OVS_DPDK_START([--no-pci])
>> AT_CHECK([ovs-vsctl add-br br0 -- set bridge br0 datapath_type=netdev])
>> +AT_CHECK([ovs-vsctl add-port br0 p1 \
>> + -- set Interface p1 type=dpdk
>> +options:dpdk-devargs=net_null0,no-rx=1],
>> + [], [stdout], [stderr])
>>
>> AT_CHECK([ovs-appctl dpif/offload/show], [0], [dnl Globally enabled: false
>> Datapaths:
>> netdev@ovs-netdev:
>> dpdk
>> + - p1: port_no: 2
>> ])
>>
>> AT_CHECK([ovs-appctl --format json --pretty dpif/offload/show], [0], [dnl {
>> "enabled": false,
>> "netdev@ovs-netdev": {
>> - "providers": [[
>> - "dpdk"]]}}
>> + "priority": [[
>> + "dpdk"]],
>> + "providers": {
>> + "dpdk": {
>> + "ports": {
>> + "p1": {
>> + "port_no": 2}}}}}}
>> ])
>>
>> OVS_DPDK_STOP_VSWITCHD
>> diff --git a/tests/system-offloads-traffic.at
>> b/tests/system-offloads-traffic.at
>> index 471c8fdb8..c58e89608 100644
>> --- a/tests/system-offloads-traffic.at
>> +++ b/tests/system-offloads-traffic.at
>> @@ -1172,19 +1172,44 @@ AT_KEYWORDS([dpif-offload])
>> OVS_TRAFFIC_VSWITCHD_START([], [],
>> [-- set Open_vSwitch . other_config:hw-offload=true])
>>
>> -AT_CHECK([ovs-appctl dpif/offload/show], [0], [dnl
>> +sort_dpif_offload_show () {
>> + dnl Note: We do not use an m4 macro as it does not like the $0, or
>> escaped
>> + dnl variants and loops until it runs out of memory.
>> + awk '
>> + /^ -/ { dashlines[[++n]] = $0; next }
>> + { print }
>> + END {
>> + asort(dashlines)
>> + for (i=1; i<=n; i++) print dashlines[[i]]
>> + }
>> + ' | sed -E 's/ifindex: [[0-9]]+/ifindex: 0/g'
>> +}
>> +
>> +AT_CHECK([ovs-appctl dpif/offload/show | sort_dpif_offload_show], [0],
>> +[dnl
>> Globally enabled: true
>> Datapaths:
>> system@ovs-system:
>> tc
>> + - br0: port_no: 1, ifindex: 0
>> + - ovs-system: port_no: 0, ifindex: 0
>> ])
>>
>> -AT_CHECK([ovs-appctl --format json --pretty dpif/offload/show], [0], [dnl
>> +AT_CHECK([ovs-appctl --format json --pretty dpif/offload/show \
>> + | sed -E 's/"ifindex": [[0-9]]+/"ifindex": 0/g'], [0], [dnl
>> {
>> "enabled": true,
>> "system@ovs-system": {
>> - "providers": [[
>> - "tc"]]}}
>> + "priority": [[
>> + "tc"]],
>> + "providers": {
>> + "tc": {
>> + "ports": {
>> + "br0": {
>> + "ifindex": 0,
>> + "port_no": 1},
>> + "ovs-system": {
>> + "ifindex": 0,
>> + "port_no": 0}}}}}}
>> ])
>>
>> OVS_TRAFFIC_VSWITCHD_STOP
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev