===== Overview ===== Notes on ''ethtool'' and underlying kernel hooks/code. General links: * [[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'': /* 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 */ }; and from ''ethtool.c'', the wrapper for ioctl calls: #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 From ''if.h'': /* 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*/