Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
ifreq_ethtool [2018/09/02 06:31] rpjdayifreq_ethtool [2018/09/02 06:56] (current) – [Userspace and struct ifreq] rpjday
Line 15: Line 15:
         * [[https://github.com/torvalds/linux/blob/master/include/uapi/linux/sockios.h|sockios.h]] (for ''SIOCETHTOOL''}         * [[https://github.com/torvalds/linux/blob/master/include/uapi/linux/sockios.h|sockios.h]] (for ''SIOCETHTOOL''}
         * [[https://github.com/torvalds/linux/blob/master/include/uapi/linux/ethtool.h|ethtool.h]]         * [[https://github.com/torvalds/linux/blob/master/include/uapi/linux/ethtool.h|ethtool.h]]
 +
 +===== Userspace and struct ifreq =====
 +
 +From ethtool's ''internal.h'':
 +
 +<code>
 +/* Context for sub-commands */
 +struct cmd_context {
 +        const char *devname;    /* net device name */
 +        int fd;                 /* socket suitable for ethtool ioctl */
 +        struct ifreq ifr;       /* ifreq suitable for ethtool ioctl */
 +        int argc;               /* number of arguments to the sub-command */
 +        char **argp;            /* arguments to the sub-command */
 +};
 +</code>
 +
 +and from ''ethtool.c'', the wrapper for ioctl calls:
 +
 +<code>
 +#ifndef TEST_ETHTOOL
 +int send_ioctl(struct cmd_context *ctx, void *cmd)
 +{
 +        ctx->ifr.ifr_data = cmd;
 +        return ioctl(ctx->fd, SIOCETHTOOL, &ctx->ifr);
 +}
 +#endif
 +</code>
 +
 +From ''if.h'':
 +
 +<code>
 +/* for compatibility with glibc net/if.h */
 +#if __UAPI_DEF_IF_IFREQ
 +struct ifreq {
 +#define IFHWADDRLEN     6
 +        union
 +        {
 +                char    ifrn_name[IFNAMSIZ];            /* if name, e.g. "en0" */
 +        } ifr_ifrn;
 +
 +        union {
 +                struct  sockaddr ifru_addr;
 +                struct  sockaddr ifru_dstaddr;
 +                struct  sockaddr ifru_broadaddr;
 +                struct  sockaddr ifru_netmask;
 +                struct  sockaddr ifru_hwaddr;
 +                short   ifru_flags;
 +                int     ifru_ivalue;
 +                int     ifru_mtu;
 +                struct  ifmap ifru_map;
 +                char    ifru_slave[IFNAMSIZ];   /* Just fits the size */
 +                char    ifru_newname[IFNAMSIZ];
 +                void *  ifru_data;
 +                struct  if_settings ifru_settings;
 +        } ifr_ifru;
 +};
 +#endif /* __UAPI_DEF_IF_IFREQ */
 +
 +#define ifr_name        ifr_ifrn.ifrn_name      /* interface name       */
 +#define ifr_hwaddr      ifr_ifru.ifru_hwaddr    /* MAC address          */
 +#define ifr_addr        ifr_ifru.ifru_addr      /* address              */
 +#define ifr_dstaddr     ifr_ifru.ifru_dstaddr   /* other end of p-p lnk */
 +#define ifr_broadaddr   ifr_ifru.ifru_broadaddr /* broadcast address    */
 +#define ifr_netmask     ifr_ifru.ifru_netmask   /* interface net mask   */
 +#define ifr_flags       ifr_ifru.ifru_flags     /* flags                */
 +#define ifr_metric      ifr_ifru.ifru_ivalue    /* metric               */
 +#define ifr_mtu         ifr_ifru.ifru_mtu       /* mtu                  */
 +#define ifr_map         ifr_ifru.ifru_map       /* device map           */
 +#define ifr_slave       ifr_ifru.ifru_slave     /* slave device         */
 +#define ifr_data        ifr_ifru.ifru_data      /* for use by interface */
 +#define ifr_ifindex     ifr_ifru.ifru_ivalue    /* interface index      */
 +#define ifr_bandwidth   ifr_ifru.ifru_ivalue    /* link bandwidth       */
 +#define ifr_qlen        ifr_ifru.ifru_ivalue    /* Queue length         */
 +#define ifr_newname     ifr_ifru.ifru_newname   /* New name             */
 +#define ifr_settings    ifr_ifru.ifru_settings  /* Device/proto settings*/
 +</code>
  • ifreq_ethtool.1535869881.txt.gz
  • Last modified: 2018/09/02 06:31
  • by rpjday