Skip to content

Commit

Permalink
dpif: Move common meter checks into the dpif layer.
Browse files Browse the repository at this point in the history
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 <[email protected]>
Acked-by: Ben Pfaff <[email protected]>
  • Loading branch information
justinpettit committed Jul 30, 2018
1 parent c933601 commit 6508c84
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 15 deletions.
15 changes: 3 additions & 12 deletions lib/dpif-netdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
22 changes: 19 additions & 3 deletions lib/dpif.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down

0 comments on commit 6508c84

Please sign in to comment.