路由缓存初始化:
路由缓存容量可以从dmesg命令输出中找到”IP:routing cache...“字符串。内核指定的默认容量可以被用户启动选项rhash_entries所覆盖。
主要的缓存操作:
缓存中与协议无关的(DST)部分是一组dst_entry数据结构。操作dst_entry结构的所有函数名都是以dst_为前缀。
每次为封包选择路由时,如果查找缓存失败,则内核就查找路由表并将结构保存到路由缓存中,dst_alloc用于分配内存,rt_inter_hash用于插入到缓存表。下图是rt_inter_hash的主要逻辑:
大多数路由缓存表项要被绑定到该路由下一跳地址对应的ARP缓存表项。目的地址为广播地址和多播地址的出口路由不需要相关联的ARP表项。调用arp_bind_neighbour来为路由创建与ARP的绑定。
缓存查找:
查找路由时,先查找缓存,没有命中则查找路由表,下面介绍缓存查找函数,路由表查找函数在第三十五章会介绍。
ip_route_input函数: 用于入口流量的路由查找,这些流量可能是本地提交或要被转发。
ip_route_output_key函数:用于出口流量的路由查找,这些流量是本地成。
多路径缓存:
注册一个缓存算法,缓存算法被定义为ip_mp_alg_ops的一个实例,该结构由一些函数指针组成。向内核注册和注销缓冲算法分别使用multipath_alg_register和multipath_alg_unregister,所有的缓存算法都是实现为模块,在net/ipv4目录中。常用的缓存算法有随机算法,加权随机算法,循环算法,设备循环算法。
DST与调用协议间的接口:
DST缓存是一个独立的子系统,他有自己的垃圾回收机制。,它提供了一组函数,各种协议可以使用这些函数来改变或调整其行为。这些DST函数被包裹为另外一组函数,拥有自己的路由缓存的L3协议通过初始化一个dst_ops实例可以使用这组函数。
DST向更高层提供的主要数据结构是dst_entry。针对每一个L3协议有一个dst_ops实例,如ipv4使用的实例为ipv4_dst_ops。其初始化为:
dst_entry结构除了存储与协议无关的路由信息,其另一个用途是用于ipsec。IPsec使用dst_entry结构来构造变换束,一个变换是针对一个封包的操作,如加密操作。一个束就是一连串的变换。一般情况下,一个路由项和一个dst_entry结构相关联,该结构的input和output字段描述了如何处理匹配封包,但IPSec创键一个dst_entry实例链表,只有最后一个实例中的input和output方法被实际应用与路由决策,前面实例中的input和output方法被应用于变换。