On 8/20/20 9:52 PM, Roopa Prabhu wrote:
> +void protodown_reason_n2a(int id, char *buf, int len)
> +{
> +     if (id < 0 || id >= PROTODOWN_REASON_NUM_BITS || numeric) {

since the reason is limited to 0-31, id > PROTODOWN_REASON_NUM_BITS
should be an error.

> +             snprintf(buf, len, "%d", id);
> +             return;
> +     }
> +
> +     if (!protodown_reason_init)
> +             protodown_reason_initialize();
> +
> +     if (protodown_reason_tab[id])
> +             snprintf(buf, len, "%s", protodown_reason_tab[id]);
> +     else
> +             snprintf(buf, len, "%d", id);
> +}
> +
> +int protodown_reason_a2n(__u32 *id, const char *arg)
> +{
> +     static char *cache;
> +     static unsigned long res;
> +     char *end;
> +     int i;
> +
> +     if (cache && strcmp(cache, arg) == 0) {
> +             *id = res;
> +             return 0;
> +     }
> +
> +     if (!protodown_reason_init)
> +             protodown_reason_initialize();
> +
> +     for (i = 0; i < PROTODOWN_REASON_NUM_BITS; i++) {
> +             if (protodown_reason_tab[i] &&
> +                 strcmp(protodown_reason_tab[i], arg) == 0) {
> +                     cache = protodown_reason_tab[i];
> +                     res = i;
> +                     *id = res;
> +                     return 0;
> +             }
> +     }
> +
> +     res = strtoul(arg, &end, 0);
> +     if (!end || end == arg || *end || res > 255)

same here: res >= PROTODOWN_REASON_NUM_BITS is a failure.

> +             return -1;
> +     *id = res;
> +     return 0;
> +}
> diff --git a/man/man8/ip-link.8.in b/man/man8/ip-link.8.in
> index c6bd2c53..df3dd531 100644
> --- a/man/man8/ip-link.8.in
> +++ b/man/man8/ip-link.8.in
> @@ -75,6 +75,9 @@ ip-link \- network device configuration
>  .br
>  .RB "[ " protodown " { " on " | " off " } ]"
>  .br
> +.RB "[ " protodown_reason
> +.IR PREASON " { " on " | " off " } ]"
> +.br
>  .RB "[ " trailers " { " on " | " off " } ]"
>  .br
>  .RB "[ " txqueuelen
> @@ -1917,6 +1920,13 @@ state on the device. Indicates that a protocol error 
> has been detected
>  on the port. Switch drivers can react to this error by doing a phys
>  down on the switch port.
>  
> +.TP
> +.BR "protodown_reason PREASON on " or " off"
> +set
> +.B PROTODOWN
> +reasons on the device. protodown reason bit names can be enumerated under
> +/etc/iproute2/protodown_reasons.d/.

we should document that 0..31 limit.

> +
>  .TP
>  .BR "dynamic on " or " dynamic off"
>  change the
> 

I wonder how well supported __builtin_ffsl is across architectures ...
would be faster than the 'for (i = 0; reason; i++, reason >>= 1) {' checks.

Reply via email to