quagga中cli命令分析

2024-01-20 22:38
文章标签 分析 命令 cli quagga

本文主要是介绍quagga中cli命令分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在已有的命令视图中新增加命令


定义命令并处理

  • 定义命令,
    DEFUN(处理函数,命令名称,命令字符串,帮助信息)
#define DEFUN(funcname, cmdname, cmdstr, helpstr) \DEFUN_CMD_FUNC_DECL(funcname) \DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, 0, 0) \DEFUN_CMD_FUNC_TEXT(funcname)
DEFUN (vpnv4_route_target_import,vpnv4_route_target_import_cmd,"rt-import ASN:nn","Route target import\n""ASN:nn, e.g., 100:1\n")
{return bgp_vpn_rt_import (SAFI_MPLS_VPN, vty, argv[0]);
}
处理函数声明: 
Static int bgp_vpn_rt_import (safi_t safi, struct vty *vty, const char *rt_str); 
  • 处理函数实现;
intbgp_vpn_rt_import (safi_t safi, struct vty *vty,const char *rt_str)
{return CMD_SUCCESS;
}
  • 安装该命令到对应的命令视图下,
    Install_element(命令视图,命令名称)
void
bgp_mplsvpn_init (void)
{install_element (BGP_VPNV4_NODE, &vpnv4_network_cmd);install_element (BGP_VPNV4_NODE, &vpnv4_network_route_map_cmd);install_element (BGP_VPNV4_NODE, &vpnv4_route_target_import_cmd);install_element (BGP_VPNV4_NODE, &vpnv4_route_target_export_cmd);...
}

show running显示命令

  • show running读取命令的位置
/* Write current configuration into the terminal. */
ALIAS (config_write_terminal,show_running_config_cmd,"show running-config",SHOW_STR"running configuration\n")

可以看到show running使用的是config_write_terminal这个函数体,它的实现在:

/* Write current configuration into the terminal. */
DEFUN (config_write_terminal,config_write_terminal_cmd,"write terminal","Write running configuration to memory, network, or terminal\n""Write to terminal\n")
{unsigned int i;struct cmd_node *node;if (vty->type == VTY_SHELL_SERV){for (i = 0; i < vector_active (cmdvec); i++)if ((node = vector_slot (cmdvec, i)) && node->func && node->vtysh){if ((*node->func) (vty))vty_out (vty, "!%s", VTY_NEWLINE);}}else{vty_out (vty, "%sCurrent configuration:%s", VTY_NEWLINE,VTY_NEWLINE);vty_out (vty, "!%s", VTY_NEWLINE);for (i = 0; i < vector_active (cmdvec); i++)if ((node = vector_slot (cmdvec, i)) && node->func){if ((*node->func) (vty))vty_out (vty, "!%s", VTY_NEWLINE);}vty_out (vty, "end%s",VTY_NEWLINE);}return CMD_SUCCESS;
}

执行show running时调用了node->func函数,install_node时会给node->func赋值:

/* Install top node of command vector. */
void
install_node (struct cmd_node *node, int (*func) (struct vty *))
{vector_set_index (cmdvec, node->node, node);node->func = func;node->cmd_vector = vector_init (VECTOR_MIN_SIZE);
}

只要func不为null,调用show running就会执行此函数。以BGP为例,install_node定义的位置如下:

void
bgp_vty_init (void)
{/* Install bgp top node. */install_node (&bgp_node, bgp_config_write);install_node (&bgp_ipv4_unicast_node, NULL);install_node (&bgp_ipv4_multicast_node, NULL);install_node (&bgp_ipv6_unicast_node, NULL);install_node (&bgp_ipv6_multicast_node, NULL);install_node (&bgp_vpnv4_node, NULL);install_node (&bgp_vpnv6_node, NULL);install_node (&bgp_encap_node, NULL);install_node (&bgp_encapv6_node, NULL);/* Install default VTY commands to new nodes.  */install_default (BGP_NODE);install_default (BGP_IPV4_NODE);...}

