NIC: network interface card 网络接口卡
ATS:asynchrounous transfer mode 异步传输总线
NIC驱动程序不通过/dev或/sys来与用户空间通信,应用程序是通过网络接口与NIC驱动程序互操作的,网络接口对底层的协议进行抽象。
驱动程序数据结构,3类操作
1. 形成网络协议的数据结构,套接字缓冲区,定义在Include/linux/sk_buff.h文件中的结构体SK_buff ,是内核TCP/IP使用的关键字体
2.定义NIC驱动程序和协议间结构的数据结构, include/linux/netdevice.h文件中的结构体net_device是构成该接口的核心体。
3.与IO总线相关的结构体,PCI及派生总线如NIC使用的总线。
sk_buff为linux网络层提供了高效的缓冲区处理和流量控制机制。用5个域将自身与数据包缓冲区联系起来。
套接字缓冲区
head 指向数据包开始
data 指向数据包载荷的开始
tail 指向数据包载荷的尾部
end 指向数据包的结束
len 数据包含的结束。
skb->head
skb->data
skb->tail
skb->end
网络设备接口
alloc_netdev() 分配一个net_device结构体
register_netdev(netdev)向网络层注册net_device
驱动程序从eeprom读取NIC的MAC(media access control ,媒体介入控制)地址。若需要,配置WOL (wake on lan)网络唤醒MAC 48位比特全球唯一地址。
若NIC 需要卡上固件(on-card) 驱动程序用request_firmware()下载。
net_device接口需要传统的方法。如open(),close(),ioctl()如果用ifconfig等工具激活它,内核打开一个接口
bash>ifconfig eth0 up
request_irq() 注册NIC中断处理程序
发送路径
hard_start_xmit()的函数,协议层在发送时调用它来向下传递数据包:
netdev->hard_start_xmit=&mycard_xmit_frame
流量控制
netif_start_queue()
netif_stop_queue()来告知已经做好准备或还不能接收协议数据
接收路径
netif_rx(skb)
ISA网络驱动程序
Isa探测犯方法通过查找一个签名sinature(芯片ID)来探测出控制器的IO基址
cs89x0_probe1()探测,然后读出芯片当前配置。访问EEPROM并获得控制器的MAC地址。
通过netif*()和skb_*()接口例程来建立cs89x0.c
ATM; asychronous transfer mode 异步传输模式
QOS:quality of service
数据结构
sk_buff include/linux/skbuff.h
net_device include/linux/netdevice.h NIC驱动程序和TCP/IP协议接口
内核编程
alloc_netdev() net/core/dev.c 分配net_device
alloc_etherdev() net/ethernet/eth.c alloc_netdev()封装
register_netdev() net/core/dev.c 注册net_device
unregister_netdev() net/core/dev.c 注销net_device
netif_queue_stopped() include/linux/netdevice.h 检查流控状态
netif_device_detach() net/core/dev.c 分离设备
netif_device_attach() net/core/dev.c 附着设备