- 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,将网络包发到设备的队列上去。