quagga源码分析--通用库command

丹西 丹西     2022-08-03     601

关键词:

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源码分析--大内总管zebra

...BGM来完成这个篇章,嘿嘿,小资一把!zebra姑且戏称它是quagga项目的大内总管。因为它负责管理其他所有协议进程的路由信息的更新与交互,并负责与内核交换信息,如下的架构:1+----++----++-----++-----+2|bgpd||ripd||ospfd||zebra|3+----++--... 查看详情

docker源码分析client2

...何执行命令的处理都在cli目录之下,以image的pull为例/cli/command/commands/commands.go AddCommands函数增加命令注册pull命令在image.NewImageCommand(dockerCli)里面/cli/command/image/cmd.go里定义了增 查看详情

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

...义,报文还是在一个一个网络节点传输的,所以我们看到quagga这样多的传统网络配置命令不要觉得繁琐,不配置的话,协议不会工作哦。 嗯,这章的主题是创建对等体,就是通过 查看详情

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

BGP的核心就是交换路由,所以关键的部分还是在路由的更新与撤销上面,这之间包含了冗长的属性,community等等处理过程,不做详述。bgp_read函数是路由更新的事件处理函数,在收到BGP_MSG_UPDATE消息的时候开始调用bgp_update_receive... 查看详情

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

创建完bgppeer之后,就要bgpstart了,不然费那么大劲创建出来不做事情就销毁了,就很尴尬了。那么对等体一旦start起来,就会进入各自的状态,在不同的状态下处理各自的事件消息。下面列举一些状态和事件的集合:1/*BGPfinitestat... 查看详情

ffmpeg源码简单分析:结构体成员管理系统-avoption

=====================================================FFmpeg的库函数源码分析文章列表:【架构图】FFmpeg源码结构图-解码FFmpeg源码结构图-编码【通用】FFmpeg源码简单分析:av_register_all()FFmpeg源码简单分析:avcodec_register_all()FFmpeg源码简单分析... 查看详情

quagga的安装

QUAGGA是一款开源的路由软件,也是zebra(已经停止更新)的升级维护版本。作用:将Linux设备变成一个功能完整的路由器。支持的协议:rip,ospf,bgp等。 各种简单的介绍使用方法啊等等什么的可以去官网搜刮一下!官网:http... 查看详情

ffmpeg源码简单分析:libswscale的sws_scale()

=====================================================FFmpeg的库函数源码分析文章列表:【架构图】FFmpeg源码结构图-解码FFmpeg源码结构图-编码【通用】FFmpeg源码简单分析:av_register_all()FFmpeg源码简单分析:avcodec_register_all()FFmpeg源码简单分析... 查看详情

reactnativeautolinking源码深入分析(代码片段)

...eConfig2.1、getReactNativeConfig2.2、bin.js2.3setupAndRun2.4loadConfig2.5commander.parse(process.argv);2.6projectConfig2.7dependencyConfig3、addReactNativeModuleProjects4、addReactNativeModuleProjects5、generatePackagesFile关于linklink就是把node_modules中某个库的原生部分,... 查看详情

qtcreator源码全方面分析(2-2)

...扩展现有菜单或者创建一个新的菜单Core::ActionManager,Core::Command添加可配置的键盘快捷方式注册快捷方式,使用户可以在通用快捷方式设置对话框中对其进行配置Core::ActionManager,Core::Command添加一个模式模式对应于完整屏幕控制,专... 查看详情

selenium源码通读·12|webdriver/remote分析(代码片段)

·12|webdriver/remote分析1源码路径2功能说明3部分功能详解3.1command.py3.2errorhandler.py1源码路径selenium/webdriver/remote2功能说明方法描述说明command.pyDefinesconstantsforthestandardWebDrivercommands定义标准WebDriver命令的常量errorhandler.p 查看详情

quagga代码学习之bgp4

文中理解参考:http://www.cnblogs.com/danxi/p/6344116.html等关于Quagga的源码学习 第一部分:入口函数int main(intargc,char**argv) //bgp_main.cvty_init(bm->master)bgp_init() //installcommandbgp_scan_init() 查看详情

android逆向android逆向通用工具开发(静态库项目中的网络操作核心类cnetwork分析)(代码片段)

...章目录一、adabingo静态库项目中的网络操作核心类CNetwork分析一、adabingo静态库项目中的网络操作核心类CNetwork分析CNetwork相关方法分析:等待客户端上线:CNetwork::WaitClientOnline(),模拟器/真机中运行的cmd程序,可能在PC端hacktool工具之前/... 查看详情

flutterdio源码分析(四)--封装

参考技术AFlutterDio源码分析(一)--Dio介绍FlutterDio源码分析(二)--HttpClient、Http、Dio对比FlutterDio源码分析(三)--深度剖析FlutterDio源码分析(四)--封装FlutterDio源码分析(一)--Dio介绍视频教程FlutterDio源码分析(二)--HttpClient、Http、Dio对比视频... 查看详情

winvnc源码分析——io之rdr库

rdr是winvnc用来io操作的一个库工程。IO操作无非两种,写入和读取数据,所以这里每个类都相应地分成了IN和OUT两种操作,先分析IN。  viewplainclass InStream   public:    virtual ~InStream()     // check() ensures there is ... 查看详情

redis专栏(使用介绍源码分析常见问题...)(代码片段)

...Redis特性,使用场景,使用Jedis操作Redis等。二、源码分析1.数据结构Redis源码分析(sds):Redis自己封装的C语言字符串类型。Redis源码分析(dict):字典的实现,Hash表。Redis源码分析(adlist)&#... 查看详情

reactnativeautolinking源码深入分析(代码片段)

目录关于linkautolink源码分析1、native_modules.gradle2、getReactNativeConfig2.1、getReactNativeConfig2.2、bin.js2.3setupAndRun2.4loadConfig2.5commander.parse(process.argv);2.6projectConfig2.7dependencyConfig3、addR 查看详情

reactnativeautolinking源码深入分析(代码片段)

目录关于linkautolink源码分析1、native_modules.gradle2、getReactNativeConfig2.1、getReactNativeConfig2.2、bin.js2.3setupAndRun2.4loadConfig2.5commander.parse(process.argv);2.6projectConfig2.7dependencyConfig3、addR 查看详情