linux路由内核实现分析(四)---路由缓存机制(3)

本文详细解析了在函数ip_rt_init()中如何使用alloc_large_system_hash函数初始化路由缓存的哈希表,并创建slab句柄用于存储r_table项。此外,文章还介绍了ip_route_input函数在路由输入过程中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在函数ip_rt_init( )中进行了rt_hash_bucket的初始化,代码如下:

 rt_hash_table = (struct rt_hash_bucket *)

              alloc_large_system_hash("IP route cache",

                                   sizeof(struct rt_hash_bucket),

                                   rhash_entries,

                                   (num_physpages >= 128 * 1024) ?

                                   15 : 17,

                                   0,

                                   &rt_hash_log,

                                   &rt_hash_mask,

                                   0);

       memset(rt_hash_table, 0, (rt_hash_mask + 1) * sizeof(struct rt_hash_bucket));

      

使用alloc_large_system_hash函数初始化了一个哈希表

在该函数中还创建了slab句柄,用于存储具体的r_table项

ipv4_dst_ops.kmem_cachep =

                        kmem_cache_create("ip_dst_cache", sizeof(struct rtable), 0,

                              SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL);

 

 

路由缓存查找过程

 

数据包进入网络层之后,第一个调用的函数是ip_  rcv函数,通过pskb_may_pull完成碎片重组之后还要进行一些有效性检查,最后调用

return NF_HOOK(PF_INET, NF_IP_PRE_ROUTING, skb, dev, NULL,

               ip_rcv_finish);

 

进入ip_rcv_finish函数,ip_rcv_finish函数开始就调用了ip_route_input以生成路由信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值