对于各个协议生成的路由信息的处理属于quagga中非常重要的一个功能,如何在内核进行路由增加,更新,删除是一个复杂的过程。

quagga在thread任务调度中加入了一种工作队列,work_queue,与内核的工作队列类似,是一种相对而言,低优先级的任务,这里的任务看成类似的系统进程。

1、队列初始化:

 1 /* initialise zebra rib work queue */
 2 static void
 3 rib_queue_init(struct zebra_t *zebra)
 4 {
 5     assert(zebra);
 6
 7     if (!(zebra->ribq = work_queue_new(zebra->master,
 8                                        "route_node processing")))
 9     {
10         zlog_err("%s: could not initialise work queue!", __func__);
11         return;
12     }
13
14     /* fill in the work queue spec */
15     zebra->ribq->spec.workfunc = &meta_queue_process;
16     zebra->ribq->spec.errorfunc = NULL;
17     /* XXX: TODO: These should be runtime configurable via vty */
18     zebra->ribq->spec.max_retries = 3;
19     zebra->ribq->spec.hold = rib_process_hold_time;
20
21     if (!(zebra->mq = meta_queue_new()))
22     {
23         zlog_err("%s: could not initialise meta queue!", __func__);
24         return;
25     }
26     return;
27 }

第19行,zebra->ribq->spec.hold = rib_process_hold_time; 指定了rib工作队列在thread_fetch的时候会等待10毫秒

1 /* Hold time for RIB process, should be very minimal.
2  * it is useful to able to set it otherwise for testing, hence exported
3  * as global here for test-rig code.
4  */
5 int rib_process_hold_time = 10;

在添加thread任务的时候进行了时间单位换算:

 1 /* Add a background thread, with an optional millisec delay */
 2 struct thread*
 3 funcname_thread_add_background(struct thread_master *m,
 4                                int (*func)(struct thread *),
 5                                void *arg, long delay,
 6                                debugargdef) {
 7     struct timeval trel;
 8
 9     assert(m != NULL);
10
11     if (delay) {
12         trel.tv_sec = delay / 1000;
13         trel.tv_usec = 1000 * (delay % 1000);
14     } else {
15         trel.tv_sec = 0;
16         trel.tv_usec = 0;
17     }
18
19     return funcname_thread_add_timer_timeval(m, func, THREAD_BACKGROUND,
20                                              arg, &trel, debugargpass);
21 }

OK,meta_queue_process,就指定了工作队列在调度执行的处理函数,由此guagga就会一直同步更新路由了。

2、每个子网的下一跳路由表项的描述:

quagga使用了双向链表来管理表项,定义了路由表现的详细信息,但比如 status 这个字段是用来在更新路由时来做比较的关键字段。如下宏定义了3种状态:

#define RIB_ENTRY_REMOVED    (1 << 0)
#define RIB_ENTRY_CHANGED    (1 << 1)
#define RIB_ENTRY_SELECTED_FIB    (1 << 2)

 1 struct rib {
 2   struct rib *next;         /* Link list. */
 3   struct rib *prev;
 4   struct nexthop *nexthop; /* Nexthop structure */
 5   unsigned long refcnt;    /* Refrence count. */
 6   time_t uptime;           /* Uptime. */
 7   int type;                /* Type fo this route. */
 8   vrf_id_t vrf_id;         /* VRF identifier. */
 9   int table;               /* Which routing table */
10   u_int32_t metric;        /* Metric */
11   u_int32_t mtu;           /* MTU */
12   u_int32_t nexthop_mtu;
13   u_char distance;         /* Distance. */
14   u_char flags;             /* Flags of this route. in lib/zebra.h ZEBRA_FLAG_* */
15   u_char status;            /* RIB internal status */
16 #define RIB_ENTRY_REMOVED    (1 << 0)
17 #define RIB_ENTRY_CHANGED    (1 << 1)
18 #define RIB_ENTRY_SELECTED_FIB    (1 << 2)
19   u_char nexthop_num;        /* Nexthop information. */
20   u_char nexthop_active_num;
21   u_char nexthop_fib_num;
22 };

3、整个路由表的描述:

/* Routing table top structure. */
struct route_table {struct route_node *top;/** Delegate that performs certain functions for this table.*/route_table_delegate_t *delegate;unsigned long count;void *info;     /* User data. */
};

route_table包含了一个二叉树结构来保存所有的路由前缀和下一跳路由表项,prefix结构保持了路由前缀的长度和值,用来做最长前缀匹配:

 1 /* Each routing entry. */
 2 struct route_node {
 3   struct prefix p;   /* Actual prefix of this radix. */
 4   struct route_table *table;   /* Tree link. */
 5   struct route_node *parent;
 6   struct route_node *link[2];
 7   unsigned int lock; /* Lock of this radix */
 8   void *info;        /* Each node of route. */
 9   void *aggregate;   /* Aggregation. */
10
11 #define l_left   link[0]
12 #define l_right  link[1]
13 };

