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 寄存器,实现对网卡的管理,并把执行结果传回用户空间,如下图所示。

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

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

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

最后祝大家玩得开心。

Ethtool工具源码剖析的更多相关文章

  1. Apache Spark源码剖析

    Apache Spark源码剖析(全面系统介绍Spark源码,提供分析源码的实用技巧和合理的阅读顺序,充分了解Spark的设计思想和运行机理) 许鹏 著   ISBN 978-7-121-25420- ...

  2. DICOM医学图形处理:storescp.exe与storescu.exe源码剖析,学习C-STORE请求(续)

    转载:http://blog.csdn.net/zssureqh/article/details/39237649 背景: 上一篇博文中,在对storescp工具源文件storescp.cc和DcmS ...

  3. DICOM医学图像处理:storescp.exe与storescu.exe源码剖析,学习C-STORE请求

    转载:http://blog.csdn.net/zssureqh/article/details/39213817 背景: 上一篇专栏博文中针对PACS终端(或设备终端,如CT设备)与RIS系统之间w ...

  4. Android源码剖析之Framework层升级版(窗口、系统启动)

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 看本篇文章之前,建议先查看: Android源码剖析之Framework层基础版 前面讲了frame ...

  5. 《Apache Spark源码剖析》

    Spark Contributor,Databricks工程师连城,华为大数据平台开发部部长陈亮,网易杭州研究院副院长汪源,TalkingData首席数据科学家张夏天联袂力荐1.本书全面.系统地介绍了 ...

  6. (升级版)Spark从入门到精通(Scala编程、案例实战、高级特性、Spark内核源码剖析、Hadoop高端)

    本课程主要讲解目前大数据领域最热门.最火爆.最有前景的技术——Spark.在本课程中,会从浅入深,基于大量案例实战,深度剖析和讲解Spark,并且会包含完全从企业真实复杂业务需求中抽取出的案例实战.课 ...

  7. Appuim源码剖析(Bootstrap)

    Appuim源码剖析(Bootstrap) SkySeraph Jan. 26th 2017 Email:skyseraph00@163.com 更多精彩请直接访问SkySeraph个人站点:www. ...

  8. 老李推荐:第14章9节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-遍历控件树查找控件

    老李推荐:第14章9节<MonkeyRunner源码剖析> HierarchyViewer实现原理-遍历控件树查找控件   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员 ...

  9. 老李推荐:第14章5节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-装备ViewServer-查询ViewServer运行状态

    老李推荐:第14章5节<MonkeyRunner源码剖析> HierarchyViewer实现原理-装备ViewServer-查询ViewServer运行状态   poptest是国内唯一 ...

随机推荐

  1. 以太坊代币,USDT归集流程图

    1.用户充值 600 代币 (网站小助手会及时监听到用户的充值信息,并回调给用户填写的URL地址) 2.会员转账600代币,属于大额转账,开始触发系统的自动汇集程序 注:这里系统检测到会员的地址并没有 ...

  2. 微信小程序分享至朋友圈的方法

    最近研究怎么实现微信小程序分享至朋友圈,对就是朋友圈. 微信小程序目前没有直接提供方法来将小程序分享至朋友圈,不过可以采用曲线救国的方式来达到目的. 方法分两步: 1.通过浏览器将希望分享的东西风向至 ...

  3. python3的subprocess的各个方法的区别(-)

    subprocess(python3.7) subprocess 主要是为了替换一下的模块函数,允许你执行一些命令,并获取返回的状态码和 输入,输出和错误信息. os.systemos.spawn* ...

  4. [SCF+wetest+jmeter]简单云性能压测工具使用方案

    前言 压测太难?局域网压力无法判断服务器网络指标?无法产生非常大的并发量?云性能太贵? 也许我们可以把各种简单的工具拼起来进行压力测试! 准备 https://cloud.tencent.com/pr ...

  5. Java第二十七天,线程池

    1.什么情况下需要线程池? 频絮创建线程就会大大降低系统的效率,那么有没有一种办法使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以继续执行其他的任务?在java中可以通过线程池来达到这样的效 ...

  6. Linux 压缩备份篇(一 压缩与解压缩)

    .Z                compress程序压缩的档案 .bz2                bzip2程序压缩的档案 .gz                gzip程序压缩的档案 .t ...

  7. Vue-router 第10节 路由中的钩子

    Vue-router 第10节 路由中的钩子 [TOC] 第10节 路由中的钩子 我们知道一个组件从进入到销毁有很多的钩子函数,同样在路由中也设置了钩子函数.路由的钩子选项可以写在路由配置文件中,也可 ...

  8. ClassLoader类加载器浅见

    类加载器 类加载器,它拿到.class文件,它会把他拆成两部分,将static数据转换成方法区的数据结构,然后把他放在了方法区之中. 然后在堆里面建一个类对象(Class,它可以用来实例化对象),然后 ...

  9. AJ学IOS 之微博项目实战(13)发送微博调用相机里面的图片以及调用相机

    AJ分享,必须精品 一:效果 二:代码 相机部分就简单多了,几行代码调用而已,但是如果你要是想实现更多丰富的功能,需要自己写.利用AssetsLibrary.framework,利用这个框架可以获得手 ...

  10. AJ学IOS(29)UI之Quartz2D自定义下载控件_画各种图形

    AJ分享,必须精品 效果 自定义控件过程 主要过程在上一篇里有介绍了,这里主要介绍下代码实现 先做好要放的view 然后实现呢主要就是四步: 1:获取上下文 2:拼接路径 3:把路径添加到上下文. 4 ...