@@ -5172,21 +5172,12 @@ dpif_netdev_meter_set(struct dpif *dpif, ofproto_meter_id *meter_id,
return EFBIG; /* Meter_id out of range. */
}
- if (config->flags & ~DP_SUPPORTED_METER_FLAGS_MASK ||
- !(config->flags & (OFPMF13_KBPS | OFPMF13_PKTPS))) {
+ if (config->flags & ~DP_SUPPORTED_METER_FLAGS_MASK) {
return EBADF; /* Unsupported flags set */
}
- /* Validate bands */
- if (config->n_bands == 0 || config->n_bands > MAX_BANDS) {
- return EINVAL; /* Too many bands */
- }
-
- /* Validate rates */
- for (i = 0; i < config->n_bands; i++) {
- if (config->bands[i].rate == 0) {
- return EDOM; /* rate must be non-zero */
- }
+ if (config->n_bands > MAX_BANDS) {
+ return EINVAL;
}
for (i = 0; i < config->n_bands; ++i) {
@@ -1895,11 +1895,27 @@ int
dpif_meter_set(struct dpif *dpif, ofproto_meter_id *meter_id,
struct ofputil_meter_config *config)
{
- int error;
-
COVERAGE_INC(dpif_meter_set);
- error = dpif->dpif_class->meter_set(dpif, meter_id, config);
+ if (!(config->flags & (OFPMF13_KBPS | OFPMF13_PKTPS))) {
+ return EBADF; /* Rate unit type not set. */
+ }
+
+ if ((config->flags & OFPMF13_KBPS) && (config->flags & OFPMF13_PKTPS)) {
+ return EBADF; /* Both rate units may not be set. */
+ }
+
+ if (config->n_bands == 0) {
+ return EINVAL;
+ }
+
+ for (size_t i = 0; i < config->n_bands; i++) {
+ if (config->bands[i].rate == 0) {
+ return EDOM; /* Rate must be non-zero */
+ }
+ }
+
+ int error = dpif->dpif_class->meter_set(dpif, meter_id, config);
if (!error) {
VLOG_DBG_RL(&dpmsg_rl, "%s: DPIF meter %"PRIu32" set",
dpif_name(dpif), meter_id->uint32);
Another dpif provider will soon add support for meters, so move some of the common sanity checks up into the dpif layer so that each provider doesn't need to re-implement them. Signed-off-by: Justin Pettit <jpettit@ovn.org> --- v2: This patch is new to the series. --- lib/dpif-netdev.c | 15 +++------------ lib/dpif.c | 22 +++++++++++++++++++--- 2 files changed, 22 insertions(+), 15 deletions(-)