第4章 接口以太网(3)

2019-09-01 18:53

图4.23 结构ifreq

262-279 一个ifreq结构在ifr_name中包含一个接口的名称。在这个联合中的其他

成员被各种ioctl命令访问。通常,用宏来简化对这个联合的成员的访问语法。

图4.24 结构ifconf

292-300 在结构ifconf中,ifc_len是ifc_buf指向的缓存的字节数。这个缓存由

一个进程分配但由ifconf用一个可变长ifreq结构来填充。对于函数ifconf,ifr_addr是结构ifreq中这个联合的相关成员。每个ifreq结构有一个可变长度,因为ifr_addr(一个sockaddr结构)的长度根据地址的类型是可变的。必须用结构sockaddr的成员sa_len来定位每项的结束。图4.25说明了ifconf所维护的数据结构。

图4.25 ifconf数据结构

在图4.25中,左边的数据在内核中,而右边的数据在一个进程中。我们用这个图来讨论图4.26中所示的ifconf函数。 462-474 ifconf的两个参数是:cmd,它被忽略;data,它指向此进程指定的ifconf结构的一个副本。

ifc是强制为一个ifconf结构指针的data。ifp从ifnet(列表头)开始遍历接口列表,并且ifa遍历每个接口的地址列表。cp和ep控制构造在ifr中的接口文本名称,ifr是一个ifreq结构,它在接口名称和地址复制到进程的缓存前保存接口名称和地址。ifrq指向这个缓存并且在每个地址被复制后指向下一个。space是进程缓存中剩余字节的个数,cp用来搜寻名称的结束,而ep标志接口名称数字部分最后的可能位置。

图4.26 函数ifconf

475-488 for循环遍历接口列表。对于每个接口,文本名称被复制到ifr_name,在

ifr_name的后面跟着if_unit成员的文本表示。如果没有给接口分配地址,一个全0的地址被构造,所得的ifreq结构被复制到进程中,并减小space,增加ifrp。

489-515 如果接口有一个或多个地址,用for循环来处理每个地址。地址加到ifr中的接口名称中,然后ifr被复制到进程中。长度超过标准sockaddr结构的地址不放到ifr中,并且直接复制到进程。在复制完每个地址后,调整space和ifrp的值。所有接口处理完后,更新缓存长度(ifc->ifc_len)并且ifconf返回。系统调用ioctl负责将结构ifconf中新的内容复制回进程中的结构ifconf。 举例 图4.27显示了以太网、SLIP和环回接口被初始化后的接口结构的配置。

图4.27 接口和地址数据结构

图4.28显示了以下代码执行后的ifc和buffer的内容。

4—11

(见原文p.120的①)

这里对命令SIOCGIFCONF操作的插口的类型没有限制,如我们所看到的,这个命令返回所有协议族类的地址。

在图4.28中,因为在缓存中返回的三个地址仅占用108(3 ? 36)字节,ioctl将ifc_len由144改为108。返回三个sockaddr_dl地址并且这个缓存后面的36字节未用。每项的前16个字节包含接口的文本名称。在这里,这16字节中只有3个字节被使用。

图4.28 SIOCGIFCONF命令返回的数据结构

ifr_addr为一个sockaddr结构的格式,因此第一个值为长度(20字节)并且第二个值为地址的类型(18,AF_LINK)。下一个值为sdl_index,与sdl_type一样,对于每个接口它是不同的(与IFT_ETHER,IFT_SLIP和IFT_LOOP相对应的值为6,28和24)。

下面三个值为sa_nlen(文本名称的长度),sa_alen(硬件地址的长度)及sa_slen(未用)。对于所有三项sa_nlen都为3。以太网地址的sa_alen为6,而SLIP和环回接口的sa_alen为0。sa_slen总是为0。 最后,是接口的文本名称,后面是硬件地址(仅对于以太网)。SLIP和环回接口在sockaddr_dl结构中不存放一个硬件级地址。

在此例,仅返回sockaddr_dl地址(因为在图4.27中没有配置其他地址类型),因此缓存中的每项大小一样。如果为每个接口配置其他地址(例如:IP或OSI地址),他们会同sockaddr_dl地址一起返回,并且每项的大小根据返回的地址类型的不同而不同。

通用接口ioctl命令

图4.20剩下的四个接口命令(SIOCGIFFLAGS,SIOCGIFMETRIC,SIOCSIFFLAGS和SIOCSIFMETRIC)由函数ifioctl处理。图4.29所示的是处理这些命令的case语句。 SIOCGIFLAGS和SIOCGIFMETRIC 410-416 对于两个SIOCGxxx命令,ifioctl将每个接口的if_flags或if_metric值复制到ifreq结构中。对于标志,使用联合成员ifr_flags,而对于度量,使用成员ifr_metric(图4.23)。

