On 29 Mar 2023, at 13:42, Chris Mi wrote:

> Iterate each registered offload API. It's not a problem for today
> since we only have one implementation.

See comment inline.

//Eelco

> Signed-off-by: Chris Mi <[email protected]>
> Reviewed-by: Roi Dayan <[email protected]>
> ---
>  lib/netdev-offload.c | 35 +++++++++++++++++++++++++++++++++++
>  lib/netdev-offload.h |  5 +++++
>  2 files changed, 40 insertions(+)
>
> diff --git a/lib/netdev-offload.c b/lib/netdev-offload.c
> index 84503ec8b..ec61e1cc0 100644
> --- a/lib/netdev-offload.c
> +++ b/lib/netdev-offload.c
> @@ -257,6 +257,41 @@ meter_offload_del(ofproto_meter_id meter_id, struct 
> ofputil_meter_stats *stats)
>      return 0;
>  }
>
> +int
> +netdev_offload_recv(struct dpif_upcall *upcall, struct ofpbuf *buf,
> +                    uint32_t handler_id)
> +{
> +    struct netdev_registered_flow_api *rfa;
> +    int ret = EAGAIN;
> +
> +    CMAP_FOR_EACH (rfa, cmap_node, &netdev_flow_apis) {
> +        if (rfa->flow_api->recv) {
> +            ret = rfa->flow_api->recv(upcall, buf, handler_id);
> +            if (ret) {

See the previous conversation on not logging on EAGAIN.
                   if (ret != EAGAIN) {

> +                VLOG_DBG_RL(&rl, "Failed to receive offload packet, %s, "
> +                            "type: %s", ovs_strerror(ret),
> +                            rfa->flow_api->type);
> +            } else {
> +                return ret;

Maybe just return 0; so it's explicit we return ok here? What about (notice 
also the ret change, or else we might return an old error):

int
netdev_offload_recv(struct dpif_upcall *upcall, struct ofpbuf *buf,
                    uint32_t handler_id)
{
    struct netdev_registered_flow_api *rfa;
    int ret;

    CMAP_FOR_EACH (rfa, cmap_node, &netdev_flow_apis) {
        if (rfa->flow_api->recv) {
            ret = rfa->flow_api->recv(upcall, buf, handler_id);
            if (!ret) {
                return 0;
            }

            if (ret == EAGAIN) {
                VLOG_DBG_RL(&rl, "Failed to receive offload packet, %s, "
                            "type: %s", ovs_strerror(ret),
                            rfa->flow_api->type);
            }
        } else {
            ret = EAGAIN;
       }
    }
    return ret;
}


> +            }
> +        }
> +    }
> +
> +    return ret;
> +}
> +
> +void
> +netdev_offload_recv_wait(uint32_t handler_id)
> +{
> +    struct netdev_registered_flow_api *rfa;
> +
> +    CMAP_FOR_EACH (rfa, cmap_node, &netdev_flow_apis) {
> +        if (rfa->flow_api->recv_wait) {
> +            rfa->flow_api->recv_wait(handler_id);
> +        }
> +    }
> +}
> +
>  int
>  netdev_flow_flush(struct netdev *netdev)
>  {
> diff --git a/lib/netdev-offload.h b/lib/netdev-offload.h
> index edc843cd9..09cdb6db2 100644
> --- a/lib/netdev-offload.h
> +++ b/lib/netdev-offload.h
> @@ -33,6 +33,7 @@ extern "C" {
>
>  struct dp_packet_batch;
>  struct dp_packet;
> +struct dpif_upcall;
>  struct netdev_class;
>  struct netdev_rxq;
>  struct netdev_saved_flags;
> @@ -162,6 +163,10 @@ void meter_offload_set(ofproto_meter_id, struct 
> ofputil_meter_config *);
>  int meter_offload_get(ofproto_meter_id, struct ofputil_meter_stats *);
>  int meter_offload_del(ofproto_meter_id, struct ofputil_meter_stats *);
>
> +int netdev_offload_recv(struct dpif_upcall *upcall, struct ofpbuf *buf,
> +                        uint32_t handler_id);
> +void netdev_offload_recv_wait(uint32_t handler_id);
> +
>  #ifdef  __cplusplus
>  }
>  #endif
> -- 
> 2.26.3

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

Reply via email to