12.1 路由核心数据结构
路由分为策略路由和多路路由,策略路由会参考用户设置的一些路由策略。路由可以使
用 tcp/ip 分析的下篇系列文章之一中的 route 和 ip route 工具设置。路由分为路由部分包括
三大块,路由缓存、路由表、路由信息查找。策略路由常用于安全和统计(经济)方面。多路
路由允许对于一个给定的目的地址分配多个下一跳入口。这常被用于主备(可靠性、鲁棒性)
路由。
路由表的构建途径:
通过用户命令[route(ioctl) 、ip route(netlink)]静态配置
通过路由协议动态配置,这些协议是 BGP(Border Gateway Protocol)、EGP(Exterior
Gateway Protocol)以及 OSPF(Open Shortest Path First)
这一章的内容基于 route 方法,其它的配置路由的方法不在这章中,但是上面的方法区
别在于配置方法,而对应调用的路由核心函数以及操作的核心路由数据结构是一样的,这章
的主要内容就是关于这些和核心函数和核心数据结构的。
路由相关数据结构在 include/net/route.h
struct ip_rt_acct {
__u32 o_bytes; //发送数据的字节数
__u32 o_packets;
__u32 i_bytes;
__u32 i_packets;
};
这个结构体在 ip_rcv_finish中被使用到,由于网络数据包的统计,分别按照 byte和 packet
两种方法计数,ip_rcv_finish 在网络层接收中分析过,这里会再一次看到在网络层被跳过的
关于路由相关的代码,下面的代码片段就是上面统计信息被赋值的一个地方:
static int ip_rcv_finish(struct sk_buff *skb)
{
#ifdef CONFIG_IP_ROUTE_CLASSID
if (unlikely(skb_dst(skb)->tclassid)) {
struct ip_rt_acct *st = this_cpu_ptr(ip_rt_acct);
u32 idx = skb_dst(skb)->tclassid;
st[idx&0xFF].o_packets++;
st[idx&0xFF].o_bytes += skb->len;
st[(idx>>16)&0xFF].i_packets++;
st[(idx>>16)&0xFF].i_bytes += skb->len;
}
#endif
}
由上面的使用可以知道,定义了基于路由的分类器就会使用该字段。该字段根据 idx 索
引可构成具有 256 个成员的数组。其初始化在 ip_rt_init 中完成。
rt_cache_stat
路由表缓存的统计信息,除了输入输出路由信息统计,还有垃圾回收信息。
fib_result
查找路由表会得到此结构。
struct fib_result {
unsigned char prefixlen;
unsigned char nh_sel;
unsigned char type;
1