Quagga源码框架分析

                                       

  1. Quagga简要介绍

         首先对于quagga有一个基本的认识,quagga是一款开源的路由软件,quagga提供了rip,ospf,bgp等常见的路由协议。有了quagga,机器能利用这些路由协议与其他路由器交换路由信息。并且使用这些信息来更新核心路由表。

bgpd

Ospf6d

ospfd

ripd

           Zebra

Unix kernel router

         Quagga的基本体系如下:

如上,quagga将若干个守护进程聚合起来共同完成路由表的创建,为了在不同的路由协议间,改变核心路由表和再分配路由,专门设置了一个核心路由表管理守护进程zebra。Zebra守护进程可以理解为一种路由管理器,提供内核路由表的更新、接口查询以及不同路由协议的路由信息转换

所以例如我们在单独启动ospfd进程与中心路由进行交互时,可先确定zebra进程的启动,之后开启ospfd进程并建立相关接口,就可以将ospf的路由向中心路由终端发送,并且不会影响到其他进程。

2.源码分析

         在quagga中还有一个特殊的进程vtysh,用户通过vtysh来与quagga交互,所有的命令都是由vtysh输入,这其中也包括zebra和ospfd、ripd等进程。当然这些命令传送给这些进程去处理的结果也会送回显示在vtysh上。

         Vtysh运行后进入到vtysh_main.c的主函数main中,经过一系列的初始化后会等待循环输入命令:

        

输入的命令会传入line_read,通过vtysh_execute来进行后续的解析和执行(可以理解为通过命令对应的字段,来标志该命令会输入哪个进程,并由该进程来进行后续处理

那么如何来定义和添加一个命令呢:

  1. 找到该命令所在视图,若视图不存在,则需要定义该视图;

(2)  定义声明该命令的宏,并将命令注册到对应视图下;

(3)  定义命令具体动作;

2.1定义并引入node(以ospf为例)

         Node这里即指vtysh下的视图模式,而对应命令都是在视图下注册的,视图的作用区分哪些命令在本视图下有效,而哪些无效。

         在vtysh.c中定义了node:

其中先看command.h中cmd_node结构体的定义:

首先是node_type,(该枚举字段列举了所有的视图关键字)要定义一个视图,首先要在枚举中添加该视图,prompt字段则是进入该视图后命令行前端显示的提示字符。以ospf为例:

如图,需在node_type类型中(这里我只截取了一部分,还有其他很多视图结点)添加OSPF_NODE结点。而

正是对OSPF_NODE结点的初始化。

在定义完node之后,需将其引入到vtysh中,

2.2添加ospf具体command

如上我们将具体命令ospf_router_id_cmd注册到结点OSPF_NODE下,而ospf_router_id_cmd(其数据结构类型为struct cmd_element,会使用DEFUN_CMD_ELEMENT给与赋值,见下)则是通过下列宏方式定义来具体实现的(这里以ospf为例,在其他地方有的也使用其他的宏定义来定义命令,但本质是类似的):

其中DEFUN_CMD_FUNC_DECL(funcname)是函数的声明:

  • 17
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Quagga和Zebra是两个开源的网络路由软件套件。Zebra是一个基于BSD授权的路由软件套件,提供了OSPF、BGP、RIP、RIPng等协议的实现。而Quagga则是Zebra的一个分支,目前由社区维护,支持更多的协议,包括IS-IS、OSPFv3、PIM、RIPng等。 下面我们来简要分析一下Quagga和Zebra的源码结构: 1. Quagga Quagga的源码主要分为以下几个部分: - bgpd:BGP协议的实现。 - ospfd:OSPF协议的实现。 - ospf6d:OSPFv3协议的实现。 - ripd:RIP协议的实现。 - ripngd:RIPng协议的实现。 - isisd:ISIS协议的实现。 - pimd:PIM协议的实现。 - vtysh:用户交互界面。 其中,每个协议的实现都在对应的目录下,包括配置文件的解析、协议控制块的管理、路由表的维护等。而vtysh则是一个基于GNU Readline的交互式命令行界面,用于用户与Quagga的交互。 2. Zebra Zebra的源码主要分为以下几个部分: - zebra:路由守护进程,负责各个协议之间的协调和管理。 - lib:公共库,包括路由表、控制块、事件机制等。 - ospf:OSPF协议的实现。 - ospf6:OSPFv3协议的实现。 - bgp:BGP协议的实现。 - ripd:RIP协议的实现。 - ripng:RIPng协议的实现。 在Zebra中,路由表、控制块等公共部分的实现都在lib目录下,而各个协议的实现则在对应的目录下。 总体来说,Quagga和Zebra的源码结构比较清晰,各个协议之间的代码实现相对独立,方便开发者进行二次开发和定制。同时,它们的协议实现也比较完善,可以满足不同场景下的路由需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值