ethtool 调用流程

1. bcmgenet_ethtool_ops 分析

static const struct ethtool_ops bcmgenet_ethtool_ops = {.begin            = bcmgenet_begin,.complete        = bcmgenet_complete,.get_strings        = bcmgenet_get_strings,.get_sset_count        = bcmgenet_get_sset_count,.get_ethtool_stats    = bcmgenet_get_ethtool_stats,.get_drvinfo        = bcmgenet_get_drvinfo,.get_link        = ethtool_op_get_link,.get_msglevel        = bcmgenet_get_msglevel,.set_msglevel        = bcmgenet_set_msglevel,.get_wol        = bcmgenet_get_wol,.set_wol        = bcmgenet_set_wol,.get_eee        = bcmgenet_get_eee,.set_eee        = bcmgenet_set_eee,.nway_reset        = phy_ethtool_nway_reset,.get_coalesce        = bcmgenet_get_coalesce,.set_coalesce        = bcmgenet_set_coalesce,.get_link_ksettings    = bcmgenet_get_link_ksettings,.set_link_ksettings    = bcmgenet_set_link_ksettings,
};


2.核心转换层

net/core/ethtool.c
int dev_ethtool(struct net *net, struct ifreq *ifr)
int dev_ethtool(struct net *net, struct ifreq *ifr)
{struct net_device *dev = __dev_get_by_name(net, ifr->ifr_name);void __user *useraddr = ifr->ifr_data;u32 ethcmd, sub_cmd;switch (ethcmd) {.....case ETHTOOL_GEEE:rc = ethtool_get_eee(dev, useraddr);break;....}if (dev->ethtool_ops->complete)dev->ethtool_ops->complete(dev);if (old_features != dev->features)netdev_features_change(dev);return rc;
}

3. ethtool源码=>确定cmd 

static int do_geee(struct cmd_context *ctx)
{struct ethtool_eee eeecmd;if (ctx->argc != 0)exit_bad_args();eeecmd.cmd = ETHTOOL_GEEE;if (send_ioctl(ctx, &eeecmd)) {perror("Cannot get EEE settings");return 1;}fprintf(stdout, "EEE Settings for %s:\n", ctx->devname);dump_eeecmd(&eeecmd);return 0;
}
static const struct option {const char *opts;int want_device;int (*func)(struct cmd_context *);char *help;char *opthelp;
} args[] = {...{ "--show-eee", 1, do_geee, "Show EEE settings"},}

4. ethtool调用分析实战


root@raspberrypi:/home/niyu# ethtool --show-eee eth0
EEE Settings for eth0:
        EEE status: disabled
        Tx LPI: disabled
        Supported EEE link modes:  100baseT/Full 
                                   1000baseT/Full 
        Advertised EEE link modes:  100baseT/Full 
                                    1000baseT/Full 
        Link partner advertised EEE link modes:  Not reported

root@raspberrypi:/home/niyu# dmesg 
[ 2379.731178] bcmgenet fd580000.genet eth0: Link is Up - 1Gbps/Full - flow control rx/tx
[ 2395.556547] CPU: 0 PID: 812 Comm: ethtool Not tainted 4.19.127-v8+ #38
[ 2395.556561] Hardware name: Raspberry Pi 4 Model B Rev 1.5 (DT)
[ 2395.556569] Call trace:
[ 2395.556590]  dump_backtrace+0x0/0x178
[ 2395.556600]  show_stack+0x28/0x34
[ 2395.556612]  __dump_stack+0x20/0x28
[ 2395.556621]  dump_stack+0x88/0xc4
[ 2395.556646]  bcmgenet_get_eee+0x24/0x88 [genet]  //结束
[ 2395.556657]  ethtool_get_eee+0x5c/0xe8
[ 2395.556666]  dev_ethtool+0x2a8/0x75c    
[ 2395.556675]  dev_ioctl+0xf8/0x288               //开始

