git sha: 815f510acf2a18aba4c59f7768b3927d02d063d0
Author: Eelco Chaudron <[email protected]>
Subject: dpif-offload-dummy: Add flow add/del/get APIs.

This commit adds flow control API calls to the dummy offload provider,
enabling the re-addition of previously disabled partial offload tests.

> diff --git a/lib/dpif-offload-dummy.c b/lib/dpif-offload-dummy.c
> index 331805296..03ab29e04 100644
> --- a/lib/dpif-offload-dummy.c
> +++ b/lib/dpif-offload-dummy.c
> @@ -21,25 +21,262 @@
>  #include "dpif-offload-provider.h"
>  #include "dpif-offload.h"
>  #include "dummy.h"
> +#include "id-fpool.h"
>  #include "netdev-provider.h"
> +#include "odp-util.h"
>  #include "util.h"
> +#include "uuid.h"
>  
>  #include "openvswitch/json.h"
> +#include "openvswitch/match.h"
> +#include "openvswitch/vlog.h"
> +
> +VLOG_DEFINE_THIS_MODULE(dpif_offload_dummy);

[ ... ]

> +static void
> +dpif_offload_dummy_cleanup_flow_pmd_data(
> +    struct dpif_offload_dummy *offload,
> +    struct dpif_offload_dummy_port *port OVS_UNUSED,
> +    struct dummy_offloaded_flow *off_flow) OVS_REQUIRES(port->port_mutex)
> +{
> +    struct pmd_id_data *data;
> +
> +     HMAP_FOR_EACH_SAFE (data, node, &off_flow->pmd_id_map) {

There's an extra space at the start of this line which creates
misaligned whitespace. The line should start with 4 spaces, not 5.

> +         hmap_remove(&off_flow->pmd_id_map, &data->node);
> +
> +         dpif_offload_dummy_flow_unreference(offload, data->pmd_id,
> +                                             data->flow_reference);
> +         free(data);
> +     }
> +}

[ ... ]

> +static struct dummy_offloaded_flow *
> +dpif_offload_dummy_add_flow(struct dpif_offload_dummy_port *port,
> +                            const ovs_u128 *ufid, unsigned pmd_id,
> +                            void *flow_reference, uint32_t mark)
> +    OVS_REQUIRES(port->port_mutex)
> +{
> +    struct dummy_offloaded_flow *off_flow = xzalloc(sizeof *off_flow);
> +
> +    off_flow->mark = mark;
> +    memcpy(&off_flow->ufid, ufid, sizeof off_flow->ufid);
> +    hmap_init(&off_flow->pmd_id_map);
> +    dpif_offload_dummy_add_flow_pmd_data(port, off_flow, pmd_id,
> +                                         flow_reference);
> +
> +    hmap_insert(&port->offloaded_flows, &off_flow->node,
> +                dpif_offload_dummy_flow_hash(ufid));
> +
> +    return off_flow;
> +}

Does dpif_offload_dummy_add_flow handle cleanup properly if
dpif_offload_dummy_add_flow_pmd_data fails? The function allocates
memory for off_flow and initializes pmd_id_map before calling
dpif_offload_dummy_add_flow_pmd_data, but I don't see error handling if
that call fails.

> +static void
> +dpif_offload_dummy_free_flow(struct dpif_offload_dummy_port *port,
> +                             struct dummy_offloaded_flow *off_flow,
> +                             bool remote_from_port)

Should this parameter be "remove_from_port" instead of "remote_from_port"?
The usage suggests it controls whether to remove the flow from the port,
not anything related to remote operations.

> +    OVS_REQUIRES(port->port_mutex)
> +{
> +    if (remote_from_port) {
> +        hmap_remove(&port->offloaded_flows, &off_flow->node);
> +    }
> +    ovs_assert(!hmap_count(&off_flow->pmd_id_map));
> +
> +    hmap_destroy(&off_flow->pmd_id_map);
> +    free(off_flow);
> +}

[ ... ]

> @@ -156,6 +442,8 @@ dpif_offload_dummy_open(const struct dpif_offload_class 
> *offload_class,
>      offload_dummy->port_mgr = dpif_offload_port_mgr_init();
>      offload_dummy->once_enable = (struct ovsthread_once)
>          OVSTHREAD_ONCE_INITIALIZER;
> +    offload_dummy->flow_mark_pool = NULL;
> +    offload_dummy->unreference_cb = NULL;
>  
>      *dpif_offload = &offload_dummy->offload;
>      return 0;

[ ... ]

> +void
> +dpif_offload_dummy_netdev_simulate_offload(struct netdev *netdev,
> +                                           struct dp_packet *packet,
> +                                           struct flow *flow)
> +{
> +    const struct dpif_offload *offload_ = ovsrcu_get(
> +        const struct dpif_offload *, &netdev->dpif_offload);
> +    struct dpif_offload_dummy_port *port;
> +    struct dummy_offloaded_flow *data;
> +    struct flow packet_flow;
> +
> +    if (!offload_ || strcmp(dpif_offload_class_type(offload_), "dummy")) {
> +        return;
> +    }

Can strcmp be called safely here? What happens if
dpif_offload_class_type returns NULL? The function should verify that
dpif_offload_class_type doesn't return NULL before calling strcmp.

> +
> +    port = dpif_offload_dummy_get_port_by_netdev(offload_, netdev);
> +    if (!port) {
> +        return;
> +    }
> +
> +    if (!flow) {
> +        flow = &packet_flow;
> +        flow_extract(packet, flow);
> +    }

[ ... ]
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to