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 */