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

相关文章

Linux查询服务器 IP 地址的命令详解

《Linux查询服务器IP地址的命令详解》在服务器管理和网络运维中,快速准确地获取服务器的IP地址是一项基本但至关重要的技能,下面我们来看看Linux中查询服务器IP的相关命令使用吧... 目录一、hostname 命令:简单高效的 IP 查询工具命令详解实际应用技巧注意事项二、ip 命令:新一代网络配置全

Linux grep 命令的使用指南

《Linuxgrep命令的使用指南》本文给大家介绍Linuxgrep命令的使用指南,包括基础搜索语法、实践指南,感兴趣的朋友跟随小编一起看看吧... 目录linux grep 命令全面使用指南一、基础搜索语法1. 基本文本搜索2. 多文件搜索二、常用选项详解1. 输出控制选项2. 上下文控制选项三、正则表达

Android 缓存日志Logcat导出与分析最佳实践

《Android缓存日志Logcat导出与分析最佳实践》本文全面介绍AndroidLogcat缓存日志的导出与分析方法,涵盖按进程、缓冲区类型及日志级别过滤,自动化工具使用,常见问题解决方案和最佳实... 目录android 缓存日志(Logcat)导出与分析全攻略为什么要导出缓存日志?按需过滤导出1. 按

DNS查询的利器! linux的dig命令基本用法详解

《DNS查询的利器!linux的dig命令基本用法详解》dig命令可以查询各种类型DNS记录信息,下面我们将通过实际示例和dig命令常用参数来详细说明如何使用dig实用程序... dig(Domain Information Groper)是一款功能强大的 linux 命令行实用程序,通过查询名称服务器并输

Linux中的HTTPS协议原理分析

《Linux中的HTTPS协议原理分析》文章解释了HTTPS的必要性:HTTP明文传输易被篡改和劫持,HTTPS通过非对称加密协商对称密钥、CA证书认证和混合加密机制,有效防范中间人攻击,保障通信安全... 目录一、什么是加密和解密?二、为什么需要加密?三、常见的加密方式3.1 对称加密3.2非对称加密四、

MySQL中读写分离方案对比分析与选型建议

《MySQL中读写分离方案对比分析与选型建议》MySQL读写分离是提升数据库可用性和性能的常见手段,本文将围绕现实生产环境中常见的几种读写分离模式进行系统对比,希望对大家有所帮助... 目录一、问题背景介绍二、多种解决方案对比2.1 原生mysql主从复制2.2 Proxy层中间件:ProxySQL2.3

setsid 命令工作原理和使用案例介绍

《setsid命令工作原理和使用案例介绍》setsid命令在Linux中创建独立会话,使进程脱离终端运行,适用于守护进程和后台任务,通过重定向输出和确保权限,可有效管理长时间运行的进程,本文给大家介... 目录setsid 命令介绍和使用案例基本介绍基本语法主要特点命令参数使用案例1. 在后台运行命令2.

python使用Akshare与Streamlit实现股票估值分析教程(图文代码)

《python使用Akshare与Streamlit实现股票估值分析教程(图文代码)》入职测试中的一道题,要求:从Akshare下载某一个股票近十年的财务报表包括,资产负债表,利润表,现金流量表,保存... 目录一、前言二、核心知识点梳理1、Akshare数据获取2、Pandas数据处理3、Matplotl

python panda库从基础到高级操作分析

《pythonpanda库从基础到高级操作分析》本文介绍了Pandas库的核心功能,包括处理结构化数据的Series和DataFrame数据结构,数据读取、清洗、分组聚合、合并、时间序列分析及大数据... 目录1. Pandas 概述2. 基本操作:数据读取与查看3. 索引操作:精准定位数据4. Group

MySQL中EXISTS与IN用法使用与对比分析

《MySQL中EXISTS与IN用法使用与对比分析》在MySQL中,EXISTS和IN都用于子查询中根据另一个查询的结果来过滤主查询的记录,本文将基于工作原理、效率和应用场景进行全面对比... 目录一、基本用法详解1. IN 运算符2. EXISTS 运算符二、EXISTS 与 IN 的选择策略三、性能对比