呃,说好的mtire树呢? 好吧,我们不太可能把成千上万的路由表项塞给linux内核,够用就行。

转载于:https://www.cnblogs.com/danxi/p/6285545.html

quagga源码分析--路由信息处理zebra-rib相关推荐

  1. quagga源码分析--大内总管zebra

    zebra,中文翻译是斑马,于是我打开了宋冬野的<斑马,斑马>作为BGM来完成这个篇章,嘿嘿,小资一把! zebra姑且戏称它是quagga项目的大内总管. 因为它负责管理其他所有协议进程 ...

  2. MVC源码分析 - 路由匹配

    上一篇 说到了路由事件注册以及路由表的生成, 前面 也解析到了, 管道事件的建立, 那么接下来, 肯定就是要调用执行这些事件了, 这些就不表了, 我已经得到我想要的部分了, 接下来, 在执行这些管道事 ...

  3. Zebra源码分析-GroupDataSource

    Zebra源码分析-GroupDataSource 1 简介 GroupDataSource是读写分离数据源,由多个SingleDataSource组成,其中有一个主库,用于写操作和一部分指定得读操作 ...

  4. RocketMQ4.0源码分析之-路由管理

    RocketMQ4.0源码分析之-路由管理 一 前言 路由管理功能是RocketMQ的核心功能之一,涵盖了订阅管理,连接管理,负载均衡管理等一系列功能,代码布在NameServer,Broker,Pr ...

  5. (4.2.40)阿里开源路由框架ARouter的源码分析

    一需求背景 1 Android原生方案的不足 2 自定义路由框架的适用场景 3 对自定义路由框架的设想 二ARouter的概述 三ARouter的引入和使用 四源码分析 1 arouter-annot ...

  6. zebra源码分析-导读

    zebra源码分析-导读 客户端架构 JDBC 核心部分介绍 代码流程 数据源 Statement 参考 zebra源码分析-导读 zebra是一个基于JDBC API协议上开发出的高可用.高性能的数 ...

  7. Zebra源码分析-SingleDataSource

    Zebra源码分析-SingleDataSource 1. 简介 1.1 层级结构 1.2 内部结构 2. 使用示例 2.1 直接使用JDBC 2.2 结合MyBatis以及Spring 3.源码分析 ...

  8. Flutter路由管理和页面参数的传递(源码分析)

    前言 上一篇 Flutter路由管理和页面参数的传递(获取&返回) 文章中我们讲述了这么用代码实现 Flutter 中页面参数的传递,这一篇我们用源码分析一下 Navigator 为什么可以进 ...

  9. Django源码分析2:本地运行runserver分析

    django源码分析 本文环境python3.5.2,django1.10.x系列1.根据上一篇文章分析了,django-admin startproject与startapp的分析流程后,根据dja ...

最新文章

  1. node项目发送邮件失败
  2. m4a打开服务器运行失败,WINCC打不开项目,服务器运行失败
  3. Android ble covana,I’m A Lie
  4. CF Gym 101630 B Box
  5. 04737 c++ 自学考试2019版 第五章程序设计题 1
  6. 基于JAVA+SpringMVC+MYSQL的旅行社管理系统
  7. ListView优化机制及滑动时数据时出现的数据错乱重复问题
  8. catalina.home catalina.base 定义 位子 位置
  9. 婚恋职场人格-张晓文-武汉理工大学-中国MOOC-亲密关系测试题参考答案
  10. 空调冷凝水管径选用原则
  11. 推荐算法架构3:精排
  12. Windows win10设置网卡优先级
  13. B to B 与B to C网络支付结算方式区别
  14. caj格式转换成pdf免费的有吗
  15. push大法破解登录框
  16. 图片批量OCR识别--支持各种图片
  17. android 检测软键盘,Android:检测软键盘打开
  18. 特征工程-使用随机森林进行缺失值填补
  19. css-两种画弧线方法
  20. java 获取主机名时报java.net.UnknownHostException

热门文章

  1. bootstrap在ie8下,兼容媒体查询
  2. android地图实时标记
  3. Hadoop namenode启动瓶颈分析
  4. mysql semi-synchronous_MySQL Semisynchronous Replication介绍
  5. java实体类转map_十五道经典面试题-JAVA基础篇
  6. 打游戏提示计算机丢失,Windows7电脑运行某游戏提示“计算机丢失mxvcp120.dll”怎么办...
  7. MATLAB字符串和ASCII码的转换
  8. 汽车电子专业知识篇(六十三)-继电器的结构、工作原理、检测方法
  9. 数据挖掘实战项目-客户流失及客户行为偏好分析
  10. 深度:抖音本地生活服务的真相