欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

linux路由内核实现分析 四,linux路由内核实现分析(二)---FIB相关数据结构(4)

发布时间:2023/11/27 48 豆豆
生活随笔 收集整理的这篇文章主要介绍了 linux路由内核实现分析 四,linux路由内核实现分析(二)---FIB相关数据结构(4) 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

fib_info结构

struct fib_info {

struct

hlist_node fib_hash;

struct

hlist_node fib_lhash;

int fib_treeref;

atomic_t fib_clntref;

int fib_dead;

unsigned fib_flags;

int fib_protocol;

__be32 fib_prefsrc;

u32 fib_priority;

u32 fib_metrics[RTAX_MAX];

#define fib_mtu fib_metrics[RTAX_MTU-1]

#define fib_window fib_metrics[RTAX_WINDOW-1]

#define fib_rtt fib_metrics[RTAX_RTT-1]

#define fib_advmss fib_metrics[RTAX_ADVMSS-1]

int fib_nhs;

#ifdef CONFIG_IP_ROUTE_MULTIPATH

int fib_power;

#endif

struct

fib_nh fib_nh[0];

#define

fib_dev fib_nh[0].nh_dev

};

这个结构表示一个路由信息,一个路由信息可以被多个路由复用

例如:

struct fib_info{

.fib_protocol =

RTPROT_KERNEL;// 表示这一条由内核发起的消息

.fib_nhs = 1;//表示fib_nh的数目

.fib_flags = 0;

.fib_prefsrc = 172.16.48.2; //接口上的primary地址

struct fib_nh{

.nh_oif = indexof(eth0);

.nh_flags = 0;

.nh_weight = 1;

.nh_scope =

RT_SCOPE_NOWHERE;

.nh_dev = eth0;

}

}

fib_nh结构

struct fib_nh {

struct

net_device *nh_dev;

struct

hlist_node nh_hash;

struct

fib_info *nh_parent;

unsigned nh_flags;

unsigned

char nh_scope;

#ifdef CONFIG_IP_ROUTE_MULTIPATH

int nh_weight;

int nh_power;

#endif

#ifdef CONFIG_NET_CLS_ROUTE

__u32 nh_tclassid;

#endif

int nh_oif;

u32 nh_gw;

};

fib_nh结构存放着下一跳路由的地址(nh_gw)。一个路由(fib_alias)可能有多个fib_nh结构,它表示这个路由有多个下一跳地址,即它是多路径(multipath)的。下一跳地址的选择也有多种算法,这些算法都是基于nh_weight,

nh_power域的。nh_hash域则是用于将nh_hash链入HASH表的。

u32 nh_gw;//下以跳的路由地址

struct

net_device *nh_dev; //下一跳的DEV指针

以上几种数据结构之间的关系

可以这样理解这些结构之间的关系:

1,fib_table中包含fn_hash结构指针

2,fn_hash中包含fn_zone的数组,按照目的地址长度进行分类,相同长度的地址共用一个fz_zone

3, fn_key相同的两条路由(同一子网),共享一个路由节点(fn_node)

4,根据具体子网内地址的不同,使用不同的fib_alias和fib_info

5,目的地址相同的情况下,也可以使用多条路由,不同的路由存放在不同的fib_nh里面

总结

以上是生活随笔为你收集整理的linux路由内核实现分析 四,linux路由内核实现分析(二)---FIB相关数据结构(4)的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。