0
点赞
收藏
分享

微信扫一扫

46 | 发送网络包(下)

彪悍的鼹鼠 2021-09-25 阅读 25
  • ip_queue_xmit 函数:
    • 第一部分,选取路由,也即我要发送这个包应该从哪个网卡出去。
    • 第二部分,就是准备 IP 层的头,往里面填充内容。这就要对着 IP 层的头的格式进行理解。
  • 第三部分,就是调用 ip_local_out 发送 IP 包。
  • ip_finish_output 函数:
    • ip_negh_lookup_noref: 先从本地ARP表缓存中查找下一跳的ARP地址。假如没有则调用__neigh_create 进行创建。创建一个 struct neighbour 结构,用于维护 MAC 地址和 ARP 相关的信息。它是通过是一个数组加链表的链式哈希表存放。
    • 从 arp_queue 中拿出 ARP 包来,然后调用 struct neighbour 的 solicit 操作。最后调用调用 dev_queue_xmit 发送二层网络包了。
    • 有了 MAC 地址,就可以调用 dev_queue_xmit 发送二层网络包了,它会调用 __dev_xmit_skb 会将请求放入队列。
      -设备层:网络包的发送会触发一个软中断 NET_TX_SOFTIRQ 来处理队列中的数据。这个软中断的处理函数是 net_tx_action。
    • 在软中断处理函数中,会将网络包从队列上拿下来,调用网络设备的传输函数 ixgb_xmit_frame,将网络包发到设备的队列上去。
举报

相关推荐

0 条评论