@@ -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
@@ -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
@@ -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;
@@ -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;
+}
@@ -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. */