On Thu, 29 Dec 2022 at 07:52, SyncMonk Technologies <servi...@syncmonk.net>
wrote:

> Get the interface speed related information using ethtool and
> convert interface speed to bit rate in attoseconds per bit.
>
> v4: adding interface bit period in iface_if_info. This bit period
>     is updated during init time and whenever there are port events
>     like link up and down and speed updates.
>
> Signed-off-by: Greg Armstrong <greg.armstrong...@renesas.com>
> Signed-off-by: Leon Goldin <leon.goldin...@renesas.com>
> Signed-off-by: Devasish Dey <devasish....@syncmonk.net>
> Signed-off-by: Vipin Sharma <vipin.sha...@syncmonk.net>
> ---
>  clock.c     |  6 ++++--
>  interface.c | 12 ++++++++++++
>  interface.h | 14 ++++++++++++++
>  port.c      |  5 +++++
>  sk.c        |  2 ++
>  sk.h        |  2 ++
>  6 files changed, 39 insertions(+), 2 deletions(-)
>
> diff --git a/clock.c b/clock.c
> index 134c7c3..94da41b 100644
> --- a/clock.c
> +++ b/clock.c
> @@ -1005,11 +1005,13 @@ struct clock *clock_create(enum clock_type type,
> struct config *config,
>                 memset(ts_label, 0, sizeof(ts_label));
>                 if (!rtnl_get_ts_device(interface_name(iface), ts_label))
>                         interface_set_label(iface, ts_label);
> +               /* Interface speed information */
> +               interface_get_ifinfo(iface);
>                 interface_get_tsinfo(iface);
>                 if (interface_tsinfo_valid(iface) &&
> -                   !interface_tsmodes_supported(iface, required_modes)) {
> +                               !interface_tsmodes_supported(iface,
> required_modes)) {
>

Do you use Linux kernel alignment?
Why is that line shift?


>                         pr_err("interface '%s' does not support requested
> timestamping mode",
> -                              interface_name(iface));
> +                                       interface_name(iface));
>                         return NULL;
>                 }
>         }
> diff --git a/interface.c b/interface.c
> index 6c2630c..8524719 100644
> --- a/interface.c
> +++ b/interface.c
> @@ -12,6 +12,7 @@ struct interface {
>         char name[MAX_IFNAME_SIZE + 1];
>         char ts_label[MAX_IFNAME_SIZE + 1];
>         struct sk_ts_info ts_info;
> +       struct sk_if_info if_info;
>         int vclock;
>  };
>
> @@ -40,11 +41,22 @@ int interface_get_tsinfo(struct interface *iface)
>         return sk_get_ts_info(iface->ts_label, &iface->ts_info);
>  }
>
> +int interface_get_ifinfo(struct interface *iface)
> +{
> +       return sk_get_if_info(iface->ts_label, &iface->if_info);
> +}
> +
>  const char *interface_label(struct interface *iface)
>  {
>         return iface->ts_label;
>  }
>
> +bool interface_ifinfo_valid(struct interface *iface)
> +{
> +       return iface->if_info.valid ? true : false;
>

Boolean does not need to be translated to boolean.
You can simply "valid != 0", depending on 'valid' value.
Another one popular in Linux kernel is "!!valid".


> +}
> +
> +
>  const char *interface_name(struct interface *iface)
>  {
>         return iface->name;
> diff --git a/interface.h b/interface.h
> index 5fc7836..5289a7f 100644
> --- a/interface.h
> +++ b/interface.h
> @@ -40,6 +40,13 @@ void interface_destroy(struct interface *iface);
>   */
>  int interface_get_tsinfo(struct interface *iface);
>
> +/**
> + * Populate the time stamping information of a given interface.
> + * @param iface  The interface of interest.
> + * @return       zero on success, negative on failure.
> + */
> +int interface_get_ifinfo(struct interface *iface);
> +
>  /**
>   * Obtain the time stamping label of a network interface.  This can be
>   * different from the name of the interface when bonding is in effect.
> @@ -77,6 +84,13 @@ void interface_set_label(struct interface *iface, const
> char *label);
>   */
>  bool interface_tsinfo_valid(struct interface *iface);
>
> +/**
> + * Tests whether an interface's interface information is valid or not.
> + * @param iface  The interface of interest.
> + * @return       True if the interface information is valid, false
> otherwise.
> + */
> +bool interface_ifinfo_valid(struct interface *iface);
> +
>  /**
>   * Tests whether an interface supports a set of given time stamping modes.
>   * @param iface  The interface of interest.
> diff --git a/port.c b/port.c
> index 6baf5c8..2a96c40 100644
> --- a/port.c
> +++ b/port.c
> @@ -2741,6 +2741,11 @@ void port_link_status(void *ctx, int linkup, int
> ts_index)
>                 p->link_status = link_state;
>         } else {
>                 p->link_status = link_state | LINK_STATE_CHANGED;
> +               /* Update Interface speed information on Link up*/
> +               if (linkup) {
> +                       interface_get_ifinfo(p->iface);
> +               }
> +
>                 pr_notice("%s: link %s", p->log_name, linkup ? "up" :
> "down");
>         }
>
> diff --git a/sk.c b/sk.c
> index 1c14ca3..2e4ef2c 100644
> --- a/sk.c
> +++ b/sk.c
> @@ -267,6 +267,8 @@ int sk_get_if_info(const char *name, struct sk_if_info
> *if_info)
>         if_info->valid = 1;
>

Perhaps using "valid = true" and "valid = false"
So in interface_ifinfo_valid() you can simply return the value without any
conversion.


>         if_info->speed = ecmd.req.speed;
>
> +       /* Megabits per second converted to attoseconds per bit */

+       if_info->iface_bit_period = (1000000000000ULL/if_info->speed);
>

Excellent place for division!


>         return 0;
>  failed:
>  #endif
> diff --git a/sk.h b/sk.h
> index 7a9058a..df105d6 100644
> --- a/sk.h
> +++ b/sk.h
> @@ -54,10 +54,12 @@ struct sk_ts_info {
>   * Contains interface information returned by the GLINKSETTINGS ioctl.
>   * @valid:            set to non-zero when the info struct contains valid
> data.
>   * @speed:            interface speed.
> + * @iface_bit_period  interface bit period in attoseconds per bit.
>

Please specify the ITU standard that recommends using attoseconds.

  */
>  struct sk_if_info {
>         bool valid;
>         uint32_t speed;
> +       uint64_t iface_bit_period;
>  };
>
>  /**
> --
> 2.34.1
>
>
>
> _______________________________________________
> Linuxptp-devel mailing list
> Linuxptp-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/linuxptp-devel
>
_______________________________________________
Linuxptp-devel mailing list
Linuxptp-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linuxptp-devel

Reply via email to