3 * Copyright (C) 2018 Cumulus Networks, Inc.
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the Free
8 * Software Foundation; either version 2 of the License, or (at your option)
11 * This program is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
16 * You should have received a copy of the GNU General Public License along
17 * with this program; see the file COPYING; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
25 #include "termtable.h"
30 #include "vrrp_memory.h"
31 #ifndef VTYSH_EXTRACT_PL
32 #include "vrrpd/vrrp_vty_clippy.c"
36 #define VRRP_STR "Virtual Router Redundancy Protocol\n"
37 #define VRRP_VRID_STR "Virtual Router ID\n"
38 #define VRRP_PRIORITY_STR "Virtual Router Priority\n"
39 #define VRRP_IP_STR "Virtual Router IPv4 address\n"
41 #define VROUTER_GET_VTY(_vty, _vrid, _vr) \
43 _vr = vrrp_lookup(_vrid); \
46 "%% Please configure VRRP instance %u\n", \
47 (unsigned int)_vrid); \
48 return CMD_WARNING_CONFIG_FAILED; \
52 DEFUN_NOSH (show_debugging_vrrpd
,
53 show_debugging_vrrpd_cmd
,
54 "show debugging [vrrp]",
59 vty_out(vty
, "VRRP debugging status\n");
66 "[no] vrrp (1-255)$vrid",
71 VTY_DECLVAR_CONTEXT(interface
, ifp
);
73 vrrp_vrouter_create(ifp
, vrid
);
80 "[no] vrrp (1-255)$vrid priority (1-255)",
85 "Priority value; set 255 to designate this Virtual Router as Master\n")
87 struct vrrp_vrouter
*vr
;
88 bool need_restart
= false;
89 int ret
= CMD_SUCCESS
;
91 VROUTER_GET_VTY(vty
, vrid
, vr
);
93 need_restart
= (vr
->fsm
.state
!= VRRP_STATE_INITIALIZE
);
97 "%% WARNING: Restarting Virtual Router %ld to update priority\n",
99 (void) vrrp_event(vr
, VRRP_EVENT_SHUTDOWN
);
102 vrrp_set_priority(vr
, priority
);
105 ret
= vrrp_event(vr
, VRRP_EVENT_STARTUP
);
107 vty_out(vty
, "%% Failed to start Virtual Router %ld\n",
114 DEFPY(vrrp_advertisement_interval
,
115 vrrp_advertisement_interval_cmd
,
116 "[no] vrrp (1-255)$vrid advertisement-interval (1-4096)",
121 "Priority value; set 255 to designate this Virtual Router as Master\n")
123 struct vrrp_vrouter
*vr
;
125 VROUTER_GET_VTY(vty
, vrid
, vr
);
126 vrrp_set_advertisement_interval(vr
, advertisement_interval
);
133 "[no] vrrp (1-255)$vrid ip A.B.C.D$ip",
140 struct vrrp_vrouter
*vr
;
143 VROUTER_GET_VTY(vty
, vrid
, vr
);
146 if (vr
->fsm
.state
== VRRP_STATE_INITIALIZE
) {
147 vty_out(vty
, "%% Activating Virtual Router %ld\n", vrid
);
148 ret
= vrrp_event(vr
, VRRP_EVENT_STARTUP
);
149 ret
= ret
< 0 ? CMD_WARNING_CONFIG_FAILED
: CMD_SUCCESS
;
151 if (ret
== CMD_WARNING_CONFIG_FAILED
)
152 vty_out(vty
, "%% Failed to start Virtual Router %ld\n",
161 static void vrrp_show(struct vty
*vty
, struct vrrp_vrouter
*vr
)
163 char ethstr
[ETHER_ADDR_STRLEN
];
164 char ipstr
[INET_ADDRSTRLEN
];
165 const char *stastr
= vrrp_state_names
[vr
->fsm
.state
];
167 struct ttable
*tt
= ttable_new(&ttable_styles
[TTSTYLE_BLANK
]);
169 ttable_add_row(tt
, "%s|%" PRIu32
, "Virtual Router ID", vr
->vrid
);
170 prefix_mac2str(&vr
->vr_mac_v4
, ethstr
, sizeof(ethstr
));
171 ttable_add_row(tt
, "%s|%s", "Virtual MAC", ethstr
);
172 ttable_add_row(tt
, "%s|%s", "Status", stastr
);
173 ttable_add_row(tt
, "%s|%" PRIu8
, "Priority", vr
->priority
);
174 ttable_add_row(tt
, "%s|%s", "Preempt Mode",
175 vr
->preempt_mode
? "Yes" : "No");
176 ttable_add_row(tt
, "%s|%s", "Accept Mode",
177 vr
->accept_mode
? "Yes" : "No");
178 ttable_add_row(tt
, "%s|%" PRIu16
" cs", "Advertisement Interval",
179 vr
->advertisement_interval
);
180 ttable_add_row(tt
, "%s|%" PRIu16
" cs", "Master Advertisement Interval",
181 vr
->master_adver_interval
);
182 ttable_add_row(tt
, "%s|%" PRIu16
" cs", "Skew Time", vr
->skew_time
);
183 ttable_add_row(tt
, "%s|%" PRIu16
" cs", "Master Down Interval",
184 vr
->master_down_interval
);
185 ttable_add_row(tt
, "%s|%u", "IPv4 Addresses", vr
->v4
->count
);
187 char *table
= ttable_dump(tt
, "\n");
188 vty_out(vty
, "\n%s\n", table
);
189 XFREE(MTYPE_TMP
, table
);
192 /* Dump IPv4 Addresses */
194 vty_out(vty
, " IPv4 Addresses\n");
195 vty_out(vty
, " --------------\n");
198 for (ALL_LIST_ELEMENTS_RO(vr
->v4
, ln
, v4
)) {
199 inet_ntop(AF_INET
, v4
, ipstr
, sizeof(ipstr
));
200 vty_out(vty
, " %s\n", ipstr
);
206 DEFPY(vrrp_vrid_show
,
208 "show vrrp [(1-255)$vrid]",
213 struct vrrp_vrouter
*vr
;
216 VROUTER_GET_VTY(vty
, vrid
, vr
);
219 struct list
*ll
= hash_to_list(vrrp_vrouters_hash
);
222 for (ALL_LIST_ELEMENTS_RO(ll
, ln
, vr
))
229 static struct cmd_node interface_node
= {
234 void vrrp_vty_init(void)
236 install_node(&interface_node
, NULL
);
238 install_element(VIEW_NODE
, &show_debugging_vrrpd_cmd
);
239 install_element(VIEW_NODE
, &vrrp_vrid_show_cmd
);
240 install_element(INTERFACE_NODE
, &vrrp_vrid_cmd
);
241 install_element(INTERFACE_NODE
, &vrrp_priority_cmd
);
242 install_element(INTERFACE_NODE
, &vrrp_advertisement_interval_cmd
);
243 install_element(INTERFACE_NODE
, &vrrp_ip_cmd
);