网络接口

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#define IFF_POINTOPOINT 0x10 #define IFF_NOTRAILERS 0x20 #define IFF_RUNNING 0x40 2004-01-04
/* interface is has p-p link */
保留所有权利 陈国强 2003.12
PDF created with pdfFactory Pro trial version www.pdffactory.com
0245: unsigned long 2004-01-04
mem_end; /* shared mem end */ 保留所有权利 陈国强 2003.12
PDF created with pdfFactory Pro trial version www.pdffactory.com
Linux 内核网络实现分析 0246: 0247: 0248: 0249: 0255: unsigned char if_port; /* Selectable AUI, TP,..*/ unsigned long unsigned long unsigned int mem_start; base_addr; irq; /* shared mem start */ /* device I/O address*/ */
硬件地址长度,最长为8字节(#define MAX_ADDR_LEN 0291: unsigned short hard_header_len;
/* hardware hdr length
接口可以保留的一些私有数据 0292: void *priv; /* pointer to private data */
0260: struct net_device *next;
网卡的初始化代码,相等于C语言的main函数,只被执行一次
0263: 0264: int (*init)(struct net_device *dev);
软中断调度时需要,介绍net软中断时再详细讨论,这里略
0267: struct net_device *next_sched;
PDF created with pdfFactory Pro trial version www.pdffactory.com
Linux 内核网络实现分析
文档密级
2.1 net_device 结构详解
在Linux内核里,使用net_device结构来定义网络设备,每个网络设备被加载后,都对应 一个具体的net_device实例。net_device是一个非常复杂的结构,使用了将近200行代码来定 义它, 正如作者所注释的, 定义这样一个复杂的结构是一个很大的错误 “Actually, this whole ( structure is a big mistake”),它将最底层的IO端口、共享内存地址、上层协议指针等等都 罗列进来了。从软件编程的角度来讲,确实没有必要将IO端口、DMA端口定义到一个抽象 的net_device结构中,设备驱动程序完全可以将这些其它人不感兴趣的信息收藏起来。据悉 在2.6版本的内核里面,系统准备用一个kobject结构来表示所有的设备,网络设备再在这个 基础上继承,相信在2.6版本的内核里面,net_device结构会大大地简化。 不管怎么说,我们还是得研究这个结构。为了便于理解,笔者将net_device做如下简化 描述: struct net_device { //检索信息,定义设备的名字、接口的编号(唯一标识用) //设备的物理信息,如IO、DMA、SHMEM、IRQ等 //接口类型;如"BNC", "10baseT", "AUI", "100baseT", "100baseTX",等 //接口状态,是否启动、网线是否拔掉等等 //各种对接口进行操作的函数指针 //报文输出队列 //二层地址信息,包括硬件地址、广播地址、多播地址 //比结构层高一次的协议指针,如IP层,主要是用于将IP层等与接口层捆绑 } 下面结合源代码详细讲解:
0229: struct net_device 0230: { 0237: 0238: /*网卡的物理信息,不必关心*/ 0243: 0244: unsigned long unsigned long rmem_end; rmem_start; /* shmem "recv" end */ /* shmem "recv" start*/ 第 2 页, 共 14 页 char name[IFNAMSIZ];
接口的编号, 不同网卡的编号是不会重复的。 iflink是为了与以前的内核保持兼容而保留的, iflink=ifinwenku.baidu.comex。
0270: 0271: 0272: 获取接口的统计信息 0274: 0275: 0276: 0284: 0285: unsigned long unsigned long trans_start; last_rx; /* Time (in jiffies) of last Tx */ */ /* Time of last Rx struct net_device_stats* (*get_stats)(struct net_device *dev); struct iw_statistics* (*get_wireless_stats)(struct net_device *dev); int int ifindex; iflink;
#define IFF_PORTSEL 0x2000 #define IFF_DYNAMIC 0x8000
/* dialup device with changing addresses*/ flags; gflags;
mtu; /* interface MTU value
硬件类型,以太网卡为ARPHRD_ETHER类型,宏定义见if_arp.h文件 0290: unsigned short type; /* interface hardware type */ 8),以太网为6字节 */
在Linux内核里面虽然定义了这样一种层次结构,但是几乎没有使用过。至少对以太网类型的接口如此 0294: 0295: 0296: 地址信息,下面有专门描述 0299: 0300: 0301: 0302: 0303: 0304: 0305: 0306: 0307: 0308: 0309: 0310: 0311: 0314: 0315: void void *atalk_ptr; /* AppleTalk link *ip_ptr; /* IPv4 specific data */ 第 4 页, 共 14 页 */ int watchdog_timeo; struct timer_list watchdog_timer; struct dev_mc_list int int int *mc_list; /* Multicast mac addresses */ mc_count; /* Number of installed mcasts */ promiscuity; allmulti; unsigned char unsigned char unsigned char unsigned char broadcast[MAX_ADDR_LEN]; /* hw bcast add */ pad; /* make dev_addr aligned to 8 bytes */ */ dev_addr[MAX_ADDR_LEN]; /* hw address */ addr_len; /* hardware address length struct net_device *master; /* Pointer to master device of a group, * which this device is member of. */
文档密级
/* device IRQ number
/*网卡的物理信息,不必关心*/ 0256: 0258: unsigned char unsigned long dma; state; /* DMA channel */
链表的下一个结点指针。系统启动时探测网卡时也使用到这个指针,系统定义8块网卡,将这8块网卡一 个一个地串起来,然后一次探测。详见space.c文件
/* receive all multicast packets*/ /* master of a load balancer /* slave of a load balancer */ /* Supports multicast /* can set media type /* auto media select active /* interface flags (a la BSD) */
本章说明为所有网络接口维护的通用数据结构。 为了说明相关的数据结构和算法, 我们 只参考了以太网类型的接口,并且以3COM公司的3c501网卡的驱动程序为例子(笔者发现 的一个最简单的网卡驱动程序)。
1.1 相关文件介绍
文件 /include/linux/netdevice.h /net/core/dev.c /drivers/net/space.c /drivers/net/net_init.c /drivers/net/* 说明 接口层数据结构、宏定义、常量等 协议无关的设备支持例程实现 网卡的初始化配置信息,系统启动时探测使用 网卡初始化程序 网络设备驱动程序
Linux 内核网络实现分析 #define IFF_NOARP 0x80 /* no ARP protocol /* receive all packets */ */ */ */ */ */ */
文档密级
#define IFF_PROMISC 0x100 #define IFF_ALLMULTI 0x200 #define IFF_MASTER 0x400 #define IFF_SLAVE 0x800 0x1000 0x4000 #define IFF_MULTICAST #define IFF_AUTOMEDIA 0287: 0288: 0289: unsigned short unsigned short unsigned
标准的BSD Socket接口标志定义,宏定义如下: #define IFF_UP #define IFF_DEBUG 0x1 0x2 0x8 0x4 /* interface is up /* turn on debugging /* is a loopback net /* avoid use of trailers /* resources allocated */ */ */ */ */ 第 3 页, 共 14 页 #define IFF_BROADCAST #define IFF_LOOPBACK /* broadcast address valid */
Linux 内核网络实现分析
文档密级
第三章 网络接口
1 概述
本章讨论的接口层位于协议栈的最底部, 它包括在本地网上发送的硬件和软件。 我们使 用术语网络设备驱动程序来表示与硬件及网络接口通信的软件。 网络接口是指在一个特定网 络硬件与设备驱动器之间的接口。 Linux使用面向对象的方法来定义一种与硬件无关的编程接口,这个编程接口为所有设 备提供以下支持: l l l l 一套精心定义的接口函数,如初始化、打开、关闭、析构、发送、配置等等; 一套标准的统计与控制标志; 一套与设备无关的存储协议地址的方法; 一个标准的可扩展的输出分组排队方法(流控机制);
2 网络接口在内核的实现
在2.4 版本的内核里面,有三种类型的设备: 1、 字符型设备,如键盘、鼠标、串口、等等; 2、 块设备,典型的有硬盘驱动器等; 3、 网络设备。这种设备也可以虚拟,如PPP协议的网络设备就是建立在串口设备上的。
2004-01-04 保留所有权利 陈国强 2003.12 第 1 页, 共 14 页
相关文档
最新文档