User Tools

Site Tools


ifreq_ethtool

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:24]
rpjday
ifreq_ethtool [2018/09/02 06:56]
rpjday [Userspace and struct ifreq]
Line 10: Line 10:
  
   * [[https://​github.com/​torvalds/​linux/​tree/​master/​include|include/​]]   * [[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.txt · Last modified: 2018/09/02 06:56 by rpjday