Ethtool工具源码剖析

简介: Ethtool工具源码剖析 ethool是一个实用的工具,用来给系统管理员以大量的控制网络接口的操作。可以用来控制接口参数,速度,介质类型,双工模式,DMA环设置,硬件校验和,LAN唤醒操作等。本人经常用于来观测物理链路层的链接状态,用于判断网线是否正常,不用去机房看网卡亮没亮灯了。

Ethtool工具源码剖析

ethool是一个实用的工具,用来给系统管理员以大量的控制网络接口的操作。可以用来控制接口参数,速度,介质类型,双工模式,DMA环设置,硬件校验和,LAN唤醒操作等。本人经常用于来观测物理链路层的链接状态,用于判断网线是否正常,不用去机房看网卡亮没亮灯了。

            ethtool的版本通过如下命令进行查看:

# ethtool --version

ethtool version 4.5

            其源码位于何处呢?

1.1.1 源码

源码可以在

https://mirrors.edge.kernel.org/pub/software/network/ethtool/ 中下载得到。

            编译也很简单:

执行./configure后,运行make命令直接进行编译。

            相比之前的ifconfig和netstat工具要复杂更多,毕竟ethtool从至此的参数上来也更加庞大。

 

 

1.1.2 数据结构体

static const struct option {

        const char *opts;

        int want_device;

        int (*func)(struct cmd_context *);

        char *help;

        char *opthelp;

}

因为ethtool参数复杂庞大,因此单独定义了结构体option。第一个是参数选项,第二个是bool值,第三个是回调函数,第四个核第五个是帮助的字符串。所有的处理函数都在option的结构体数组args[]中设置了,如:do_gdrv获取驱动信息 , do_gset 获取网卡参数  ,do_sset设置网卡参数 等。

结构体cmd_context是控制结构体。

/* 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 */

};

 

1.1.3 程序逻辑

从ethtool.c中main主函数开始,首先分析传入参数。如果没有参数,则调用exit_bad_args函数来输出。

第一个参数要么是设备名字要么是合法的选项,而不是一个以’-‘开头的。

根据输入的参数,会将func变量设置为结构体option中的回调函数。

最后调用设置过的func函数(例如do_gset函数),参数为cmd_context结构体,其中填充了相关参数(例如设备名,套接字句柄等)。

            我们可以看到,程序主逻辑非常的清晰,主要是每个参数下其针对的处理函数才是根据需要分析的重点。

            例如参数-s为例,其选项结构为:

        { "-s|--change", 1, do_sset, "Change generic options",

          "             [ speed %d ]\n"

          "             [ duplex half|full ]\n"

          "             [ port tp|aui|bnc|mii|fibre ]\n"

          "             [ mdix auto|on|off ]\n"

          "             [ autoneg on|off ]\n"

          "             [ advertise %x ]\n"

          "             [ phyad %d ]\n"

          "             [ xcvr internal|external ]\n"

          "             [ wol p|u|m|b|a|g|s|d... ]\n"

          "             [ sopass %x:%x:%x:%x:%x:%x ]\n"

          "             [ msglvl %d | msglvl type on|off ... ]\n" },

可以看到其调用的函数为do_sset,该函数会对参数进行详细的解析,最后确定用户意图后调用send_ioctl函数。当然会根据参数的差异,调用不同的参数。

例如会调用函数:send_ioctl(ctx, &ecmd);或者send_ioctl(ctx, &edata)(send_ioctl调用ioctl系统调用,ioctl是设备驱动程序中对设备的I/O通道进行管理的函数,对设备的一些特性进行控制,例如串口的传输波特率、马达的转速等等)其中edata为ethtool_value结构体,ecmd为ethtool_command,还有ethtool_wolinfo

这些结构体都定义在include/uapi/linux/ethtool.h文件中。

1.1.4 驱动支持

现在网卡驱动程序都有对ethtool 的支持。ethtool 框架包含内核空间和用户空间两部分:用户空间的部分负责将 ethtool 命令发送到内核,然后接收命令在内核中的执行结果。

内核空间的部分根据相应的命令字,通过 MDIO/MDC 读写 MII 寄存器,实现对网卡的管理,并把执行结果传回用户空间,如下图所示。

0edaf4f7114c1d5c5d5af6f5e530d67ce330ce23

            ethtool担负着用户空间和具体网络设备驱动之间的交互,包括查询、设置网卡信息。相关声明在include/linux/ethtool.h文件中,核心是ethtool_ops类型的结构。

            对于和设备一起工作的ethtool,必须放置一个指向ethtool_ops结构的指针在net_device结构中。

            这些底层工具本身都比较复杂,且都和内核交互,单篇材料不能详述之,后续会根据细节进行分析。

            最后祝大家玩得开心。

目录
相关文章
|
2月前
|
安全 Linux 数据安全/隐私保护
探索 Linux 高级进程间通讯 D-Bus的神秘妙用
探索 Linux 高级进程间通讯 D-Bus的神秘妙用
83 1
|
4月前
【vpp2206 测试】
【vpp2206 测试】
|
网络协议 Linux 数据中心
那些年,用过的Linux网络工具
Linux作为一款强大的操作系统,凭借其优异的的网络服务功能,被广泛使用到云服务中心、数据中心、嵌入式边缘物联代理等需要可靠的网络服务支持的场景中。具体到生成环境,免不了使用工具去管理和控制网络,本文就来带领大家细数一下,Linux下都有哪些提供网络管理的工具。
198 0
|
网络性能优化 调度
|
网络协议 Linux 容器