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