- 对于典型的ethernet驱动流程图如下
- 接收流程
- 以太包接收到之后,触发硬件中断,硬件中断调用leread
- leread函数调用m_devget将不带ETH头的报文存入一个mbuf链,并设置mbuf的flag标志,指示是组播还是广播包,之后调用ether_input
- ether_input根据eth报文头中的type字段将报文分发到不同的接收队列,如ipintrq/arpintrq
- 发送流程
- ether_output检查参数rt0的有效性,如果无效,则重新查找
- 调用arpresove获取mac地址;或者直接从参数dst中提取mac地址和eth类型
- 通过M_PREPEND在mbuf链中添加eth头,eth头的源mac地址从ifp的arpcom结构中获取
- 将完整的以太帧挂入ifp->if_snd队列
- 如果硬件没有启动发送则启动发送过程
- 对网络接口的IOCTL配置
- 对网络接口的配置通过IOCTL进行,FD可以是任意一种socket插口
- icoctl函数根据fd的类型会分发到soo_ioctl中
- soo_ioctl函数根据cmd命令字的group属性进行分发,如果是对网络接口的配置会分发到ifioctl函数中
- ifconf函数用于实现SIOCGIFCONFF cmd功能,用户可以通过该接口获取所有网络接口的所有地址(包括链路地址和IP地址)
- 在ifioctl中直接处理SIOCGIFFLAGS cmd功能,如果有对网络接口的UP/DOWN状态改变会调用if_down/if_up函数通知高层协议栈,调用ifp->if_ioctl通知底层驱动;
- if_up/if_down
- 通过调用pfctlinput通知各协议簇端口状态变更,对于IP协议栈,则会重新出发选路;
- 通过调用rt_ifmsg通知路由系统改端口状态变更
- ifp->ioctl函数
- 该函数由网络接口驱动实现,负责关闭和开启网络端口
- if_up/if_down
- 目前没有实现的cmd命令字转交so->so_proto->pr_usrreq 处理