From: Tonghao Zhang <[email protected]> Add the callback which will be called when we operate the meter offload.
Signed-off-by: Tonghao Zhang <[email protected]> --- lib/dpif-netdev.c | 3 +++ lib/dpif-netlink.c | 3 +++ lib/dpif-provider.h | 5 ++++ lib/dpif.c | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++++ lib/dpif.h | 6 +++++ 5 files changed, 83 insertions(+) diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index c92d9aa..051d090 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -7681,6 +7681,9 @@ const struct dpif_class dpif_netdev_class = { dpif_netdev_meter_set, dpif_netdev_meter_get, dpif_netdev_meter_del, + NULL, + NULL, + NULL, }; static void diff --git a/lib/dpif-netlink.c b/lib/dpif-netlink.c index a31da55..09489ec 100644 --- a/lib/dpif-netlink.c +++ b/lib/dpif-netlink.c @@ -3945,6 +3945,9 @@ const struct dpif_class dpif_netlink_class = { dpif_netlink_meter_set, dpif_netlink_meter_get, dpif_netlink_meter_del, + NULL, + NULL, + NULL, }; static int diff --git a/lib/dpif-provider.h b/lib/dpif-provider.h index f8ca310..e7b09f5 100644 --- a/lib/dpif-provider.h +++ b/lib/dpif-provider.h @@ -614,6 +614,11 @@ struct dpif_class { * zero. */ int (*meter_del)(struct dpif *, ofproto_meter_id meter_id, struct ofputil_meter_stats *, uint16_t n_bands); + int (*meter_get_config)(struct dpif *, ofproto_meter_id meter_id, + struct ofputil_meter_config *); + int (*meter_set_offload)(struct dpif *, ofproto_meter_id meter_id, void *); + int (*meter_get_offload)(struct dpif *, ofproto_meter_id meter_id, void **, + uint16_t size); }; extern const struct dpif_class dpif_netlink_class; diff --git a/lib/dpif.c b/lib/dpif.c index c88b210..8ef4534 100644 --- a/lib/dpif.c +++ b/lib/dpif.c @@ -66,6 +66,9 @@ COVERAGE_DEFINE(dpif_execute_with_help); COVERAGE_DEFINE(dpif_meter_set); COVERAGE_DEFINE(dpif_meter_get); COVERAGE_DEFINE(dpif_meter_del); +COVERAGE_DEFINE(dpif_meter_get_config); +COVERAGE_DEFINE(dpif_meter_set_offload); +COVERAGE_DEFINE(dpif_meter_get_offload); static const struct dpif_class *base_dpif_classes[] = { #if defined(__linux__) || defined(_WIN32) @@ -1976,3 +1979,66 @@ dpif_meter_del(struct dpif *dpif, ofproto_meter_id meter_id, } return error; } + +int +dpif_meter_get_config(struct dpif *dpif, ofproto_meter_id meter_id, + struct ofputil_meter_config *config) +{ + COVERAGE_INC(dpif_meter_get_config); + + int error = (dpif->dpif_class->meter_get_config + ? dpif->dpif_class->meter_get_config(dpif, meter_id, + config) + : EOPNOTSUPP); + if (!error) { + VLOG_DBG_RL(&dpmsg_rl, "%s: DPIF meter %"PRIu32" get config", + dpif_name(dpif), meter_id.uint32); + } else { + VLOG_WARN_RL(&error_rl, "%s: failed to get DPIF meter config %"PRIu32": %s", + dpif_name(dpif), meter_id.uint32, ovs_strerror(error)); + } + + return error; +} + +int +dpif_meter_set_offload(struct dpif *dpif, ofproto_meter_id meter_id, + void *data) +{ + COVERAGE_INC(dpif_meter_set_offload); + + int error = (dpif->dpif_class->meter_set_offload + ? dpif->dpif_class->meter_set_offload(dpif, meter_id, + data) + : EOPNOTSUPP); + if (!error) { + VLOG_DBG_RL(&dpmsg_rl, "%s: DPIF meter %"PRIu32" offload set", + dpif_name(dpif), meter_id.uint32); + } else { + VLOG_WARN_RL(&error_rl, "%s: failed to offload set DPIF meter %"PRIu32": %s", + dpif_name(dpif), meter_id.uint32, ovs_strerror(error)); + } + + return error; +} + +int +dpif_meter_get_offload(struct dpif *dpif, ofproto_meter_id meter_id, + void **data, uint16_t size) +{ + COVERAGE_INC(dpif_meter_get_offload); + + int error = (dpif->dpif_class->meter_get_offload + ? dpif->dpif_class->meter_get_offload(dpif, meter_id, + data, size) + : EOPNOTSUPP); + if (!error) { + VLOG_DBG_RL(&dpmsg_rl, "%s: DPIF meter %"PRIu32" offload get", + dpif_name(dpif), meter_id.uint32); + } else { + VLOG_WARN_RL(&error_rl, "%s: failed to offload get DPIF meter %"PRIu32": %s", + dpif_name(dpif), meter_id.uint32, ovs_strerror(error)); + } + + return error; +} diff --git a/lib/dpif.h b/lib/dpif.h index d96f854..cab7f39 100644 --- a/lib/dpif.h +++ b/lib/dpif.h @@ -890,6 +890,12 @@ int dpif_meter_get(const struct dpif *, ofproto_meter_id meter_id, struct ofputil_meter_stats *, uint16_t n_bands); int dpif_meter_del(struct dpif *, ofproto_meter_id meter_id, struct ofputil_meter_stats *, uint16_t n_bands); +int dpif_meter_get_config(struct dpif *dpif, ofproto_meter_id meter_id, + struct ofputil_meter_config *config); +int dpif_meter_set_offload(struct dpif *dpif, ofproto_meter_id meter_id, + void *data); +int dpif_meter_get_offload(struct dpif *dpif, ofproto_meter_id meter_id, + void **data, uint16_t size); /* Miscellaneous. */ -- 1.8.3.1 _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
