随笔分类 -  Linux内核协议栈

摘要:在注销网络设备时,会调用pci_driver->remove函数,以e100网卡驱动为例,实际调用e100_remove,该函数调用函数unregister_netdev进行设备注销操作; 函数调用关系图如下,注销分为两步: (1) 回滚注册操作,进行初步注销,过程中如果设备尚未关闭,则需先调用de 阅读全文
posted @ 2017-09-15 14:33 AlexAlex 阅读(1603) 评论(0) 推荐(0)
摘要:注册网络设备时,会调用pci_driver->probe函数,以e100网卡驱动为例,在调用alloc_ehterdev分配内存之后,会接着调用register_netdev进行设备注册,注册过程包含部分成员初始化,注册到文件系统,消息通知等; 1 /** 2 * 设备注册函数调用关系图 3 * e 阅读全文
posted @ 2017-09-15 14:17 AlexAlex 阅读(1724) 评论(0) 推荐(0)
摘要:在注册网络设备时,会调用pci_driver->probe函数,以e100网卡驱动为例,其最终会调用alloc_netdev_mqs来分配内存,并且在分配内存后调用setup函数(以太网为ether_setup)初始化二层地址等信息。下面以e100为例,分析alloc_netdev_mqs函数和et 阅读全文
posted @ 2017-09-15 14:10 AlexAlex 阅读(3404) 评论(0) 推荐(0)
摘要:net_device结构是二层中一个非常重要的结构,其结构中成员很多,包含了硬件信息,接口信息,其他辅助信息,以及设备操作函数等等;下面对其中重要的字段含义进行了标注,目前仍在阅读代码过程中,其中某些字段含义会在后面进行补充或者更新; 1 struct net_device { 2 /* 设备名称, 阅读全文
posted @ 2017-09-15 14:00 AlexAlex 阅读(10044) 评论(0) 推荐(0)
摘要:每个pci驱动都有一个pci_driver实例,用以描述驱动名称,支持的设备信息,以及对应的操作函数; 1 /* 2 描述一个pci设备,每个pci驱动必须创建一个pci_driver实例 3 */ 4 struct pci_driver { 5 struct list_head node; 6 / 阅读全文
posted @ 2017-09-15 13:46 AlexAlex 阅读(3147) 评论(0) 推荐(0)
摘要:标准PCI设备都有一个配置寄存器,用来存储各种参数; 1 /* pci设备配置寄存器 */ 2 struct pci_device_id { 3 /* 厂商id,设备id */ 4 __u32 vendor, device; /* Vendor and device ID or PCI_ANY_ID 阅读全文
posted @ 2017-09-15 13:41 AlexAlex 阅读(5418) 评论(0) 推荐(0)
摘要:Kernel: 4.12.6 每个cpu都有自己的softnet_data结构,用来处理数据包接收,但是当softnet_data所在cpu无法工作时,即CPUHP_NET_DEV_DEAD状态,就需要将工作转交给其他cpu处理; 1 static int dev_cpu_dead(unsigned 阅读全文
posted @ 2017-08-23 21:59 AlexAlex 阅读(401) 评论(0) 推荐(0)
摘要:概述 本文主要介绍二层收包流程,包括NAPI与非NAPI方式; NAPI方式 数据包到来,第一个数据包产生硬件中断,中断处理程序将设备的napi_struct结构挂在当前cpu的待收包设备链表softnet_data->poll_list中,并触发软中断,软中断执行过程中,遍历softnet_dat 阅读全文
posted @ 2017-08-23 17:11 AlexAlex 阅读(3441) 评论(0) 推荐(2)
摘要:Kernel: 4.12.6 网络设备初始化,主要包括初始化softnet_data,注册收发包软中断等; 1 static int __init net_dev_init(void) 2 { 3 int i, rc = -ENOMEM; 4 5 BUG_ON(!dev_boot_phase); 6 阅读全文
posted @ 2017-08-22 23:08 AlexAlex 阅读(1003) 评论(0) 推荐(0)
摘要:Kernel: 4.12.6 deinet_ioctl:获取或者设置接口的地址,掩码,标记等信息; 注意,使用SIOCSIFFLAGS关闭设备,如果使用了别名,则删除对应ip,如果其为主ip,并且从ip未设置提升主ip,则所有从ip也会删除; int devinet_ioctl(struct net 阅读全文
posted @ 2017-08-19 12:34 AlexAlex 阅读(985) 评论(0) 推荐(0)
摘要:Kernel: 4.12.6 添加ip地址:主从ip的判断,并且插入到合适的位置中; static int __inet_insert_ifa(struct in_ifaddr *ifa, struct nlmsghdr *nlh, u32 portid) { struct in_device *i 阅读全文
posted @ 2017-08-18 23:31 AlexAlex 阅读(764) 评论(0) 推荐(0)
摘要:ifa_local 和 ifa_address区别联系: 1. 在配置了支持广播的接口上,与IFA_LOCAL一样,同样表示本地ip地址; 2. 对于点对点链路,IFA_ADDRESS表示的是对端的地址,IFA_LOCAL表示的是本地ip地址; inetdevice.h struct in_ifad 阅读全文
posted @ 2017-08-18 00:04 AlexAlex 阅读(2419) 评论(0) 推荐(0)