ZEBRA命令的注册一共分为四种,对应四种不同的宏:
1. DEFUN(funcname,cmdname,cmd,str,helpstr) 定义命令的执行函数
2. DEFUN_NOSH(funcname,cmdname,cmdstr,helpstr) 定义vtysh不作处理的命令
3. DEFSH(daemon,cmdname,cmdstr,helpstr) 定义在vtysh中实行的函数
4. DEFUNSH(daemon,funcname,cmdname,cmdstr,helpstr) 1,3两种情况结合
大多数情况下会需要下面的宏来定义:
DEFUN(funcname,cmdname,cmdstr,helpstr)
如配置pppoe服务器模板中的服务
DEFUN(pppoe_service_name,//命令处理函数的名字
pppoe_service_name_cmd, //命令的名字
"service WORD", //命令的表现字符串
"configure pppoe service\n"//注释信息
"pppoe service name,max length 64\n"){}
install_element(PPPOE_SUBSCRIBER_NODE,&pppoe_service_name_cmd);
有部分命令不需要在vtysh注册的,需要用下面的函数:
DEFUN_NOSH(funcname,cmdname,cmdstr,helpstr)
如:DEFUN_NOSH(clear_console,
clear_console_cmd,
"clear tty",
"clean the operator\n"
"clean operator from telnet,SSH and Console,not include operator \n"){}
install_element(ENABLE_NODE,&clear_console_cmd);
有部分命令必须在vtysh中注册,需要用下面的函数
DEFSH(daemon,cmdname,cmdstr,helpstr)
这个函数只在vtysh中使用,知识注册一个命令,没有具体的函数,使用这个在vtysh中注册的命令还需要在相应的模块使用DEFUN注册一遍。
(需补充)如
DEFSH(VTYSH_ACL,//命令发送模块
vtysh_show_ip_access_list_cmd,
"show ip access-list",
SHOW_STR
IP_STR
"List IP access lists\n")
有的命令除了需要在自己的模块中执行,还需要在vtysh模块中执行,这个时候在vtysh中需要用到下面的宏:
DEFUNSH(daemon,funcname,cmdname.cmdstr,helpstr)
如命令:“subscriber-template pppoe NAME”
在vtysh.c中:
DEFUNSH(VTYSH_VPDN, //发送的目标进程
sub_pppoe,//函数名字
sub_pppoe_cmd, //命令名字
"subscriber-template pppoe NAME",//命令字符串
"define subscriber template\n""template tye\n"//命令注释){}
install_element(CONFIG_NODE,&sub_pppoe_cmd);
在vpdn/pppoe_sub.c中:
DEFUN(temp_pppoe,
temp_pppoe_cmd,
"subscriber-template pppoe NAME",
"configure subscriber-template\n"
"template type\n"
"template name,max length64\n"){}
install_element(CONFIG_NODE,&temp_pppoe_cmd);
添加完命令后,需要在hsos目录下重新编译,或者在修改的目录中编译,在VTYSH中执行make rebuild4,这种情况需要把vtysh和修改的模块拷贝到设备上。