图4.29 函数ifioctl:标志和度量

SIOCSIFFLAGS

417-429 为改变接口的标志,调用进程必须有超级用户权限。如果进程正在关闭一个运

行的接口或启动一个未运行的接口,分别调用if_down和if_up。 忽略标志IFF_CANTCHAGE

430-434 回忆图3.7,有些接口标志不能被进程改变。表达式(ifp->if_flags & IFF_CANTCHANGE)清除能被进程改变的接口标志,并且表达式(ifr->ifr_flags & ~IFF_CANTCHANGE)清除在请求中不被进程改变的标志。这两个表达式进行或运算并且作为新值保存在ifp->if_flags中。在返回前,请求被传递给设备关联的if_ioctl函数(例如:LANCE驱动器的leioctl——图4.31)。 SIOCSIFMETRIC

435-439 改变接口的度量要容易些;进程同样要有超级用户权限,ifioctl将接口新的

4—12

度量复制到if_metric中。

if_down和if_up函数

利用程序ifconfig,一个管理员可以通过命令SIOCSIFFLAGS设置或清除标志IFF_UP来启用或禁用一个接口。图4.30显示了函数if_down和if_up的代码。

图4.30 函数if_down和if_up

292-302 当一个接口被关闭时,IFF_UP标志被清除并且对于接口关联的每个地址用

pfctlinput(7.7节)发送命令PRC_IFDOWN。这给每个协议一个机会来响应被关闭的接口。有些协议,如OSI,要使用接口来终止连接。对于IP,如果可能,要通过其他接口为连接进行重新路由。TCP和UDP忽略失效的接口并依赖路由协议去发现分组的可选路径。 if_qflush忽略接口的任何分组队列。rt_ifmsg通知路由系统发生的变化。TCP自动重传丢失的分组;UDP应用必须自己显式地检测这种情况并对此作出响应。

308-315 当一个接口被启用,IFF_UP标志被设置并且rt_ifmsg通知路由系统接口状态发生改变。

以太网、SLIP和环回

我们看图4.29中处理SIOCSIFFLAGS命令的代码,ifioctl调用接口的if_ioctl函数。在我们的三个例子接口中,函数slioctl和loioctl为这个被ifioctl忽略的命令返回EINVAL。图4.31显示了函数leioctl及LANCE以太网驱动程序的SIOCSIFFLAGS命令的处理。

图4.31 函数leioctl:SIOCSIFFLAGS

614-623 leioctl把第三个参数data转换为一个ifaddr结构的指针并保存在ifa

中。le指针引用下标为ifp->if_unit的le_softc结构。基于cmd的switch语句构成了这个函数的主体。

638-656 在图4.31中仅显示了case SIOCSIFFLAGS。这次ifioctl调用leioctl,接口标志被改变。显示的代码强制物理接口进入标志所配置的状态。如果要关闭接口(没有设置IFF_UP),但接口正在工作,则关闭接口。若要启动未操作的接口,接口被初始化并重启。

如果混淆比特被改变,接口被关闭,复位,并重启来实现这种变化。

仅当要求改变IFF_PROMISC比特时包含排斥或和IFF_PROMISC的表达式才为真。

672-677 处理未识别命令的default情况分支抛出EINVAL,并在函数的结尾将它返

回。

4.5 小结

在这一章我们说明了LANCE以太网设备驱动程序的实现,这个驱动程序我们在全文中到处都会引用。我们还看到了以太网驱动程序是如何检测输入中的广播地址和多播地址的,及如何检测以太网和802.3封装的,如何将输入的帧分路到相应的协议队列中的。在第21章我们会看到在输出上IP地址(单播、广播和多播)是如何转换成正确的以太网地址的。 最后,我们讨论了协议专用的ioctl命令,它用来访问接口层数据结构。

4—13

习题

4.1 在leread中,当接收到一个广播分组,总是设置标志M_MCAST(除了M_BCAST外)。与ether_input的代码比较,为什么在leread和ether_input中设置此标志?它致关重要吗?哪个正确?

4.2 在ether_input(图4.13)中,如果对广播地址和多播地址的检测的次序交换会发生什么?如果在检测多播地址的if语句前加上一个else会发生什么?

4—14


第4章 接口以太网(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:材料分析测试方法作业题

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: