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 join命令的使用及说明

《Linuxjoin命令的使用及说明》`join`命令用于在Linux中按字段将两个文件进行连接,类似于SQL的JOIN,它需要两个文件按用于匹配的字段排序,并且第一个文件的换行符必须是LF,`jo... 目录一. 基本语法二. 数据准备三. 指定文件的连接key四.-a输出指定文件的所有行五.-o指定输出

Linux jq命令的使用解读

《Linuxjq命令的使用解读》jq是一个强大的命令行工具,用于处理JSON数据,它可以用来查看、过滤、修改、格式化JSON数据,通过使用各种选项和过滤器,可以实现复杂的JSON处理任务... 目录一. 简介二. 选项2.1.2.2-c2.3-r2.4-R三. 字段提取3.1 普通字段3.2 数组字段四.

Nginx分布式部署流程分析

《Nginx分布式部署流程分析》文章介绍Nginx在分布式部署中的反向代理和负载均衡作用,用于分发请求、减轻服务器压力及解决session共享问题,涵盖配置方法、策略及Java项目应用,并提及分布式事... 目录分布式部署NginxJava中的代理代理分为正向代理和反向代理正向代理反向代理Nginx应用场景

Redis中的有序集合zset从使用到原理分析

《Redis中的有序集合zset从使用到原理分析》Redis有序集合(zset)是字符串与分值的有序映射,通过跳跃表和哈希表结合实现高效有序性管理,适用于排行榜、延迟队列等场景,其时间复杂度低,内存占... 目录开篇:排行榜背后的秘密一、zset的基本使用1.1 常用命令1.2 Java客户端示例二、zse

Redis中的AOF原理及分析

《Redis中的AOF原理及分析》Redis的AOF通过记录所有写操作命令实现持久化,支持always/everysec/no三种同步策略,重写机制优化文件体积,与RDB结合可平衡数据安全与恢复效率... 目录开篇:从日记本到AOF一、AOF的基本执行流程1. 命令执行与记录2. AOF重写机制二、AOF的

java中ssh2执行多条命令的四种方法

《java中ssh2执行多条命令的四种方法》本文主要介绍了java中ssh2执行多条命令的四种方法,包括分号分隔、管道分隔、EOF块、脚本调用,可确保环境配置生效,提升操作效率,具有一定的参考价值,感... 目录1 使用分号隔开2 使用管道符号隔开3 使用写EOF的方式4 使用脚本的方式大家平时有没有遇到自

Linux命令rm如何删除名字以“-”开头的文件

《Linux命令rm如何删除名字以“-”开头的文件》Linux中,命令的解析机制非常灵活,它会根据命令的开头字符来判断是否需要执行命令选项,对于文件操作命令(如rm、ls等),系统默认会将命令开头的某... 目录先搞懂:为啥“-”开头的文件删不掉?两种超简单的删除方法(小白也能学会)方法1:用“--”分隔命

MyBatis Plus大数据量查询慢原因分析及解决

《MyBatisPlus大数据量查询慢原因分析及解决》大数据量查询慢常因全表扫描、分页不当、索引缺失、内存占用高及ORM开销,优化措施包括分页查询、流式读取、SQL优化、批处理、多数据源、结果集二次... 目录大数据量查询慢的常见原因优化方案高级方案配置调优监控与诊断总结大数据量查询慢的常见原因MyBAT

分析 Java Stream 的 peek使用实践与副作用处理方案

《分析JavaStream的peek使用实践与副作用处理方案》StreamAPI的peek操作是中间操作,用于观察元素但不终止流,其副作用风险包括线程安全、顺序混乱及性能问题,合理使用场景有限... 目录一、peek 操作的本质:有状态的中间操作二、副作用的定义与风险场景1. 并行流下的线程安全问题2. 顺

MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决

《MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决》MyBatis默认开启一级缓存,同一事务中循环调用查询方法时会重复使用缓存数据,导致获取的序列主键值均为1,... 目录问题原因解决办法如果是存储过程总结问题myBATis有如下代码获取序列作为主键IdMappe