>
> > +               goto failed;
> > +       }
>
> I think it is better to merge this ioctl and the socket creation with
> sk_get_ts_info().
> No reason for duplication.
> You can use a static function or inline one.
>
> > +
> > +       if (ecmd.req.link_mode_masks_nwords >= 0 ||
> > +                       ecmd.req.cmd != ETHTOOL_GLINKSETTINGS) {
> > +               return 1;
> > +       }
>
[Devasish]: This can be done.

> +       /* clear data and ensure it is not marked valid */
> +       memset(if_info, 0, sizeof(struct sk_if_info));
> +       return -1;

You need to close the socket!
[Devasish]: Noted. Will be updated in the next patch.

> +struct sk_if_info {
> +       bool valid;
It is better not to use bool in a structure, as the size is usually
int, i.e. 64 bits to hold 1 bit.

[Devasish]: Earlier we had it as an integer. We can update it to uint8_t as
well. But Richard suggested updating it to Boolean.
So, leaving this to Richard.

> +       int speed;
What are the units here?
Old systems use 32 bits, if you measure in bits per second, the maximum
is 4 GB.
It is better to use uint64_t and use 1 mbps as units.
[Devasish]: It is the same as the speed in ethtool_link_settings which is a
uint32_t variable and it is in Mbps.
Will change it to uint32_t and update the comments.

Thanks,
Devasish.


On Fri, 9 Dec 2022 at 17:29, Geva, Erez <erez.geva....@siemens.com> wrote:

> On Wed, 2022-12-07 at 17:34 +0530, SyncMonk Technologies wrote:
> > When master and slave instance interacting with each other operating
> > at different interface speed, delay assymetry needs to be compensated
> > as described in G.8271 appendix V.
> >
> > In this patch we are adding changes to get the interface speed using
> > ethtool.
> >
> > v1: initial commit.
> > v2: updating comments and data types.
> > v3: updating Boolean data type to bool from <stdbool.h>
> > ---
> >  sk.c | 71
> > ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> >  sk.h | 19 ++++++++++++++++
> >  2 files changed, 90 insertions(+)
> >
> > diff --git a/sk.c b/sk.c
> > index d27abff..1d1a656 100644
> > --- a/sk.c
> > +++ b/sk.c
> > @@ -205,6 +205,77 @@ failed:
> >         return -1;
> >  }
> >
> > +int sk_get_if_info(const char *name, struct sk_if_info *if_info)
> > +{
> > +#ifdef ETHTOOL_GLINKSETTINGS
> > +       struct ifreq ifr;
> > +       int fd, err;
> > +
> > +       struct {
> > +               struct ethtool_link_settings req;
> > +               /*
> > +                * link_mode_data consists of supported[],
> > advertising[],
> > +                * lp_advertising[] with size up to 127 each.
> > +                * The actual size is provided by the kernel.
> > +                */
> > +               __u32 link_mode_data[3 * 127];
> > +       } ecmd;
> > +
> > +       memset(&ifr, 0, sizeof(ifr));
> > +       memset(&ecmd, 0, sizeof(ecmd));
> > +
> > +       fd = socket(AF_INET, SOCK_DGRAM, 0);
> > +       if (fd < 0) {
> > +               goto failed;
> > +       }
> > +
> > +       ecmd.req.cmd = ETHTOOL_GLINKSETTINGS;
> > +
> > +       strncpy(ifr.ifr_name, name, IFNAMSIZ - 1);
> > +       ifr.ifr_data = (char *) &ecmd;
> > +
> > +       /* Handshake with kernel to determine number of words for
> > link
> > +        * mode bitmaps. When requested number of bitmap words is not
> > +        * the one expected by kernel, the latter returns the integer
> > +        * opposite of what it is expecting. We request length 0
> > below
> > +        * (aka. invalid bitmap length) to get this info.
> > +        */
> > +       err = ioctl(fd, SIOCETHTOOL, &ifr);
> > +       if (err < 0) {
> > +               pr_err("ioctl SIOCETHTOOL failed: %m");
> > +               close(fd);
> > +               goto failed;
> > +       }
>
> I think it is better to merge this ioctl and the socket creation with
> sk_get_ts_info().
> No reason for duplication.
> You can use a static function or inline one.
>
> > +
> > +       if (ecmd.req.link_mode_masks_nwords >= 0 ||
> > +                       ecmd.req.cmd != ETHTOOL_GLINKSETTINGS) {
> > +               return 1;
> > +       }
> > +       ecmd.req.link_mode_masks_nwords = -
> > ecmd.req.link_mode_masks_nwords;
> > +
> > +       err = ioctl(fd, SIOCETHTOOL, &ifr);
> > +       if (err < 0) {
> > +               pr_err("ioctl SIOCETHTOOL failed: %m");
> > +               close(fd);
> > +               goto failed;
> > +       }
> > +
> > +       close(fd);
> > +
> > +       /* copy the necessary data to sk_info */
> > +       memset(if_info, 0, sizeof(struct sk_if_info));
> > +       if_info->valid = 1;
> > +       if_info->speed = ecmd.req.speed;
> > +
> > +       return 0;
> > +failed:
> > +#endif
> > +       /* clear data and ensure it is not marked valid */
> > +       memset(if_info, 0, sizeof(struct sk_if_info));
> > +       return -1;
>
> You need to close the socket!
>
> > +}
> > +
> > +
> >  static int sk_interface_guidaddr(const char *name, unsigned char
> > *guid)
> >  {
> >         char file_name[64], buf[64], addr[8];
> > diff --git a/sk.h b/sk.h
> > index 486dbc4..4cee3d7 100644
> > --- a/sk.h
> > +++ b/sk.h
> > @@ -20,6 +20,7 @@
> >  #ifndef HAVE_SK_H
> >  #define HAVE_SK_H
> >
> > +#include <stdbool.h>
> >  #include "address.h"
> >  #include "transport.h"
> >
> > @@ -49,6 +50,16 @@ struct sk_ts_info {
> >         unsigned int rx_filters;
> >  };
> >
> > +/**
> > + * Contains interface information returned by theGLINKSETTINGS
> > ioctl.
> > + * @valid:            set to non-zero when the info struct contains
> > valid data.
> > + * @speed:            interface speed.
> > + */
> > +struct sk_if_info {
> > +       bool valid;
> It is better not to use bool in a structure, as the size is usually
> int, i.e. 64 bits to hold 1 bit.
>
> > +       int speed;
> What are the units here?
> Old systems use 32 bits, if you measure in bits per second, the maximum
> is 4 GB.
> It is better to use uint64_t and use 1 mbps as units.
>
> > +};
> > +
> >  /**
> >   * Obtains a socket suitable for use with sk_interface_index().
> >   * @return  An open socket on success, -1 otherwise.
> > @@ -78,6 +89,14 @@ int sk_general_init(int fd);
> >   */
> >  int sk_get_ts_info(const char *name, struct sk_ts_info *sk_info);
> >
> > +/**
> > + * Obtain supporte interface information
> > + * @param name     The name of the interface
> > + * @param info      Struct containing obtained interface
> > information.
> > + * @return          zero on success, negative on failure.
> > + */
> > +int sk_get_if_info(const char *name, struct sk_if_info *sk_info);
> > +
> >  /**
> >   * Obtain the MAC address of a network interface.
> >   * @param name  The name of the interface
>
>
> Erez
>
>
> _______________________________________________
> 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