- 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来进行后续的解析和执行(可以理解为通过命令对应的字段,来标志该命令会输入哪个进程,并由该进程来进行后续处理)
那么如何来定义和添加一个命令呢:
- 找到该命令所在视图,若视图不存在,则需要定义该视图;
(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)是函数的声明: