int retval;
memset(&r, 0, sizeof r);
+ memset(&sin, 0, sizeof sin);
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = ip;
sin.sin_port = 0;
return EINVAL;
}
- /* min-rate. Don't allow a min-rate below 1500 bytes/s. */
- if (!min_rate_s) {
- /* min-rate is required. */
- return EINVAL;
- }
- hc->min_rate = strtoull(min_rate_s, NULL, 10) / 8;
- hc->min_rate = MAX(hc->min_rate, 1500);
+ /* HTB requires at least an mtu sized min-rate to send any traffic even
+ * on uncongested links. */
+ hc->min_rate = min_rate_s ? strtoull(min_rate_s, NULL, 10) / 8 : 0;
+ hc->min_rate = MAX(hc->min_rate, mtu);
hc->min_rate = MIN(hc->min_rate, htb->max_rate);
/* max-rate */
min_rate_s = shash_find_data(details, "min-rate");
max_rate_s = shash_find_data(details, "max-rate");
- if (!min_rate_s) {
- return EINVAL;
- }
-
- min_rate = strtoull(min_rate_s, NULL, 10) / 8;
- min_rate = MAX(min_rate, 1500);
+ min_rate = min_rate_s ? strtoull(min_rate_s, NULL, 10) / 8 : 0;
+ min_rate = MAX(min_rate, 1);
min_rate = MIN(min_rate, hfsc->max_rate);
max_rate = (max_rate_s