On Wed, Jul 01, 2020 at 03:07:39AM +0200, Andrew Lunn wrote:
> Add support for accessing the cable test time domain reflectromatry
> data. Add a new command --cable-test-tdr, and support for dumping the
> data which is returned.
> 
> Signed-off-by: Andrew Lunn <and...@lunn.ch>
> ---

Looks good to me, only three minor issues:

> --- a/ethtool.c
> +++ b/ethtool.c
> @@ -5487,6 +5487,14 @@ static const struct option args[] = {
>               .nlfunc = nl_cable_test,
>               .help   = "Perform a cable test",
>       },
> +     {
> +             .opts   = "--cable-test-tdr",
> +             .nlfunc = nl_cable_test_tdr,
> +             .help   = "Print cable test time domain reflectrometery data",
> +             .xhelp  = "             [ first N ]\n"
> +                       "             [ last N ]\n"
> +                       "             [ step N ]\n"

The "pair" parameter is missing here.

> +     },
>       {
>               .opts   = "-h|--help",
>               .no_dev = true,
[...]
> diff --git a/netlink/monitor.c b/netlink/monitor.c
> index 1af11ee..280fd0b 100644
> --- a/netlink/monitor.c
> +++ b/netlink/monitor.c
> @@ -63,6 +63,10 @@ static struct {
>               .cmd    = ETHTOOL_MSG_CABLE_TEST_NTF,
>               .cb     = cable_test_ntf_cb,
>       },
> +     {
> +             .cmd    = ETHTOOL_MSG_CABLE_TEST_TDR_NTF,
> +             .cb     = cable_test_tdr_ntf_cb,
> +     },
>  };
>  

Please add also an entry to monitor_opts[] to allow filtering monitor
events.

[...]
> diff --git a/netlink/parser.c b/netlink/parser.c
> index bd3526f..67134f1 100644
> --- a/netlink/parser.c
> +++ b/netlink/parser.c
[...]
> @@ -211,6 +227,32 @@ int nl_parse_direct_u8(struct nl_context *nlctx, 
> uint16_t type,
>       return (type && ethnla_put_u8(msgbuff, type, val)) ? -EMSGSIZE : 0;
>  }
>  
> +/* Parser handler for float meters and convert it to cm. Generates
> + * NLA_U32 or fills an uint32_t.
> + */
> +int nl_parse_direct_m2cm(struct nl_context *nlctx, uint16_t type,
> +                      const void *data, struct nl_msg_buff *msgbuff,
> +                      void *dest)
> +{
> +     const char *arg = *nlctx->argp;
> +     float meters;
> +     uint32_t cm;
> +     int ret;
> +
> +     nlctx->argp++;
> +     nlctx->argc--;
> +     ret = parse_float(arg, &meters, 0, 150);
> +     if (ret < 0) {
> +             parser_err_invalid_value(nlctx, arg);
> +             return ret;
> +     }
> +
> +     cm = (uint32_t)(meters * 100);

When I tried to test the generated requests, I noticed that e.g. "20.3"
was sent as 2029 rather than 2030. It's unlikely to cause an actual
problem but we should probably use e.g.

        cm = (uint32_t)(meters * 100 + 0.5);

to prevent such rounding errors.

Michal

> +     if (dest)
> +             *(uint32_t *)dest = cm;
> +     return (type && ethnla_put_u32(msgbuff, type, cm)) ? -EMSGSIZE : 0;
> +}
> +
>  /* Parser handler for (tri-state) bool. Expects "name on|off", generates
>   * NLA_U8 which is 1 for "on" and 0 for "off".
>   */

Reply via email to