Chapter 4. Interfaces: Ethernet

来源:互联网 发布:java编程思想 编辑:程序博客网 时间:2024/05/16 09:53
  1. 对于典型的ethernet驱动流程图如下

  1. 接收流程
    • 以太包接收到之后,触发硬件中断,硬件中断调用leread
    • leread函数调用m_devget将不带ETH头的报文存入一个mbuf链,并设置mbuf的flag标志,指示是组播还是广播包,之后调用ether_input
    • ether_input根据eth报文头中的type字段将报文分发到不同的接收队列,如ipintrq/arpintrq
  2. 发送流程
    • ether_output检查参数rt0的有效性,如果无效,则重新查找
    • 调用arpresove获取mac地址;或者直接从参数dst中提取mac地址和eth类型
    • 通过M_PREPEND在mbuf链中添加eth头,eth头的源mac地址从ifp的arpcom结构中获取
    • 将完整的以太帧挂入ifp->if_snd队列
    • 如果硬件没有启动发送则启动发送过程
  3. 对网络接口的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函数
        • 该函数由网络接口驱动实现,负责关闭和开启网络端口
    • 目前没有实现的cmd命令字转交so->so_proto->pr_usrreq 处理

 

原创粉丝点击