ethtool 调用流程

2024-05-11 11:12
文章标签 流程 调用 ethtool

本文主要是介绍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;};


 

这篇关于ethtool 调用流程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/979370

相关文章

redis-sentinel基础概念及部署流程

《redis-sentinel基础概念及部署流程》RedisSentinel是Redis的高可用解决方案,通过监控主从节点、自动故障转移、通知机制及配置提供,实现集群故障恢复与服务持续可用,核心组件包... 目录一. 引言二. 核心功能三. 核心组件四. 故障转移流程五. 服务部署六. sentinel部署

SpringBoot集成XXL-JOB实现任务管理全流程

《SpringBoot集成XXL-JOB实现任务管理全流程》XXL-JOB是一款轻量级分布式任务调度平台,功能丰富、界面简洁、易于扩展,本文介绍如何通过SpringBoot项目,使用RestTempl... 目录一、前言二、项目结构简述三、Maven 依赖四、Controller 代码详解五、Service

Java调用Python脚本实现HelloWorld的示例详解

《Java调用Python脚本实现HelloWorld的示例详解》作为程序员,我们经常会遇到需要在Java项目中调用Python脚本的场景,下面我们来看看如何从基础到进阶,一步步实现Java与Pyth... 目录一、环境准备二、基础调用:使用 Runtime.exec()2.1 实现步骤2.2 代码解析三、

MySQL 临时表与复制表操作全流程案例

《MySQL临时表与复制表操作全流程案例》本文介绍MySQL临时表与复制表的区别与使用,涵盖生命周期、存储机制、操作限制、创建方法及常见问题,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随小... 目录一、mysql 临时表(一)核心特性拓展(二)操作全流程案例1. 复杂查询中的临时表应用2. 临时

Python如何调用另一个类的方法和属性

《Python如何调用另一个类的方法和属性》在Python面向对象编程中,类与类之间的交互是非常常见的场景,本文将详细介绍在Python中一个类如何调用另一个类的方法和属性,大家可以根据需要进行选择... 目录一、前言二、基本调用方式通过实例化调用通过类继承调用三、高级调用方式通过组合方式调用通过类方法/静

C#控制台程序同步调用WebApi实现方式

《C#控制台程序同步调用WebApi实现方式》控制台程序作为Job时,需同步调用WebApi以确保获取返回结果后执行后续操作,否则会引发TaskCanceledException异常,同步处理可避免异... 目录同步调用WebApi方法Cls001类里面的写法总结控制台程序一般当作Job使用,有时候需要控制

Python用Flask封装API及调用详解

《Python用Flask封装API及调用详解》本文介绍Flask的优势(轻量、灵活、易扩展),对比GET/POST表单/JSON请求方式,涵盖错误处理、开发建议及生产环境部署注意事项... 目录一、Flask的优势一、基础设置二、GET请求方式服务端代码客户端调用三、POST表单方式服务端代码客户端调用四

MySQL 升级到8.4版本的完整流程及操作方法

《MySQL升级到8.4版本的完整流程及操作方法》本文详细说明了MySQL升级至8.4的完整流程,涵盖升级前准备(备份、兼容性检查)、支持路径(原地、逻辑导出、复制)、关键变更(空间索引、保留关键字... 目录一、升级前准备 (3.1 Before You Begin)二、升级路径 (3.2 Upgrade

Python跨文件实例化、跨文件调用及导入库示例代码

《Python跨文件实例化、跨文件调用及导入库示例代码》在Python开发过程中,经常会遇到需要在一个工程中调用另一个工程的Python文件的情况,:本文主要介绍Python跨文件实例化、跨文件调... 目录1. 核心对比表格(完整汇总)1.1 自定义模块跨文件调用汇总表1.2 第三方库使用汇总表1.3 导

使用Python的requests库调用API接口的详细步骤

《使用Python的requests库调用API接口的详细步骤》使用Python的requests库调用API接口是开发中最常用的方式之一,它简化了HTTP请求的处理流程,以下是详细步骤和实战示例,涵... 目录一、准备工作:安装 requests 库二、基本调用流程(以 RESTful API 为例)1.