TCP/IP数据包的完整接收流程!
入口自然是从driver开始,以Intel(R) PRO/1000 Network Driver对应的e1000_main.c为例。
事先声明,因为本人不是内核工程师,所以难免在kernel的代码理解上献丑,希望大家指正。
这里,我们并不需要关心如何去写driver,如何处理中断,只需要关注网卡如何接收的数据包,并传给上层协议。
函数e1000_clean_rx_irq为网卡接收数据包的处理函数。
- static bool e1000_clean_rx_irq(struct e1000_adapter *adapter,
- struct e1000_rx_ring *rx_ring,
- int *work_done, int work_to_do)
- {
- ...... ......
-
- /* 得到了接收缓存buffer */
- i = rx_ring->next_to_clean;
- rx_desc = E1000_RX_DESC(*rx_ring, i);
- buffer_info = &rx_ring->buffer_info[i];
- while (rx_desc->status & E1000_RXD_STAT_DD) {
- ...... ......
- /* 取得接收缓存buffer的数据包buffer,即skb */

本文详细介绍了TCP数据包从接收、解析到传递给相应协议处理的完整流程,涉及e1000_clean_rx_irq函数中接收缓冲区的处理,dev_add_pack中数据包类型注册,以及IP数据包的局部交付和协议处理。通过nf_hook、ip_defrag等关键函数,阐述了网络数据包在内核中的路由和处理机制。
最低0.47元/天 解锁文章
6695

被折叠的 条评论
为什么被折叠?



