网络设备之pci_driver

每个pci驱动都有一个pci_driver实例,用以描述驱动名称,支持的设备信息,以及对应的操作函数;

 1 /*
 2     描述一个pci设备,每个pci驱动必须创建一个pci_driver实例
 3 */
 4 struct pci_driver {
 5     struct list_head node;
 6     /* 驱动程序名,内核中所有pci驱动程序名都是唯一的 */
 7     const char *name;
 8     /* pci设备配置信息数组 */
 9     const struct pci_device_id *id_table;    /* must be non-NULL for probe to be called */
10     /* 设备插入内核时调用 */
11     int  (*probe)  (struct pci_dev *dev, const struct pci_device_id *id);    /* New device inserted */
12     /* 设备从内核移除时调用 */
13     void (*remove) (struct pci_dev *dev);    /* Device removed (NULL if not a hot-plug capable driver) */
14     /* 设备被挂起时调用 */
15     int  (*suspend) (struct pci_dev *dev, pm_message_t state);    /* Device suspended */
16     int  (*suspend_late) (struct pci_dev *dev, pm_message_t state);
17     int  (*resume_early) (struct pci_dev *dev);
18     /* 设备被恢复时调用 */
19     int  (*resume) (struct pci_dev *dev);                    /* Device woken up */
20     /* 设备关闭时调用 */
21     void (*shutdown) (struct pci_dev *dev);
22     int (*sriov_configure) (struct pci_dev *dev, int num_vfs); /* PF pdev */
23     /* 错误处理 */
24     const struct pci_error_handlers *err_handler;
25     struct device_driver    driver;
26     struct pci_dynids dynids;
27 };

以e100为例,在驱动初始化过程中,会调用pci_register_driver来注册pci_driver实例;

 1 static const struct pci_error_handlers e100_err_handler = {
 2     .error_detected = e100_io_error_detected,
 3     .slot_reset = e100_io_slot_reset,
 4     .resume = e100_io_resume,
 5 };
 6
 7 static struct pci_driver e100_driver = {
 8     .name =         DRV_NAME,
 9     .id_table =     e100_id_table,
10     .probe =        e100_probe,
11     .remove =       e100_remove,
12 #ifdef CONFIG_PM
13     /* Power Management hooks */
14     .suspend =      e100_suspend,
15     .resume =       e100_resume,
16 #endif
17     .shutdown =     e100_shutdown,
18     .err_handler = &e100_err_handler,
19 };
20
21 static int __init e100_init_module(void)
22 {
23     if (((1 << debug) - 1) & NETIF_MSG_DRV) {
24         pr_info("%s, %s\n", DRV_DESCRIPTION, DRV_VERSION);
25         pr_info("%s\n", DRV_COPYRIGHT);
26     }
27     return pci_register_driver(&e100_driver);
28 }
29
30 static void __exit e100_cleanup_module(void)
31 {
32     pci_unregister_driver(&e100_driver);
33 }
34
35 module_init(e100_init_module);
36 module_exit(e100_cleanup_module);
时间: 2024-10-20 19:29:13

网络设备之pci_driver的相关文章

Linux网络设备驱动结构概述

网络设备驱动相比字符型设备的驱动要复杂一些,除了总体上驱动的框架有一些相似外,有很多地方都是不同,但网络设备驱动有一个很大的特点就是有固定的框架可以遵循,具体的框架会在后边详细的叙述.1.网络协议接口层在网络协议接口层,只提供了两个抽象函数dev_queue_xmit()与 netif_rx(),之所以称之为抽象函数,是因为这两个函数抽象了很多底层的操作,不管是那个芯片它在网络协议结构的操作函数都是这两个函数,采用这样的抽象后,给上层带来了很多的方便,给上层协议提供统一的数据包收发接口,无论上层

网络设备

PCI设备 很多网络设备都是基于PCI接口的.因此尽管网络设备驱动比较特殊,但也要作为PCI驱动注册到内核中. PCI接口等定义.网络设备驱动相关定义涉及以下文件: include/linux/mod_devicetable.h 定义导出到用户控件的PCI设备信息 include/linux/pci.h 定义PCI接口驱动相关的结构.宏等 include/linux/netdevice.h 定义网络设备结构.宏等 include/linux/inetdevice.h 定义IPV4专用的网络设备相

