quagga源码分析--通用库command

Posted 丹西

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了quagga源码分析--通用库command相关的知识,希望对你有一定的参考价值。

quagga是一个完整又成熟的系统,作为一个路由器软件,自然要提供人机接口。

quagga提供snmp管理接口,而且,自然就会有对应的命令行管理格式,当然一般路由软件不会提供界面形式的,也许有webui,然而quagga并没有。

我们要看的就是这个命令行处理的代码 command。

 

接触过类似命令行的朋友肯定有一点点好奇吧,那么数量庞大的命令和参数输入,还可以提供提示和自动补齐,这肯定不是一件很简单的事情。

下面是一个配置示例:

1 !
2 interface bge0
3 ip ospf authentication message-digest
4 ip ospf message-digest-key 1 md5 ABCDEFGHIJK
5 !
6 router ospf
7 network 192.168.0.0/16 area 0.0.0.1
8 area 0.0.0.1 authentication message-digest

哦哦,看到这样的命令,实在是头疼。

 

嗯,不废话了,我们还是看代码吧,看command是怎么处理这令人头疼的命令行吧:

 1 void cmd_init(int terminal) {
 2    ......
 3 
 4     cmdvec = vector_init(VECTOR_MIN_SIZE);
 5   
 6     /* Install top nodes. */
 7     install_node(&view_node, NULL);
 8     install_node(&enable_node, NULL);
 9 
10     /* Each node‘s basic commands. */
11     install_element(VIEW_NODE, &show_version_cmd);
12 
13     .....
14 }

 

这个就是命令行初始化的简化版本。

quagg使用了非常常见的树形列表来描述所有的命令, cmdvec包含所有的顶层命令节点,节点下面是当前节点的所包含的命令元素,而且树的depth=3.

 1 struct cmd_node 
 2 {
 3   /* Node index. */
 4   enum node_type node;        
 5 
 6   /* Prompt character at vty interface. */
 7   const char *prompt;            
 8 
 9   /* Is this node‘s configuration goes to vtysh ? */
10   int vtysh;
11   
12   /* Node‘s configuration write function */
13   int (*func) (struct vty *);
14 
15   /* Vector of this node‘s command list. */
16   vector cmd_vector;    
17 };

 

以上是关于quagga源码分析--通用库command的主要内容,如果未能解决你的问题,请参考以下文章

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

Quagga代码学习之BGP4

quagga源码学习--BGP协议创建对等体

quagga源码学习--BGP协议路由更新

quagga源码学习--BGP协议对等体的状态机

Quagga的安装