版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Linux内核数据包处理进程-接收数据包本文不是分析NIC驱动程序接收数据包,而是以e100为例,对NIC驱动程序进行了说明。当然,您对数据包接收很熟悉。前才接收数据包作者:肯多Kernel:2.6.12首先,从网卡开始这不是网卡驱动分析的专门文档,而是侧重于网卡处理数据包的过程的分析。以下是Intel e100驱动程式的范例分析。大多数网卡是具有标准配置寄存器的PCI设备,其中包含有关PCI设备的供应商ID、设备ID等的信息程序使用用于描述这些寄存器的标识符。以下是:代码:Structpci _ device _ id_u32 vendor,设备;/* vendor and device i
2、d or PCI _ any _ id */_u32 subvendor,subdevice/* Subsystem IDs or PCI_ANY_ID */_ _ _u32类,class _ mask/* (class、subclass、Prog-if) triplet */Kernel _ ulong _ t driver _ data/* Data private to the driver */这样,驱动程序就会经常看到定义struct pci_device_id类型的数组,通知内核支持不同的类型E100驱动器中的PCI设备列表:# define Intel _ 8255 x _ Et
3、hernet _ device(device _ id,ich) Pci _ vendor _ id _ Intel、device _ id、PCI _ any _ id、PCI _ any _ id、Pci _ class _ network _ Ethernet 8、0xffff00、ichstatic struct PCI _ device _ id e100 _ id _ table=Intel _ 8255 x _ Ethernet _ device(0x 1029,0)、Intel _ 8255 x _ Ethernet _ device(0x 1030,0)、Intel _ 82
4、55 x _ Ethernet _ device(0x 1031,3)、./*跳过许多支持的设备*/0,内核使用structPCI _ driver结构描述的一个PCI设备。Structpci _ driverStruct list _ head nodeChar * nameStruct module * ownerconststructpci _ device _ id * id _ table;/* must be non-null for probe to be called */Int (* probe) (structpci _ dev * dev,conststruct PCI
5、_ device _ id * id);/* New device inserted */void(* remove)(struct PCI _ dev * dev);/* device removed(null if not a hot-plug capable driver)*/int(* suspend)(struct PCI _ dev * dev,pm _ message _ t state);/* Device suspended */int(* resume)(struct PCI _ dev * dev);/* Device woken up */int(* enable _
6、wake)(struct PCI _ dev * dev,PCI _ power _ t state,int enable);/* Enable wake event */void(* shut down)(struct PCI _ dev * dev);Struct device _ driver driverStructpci _ dy NIDS NIDS系统启动时检测到PCI设备,因此发现内核中已检测到的设备与注册的id_table中的信息相匹配。以E100为例,触发驱动探测函数。/*定义名为* e100_driver的PCI设备* 1,设备的检查函数为e100 _ probe* 2,设
7、备的id_table表为e100_id_table*/static struct PCI _ driver e100 _ driver=.name=DRV_NAME,.id_table=e100_id_table,.探测=e100 _探测、.remove=_devexit_p(e100_remove)、#ifdef CONFIG_PM.suspend=e100_suspend,.resume=e100_resume,#endif.driver=.shutdown=e100_shutdown,这样,如果系统检测到存在与id_table对应的设备,则会调用驱动探测函数。驱动程序设备从init函数调
8、用PCI_module_init函数以初始化PCI设备e100_driver:static int _ _ initce 100 _ init _ module(void)if(1 debug)-1)NETIF _ MSG _ DRV)printk(kern _ info pfx“% s”、% s n“、drv _ description、drv _ version);printk(kern _ info pfx“% s n”,drv _ copyright);return PCI _ module _ init(e100 _ driver);如果一切顺利,内核将调用注册的e100_probe
9、函数,该函数执行以下两个重要任务:1、网络设备分配/初始化/注册2、完成PCI设备的I/O区域分配和映射,并完成其他硬件初始化任务:网络设备使用struct net_device结构进行描述,该结构非常大,可以在许多重要的参考书籍中参考Linux设备驱动程序中有关以网卡为中心的设计的章节。在后面的内容中,我将注释那个重要成员;调用探测函数时,调用register_netdev函数发现可以将网络设备注册到内核的支持网卡,在注册之前,调用alloc_etherdev分析以太网网络的net_device并初始化重要成员。除了在内核中注册网络设备外,检查功能的另一个重要任务是初始化硬件。例如,要访问相
10、应的I/O区域,需要向I/O区域分配内存区域,然后映射的一般过程如下:1,request_mem_region()2,ioremap()对于常规PCI设备,您可以调用:1,pci_request_regions()2,ioremap()PCI_request_regions函数对PCI的所有6个寄存器调用资源分配函数(必须确定是I/O端口还是I/O内存)以请求。例如:代码:int PCI _ request _ regions(struct PCI _ dev * pdev,char * RES _ name)int I;for(I=0);I 6;I)If (PCI _ request _ r
11、egion (pdev,I,RES _ name)Goto err _ outreturn 0;代码:int PCI _ request _ region(struct PCI _ dev * pdev,intbar,char * RES _ name)If (PCI _ resource _ len (pdev,bar)=0)return 0;If (PCI _ resource _ flags (pdev,bar) ioresource _ io) If(!request _ region(PCI _ resource _ start(pdev,bar)、Pci _ resource _
12、len (pdev,bar,RES _ name)Goto err _ outElseif (PCI _ resource _ flags (pdev,bar) ioresource _ mem) If(!request _ mem _ region(PCI _ resource _ start(pdev,bar)、Pci _ resource _ len (pdev,bar,RES _ name)Goto err _ outreturn 0;结合这些基础,我们将讨论设备的检测功能。static int _ _ devinity e100 _ probe(struct PCI _ dev *
13、pdev、Const struct pci_device_id *ent)Struct net _ device * netdevStruct NIC * nicInt err/*网络设备分配*/If(!(netdev=alloc _ ether dev(size of(struct NIC)if(1 debug)-1)NETIF _ MSG _ PROBE)printk(kern _ err pfx ether dev alloc failed,abort . n );return-ENOMEM;/*设置每个成员指针函数*/netdev-open=e100 _ open;netdev-sto
14、p=e100 _ close;netdev-hard _ start _ xmit=e100 _ xmit _ frame;netdev-get _ stats=e100 _ get _ stats;netdev-set _ multicast _ list=e100 _ set _ multicast _ list;netdev-set _ MAC _ address=e100 _ set _ MAC _ address;netdev-change _ MTU=e100 _ change _ MTU;netdev-do _ ioctl=e100 _ do _ ioctl;Set _ etht
15、ool _ ops (netdev,e100 _ ethtool _ ops);netdev-tx _ time out=e100 _ tx _ time out;netdev-watchdog _ timeo=e100 _ watchdog _ period;netdev-poll=e100 _ poll;netdev-WEIGHT=E100 _ NAPI _ WEIGHT;# ifdefconfig _ net _ poll _ controllernetdev-poll _ controller=e100 _ net poll;#endif/*设置网络设备名称*/Strcpy (netdev-name,PCI _ name(pdev);/*获取设备个人数据结构*/NIC=netdev _ priv(netdev);/*网络设备指针,指向自己*/NIC-netdev=netdev;/*PCIy设备指针,指向自己*/NIC-pdev=pdev;NIC-msg _ enable=(1 debug)-1;/*将PCI设备的个人数据区域指向网络设备*/Pci_set_drvdata(pdev,netdev);/*启用PCI设备*/if(err=PCI _ e
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026地铁藏宝面试题及答案
- 设备维护服务报价商洽3篇范文
- 2026故宫应届生面试题及答案
- 2026国企会计面试题及答案
- 2026恒生大学面试题库及答案
- 2026护理职高面试题及答案
- 健康生活我先行:关注身心健康的四大基石小学主题班会课件
- 关于提交项目设计变更申请的通知(4篇范文)
- 服装店员工着装规范执行指南
- 警惕网络诈骗守护数字安全小学主题班会课件
- 竹质材料创新应用与产业链可持续发展
- 临床科室备用药品管理培训
- 有限空间作业监理实施细则
- 学校延时服务奖惩制度
- 安徽省2026届数学高一下期末考试试题含解析
- 卫生院学术期刊预警制度
- 数字化教学能力培训课件
- HAMA焦虑量表(14项)详解及使用
- 上海市园林工程估算指标(SHA2-12-2025)
- DB50∕T 1064-2020 山地茶园机械化生产技术规程
- 河北省西学中结业考试题目及答案
评论
0/150
提交评论