接下来是一个共享的检查,如果是共享的数据包,需要修改skb中的信息,所以需要复制一个副本,再作进一步的处理。
最后,返回调用dst_input()函数,这个函数主机是根据路由信息调用相应的input函数,
err = skb->dst->input(skb);
但是这个input函数可能是ip_local_deliver或者是ip_forward();
Ip_forward()函数主机是对数据包进行转发发送,ip_local_deliver()函数主要是在本机进行处理的过程。
首先,确定接收到的包是不是分片,如果是,则要将分片重新装成一个完整的IP数据包再上传给L4层。最后调用ip_local_deliver_finish()函数。
确定将这个数据包传送给L4层,L3层的头已经没有作用,先去掉L3的头部。
调用相应的处理函数时要进行相就的注册,这里主要依据6to4隧道为例。我们可以在源码文件中sit.c,中的sit_init()函数中看到下面的注册添加函数。
也就是把数组中的inet_protos[]的相应位添加相应的处理函数。