------------------------------------------------------------------------------------------

以下是我根据 linux-2.6.23.9版本内核源代码所做阅读笔记,属个人兴趣而为,希望找到有共同兴趣

的朋友一起讨论和研究,有谬误之处,笔者水平有限,欢迎大家拍砖:)

------------------------------------------------------------------------------------------

FIB结构

用于保存路由规则,路由的查找过程如下:

1, 在缓存中搜索路由表项,如果能查到,就直接将对应的一项作为路由规则

2, 如果不能查到,就从FIB规则中换算出来,并且在路由缓存中添加表项

fib_table结构

struct fib_table {

struct hlist_node tb_hlist;

u32         tb_id;

unsigned  tb_stamp;

int           (*tb_lookup)(struct fib_table *tb, const struct flowi *flp, struct fib_result *res);

int           (*tb_insert)(struct fib_table *, struct fib_config *);

int           (*tb_delete)(struct fib_table *, struct fib_config *);

int           (*tb_dump)(struct fib_table *table, struct sk_buff *skb,

struct netlink_callback *cb);

int           (*tb_flush)(struct fib_table *table);

void        (*tb_select_default)(struct fib_table *table,

const struct flowi *flp, struct fib_result *res);

unsigned char tb_data[0];

};

u32  tb_id;//是fib_table唯一的标识,例如local_table(局部转发表,用于本地),标记是255,对main_table(主转发表,用于数据转发),标记是254,只有在查找local_table表时没有找到匹配的路由(不是发给本地的)它才会去查找main_table

主转发表(main_table)用于描述对设备路由规则

局部转发表(local_table)用于记录本地地址信息

unsigned char tb_data[0];这个指针指向一个fn_hash结构.

在系统初始化的时候 memset(tb->tb_data, 0, sizeof(struct fn_hash));

在linux 2.6内核中本结构添加了struct hlist_node tb_hlist,所有的fib_table可以使用这个结构连成一个双向链表,这个结构定义如下:

struct hlist_node {

struct hlist_node *next, **pprev;

};

可以使用一个宏hlist_for_each_entry_rcu使用RCU模式对所有的fib_table进行遍历,相关的函数还有hlist_add_head_rcu, hlist_del_rcu()等等.RCU模式不需要读写互斥,仅需要禁用抢占.

内核中fib_new_table函数用于创建一个新的fib_table结构.

fn_hash结构

struct fn_hash {

struct fn_zone *fn_zones[33];

struct fn_zone *fn_zone_list;

};

struct fn_zone *fn_zones[33];//每个数组元素对应着一个fn_zone结构指针

fz_zone[0] : 0000,0000,0000,0000,0000,0000,0000,0000

fz_zone[1] : 1000,0000,0000,0000,0000,0000,0000,0000

fz_zone[2] : 1100,0000,0000,0000,0000,0000,0000,0000

实际上用于标识子网掩码,可以看出,fz_zone[0]实际上对应默认网关

struct fn_zone *fn_zone_list;//当前正在使用的fz_zone的一个链表

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

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

    fib_info结构 struct fib_info { struct hlist_node fib_hash; struct hlist_node fib_lhash; int fib_treere ...

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

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

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

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

  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路由内核实现分析(一)----邻居子节点(1)

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

  6. linux路由内核实现分析(四)---路由缓存机制(4)

    ip_route_input函数   int ip_route_input(struct sk_buff *skb, __be32 daddr, __be32 saddr, u8 tos, struc ...

  7. linux路由内核实现分析(三)---路由查找过程

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

  8. linux路由内核实现分析(四)---路由缓存机制(1)

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

  9. linux路由内核实现分析(一)----邻居子节点(2)

    邻居节点相关的操作:   查找到路由后,会调用arp_bind_neighbour绑定一个邻居项 int arp_bind_neighbour(struct dst_entry *dst) { str ...

最新文章

  1. linux环境调用gsoap,Linux下gSOAP的使用 (c++)
  2. Exchange Server 2007 移动邮件
  3. 图像处理之基础---高斯低通滤波在指定区域画放大圆形图
  4. Java高并发编程(八):Java并发容器和框架
  5. 为什么大多数公司都不重视技术?
  6. Hyperledger Fabric 核心模块(1)整体概述
  7. vbs禁用任务管理器
  8. [恢]hdu 1040
  9. Linux学习笔记-增量编译(Makefile进一步使用)
  10. magento 获取 pages/Static Block 内容 Get Pages/Static Block in Magento
  11. 消息称谷歌Pixel系列手机默认禁用美颜功能
  12. 95-860-045-源码-定时器-InternalTimerService
  13. aes加密算法python语言实现_python-AES加密解密
  14. 关于不过洋节的通知_国家有规定不许过圣诞节等洋节吗?
  15. 把一些表单属性封装一个JSON
  16. Atitit 技术成果有哪些 1. 技术成果 1 2. 技术成果分类 2 2.1. 职务技术成果和非职务技术成果 2 2.2. 专利技术成果和非专利技术成果 2 3. 范例代码项目 与代码片段 2
  17. CTA策略01_dualThrust
  18. 事件解析树Drain3使用方法和解释
  19. 专用神经网络处理器的芯片,cpu可以跑神经网络吗
  20. 清北学堂day1考试

热门文章

  1. 服务器拒绝访问位置不可用,Win7打开Local Settings文件夹提示“位置不可用,拒绝访问如何解决...
  2. elif else if oracle_shell中if做比较
  3. vue php tree,Vue 实现树形视图数据功能
  4. html签到插件,GitHub - inu1255/soulsign-chrome: 魂签,一款用于自动签到的chrome插件
  5. va_start、va_end、va_arg 实现可变长参数
  6. 伯克利、OpenAI等提出基于模型的元策略优化强化学习
  7. Jboss启动报错——DailyRollingFileAppender无法转换异常
  8. iframe高度自适应的6个方法
  9. SQL 创建随机时间的函数
  10. 一些关于Spring的随笔