卷2 第4章 接口:以太网
4.1 引言
本章讨论以太网设备驱动程序的实现。
4.2 代码介绍
文件
| 文件 | 说明 |
|---|---|
| net/if_ether.h | 以太网结构 |
| net/if.h | ioctl命令 |
| net/if_ethersubr.c | 通用以太网函数 |
| hp300/dev/if_le.c | LANCE驱动 |
| net/if.c | ioctl处理 |
4.3 以太网接口
以太网帧格式
+--------+--------+--------+--------+ | 目的地址(6) | 源地址(6) | 类型(2) | 数据 | CRC(4) | +--------+--------+--------+--------+
text
- 类型0x0800:IP
- 类型0x0806:ARP
- 类型0x8035:RARP
leintr函数
- 以太网中断处理
- 调用leread读取帧
leread函数
- 构造ether_header
- 检测广播/多播
- 调用m_devget创建mbuf
- 调用ether_input
ether_input函数
- 根据类型分用
- IP:送入ipintrq
- ARP:送入arpintrq
- 其他:丢弃
ether_output函数
- 验证接口
- 处理路由
- 地址解析(ARP)
- 构造以太网首部
- 排队到接口
lestart函数
- 从输出队列取帧
- 传送到硬件
- 处理BPF
4.4 ioctl系统调用
接口ioctl命令
| 命令 | 说明 |
|---|---|
| SIOCGIFCONF | 获取接口配置 |
| SIOCGIFFLAGS | 获取标志 |
| SIOCSIFFLAGS | 设置标志 |
| SIOCGIFMETRIC | 获取度量 |
| SIOCSIFMETRIC | 设置度量 |
ifioctl函数
- 处理SIOCGIFCONF
- 调用ifconf
ifconf函数
- 遍历接口列表
- 返回地址信息
if_down/if_up
- IFF_UP标志控制
- 通知协议层状态变化
4.5 小结
以太网驱动程序通过ifnet结构中的函数指针访问。输入通过ether_input分用,输出通过ether_output处理。