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

Reply via email to