2 * Copyright (C) 2002 Kunihiro Ishiguro
4 * This file is part of GNU Zebra.
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
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.
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.
31 #include "zebra/zserv.h"
33 /* General fucntion for static route. */
35 zebra_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
)
47 ret
= str2prefix (dest_str
, &p
);
50 vty_out (vty
, "%% Malformed address%s", VTY_NEWLINE
);
54 /* Cisco like mask notation. */
57 ret
= inet_aton (mask_str
, &mask
);
60 vty_out (vty
, "%% Malformed address%s", VTY_NEWLINE
);
63 p
.prefixlen
= ip_masklen (mask
);
66 /* Apply mask for given prefix. */
69 /* Administrative distance. */
71 distance
= atoi (distance_str
);
73 distance
= ZEBRA_STATIC_DISTANCE_DEFAULT
;
75 /* Null0 static route. */
76 if ((gate_str
!= NULL
) && (strncasecmp (gate_str
, "Null0", strlen (gate_str
)) == 0))
80 vty_out (vty
, "%% can not have flag %s with Null0%s", flag_str
, VTY_NEWLINE
);
84 static_add_ipv4 (&p
, NULL
, NULL
, ZEBRA_FLAG_BLACKHOLE
, distance
, 0);
86 static_delete_ipv4 (&p
, NULL
, NULL
, distance
, 0);
95 SET_FLAG (flag
, ZEBRA_FLAG_REJECT
);
99 SET_FLAG (flag
, ZEBRA_FLAG_BLACKHOLE
);
102 vty_out (vty
, "%% Malformed flag %s %s", flag_str
, VTY_NEWLINE
);
107 if (gate_str
== NULL
)
110 static_add_ipv4 (&p
, NULL
, NULL
, flag
, distance
, 0);
112 static_delete_ipv4 (&p
, NULL
, NULL
, distance
, 0);
117 /* 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
);
126 static_add_ipv4 (&p
, ifname
? NULL
: &gate
, ifname
, flag
, distance
, 0);
128 static_delete_ipv4 (&p
, ifname
? NULL
: &gate
, ifname
, distance
, 0);
133 /* Static route configuration. */
136 "ip route A.B.C.D/M (A.B.C.D|INTERFACE|null0)",
138 "Establish static routes\n"
139 "IP destination prefix (e.g. 10.0.0.0/8)\n"
140 "IP gateway address\n"
141 "IP gateway interface name\n"
144 return zebra_static_ipv4 (vty
, 1, argv
[0], NULL
, argv
[1], NULL
, NULL
);
147 DEFUN (ip_route_flags
,
149 "ip route A.B.C.D/M (A.B.C.D|INTERFACE) (reject|blackhole)",
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"
155 "Emit an ICMP unreachable when matched\n"
156 "Silently discard pkts when matched\n")
158 return zebra_static_ipv4 (vty
, 1, argv
[0], NULL
, argv
[1], argv
[2], NULL
);
161 DEFUN (ip_route_flags2
,
163 "ip route A.B.C.D/M (reject|blackhole)",
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")
170 return zebra_static_ipv4 (vty
, 1, argv
[0], NULL
, NULL
, argv
[1], NULL
);
173 /* Mask as A.B.C.D format. */
174 DEFUN (ip_route_mask
,
176 "ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE|null0)",
178 "Establish static routes\n"
179 "IP destination prefix\n"
180 "IP destination prefix mask\n"
181 "IP gateway address\n"
182 "IP gateway interface name\n"
185 return zebra_static_ipv4 (vty
, 1, argv
[0], argv
[1], argv
[2], NULL
, NULL
);
188 DEFUN (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)",
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"
197 "Emit an ICMP unreachable when matched\n"
198 "Silently discard pkts when matched\n")
200 return zebra_static_ipv4 (vty
, 1, argv
[0], argv
[1], argv
[2], argv
[3], NULL
);
203 DEFUN (ip_route_mask_flags2
,
204 ip_route_mask_flags2_cmd
,
205 "ip route A.B.C.D A.B.C.D (reject|blackhole)",
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")
213 return zebra_static_ipv4 (vty
, 1, argv
[0], argv
[1], NULL
, argv
[2], NULL
);
216 /* Distance option value. */
217 DEFUN (ip_route_distance
,
218 ip_route_distance_cmd
,
219 "ip route A.B.C.D/M (A.B.C.D|INTERFACE|null0) <1-255>",
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"
226 "Distance value for this route\n")
228 return zebra_static_ipv4 (vty
, 1, argv
[0], NULL
, argv
[1], NULL
, argv
[2]);
231 DEFUN (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>",
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")
243 return zebra_static_ipv4 (vty
, 1, argv
[0], NULL
, argv
[1], argv
[2], argv
[3]);
246 DEFUN (ip_route_flags_distance2
,
247 ip_route_flags_distance2_cmd
,
248 "ip route A.B.C.D/M (reject|blackhole) <1-255>",
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")
256 return zebra_static_ipv4 (vty
, 1, argv
[0], NULL
, NULL
, argv
[1], argv
[2]);
259 DEFUN (ip_route_mask_distance
,
260 ip_route_mask_distance_cmd
,
261 "ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE|null0) <1-255>",
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"
269 "Distance value for this route\n")
271 return zebra_static_ipv4 (vty
, 1, argv
[0], argv
[1], argv
[2], NULL
, argv
[3]);
274 DEFUN (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>",
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"
283 "Distance value for this route\n"
284 "Emit an ICMP unreachable when matched\n"
285 "Silently discard pkts when matched\n")
287 return zebra_static_ipv4 (vty
, 1, argv
[0], argv
[1], argv
[2], argv
[3], argv
[4]);
290 DEFUN (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>",
294 "Establish static routes\n"
295 "IP destination prefix\n"
296 "IP destination prefix mask\n"
297 "Distance value for this route\n"
298 "Emit an ICMP unreachable when matched\n"
299 "Silently discard pkts when matched\n")
301 return zebra_static_ipv4 (vty
, 1, argv
[0], argv
[1], NULL
, argv
[2], argv
[3]);
306 "no ip route A.B.C.D/M (A.B.C.D|INTERFACE|null0)",
309 "Establish static routes\n"
310 "IP destination prefix (e.g. 10.0.0.0/8)\n"
311 "IP gateway address\n"
312 "IP gateway interface name\n"
315 return zebra_static_ipv4 (vty
, 0, argv
[0], NULL
, argv
[1], NULL
, NULL
);
319 no_ip_route_flags_cmd
,
320 "no ip route A.B.C.D/M (A.B.C.D|INTERFACE) (reject|blackhole)",
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"
327 "Emit an ICMP unreachable when matched\n"
328 "Silently discard pkts when matched\n")
330 DEFUN (no_ip_route_flags2
,
331 no_ip_route_flags2_cmd
,
332 "no ip route A.B.C.D/M (reject|blackhole)",
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")
340 return zebra_static_ipv4 (vty
, 0, argv
[0], NULL
, NULL
, NULL
, NULL
);
343 DEFUN (no_ip_route_mask
,
344 no_ip_route_mask_cmd
,
345 "no ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE|null0)",
348 "Establish static routes\n"
349 "IP destination prefix\n"
350 "IP destination prefix mask\n"
351 "IP gateway address\n"
352 "IP gateway interface name\n"
355 return zebra_static_ipv4 (vty
, 0, argv
[0], argv
[1], argv
[2], NULL
, NULL
);
358 ALIAS (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)",
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"
368 "Emit an ICMP unreachable when matched\n"
369 "Silently discard pkts when matched\n")
371 DEFUN (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)",
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")
382 return zebra_static_ipv4 (vty
, 0, argv
[0], argv
[1], NULL
, NULL
, NULL
);
385 DEFUN (no_ip_route_distance
,
386 no_ip_route_distance_cmd
,
387 "no ip route A.B.C.D/M (A.B.C.D|INTERFACE|null0) <1-255>",
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"
395 "Distance value for this route\n")
397 return zebra_static_ipv4 (vty
, 0, argv
[0], NULL
, argv
[1], NULL
, argv
[2]);
400 DEFUN (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>",
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")
413 return zebra_static_ipv4 (vty
, 0, argv
[0], NULL
, argv
[1], argv
[2], argv
[3]);
416 DEFUN (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>",
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")
427 return zebra_static_ipv4 (vty
, 0, argv
[0], NULL
, NULL
, argv
[1], argv
[2]);
430 DEFUN (no_ip_route_mask_distance
,
431 no_ip_route_mask_distance_cmd
,
432 "no ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE|null0) <1-255>",
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"
441 "Distance value for this route\n")
443 return zebra_static_ipv4 (vty
, 0, argv
[0], argv
[1], argv
[2], NULL
, argv
[3]);
446 DEFUN (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>",
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")
460 return zebra_static_ipv4 (vty
, 0, argv
[0], argv
[1], argv
[2], argv
[3], argv
[4]);
463 DEFUN (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>",
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")
475 return zebra_static_ipv4 (vty
, 0, argv
[0], argv
[1], NULL
, argv
[2], argv
[3]);
478 char *proto_rm
[AFI_MAX
][ZEBRA_ROUTE_MAX
+1]; /* "any" == ZEBRA_ROUTE_MAX */
482 "ip protocol PROTO route-map ROUTE-MAP",
484 "Apply route map to PROTO\n"
490 if (strcasecmp(argv
[0], "any") == 0)
493 i
= proto_name2num(argv
[0]);
496 vty_out (vty
, "invalid protocol name \"%s\"%s", argv
[0] ? argv
[0] : "",
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]);
506 DEFUN (no_ip_protocol
,
508 "no ip protocol PROTO",
510 "Remove route map from PROTO\n"
515 if (strcasecmp(argv
[0], "any") == 0)
518 i
= proto_name2num(argv
[0]);
521 vty_out (vty
, "invalid protocol name \"%s\"%s", argv
[0] ? argv
[0] : "",
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
;
531 /* New RIB. Detailed information for IPv4 route. */
533 vty_show_ip_route_detail (struct vty
*vty
, struct route_node
*rn
)
536 struct nexthop
*nexthop
;
538 for (rib
= rn
->info
; rib
; rib
= rib
->next
)
540 vty_out (vty
, "Routing entry for %s/%d%s",
541 inet_ntoa (rn
->p
.u
.prefix4
), rn
->p
.prefixlen
,
543 vty_out (vty
, " Known via \"%s\"", zebra_route_string (rib
->type
));
544 vty_out (vty
, ", distance %d, metric %d", rib
->distance
, rib
->metric
);
545 if (CHECK_FLAG (rib
->flags
, ZEBRA_FLAG_SELECTED
))
546 vty_out (vty
, ", best");
548 vty_out (vty
, ", refcnt %ld", rib
->refcnt
);
549 if (CHECK_FLAG (rib
->flags
, ZEBRA_FLAG_BLACKHOLE
))
550 vty_out (vty
, ", blackhole");
551 if (CHECK_FLAG (rib
->flags
, ZEBRA_FLAG_REJECT
))
552 vty_out (vty
, ", reject");
553 vty_out (vty
, "%s", VTY_NEWLINE
);
555 #define ONE_DAY_SECOND 60*60*24
556 #define ONE_WEEK_SECOND 60*60*24*7
557 if (rib
->type
== ZEBRA_ROUTE_RIP
558 || rib
->type
== ZEBRA_ROUTE_OSPF
559 || rib
->type
== ZEBRA_ROUTE_ISIS
560 || rib
->type
== ZEBRA_ROUTE_BGP
)
565 uptime
= time (NULL
);
566 uptime
-= rib
->uptime
;
567 tm
= gmtime (&uptime
);
569 vty_out (vty
, " Last update ");
571 if (uptime
< ONE_DAY_SECOND
)
572 vty_out (vty
, "%02d:%02d:%02d",
573 tm
->tm_hour
, tm
->tm_min
, tm
->tm_sec
);
574 else if (uptime
< ONE_WEEK_SECOND
)
575 vty_out (vty
, "%dd%02dh%02dm",
576 tm
->tm_yday
, tm
->tm_hour
, tm
->tm_min
);
578 vty_out (vty
, "%02dw%dd%02dh",
580 tm
->tm_yday
- ((tm
->tm_yday
/7) * 7), tm
->tm_hour
);
581 vty_out (vty
, " ago%s", VTY_NEWLINE
);
584 for (nexthop
= rib
->nexthop
; nexthop
; nexthop
= nexthop
->next
)
589 CHECK_FLAG (nexthop
->flags
, NEXTHOP_FLAG_FIB
) ? '*' : ' ');
591 switch (nexthop
->type
)
593 case NEXTHOP_TYPE_IPV4
:
594 case NEXTHOP_TYPE_IPV4_IFINDEX
:
595 vty_out (vty
, " %s", inet_ntoa (nexthop
->gate
.ipv4
));
596 if (nexthop
->ifindex
)
597 vty_out (vty
, ", via %s", ifindex2ifname (nexthop
->ifindex
));
599 case NEXTHOP_TYPE_IFINDEX
:
600 vty_out (vty
, " directly connected, %s",
601 ifindex2ifname (nexthop
->ifindex
));
603 case NEXTHOP_TYPE_IFNAME
:
604 vty_out (vty
, " directly connected, %s", nexthop
->ifname
);
606 case NEXTHOP_TYPE_BLACKHOLE
:
607 vty_out (vty
, " directly connected, Null0");
612 if (! CHECK_FLAG (nexthop
->flags
, NEXTHOP_FLAG_ACTIVE
))
613 vty_out (vty
, " inactive");
615 if (CHECK_FLAG (nexthop
->flags
, NEXTHOP_FLAG_RECURSIVE
))
617 vty_out (vty
, " (recursive");
619 switch (nexthop
->rtype
)
621 case NEXTHOP_TYPE_IPV4
:
622 case NEXTHOP_TYPE_IPV4_IFINDEX
:
623 vty_out (vty
, " via %s)", inet_ntoa (nexthop
->rgate
.ipv4
));
625 case NEXTHOP_TYPE_IFINDEX
:
626 case NEXTHOP_TYPE_IFNAME
:
627 vty_out (vty
, " is directly connected, %s)",
628 ifindex2ifname (nexthop
->rifindex
));
634 switch (nexthop
->type
)
636 case NEXTHOP_TYPE_IPV4
:
637 case NEXTHOP_TYPE_IPV4_IFINDEX
:
638 case NEXTHOP_TYPE_IPV4_IFNAME
:
639 if (nexthop
->src
.ipv4
.s_addr
)
641 if (inet_ntop(AF_INET
, &nexthop
->src
.ipv4
, addrstr
,
643 vty_out (vty
, ", src %s", addrstr
);
647 case NEXTHOP_TYPE_IPV6
:
648 case NEXTHOP_TYPE_IPV6_IFINDEX
:
649 case NEXTHOP_TYPE_IPV6_IFNAME
:
650 if (!IPV6_ADDR_SAME(&nexthop
->src
.ipv6
, &in6addr_any
))
652 if (inet_ntop(AF_INET6
, &nexthop
->src
.ipv6
, addrstr
,
654 vty_out (vty
, ", src %s", addrstr
);
657 #endif /* HAVE_IPV6 */
661 vty_out (vty
, "%s", VTY_NEWLINE
);
663 vty_out (vty
, "%s", VTY_NEWLINE
);
668 vty_show_ip_route (struct vty
*vty
, struct route_node
*rn
, struct rib
*rib
)
670 struct nexthop
*nexthop
;
674 /* Nexthop information. */
675 for (nexthop
= rib
->nexthop
; nexthop
; nexthop
= nexthop
->next
)
677 if (nexthop
== rib
->nexthop
)
679 /* Prefix information. */
680 len
= vty_out (vty
, "%c%c%c %s/%d",
681 zebra_route_char (rib
->type
),
682 CHECK_FLAG (rib
->flags
, ZEBRA_FLAG_SELECTED
)
684 CHECK_FLAG (nexthop
->flags
, NEXTHOP_FLAG_FIB
)
686 inet_ntop (AF_INET
, &rn
->p
.u
.prefix
, buf
, BUFSIZ
),
689 /* Distance and metric display. */
690 if (rib
->type
!= ZEBRA_ROUTE_CONNECT
691 && rib
->type
!= ZEBRA_ROUTE_KERNEL
)
692 len
+= vty_out (vty
, " [%d/%d]", rib
->distance
,
696 vty_out (vty
, " %c%*c",
697 CHECK_FLAG (nexthop
->flags
, NEXTHOP_FLAG_FIB
)
701 switch (nexthop
->type
)
703 case NEXTHOP_TYPE_IPV4
:
704 case NEXTHOP_TYPE_IPV4_IFINDEX
:
705 vty_out (vty
, " via %s", inet_ntoa (nexthop
->gate
.ipv4
));
706 if (nexthop
->ifindex
)
707 vty_out (vty
, ", %s", ifindex2ifname (nexthop
->ifindex
));
709 case NEXTHOP_TYPE_IFINDEX
:
710 vty_out (vty
, " is directly connected, %s",
711 ifindex2ifname (nexthop
->ifindex
));
713 case NEXTHOP_TYPE_IFNAME
:
714 vty_out (vty
, " is directly connected, %s", nexthop
->ifname
);
716 case NEXTHOP_TYPE_BLACKHOLE
:
717 vty_out (vty
, " is directly connected, Null0");
722 if (! CHECK_FLAG (nexthop
->flags
, NEXTHOP_FLAG_ACTIVE
))
723 vty_out (vty
, " inactive");
725 if (CHECK_FLAG (nexthop
->flags
, NEXTHOP_FLAG_RECURSIVE
))
727 vty_out (vty
, " (recursive");
729 switch (nexthop
->rtype
)
731 case NEXTHOP_TYPE_IPV4
:
732 case NEXTHOP_TYPE_IPV4_IFINDEX
:
733 vty_out (vty
, " via %s)", inet_ntoa (nexthop
->rgate
.ipv4
));
735 case NEXTHOP_TYPE_IFINDEX
:
736 case NEXTHOP_TYPE_IFNAME
:
737 vty_out (vty
, " is directly connected, %s)",
738 ifindex2ifname (nexthop
->rifindex
));
744 switch (nexthop
->type
)
746 case NEXTHOP_TYPE_IPV4
:
747 case NEXTHOP_TYPE_IPV4_IFINDEX
:
748 case NEXTHOP_TYPE_IPV4_IFNAME
:
749 if (nexthop
->src
.ipv4
.s_addr
)
751 if (inet_ntop(AF_INET
, &nexthop
->src
.ipv4
, buf
, sizeof buf
))
752 vty_out (vty
, ", src %s", buf
);
756 case NEXTHOP_TYPE_IPV6
:
757 case NEXTHOP_TYPE_IPV6_IFINDEX
:
758 case NEXTHOP_TYPE_IPV6_IFNAME
:
759 if (!IPV6_ADDR_SAME(&nexthop
->src
.ipv6
, &in6addr_any
))
761 if (inet_ntop(AF_INET6
, &nexthop
->src
.ipv6
, buf
, sizeof buf
))
762 vty_out (vty
, ", src %s", buf
);
765 #endif /* HAVE_IPV6 */
770 if (CHECK_FLAG (rib
->flags
, ZEBRA_FLAG_BLACKHOLE
))
771 vty_out (vty
, ", bh");
772 if (CHECK_FLAG (rib
->flags
, ZEBRA_FLAG_REJECT
))
773 vty_out (vty
, ", rej");
775 if (rib
->type
== ZEBRA_ROUTE_RIP
776 || rib
->type
== ZEBRA_ROUTE_OSPF
777 || rib
->type
== ZEBRA_ROUTE_ISIS
778 || rib
->type
== ZEBRA_ROUTE_BGP
)
783 uptime
= time (NULL
);
784 uptime
-= rib
->uptime
;
785 tm
= gmtime (&uptime
);
787 #define ONE_DAY_SECOND 60*60*24
788 #define ONE_WEEK_SECOND 60*60*24*7
790 if (uptime
< ONE_DAY_SECOND
)
791 vty_out (vty
, ", %02d:%02d:%02d",
792 tm
->tm_hour
, tm
->tm_min
, tm
->tm_sec
);
793 else if (uptime
< ONE_WEEK_SECOND
)
794 vty_out (vty
, ", %dd%02dh%02dm",
795 tm
->tm_yday
, tm
->tm_hour
, tm
->tm_min
);
797 vty_out (vty
, ", %02dw%dd%02dh",
799 tm
->tm_yday
- ((tm
->tm_yday
/7) * 7), tm
->tm_hour
);
801 vty_out (vty
, "%s", VTY_NEWLINE
);
805 #define SHOW_ROUTE_V4_HEADER "Codes: K - kernel route, C - connected, " \
806 "S - static, R - RIP, O - OSPF,%s I - ISIS, B - BGP, " \
807 "> - selected route, * - FIB route%s%s"
809 DEFUN (show_ip_route
,
814 "IP routing table\n")
816 struct route_table
*table
;
817 struct route_node
*rn
;
821 table
= vrf_table (AFI_IP
, SAFI_UNICAST
, 0);
825 /* Show all IPv4 routes. */
826 for (rn
= route_top (table
); rn
; rn
= route_next (rn
))
827 for (rib
= rn
->info
; rib
; rib
= rib
->next
)
831 vty_out (vty
, SHOW_ROUTE_V4_HEADER
, VTY_NEWLINE
, VTY_NEWLINE
,
835 vty_show_ip_route (vty
, rn
, rib
);
840 DEFUN (show_ip_route_prefix_longer
,
841 show_ip_route_prefix_longer_cmd
,
842 "show ip route A.B.C.D/M longer-prefixes",
846 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
847 "Show route matching the specified Network/Mask pair only\n")
849 struct route_table
*table
;
850 struct route_node
*rn
;
856 ret
= str2prefix (argv
[0], &p
);
859 vty_out (vty
, "%% Malformed Prefix%s", VTY_NEWLINE
);
863 table
= vrf_table (AFI_IP
, SAFI_UNICAST
, 0);
867 /* Show matched type IPv4 routes. */
868 for (rn
= route_top (table
); rn
; rn
= route_next (rn
))
869 for (rib
= rn
->info
; rib
; rib
= rib
->next
)
870 if (prefix_match (&p
, &rn
->p
))
874 vty_out (vty
, SHOW_ROUTE_V4_HEADER
, VTY_NEWLINE
,
875 VTY_NEWLINE
, VTY_NEWLINE
);
878 vty_show_ip_route (vty
, rn
, rib
);
883 DEFUN (show_ip_route_supernets
,
884 show_ip_route_supernets_cmd
,
885 "show ip route supernets-only",
889 "Show supernet entries only\n")
891 struct route_table
*table
;
892 struct route_node
*rn
;
897 table
= vrf_table (AFI_IP
, SAFI_UNICAST
, 0);
901 /* Show matched type IPv4 routes. */
902 for (rn
= route_top (table
); rn
; rn
= route_next (rn
))
903 for (rib
= rn
->info
; rib
; rib
= rib
->next
)
905 addr
= ntohl (rn
->p
.u
.prefix4
.s_addr
);
907 if ((IN_CLASSC (addr
) && rn
->p
.prefixlen
< 24)
908 || (IN_CLASSB (addr
) && rn
->p
.prefixlen
< 16)
909 || (IN_CLASSA (addr
) && rn
->p
.prefixlen
< 8))
913 vty_out (vty
, SHOW_ROUTE_V4_HEADER
, VTY_NEWLINE
,
914 VTY_NEWLINE
, VTY_NEWLINE
);
917 vty_show_ip_route (vty
, rn
, rib
);
923 DEFUN (show_ip_route_protocol
,
924 show_ip_route_protocol_cmd
,
925 "show ip route (bgp|connected|isis|kernel|ospf|rip|static)",
929 "Border Gateway Protocol (BGP)\n"
933 "Open Shortest Path First (OSPF)\n"
934 "Routing Information Protocol (RIP)\n"
938 struct route_table
*table
;
939 struct route_node
*rn
;
943 if (strncmp (argv
[0], "b", 1) == 0)
944 type
= ZEBRA_ROUTE_BGP
;
945 else if (strncmp (argv
[0], "c", 1) == 0)
946 type
= ZEBRA_ROUTE_CONNECT
;
947 else if (strncmp (argv
[0], "k", 1) ==0)
948 type
= ZEBRA_ROUTE_KERNEL
;
949 else if (strncmp (argv
[0], "o", 1) == 0)
950 type
= ZEBRA_ROUTE_OSPF
;
951 else if (strncmp (argv
[0], "i", 1) == 0)
952 type
= ZEBRA_ROUTE_ISIS
;
953 else if (strncmp (argv
[0], "r", 1) == 0)
954 type
= ZEBRA_ROUTE_RIP
;
955 else if (strncmp (argv
[0], "s", 1) == 0)
956 type
= ZEBRA_ROUTE_STATIC
;
959 vty_out (vty
, "Unknown route type%s", VTY_NEWLINE
);
963 table
= vrf_table (AFI_IP
, SAFI_UNICAST
, 0);
967 /* Show matched type IPv4 routes. */
968 for (rn
= route_top (table
); rn
; rn
= route_next (rn
))
969 for (rib
= rn
->info
; rib
; rib
= rib
->next
)
970 if (rib
->type
== type
)
974 vty_out (vty
, SHOW_ROUTE_V4_HEADER
,
975 VTY_NEWLINE
, VTY_NEWLINE
, VTY_NEWLINE
);
978 vty_show_ip_route (vty
, rn
, rib
);
983 DEFUN (show_ip_route_addr
,
984 show_ip_route_addr_cmd
,
985 "show ip route A.B.C.D",
989 "Network in the IP routing table to display\n")
992 struct prefix_ipv4 p
;
993 struct route_table
*table
;
994 struct route_node
*rn
;
996 ret
= str2prefix_ipv4 (argv
[0], &p
);
999 vty_out (vty
, "%% Malformed IPv4 address%s", VTY_NEWLINE
);
1003 table
= vrf_table (AFI_IP
, SAFI_UNICAST
, 0);
1007 rn
= route_node_match (table
, (struct prefix
*) &p
);
1010 vty_out (vty
, "%% Network not in table%s", VTY_NEWLINE
);
1014 vty_show_ip_route_detail (vty
, rn
);
1016 route_unlock_node (rn
);
1021 DEFUN (show_ip_route_prefix
,
1022 show_ip_route_prefix_cmd
,
1023 "show ip route A.B.C.D/M",
1026 "IP routing table\n"
1027 "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
1030 struct prefix_ipv4 p
;
1031 struct route_table
*table
;
1032 struct route_node
*rn
;
1034 ret
= str2prefix_ipv4 (argv
[0], &p
);
1037 vty_out (vty
, "%% Malformed IPv4 address%s", VTY_NEWLINE
);
1041 table
= vrf_table (AFI_IP
, SAFI_UNICAST
, 0);
1045 rn
= route_node_match (table
, (struct prefix
*) &p
);
1046 if (! rn
|| rn
->p
.prefixlen
!= p
.prefixlen
)
1048 vty_out (vty
, "%% Network not in table%s", VTY_NEWLINE
);
1052 vty_show_ip_route_detail (vty
, rn
);
1054 route_unlock_node (rn
);
1060 vty_show_ip_route_summary (struct vty
*vty
, struct route_table
*table
)
1062 struct route_node
*rn
;
1064 struct nexthop
*nexthop
;
1065 #define ZEBRA_ROUTE_IBGP ZEBRA_ROUTE_MAX
1066 #define ZEBRA_ROUTE_TOTAL (ZEBRA_ROUTE_IBGP + 1)
1067 u_int32_t rib_cnt
[ZEBRA_ROUTE_TOTAL
+ 1];
1068 u_int32_t fib_cnt
[ZEBRA_ROUTE_TOTAL
+ 1];
1071 memset (&rib_cnt
, 0, sizeof(rib_cnt
));
1072 memset (&fib_cnt
, 0, sizeof(fib_cnt
));
1073 for (rn
= route_top (table
); rn
; rn
= route_next (rn
))
1074 for (rib
= rn
->info
; rib
; rib
= rib
->next
)
1075 for (nexthop
= rib
->nexthop
; nexthop
; nexthop
= nexthop
->next
)
1077 rib_cnt
[ZEBRA_ROUTE_TOTAL
]++;
1078 rib_cnt
[rib
->type
]++;
1079 if (CHECK_FLAG (nexthop
->flags
, NEXTHOP_FLAG_FIB
))
1081 fib_cnt
[ZEBRA_ROUTE_TOTAL
]++;
1082 fib_cnt
[rib
->type
]++;
1084 if (rib
->type
== ZEBRA_ROUTE_BGP
&&
1085 CHECK_FLAG (rib
->flags
, ZEBRA_FLAG_IBGP
))
1087 rib_cnt
[ZEBRA_ROUTE_IBGP
]++;
1088 if (CHECK_FLAG (nexthop
->flags
, NEXTHOP_FLAG_FIB
))
1089 fib_cnt
[ZEBRA_ROUTE_IBGP
]++;
1093 vty_out (vty
, "%-20s %-20s %-20s %s",
1094 "Route Source", "Routes", "FIB", VTY_NEWLINE
);
1096 for (i
= 0; i
< ZEBRA_ROUTE_MAX
; i
++)
1100 if (i
== ZEBRA_ROUTE_BGP
)
1102 vty_out (vty
, "%-20s %-20d %-20d %s", "ebgp",
1103 rib_cnt
[ZEBRA_ROUTE_BGP
] - rib_cnt
[ZEBRA_ROUTE_IBGP
],
1104 fib_cnt
[ZEBRA_ROUTE_BGP
] - fib_cnt
[ZEBRA_ROUTE_IBGP
],
1106 vty_out (vty
, "%-20s %-20d %-20d %s", "ibgp",
1107 rib_cnt
[ZEBRA_ROUTE_IBGP
], fib_cnt
[ZEBRA_ROUTE_IBGP
],
1111 vty_out (vty
, "%-20s %-20d %-20d %s", zebra_route_string(i
),
1112 rib_cnt
[i
], fib_cnt
[i
], VTY_NEWLINE
);
1116 vty_out (vty
, "------%s", VTY_NEWLINE
);
1117 vty_out (vty
, "%-20s %-20d %-20d %s", "Totals", rib_cnt
[ZEBRA_ROUTE_TOTAL
],
1118 fib_cnt
[ZEBRA_ROUTE_TOTAL
], VTY_NEWLINE
);
1121 /* Show route summary. */
1122 DEFUN (show_ip_route_summary
,
1123 show_ip_route_summary_cmd
,
1124 "show ip route summary",
1127 "IP routing table\n"
1128 "Summary of all routes\n")
1130 struct route_table
*table
;
1132 table
= vrf_table (AFI_IP
, SAFI_UNICAST
, 0);
1136 vty_show_ip_route_summary (vty
, table
);
1141 /* Write IPv4 static route configuration. */
1143 static_config_ipv4 (struct vty
*vty
)
1145 struct route_node
*rn
;
1146 struct static_ipv4
*si
;
1147 struct route_table
*stable
;
1153 stable
= vrf_static_table (AFI_IP
, SAFI_UNICAST
, 0);
1157 for (rn
= route_top (stable
); rn
; rn
= route_next (rn
))
1158 for (si
= rn
->info
; si
; si
= si
->next
)
1160 vty_out (vty
, "ip route %s/%d", inet_ntoa (rn
->p
.u
.prefix4
),
1165 case STATIC_IPV4_GATEWAY
:
1166 vty_out (vty
, " %s", inet_ntoa (si
->gate
.ipv4
));
1168 case STATIC_IPV4_IFNAME
:
1169 vty_out (vty
, " %s", si
->gate
.ifname
);
1171 case STATIC_IPV4_BLACKHOLE
:
1172 vty_out (vty
, " Null0");
1176 /* flags are incompatible with STATIC_IPV4_BLACKHOLE */
1177 if (si
->type
!= STATIC_IPV4_BLACKHOLE
)
1179 if (CHECK_FLAG(si
->flags
, ZEBRA_FLAG_REJECT
))
1180 vty_out (vty
, " %s", "reject");
1182 if (CHECK_FLAG(si
->flags
, ZEBRA_FLAG_BLACKHOLE
))
1183 vty_out (vty
, " %s", "blackhole");
1186 if (si
->distance
!= ZEBRA_STATIC_DISTANCE_DEFAULT
)
1187 vty_out (vty
, " %d", si
->distance
);
1189 vty_out (vty
, "%s", VTY_NEWLINE
);
1196 DEFUN (show_ip_protocol
,
1197 show_ip_protocol_cmd
,
1201 "IP protocol filtering status\n")
1205 vty_out(vty
, "Protocol : route-map %s", VTY_NEWLINE
);
1206 vty_out(vty
, "------------------------%s", VTY_NEWLINE
);
1207 for (i
=0;i
<ZEBRA_ROUTE_MAX
;i
++)
1209 if (proto_rm
[AFI_IP
][i
])
1210 vty_out (vty
, "%-10s : %-10s%s", zebra_route_string(i
),
1211 proto_rm
[AFI_IP
][i
],
1214 vty_out (vty
, "%-10s : none%s", zebra_route_string(i
), VTY_NEWLINE
);
1216 if (proto_rm
[AFI_IP
][i
])
1217 vty_out (vty
, "%-10s : %-10s%s", "any", proto_rm
[AFI_IP
][i
],
1220 vty_out (vty
, "%-10s : none%s", "any", VTY_NEWLINE
);
1227 /* General fucntion for IPv6 static route. */
1229 static_ipv6_func (struct vty
*vty
, int add_cmd
, const char *dest_str
,
1230 const char *gate_str
, const char *ifname
,
1231 const char *flag_str
, const char *distance_str
)
1236 struct in6_addr
*gate
= NULL
;
1237 struct in6_addr gate_addr
;
1242 ret
= str2prefix (dest_str
, &p
);
1245 vty_out (vty
, "%% Malformed address%s", VTY_NEWLINE
);
1249 /* Apply mask for given prefix. */
1254 switch(flag_str
[0]) {
1257 SET_FLAG (flag
, ZEBRA_FLAG_REJECT
);
1261 SET_FLAG (flag
, ZEBRA_FLAG_BLACKHOLE
);
1264 vty_out (vty
, "%% Malformed flag %s %s", flag_str
, VTY_NEWLINE
);
1269 /* Administrative distance. */
1271 distance
= atoi (distance_str
);
1273 distance
= ZEBRA_STATIC_DISTANCE_DEFAULT
;
1275 /* When gateway is valid IPv6 addrees, then gate is treated as
1276 nexthop address other case gate is treated as interface name. */
1277 ret
= inet_pton (AF_INET6
, gate_str
, &gate_addr
);
1281 /* When ifname is specified. It must be come with gateway
1285 vty_out (vty
, "%% Malformed address%s", VTY_NEWLINE
);
1288 type
= STATIC_IPV6_GATEWAY_IFNAME
;
1295 type
= STATIC_IPV6_GATEWAY
;
1300 type
= STATIC_IPV6_IFNAME
;
1306 static_add_ipv6 (&p
, type
, gate
, ifname
, flag
, distance
, table
);
1308 static_delete_ipv6 (&p
, type
, gate
, ifname
, distance
, table
);
1315 "ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE)",
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")
1322 return static_ipv6_func (vty
, 1, argv
[0], argv
[1], NULL
, NULL
, NULL
);
1325 DEFUN (ipv6_route_flags
,
1326 ipv6_route_flags_cmd
,
1327 "ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) (reject|blackhole)",
1329 "Establish static routes\n"
1330 "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
1331 "IPv6 gateway address\n"
1332 "IPv6 gateway interface name\n"
1333 "Emit an ICMP unreachable when matched\n"
1334 "Silently discard pkts when matched\n")
1336 return static_ipv6_func (vty
, 1, argv
[0], argv
[1], NULL
, argv
[2], NULL
);
1339 DEFUN (ipv6_route_ifname
,
1340 ipv6_route_ifname_cmd
,
1341 "ipv6 route X:X::X:X/M X:X::X:X INTERFACE",
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")
1348 return static_ipv6_func (vty
, 1, argv
[0], argv
[1], argv
[2], NULL
, NULL
);
1351 DEFUN (ipv6_route_ifname_flags
,
1352 ipv6_route_ifname_flags_cmd
,
1353 "ipv6 route X:X::X:X/M X:X::X:X INTERFACE (reject|blackhole)",
1355 "Establish static routes\n"
1356 "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
1357 "IPv6 gateway address\n"
1358 "IPv6 gateway interface name\n"
1359 "Emit an ICMP unreachable when matched\n"
1360 "Silently discard pkts when matched\n")
1362 return static_ipv6_func (vty
, 1, argv
[0], argv
[1], argv
[2], argv
[3], NULL
);
1365 DEFUN (ipv6_route_pref
,
1366 ipv6_route_pref_cmd
,
1367 "ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) <1-255>",
1369 "Establish static routes\n"
1370 "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
1371 "IPv6 gateway address\n"
1372 "IPv6 gateway interface name\n"
1373 "Distance value for this prefix\n")
1375 return static_ipv6_func (vty
, 1, argv
[0], argv
[1], NULL
, NULL
, argv
[2]);
1378 DEFUN (ipv6_route_flags_pref
,
1379 ipv6_route_flags_pref_cmd
,
1380 "ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) (reject|blackhole) <1-255>",
1382 "Establish static routes\n"
1383 "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
1384 "IPv6 gateway address\n"
1385 "IPv6 gateway interface name\n"
1386 "Emit an ICMP unreachable when matched\n"
1387 "Silently discard pkts when matched\n"
1388 "Distance value for this prefix\n")
1390 return static_ipv6_func (vty
, 1, argv
[0], argv
[1], NULL
, argv
[2], argv
[3]);
1393 DEFUN (ipv6_route_ifname_pref
,
1394 ipv6_route_ifname_pref_cmd
,
1395 "ipv6 route X:X::X:X/M X:X::X:X INTERFACE <1-255>",
1397 "Establish static routes\n"
1398 "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
1399 "IPv6 gateway address\n"
1400 "IPv6 gateway interface name\n"
1401 "Distance value for this prefix\n")
1403 return static_ipv6_func (vty
, 1, argv
[0], argv
[1], argv
[2], NULL
, argv
[3]);
1406 DEFUN (ipv6_route_ifname_flags_pref
,
1407 ipv6_route_ifname_flags_pref_cmd
,
1408 "ipv6 route X:X::X:X/M X:X::X:X INTERFACE (reject|blackhole) <1-255>",
1410 "Establish static routes\n"
1411 "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
1412 "IPv6 gateway address\n"
1413 "IPv6 gateway interface name\n"
1414 "Emit an ICMP unreachable when matched\n"
1415 "Silently discard pkts when matched\n"
1416 "Distance value for this prefix\n")
1418 return static_ipv6_func (vty
, 1, argv
[0], argv
[1], argv
[2], argv
[3], argv
[4]);
1421 DEFUN (no_ipv6_route
,
1423 "no ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE)",
1426 "Establish static routes\n"
1427 "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
1428 "IPv6 gateway address\n"
1429 "IPv6 gateway interface name\n")
1431 return static_ipv6_func (vty
, 0, argv
[0], argv
[1], NULL
, NULL
, NULL
);
1434 ALIAS (no_ipv6_route
,
1435 no_ipv6_route_flags_cmd
,
1436 "no ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) (reject|blackhole)",
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 "Emit an ICMP unreachable when matched\n"
1444 "Silently discard pkts when matched\n")
1446 DEFUN (no_ipv6_route_ifname
,
1447 no_ipv6_route_ifname_cmd
,
1448 "no ipv6 route X:X::X:X/M X:X::X:X INTERFACE",
1451 "Establish static routes\n"
1452 "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
1453 "IPv6 gateway address\n"
1454 "IPv6 gateway interface name\n")
1456 return static_ipv6_func (vty
, 0, argv
[0], argv
[1], argv
[2], NULL
, NULL
);
1459 ALIAS (no_ipv6_route_ifname
,
1460 no_ipv6_route_ifname_flags_cmd
,
1461 "no ipv6 route X:X::X:X/M X:X::X:X INTERFACE (reject|blackhole)",
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 "Emit an ICMP unreachable when matched\n"
1469 "Silently discard pkts when matched\n")
1471 DEFUN (no_ipv6_route_pref
,
1472 no_ipv6_route_pref_cmd
,
1473 "no ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) <1-255>",
1476 "Establish static routes\n"
1477 "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
1478 "IPv6 gateway address\n"
1479 "IPv6 gateway interface name\n"
1480 "Distance value for this prefix\n")
1482 return static_ipv6_func (vty
, 0, argv
[0], argv
[1], NULL
, NULL
, argv
[2]);
1485 DEFUN (no_ipv6_route_flags_pref
,
1486 no_ipv6_route_flags_pref_cmd
,
1487 "no ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) (reject|blackhole) <1-255>",
1490 "Establish static routes\n"
1491 "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
1492 "IPv6 gateway address\n"
1493 "IPv6 gateway interface name\n"
1494 "Emit an ICMP unreachable when matched\n"
1495 "Silently discard pkts when matched\n"
1496 "Distance value for this prefix\n")
1498 /* We do not care about argv[2] */
1499 return static_ipv6_func (vty
, 0, argv
[0], argv
[1], NULL
, argv
[2], argv
[3]);
1502 DEFUN (no_ipv6_route_ifname_pref
,
1503 no_ipv6_route_ifname_pref_cmd
,
1504 "no ipv6 route X:X::X:X/M X:X::X:X INTERFACE <1-255>",
1507 "Establish static routes\n"
1508 "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
1509 "IPv6 gateway address\n"
1510 "IPv6 gateway interface name\n"
1511 "Distance value for this prefix\n")
1513 return static_ipv6_func (vty
, 0, argv
[0], argv
[1], argv
[2], NULL
, argv
[3]);
1516 DEFUN (no_ipv6_route_ifname_flags_pref
,
1517 no_ipv6_route_ifname_flags_pref_cmd
,
1518 "no ipv6 route X:X::X:X/M X:X::X:X INTERFACE (reject|blackhole) <1-255>",
1521 "Establish static routes\n"
1522 "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
1523 "IPv6 gateway address\n"
1524 "IPv6 gateway interface name\n"
1525 "Emit an ICMP unreachable when matched\n"
1526 "Silently discard pkts when matched\n"
1527 "Distance value for this prefix\n")
1529 return static_ipv6_func (vty
, 0, argv
[0], argv
[1], argv
[2], argv
[3], argv
[4]);
1532 /* New RIB. Detailed information for IPv6 route. */
1534 vty_show_ipv6_route_detail (struct vty
*vty
, struct route_node
*rn
)
1537 struct nexthop
*nexthop
;
1540 for (rib
= rn
->info
; rib
; rib
= rib
->next
)
1542 vty_out (vty
, "Routing entry for %s/%d%s",
1543 inet_ntop (AF_INET6
, &rn
->p
.u
.prefix6
, buf
, BUFSIZ
),
1546 vty_out (vty
, " Known via \"%s\"", zebra_route_string (rib
->type
));
1547 vty_out (vty
, ", distance %d, metric %d", rib
->distance
, rib
->metric
);
1548 if (CHECK_FLAG (rib
->flags
, ZEBRA_FLAG_SELECTED
))
1549 vty_out (vty
, ", best");
1551 vty_out (vty
, ", refcnt %ld", rib
->refcnt
);
1552 if (CHECK_FLAG (rib
->flags
, ZEBRA_FLAG_BLACKHOLE
))
1553 vty_out (vty
, ", blackhole");
1554 if (CHECK_FLAG (rib
->flags
, ZEBRA_FLAG_REJECT
))
1555 vty_out (vty
, ", reject");
1556 vty_out (vty
, "%s", VTY_NEWLINE
);
1558 #define ONE_DAY_SECOND 60*60*24
1559 #define ONE_WEEK_SECOND 60*60*24*7
1560 if (rib
->type
== ZEBRA_ROUTE_RIPNG
1561 || rib
->type
== ZEBRA_ROUTE_OSPF6
1562 || rib
->type
== ZEBRA_ROUTE_ISIS
1563 || rib
->type
== ZEBRA_ROUTE_BGP
)
1568 uptime
= time (NULL
);
1569 uptime
-= rib
->uptime
;
1570 tm
= gmtime (&uptime
);
1572 vty_out (vty
, " Last update ");
1574 if (uptime
< ONE_DAY_SECOND
)
1575 vty_out (vty
, "%02d:%02d:%02d",
1576 tm
->tm_hour
, tm
->tm_min
, tm
->tm_sec
);
1577 else if (uptime
< ONE_WEEK_SECOND
)
1578 vty_out (vty
, "%dd%02dh%02dm",
1579 tm
->tm_yday
, tm
->tm_hour
, tm
->tm_min
);
1581 vty_out (vty
, "%02dw%dd%02dh",
1583 tm
->tm_yday
- ((tm
->tm_yday
/7) * 7), tm
->tm_hour
);
1584 vty_out (vty
, " ago%s", VTY_NEWLINE
);
1587 for (nexthop
= rib
->nexthop
; nexthop
; nexthop
= nexthop
->next
)
1589 vty_out (vty
, " %c",
1590 CHECK_FLAG (nexthop
->flags
, NEXTHOP_FLAG_FIB
) ? '*' : ' ');
1592 switch (nexthop
->type
)
1594 case NEXTHOP_TYPE_IPV6
:
1595 case NEXTHOP_TYPE_IPV6_IFINDEX
:
1596 case NEXTHOP_TYPE_IPV6_IFNAME
:
1597 vty_out (vty
, " %s",
1598 inet_ntop (AF_INET6
, &nexthop
->gate
.ipv6
, buf
, BUFSIZ
));
1599 if (nexthop
->type
== NEXTHOP_TYPE_IPV6_IFNAME
)
1600 vty_out (vty
, ", %s", nexthop
->ifname
);
1601 else if (nexthop
->ifindex
)
1602 vty_out (vty
, ", via %s", ifindex2ifname (nexthop
->ifindex
));
1604 case NEXTHOP_TYPE_IFINDEX
:
1605 vty_out (vty
, " directly connected, %s",
1606 ifindex2ifname (nexthop
->ifindex
));
1608 case NEXTHOP_TYPE_IFNAME
:
1609 vty_out (vty
, " directly connected, %s",
1615 if (! CHECK_FLAG (nexthop
->flags
, NEXTHOP_FLAG_ACTIVE
))
1616 vty_out (vty
, " inactive");
1618 if (CHECK_FLAG (nexthop
->flags
, NEXTHOP_FLAG_RECURSIVE
))
1620 vty_out (vty
, " (recursive");
1622 switch (nexthop
->rtype
)
1624 case NEXTHOP_TYPE_IPV6
:
1625 case NEXTHOP_TYPE_IPV6_IFINDEX
:
1626 case NEXTHOP_TYPE_IPV6_IFNAME
:
1627 vty_out (vty
, " via %s)",
1628 inet_ntop (AF_INET6
, &nexthop
->rgate
.ipv6
,
1630 if (nexthop
->rifindex
)
1631 vty_out (vty
, ", %s", ifindex2ifname (nexthop
->rifindex
));
1633 case NEXTHOP_TYPE_IFINDEX
:
1634 case NEXTHOP_TYPE_IFNAME
:
1635 vty_out (vty
, " is directly connected, %s)",
1636 ifindex2ifname (nexthop
->rifindex
));
1642 vty_out (vty
, "%s", VTY_NEWLINE
);
1644 vty_out (vty
, "%s", VTY_NEWLINE
);
1649 vty_show_ipv6_route (struct vty
*vty
, struct route_node
*rn
,
1652 struct nexthop
*nexthop
;
1656 /* Nexthop information. */
1657 for (nexthop
= rib
->nexthop
; nexthop
; nexthop
= nexthop
->next
)
1659 if (nexthop
== rib
->nexthop
)
1661 /* Prefix information. */
1662 len
= vty_out (vty
, "%c%c%c %s/%d",
1663 zebra_route_char (rib
->type
),
1664 CHECK_FLAG (rib
->flags
, ZEBRA_FLAG_SELECTED
)
1666 CHECK_FLAG (nexthop
->flags
, NEXTHOP_FLAG_FIB
)
1668 inet_ntop (AF_INET6
, &rn
->p
.u
.prefix6
, buf
, BUFSIZ
),
1671 /* Distance and metric display. */
1672 if (rib
->type
!= ZEBRA_ROUTE_CONNECT
1673 && rib
->type
!= ZEBRA_ROUTE_KERNEL
)
1674 len
+= vty_out (vty
, " [%d/%d]", rib
->distance
,
1678 vty_out (vty
, " %c%*c",
1679 CHECK_FLAG (nexthop
->flags
, NEXTHOP_FLAG_FIB
)
1683 switch (nexthop
->type
)
1685 case NEXTHOP_TYPE_IPV6
:
1686 case NEXTHOP_TYPE_IPV6_IFINDEX
:
1687 case NEXTHOP_TYPE_IPV6_IFNAME
:
1688 vty_out (vty
, " via %s",
1689 inet_ntop (AF_INET6
, &nexthop
->gate
.ipv6
, buf
, BUFSIZ
));
1690 if (nexthop
->type
== NEXTHOP_TYPE_IPV6_IFNAME
)
1691 vty_out (vty
, ", %s", nexthop
->ifname
);
1692 else if (nexthop
->ifindex
)
1693 vty_out (vty
, ", %s", ifindex2ifname (nexthop
->ifindex
));
1695 case NEXTHOP_TYPE_IFINDEX
:
1696 vty_out (vty
, " is directly connected, %s",
1697 ifindex2ifname (nexthop
->ifindex
));
1699 case NEXTHOP_TYPE_IFNAME
:
1700 vty_out (vty
, " is directly connected, %s",
1706 if (! CHECK_FLAG (nexthop
->flags
, NEXTHOP_FLAG_ACTIVE
))
1707 vty_out (vty
, " inactive");
1709 if (CHECK_FLAG (nexthop
->flags
, NEXTHOP_FLAG_RECURSIVE
))
1711 vty_out (vty
, " (recursive");
1713 switch (nexthop
->rtype
)
1715 case NEXTHOP_TYPE_IPV6
:
1716 case NEXTHOP_TYPE_IPV6_IFINDEX
:
1717 case NEXTHOP_TYPE_IPV6_IFNAME
:
1718 vty_out (vty
, " via %s)",
1719 inet_ntop (AF_INET6
, &nexthop
->rgate
.ipv6
,
1721 if (nexthop
->rifindex
)
1722 vty_out (vty
, ", %s", ifindex2ifname (nexthop
->rifindex
));
1724 case NEXTHOP_TYPE_IFINDEX
:
1725 case NEXTHOP_TYPE_IFNAME
:
1726 vty_out (vty
, " is directly connected, %s)",
1727 ifindex2ifname (nexthop
->rifindex
));
1734 if (CHECK_FLAG (rib
->flags
, ZEBRA_FLAG_BLACKHOLE
))
1735 vty_out (vty
, ", bh");
1736 if (CHECK_FLAG (rib
->flags
, ZEBRA_FLAG_REJECT
))
1737 vty_out (vty
, ", rej");
1739 if (rib
->type
== ZEBRA_ROUTE_RIPNG
1740 || rib
->type
== ZEBRA_ROUTE_OSPF6
1741 || rib
->type
== ZEBRA_ROUTE_ISIS
1742 || rib
->type
== ZEBRA_ROUTE_BGP
)
1747 uptime
= time (NULL
);
1748 uptime
-= rib
->uptime
;
1749 tm
= gmtime (&uptime
);
1751 #define ONE_DAY_SECOND 60*60*24
1752 #define ONE_WEEK_SECOND 60*60*24*7
1754 if (uptime
< ONE_DAY_SECOND
)
1755 vty_out (vty
, ", %02d:%02d:%02d",
1756 tm
->tm_hour
, tm
->tm_min
, tm
->tm_sec
);
1757 else if (uptime
< ONE_WEEK_SECOND
)
1758 vty_out (vty
, ", %dd%02dh%02dm",
1759 tm
->tm_yday
, tm
->tm_hour
, tm
->tm_min
);
1761 vty_out (vty
, ", %02dw%dd%02dh",
1763 tm
->tm_yday
- ((tm
->tm_yday
/7) * 7), tm
->tm_hour
);
1765 vty_out (vty
, "%s", VTY_NEWLINE
);
1769 #define SHOW_ROUTE_V6_HEADER "Codes: K - kernel route, C - connected, S - static, R - RIPng, O - OSPFv3,%s I - ISIS, B - BGP, * - FIB route.%s%s"
1771 DEFUN (show_ipv6_route
,
1772 show_ipv6_route_cmd
,
1776 "IPv6 routing table\n")
1778 struct route_table
*table
;
1779 struct route_node
*rn
;
1783 table
= vrf_table (AFI_IP6
, SAFI_UNICAST
, 0);
1787 /* Show all IPv6 route. */
1788 for (rn
= route_top (table
); rn
; rn
= route_next (rn
))
1789 for (rib
= rn
->info
; rib
; rib
= rib
->next
)
1793 vty_out (vty
, SHOW_ROUTE_V6_HEADER
, VTY_NEWLINE
, VTY_NEWLINE
, VTY_NEWLINE
);
1796 vty_show_ipv6_route (vty
, rn
, rib
);
1801 DEFUN (show_ipv6_route_prefix_longer
,
1802 show_ipv6_route_prefix_longer_cmd
,
1803 "show ipv6 route X:X::X:X/M longer-prefixes",
1806 "IPv6 routing table\n"
1808 "Show route matching the specified Network/Mask pair only\n")
1810 struct route_table
*table
;
1811 struct route_node
*rn
;
1817 table
= vrf_table (AFI_IP6
, SAFI_UNICAST
, 0);
1821 ret
= str2prefix (argv
[0], &p
);
1824 vty_out (vty
, "%% Malformed Prefix%s", VTY_NEWLINE
);
1828 /* Show matched type IPv6 routes. */
1829 for (rn
= route_top (table
); rn
; rn
= route_next (rn
))
1830 for (rib
= rn
->info
; rib
; rib
= rib
->next
)
1831 if (prefix_match (&p
, &rn
->p
))
1835 vty_out (vty
, SHOW_ROUTE_V6_HEADER
, VTY_NEWLINE
, VTY_NEWLINE
, VTY_NEWLINE
);
1838 vty_show_ipv6_route (vty
, rn
, rib
);
1843 DEFUN (show_ipv6_route_protocol
,
1844 show_ipv6_route_protocol_cmd
,
1845 "show ipv6 route (bgp|connected|isis|kernel|ospf6|ripng|static)",
1848 "IP routing table\n"
1849 "Border Gateway Protocol (BGP)\n"
1851 "ISO IS-IS (ISIS)\n"
1853 "Open Shortest Path First (OSPFv3)\n"
1854 "Routing Information Protocol (RIPng)\n"
1858 struct route_table
*table
;
1859 struct route_node
*rn
;
1863 if (strncmp (argv
[0], "b", 1) == 0)
1864 type
= ZEBRA_ROUTE_BGP
;
1865 else if (strncmp (argv
[0], "c", 1) == 0)
1866 type
= ZEBRA_ROUTE_CONNECT
;
1867 else if (strncmp (argv
[0], "k", 1) ==0)
1868 type
= ZEBRA_ROUTE_KERNEL
;
1869 else if (strncmp (argv
[0], "o", 1) == 0)
1870 type
= ZEBRA_ROUTE_OSPF6
;
1871 else if (strncmp (argv
[0], "i", 1) == 0)
1872 type
= ZEBRA_ROUTE_ISIS
;
1873 else if (strncmp (argv
[0], "r", 1) == 0)
1874 type
= ZEBRA_ROUTE_RIPNG
;
1875 else if (strncmp (argv
[0], "s", 1) == 0)
1876 type
= ZEBRA_ROUTE_STATIC
;
1879 vty_out (vty
, "Unknown route type%s", VTY_NEWLINE
);
1883 table
= vrf_table (AFI_IP6
, SAFI_UNICAST
, 0);
1887 /* Show matched type IPv6 routes. */
1888 for (rn
= route_top (table
); rn
; rn
= route_next (rn
))
1889 for (rib
= rn
->info
; rib
; rib
= rib
->next
)
1890 if (rib
->type
== type
)
1894 vty_out (vty
, SHOW_ROUTE_V6_HEADER
, VTY_NEWLINE
, VTY_NEWLINE
, VTY_NEWLINE
);
1897 vty_show_ipv6_route (vty
, rn
, rib
);
1902 DEFUN (show_ipv6_route_addr
,
1903 show_ipv6_route_addr_cmd
,
1904 "show ipv6 route X:X::X:X",
1907 "IPv6 routing table\n"
1911 struct prefix_ipv6 p
;
1912 struct route_table
*table
;
1913 struct route_node
*rn
;
1915 ret
= str2prefix_ipv6 (argv
[0], &p
);
1918 vty_out (vty
, "Malformed IPv6 address%s", VTY_NEWLINE
);
1922 table
= vrf_table (AFI_IP6
, SAFI_UNICAST
, 0);
1926 rn
= route_node_match (table
, (struct prefix
*) &p
);
1929 vty_out (vty
, "%% Network not in table%s", VTY_NEWLINE
);
1933 vty_show_ipv6_route_detail (vty
, rn
);
1935 route_unlock_node (rn
);
1940 DEFUN (show_ipv6_route_prefix
,
1941 show_ipv6_route_prefix_cmd
,
1942 "show ipv6 route X:X::X:X/M",
1945 "IPv6 routing table\n"
1949 struct prefix_ipv6 p
;
1950 struct route_table
*table
;
1951 struct route_node
*rn
;
1953 ret
= str2prefix_ipv6 (argv
[0], &p
);
1956 vty_out (vty
, "Malformed IPv6 prefix%s", VTY_NEWLINE
);
1960 table
= vrf_table (AFI_IP6
, SAFI_UNICAST
, 0);
1964 rn
= route_node_match (table
, (struct prefix
*) &p
);
1965 if (! rn
|| rn
->p
.prefixlen
!= p
.prefixlen
)
1967 vty_out (vty
, "%% Network not in table%s", VTY_NEWLINE
);
1971 vty_show_ipv6_route_detail (vty
, rn
);
1973 route_unlock_node (rn
);
1978 /* Show route summary. */
1979 DEFUN (show_ipv6_route_summary
,
1980 show_ipv6_route_summary_cmd
,
1981 "show ipv6 route summary",
1984 "IPv6 routing table\n"
1985 "Summary of all IPv6 routes\n")
1987 struct route_table
*table
;
1989 table
= vrf_table (AFI_IP6
, SAFI_UNICAST
, 0);
1993 vty_show_ip_route_summary (vty
, table
);
1998 /* Write IPv6 static route configuration. */
2000 static_config_ipv6 (struct vty
*vty
)
2002 struct route_node
*rn
;
2003 struct static_ipv6
*si
;
2006 struct route_table
*stable
;
2011 stable
= vrf_static_table (AFI_IP6
, SAFI_UNICAST
, 0);
2015 for (rn
= route_top (stable
); rn
; rn
= route_next (rn
))
2016 for (si
= rn
->info
; si
; si
= si
->next
)
2018 vty_out (vty
, "ipv6 route %s/%d",
2019 inet_ntop (AF_INET6
, &rn
->p
.u
.prefix6
, buf
, BUFSIZ
),
2024 case STATIC_IPV6_GATEWAY
:
2025 vty_out (vty
, " %s", inet_ntop (AF_INET6
, &si
->ipv6
, buf
, BUFSIZ
));
2027 case STATIC_IPV6_IFNAME
:
2028 vty_out (vty
, " %s", si
->ifname
);
2030 case STATIC_IPV6_GATEWAY_IFNAME
:
2031 vty_out (vty
, " %s %s",
2032 inet_ntop (AF_INET6
, &si
->ipv6
, buf
, BUFSIZ
), si
->ifname
);
2036 if (CHECK_FLAG(si
->flags
, ZEBRA_FLAG_REJECT
))
2037 vty_out (vty
, " %s", "reject");
2039 if (CHECK_FLAG(si
->flags
, ZEBRA_FLAG_BLACKHOLE
))
2040 vty_out (vty
, " %s", "blackhole");
2042 if (si
->distance
!= ZEBRA_STATIC_DISTANCE_DEFAULT
)
2043 vty_out (vty
, " %d", si
->distance
);
2044 vty_out (vty
, "%s", VTY_NEWLINE
);
2050 #endif /* HAVE_IPV6 */
2052 /* Static ip route configuration write function. */
2054 zebra_ip_config (struct vty
*vty
)
2058 write
+= static_config_ipv4 (vty
);
2060 write
+= static_config_ipv6 (vty
);
2061 #endif /* HAVE_IPV6 */
2066 /* ip protocol configuration write function */
2067 static int config_write_protocol(struct vty
*vty
)
2071 for (i
=0;i
<ZEBRA_ROUTE_MAX
;i
++)
2073 if (proto_rm
[AFI_IP
][i
])
2074 vty_out (vty
, "ip protocol %s route-map %s%s", zebra_route_string(i
),
2075 proto_rm
[AFI_IP
][i
], VTY_NEWLINE
);
2077 if (proto_rm
[AFI_IP
][ZEBRA_ROUTE_MAX
])
2078 vty_out (vty
, "ip protocol %s route-map %s%s", "any",
2079 proto_rm
[AFI_IP
][ZEBRA_ROUTE_MAX
], VTY_NEWLINE
);
2084 /* table node for protocol filtering */
2085 static struct cmd_node protocol_node
= { PROTOCOL_NODE
, "", 1 };
2087 /* IP node for static routes. */
2088 static struct cmd_node ip_node
= { IP_NODE
, "", 1 };
2092 zebra_vty_init (void)
2094 install_node (&ip_node
, zebra_ip_config
);
2095 install_node (&protocol_node
, config_write_protocol
);
2097 install_element (CONFIG_NODE
, &ip_protocol_cmd
);
2098 install_element (CONFIG_NODE
, &no_ip_protocol_cmd
);
2099 install_element (VIEW_NODE
, &show_ip_protocol_cmd
);
2100 install_element (ENABLE_NODE
, &show_ip_protocol_cmd
);
2101 install_element (CONFIG_NODE
, &ip_route_cmd
);
2102 install_element (CONFIG_NODE
, &ip_route_flags_cmd
);
2103 install_element (CONFIG_NODE
, &ip_route_flags2_cmd
);
2104 install_element (CONFIG_NODE
, &ip_route_mask_cmd
);
2105 install_element (CONFIG_NODE
, &ip_route_mask_flags_cmd
);
2106 install_element (CONFIG_NODE
, &ip_route_mask_flags2_cmd
);
2107 install_element (CONFIG_NODE
, &no_ip_route_cmd
);
2108 install_element (CONFIG_NODE
, &no_ip_route_flags_cmd
);
2109 install_element (CONFIG_NODE
, &no_ip_route_flags2_cmd
);
2110 install_element (CONFIG_NODE
, &no_ip_route_mask_cmd
);
2111 install_element (CONFIG_NODE
, &no_ip_route_mask_flags_cmd
);
2112 install_element (CONFIG_NODE
, &no_ip_route_mask_flags2_cmd
);
2113 install_element (CONFIG_NODE
, &ip_route_distance_cmd
);
2114 install_element (CONFIG_NODE
, &ip_route_flags_distance_cmd
);
2115 install_element (CONFIG_NODE
, &ip_route_flags_distance2_cmd
);
2116 install_element (CONFIG_NODE
, &ip_route_mask_distance_cmd
);
2117 install_element (CONFIG_NODE
, &ip_route_mask_flags_distance_cmd
);
2118 install_element (CONFIG_NODE
, &ip_route_mask_flags_distance2_cmd
);
2119 install_element (CONFIG_NODE
, &no_ip_route_distance_cmd
);
2120 install_element (CONFIG_NODE
, &no_ip_route_flags_distance_cmd
);
2121 install_element (CONFIG_NODE
, &no_ip_route_flags_distance2_cmd
);
2122 install_element (CONFIG_NODE
, &no_ip_route_mask_flags_distance_cmd
);
2123 install_element (CONFIG_NODE
, &no_ip_route_mask_flags_distance2_cmd
);
2125 install_element (VIEW_NODE
, &show_ip_route_cmd
);
2126 install_element (VIEW_NODE
, &show_ip_route_addr_cmd
);
2127 install_element (VIEW_NODE
, &show_ip_route_prefix_cmd
);
2128 install_element (VIEW_NODE
, &show_ip_route_prefix_longer_cmd
);
2129 install_element (VIEW_NODE
, &show_ip_route_protocol_cmd
);
2130 install_element (VIEW_NODE
, &show_ip_route_supernets_cmd
);
2131 install_element (VIEW_NODE
, &show_ip_route_summary_cmd
);
2132 install_element (ENABLE_NODE
, &show_ip_route_cmd
);
2133 install_element (ENABLE_NODE
, &show_ip_route_addr_cmd
);
2134 install_element (ENABLE_NODE
, &show_ip_route_prefix_cmd
);
2135 install_element (ENABLE_NODE
, &show_ip_route_prefix_longer_cmd
);
2136 install_element (ENABLE_NODE
, &show_ip_route_protocol_cmd
);
2137 install_element (ENABLE_NODE
, &show_ip_route_supernets_cmd
);
2138 install_element (ENABLE_NODE
, &show_ip_route_summary_cmd
);
2141 install_element (CONFIG_NODE
, &ipv6_route_cmd
);
2142 install_element (CONFIG_NODE
, &ipv6_route_flags_cmd
);
2143 install_element (CONFIG_NODE
, &ipv6_route_ifname_cmd
);
2144 install_element (CONFIG_NODE
, &ipv6_route_ifname_flags_cmd
);
2145 install_element (CONFIG_NODE
, &no_ipv6_route_cmd
);
2146 install_element (CONFIG_NODE
, &no_ipv6_route_flags_cmd
);
2147 install_element (CONFIG_NODE
, &no_ipv6_route_ifname_cmd
);
2148 install_element (CONFIG_NODE
, &no_ipv6_route_ifname_flags_cmd
);
2149 install_element (CONFIG_NODE
, &ipv6_route_pref_cmd
);
2150 install_element (CONFIG_NODE
, &ipv6_route_flags_pref_cmd
);
2151 install_element (CONFIG_NODE
, &ipv6_route_ifname_pref_cmd
);
2152 install_element (CONFIG_NODE
, &ipv6_route_ifname_flags_pref_cmd
);
2153 install_element (CONFIG_NODE
, &no_ipv6_route_pref_cmd
);
2154 install_element (CONFIG_NODE
, &no_ipv6_route_flags_pref_cmd
);
2155 install_element (CONFIG_NODE
, &no_ipv6_route_ifname_pref_cmd
);
2156 install_element (CONFIG_NODE
, &no_ipv6_route_ifname_flags_pref_cmd
);
2157 install_element (VIEW_NODE
, &show_ipv6_route_cmd
);
2158 install_element (VIEW_NODE
, &show_ipv6_route_summary_cmd
);
2159 install_element (VIEW_NODE
, &show_ipv6_route_protocol_cmd
);
2160 install_element (VIEW_NODE
, &show_ipv6_route_addr_cmd
);
2161 install_element (VIEW_NODE
, &show_ipv6_route_prefix_cmd
);
2162 install_element (VIEW_NODE
, &show_ipv6_route_prefix_longer_cmd
);
2163 install_element (ENABLE_NODE
, &show_ipv6_route_cmd
);
2164 install_element (ENABLE_NODE
, &show_ipv6_route_protocol_cmd
);
2165 install_element (ENABLE_NODE
, &show_ipv6_route_addr_cmd
);
2166 install_element (ENABLE_NODE
, &show_ipv6_route_prefix_cmd
);
2167 install_element (ENABLE_NODE
, &show_ipv6_route_prefix_longer_cmd
);
2168 install_element (ENABLE_NODE
, &show_ipv6_route_summary_cmd
);
2169 #endif /* HAVE_IPV6 */