IP层主要函数之间的调用关系如下图所示:
上面的图主要是拷贝的《Linux内核源码剖析----TCP/IP实现上册》中的图11.3,原图中有部分错误,所以这里重新绘制了一下,并且去掉了一些冗余的部分。
下面简述一下数据包传递的大致过程:
一、IP数据包的输入
ip_rcv()是网络层(IPv4,以下同)接收数据包的入口函数,链路层在接收到数据包后调用netif_receive_skb()将数据包传递到网络层。网络层的packet_type实例为ip_packet_type,在Internet协议族的初始化函数inet_init()中调用dev_add_pack()来注册到ptype_base散列表中。
ip_rcv()中接收到数据包后会检查是否是一个完整的、没有错误的数据包。如果是合法的数据包,会传递到netfilter的NF_INET_PRE_ROUTING钩子点进行处理,如果钩子处理函数中没有截获数据包,则传递到ip_rcv_finish()进行下一阶段的处理。
ip_rcv_finish()会检查是否已设置路由缓存项&#x