quagga源码分析--路由信息处理zebra-rib

对于各个协议生成的路由信息的处理属于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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/373106.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android 关闭蓝牙打电话功能,Android蓝牙开发【八】hfp接听、挂断电话

继续研究hfp相关功能。蓝牙耳机可以控制手机接听、拒接、挂断电话&#xff0c;拨打电话等功能。本文主要分析下起这些操作的大致流程。在系统应用Bluetooth中com_android_bluetooth.cpp提供了多个回调方法&#xff0c;由hardware、协议栈回调过来。蓝牙耳机的一些控制命令都会发…

android在listview中放入从sdcard读取的bitmap

重写viewbinder public class viewbinder_bookmark implements SimpleAdapter.ViewBinder{Overridepublic boolean setViewValue(View view, Object data, String textRepresentation){if(view instanceof ImageView && data instanceof Bitmap){ImageView imageview(I…

将状态机模式实现为流处理器

在我的上一个博客中&#xff0c;我说我真的以为某些“四人行”&#xff08;GOF&#xff09;模式已经过时了&#xff0c;如果不是过时的话肯定不受欢迎。 特别是我说过StateMachine不是那么有用&#xff0c;因为您通常会想到另一种更简单的方式来执行您正在执行的事情&#xff0…

android 自定义actionbar,如何让android的actionbar浮动且透明

如上图所示&#xff0c;谷歌地图的actionbar是透明的&#xff0c;且浮动在整个布局之上&#xff0c;没有占用布局空间。其实要做到这样的效果&#xff0c;我们首先想到的是两个方面&#xff1a;1.将让actionbar浮动起来。2.给actionbar一个背景&#xff0c;可以为颜色也可以为图…

CentOS 7安装redis及php扩展

安装remi源 # wget http://rpms.famillecollet.com/enterprise/remi-release-7.rpm # rpm -Uvh remi-release-7.rpm # sed -i -e "s/enabled1/enabled0/g" /etc/yum.repos.d/remi.repo 确认使用remi源时安装的Redis版本。 安装Redis 使用remi源yum安装Redis。 # yum …

对Openshift上的Play Framework 2应用进行故障排除

Openshift故障排除 使用“ 自己动手”应用程序类型&#xff0c;您实际上可以有很大的自由度来支持几乎可以在Linux机器上构建和运行的任何框架或服务器。 但是您必须做功课&#xff0c;并做一些研究。 因此&#xff0c;在本文中&#xff0c;我将向您展示一些我在使用Openshift和…

关于更换头像的整个过程理解

之前我遇到一个问题&#xff0c;就是怎样修改头像&#xff0c;都没有更改&#xff0c;后来把某个参数置为null&#xff0c;就解决了问题&#xff0c;但是知其然还要知其所以然&#xff0c;现在还是着重去梳理整个流程 头像&#xff0c;需要关注的是3个变量&#xff1a; 本地地址…

Ajax与CustomErrors的尴尬

在ASP.NET程序中&#xff0c;为了给用户显示友好的错误信息&#xff0c;通常在web.config中进行如下的设置&#xff1a; <customErrors mode"RemoteOnly" defaultRedirect"/error/error.htm"> </customErrors> 但如果是一个ajax请求在服务端发…

JSF开发人员应该知道的5种有用方法

这篇文章的目的是总结一些JSF开发人员可以在日常工作中使用的便捷方法。 实用程序类是将所有方法放在一起的好地方。 我会称此类为FacesAccessor。 第一种方法可能是最常用的方法。 它以给定名称返回托管bean。 必须按faces-config.xml或注释注册该bean。 注入是好的&#xff0…

android项目编码规范,Android 项目规范

Android 项目规范本文档的目的是定义项目规范。这些应遵循整个 Android 项目以帮助我们保持整洁和统一的代码库。 &#x1f642;

Java创建WebService服务及客户端实现

简介 WebService是一种服务的提供方式&#xff0c;通过WebService&#xff0c;不同应用间相互间调用变的很方便&#xff0c;网络上有很多常用的WebService服务&#xff0c;如&#xff1a;http://developer.51cto.com/art/200908/147125.htm&#xff0c;不同的语言平台对…

01-17权限管理

管理页面&#xff1a; <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns"http://www.w3.org/1999/xhtml"><head><meta http-equi…

Java静态方法可能会产生代码异味

代码气味的定义 &#xff08;来自维基百科&#xff09;&#xff1a; “程序源代码中任何可能表明存在更深层问题的症状。” 在Java中&#xff0c; 静态方法允许您在“类范围”内执行代码&#xff0c;而不是像成员方法这样的实例范围。 这意味着&#xff0c;它们依赖于类级别的变…

android json 解析图片,JSON解析并获取android中的图像

我想解析包含字符串和图像的JSON对象。我的代码正在工作&#xff0c;但它加载图像太慢。我想加载另一个asynctask或服务的图像&#xff0c;以减少加载时间。我怎样才能做到这一点&#xff1f;哪一个是最好的方法使用asynctask或服务&#xff1f;这里是我的代码JSON解析并获取an…

Node Express4.x 片段视图 partials

1.在Express 4.x使用片段视图&#xff0c;需要引入partials模块 步骤&#xff1a; 1.在全局中安装express-partials模块&#xff1a; 2.在本地模块中安装express-partials,将模块安装到package.json中&#xff1a; 3.在入口文件(如&#xff1a;app.js)中引入模块&#xff1a; v…

bzoj1690:[Usaco2007 Dec]奶牛的旅行(分数规划+spfa判负环)

PS:此题数组名皆引用&#xff1a;戳我 题目大意&#xff1a;有n个点m条有向边的图&#xff0c;边上有花费&#xff0c;点上有收益&#xff0c;点可以多次经过&#xff0c;但是收益不叠加&#xff0c;边也可以多次经过&#xff0c;但是费用叠加。求一个环使得收益和/花费和最大&…

安全密码存储–请勿做的事和Java示例

安全存储密码的重要性 作为软件开发人员&#xff0c;我们最重要的职责之一就是保护用户的个人信息。 没有我们应用程序的技术知识&#xff0c;用户别无选择&#xff0c;只能相信我们正在履行这一责任。 令人遗憾的是&#xff0c;在密码方面&#xff0c;软件开发社区的记录不一。…

红米note4x Android7,红米Note4X能升级安卓7.0吗?红米Note4X如何升级Android7.0?

欢迎来到PPL网站的行业资讯知识分类&#xff0c;你现在观看的这篇文章要和大家分享的是关于红米Note4X能升级安卓7.0吗&#xff1f;红米Note4X如何升级Android7.0&#xff1f;的一些相关内容&#xff0c;希望大家能够感兴趣&#xff0c;并且希望我们能够帮助到你&#xff01;在…

java基础----数字签名算法的介绍

数字签名&#xff08;又称公钥数字签名&#xff09;是一种类似写在纸上的普通的物理签名&#xff0c;但是使用了公钥加密领域的技术实现&#xff0c;用于鉴别数字信息的方法。关于数字签名的介绍&#xff0c;可以参见百度百科&#xff1a;http://baike.baidu.com/view/7626.htm…

Android宫格自动换行,九宫格视图的布局及展示(相册选择)

上周一个朋友带的项目出了点问题&#xff0c;招的ios开发人员在实现选取相册图片后用九宫格的样式展示时遇到了瓶颈&#xff0c;花了将近2周都没有解决。后来在跟我交流的过程中他把项目的图片发给我看了下&#xff0c;看完我就笑了&#xff0c;这就只是个算法的问题&#xff0…