[ovs-dev] [ovs-dev 5/7] netdev-dpif: Implement netdev meter offload

xiangxia.m.yue at gmail.com xiangxia.m.yue at gmail.com
Sat Dec 28 07:11:14 UTC 2019


From: Tonghao Zhang <xiangxia.m.yue at gmail.com>

Implement the meter offload api in the netdev.

Signed-off-by: Tonghao Zhang <xiangxia.m.yue at gmail.com>
---
 lib/dpif-netdev.c | 96 +++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 93 insertions(+), 3 deletions(-)

diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
index 051d090..e33215d 100644
--- a/lib/dpif-netdev.c
+++ b/lib/dpif-netdev.c
@@ -5893,6 +5893,96 @@ dpif_netdev_meter_del(struct dpif *dpif,
     return error;
 }
 
+static int
+dpif_netdev_meter_get_config(struct dpif *dpif,
+                             ofproto_meter_id meter_id,
+                             struct ofputil_meter_config *conf)
+{
+    struct dp_netdev *dp = get_dp_netdev(dpif);
+    uint32_t mid = meter_id.uint32;
+    struct dp_meter *meter;
+    int ret = 0, i;
+
+    if (mid >= MAX_METERS) {
+        return -1;
+    }
+    
+    meter_lock(dp, mid);
+    meter = dp->meters[mid];
+    if (!meter) {
+        ret = -1;
+        goto done;
+    }
+
+    conf->n_bands = meter->n_bands;
+    conf->bands = xzalloc(conf->n_bands * sizeof(struct dp_meter_band));
+    for (i = 0; i < meter->n_bands; ++i) {
+        conf->bands[i] = meter->bands[i].up;
+    }
+
+done:
+    meter_unlock(dp, mid);
+    return ret;
+}
+
+static int
+dpif_netdev_meter_set_offload(struct dpif *dpif,
+                              ofproto_meter_id meter_id,
+                              void *data)
+{
+    struct dp_netdev *dp = get_dp_netdev(dpif);
+    uint32_t mid = meter_id.uint32;
+    struct dp_meter *meter;
+    int ret = 0;
+
+    if (mid >= MAX_METERS) {
+        return -1;
+    }
+    
+    meter_lock(dp, mid);
+    meter = dp->meters[mid];
+    if (!meter) {
+        ret = -1;
+        goto done;
+    }
+    
+    meter->offload = (struct netdev_offload_meter *)data;
+done:
+    meter_unlock(dp, mid);
+    return ret;
+}
+
+static int
+dpif_netdev_meter_get_offload(struct dpif *dpif,
+                              ofproto_meter_id meter_id,
+                              void **data, uint16_t size)
+{
+    struct dp_netdev *dp = get_dp_netdev(dpif);
+    uint32_t mid = meter_id.uint32;
+    struct dp_meter *meter;
+    int ret = 0;
+
+    if (mid >= MAX_METERS) {
+        return -1;
+    }
+    
+    meter_lock(dp, mid);
+    meter = dp->meters[mid];
+    if (!meter) {
+        ret = -1;
+        goto done;
+    }
+    
+    *data = NULL;
+    if (meter->offload) {
+        *data = xmemdup(meter->offload, size);
+    }
+
+done:
+    meter_unlock(dp, mid);
+    return ret;
+}
+
 
 static void
 dpif_netdev_disable_upcall(struct dpif *dpif)
@@ -7681,9 +7771,9 @@ const struct dpif_class dpif_netdev_class = {
     dpif_netdev_meter_set,
     dpif_netdev_meter_get,
     dpif_netdev_meter_del,
-    NULL,
-    NULL,
-    NULL,
+    dpif_netdev_meter_get_config,
+    dpif_netdev_meter_set_offload,
+    dpif_netdev_meter_get_offload,
 };
 
 static void
-- 
1.8.3.1



More information about the dev mailing list