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)相关推荐

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

    fib_info结构 struct fib_info {struct hlist_node fib_hash;struct hlist_node fib_lhash;int fib_treeref;a ...

  2. linux路由内核实现分析(二)---FIB相关数据结构(3)

    fib_node结构 struct fib_node {struct hlist_node fn_hash;struct list_head fn_alias;u32 fn_key; }; 这个结构实 ...

  3. linux路由内核实现分析(二)---FIB相关数据结构(1)

    ------------------------------------------------------------------------------------------ 以下是我根据 li ...

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

    fn_zone结构 struct fn_zone {struct fn_zone *fz_next;struct hlist_head *fz_hash; int fz_nent; int fz_di ...

  5. 实验linux下的编程,实验四 Linux下的C语言编程;

    <实验四 Linux下的C语言编程;>由会员分享,可在线阅读,更多相关<实验四 Linux下的C语言编程;(5页珍藏版)>请在人人文库网上搜索. 1.实验四Linux 下的 C ...

  6. 四年级计算机期末质量分析,四年级期末考试质量分析

    考试作为一种实现教育目的的手段,它有存在的合理性.下面是小编整理的四年级期末考试质量分析,欢迎参考! [1]四年级期末考试质量分析 一 .试题分析 1.总体认识 我认为本次考试试题以<21011 ...

  7. tcp/ip 协议栈Linux源码分析四 IPv4分片 ip_fragment函数分析

    内核版本:3.4.39 很多项目涉及到IP分片的时候都是绕过去了,感觉分片挺难的.但是老这么做也不行啊,抽空分析了内核的分片处理函数ip_fragment,也不是特别复杂,感觉挺简单的,看来事情只有实 ...

  8. linux内存管理(十四)-内存OOM触发分析

    在内存分配路径上,当内存不足的时候会触发kswapd.或者内存规整,极端情况会触发OOM,来获取更多内存. 在内存回收失败之后,会进行OOM,OOM的入口是__alloc_pages_may_oom, ...

  9. Linux日志写空,(十四)Linux日志管理

    第一节 日志管理简介 1.日志服务 在CentOS6.x中日志服务已经由rsyslogd取代了原先的syslogd服务.rsyslogd日志服务更加先进,功能更多 但是不论该服务的使用,还是日志文件的 ...

最新文章

  1. R3抹掉加载的DLL
  2. 2021-05-07 matlab中的addpath用法
  3. boost::regex
  4. python坐标怎么打_python导入坐标点的操作方法
  5. mysql如何实现acid中的a_MySQL如何实现事务的ACID
  6. fastapi quickstart学习
  7. php 403 nginx,403nginx是什么
  8. 9篇!悉尼科技大学入选CVPR2021都研究什么?
  9. js java cookie_js cookie 工具
  10. redis远程连接不上_redis连接认证及bind的注意事项
  11. java_object的具体使用--上帝
  12. File Cabinet Pro for Mac(菜单栏快捷文件管理软件)
  13. 【CGAL】提取中心线
  14. 利用python实现华氏温度和摄氏温度的转换
  15. Shader山下(六)镜面高光
  16. 移动应用程序设计基础——期末考核——登录界面与简单日记本的综合实践
  17. 通过阿里云API查询账户余额
  18. mybatis plus 看这篇就够了,一发入魂
  19. 【MySQL】DDL语句详解:列类型、列约束及自增列_Unit03
  20. 用java实现原神自动弹琴(附谱)

热门文章

  1. TensorFlow算子融合
  2. Relay外部库使用
  3. NVIDIA CUDA-X AI
  4. 适用于Linux 2的Windows子系统上的CUDA
  5. 小目标检测的增强算法
  6. 2021年大数据ELK(十九):使用FileBeat采集Kafka日志到Elasticsearch
  7. 2021年大数据Hadoop(八):HDFS的Shell命令行使用
  8. 2021年大数据Spark(二十七):SparkSQL案例一花式查询和案例二WordCount
  9. popWindow 出现点击上下空白区域消失点击左右空白区域不消失弹框的处理方法
  10. Java 对象和类 的理解