可以看到执行的是bgp_config_write函数,可以把需要显示的命令及数值添加到函数里,以配置的bgp vpn rt为例,需要在对应的node视图下添加:

vty_out (vty, " rt-export %s", rt_export_buf);vty_out (vty, "%s", VTY_NEWLINE);

在quagga的基础上新增加命令视图(转)

  • 定义命令视图类型,enum node_type ;
  • 定义命令视图结构,struct cmd_node;
    Static struct cmd_node 视图名称={
    命令视图类型,
    该视图下的提示符字符串,
    };
  • 安装命令视图,install_node(),install_default();
    Install_node(视图名称,回调函数)
    Install_default(视图类型)

这篇关于quagga中cli命令分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/627564

相关文章

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

MySQL中的表连接原理分析

《MySQL中的表连接原理分析》:本文主要介绍MySQL中的表连接原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、环境3、表连接原理【1】驱动表和被驱动表【2】内连接【3】外连接【4编程】嵌套循环连接【5】join buffer4、总结1、背景

postgresql数据库基本操作及命令详解

《postgresql数据库基本操作及命令详解》本文介绍了PostgreSQL数据库的基础操作,包括连接、创建、查看数据库,表的增删改查、索引管理、备份恢复及退出命令,适用于数据库管理和开发实践,感兴... 目录1. 连接 PostgreSQL 数据库2. 创建数据库3. 查看当前数据库4. 查看所有数据库

python中Hash使用场景分析

《python中Hash使用场景分析》Python的hash()函数用于获取对象哈希值,常用于字典和集合,不可变类型可哈希,可变类型不可,常见算法包括除法、乘法、平方取中和随机数哈希,各有优缺点,需根... 目录python中的 Hash除法哈希算法乘法哈希算法平方取中法随机数哈希算法小结在Python中,

Java Stream的distinct去重原理分析

《JavaStream的distinct去重原理分析》Javastream中的distinct方法用于去除流中的重复元素,它返回一个包含过滤后唯一元素的新流,该方法会根据元素的hashcode和eq... 目录一、distinct 的基础用法与核心特性二、distinct 的底层实现原理1. 顺序流中的去重

linux重启命令有哪些? 7个实用的Linux系统重启命令汇总

《linux重启命令有哪些?7个实用的Linux系统重启命令汇总》Linux系统提供了多种重启命令,常用的包括shutdown-r、reboot、init6等,不同命令适用于不同场景,本文将详细... 在管理和维护 linux 服务器时,完成系统更新、故障排查或日常维护后,重启系统往往是必不可少的步骤。本文

关于MyISAM和InnoDB对比分析

《关于MyISAM和InnoDB对比分析》:本文主要介绍关于MyISAM和InnoDB对比分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录开篇:从交通规则看存储引擎选择理解存储引擎的基本概念技术原理对比1. 事务支持:ACID的守护者2. 锁机制:并发控制的艺

nginx启动命令和默认配置文件的使用

《nginx启动命令和默认配置文件的使用》:本文主要介绍nginx启动命令和默认配置文件的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录常见命令nginx.conf配置文件location匹配规则图片服务器总结常见命令# 默认配置文件启动./nginx

基于Python实现一个Windows Tree命令工具

《基于Python实现一个WindowsTree命令工具》今天想要在Windows平台的CMD命令终端窗口中使用像Linux下的tree命令,打印一下目录结构层级树,然而还真有tree命令,但是发现... 目录引言实现代码使用说明可用选项示例用法功能特点添加到环境变量方法一:创建批处理文件并添加到PATH1

MyBatis Plus 中 update_time 字段自动填充失效的原因分析及解决方案(最新整理)

《MyBatisPlus中update_time字段自动填充失效的原因分析及解决方案(最新整理)》在使用MyBatisPlus时,通常我们会在数据库表中设置create_time和update... 目录前言一、问题现象二、原因分析三、总结:常见原因与解决方法对照表四、推荐写法前言在使用 MyBATis