From: Tonghao Zhang <[email protected]> Implement the meter offload api in the netdev.
Signed-off-by: Tonghao Zhang <[email protected]> --- 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 _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
