分类: LINUX
2008-11-20 12:01:58
|
这个函数的前面大多是相关于ip协议的检查,包括ip头的检查,我们跳过这部分检查内容,函数最后通过NF_HOOK宏转入ip_rcv_finish()函数
|
因为数据包是刚接收到的还没有设置关于dst_entry结构的路由信息,上面首先是设置数据包的路由,这是通过ip_route_input()函数来实现的
|
函数中首先是在rt_hash_table[]系统中的路由缓存表中查找,如果找到了就把路由表赋给数据包使用skb->rtable = rth,如果没有找到就会进入ip_route_input_slow()函数“慢一些的查找”关于 ip_route_input_slow()函数我们以前看过了 ip_route_output_flow()的创建了http://blog.chinaunix.net/u2/64681/showart_1408613.html 这里就不再详细分析了,我们要注意关键的一句
|
重点注意这里是将路由表中的进入路径钩子挂入了ip_local_deliver函数。然后将新建立的路由表设置进入数据包的路由表指针,并且放入全局的路由表缓存rt_hash_table[]中,我们继续看ip_rcv_finish()函数的代码,设置了数据包的路由表后,最后进入dst_input()函数。
|
显然是进入了我们上面ip_route_input_slow()函数中ip_local_deliver函数
|
首先是对到来的数据包进行碎片重组的检查和处理,最后转入了ip_local_deliver_finish()函数
|
函数中首先根据数据包头部的信息取出要使用的协议类型然后确定一个hash值,进一步从inet_protos[]指针数组中取得相应的具体协议的struct net_protocol结构指针
|
这个结构用于所有注册的协议使用。inet_protos数组是在初始化过程函数inet_init()中被设置的
|
因为我们说的是ipv4所以相应的协议结构
|
所以在ip_local_deliver_finish()函数中ipprot结构变量会取得tcp_protocol协议结构,最后执行
ret = ipprot->handler(skb);
这将进入 tcp_v4_rcv()这个钩子函数中,由于时间关系明天继续。