卷2 第4章 接口:以太网

4.1 引言

本章讨论以太网设备驱动程序的实现。

4.2 代码介绍

文件

文件说明
net/if_ether.h以太网结构
net/if.hioctl命令
net/if_ethersubr.c通用以太网函数
hp300/dev/if_le.cLANCE驱动
net/if.cioctl处理

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函数

  1. 验证接口
  2. 处理路由
  3. 地址解析(ARP)
  4. 构造以太网首部
  5. 排队到接口

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处理。