@@ -37,7 +37,7 @@ struct ofputil_meter_band {
uint16_t type;
uint8_t prec_level; /* Non-zero if type == OFPMBT_DSCP_REMARK. */
uint32_t rate;
- uint32_t burst_size;
+ uint64_t burst_size;
};
void ofputil_format_meter_band(struct ds *, enum ofp13_meter_flags,
@@ -277,7 +277,7 @@ static bool dpcls_lookup(struct dpcls *cls,
struct dp_meter_band {
struct ofputil_meter_band up; /* type, prec_level, pad, rate, burst_size */
- uint32_t bucket; /* In 1/1000 packets (for PKTPS), or in bits (for KBPS) */
+ uint64_t bucket; /* In 1/1000 packets (for PKTPS), or in bits (for KBPS) */
uint64_t packet_count;
uint64_t byte_count;
};
@@ -5971,7 +5971,7 @@ dp_netdev_run_meter(struct dp_netdev *dp, struct dp_packet_batch *packets_,
band = &meter->bands[m];
/* Update band's bucket. */
- band->bucket += delta_t * band->up.rate;
+ band->bucket += (uint64_t)delta_t * band->up.rate;
band->bucket += delta_in_us * band->up.rate / 1000;
if (band->bucket > band->up.burst_size) {
band->bucket = band->up.burst_size;
@@ -72,7 +72,7 @@ ofputil_format_meter_band(struct ds *s, enum ofp13_meter_flags flags,
ds_put_format(s, " rate=%"PRIu32, mb->rate);
if (flags & OFPMF13_BURST) {
- ds_put_format(s, " burst_size=%"PRIu32, mb->burst_size);
+ ds_put_format(s, " burst_size=%"PRIu64, mb->burst_size);
}
if (mb->type == OFPMBT13_DSCP_REMARK) {
ds_put_format(s, " prec_level=%"PRIu8, mb->prec_level);
@@ -703,7 +703,7 @@ parse_ofp_meter_mod_str__(struct ofputil_meter_mod *mm, char *string,
return error;
}
} else if (!strcmp(name, "burst_size")) {
- char *error = str_to_u32(value, &band->burst_size);
+ char *error = str_to_u64(value, &band->burst_size);
if (error) {
return error;
}