>
> > + 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 <[email protected]> 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
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/linuxptp-devel
>
_______________________________________________
Linuxptp-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/linuxptp-devel