对于各个协议生成的路由信息的处理属于quagga中非常重要的一个功能,如何在内核进行路由增加,更新,删除是一个复杂的过程. quagga在thread任务调度中加入了一种工作队列,work_queue,与内核的工作队列类似,是一种相对而言,低优先级的任务,这里的任务看成类似的系统进程. 1.队列初始化: /* initialise zebra rib work queue */ static void rib_queue_init(struct zebra_t *zebra) { assert(…
zebra,中文翻译是斑马,于是我打开了宋冬野的<斑马,斑马>作为BGM来完成这个篇章,嘿嘿,小资一把! zebra姑且戏称它是quagga项目的大内总管. 因为它负责管理其他所有协议进程的路由信息的更新与交互,并负责与内核交换信息,如下的架构: +----+ +----+ +-----+ +-----+ |bgpd| |ripd| |ospfd| |zebra| +----+ +----+ +-----+ +-----+ | +---------------------------|--+…
上一篇 说到了路由事件注册以及路由表的生成, 前面 也解析到了, 管道事件的建立, 那么接下来, 肯定就是要调用执行这些事件了, 这些就不表了, 我已经得到我想要的部分了, 接下来, 在执行这些管道事件的时候, 肯定就会执行到之前 UrlRoutingModule注册的方法. 接下来, 就看一下, 这个事件干了些什么. 一.OnApplicationPostResolveRequestCache 方法 private void OnApplicationPostResolveRequestCac…
Linux操作系统中当CPU处于内核状态时,可以分为有用户上下文的状态和执行硬件.软件中断两种.其中当处于有用户上下文时,由于内核态和用户态的内 存映射机制不同,不可直接将本地变量传给用户态的内存区:处于硬件.软件中断时,无法直接向用户内存区传递数据,代码执行不可中断.针对传统的进程间通信 机制,他们均无法直接在内核态和用户态之间使用,原因如下表:  通信方法 无法介于内核态与用户态的原因 管道(不包括命名管道) 局限于父子进程间的通信. 消息队列 在硬.软中断中无法无阻塞地接收数据. 信号量…
quagga作为一个路由器软件,自然要提供人机接口. quagga提供snmp管理接口,而且,自然就会有对应的命令行管理格式,当然一般路由软件不会提供界面形式的,也许有webui,然而quagga并没有. 我们要看的就是这个命令行处理的代码 command. 接触过类似命令行的朋友肯定有一点点好奇吧,那么数量庞大的命令和参数输入,还可以提供提示和自动补齐,这肯定不是一件很简单的事情. 下面是一个配置示例: ! interface bge0 ip ospf authentication messa…
quagga是开源路由器软件,提供的用户界面与思科,华为的路由器的人机接口几乎一致,非常有学习价值,尤其是开源的协议代码,简直亮瞎了我的小眼睛. quagga的介绍,我就不赘述了,有兴趣的可以找度娘或者去官网看看. 一.通用库thread quagga是一个纯C实现的项目. C语言的项目,就是一个个C,H文件组成,当C文件很多的时候,相信一开始每个开源爱好者都会感到很头疼吧,完全不知道这么多文件要怎么组织,怎么去阅读吧? 哈,其实呢,quagga的C文件就像一个个散落在地上的珍珠,而thread…
quagga支持BGP-4,BGP-4+协议,支持多协议(mpls,isis,ospf等等)以及单播,组播路由的导入和分发. 具体的协议,这里就不附录了,网络上有很多资料,或者RFC. 协议源码的学习基于前几章的quagga源码分析,所以刚接触的朋友最好浏览一下quagga的通用框架以及通用路由处理流程. 好了,闲话少说,直奔主题才是最要紧的. 一.BGP初始化 初始化在bgp_main.c的main函数里开始,其他协议也类似,比如isis的main函数就在isis_main.c,这个嘛,简单统…
我们知道,在 Laravel 世界里,外界传进来一个 Request 时,会被 Kernel 处理并返回给外界一个 Response.Kernel 在处理 Request 时,会调用 illuminate/routing 包提供的路由功能,来根据当前的 Request,转发到对应的执行逻辑(执行逻辑的形式可以为 Closure 或 Controller@Action).同时,在进入执行逻辑之前和之后,还会依次进入 Middlewares 的前置和后置处理.所以,一个 Request 由 Kern…
前言 Flask是目前为止我最喜欢的一个Python Web框架了,为了更好的掌握其内部实现机制,这两天准备学习下Flask的源码,将由浅入深跟大家分享下,其中Flask版本为1.1.1. 上次了解了Flask服务的启动流程,今天我们来看下路由的内部实现机理. Flask系列文章: Flask开发初探 Flask源码分析一:服务启动 关于路由 所谓路由,就是处理请求URL和函数之间关系的程序. Flask中也是对URL规则进行统一管理的,创建URL规则有两种方式: 使用@app.route修饰器…
这节我们不用@app.route来写路由,而是通过add_url_rule 传统写法  (<int:nid>传递int类型参数,endpoint是取别名) @app.route('/detail/<int:nid>',methods=['GET'],endpoint='detail') 默认转换器 DEFAULT_CONVERTERS = { 'default': UnicodeConverter, 'string': UnicodeConverter, 'any': AnyCon…