卷2 第3章 接口层
3.1 引言
接口层提供与硬件无关的编程接口。
支持功能
- 标准接口函数
- 标准统计与控制标志
- 协议地址存储
- 输出分组排队
三种示例接口
- 以太网:广播局域网
- 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.c | SLIP驱动 |
| hp300/dev/if_le.c | LANCE以太网驱动 |
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_mtu | MTU |
函数指针
| 函数 | 说明 |
|---|
| if_init | 初始化 |
| if_output | 输出排队 |
| if_start | 启动传输 |
| if_ioctl | I/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_INET | Internet |
| AF_OSI | OSI |
| AF_UNIX | Unix域 |
| AF_LINK | 链路层 |
| AF_ROUTE | 选路 |
3.6 ifnet与ifaddr的专用化
- 设备专用结构以ifnet开头
- 协议专用结构以ifaddr开头
3.7 网络初始化概述
cpu_startup:检测硬件设备
main:调用pdevinit数组中的attach函数
ifinit:接口初始化
domaininit:协议初始化
3.8 以太网初始化
le_softc结构
struct le_softc {
struct arpcom sc_ac; // 通用以太网
// 设备专用…
};
text
arpcom结构
| 成员 | 说明 |
|---|
| ac_if | ifnet结构 |
| ac_enaddr | 以太网地址 |
| ac_ipaddr | IP地址 |
| ac_multiaddr | 多播地址列表 |
3.9 SLIP初始化
sl_softc结构
| 成员 | 说明 |
|---|
| sc_if | ifnet结构 |
| 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函数
3.13 小结
ifnet和ifaddr是接口层的核心数据结构。初始化由系统引导过程完成。