fib_semantic_match的方法讲解和解决路由的标准
fib_semantic_match方法的目的是在参数fib_node相关的路由fib_alias中,查找和搜索key所有字段都匹配的路由项。
packet被路由到的目的IP地址,在调用fib_semantic_match函数之前已经在fib_table_lookup中查找到匹配项。然后在由fib_semantic_match函数来检查其他字段是否匹配。
一旦fib_semantic_match查找到相匹配的fib_alias实例,就从相关的fib_node中提取出路由信息。之后还要选择下一跳。
拒绝路由的标准:
当fib_semantic_match函数遍历fib_alias结构时,拒绝以下路由:
● TOS不匹配。注意当路由项没有配置TOS时,可以路由任意TOS值的报文。
● scope比搜索key更窄的路由项。
例如,如果路由子系统查找scope为RT_SCOPE_UNIVERSE的路由则不能使用scope为RT_SCOPE_LINK的路由项。
而且,该函数必须检查路由项或所期望的下一跳是否无效,此时路由子系统已经设置RTNH_F_DEAD标志来标记该路由项应当被删除。
一旦标识出一个合法的fib_alias实例,并假定相关联的fib_info结构可用(即没有设置RTNH_F_DEAD标志),如果搜索key中给出了egress设备,则fib_semantic_match函数就需要遍历所有下一跳的fib_nh实例,来查找与搜索key中egress设备相匹配的实例。
但实际中可能没有一个下一跳能被使用,这可能是由两种原因引起的:
● 所有的下一跳都不可用(即它们都设置有RTNH_F_DEAD标志)。
● 搜索key指定的egress设备与任何一个下一跳的配置都不匹配。
如果不支持多路径,则只能有一个下一跳。
当fib_semantic_match遍历fib_alias实例时,对满足本小节前面提到的scope和TOS需求的实例设置FA_S_ACCESSED标志。该标志的设置与fib_alias是否被选中无关。当fib_alias实例被删除时,根据该标志来决定是否应当flush缓存。