[ 2395.556686]  sock_do_ioctl+0xf8/0x284
[ 2395.556696]  sock_ioctl+0x320/0x484
[ 2395.556708]  vfs_ioctl+0x44/0x74
[ 2395.556717]  do_vfs_ioctl+0x2d0/0x304
[ 2395.556726]  ksys_ioctl+0x54/0x88
[ 2395.556735]  __se_sys_ioctl+0x38/0x4c
[ 2395.556744]  __arm64_sys_ioctl+0x2c/0x38
[ 2395.556753]  __invoke_syscall+0x28/0x34
[ 2395.556761]  invoke_syscall+0x58/0x7c
[ 2395.556769]  el0_svc_common+0x74/0xec
[ 2395.556777]  el0_svc_handler+0x70/0x94
[ 2395.556786]  el0_svc+0x8/0xc

5 补充

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 */
};struct ifreq{
# define IFHWADDRLEN    6
# define IFNAMSIZ    IF_NAMESIZEunion{char ifrn_name[IFNAMSIZ];    /* Interface 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 int ifru_flags;int ifru_ivalue;int ifru_mtu;struct ifmap ifru_map;char ifru_slave[IFNAMSIZ];    char ifru_newname[IFNAMSIZ];__caddr_t ifru_data;   //填充cmd} ifr_ifru;};


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/835191.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring添加注解读取和存储对象

5大注解 Controller 控制器 Service 服务 Repository 仓库 Componet 组件 Configuration 配置 五大类注解的使用 //他们都是放在同一个目录下,不同的类中 只不过这里粘贴到一起//控制器 Controller public class UserController {public void SayHello(){System.ou…

在51单片机里面学习C语言

在开始前我有一些资料,是我根据网友给的问题精心整理了一份「C语言的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家!!! 说出来你们可能都…

Oracle count的优化-避免全表扫描

Oracle count的优化-避免全表扫描 select count(*) from t1; 这句话比较简单,但很有玄机!对这句话运行的理解,反映了你对数据库的理解深度! 建立实验的大表他t1 SQL> conn scott/tiger 已连接。 SQL> drop table t1 purge…

C++ | Leetcode C++题解之第71题简化路径

题目&#xff1a; 题解&#xff1a; class Solution { public:string simplifyPath(string path) {auto split [](const string& s, char delim) -> vector<string> {vector<string> ans;string cur;for (char ch: s) {if (ch delim) {ans.push_back(mov…

QT+MYSQL数据库处理

1、打印Qt支持的数据库驱动&#xff0c;看是否有MYSQL数据库驱动 qDebug() << QSqlDatabase::drivers(); 有打印结果可知&#xff0c;没有MYSQL数据库的驱动 2、下载MYSQL数据库驱动&#xff0c;查看下面的文章配置&#xff0c;亲测&#xff0c;可以成功 Qt6 配置MySQL…

百面算法工程师 | 模型评价指标及优化策略

本文给大家带来的百面算法工程师是深度学习模型评价指标的面试总结&#xff0c;文章内总结了常见的提问问题&#xff0c;旨在为广大学子模拟出更贴合实际的面试问答场景。在这篇文章中&#xff0c;我们还将介绍一些常见的评价方案&#xff0c;并提供参考的回答及其理论基础&…

7 系列 FPGA 产品介绍及选型

目录 Spartan-7 FPGAsArtix-7 FPGAsKintex-7 FPGAsVirtex-7 FPGAsFPGA芯片命名规则DSP资源BRAM资源Transceivers 资源Transceivers 总带宽I/O 个数及带宽参考文档 Spartan-7 FPGAs Artix-7 FPGAs Kintex-7 FPGAs Virtex-7 FPGAs FPGA芯片命名规则 DSP资源 BRAM资源 Transceiver…

深入浅出JavaScript继承机制:解密原型、原型链与面向对象实战攻略

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 &#x1f525; 引言&#x1f9f1; 原型基础⛓️ 原型链的形成&#x1f504; 修改原型的影响&#x1f3c1; 原型链的尽头为什么null标志着结束&#xff1f;实际意义 &#x1f310; &#x1f504; 继承的实现方式1. 原型链继承…

数据库期末复习资料

考纲 选择 10分 简答题 25分 ER图建表 15分 建表以后的范式的分解、规范化 15分 Sql语句 35分 &#xff1a;关系代数&#xff0c;select&#xff0c;触发器 --------------------------------------数据库设计----------------------------------- 第一章&#xff1a; 1.数据…

我在洛杉矶采访到了亚马逊云全球首席信息官CISO(L11)!

在本次洛杉矶举办的亚马逊云Re:Inforce全球安全大会中&#xff0c;小李哥作为亚马逊大中华区开发者社区和自媒体代表&#xff0c;跟着亚马逊云安全产品团队采访了亚马逊云首席信息安全官(CISO)CJ Moses、亚马逊副总裁Eric Brandwine和亚马逊云首席高级安全工程师Becky Weiss。 …

安装docker镜像nginx1.26.0版本,与删除docker容器【灵异事件】

为了http3 的这个模块&#xff0c;所以需要升级nginx的版本&#xff0c;需要nginx1.26.0才有 –with-http_v3_module 这个模块 为什么记录一下&#xff1f;因为觉得奇怪 1&#xff1a;删除nginx镜像&#xff0c;显示镜像还被某个容器在使用 luichunluichun:~$ docker rmi ng…

Gone框架介绍13 - Gone的Hook函数

我从头到尾实现了一个Golang的依赖注入框架&#xff0c;并且集成了gin、xorm、redis、cron、消息中间件等功能&#xff1b;自己觉得还挺好用的&#xff0c;推荐给你&#xff01;也欢迎一起维护&#xff01; github地址&#xff1a;https://github.com/gone-io/gone 文档地址&am…

文心一言 VS 讯飞星火 VS chatgpt (255)-- 算法导论18.3 1题

一、请说明依次从图18-8(f)中删除C、P和V后的结果。如果要写代码&#xff0c;请用go语言。 文心一言&#xff1a; 首先&#xff0c;让我们明确一点&#xff1a;由于您没有提供具体的图18-8(f)的内容&#xff0c;我只能假设它是一个数据结构&#xff08;可能是图、树或列表等&…

AI模型:windows本地运行下载安装ollama运行Google CodeGemma、gemma等可离线运行数据模型【自留记录】

AI模型&#xff1a;windows本地运行下载安装ollama运行Google CodeGemma可离线运行数据模型【自留记录】 CodeGemma 没法直接运行&#xff0c;需要中间软件。下载安装ollama后&#xff0c;使用ollama运行CodeGemma。 类似 前端本地需要安装 node.js 才可能跑vue、react项目 1…

应用层协议之 DNS 协议

DNS 就是一个域名解析系统。域名就是网址&#xff0c;类似于 www.baidu.com。网络上的服务器想要访问它&#xff0c;就得需要它对应的 IP 地址&#xff0c;同时&#xff0c;每个域名对对应着一个 / N个 IP 地址&#xff08;即对应多台服务器&#xff09;。 因此&#xff0c;为了…

会话劫持攻击就在我们身边,我们要如何防范

会话劫持攻击&#xff08;Session Hijacking&#xff09;是一种网络攻击方式&#xff0c;攻击者通过某种手段获取到用户的会话标识&#xff08;Session ID&#xff09;&#xff0c;然后使用这个会话标识冒充合法用户进行恶意操作。这种攻击方式允许攻击者以合法用户的身份访问受…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-15.4讲--ARM异常中断返回

前言&#xff1a; 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸机篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

智慧公厕解决什么问题?实现了什么样的价值?

公共厕所一直是城市管理的难题&#xff0c;常常面临着卫生条件不佳、管理不善以及使用体验差等问题。为了解决这些困扰城市的难题&#xff0c;智慧公厕应运而生。智慧公厕不仅应用了信息化和数字化技术&#xff0c;还通过全方位的智能化应用&#xff0c;彻底改变了传统公厕的面…

iframe的替代方案有吗?做页面嵌套界面套娃

UIOTOS可以了解下&#xff0c;uiotos.net&#xff0c;通过连线来代替脚本逻辑开发&#xff0c;复杂的交互界面&#xff0c;通过页面嵌套轻松解决&#xff0c;是个很新颖的思路&#xff0c;前端零代码&#xff01; 蓝图连线尤其是独创的页面嵌套和属性继承技术&#xff0c;好家…

韩顺平0基础学Java——第8天

p155-168 数组&#xff08;第六章&#xff09; 数组可以存放多个同一类型的数据&#xff0c;数组也是一种数据类型&#xff08;引用类型&#xff09;。 即&#xff0c;数组就是一组数据~ 例&#xff1a;double [] hens {1,2,3,4,5,6}; 新建了一组鸡&#xff0c;里面有6个。…