卷2 第3章 接口层

3.1 引言

接口层提供与硬件无关的编程接口。

支持功能

  1. 标准接口函数
  2. 标准统计与控制标志
  3. 协议地址存储
  4. 输出分组排队

三种示例接口

  • 以太网:广播局域网
  • SLIP:点对点串行
  • 环回:逻辑网络

3.2 代码介绍

文件

文件说明
sys/socket.h地址结构
net/if.h接口结构
net/if_dl.h链路层结构
kern/init_main.c系统初始化
net/if.c通用接口代码
net/if_loop.c环回驱动
net/if_sl.cSLIP驱动
hp300/dev/if_le.cLANCE以太网驱动

3.3 ifnet结构

实现信息

成员说明
if_next链表指针
if_addrlist地址列表
if_name接口名(“le”, “sl”, “lo”)
if_unit单元号
if_index唯一索引
if_flags标志

接口标志

标志说明
IFF_UP正在工作
IFF_BROADCAST广播网
IFF_POINTOPOINT点对点
IFF_LOOPBACK环回
IFF_MULTICAST支持多播

接口特性

成员说明
if_type硬件类型
if_addrlen地址长度
if_hdrlen首部长度
if_mtuMTU

函数指针

函数说明
if_init初始化
if_output输出排队
if_start启动传输
if_ioctlI/O控制
if_reset复位
if_watchdog定时器

3.4 ifaddr结构

  • 每个接口维护地址列表
  • 每个协议一个地址
  • 支持多IP地址

成员

成员说明
ifa_next下一个地址
ifa_ifp回指接口
ifa_addr协议地址
ifa_netmask网络掩码
ifa_dstaddr点对点目标/广播地址

3.5 sockaddr结构

通用地址结构:

  • sa_len:地址长度
  • sa_family:地址族
  • sa_data:协议相关数据

地址族

常量说明
AF_INETInternet
AF_OSIOSI
AF_UNIXUnix域
AF_LINK链路层
AF_ROUTE选路

3.6 ifnet与ifaddr的专用化

  • 设备专用结构以ifnet开头
  • 协议专用结构以ifaddr开头

3.7 网络初始化概述

  1. cpu_startup:检测硬件设备
  2. main:调用pdevinit数组中的attach函数
  3. ifinit:接口初始化
  4. domaininit:协议初始化

3.8 以太网初始化

le_softc结构

struct le_softc { struct arpcom sc_ac; // 通用以太网 // 设备专用… };

text

arpcom结构

成员说明
ac_ififnet结构
ac_enaddr以太网地址
ac_ipaddrIP地址
ac_multiaddr多播地址列表

3.9 SLIP初始化

sl_softc结构

成员说明
sc_ififnet结构
sc_fastq交互队列
sc_ttyp终端设备
sc_buf/sc_mp/sc_ep接收缓存指针

SLIP标志

常量说明
SC_COMPRESS压缩TCP
SC_NOICMP禁止ICMP
SC_AUTOCMP自动压缩

3.10 环回初始化

  • MTU:1536字节
  • 设置IFF_LOOPBACK和IFF_MULTICAST

3.11 if_attach函数

  • 初始化ifnet结构
  • 插入接口链表
  • 创建链路层地址(sockaddr_dl)

3.12 ifinit函数

  • 设置输出队列最大长度(50)
  • 启动监视定时器

3.13 小结

ifnet和ifaddr是接口层的核心数据结构。初始化由系统引导过程完成。