Ethtool工具源码剖析
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工具源码剖析的更多相关文章
- Apache Spark源码剖析
Apache Spark源码剖析(全面系统介绍Spark源码,提供分析源码的实用技巧和合理的阅读顺序,充分了解Spark的设计思想和运行机理) 许鹏 著 ISBN 978-7-121-25420- ...
- DICOM医学图形处理:storescp.exe与storescu.exe源码剖析,学习C-STORE请求(续)
转载:http://blog.csdn.net/zssureqh/article/details/39237649 背景: 上一篇博文中,在对storescp工具源文件storescp.cc和DcmS ...
- DICOM医学图像处理:storescp.exe与storescu.exe源码剖析,学习C-STORE请求
转载:http://blog.csdn.net/zssureqh/article/details/39213817 背景: 上一篇专栏博文中针对PACS终端(或设备终端,如CT设备)与RIS系统之间w ...
- Android源码剖析之Framework层升级版(窗口、系统启动)
本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 看本篇文章之前,建议先查看: Android源码剖析之Framework层基础版 前面讲了frame ...
- 《Apache Spark源码剖析》
Spark Contributor,Databricks工程师连城,华为大数据平台开发部部长陈亮,网易杭州研究院副院长汪源,TalkingData首席数据科学家张夏天联袂力荐1.本书全面.系统地介绍了 ...
- (升级版)Spark从入门到精通(Scala编程、案例实战、高级特性、Spark内核源码剖析、Hadoop高端)
本课程主要讲解目前大数据领域最热门.最火爆.最有前景的技术——Spark.在本课程中,会从浅入深,基于大量案例实战,深度剖析和讲解Spark,并且会包含完全从企业真实复杂业务需求中抽取出的案例实战.课 ...
- Appuim源码剖析(Bootstrap)
Appuim源码剖析(Bootstrap) SkySeraph Jan. 26th 2017 Email:skyseraph00@163.com 更多精彩请直接访问SkySeraph个人站点:www. ...
- 老李推荐:第14章9节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-遍历控件树查找控件
老李推荐:第14章9节<MonkeyRunner源码剖析> HierarchyViewer实现原理-遍历控件树查找控件 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员 ...
- 老李推荐:第14章5节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-装备ViewServer-查询ViewServer运行状态
老李推荐:第14章5节<MonkeyRunner源码剖析> HierarchyViewer实现原理-装备ViewServer-查询ViewServer运行状态 poptest是国内唯一 ...
随机推荐
- Vue 实战项目: 硅谷外卖(1)
第 1 章: 准备 1.1. 项目描述 1) 此项目为外卖 WebApp(SPA) 2) 包括商家, 商品, 购物车, 用户等多个子模块 3) 使用 Vue 全家桶+ES6+Webpack 等前端最新 ...
- JAVA中Calendar 类的应用
转自:https://www.imooc.com/code/2340 侵删! Date 类最主要的作用就是获得当前时间,同时这个类里面也具有设置时间以及一些其他的功能,但是由于本身设计的问题,这些方法 ...
- "Flex弹性布局"组件:<flex-row><flex-col> —— 快应用组件库H-UI
 <import name="flex-row" src="../Common/ui/h-ui/basic/c_flex_row"></im ...
- Thinking in Java,Fourth Edition(Java 编程思想,第四版)学习笔记(七)之Access Control
Access control ( or implementation hiding) is about "not getting it right the first time." ...
- .net批量更新(插入、修改、删除)数据库
思路: 1. 设置DataTable中每行的状态标识,即调用DataRow的方法setAdded().setModified().Delete() 2. 使用DataAdapter的Update(Da ...
- SVN版本控制器的使用说明(详细过程)
SVN使用教程总结 SVN简介: 为什么要使用SVN? 程序员在编写程序的过程中,每个程序员都会生成很多不同的版本,这就需要程序员有效的管理代码,在需要的时候可以迅速,准确取出相应的版本. Subv ...
- mybatis一级缓存让我憔悴
Mybatis对缓存提供支持,是默认开启一级缓存. 来一段代码,这边使用的是mybatis-plus框架,通过构建 QueryWrapper 查询类来实现的. @Transactional publi ...
- python机器学习入门-(1)
机器学习入门项目 如果你和我一样是一个机器学习小白,这里我将会带你进行一个简单项目带你入门机器学习.开始吧! 1.项目介绍 这个项目是针对鸢尾花进行分类,数据集是含鸢尾花的三个亚属的分类信息,通过机器 ...
- .NET Core3.1总体预览和第一个Core程序的创建
小伙伴们大家好!欢迎阅读本贴,这里是常哥说编程的专栏,.NetCore已经出来一段时间了,很多小伙伴可能也开始了学习,但是.NetCore毕竟在学习上和我们常用的.NET Framework还是有很大 ...
- Linux提权-suid提权
0x1 suid概念 通俗理解为其他用户执行这个程序是可以用该程序所有者/组的权限 0x2 suid提权 简单理解为,一个文件有s标志(权限中包含s),并且对应的是root权限,那么当运行这个程序时就 ...