diff mbox series

[ovs-dev,v29,5/8] netdev-offload: Add netdev offload recv and recv_wait APIs.

Message ID 20240326023051.735106-6-cmi@nvidia.com
State Under Review
Headers show
Series Add offload support for sFlow | expand

Checks

Context Check Description
ovsrobot/apply-robot success apply and check: success
ovsrobot/github-robot-_Build_and_Test success github build: passed
ovsrobot/intel-ovs-compilation success test: success

Commit Message

Chris Mi March 26, 2024, 2:30 a.m. UTC
Iterate each registered offload API. It's not a problem for today
since we only have one implementation.

Signed-off-by: Chris Mi <cmi@nvidia.com>
Reviewed-by: Roi Dayan <roid@nvidia.com>
---
 lib/netdev-offload.c | 38 ++++++++++++++++++++++++++++++++++++++
 lib/netdev-offload.h |  5 +++++
 2 files changed, 43 insertions(+)
diff mbox series

Patch

diff --git a/lib/netdev-offload.c b/lib/netdev-offload.c
index 5aad804c1..185142484 100644
--- a/lib/netdev-offload.c
+++ b/lib/netdev-offload.c
@@ -257,6 +257,44 @@  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) {
+                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;
+}
+
+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 47f8e6f48..c20e2c26e 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 *, struct ofpbuf *,
+                        uint32_t handler_id);
+void netdev_offload_recv_wait(uint32_t handler_id);
+
 #ifdef  __cplusplus
 }
 #endif