网络设备-批量自动配置备份软件Kiwi cattools使用介绍

先说下,以往常见配置备份和变更后,运维工程师的痛点.维护的设备越多越容易出错.几台还勉强能做好,一旦体量超过20台以上后,很多配置备份都会或多或少出现不少问题. 所以这里也特意挑了一款软件,简单的聊聊这工具确实不错.上菜,各位注意!! 安装文档,和安装软件,暂时不贴出来.拒绝伸手党.!!!! Kiwi cattools 网络设备配置备份管理软件操作文档 第一步:如下为打开界面一览. 第二步:现在开始新增设备(Juniper-SSG140)为例:点击Add PS:还是能支持很多类型的,如下所示 D

zabbix自动监控网络设备juniper防火墙

1.配置juniper防火墙SNMP 登陆到juniper页面或使用SSH链接配置,此处使用web界面配置 1)定位到Configuration > Report Settings > SNMP,配置端口管理信息如图 2)点击New Community创建团体名,配置版本等,如图: 3)在Host IP Address/Netmask填写链接IP地址和子网,选择版本,点击Add添加 4)定位到Network > Interfaces (List)选择链接接口编辑,勾选允许snmp链接 到

物理层、数据链路层网络设备工作原理

物理层网络设备有中继器.集线器. 中继器的功能是将接收到的信号进行再放大然后传输出去,作用是将扩展网络设备信号传输的物理范围,缺点是扩大数据信号的同时也扩大的噪声,不能够进行广播隔离,网络利用率很低,现在基本上已经被淘汰. 集线器实际上可以理解为有多个端口的中继器,集线器的所有端口共享一条背板总线,故所有端口都在同一个冲突域,网络利用率低,基本已经淘汰. 数据链路层网络设备有网桥.交换机. 网桥工作在数据链路层,能够通过源主机的mac地址,自学习创建自己的"mac-端口"表,一旦这个&

浅谈 Linux 内核开发之网络设备驱动

网络设备介绍 网络设备是计算机体系结构中必不可少的一部分,处理器如果想与外界通信,通常都会选择网络设备作为通信接口.众所周知,在 OSI(Open Systems Interconnection,开放网际互连)中,网络被划分为七个层次,从下到上分别是物理层.数据链路层.网络层.传输层.会话层.表示层和应用层.我们所讲的网络设备也包括两个层次,一层叫做 MAC(Media Access Control)层,对应于 OSI 的数据链路层:另一层叫做 PHY(Physical Layer)层,对应于物

zabbix通过自动发现功能实现自动识别网络设备接口

由于之前网络设备不是很多,监控网络设备接口就直接使用模版中的item来实现了,可是现在公司上线了一大批网络设备,如果要每个网络设备都做模板,添加item......那就该废了,于是迫于压力今天来测试使用zabbix的自动发现功能实现自动发现网络设备接口,并且自动获取接口的流量值,生成流量图等功能. 这样的话就能节省大量时间,时间就是生命啊,把时间浪费在枯燥的添加网络接口的工作上就是在浪费生命!好了,废话不多说,进入正题: 首先,在交换机上面配置好snmp协议,为了简单,这里目前使用的是snmp

从veth看虚拟网络设备的qdisc

背景 前段时间在测试docker的网络性能的时候,发现了一个veth的性能问题,后来给docker官方提交了一个PR,参考set tx_queuelen to 0 when create veth device,引起了一些讨论.再后来,RedHat的网络专家Jesper Brouer 出来详细的讨论了一下这个问题. 可以看到,veth设备qdisc队列,而环回设备/桥接设备是没qdisc队列的,参考br_dev_setup函数. 内核实现 在注册(创建)设备时,qdisc设置为noop_qdis

网络设备驱动程序框架

1网络设备驱动程序框架可以分为四层 网络协议接口层----------------------------------------------------------------------------------------------------------数据的发送                                                                数据的接收                      hard_start_xmit(struct