User Tools

Site Tools


ifreq_ethtool

Differences

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

Link to this comparison view

Next revision
Previous revision
ifreq_ethtool [2018/09/02 06:21]
rpjday created
ifreq_ethtool [2018/09/02 06:56] (current)
rpjday [Userspace and struct ifreq]
Line 3: Line 3:
 Notes on ''​ethtool''​ and underlying kernel hooks/code. Notes on ''​ethtool''​ and underlying kernel hooks/code.
  
-Links:+General links:
  
   * [[https://​git.kernel.org/​pub/​scm/​network/​ethtool/​ethtool.git/​|ethtool git repo]]   * [[https://​git.kernel.org/​pub/​scm/​network/​ethtool/​ethtool.git/​|ethtool git repo]]
 +
 +Kernel source links:
 +
 +  * [[https://​github.com/​torvalds/​linux/​tree/​master/​include|include/​]]
 +    * [[https://​github.com/​torvalds/​linux/​tree/​master/​include/​uapi|uapi/​]]
 +      * [[https://​github.com/​torvalds/​linux/​tree/​master/​include/​uapi/​linux|linux/​]]
 +        * [[https://​github.com/​torvalds/​linux/​blob/​master/​include/​uapi/​linux/​if.h|if.h]] (for ''​struct ifreq''​)
 +        * [[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]]
 +
 +===== 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.1535869318.txt.gz ยท Last modified: 2018/09/02 06:21 by rpjday