blob: f4946f461240046c3897aa2d5699b09f6576e61b [file] [log] [blame]
paul718e3742002-12-13 20:15:29 +00001/* Zebra VTY functions
2 * Copyright (C) 2002 Kunihiro Ishiguro
3 *
4 * This file is part of GNU Zebra.
5 *
6 * GNU Zebra 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
8 * Free Software Foundation; either version 2, or (at your option) any
9 * later version.
10 *
11 * GNU Zebra is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with GNU Zebra; see the file COPYING. If not, write to the
18 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 * Boston, MA 02111-1307, USA.
20 */
21
22#include <zebra.h>
23
Paul Jakma7514fb72007-05-02 16:05:35 +000024#include "memory.h"
paul718e3742002-12-13 20:15:29 +000025#include "if.h"
26#include "prefix.h"
27#include "command.h"
28#include "table.h"
29#include "rib.h"
30
paula1ac18c2005-06-28 17:17:12 +000031#include "zebra/zserv.h"
32
paul718e3742002-12-13 20:15:29 +000033/* General fucntion for static route. */
paula1ac18c2005-06-28 17:17:12 +000034static int
hasso39db97e2004-10-12 20:50:58 +000035zebra_static_ipv4 (struct vty *vty, int add_cmd, const char *dest_str,
36 const char *mask_str, const char *gate_str,
37 const char *flag_str, const char *distance_str)
paul718e3742002-12-13 20:15:29 +000038{
39 int ret;
40 u_char distance;
41 struct prefix p;
42 struct in_addr gate;
43 struct in_addr mask;
hasso39db97e2004-10-12 20:50:58 +000044 const char *ifname;
hasso81dfcaa2003-05-25 19:21:25 +000045 u_char flag = 0;
paul718e3742002-12-13 20:15:29 +000046
47 ret = str2prefix (dest_str, &p);
48 if (ret <= 0)
49 {
50 vty_out (vty, "%% Malformed address%s", VTY_NEWLINE);
51 return CMD_WARNING;
52 }
53
54 /* Cisco like mask notation. */
55 if (mask_str)
56 {
57 ret = inet_aton (mask_str, &mask);
58 if (ret == 0)
paul595db7f2003-05-25 21:35:06 +000059 {
60 vty_out (vty, "%% Malformed address%s", VTY_NEWLINE);
61 return CMD_WARNING;
62 }
paul718e3742002-12-13 20:15:29 +000063 p.prefixlen = ip_masklen (mask);
64 }
65
66 /* Apply mask for given prefix. */
67 apply_mask (&p);
68
paul595db7f2003-05-25 21:35:06 +000069 /* Administrative distance. */
70 if (distance_str)
71 distance = atoi (distance_str);
72 else
73 distance = ZEBRA_STATIC_DISTANCE_DEFAULT;
74
75 /* Null0 static route. */
hasso457ef552003-05-28 12:02:15 +000076 if ((gate_str != NULL) && (strncasecmp (gate_str, "Null0", strlen (gate_str)) == 0))
paul595db7f2003-05-25 21:35:06 +000077 {
78 if (flag_str)
79 {
80 vty_out (vty, "%% can not have flag %s with Null0%s", flag_str, VTY_NEWLINE);
81 return CMD_WARNING;
82 }
83 if (add_cmd)
paul7021c422003-07-15 12:52:22 +000084 static_add_ipv4 (&p, NULL, NULL, ZEBRA_FLAG_BLACKHOLE, distance, 0);
paul595db7f2003-05-25 21:35:06 +000085 else
86 static_delete_ipv4 (&p, NULL, NULL, distance, 0);
87 return CMD_SUCCESS;
88 }
89
hasso81dfcaa2003-05-25 19:21:25 +000090 /* Route flags */
91 if (flag_str) {
92 switch(flag_str[0]) {
93 case 'r':
94 case 'R': /* XXX */
95 SET_FLAG (flag, ZEBRA_FLAG_REJECT);
96 break;
97 case 'b':
98 case 'B': /* XXX */
99 SET_FLAG (flag, ZEBRA_FLAG_BLACKHOLE);
100 break;
101 default:
102 vty_out (vty, "%% Malformed flag %s %s", flag_str, VTY_NEWLINE);
paul595db7f2003-05-25 21:35:06 +0000103 return CMD_WARNING;
hasso81dfcaa2003-05-25 19:21:25 +0000104 }
105 }
106
hasso457ef552003-05-28 12:02:15 +0000107 if (gate_str == NULL)
108 {
109 if (add_cmd)
110 static_add_ipv4 (&p, NULL, NULL, flag, distance, 0);
111 else
112 static_delete_ipv4 (&p, NULL, NULL, distance, 0);
113
114 return CMD_SUCCESS;
115 }
116
paul718e3742002-12-13 20:15:29 +0000117 /* When gateway is A.B.C.D format, gate is treated as nexthop
118 address other case gate is treated as interface name. */
119 ret = inet_aton (gate_str, &gate);
120 if (ret)
121 ifname = NULL;
122 else
123 ifname = gate_str;
124
125 if (add_cmd)
hasso81dfcaa2003-05-25 19:21:25 +0000126 static_add_ipv4 (&p, ifname ? NULL : &gate, ifname, flag, distance, 0);
paul718e3742002-12-13 20:15:29 +0000127 else
128 static_delete_ipv4 (&p, ifname ? NULL : &gate, ifname, distance, 0);
129
130 return CMD_SUCCESS;
131}
132
133/* Static route configuration. */
134DEFUN (ip_route,
135 ip_route_cmd,
paul595db7f2003-05-25 21:35:06 +0000136 "ip route A.B.C.D/M (A.B.C.D|INTERFACE|null0)",
hasso81dfcaa2003-05-25 19:21:25 +0000137 IP_STR
138 "Establish static routes\n"
139 "IP destination prefix (e.g. 10.0.0.0/8)\n"
140 "IP gateway address\n"
paul595db7f2003-05-25 21:35:06 +0000141 "IP gateway interface name\n"
142 "Null interface\n")
hasso81dfcaa2003-05-25 19:21:25 +0000143{
144 return zebra_static_ipv4 (vty, 1, argv[0], NULL, argv[1], NULL, NULL);
145}
146
147DEFUN (ip_route_flags,
148 ip_route_flags_cmd,
149 "ip route A.B.C.D/M (A.B.C.D|INTERFACE) (reject|blackhole)",
paul718e3742002-12-13 20:15:29 +0000150 IP_STR
151 "Establish static routes\n"
152 "IP destination prefix (e.g. 10.0.0.0/8)\n"
153 "IP gateway address\n"
154 "IP gateway interface name\n"
hasso81dfcaa2003-05-25 19:21:25 +0000155 "Emit an ICMP unreachable when matched\n"
156 "Silently discard pkts when matched\n")
paul718e3742002-12-13 20:15:29 +0000157{
hasso81dfcaa2003-05-25 19:21:25 +0000158 return zebra_static_ipv4 (vty, 1, argv[0], NULL, argv[1], argv[2], NULL);
paul718e3742002-12-13 20:15:29 +0000159}
160
hasso457ef552003-05-28 12:02:15 +0000161DEFUN (ip_route_flags2,
162 ip_route_flags2_cmd,
163 "ip route A.B.C.D/M (reject|blackhole)",
164 IP_STR
165 "Establish static routes\n"
166 "IP destination prefix (e.g. 10.0.0.0/8)\n"
167 "Emit an ICMP unreachable when matched\n"
168 "Silently discard pkts when matched\n")
169{
170 return zebra_static_ipv4 (vty, 1, argv[0], NULL, NULL, argv[1], NULL);
171}
172
paul718e3742002-12-13 20:15:29 +0000173/* Mask as A.B.C.D format. */
174DEFUN (ip_route_mask,
175 ip_route_mask_cmd,
paul595db7f2003-05-25 21:35:06 +0000176 "ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE|null0)",
hasso81dfcaa2003-05-25 19:21:25 +0000177 IP_STR
178 "Establish static routes\n"
179 "IP destination prefix\n"
180 "IP destination prefix mask\n"
181 "IP gateway address\n"
paul595db7f2003-05-25 21:35:06 +0000182 "IP gateway interface name\n"
183 "Null interface\n")
hasso81dfcaa2003-05-25 19:21:25 +0000184{
185 return zebra_static_ipv4 (vty, 1, argv[0], argv[1], argv[2], NULL, NULL);
186}
187
188DEFUN (ip_route_mask_flags,
189 ip_route_mask_flags_cmd,
190 "ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE) (reject|blackhole)",
paul718e3742002-12-13 20:15:29 +0000191 IP_STR
192 "Establish static routes\n"
193 "IP destination prefix\n"
194 "IP destination prefix mask\n"
195 "IP gateway address\n"
196 "IP gateway interface name\n"
hasso81dfcaa2003-05-25 19:21:25 +0000197 "Emit an ICMP unreachable when matched\n"
198 "Silently discard pkts when matched\n")
paul718e3742002-12-13 20:15:29 +0000199{
hasso81dfcaa2003-05-25 19:21:25 +0000200 return zebra_static_ipv4 (vty, 1, argv[0], argv[1], argv[2], argv[3], NULL);
paul718e3742002-12-13 20:15:29 +0000201}
202
hasso457ef552003-05-28 12:02:15 +0000203DEFUN (ip_route_mask_flags2,
204 ip_route_mask_flags2_cmd,
205 "ip route A.B.C.D A.B.C.D (reject|blackhole)",
206 IP_STR
207 "Establish static routes\n"
208 "IP destination prefix\n"
209 "IP destination prefix mask\n"
210 "Emit an ICMP unreachable when matched\n"
211 "Silently discard pkts when matched\n")
212{
213 return zebra_static_ipv4 (vty, 1, argv[0], argv[1], NULL, argv[2], NULL);
214}
215
paul718e3742002-12-13 20:15:29 +0000216/* Distance option value. */
217DEFUN (ip_route_distance,
218 ip_route_distance_cmd,
paul595db7f2003-05-25 21:35:06 +0000219 "ip route A.B.C.D/M (A.B.C.D|INTERFACE|null0) <1-255>",
paul718e3742002-12-13 20:15:29 +0000220 IP_STR
221 "Establish static routes\n"
222 "IP destination prefix (e.g. 10.0.0.0/8)\n"
223 "IP gateway address\n"
224 "IP gateway interface name\n"
paul595db7f2003-05-25 21:35:06 +0000225 "Null interface\n"
paul718e3742002-12-13 20:15:29 +0000226 "Distance value for this route\n")
227{
hasso81dfcaa2003-05-25 19:21:25 +0000228 return zebra_static_ipv4 (vty, 1, argv[0], NULL, argv[1], NULL, argv[2]);
229}
230
231DEFUN (ip_route_flags_distance,
232 ip_route_flags_distance_cmd,
233 "ip route A.B.C.D/M (A.B.C.D|INTERFACE) (reject|blackhole) <1-255>",
234 IP_STR
235 "Establish static routes\n"
236 "IP destination prefix (e.g. 10.0.0.0/8)\n"
237 "IP gateway address\n"
238 "IP gateway interface name\n"
239 "Emit an ICMP unreachable when matched\n"
240 "Silently discard pkts when matched\n"
241 "Distance value for this route\n")
242{
243 return zebra_static_ipv4 (vty, 1, argv[0], NULL, argv[1], argv[2], argv[3]);
paul718e3742002-12-13 20:15:29 +0000244}
245
hasso457ef552003-05-28 12:02:15 +0000246DEFUN (ip_route_flags_distance2,
247 ip_route_flags_distance2_cmd,
248 "ip route A.B.C.D/M (reject|blackhole) <1-255>",
249 IP_STR
250 "Establish static routes\n"
251 "IP destination prefix (e.g. 10.0.0.0/8)\n"
252 "Emit an ICMP unreachable when matched\n"
253 "Silently discard pkts when matched\n"
254 "Distance value for this route\n")
255{
256 return zebra_static_ipv4 (vty, 1, argv[0], NULL, NULL, argv[1], argv[2]);
257}
258
paul718e3742002-12-13 20:15:29 +0000259DEFUN (ip_route_mask_distance,
260 ip_route_mask_distance_cmd,
paul595db7f2003-05-25 21:35:06 +0000261 "ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE|null0) <1-255>",
paul718e3742002-12-13 20:15:29 +0000262 IP_STR
263 "Establish static routes\n"
264 "IP destination prefix\n"
265 "IP destination prefix mask\n"
266 "IP gateway address\n"
267 "IP gateway interface name\n"
paul595db7f2003-05-25 21:35:06 +0000268 "Null interface\n"
paul718e3742002-12-13 20:15:29 +0000269 "Distance value for this route\n")
270{
hasso81dfcaa2003-05-25 19:21:25 +0000271 return zebra_static_ipv4 (vty, 1, argv[0], argv[1], argv[2], NULL, argv[3]);
272}
273
274DEFUN (ip_route_mask_flags_distance,
275 ip_route_mask_flags_distance_cmd,
276 "ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE) (reject|blackhole) <1-255>",
277 IP_STR
278 "Establish static routes\n"
279 "IP destination prefix\n"
280 "IP destination prefix mask\n"
281 "IP gateway address\n"
282 "IP gateway interface name\n"
hasso81dfcaa2003-05-25 19:21:25 +0000283 "Emit an ICMP unreachable when matched\n"
Christian Franke2b005152013-09-30 12:27:49 +0000284 "Silently discard pkts when matched\n"
285 "Distance value for this route\n")
hasso81dfcaa2003-05-25 19:21:25 +0000286{
287 return zebra_static_ipv4 (vty, 1, argv[0], argv[1], argv[2], argv[3], argv[4]);
paul718e3742002-12-13 20:15:29 +0000288}
289
hasso457ef552003-05-28 12:02:15 +0000290DEFUN (ip_route_mask_flags_distance2,
291 ip_route_mask_flags_distance2_cmd,
292 "ip route A.B.C.D A.B.C.D (reject|blackhole) <1-255>",
293 IP_STR
294 "Establish static routes\n"
295 "IP destination prefix\n"
296 "IP destination prefix mask\n"
hasso457ef552003-05-28 12:02:15 +0000297 "Emit an ICMP unreachable when matched\n"
Christian Franke2b005152013-09-30 12:27:49 +0000298 "Silently discard pkts when matched\n"
299 "Distance value for this route\n")
hasso457ef552003-05-28 12:02:15 +0000300{
301 return zebra_static_ipv4 (vty, 1, argv[0], argv[1], NULL, argv[2], argv[3]);
302}
303
paul718e3742002-12-13 20:15:29 +0000304DEFUN (no_ip_route,
305 no_ip_route_cmd,
paul595db7f2003-05-25 21:35:06 +0000306 "no ip route A.B.C.D/M (A.B.C.D|INTERFACE|null0)",
hasso81dfcaa2003-05-25 19:21:25 +0000307 NO_STR
308 IP_STR
309 "Establish static routes\n"
310 "IP destination prefix (e.g. 10.0.0.0/8)\n"
311 "IP gateway address\n"
paul595db7f2003-05-25 21:35:06 +0000312 "IP gateway interface name\n"
313 "Null interface\n")
hasso81dfcaa2003-05-25 19:21:25 +0000314{
315 return zebra_static_ipv4 (vty, 0, argv[0], NULL, argv[1], NULL, NULL);
316}
317
318ALIAS (no_ip_route,
319 no_ip_route_flags_cmd,
320 "no ip route A.B.C.D/M (A.B.C.D|INTERFACE) (reject|blackhole)",
paul718e3742002-12-13 20:15:29 +0000321 NO_STR
322 IP_STR
323 "Establish static routes\n"
324 "IP destination prefix (e.g. 10.0.0.0/8)\n"
325 "IP gateway address\n"
326 "IP gateway interface name\n"
hasso81dfcaa2003-05-25 19:21:25 +0000327 "Emit an ICMP unreachable when matched\n"
328 "Silently discard pkts when matched\n")
paul718e3742002-12-13 20:15:29 +0000329
hasso457ef552003-05-28 12:02:15 +0000330DEFUN (no_ip_route_flags2,
331 no_ip_route_flags2_cmd,
332 "no ip route A.B.C.D/M (reject|blackhole)",
333 NO_STR
334 IP_STR
335 "Establish static routes\n"
336 "IP destination prefix (e.g. 10.0.0.0/8)\n"
337 "Emit an ICMP unreachable when matched\n"
338 "Silently discard pkts when matched\n")
339{
340 return zebra_static_ipv4 (vty, 0, argv[0], NULL, NULL, NULL, NULL);
341}
342
paul718e3742002-12-13 20:15:29 +0000343DEFUN (no_ip_route_mask,
344 no_ip_route_mask_cmd,
paul595db7f2003-05-25 21:35:06 +0000345 "no ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE|null0)",
hasso81dfcaa2003-05-25 19:21:25 +0000346 NO_STR
347 IP_STR
348 "Establish static routes\n"
349 "IP destination prefix\n"
350 "IP destination prefix mask\n"
351 "IP gateway address\n"
paul595db7f2003-05-25 21:35:06 +0000352 "IP gateway interface name\n"
353 "Null interface\n")
hasso81dfcaa2003-05-25 19:21:25 +0000354{
355 return zebra_static_ipv4 (vty, 0, argv[0], argv[1], argv[2], NULL, NULL);
356}
357
358ALIAS (no_ip_route_mask,
359 no_ip_route_mask_flags_cmd,
360 "no ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE) (reject|blackhole)",
paul718e3742002-12-13 20:15:29 +0000361 NO_STR
362 IP_STR
363 "Establish static routes\n"
364 "IP destination prefix\n"
365 "IP destination prefix mask\n"
366 "IP gateway address\n"
367 "IP gateway interface name\n"
hasso81dfcaa2003-05-25 19:21:25 +0000368 "Emit an ICMP unreachable when matched\n"
369 "Silently discard pkts when matched\n")
paul718e3742002-12-13 20:15:29 +0000370
hasso457ef552003-05-28 12:02:15 +0000371DEFUN (no_ip_route_mask_flags2,
372 no_ip_route_mask_flags2_cmd,
373 "no ip route A.B.C.D A.B.C.D (reject|blackhole)",
374 NO_STR
375 IP_STR
376 "Establish static routes\n"
377 "IP destination prefix\n"
378 "IP destination prefix mask\n"
379 "Emit an ICMP unreachable when matched\n"
380 "Silently discard pkts when matched\n")
381{
382 return zebra_static_ipv4 (vty, 0, argv[0], argv[1], NULL, NULL, NULL);
383}
384
paul718e3742002-12-13 20:15:29 +0000385DEFUN (no_ip_route_distance,
386 no_ip_route_distance_cmd,
paul595db7f2003-05-25 21:35:06 +0000387 "no ip route A.B.C.D/M (A.B.C.D|INTERFACE|null0) <1-255>",
paul718e3742002-12-13 20:15:29 +0000388 NO_STR
389 IP_STR
390 "Establish static routes\n"
391 "IP destination prefix (e.g. 10.0.0.0/8)\n"
392 "IP gateway address\n"
393 "IP gateway interface name\n"
paul595db7f2003-05-25 21:35:06 +0000394 "Null interface\n"
paul718e3742002-12-13 20:15:29 +0000395 "Distance value for this route\n")
396{
hasso81dfcaa2003-05-25 19:21:25 +0000397 return zebra_static_ipv4 (vty, 0, argv[0], NULL, argv[1], NULL, argv[2]);
398}
399
400DEFUN (no_ip_route_flags_distance,
401 no_ip_route_flags_distance_cmd,
402 "no ip route A.B.C.D/M (A.B.C.D|INTERFACE) (reject|blackhole) <1-255>",
403 NO_STR
404 IP_STR
405 "Establish static routes\n"
406 "IP destination prefix (e.g. 10.0.0.0/8)\n"
407 "IP gateway address\n"
408 "IP gateway interface name\n"
409 "Emit an ICMP unreachable when matched\n"
410 "Silently discard pkts when matched\n"
411 "Distance value for this route\n")
412{
413 return zebra_static_ipv4 (vty, 0, argv[0], NULL, argv[1], argv[2], argv[3]);
paul718e3742002-12-13 20:15:29 +0000414}
415
hasso457ef552003-05-28 12:02:15 +0000416DEFUN (no_ip_route_flags_distance2,
417 no_ip_route_flags_distance2_cmd,
418 "no ip route A.B.C.D/M (reject|blackhole) <1-255>",
419 NO_STR
420 IP_STR
421 "Establish static routes\n"
422 "IP destination prefix (e.g. 10.0.0.0/8)\n"
423 "Emit an ICMP unreachable when matched\n"
424 "Silently discard pkts when matched\n"
425 "Distance value for this route\n")
426{
427 return zebra_static_ipv4 (vty, 0, argv[0], NULL, NULL, argv[1], argv[2]);
428}
429
paul718e3742002-12-13 20:15:29 +0000430DEFUN (no_ip_route_mask_distance,
431 no_ip_route_mask_distance_cmd,
paul595db7f2003-05-25 21:35:06 +0000432 "no ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE|null0) <1-255>",
paul718e3742002-12-13 20:15:29 +0000433 NO_STR
434 IP_STR
435 "Establish static routes\n"
436 "IP destination prefix\n"
437 "IP destination prefix mask\n"
438 "IP gateway address\n"
439 "IP gateway interface name\n"
paul595db7f2003-05-25 21:35:06 +0000440 "Null interface\n"
paul718e3742002-12-13 20:15:29 +0000441 "Distance value for this route\n")
442{
hasso81dfcaa2003-05-25 19:21:25 +0000443 return zebra_static_ipv4 (vty, 0, argv[0], argv[1], argv[2], NULL, argv[3]);
444}
445
446DEFUN (no_ip_route_mask_flags_distance,
447 no_ip_route_mask_flags_distance_cmd,
448 "no ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE) (reject|blackhole) <1-255>",
449 NO_STR
450 IP_STR
451 "Establish static routes\n"
452 "IP destination prefix\n"
453 "IP destination prefix mask\n"
454 "IP gateway address\n"
455 "IP gateway interface name\n"
456 "Emit an ICMP unreachable when matched\n"
457 "Silently discard pkts when matched\n"
458 "Distance value for this route\n")
459{
460 return zebra_static_ipv4 (vty, 0, argv[0], argv[1], argv[2], argv[3], argv[4]);
paul718e3742002-12-13 20:15:29 +0000461}
462
hasso457ef552003-05-28 12:02:15 +0000463DEFUN (no_ip_route_mask_flags_distance2,
464 no_ip_route_mask_flags_distance2_cmd,
465 "no ip route A.B.C.D A.B.C.D (reject|blackhole) <1-255>",
466 NO_STR
467 IP_STR
468 "Establish static routes\n"
469 "IP destination prefix\n"
470 "IP destination prefix mask\n"
471 "Emit an ICMP unreachable when matched\n"
472 "Silently discard pkts when matched\n"
473 "Distance value for this route\n")
474{
475 return zebra_static_ipv4 (vty, 0, argv[0], argv[1], NULL, argv[2], argv[3]);
476}
477
Paul Jakma7514fb72007-05-02 16:05:35 +0000478char *proto_rm[AFI_MAX][ZEBRA_ROUTE_MAX+1]; /* "any" == ZEBRA_ROUTE_MAX */
479
480DEFUN (ip_protocol,
481 ip_protocol_cmd,
482 "ip protocol PROTO route-map ROUTE-MAP",
483 NO_STR
484 "Apply route map to PROTO\n"
485 "Protocol name\n"
486 "Route map name\n")
487{
488 int i;
489
490 if (strcasecmp(argv[0], "any") == 0)
491 i = ZEBRA_ROUTE_MAX;
492 else
493 i = proto_name2num(argv[0]);
494 if (i < 0)
495 {
496 vty_out (vty, "invalid protocol name \"%s\"%s", argv[0] ? argv[0] : "",
497 VTY_NEWLINE);
498 return CMD_WARNING;
499 }
500 if (proto_rm[AFI_IP][i])
501 XFREE (MTYPE_ROUTE_MAP_NAME, proto_rm[AFI_IP][i]);
502 proto_rm[AFI_IP][i] = XSTRDUP (MTYPE_ROUTE_MAP_NAME, argv[1]);
503 return CMD_SUCCESS;
504}
505
506DEFUN (no_ip_protocol,
507 no_ip_protocol_cmd,
508 "no ip protocol PROTO",
509 NO_STR
510 "Remove route map from PROTO\n"
511 "Protocol name\n")
512{
513 int i;
514
515 if (strcasecmp(argv[0], "any") == 0)
516 i = ZEBRA_ROUTE_MAX;
517 else
518 i = proto_name2num(argv[0]);
519 if (i < 0)
520 {
521 vty_out (vty, "invalid protocol name \"%s\"%s", argv[0] ? argv[0] : "",
522 VTY_NEWLINE);
523 return CMD_WARNING;
524 }
525 if (proto_rm[AFI_IP][i])
526 XFREE (MTYPE_ROUTE_MAP_NAME, proto_rm[AFI_IP][i]);
527 proto_rm[AFI_IP][i] = NULL;
528 return CMD_SUCCESS;
529}
530
paul718e3742002-12-13 20:15:29 +0000531/* New RIB. Detailed information for IPv4 route. */
paula1ac18c2005-06-28 17:17:12 +0000532static void
paul718e3742002-12-13 20:15:29 +0000533vty_show_ip_route_detail (struct vty *vty, struct route_node *rn)
534{
535 struct rib *rib;
Christian Frankefa713d92013-07-05 15:35:37 +0000536 struct nexthop *nexthop, *tnexthop;
537 int recursing;
paul718e3742002-12-13 20:15:29 +0000538
Avneesh Sachdev9fd92e32012-11-13 22:48:53 +0000539 RNODE_FOREACH_RIB (rn, rib)
paul718e3742002-12-13 20:15:29 +0000540 {
541 vty_out (vty, "Routing entry for %s/%d%s",
542 inet_ntoa (rn->p.u.prefix4), rn->p.prefixlen,
543 VTY_NEWLINE);
ajsf52d13c2005-10-01 17:38:06 +0000544 vty_out (vty, " Known via \"%s\"", zebra_route_string (rib->type));
Jorge Boncompte [DTI2]ddc943d2012-04-13 13:46:07 +0200545 vty_out (vty, ", distance %u, metric %u", rib->distance, rib->metric);
paul718e3742002-12-13 20:15:29 +0000546 if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_SELECTED))
547 vty_out (vty, ", best");
548 if (rib->refcnt)
549 vty_out (vty, ", refcnt %ld", rib->refcnt);
hasso81dfcaa2003-05-25 19:21:25 +0000550 if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_BLACKHOLE))
551 vty_out (vty, ", blackhole");
552 if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_REJECT))
553 vty_out (vty, ", reject");
paul718e3742002-12-13 20:15:29 +0000554 vty_out (vty, "%s", VTY_NEWLINE);
555
556#define ONE_DAY_SECOND 60*60*24
557#define ONE_WEEK_SECOND 60*60*24*7
558 if (rib->type == ZEBRA_ROUTE_RIP
559 || rib->type == ZEBRA_ROUTE_OSPF
Juliusz Chroboczek578ce372012-02-09 13:42:28 +0100560 || rib->type == ZEBRA_ROUTE_BABEL
jardin9e867fe2003-12-23 08:56:18 +0000561 || rib->type == ZEBRA_ROUTE_ISIS
paul718e3742002-12-13 20:15:29 +0000562 || rib->type == ZEBRA_ROUTE_BGP)
563 {
564 time_t uptime;
565 struct tm *tm;
566
567 uptime = time (NULL);
568 uptime -= rib->uptime;
569 tm = gmtime (&uptime);
570
571 vty_out (vty, " Last update ");
572
573 if (uptime < ONE_DAY_SECOND)
574 vty_out (vty, "%02d:%02d:%02d",
575 tm->tm_hour, tm->tm_min, tm->tm_sec);
576 else if (uptime < ONE_WEEK_SECOND)
577 vty_out (vty, "%dd%02dh%02dm",
578 tm->tm_yday, tm->tm_hour, tm->tm_min);
579 else
580 vty_out (vty, "%02dw%dd%02dh",
581 tm->tm_yday/7,
582 tm->tm_yday - ((tm->tm_yday/7) * 7), tm->tm_hour);
583 vty_out (vty, " ago%s", VTY_NEWLINE);
584 }
585
Christian Frankefa713d92013-07-05 15:35:37 +0000586 for (ALL_NEXTHOPS_RO(rib->nexthop, nexthop, tnexthop, recursing))
paul718e3742002-12-13 20:15:29 +0000587 {
Paul Jakma7514fb72007-05-02 16:05:35 +0000588 char addrstr[32];
589
Christian Frankefa713d92013-07-05 15:35:37 +0000590 vty_out (vty, " %c%s",
591 CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB) ? '*' : ' ',
592 recursing ? " " : "");
paul718e3742002-12-13 20:15:29 +0000593
594 switch (nexthop->type)
595 {
596 case NEXTHOP_TYPE_IPV4:
597 case NEXTHOP_TYPE_IPV4_IFINDEX:
598 vty_out (vty, " %s", inet_ntoa (nexthop->gate.ipv4));
599 if (nexthop->ifindex)
600 vty_out (vty, ", via %s", ifindex2ifname (nexthop->ifindex));
601 break;
602 case NEXTHOP_TYPE_IFINDEX:
603 vty_out (vty, " directly connected, %s",
604 ifindex2ifname (nexthop->ifindex));
605 break;
606 case NEXTHOP_TYPE_IFNAME:
607 vty_out (vty, " directly connected, %s", nexthop->ifname);
608 break;
paul595db7f2003-05-25 21:35:06 +0000609 case NEXTHOP_TYPE_BLACKHOLE:
paul7021c422003-07-15 12:52:22 +0000610 vty_out (vty, " directly connected, Null0");
paul595db7f2003-05-25 21:35:06 +0000611 break;
paul7021c422003-07-15 12:52:22 +0000612 default:
paul718e3742002-12-13 20:15:29 +0000613 break;
614 }
615 if (! CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ACTIVE))
616 vty_out (vty, " inactive");
617
Christian Frankee8d3d292013-07-05 15:35:39 +0000618 if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ONLINK))
619 vty_out (vty, " onlink");
620
paul718e3742002-12-13 20:15:29 +0000621 if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_RECURSIVE))
Christian Frankefa713d92013-07-05 15:35:37 +0000622 vty_out (vty, " (recursive)");
Christian Franke5b9f5182013-05-25 14:01:34 +0000623
Paul Jakma7514fb72007-05-02 16:05:35 +0000624 switch (nexthop->type)
625 {
626 case NEXTHOP_TYPE_IPV4:
627 case NEXTHOP_TYPE_IPV4_IFINDEX:
628 case NEXTHOP_TYPE_IPV4_IFNAME:
629 if (nexthop->src.ipv4.s_addr)
630 {
631 if (inet_ntop(AF_INET, &nexthop->src.ipv4, addrstr,
632 sizeof addrstr))
633 vty_out (vty, ", src %s", addrstr);
634 }
635 break;
Andrew J. Schorr09303312007-05-30 20:10:34 +0000636#ifdef HAVE_IPV6
Paul Jakma7514fb72007-05-02 16:05:35 +0000637 case NEXTHOP_TYPE_IPV6:
638 case NEXTHOP_TYPE_IPV6_IFINDEX:
639 case NEXTHOP_TYPE_IPV6_IFNAME:
640 if (!IPV6_ADDR_SAME(&nexthop->src.ipv6, &in6addr_any))
641 {
642 if (inet_ntop(AF_INET6, &nexthop->src.ipv6, addrstr,
643 sizeof addrstr))
644 vty_out (vty, ", src %s", addrstr);
645 }
646 break;
Andrew J. Schorr09303312007-05-30 20:10:34 +0000647#endif /* HAVE_IPV6 */
Paul Jakma7514fb72007-05-02 16:05:35 +0000648 default:
649 break;
650 }
paul718e3742002-12-13 20:15:29 +0000651 vty_out (vty, "%s", VTY_NEWLINE);
652 }
653 vty_out (vty, "%s", VTY_NEWLINE);
654 }
655}
656
paula1ac18c2005-06-28 17:17:12 +0000657static void
paul718e3742002-12-13 20:15:29 +0000658vty_show_ip_route (struct vty *vty, struct route_node *rn, struct rib *rib)
659{
Christian Frankefa713d92013-07-05 15:35:37 +0000660 struct nexthop *nexthop, *tnexthop;
661 int recursing;
paul718e3742002-12-13 20:15:29 +0000662 int len = 0;
663 char buf[BUFSIZ];
664
665 /* Nexthop information. */
Christian Frankefa713d92013-07-05 15:35:37 +0000666 for (ALL_NEXTHOPS_RO(rib->nexthop, nexthop, tnexthop, recursing))
paul718e3742002-12-13 20:15:29 +0000667 {
668 if (nexthop == rib->nexthop)
669 {
670 /* Prefix information. */
671 len = vty_out (vty, "%c%c%c %s/%d",
ajsf52d13c2005-10-01 17:38:06 +0000672 zebra_route_char (rib->type),
paul718e3742002-12-13 20:15:29 +0000673 CHECK_FLAG (rib->flags, ZEBRA_FLAG_SELECTED)
674 ? '>' : ' ',
675 CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB)
676 ? '*' : ' ',
677 inet_ntop (AF_INET, &rn->p.u.prefix, buf, BUFSIZ),
678 rn->p.prefixlen);
679
680 /* Distance and metric display. */
681 if (rib->type != ZEBRA_ROUTE_CONNECT
682 && rib->type != ZEBRA_ROUTE_KERNEL)
683 len += vty_out (vty, " [%d/%d]", rib->distance,
684 rib->metric);
685 }
686 else
687 vty_out (vty, " %c%*c",
688 CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB)
689 ? '*' : ' ',
Christian Frankefa713d92013-07-05 15:35:37 +0000690 len - 3 + (2 * recursing), ' ');
paul718e3742002-12-13 20:15:29 +0000691
692 switch (nexthop->type)
693 {
694 case NEXTHOP_TYPE_IPV4:
695 case NEXTHOP_TYPE_IPV4_IFINDEX:
696 vty_out (vty, " via %s", inet_ntoa (nexthop->gate.ipv4));
697 if (nexthop->ifindex)
698 vty_out (vty, ", %s", ifindex2ifname (nexthop->ifindex));
699 break;
700 case NEXTHOP_TYPE_IFINDEX:
701 vty_out (vty, " is directly connected, %s",
702 ifindex2ifname (nexthop->ifindex));
703 break;
704 case NEXTHOP_TYPE_IFNAME:
705 vty_out (vty, " is directly connected, %s", nexthop->ifname);
706 break;
paul595db7f2003-05-25 21:35:06 +0000707 case NEXTHOP_TYPE_BLACKHOLE:
paul7021c422003-07-15 12:52:22 +0000708 vty_out (vty, " is directly connected, Null0");
paul595db7f2003-05-25 21:35:06 +0000709 break;
paul7021c422003-07-15 12:52:22 +0000710 default:
paul718e3742002-12-13 20:15:29 +0000711 break;
712 }
713 if (! CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ACTIVE))
714 vty_out (vty, " inactive");
715
Christian Frankee8d3d292013-07-05 15:35:39 +0000716 if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ONLINK))
717 vty_out (vty, " onlink");
718
paul718e3742002-12-13 20:15:29 +0000719 if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_RECURSIVE))
Christian Frankefa713d92013-07-05 15:35:37 +0000720 vty_out (vty, " (recursive)");
721
Paul Jakma7514fb72007-05-02 16:05:35 +0000722 switch (nexthop->type)
723 {
724 case NEXTHOP_TYPE_IPV4:
725 case NEXTHOP_TYPE_IPV4_IFINDEX:
726 case NEXTHOP_TYPE_IPV4_IFNAME:
727 if (nexthop->src.ipv4.s_addr)
728 {
729 if (inet_ntop(AF_INET, &nexthop->src.ipv4, buf, sizeof buf))
730 vty_out (vty, ", src %s", buf);
731 }
732 break;
Andrew J. Schorr09303312007-05-30 20:10:34 +0000733#ifdef HAVE_IPV6
Paul Jakma7514fb72007-05-02 16:05:35 +0000734 case NEXTHOP_TYPE_IPV6:
735 case NEXTHOP_TYPE_IPV6_IFINDEX:
736 case NEXTHOP_TYPE_IPV6_IFNAME:
737 if (!IPV6_ADDR_SAME(&nexthop->src.ipv6, &in6addr_any))
738 {
739 if (inet_ntop(AF_INET6, &nexthop->src.ipv6, buf, sizeof buf))
740 vty_out (vty, ", src %s", buf);
741 }
742 break;
Andrew J. Schorr09303312007-05-30 20:10:34 +0000743#endif /* HAVE_IPV6 */
Paul Jakma7514fb72007-05-02 16:05:35 +0000744 default:
745 break;
746 }
paul718e3742002-12-13 20:15:29 +0000747
hasso81dfcaa2003-05-25 19:21:25 +0000748 if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_BLACKHOLE))
749 vty_out (vty, ", bh");
750 if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_REJECT))
751 vty_out (vty, ", rej");
752
paul718e3742002-12-13 20:15:29 +0000753 if (rib->type == ZEBRA_ROUTE_RIP
754 || rib->type == ZEBRA_ROUTE_OSPF
Juliusz Chroboczek578ce372012-02-09 13:42:28 +0100755 || rib->type == ZEBRA_ROUTE_BABEL
jardin9e867fe2003-12-23 08:56:18 +0000756 || rib->type == ZEBRA_ROUTE_ISIS
paul718e3742002-12-13 20:15:29 +0000757 || rib->type == ZEBRA_ROUTE_BGP)
758 {
759 time_t uptime;
760 struct tm *tm;
761
762 uptime = time (NULL);
763 uptime -= rib->uptime;
764 tm = gmtime (&uptime);
765
766#define ONE_DAY_SECOND 60*60*24
767#define ONE_WEEK_SECOND 60*60*24*7
768
769 if (uptime < ONE_DAY_SECOND)
770 vty_out (vty, ", %02d:%02d:%02d",
771 tm->tm_hour, tm->tm_min, tm->tm_sec);
772 else if (uptime < ONE_WEEK_SECOND)
773 vty_out (vty, ", %dd%02dh%02dm",
774 tm->tm_yday, tm->tm_hour, tm->tm_min);
775 else
776 vty_out (vty, ", %02dw%dd%02dh",
777 tm->tm_yday/7,
778 tm->tm_yday - ((tm->tm_yday/7) * 7), tm->tm_hour);
779 }
780 vty_out (vty, "%s", VTY_NEWLINE);
781 }
782}
783
paul718e3742002-12-13 20:15:29 +0000784DEFUN (show_ip_route,
785 show_ip_route_cmd,
786 "show ip route",
787 SHOW_STR
788 IP_STR
789 "IP routing table\n")
790{
791 struct route_table *table;
792 struct route_node *rn;
793 struct rib *rib;
794 int first = 1;
795
796 table = vrf_table (AFI_IP, SAFI_UNICAST, 0);
797 if (! table)
798 return CMD_SUCCESS;
799
800 /* Show all IPv4 routes. */
801 for (rn = route_top (table); rn; rn = route_next (rn))
Avneesh Sachdev9fd92e32012-11-13 22:48:53 +0000802 RNODE_FOREACH_RIB (rn, rib)
paul718e3742002-12-13 20:15:29 +0000803 {
804 if (first)
805 {
David Lampartere0ca5fd2009-09-16 01:52:42 +0200806 vty_out (vty, SHOW_ROUTE_V4_HEADER);
paul718e3742002-12-13 20:15:29 +0000807 first = 0;
808 }
809 vty_show_ip_route (vty, rn, rib);
810 }
811 return CMD_SUCCESS;
812}
813
814DEFUN (show_ip_route_prefix_longer,
815 show_ip_route_prefix_longer_cmd,
816 "show ip route A.B.C.D/M longer-prefixes",
817 SHOW_STR
818 IP_STR
819 "IP routing table\n"
820 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
821 "Show route matching the specified Network/Mask pair only\n")
822{
823 struct route_table *table;
824 struct route_node *rn;
825 struct rib *rib;
826 struct prefix p;
827 int ret;
828 int first = 1;
829
830 ret = str2prefix (argv[0], &p);
831 if (! ret)
832 {
833 vty_out (vty, "%% Malformed Prefix%s", VTY_NEWLINE);
834 return CMD_WARNING;
835 }
836
837 table = vrf_table (AFI_IP, SAFI_UNICAST, 0);
838 if (! table)
839 return CMD_SUCCESS;
840
841 /* Show matched type IPv4 routes. */
842 for (rn = route_top (table); rn; rn = route_next (rn))
Avneesh Sachdev9fd92e32012-11-13 22:48:53 +0000843 RNODE_FOREACH_RIB (rn, rib)
paul718e3742002-12-13 20:15:29 +0000844 if (prefix_match (&p, &rn->p))
845 {
846 if (first)
847 {
David Lampartere0ca5fd2009-09-16 01:52:42 +0200848 vty_out (vty, SHOW_ROUTE_V4_HEADER);
paul718e3742002-12-13 20:15:29 +0000849 first = 0;
850 }
851 vty_show_ip_route (vty, rn, rib);
852 }
853 return CMD_SUCCESS;
854}
855
856DEFUN (show_ip_route_supernets,
857 show_ip_route_supernets_cmd,
858 "show ip route supernets-only",
859 SHOW_STR
860 IP_STR
861 "IP routing table\n"
862 "Show supernet entries only\n")
863{
864 struct route_table *table;
865 struct route_node *rn;
866 struct rib *rib;
867 u_int32_t addr;
868 int first = 1;
869
870 table = vrf_table (AFI_IP, SAFI_UNICAST, 0);
871 if (! table)
872 return CMD_SUCCESS;
873
874 /* Show matched type IPv4 routes. */
875 for (rn = route_top (table); rn; rn = route_next (rn))
Avneesh Sachdev9fd92e32012-11-13 22:48:53 +0000876 RNODE_FOREACH_RIB (rn, rib)
paul718e3742002-12-13 20:15:29 +0000877 {
878 addr = ntohl (rn->p.u.prefix4.s_addr);
879
880 if ((IN_CLASSC (addr) && rn->p.prefixlen < 24)
881 || (IN_CLASSB (addr) && rn->p.prefixlen < 16)
882 || (IN_CLASSA (addr) && rn->p.prefixlen < 8))
883 {
884 if (first)
885 {
David Lampartere0ca5fd2009-09-16 01:52:42 +0200886 vty_out (vty, SHOW_ROUTE_V4_HEADER);
paul718e3742002-12-13 20:15:29 +0000887 first = 0;
888 }
889 vty_show_ip_route (vty, rn, rib);
890 }
891 }
892 return CMD_SUCCESS;
893}
894
895DEFUN (show_ip_route_protocol,
896 show_ip_route_protocol_cmd,
David Lampartere0ca5fd2009-09-16 01:52:42 +0200897 "show ip route " QUAGGA_IP_REDIST_STR_ZEBRA,
paul718e3742002-12-13 20:15:29 +0000898 SHOW_STR
899 IP_STR
900 "IP routing table\n"
David Lampartere0ca5fd2009-09-16 01:52:42 +0200901 QUAGGA_IP_REDIST_HELP_STR_ZEBRA)
paul718e3742002-12-13 20:15:29 +0000902{
903 int type;
904 struct route_table *table;
905 struct route_node *rn;
906 struct rib *rib;
907 int first = 1;
908
David Lampartere0ca5fd2009-09-16 01:52:42 +0200909 type = proto_redistnum (AFI_IP, argv[0]);
910 if (type < 0)
paul718e3742002-12-13 20:15:29 +0000911 {
912 vty_out (vty, "Unknown route type%s", VTY_NEWLINE);
913 return CMD_WARNING;
914 }
915
916 table = vrf_table (AFI_IP, SAFI_UNICAST, 0);
917 if (! table)
918 return CMD_SUCCESS;
919
920 /* Show matched type IPv4 routes. */
921 for (rn = route_top (table); rn; rn = route_next (rn))
Avneesh Sachdev9fd92e32012-11-13 22:48:53 +0000922 RNODE_FOREACH_RIB (rn, rib)
paul718e3742002-12-13 20:15:29 +0000923 if (rib->type == type)
924 {
925 if (first)
926 {
David Lampartere0ca5fd2009-09-16 01:52:42 +0200927 vty_out (vty, SHOW_ROUTE_V4_HEADER);
paul718e3742002-12-13 20:15:29 +0000928 first = 0;
929 }
930 vty_show_ip_route (vty, rn, rib);
931 }
932 return CMD_SUCCESS;
933}
934
935DEFUN (show_ip_route_addr,
936 show_ip_route_addr_cmd,
937 "show ip route A.B.C.D",
938 SHOW_STR
939 IP_STR
940 "IP routing table\n"
941 "Network in the IP routing table to display\n")
942{
943 int ret;
944 struct prefix_ipv4 p;
945 struct route_table *table;
946 struct route_node *rn;
947
948 ret = str2prefix_ipv4 (argv[0], &p);
949 if (ret <= 0)
950 {
951 vty_out (vty, "%% Malformed IPv4 address%s", VTY_NEWLINE);
952 return CMD_WARNING;
953 }
954
955 table = vrf_table (AFI_IP, SAFI_UNICAST, 0);
956 if (! table)
957 return CMD_SUCCESS;
958
959 rn = route_node_match (table, (struct prefix *) &p);
960 if (! rn)
961 {
962 vty_out (vty, "%% Network not in table%s", VTY_NEWLINE);
963 return CMD_WARNING;
964 }
965
966 vty_show_ip_route_detail (vty, rn);
967
968 route_unlock_node (rn);
969
970 return CMD_SUCCESS;
971}
972
973DEFUN (show_ip_route_prefix,
974 show_ip_route_prefix_cmd,
975 "show ip route A.B.C.D/M",
976 SHOW_STR
977 IP_STR
978 "IP routing table\n"
979 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
980{
981 int ret;
982 struct prefix_ipv4 p;
983 struct route_table *table;
984 struct route_node *rn;
985
986 ret = str2prefix_ipv4 (argv[0], &p);
987 if (ret <= 0)
988 {
989 vty_out (vty, "%% Malformed IPv4 address%s", VTY_NEWLINE);
990 return CMD_WARNING;
991 }
992
993 table = vrf_table (AFI_IP, SAFI_UNICAST, 0);
994 if (! table)
995 return CMD_SUCCESS;
996
997 rn = route_node_match (table, (struct prefix *) &p);
998 if (! rn || rn->p.prefixlen != p.prefixlen)
999 {
1000 vty_out (vty, "%% Network not in table%s", VTY_NEWLINE);
1001 return CMD_WARNING;
1002 }
1003
1004 vty_show_ip_route_detail (vty, rn);
1005
1006 route_unlock_node (rn);
1007
1008 return CMD_SUCCESS;
1009}
1010
paula1ac18c2005-06-28 17:17:12 +00001011static void
Stig Thormodsrud61691c92008-11-04 15:45:07 -08001012vty_show_ip_route_summary (struct vty *vty, struct route_table *table)
paul718e3742002-12-13 20:15:29 +00001013{
Stig Thormodsrud61691c92008-11-04 15:45:07 -08001014 struct route_node *rn;
1015 struct rib *rib;
1016 struct nexthop *nexthop;
1017#define ZEBRA_ROUTE_IBGP ZEBRA_ROUTE_MAX
1018#define ZEBRA_ROUTE_TOTAL (ZEBRA_ROUTE_IBGP + 1)
1019 u_int32_t rib_cnt[ZEBRA_ROUTE_TOTAL + 1];
1020 u_int32_t fib_cnt[ZEBRA_ROUTE_TOTAL + 1];
1021 u_int32_t i;
paul718e3742002-12-13 20:15:29 +00001022
Stig Thormodsrud61691c92008-11-04 15:45:07 -08001023 memset (&rib_cnt, 0, sizeof(rib_cnt));
1024 memset (&fib_cnt, 0, sizeof(fib_cnt));
1025 for (rn = route_top (table); rn; rn = route_next (rn))
Avneesh Sachdev9fd92e32012-11-13 22:48:53 +00001026 RNODE_FOREACH_RIB (rn, rib)
Stig Thormodsrud61691c92008-11-04 15:45:07 -08001027 for (nexthop = rib->nexthop; nexthop; nexthop = nexthop->next)
1028 {
1029 rib_cnt[ZEBRA_ROUTE_TOTAL]++;
1030 rib_cnt[rib->type]++;
Christian Frankefa713d92013-07-05 15:35:37 +00001031 if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB)
1032 || nexthop_has_fib_child(nexthop))
Stig Thormodsrud61691c92008-11-04 15:45:07 -08001033 {
1034 fib_cnt[ZEBRA_ROUTE_TOTAL]++;
1035 fib_cnt[rib->type]++;
1036 }
1037 if (rib->type == ZEBRA_ROUTE_BGP &&
1038 CHECK_FLAG (rib->flags, ZEBRA_FLAG_IBGP))
1039 {
1040 rib_cnt[ZEBRA_ROUTE_IBGP]++;
Christian Frankefa713d92013-07-05 15:35:37 +00001041 if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB)
1042 || nexthop_has_fib_child(nexthop))
Stig Thormodsrud61691c92008-11-04 15:45:07 -08001043 fib_cnt[ZEBRA_ROUTE_IBGP]++;
1044 }
1045 }
paul718e3742002-12-13 20:15:29 +00001046
Stig Thormodsrud61691c92008-11-04 15:45:07 -08001047 vty_out (vty, "%-20s %-20s %-20s %s",
1048 "Route Source", "Routes", "FIB", VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00001049
Stig Thormodsrud61691c92008-11-04 15:45:07 -08001050 for (i = 0; i < ZEBRA_ROUTE_MAX; i++)
1051 {
1052 if (rib_cnt[i] > 0)
1053 {
1054 if (i == ZEBRA_ROUTE_BGP)
1055 {
1056 vty_out (vty, "%-20s %-20d %-20d %s", "ebgp",
1057 rib_cnt[ZEBRA_ROUTE_BGP] - rib_cnt[ZEBRA_ROUTE_IBGP],
1058 fib_cnt[ZEBRA_ROUTE_BGP] - fib_cnt[ZEBRA_ROUTE_IBGP],
1059 VTY_NEWLINE);
1060 vty_out (vty, "%-20s %-20d %-20d %s", "ibgp",
1061 rib_cnt[ZEBRA_ROUTE_IBGP], fib_cnt[ZEBRA_ROUTE_IBGP],
1062 VTY_NEWLINE);
1063 }
1064 else
1065 vty_out (vty, "%-20s %-20d %-20d %s", zebra_route_string(i),
1066 rib_cnt[i], fib_cnt[i], VTY_NEWLINE);
1067 }
1068 }
paul718e3742002-12-13 20:15:29 +00001069
Stig Thormodsrud61691c92008-11-04 15:45:07 -08001070 vty_out (vty, "------%s", VTY_NEWLINE);
1071 vty_out (vty, "%-20s %-20d %-20d %s", "Totals", rib_cnt[ZEBRA_ROUTE_TOTAL],
1072 fib_cnt[ZEBRA_ROUTE_TOTAL], VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00001073}
1074
1075/* Show route summary. */
1076DEFUN (show_ip_route_summary,
1077 show_ip_route_summary_cmd,
1078 "show ip route summary",
1079 SHOW_STR
1080 IP_STR
1081 "IP routing table\n"
1082 "Summary of all routes\n")
1083{
Stig Thormodsrud61691c92008-11-04 15:45:07 -08001084 struct route_table *table;
paul718e3742002-12-13 20:15:29 +00001085
Stig Thormodsrud61691c92008-11-04 15:45:07 -08001086 table = vrf_table (AFI_IP, SAFI_UNICAST, 0);
1087 if (! table)
1088 return CMD_SUCCESS;
paul718e3742002-12-13 20:15:29 +00001089
Stig Thormodsrud61691c92008-11-04 15:45:07 -08001090 vty_show_ip_route_summary (vty, table);
paul718e3742002-12-13 20:15:29 +00001091
1092 return CMD_SUCCESS;
1093}
1094
1095/* Write IPv4 static route configuration. */
paula1ac18c2005-06-28 17:17:12 +00001096static int
paul718e3742002-12-13 20:15:29 +00001097static_config_ipv4 (struct vty *vty)
1098{
1099 struct route_node *rn;
1100 struct static_ipv4 *si;
1101 struct route_table *stable;
1102 int write;
1103
1104 write = 0;
1105
1106 /* Lookup table. */
1107 stable = vrf_static_table (AFI_IP, SAFI_UNICAST, 0);
1108 if (! stable)
1109 return -1;
1110
1111 for (rn = route_top (stable); rn; rn = route_next (rn))
1112 for (si = rn->info; si; si = si->next)
1113 {
paul7021c422003-07-15 12:52:22 +00001114 vty_out (vty, "ip route %s/%d", inet_ntoa (rn->p.u.prefix4),
1115 rn->p.prefixlen);
paul718e3742002-12-13 20:15:29 +00001116
paul7021c422003-07-15 12:52:22 +00001117 switch (si->type)
1118 {
1119 case STATIC_IPV4_GATEWAY:
1120 vty_out (vty, " %s", inet_ntoa (si->gate.ipv4));
1121 break;
1122 case STATIC_IPV4_IFNAME:
1123 vty_out (vty, " %s", si->gate.ifname);
1124 break;
1125 case STATIC_IPV4_BLACKHOLE:
1126 vty_out (vty, " Null0");
1127 break;
1128 }
1129
1130 /* flags are incompatible with STATIC_IPV4_BLACKHOLE */
1131 if (si->type != STATIC_IPV4_BLACKHOLE)
1132 {
1133 if (CHECK_FLAG(si->flags, ZEBRA_FLAG_REJECT))
1134 vty_out (vty, " %s", "reject");
paul718e3742002-12-13 20:15:29 +00001135
paul7021c422003-07-15 12:52:22 +00001136 if (CHECK_FLAG(si->flags, ZEBRA_FLAG_BLACKHOLE))
1137 vty_out (vty, " %s", "blackhole");
1138 }
hasso81dfcaa2003-05-25 19:21:25 +00001139
paul7021c422003-07-15 12:52:22 +00001140 if (si->distance != ZEBRA_STATIC_DISTANCE_DEFAULT)
1141 vty_out (vty, " %d", si->distance);
hasso81dfcaa2003-05-25 19:21:25 +00001142
paul7021c422003-07-15 12:52:22 +00001143 vty_out (vty, "%s", VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +00001144
paul7021c422003-07-15 12:52:22 +00001145 write = 1;
paul718e3742002-12-13 20:15:29 +00001146 }
1147 return write;
1148}
Andrew J. Schorr09303312007-05-30 20:10:34 +00001149
1150DEFUN (show_ip_protocol,
1151 show_ip_protocol_cmd,
1152 "show ip protocol",
1153 SHOW_STR
1154 IP_STR
1155 "IP protocol filtering status\n")
1156{
1157 int i;
1158
1159 vty_out(vty, "Protocol : route-map %s", VTY_NEWLINE);
1160 vty_out(vty, "------------------------%s", VTY_NEWLINE);
1161 for (i=0;i<ZEBRA_ROUTE_MAX;i++)
1162 {
1163 if (proto_rm[AFI_IP][i])
1164 vty_out (vty, "%-10s : %-10s%s", zebra_route_string(i),
1165 proto_rm[AFI_IP][i],
1166 VTY_NEWLINE);
1167 else
1168 vty_out (vty, "%-10s : none%s", zebra_route_string(i), VTY_NEWLINE);
1169 }
1170 if (proto_rm[AFI_IP][i])
1171 vty_out (vty, "%-10s : %-10s%s", "any", proto_rm[AFI_IP][i],
1172 VTY_NEWLINE);
1173 else
1174 vty_out (vty, "%-10s : none%s", "any", VTY_NEWLINE);
1175
1176 return CMD_SUCCESS;
1177}
1178
Joachim Nilsson36735ed2012-05-09 13:38:36 +02001179/*
1180 * Show IP mroute command to dump the BGP Multicast
1181 * routing table
1182 */
1183DEFUN (show_ip_mroute,
1184 show_ip_mroute_cmd,
1185 "show ip mroute",
1186 SHOW_STR
1187 IP_STR
1188 "IP Multicast routing table\n")
1189{
1190 struct route_table *table;
1191 struct route_node *rn;
1192 struct rib *rib;
1193 int first = 1;
1194
1195 table = vrf_table (AFI_IP, SAFI_MULTICAST, 0);
1196 if (! table)
1197 return CMD_SUCCESS;
1198
1199 /* Show all IPv4 routes. */
1200 for (rn = route_top (table); rn; rn = route_next (rn))
Avneesh Sachdev9fd92e32012-11-13 22:48:53 +00001201 RNODE_FOREACH_RIB (rn, rib)
Joachim Nilsson36735ed2012-05-09 13:38:36 +02001202 {
1203 if (first)
1204 {
1205 vty_out (vty, SHOW_ROUTE_V4_HEADER);
1206 first = 0;
1207 }
1208 vty_show_ip_route (vty, rn, rib);
1209 }
1210 return CMD_SUCCESS;
1211}
1212
paul718e3742002-12-13 20:15:29 +00001213
1214#ifdef HAVE_IPV6
1215/* General fucntion for IPv6 static route. */
paula1ac18c2005-06-28 17:17:12 +00001216static int
hasso39db97e2004-10-12 20:50:58 +00001217static_ipv6_func (struct vty *vty, int add_cmd, const char *dest_str,
1218 const char *gate_str, const char *ifname,
1219 const char *flag_str, const char *distance_str)
paul718e3742002-12-13 20:15:29 +00001220{
1221 int ret;
1222 u_char distance;
1223 struct prefix p;
1224 struct in6_addr *gate = NULL;
1225 struct in6_addr gate_addr;
1226 u_char type = 0;
1227 int table = 0;
hasso81dfcaa2003-05-25 19:21:25 +00001228 u_char flag = 0;
paul718e3742002-12-13 20:15:29 +00001229
1230 ret = str2prefix (dest_str, &p);
1231 if (ret <= 0)
1232 {
1233 vty_out (vty, "%% Malformed address%s", VTY_NEWLINE);
1234 return CMD_WARNING;
1235 }
1236
1237 /* Apply mask for given prefix. */
1238 apply_mask (&p);
1239
hasso81dfcaa2003-05-25 19:21:25 +00001240 /* Route flags */
1241 if (flag_str) {
1242 switch(flag_str[0]) {
1243 case 'r':
1244 case 'R': /* XXX */
1245 SET_FLAG (flag, ZEBRA_FLAG_REJECT);
1246 break;
1247 case 'b':
1248 case 'B': /* XXX */
1249 SET_FLAG (flag, ZEBRA_FLAG_BLACKHOLE);
1250 break;
1251 default:
1252 vty_out (vty, "%% Malformed flag %s %s", flag_str, VTY_NEWLINE);
paul595db7f2003-05-25 21:35:06 +00001253 return CMD_WARNING;
hasso81dfcaa2003-05-25 19:21:25 +00001254 }
1255 }
1256
paul718e3742002-12-13 20:15:29 +00001257 /* Administrative distance. */
1258 if (distance_str)
1259 distance = atoi (distance_str);
1260 else
1261 distance = ZEBRA_STATIC_DISTANCE_DEFAULT;
1262
1263 /* When gateway is valid IPv6 addrees, then gate is treated as
1264 nexthop address other case gate is treated as interface name. */
1265 ret = inet_pton (AF_INET6, gate_str, &gate_addr);
1266
1267 if (ifname)
1268 {
1269 /* When ifname is specified. It must be come with gateway
1270 address. */
1271 if (ret != 1)
1272 {
1273 vty_out (vty, "%% Malformed address%s", VTY_NEWLINE);
1274 return CMD_WARNING;
1275 }
1276 type = STATIC_IPV6_GATEWAY_IFNAME;
1277 gate = &gate_addr;
1278 }
1279 else
1280 {
1281 if (ret == 1)
1282 {
1283 type = STATIC_IPV6_GATEWAY;
1284 gate = &gate_addr;
1285 }
1286 else
1287 {
1288 type = STATIC_IPV6_IFNAME;
1289 ifname = gate_str;
1290 }
1291 }
1292
1293 if (add_cmd)
hasso81dfcaa2003-05-25 19:21:25 +00001294 static_add_ipv6 (&p, type, gate, ifname, flag, distance, table);
paul718e3742002-12-13 20:15:29 +00001295 else
1296 static_delete_ipv6 (&p, type, gate, ifname, distance, table);
1297
1298 return CMD_SUCCESS;
1299}
1300
1301DEFUN (ipv6_route,
1302 ipv6_route_cmd,
1303 "ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE)",
1304 IP_STR
1305 "Establish static routes\n"
1306 "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
1307 "IPv6 gateway address\n"
1308 "IPv6 gateway interface name\n")
1309{
hasso81dfcaa2003-05-25 19:21:25 +00001310 return static_ipv6_func (vty, 1, argv[0], argv[1], NULL, NULL, NULL);
1311}
1312
1313DEFUN (ipv6_route_flags,
1314 ipv6_route_flags_cmd,
1315 "ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) (reject|blackhole)",
1316 IP_STR
1317 "Establish static routes\n"
1318 "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
1319 "IPv6 gateway address\n"
1320 "IPv6 gateway interface name\n"
1321 "Emit an ICMP unreachable when matched\n"
1322 "Silently discard pkts when matched\n")
1323{
1324 return static_ipv6_func (vty, 1, argv[0], argv[1], NULL, argv[2], NULL);
paul718e3742002-12-13 20:15:29 +00001325}
1326
1327DEFUN (ipv6_route_ifname,
1328 ipv6_route_ifname_cmd,
1329 "ipv6 route X:X::X:X/M X:X::X:X INTERFACE",
1330 IP_STR
1331 "Establish static routes\n"
1332 "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
1333 "IPv6 gateway address\n"
1334 "IPv6 gateway interface name\n")
1335{
hasso81dfcaa2003-05-25 19:21:25 +00001336 return static_ipv6_func (vty, 1, argv[0], argv[1], argv[2], NULL, NULL);
1337}
1338
1339DEFUN (ipv6_route_ifname_flags,
1340 ipv6_route_ifname_flags_cmd,
1341 "ipv6 route X:X::X:X/M X:X::X:X INTERFACE (reject|blackhole)",
1342 IP_STR
1343 "Establish static routes\n"
1344 "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
1345 "IPv6 gateway address\n"
1346 "IPv6 gateway interface name\n"
1347 "Emit an ICMP unreachable when matched\n"
1348 "Silently discard pkts when matched\n")
1349{
1350 return static_ipv6_func (vty, 1, argv[0], argv[1], argv[2], argv[3], NULL);
paul718e3742002-12-13 20:15:29 +00001351}
1352
1353DEFUN (ipv6_route_pref,
1354 ipv6_route_pref_cmd,
1355 "ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) <1-255>",
1356 IP_STR
1357 "Establish static routes\n"
1358 "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
1359 "IPv6 gateway address\n"
1360 "IPv6 gateway interface name\n"
1361 "Distance value for this prefix\n")
1362{
hasso81dfcaa2003-05-25 19:21:25 +00001363 return static_ipv6_func (vty, 1, argv[0], argv[1], NULL, NULL, argv[2]);
1364}
1365
1366DEFUN (ipv6_route_flags_pref,
1367 ipv6_route_flags_pref_cmd,
1368 "ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) (reject|blackhole) <1-255>",
1369 IP_STR
1370 "Establish static routes\n"
1371 "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
1372 "IPv6 gateway address\n"
1373 "IPv6 gateway interface name\n"
1374 "Emit an ICMP unreachable when matched\n"
1375 "Silently discard pkts when matched\n"
1376 "Distance value for this prefix\n")
1377{
1378 return static_ipv6_func (vty, 1, argv[0], argv[1], NULL, argv[2], argv[3]);
paul718e3742002-12-13 20:15:29 +00001379}
1380
1381DEFUN (ipv6_route_ifname_pref,
1382 ipv6_route_ifname_pref_cmd,
1383 "ipv6 route X:X::X:X/M X:X::X:X INTERFACE <1-255>",
1384 IP_STR
1385 "Establish static routes\n"
1386 "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
1387 "IPv6 gateway address\n"
1388 "IPv6 gateway interface name\n"
1389 "Distance value for this prefix\n")
1390{
hasso81dfcaa2003-05-25 19:21:25 +00001391 return static_ipv6_func (vty, 1, argv[0], argv[1], argv[2], NULL, argv[3]);
1392}
1393
1394DEFUN (ipv6_route_ifname_flags_pref,
1395 ipv6_route_ifname_flags_pref_cmd,
1396 "ipv6 route X:X::X:X/M X:X::X:X INTERFACE (reject|blackhole) <1-255>",
1397 IP_STR
1398 "Establish static routes\n"
1399 "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
1400 "IPv6 gateway address\n"
1401 "IPv6 gateway interface name\n"
1402 "Emit an ICMP unreachable when matched\n"
1403 "Silently discard pkts when matched\n"
1404 "Distance value for this prefix\n")
1405{
1406 return static_ipv6_func (vty, 1, argv[0], argv[1], argv[2], argv[3], argv[4]);
paul718e3742002-12-13 20:15:29 +00001407}
1408
1409DEFUN (no_ipv6_route,
1410 no_ipv6_route_cmd,
1411 "no ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE)",
1412 NO_STR
1413 IP_STR
1414 "Establish static routes\n"
1415 "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
1416 "IPv6 gateway address\n"
1417 "IPv6 gateway interface name\n")
1418{
hasso81dfcaa2003-05-25 19:21:25 +00001419 return static_ipv6_func (vty, 0, argv[0], argv[1], NULL, NULL, NULL);
paul718e3742002-12-13 20:15:29 +00001420}
1421
hasso81dfcaa2003-05-25 19:21:25 +00001422ALIAS (no_ipv6_route,
1423 no_ipv6_route_flags_cmd,
1424 "no ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) (reject|blackhole)",
1425 NO_STR
1426 IP_STR
1427 "Establish static routes\n"
1428 "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
1429 "IPv6 gateway address\n"
1430 "IPv6 gateway interface name\n"
1431 "Emit an ICMP unreachable when matched\n"
1432 "Silently discard pkts when matched\n")
1433
paul718e3742002-12-13 20:15:29 +00001434DEFUN (no_ipv6_route_ifname,
1435 no_ipv6_route_ifname_cmd,
1436 "no ipv6 route X:X::X:X/M X:X::X:X INTERFACE",
1437 NO_STR
1438 IP_STR
1439 "Establish static routes\n"
1440 "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
1441 "IPv6 gateway address\n"
1442 "IPv6 gateway interface name\n")
1443{
hasso81dfcaa2003-05-25 19:21:25 +00001444 return static_ipv6_func (vty, 0, argv[0], argv[1], argv[2], NULL, NULL);
paul718e3742002-12-13 20:15:29 +00001445}
1446
hasso81dfcaa2003-05-25 19:21:25 +00001447ALIAS (no_ipv6_route_ifname,
1448 no_ipv6_route_ifname_flags_cmd,
1449 "no ipv6 route X:X::X:X/M X:X::X:X INTERFACE (reject|blackhole)",
1450 NO_STR
1451 IP_STR
1452 "Establish static routes\n"
1453 "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
1454 "IPv6 gateway address\n"
1455 "IPv6 gateway interface name\n"
1456 "Emit an ICMP unreachable when matched\n"
1457 "Silently discard pkts when matched\n")
1458
paul718e3742002-12-13 20:15:29 +00001459DEFUN (no_ipv6_route_pref,
1460 no_ipv6_route_pref_cmd,
1461 "no ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) <1-255>",
1462 NO_STR
1463 IP_STR
1464 "Establish static routes\n"
1465 "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
1466 "IPv6 gateway address\n"
1467 "IPv6 gateway interface name\n"
1468 "Distance value for this prefix\n")
1469{
hasso81dfcaa2003-05-25 19:21:25 +00001470 return static_ipv6_func (vty, 0, argv[0], argv[1], NULL, NULL, argv[2]);
1471}
1472
1473DEFUN (no_ipv6_route_flags_pref,
1474 no_ipv6_route_flags_pref_cmd,
1475 "no ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) (reject|blackhole) <1-255>",
1476 NO_STR
1477 IP_STR
1478 "Establish static routes\n"
1479 "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
1480 "IPv6 gateway address\n"
1481 "IPv6 gateway interface name\n"
1482 "Emit an ICMP unreachable when matched\n"
1483 "Silently discard pkts when matched\n"
1484 "Distance value for this prefix\n")
1485{
1486 /* We do not care about argv[2] */
1487 return static_ipv6_func (vty, 0, argv[0], argv[1], NULL, argv[2], argv[3]);
paul718e3742002-12-13 20:15:29 +00001488}
1489
1490DEFUN (no_ipv6_route_ifname_pref,
1491 no_ipv6_route_ifname_pref_cmd,
1492 "no ipv6 route X:X::X:X/M X:X::X:X INTERFACE <1-255>",
1493 NO_STR
1494 IP_STR
1495 "Establish static routes\n"
1496 "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
1497 "IPv6 gateway address\n"
1498 "IPv6 gateway interface name\n"
1499 "Distance value for this prefix\n")
1500{
hasso81dfcaa2003-05-25 19:21:25 +00001501 return static_ipv6_func (vty, 0, argv[0], argv[1], argv[2], NULL, argv[3]);
1502}
1503
1504DEFUN (no_ipv6_route_ifname_flags_pref,
1505 no_ipv6_route_ifname_flags_pref_cmd,
1506 "no ipv6 route X:X::X:X/M X:X::X:X INTERFACE (reject|blackhole) <1-255>",
1507 NO_STR
1508 IP_STR
1509 "Establish static routes\n"
1510 "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
1511 "IPv6 gateway address\n"
1512 "IPv6 gateway interface name\n"
1513 "Emit an ICMP unreachable when matched\n"
1514 "Silently discard pkts when matched\n"
1515 "Distance value for this prefix\n")
1516{
1517 return static_ipv6_func (vty, 0, argv[0], argv[1], argv[2], argv[3], argv[4]);
paul718e3742002-12-13 20:15:29 +00001518}
1519
paul595db7f2003-05-25 21:35:06 +00001520/* New RIB. Detailed information for IPv6 route. */
paula1ac18c2005-06-28 17:17:12 +00001521static void
paul718e3742002-12-13 20:15:29 +00001522vty_show_ipv6_route_detail (struct vty *vty, struct route_node *rn)
1523{
1524 struct rib *rib;
Christian Frankefa713d92013-07-05 15:35:37 +00001525 struct nexthop *nexthop, *tnexthop;
1526 int recursing;
paul718e3742002-12-13 20:15:29 +00001527 char buf[BUFSIZ];
1528
Avneesh Sachdev9fd92e32012-11-13 22:48:53 +00001529 RNODE_FOREACH_RIB (rn, rib)
paul718e3742002-12-13 20:15:29 +00001530 {
1531 vty_out (vty, "Routing entry for %s/%d%s",
1532 inet_ntop (AF_INET6, &rn->p.u.prefix6, buf, BUFSIZ),
1533 rn->p.prefixlen,
1534 VTY_NEWLINE);
ajsf52d13c2005-10-01 17:38:06 +00001535 vty_out (vty, " Known via \"%s\"", zebra_route_string (rib->type));
Jorge Boncompte [DTI2]ddc943d2012-04-13 13:46:07 +02001536 vty_out (vty, ", distance %u, metric %u", rib->distance, rib->metric);
paul718e3742002-12-13 20:15:29 +00001537 if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_SELECTED))
1538 vty_out (vty, ", best");
1539 if (rib->refcnt)
1540 vty_out (vty, ", refcnt %ld", rib->refcnt);
hasso81dfcaa2003-05-25 19:21:25 +00001541 if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_BLACKHOLE))
1542 vty_out (vty, ", blackhole");
1543 if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_REJECT))
1544 vty_out (vty, ", reject");
paul718e3742002-12-13 20:15:29 +00001545 vty_out (vty, "%s", VTY_NEWLINE);
1546
1547#define ONE_DAY_SECOND 60*60*24
1548#define ONE_WEEK_SECOND 60*60*24*7
1549 if (rib->type == ZEBRA_ROUTE_RIPNG
1550 || rib->type == ZEBRA_ROUTE_OSPF6
Juliusz Chroboczek578ce372012-02-09 13:42:28 +01001551 || rib->type == ZEBRA_ROUTE_BABEL
jardin9e867fe2003-12-23 08:56:18 +00001552 || rib->type == ZEBRA_ROUTE_ISIS
paul718e3742002-12-13 20:15:29 +00001553 || rib->type == ZEBRA_ROUTE_BGP)
1554 {
1555 time_t uptime;
1556 struct tm *tm;
1557
1558 uptime = time (NULL);
1559 uptime -= rib->uptime;
1560 tm = gmtime (&uptime);
1561
1562 vty_out (vty, " Last update ");
1563
1564 if (uptime < ONE_DAY_SECOND)
1565 vty_out (vty, "%02d:%02d:%02d",
1566 tm->tm_hour, tm->tm_min, tm->tm_sec);
1567 else if (uptime < ONE_WEEK_SECOND)
1568 vty_out (vty, "%dd%02dh%02dm",
1569 tm->tm_yday, tm->tm_hour, tm->tm_min);
1570 else
1571 vty_out (vty, "%02dw%dd%02dh",
1572 tm->tm_yday/7,
1573 tm->tm_yday - ((tm->tm_yday/7) * 7), tm->tm_hour);
1574 vty_out (vty, " ago%s", VTY_NEWLINE);
1575 }
1576
Christian Frankefa713d92013-07-05 15:35:37 +00001577 for (ALL_NEXTHOPS_RO(rib->nexthop, nexthop, tnexthop, recursing))
paul718e3742002-12-13 20:15:29 +00001578 {
Christian Frankefa713d92013-07-05 15:35:37 +00001579 vty_out (vty, " %c%s",
1580 CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB) ? '*' : ' ',
1581 recursing ? " " : "");
paul718e3742002-12-13 20:15:29 +00001582
1583 switch (nexthop->type)
1584 {
1585 case NEXTHOP_TYPE_IPV6:
1586 case NEXTHOP_TYPE_IPV6_IFINDEX:
1587 case NEXTHOP_TYPE_IPV6_IFNAME:
1588 vty_out (vty, " %s",
1589 inet_ntop (AF_INET6, &nexthop->gate.ipv6, buf, BUFSIZ));
1590 if (nexthop->type == NEXTHOP_TYPE_IPV6_IFNAME)
1591 vty_out (vty, ", %s", nexthop->ifname);
1592 else if (nexthop->ifindex)
1593 vty_out (vty, ", via %s", ifindex2ifname (nexthop->ifindex));
1594 break;
1595 case NEXTHOP_TYPE_IFINDEX:
1596 vty_out (vty, " directly connected, %s",
1597 ifindex2ifname (nexthop->ifindex));
1598 break;
1599 case NEXTHOP_TYPE_IFNAME:
1600 vty_out (vty, " directly connected, %s",
1601 nexthop->ifname);
1602 break;
1603 default:
1604 break;
1605 }
1606 if (! CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ACTIVE))
1607 vty_out (vty, " inactive");
1608
Christian Frankee8d3d292013-07-05 15:35:39 +00001609 if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ONLINK))
1610 vty_out (vty, " onlink");
1611
paul718e3742002-12-13 20:15:29 +00001612 if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_RECURSIVE))
Christian Frankefa713d92013-07-05 15:35:37 +00001613 vty_out (vty, " (recursive)");
1614
paul718e3742002-12-13 20:15:29 +00001615 vty_out (vty, "%s", VTY_NEWLINE);
1616 }
1617 vty_out (vty, "%s", VTY_NEWLINE);
1618 }
1619}
1620
paula1ac18c2005-06-28 17:17:12 +00001621static void
paul718e3742002-12-13 20:15:29 +00001622vty_show_ipv6_route (struct vty *vty, struct route_node *rn,
1623 struct rib *rib)
1624{
Christian Frankefa713d92013-07-05 15:35:37 +00001625 struct nexthop *nexthop, *tnexthop;
1626 int recursing;
paul718e3742002-12-13 20:15:29 +00001627 int len = 0;
1628 char buf[BUFSIZ];
1629
1630 /* Nexthop information. */
Christian Frankefa713d92013-07-05 15:35:37 +00001631 for (ALL_NEXTHOPS_RO(rib->nexthop, nexthop, tnexthop, recursing))
paul718e3742002-12-13 20:15:29 +00001632 {
1633 if (nexthop == rib->nexthop)
1634 {
1635 /* Prefix information. */
1636 len = vty_out (vty, "%c%c%c %s/%d",
ajsf52d13c2005-10-01 17:38:06 +00001637 zebra_route_char (rib->type),
paul718e3742002-12-13 20:15:29 +00001638 CHECK_FLAG (rib->flags, ZEBRA_FLAG_SELECTED)
1639 ? '>' : ' ',
1640 CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB)
1641 ? '*' : ' ',
1642 inet_ntop (AF_INET6, &rn->p.u.prefix6, buf, BUFSIZ),
1643 rn->p.prefixlen);
1644
1645 /* Distance and metric display. */
1646 if (rib->type != ZEBRA_ROUTE_CONNECT
1647 && rib->type != ZEBRA_ROUTE_KERNEL)
1648 len += vty_out (vty, " [%d/%d]", rib->distance,
1649 rib->metric);
1650 }
1651 else
1652 vty_out (vty, " %c%*c",
1653 CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB)
1654 ? '*' : ' ',
Christian Frankefa713d92013-07-05 15:35:37 +00001655 len - 3 + (2 * recursing), ' ');
paul718e3742002-12-13 20:15:29 +00001656
1657 switch (nexthop->type)
1658 {
1659 case NEXTHOP_TYPE_IPV6:
1660 case NEXTHOP_TYPE_IPV6_IFINDEX:
1661 case NEXTHOP_TYPE_IPV6_IFNAME:
1662 vty_out (vty, " via %s",
1663 inet_ntop (AF_INET6, &nexthop->gate.ipv6, buf, BUFSIZ));
1664 if (nexthop->type == NEXTHOP_TYPE_IPV6_IFNAME)
1665 vty_out (vty, ", %s", nexthop->ifname);
1666 else if (nexthop->ifindex)
1667 vty_out (vty, ", %s", ifindex2ifname (nexthop->ifindex));
1668 break;
1669 case NEXTHOP_TYPE_IFINDEX:
1670 vty_out (vty, " is directly connected, %s",
1671 ifindex2ifname (nexthop->ifindex));
1672 break;
1673 case NEXTHOP_TYPE_IFNAME:
1674 vty_out (vty, " is directly connected, %s",
1675 nexthop->ifname);
1676 break;
1677 default:
1678 break;
1679 }
1680 if (! CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ACTIVE))
1681 vty_out (vty, " inactive");
1682
1683 if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_RECURSIVE))
Christian Frankefa713d92013-07-05 15:35:37 +00001684 vty_out (vty, " (recursive)");
paul718e3742002-12-13 20:15:29 +00001685
hasso81dfcaa2003-05-25 19:21:25 +00001686 if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_BLACKHOLE))
1687 vty_out (vty, ", bh");
1688 if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_REJECT))
1689 vty_out (vty, ", rej");
1690
paul718e3742002-12-13 20:15:29 +00001691 if (rib->type == ZEBRA_ROUTE_RIPNG
1692 || rib->type == ZEBRA_ROUTE_OSPF6
Juliusz Chroboczek578ce372012-02-09 13:42:28 +01001693 || rib->type == ZEBRA_ROUTE_BABEL
jardin9e867fe2003-12-23 08:56:18 +00001694 || rib->type == ZEBRA_ROUTE_ISIS
paul718e3742002-12-13 20:15:29 +00001695 || rib->type == ZEBRA_ROUTE_BGP)
1696 {
1697 time_t uptime;
1698 struct tm *tm;
1699
1700 uptime = time (NULL);
1701 uptime -= rib->uptime;
1702 tm = gmtime (&uptime);
1703
1704#define ONE_DAY_SECOND 60*60*24
1705#define ONE_WEEK_SECOND 60*60*24*7
1706
1707 if (uptime < ONE_DAY_SECOND)
1708 vty_out (vty, ", %02d:%02d:%02d",
1709 tm->tm_hour, tm->tm_min, tm->tm_sec);
1710 else if (uptime < ONE_WEEK_SECOND)
1711 vty_out (vty, ", %dd%02dh%02dm",
1712 tm->tm_yday, tm->tm_hour, tm->tm_min);
1713 else
1714 vty_out (vty, ", %02dw%dd%02dh",
1715 tm->tm_yday/7,
1716 tm->tm_yday - ((tm->tm_yday/7) * 7), tm->tm_hour);
1717 }
1718 vty_out (vty, "%s", VTY_NEWLINE);
1719 }
1720}
1721
paul718e3742002-12-13 20:15:29 +00001722DEFUN (show_ipv6_route,
1723 show_ipv6_route_cmd,
1724 "show ipv6 route",
1725 SHOW_STR
1726 IP_STR
1727 "IPv6 routing table\n")
1728{
1729 struct route_table *table;
1730 struct route_node *rn;
1731 struct rib *rib;
1732 int first = 1;
1733
1734 table = vrf_table (AFI_IP6, SAFI_UNICAST, 0);
1735 if (! table)
1736 return CMD_SUCCESS;
1737
1738 /* Show all IPv6 route. */
1739 for (rn = route_top (table); rn; rn = route_next (rn))
Avneesh Sachdev9fd92e32012-11-13 22:48:53 +00001740 RNODE_FOREACH_RIB (rn, rib)
paul718e3742002-12-13 20:15:29 +00001741 {
1742 if (first)
1743 {
David Lampartere0ca5fd2009-09-16 01:52:42 +02001744 vty_out (vty, SHOW_ROUTE_V6_HEADER);
paul718e3742002-12-13 20:15:29 +00001745 first = 0;
1746 }
1747 vty_show_ipv6_route (vty, rn, rib);
1748 }
1749 return CMD_SUCCESS;
1750}
1751
1752DEFUN (show_ipv6_route_prefix_longer,
1753 show_ipv6_route_prefix_longer_cmd,
1754 "show ipv6 route X:X::X:X/M longer-prefixes",
1755 SHOW_STR
1756 IP_STR
1757 "IPv6 routing table\n"
1758 "IPv6 prefix\n"
1759 "Show route matching the specified Network/Mask pair only\n")
1760{
1761 struct route_table *table;
1762 struct route_node *rn;
1763 struct rib *rib;
1764 struct prefix p;
1765 int ret;
1766 int first = 1;
1767
1768 table = vrf_table (AFI_IP6, SAFI_UNICAST, 0);
1769 if (! table)
1770 return CMD_SUCCESS;
1771
1772 ret = str2prefix (argv[0], &p);
1773 if (! ret)
1774 {
1775 vty_out (vty, "%% Malformed Prefix%s", VTY_NEWLINE);
1776 return CMD_WARNING;
1777 }
1778
1779 /* Show matched type IPv6 routes. */
1780 for (rn = route_top (table); rn; rn = route_next (rn))
Avneesh Sachdev9fd92e32012-11-13 22:48:53 +00001781 RNODE_FOREACH_RIB (rn, rib)
paul718e3742002-12-13 20:15:29 +00001782 if (prefix_match (&p, &rn->p))
1783 {
1784 if (first)
1785 {
David Lampartere0ca5fd2009-09-16 01:52:42 +02001786 vty_out (vty, SHOW_ROUTE_V6_HEADER);
paul718e3742002-12-13 20:15:29 +00001787 first = 0;
1788 }
1789 vty_show_ipv6_route (vty, rn, rib);
1790 }
1791 return CMD_SUCCESS;
1792}
1793
1794DEFUN (show_ipv6_route_protocol,
1795 show_ipv6_route_protocol_cmd,
David Lampartere0ca5fd2009-09-16 01:52:42 +02001796 "show ipv6 route " QUAGGA_IP6_REDIST_STR_ZEBRA,
paul718e3742002-12-13 20:15:29 +00001797 SHOW_STR
1798 IP_STR
1799 "IP routing table\n"
David Lampartere0ca5fd2009-09-16 01:52:42 +02001800 QUAGGA_IP6_REDIST_HELP_STR_ZEBRA)
paul718e3742002-12-13 20:15:29 +00001801{
1802 int type;
1803 struct route_table *table;
1804 struct route_node *rn;
1805 struct rib *rib;
1806 int first = 1;
1807
David Lampartere0ca5fd2009-09-16 01:52:42 +02001808 type = proto_redistnum (AFI_IP6, argv[0]);
1809 if (type < 0)
paul718e3742002-12-13 20:15:29 +00001810 {
1811 vty_out (vty, "Unknown route type%s", VTY_NEWLINE);
1812 return CMD_WARNING;
1813 }
1814
1815 table = vrf_table (AFI_IP6, SAFI_UNICAST, 0);
1816 if (! table)
1817 return CMD_SUCCESS;
1818
1819 /* Show matched type IPv6 routes. */
1820 for (rn = route_top (table); rn; rn = route_next (rn))
Avneesh Sachdev9fd92e32012-11-13 22:48:53 +00001821 RNODE_FOREACH_RIB (rn, rib)
paul718e3742002-12-13 20:15:29 +00001822 if (rib->type == type)
1823 {
1824 if (first)
1825 {
David Lampartere0ca5fd2009-09-16 01:52:42 +02001826 vty_out (vty, SHOW_ROUTE_V6_HEADER);
paul718e3742002-12-13 20:15:29 +00001827 first = 0;
1828 }
1829 vty_show_ipv6_route (vty, rn, rib);
1830 }
1831 return CMD_SUCCESS;
1832}
1833
1834DEFUN (show_ipv6_route_addr,
1835 show_ipv6_route_addr_cmd,
1836 "show ipv6 route X:X::X:X",
1837 SHOW_STR
1838 IP_STR
1839 "IPv6 routing table\n"
1840 "IPv6 Address\n")
1841{
1842 int ret;
1843 struct prefix_ipv6 p;
1844 struct route_table *table;
1845 struct route_node *rn;
1846
1847 ret = str2prefix_ipv6 (argv[0], &p);
1848 if (ret <= 0)
1849 {
1850 vty_out (vty, "Malformed IPv6 address%s", VTY_NEWLINE);
1851 return CMD_WARNING;
1852 }
1853
1854 table = vrf_table (AFI_IP6, SAFI_UNICAST, 0);
1855 if (! table)
1856 return CMD_SUCCESS;
1857
1858 rn = route_node_match (table, (struct prefix *) &p);
1859 if (! rn)
1860 {
1861 vty_out (vty, "%% Network not in table%s", VTY_NEWLINE);
1862 return CMD_WARNING;
1863 }
1864
1865 vty_show_ipv6_route_detail (vty, rn);
1866
1867 route_unlock_node (rn);
1868
1869 return CMD_SUCCESS;
1870}
1871
1872DEFUN (show_ipv6_route_prefix,
1873 show_ipv6_route_prefix_cmd,
1874 "show ipv6 route X:X::X:X/M",
1875 SHOW_STR
1876 IP_STR
1877 "IPv6 routing table\n"
1878 "IPv6 prefix\n")
1879{
1880 int ret;
1881 struct prefix_ipv6 p;
1882 struct route_table *table;
1883 struct route_node *rn;
1884
1885 ret = str2prefix_ipv6 (argv[0], &p);
1886 if (ret <= 0)
1887 {
1888 vty_out (vty, "Malformed IPv6 prefix%s", VTY_NEWLINE);
1889 return CMD_WARNING;
1890 }
1891
1892 table = vrf_table (AFI_IP6, SAFI_UNICAST, 0);
1893 if (! table)
1894 return CMD_SUCCESS;
1895
1896 rn = route_node_match (table, (struct prefix *) &p);
1897 if (! rn || rn->p.prefixlen != p.prefixlen)
1898 {
1899 vty_out (vty, "%% Network not in table%s", VTY_NEWLINE);
1900 return CMD_WARNING;
1901 }
1902
1903 vty_show_ipv6_route_detail (vty, rn);
1904
1905 route_unlock_node (rn);
1906
1907 return CMD_SUCCESS;
1908}
1909
Stig Thormodsrud61691c92008-11-04 15:45:07 -08001910/* Show route summary. */
1911DEFUN (show_ipv6_route_summary,
1912 show_ipv6_route_summary_cmd,
1913 "show ipv6 route summary",
1914 SHOW_STR
1915 IP_STR
1916 "IPv6 routing table\n"
1917 "Summary of all IPv6 routes\n")
1918{
1919 struct route_table *table;
1920
1921 table = vrf_table (AFI_IP6, SAFI_UNICAST, 0);
1922 if (! table)
1923 return CMD_SUCCESS;
1924
1925 vty_show_ip_route_summary (vty, table);
1926
1927 return CMD_SUCCESS;
1928}
1929
G.Balajicddf3912011-11-26 21:59:32 +04001930/*
G.Balajicddf3912011-11-26 21:59:32 +04001931 * Show IPv6 mroute command.Used to dump
1932 * the Multicast routing table.
1933 */
1934
1935DEFUN (show_ipv6_mroute,
1936 show_ipv6_mroute_cmd,
1937 "show ipv6 mroute",
1938 SHOW_STR
1939 IP_STR
1940 "IPv6 Multicast routing table\n")
1941{
1942 struct route_table *table;
1943 struct route_node *rn;
1944 struct rib *rib;
1945 int first = 1;
1946
1947 table = vrf_table (AFI_IP6, SAFI_MULTICAST, 0);
1948 if (! table)
1949 return CMD_SUCCESS;
1950
1951 /* Show all IPv6 route. */
1952 for (rn = route_top (table); rn; rn = route_next (rn))
Avneesh Sachdev9fd92e32012-11-13 22:48:53 +00001953 RNODE_FOREACH_RIB (rn, rib)
G.Balajicddf3912011-11-26 21:59:32 +04001954 {
1955 if (first)
1956 {
G.Balajicb32fd62011-11-27 20:09:40 +05301957 vty_out (vty, SHOW_ROUTE_V6_HEADER);
G.Balajicddf3912011-11-26 21:59:32 +04001958 first = 0;
1959 }
1960 vty_show_ipv6_route (vty, rn, rib);
1961 }
1962 return CMD_SUCCESS;
1963}
1964
paul718e3742002-12-13 20:15:29 +00001965/* Write IPv6 static route configuration. */
paula1ac18c2005-06-28 17:17:12 +00001966static int
paul718e3742002-12-13 20:15:29 +00001967static_config_ipv6 (struct vty *vty)
1968{
1969 struct route_node *rn;
1970 struct static_ipv6 *si;
1971 int write;
1972 char buf[BUFSIZ];
1973 struct route_table *stable;
1974
1975 write = 0;
1976
1977 /* Lookup table. */
1978 stable = vrf_static_table (AFI_IP6, SAFI_UNICAST, 0);
1979 if (! stable)
1980 return -1;
1981
1982 for (rn = route_top (stable); rn; rn = route_next (rn))
1983 for (si = rn->info; si; si = si->next)
1984 {
1985 vty_out (vty, "ipv6 route %s/%d",
1986 inet_ntop (AF_INET6, &rn->p.u.prefix6, buf, BUFSIZ),
1987 rn->p.prefixlen);
1988
1989 switch (si->type)
1990 {
1991 case STATIC_IPV6_GATEWAY:
1992 vty_out (vty, " %s", inet_ntop (AF_INET6, &si->ipv6, buf, BUFSIZ));
1993 break;
1994 case STATIC_IPV6_IFNAME:
1995 vty_out (vty, " %s", si->ifname);
1996 break;
1997 case STATIC_IPV6_GATEWAY_IFNAME:
1998 vty_out (vty, " %s %s",
1999 inet_ntop (AF_INET6, &si->ipv6, buf, BUFSIZ), si->ifname);
2000 break;
2001 }
2002
hasso81dfcaa2003-05-25 19:21:25 +00002003 if (CHECK_FLAG(si->flags, ZEBRA_FLAG_REJECT))
2004 vty_out (vty, " %s", "reject");
2005
2006 if (CHECK_FLAG(si->flags, ZEBRA_FLAG_BLACKHOLE))
2007 vty_out (vty, " %s", "blackhole");
2008
paul718e3742002-12-13 20:15:29 +00002009 if (si->distance != ZEBRA_STATIC_DISTANCE_DEFAULT)
2010 vty_out (vty, " %d", si->distance);
2011 vty_out (vty, "%s", VTY_NEWLINE);
2012
2013 write = 1;
2014 }
2015 return write;
2016}
2017#endif /* HAVE_IPV6 */
2018
2019/* Static ip route configuration write function. */
paula1ac18c2005-06-28 17:17:12 +00002020static int
paul718e3742002-12-13 20:15:29 +00002021zebra_ip_config (struct vty *vty)
2022{
2023 int write = 0;
2024
2025 write += static_config_ipv4 (vty);
2026#ifdef HAVE_IPV6
2027 write += static_config_ipv6 (vty);
2028#endif /* HAVE_IPV6 */
2029
2030 return write;
2031}
2032
Paul Jakma7514fb72007-05-02 16:05:35 +00002033/* ip protocol configuration write function */
2034static int config_write_protocol(struct vty *vty)
2035{
2036 int i;
2037
2038 for (i=0;i<ZEBRA_ROUTE_MAX;i++)
2039 {
2040 if (proto_rm[AFI_IP][i])
2041 vty_out (vty, "ip protocol %s route-map %s%s", zebra_route_string(i),
2042 proto_rm[AFI_IP][i], VTY_NEWLINE);
2043 }
2044 if (proto_rm[AFI_IP][ZEBRA_ROUTE_MAX])
2045 vty_out (vty, "ip protocol %s route-map %s%s", "any",
2046 proto_rm[AFI_IP][ZEBRA_ROUTE_MAX], VTY_NEWLINE);
2047
2048 return 1;
2049}
2050
2051/* table node for protocol filtering */
Stephen Hemminger7fc626d2008-12-01 11:10:34 -08002052static struct cmd_node protocol_node = { PROTOCOL_NODE, "", 1 };
Paul Jakma7514fb72007-05-02 16:05:35 +00002053
paul718e3742002-12-13 20:15:29 +00002054/* IP node for static routes. */
Stephen Hemminger7fc626d2008-12-01 11:10:34 -08002055static struct cmd_node ip_node = { IP_NODE, "", 1 };
paul718e3742002-12-13 20:15:29 +00002056
2057/* Route VTY. */
2058void
paula1ac18c2005-06-28 17:17:12 +00002059zebra_vty_init (void)
paul718e3742002-12-13 20:15:29 +00002060{
2061 install_node (&ip_node, zebra_ip_config);
Paul Jakma7514fb72007-05-02 16:05:35 +00002062 install_node (&protocol_node, config_write_protocol);
paul718e3742002-12-13 20:15:29 +00002063
Paul Jakma7514fb72007-05-02 16:05:35 +00002064 install_element (CONFIG_NODE, &ip_protocol_cmd);
2065 install_element (CONFIG_NODE, &no_ip_protocol_cmd);
2066 install_element (VIEW_NODE, &show_ip_protocol_cmd);
2067 install_element (ENABLE_NODE, &show_ip_protocol_cmd);
paul718e3742002-12-13 20:15:29 +00002068 install_element (CONFIG_NODE, &ip_route_cmd);
hasso81dfcaa2003-05-25 19:21:25 +00002069 install_element (CONFIG_NODE, &ip_route_flags_cmd);
hasso457ef552003-05-28 12:02:15 +00002070 install_element (CONFIG_NODE, &ip_route_flags2_cmd);
paul718e3742002-12-13 20:15:29 +00002071 install_element (CONFIG_NODE, &ip_route_mask_cmd);
hasso81dfcaa2003-05-25 19:21:25 +00002072 install_element (CONFIG_NODE, &ip_route_mask_flags_cmd);
hasso457ef552003-05-28 12:02:15 +00002073 install_element (CONFIG_NODE, &ip_route_mask_flags2_cmd);
paul718e3742002-12-13 20:15:29 +00002074 install_element (CONFIG_NODE, &no_ip_route_cmd);
hasso81dfcaa2003-05-25 19:21:25 +00002075 install_element (CONFIG_NODE, &no_ip_route_flags_cmd);
hasso457ef552003-05-28 12:02:15 +00002076 install_element (CONFIG_NODE, &no_ip_route_flags2_cmd);
paul718e3742002-12-13 20:15:29 +00002077 install_element (CONFIG_NODE, &no_ip_route_mask_cmd);
hasso81dfcaa2003-05-25 19:21:25 +00002078 install_element (CONFIG_NODE, &no_ip_route_mask_flags_cmd);
hasso457ef552003-05-28 12:02:15 +00002079 install_element (CONFIG_NODE, &no_ip_route_mask_flags2_cmd);
paul718e3742002-12-13 20:15:29 +00002080 install_element (CONFIG_NODE, &ip_route_distance_cmd);
hasso81dfcaa2003-05-25 19:21:25 +00002081 install_element (CONFIG_NODE, &ip_route_flags_distance_cmd);
hasso457ef552003-05-28 12:02:15 +00002082 install_element (CONFIG_NODE, &ip_route_flags_distance2_cmd);
paul718e3742002-12-13 20:15:29 +00002083 install_element (CONFIG_NODE, &ip_route_mask_distance_cmd);
hasso81dfcaa2003-05-25 19:21:25 +00002084 install_element (CONFIG_NODE, &ip_route_mask_flags_distance_cmd);
hasso457ef552003-05-28 12:02:15 +00002085 install_element (CONFIG_NODE, &ip_route_mask_flags_distance2_cmd);
paul718e3742002-12-13 20:15:29 +00002086 install_element (CONFIG_NODE, &no_ip_route_distance_cmd);
hasso81dfcaa2003-05-25 19:21:25 +00002087 install_element (CONFIG_NODE, &no_ip_route_flags_distance_cmd);
hasso457ef552003-05-28 12:02:15 +00002088 install_element (CONFIG_NODE, &no_ip_route_flags_distance2_cmd);
hasso81dfcaa2003-05-25 19:21:25 +00002089 install_element (CONFIG_NODE, &no_ip_route_mask_flags_distance_cmd);
hasso457ef552003-05-28 12:02:15 +00002090 install_element (CONFIG_NODE, &no_ip_route_mask_flags_distance2_cmd);
paul718e3742002-12-13 20:15:29 +00002091
2092 install_element (VIEW_NODE, &show_ip_route_cmd);
2093 install_element (VIEW_NODE, &show_ip_route_addr_cmd);
2094 install_element (VIEW_NODE, &show_ip_route_prefix_cmd);
2095 install_element (VIEW_NODE, &show_ip_route_prefix_longer_cmd);
2096 install_element (VIEW_NODE, &show_ip_route_protocol_cmd);
2097 install_element (VIEW_NODE, &show_ip_route_supernets_cmd);
Stig Thormodsrud61691c92008-11-04 15:45:07 -08002098 install_element (VIEW_NODE, &show_ip_route_summary_cmd);
paul718e3742002-12-13 20:15:29 +00002099 install_element (ENABLE_NODE, &show_ip_route_cmd);
2100 install_element (ENABLE_NODE, &show_ip_route_addr_cmd);
2101 install_element (ENABLE_NODE, &show_ip_route_prefix_cmd);
2102 install_element (ENABLE_NODE, &show_ip_route_prefix_longer_cmd);
2103 install_element (ENABLE_NODE, &show_ip_route_protocol_cmd);
2104 install_element (ENABLE_NODE, &show_ip_route_supernets_cmd);
paul718e3742002-12-13 20:15:29 +00002105 install_element (ENABLE_NODE, &show_ip_route_summary_cmd);
paul718e3742002-12-13 20:15:29 +00002106
G.Balajicddf3912011-11-26 21:59:32 +04002107 install_element (VIEW_NODE, &show_ip_mroute_cmd);
2108 install_element (ENABLE_NODE, &show_ip_mroute_cmd);
2109
2110
paul718e3742002-12-13 20:15:29 +00002111#ifdef HAVE_IPV6
2112 install_element (CONFIG_NODE, &ipv6_route_cmd);
hasso81dfcaa2003-05-25 19:21:25 +00002113 install_element (CONFIG_NODE, &ipv6_route_flags_cmd);
paul718e3742002-12-13 20:15:29 +00002114 install_element (CONFIG_NODE, &ipv6_route_ifname_cmd);
hasso81dfcaa2003-05-25 19:21:25 +00002115 install_element (CONFIG_NODE, &ipv6_route_ifname_flags_cmd);
paul718e3742002-12-13 20:15:29 +00002116 install_element (CONFIG_NODE, &no_ipv6_route_cmd);
hasso81dfcaa2003-05-25 19:21:25 +00002117 install_element (CONFIG_NODE, &no_ipv6_route_flags_cmd);
paul718e3742002-12-13 20:15:29 +00002118 install_element (CONFIG_NODE, &no_ipv6_route_ifname_cmd);
hasso81dfcaa2003-05-25 19:21:25 +00002119 install_element (CONFIG_NODE, &no_ipv6_route_ifname_flags_cmd);
paul718e3742002-12-13 20:15:29 +00002120 install_element (CONFIG_NODE, &ipv6_route_pref_cmd);
hasso81dfcaa2003-05-25 19:21:25 +00002121 install_element (CONFIG_NODE, &ipv6_route_flags_pref_cmd);
paul718e3742002-12-13 20:15:29 +00002122 install_element (CONFIG_NODE, &ipv6_route_ifname_pref_cmd);
hasso81dfcaa2003-05-25 19:21:25 +00002123 install_element (CONFIG_NODE, &ipv6_route_ifname_flags_pref_cmd);
paul718e3742002-12-13 20:15:29 +00002124 install_element (CONFIG_NODE, &no_ipv6_route_pref_cmd);
hasso81dfcaa2003-05-25 19:21:25 +00002125 install_element (CONFIG_NODE, &no_ipv6_route_flags_pref_cmd);
paul718e3742002-12-13 20:15:29 +00002126 install_element (CONFIG_NODE, &no_ipv6_route_ifname_pref_cmd);
hasso81dfcaa2003-05-25 19:21:25 +00002127 install_element (CONFIG_NODE, &no_ipv6_route_ifname_flags_pref_cmd);
paul718e3742002-12-13 20:15:29 +00002128 install_element (VIEW_NODE, &show_ipv6_route_cmd);
Stig Thormodsrud61691c92008-11-04 15:45:07 -08002129 install_element (VIEW_NODE, &show_ipv6_route_summary_cmd);
paul718e3742002-12-13 20:15:29 +00002130 install_element (VIEW_NODE, &show_ipv6_route_protocol_cmd);
2131 install_element (VIEW_NODE, &show_ipv6_route_addr_cmd);
2132 install_element (VIEW_NODE, &show_ipv6_route_prefix_cmd);
2133 install_element (VIEW_NODE, &show_ipv6_route_prefix_longer_cmd);
2134 install_element (ENABLE_NODE, &show_ipv6_route_cmd);
2135 install_element (ENABLE_NODE, &show_ipv6_route_protocol_cmd);
2136 install_element (ENABLE_NODE, &show_ipv6_route_addr_cmd);
2137 install_element (ENABLE_NODE, &show_ipv6_route_prefix_cmd);
2138 install_element (ENABLE_NODE, &show_ipv6_route_prefix_longer_cmd);
Stig Thormodsrud61691c92008-11-04 15:45:07 -08002139 install_element (ENABLE_NODE, &show_ipv6_route_summary_cmd);
G.Balajicddf3912011-11-26 21:59:32 +04002140
2141 install_element (VIEW_NODE, &show_ipv6_mroute_cmd);
2142 install_element (ENABLE_NODE, &show_ipv6_mroute_cmd);
paul718e3742002-12-13 20:15:29 +00002143#endif /* HAVE_IPV6 */
2144}