Annotation of embedaddon/quagga/zebra/zebra_vty.c, revision 1.1
1.1 ! misho 1: /* 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:
! 24: #include "memory.h"
! 25: #include "if.h"
! 26: #include "prefix.h"
! 27: #include "command.h"
! 28: #include "table.h"
! 29: #include "rib.h"
! 30:
! 31: #include "zebra/zserv.h"
! 32:
! 33: /* General fucntion for static route. */
! 34: static int
! 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)
! 38: {
! 39: int ret;
! 40: u_char distance;
! 41: struct prefix p;
! 42: struct in_addr gate;
! 43: struct in_addr mask;
! 44: const char *ifname;
! 45: u_char flag = 0;
! 46:
! 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)
! 59: {
! 60: vty_out (vty, "%% Malformed address%s", VTY_NEWLINE);
! 61: return CMD_WARNING;
! 62: }
! 63: p.prefixlen = ip_masklen (mask);
! 64: }
! 65:
! 66: /* Apply mask for given prefix. */
! 67: apply_mask (&p);
! 68:
! 69: /* Administrative distance. */
! 70: if (distance_str)
! 71: distance = atoi (distance_str);
! 72: else
! 73: distance = ZEBRA_STATIC_DISTANCE_DEFAULT;
! 74:
! 75: /* Null0 static route. */
! 76: if ((gate_str != NULL) && (strncasecmp (gate_str, "Null0", strlen (gate_str)) == 0))
! 77: {
! 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)
! 84: static_add_ipv4 (&p, NULL, NULL, ZEBRA_FLAG_BLACKHOLE, distance, 0);
! 85: else
! 86: static_delete_ipv4 (&p, NULL, NULL, distance, 0);
! 87: return CMD_SUCCESS;
! 88: }
! 89:
! 90: /* 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);
! 103: return CMD_WARNING;
! 104: }
! 105: }
! 106:
! 107: 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:
! 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);
! 120: if (ret)
! 121: ifname = NULL;
! 122: else
! 123: ifname = gate_str;
! 124:
! 125: if (add_cmd)
! 126: static_add_ipv4 (&p, ifname ? NULL : &gate, ifname, flag, distance, 0);
! 127: else
! 128: static_delete_ipv4 (&p, ifname ? NULL : &gate, ifname, distance, 0);
! 129:
! 130: return CMD_SUCCESS;
! 131: }
! 132:
! 133: /* Static route configuration. */
! 134: DEFUN (ip_route,
! 135: ip_route_cmd,
! 136: "ip route A.B.C.D/M (A.B.C.D|INTERFACE|null0)",
! 137: IP_STR
! 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"
! 142: "Null interface\n")
! 143: {
! 144: return zebra_static_ipv4 (vty, 1, argv[0], NULL, argv[1], NULL, NULL);
! 145: }
! 146:
! 147: DEFUN (ip_route_flags,
! 148: ip_route_flags_cmd,
! 149: "ip route A.B.C.D/M (A.B.C.D|INTERFACE) (reject|blackhole)",
! 150: 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"
! 155: "Emit an ICMP unreachable when matched\n"
! 156: "Silently discard pkts when matched\n")
! 157: {
! 158: return zebra_static_ipv4 (vty, 1, argv[0], NULL, argv[1], argv[2], NULL);
! 159: }
! 160:
! 161: DEFUN (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:
! 173: /* Mask as A.B.C.D format. */
! 174: DEFUN (ip_route_mask,
! 175: ip_route_mask_cmd,
! 176: "ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE|null0)",
! 177: IP_STR
! 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"
! 183: "Null interface\n")
! 184: {
! 185: return zebra_static_ipv4 (vty, 1, argv[0], argv[1], argv[2], NULL, NULL);
! 186: }
! 187:
! 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)",
! 191: 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"
! 197: "Emit an ICMP unreachable when matched\n"
! 198: "Silently discard pkts when matched\n")
! 199: {
! 200: return zebra_static_ipv4 (vty, 1, argv[0], argv[1], argv[2], argv[3], NULL);
! 201: }
! 202:
! 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)",
! 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:
! 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>",
! 220: 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"
! 225: "Null interface\n"
! 226: "Distance value for this route\n")
! 227: {
! 228: return zebra_static_ipv4 (vty, 1, argv[0], NULL, argv[1], NULL, argv[2]);
! 229: }
! 230:
! 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>",
! 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]);
! 244: }
! 245:
! 246: DEFUN (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:
! 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>",
! 262: 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"
! 268: "Null interface\n"
! 269: "Distance value for this route\n")
! 270: {
! 271: return zebra_static_ipv4 (vty, 1, argv[0], argv[1], argv[2], NULL, argv[3]);
! 272: }
! 273:
! 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>",
! 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"
! 283: "Distance value for this route\n"
! 284: "Emit an ICMP unreachable when matched\n"
! 285: "Silently discard pkts when matched\n")
! 286: {
! 287: return zebra_static_ipv4 (vty, 1, argv[0], argv[1], argv[2], argv[3], argv[4]);
! 288: }
! 289:
! 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>",
! 293: IP_STR
! 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")
! 300: {
! 301: return zebra_static_ipv4 (vty, 1, argv[0], argv[1], NULL, argv[2], argv[3]);
! 302: }
! 303:
! 304: DEFUN (no_ip_route,
! 305: no_ip_route_cmd,
! 306: "no ip route A.B.C.D/M (A.B.C.D|INTERFACE|null0)",
! 307: 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"
! 312: "IP gateway interface name\n"
! 313: "Null interface\n")
! 314: {
! 315: return zebra_static_ipv4 (vty, 0, argv[0], NULL, argv[1], NULL, NULL);
! 316: }
! 317:
! 318: ALIAS (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)",
! 321: 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"
! 327: "Emit an ICMP unreachable when matched\n"
! 328: "Silently discard pkts when matched\n")
! 329:
! 330: DEFUN (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:
! 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)",
! 346: 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"
! 352: "IP gateway interface name\n"
! 353: "Null interface\n")
! 354: {
! 355: return zebra_static_ipv4 (vty, 0, argv[0], argv[1], argv[2], NULL, NULL);
! 356: }
! 357:
! 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)",
! 361: 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"
! 368: "Emit an ICMP unreachable when matched\n"
! 369: "Silently discard pkts when matched\n")
! 370:
! 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)",
! 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:
! 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>",
! 388: 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"
! 394: "Null interface\n"
! 395: "Distance value for this route\n")
! 396: {
! 397: return zebra_static_ipv4 (vty, 0, argv[0], NULL, argv[1], NULL, argv[2]);
! 398: }
! 399:
! 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>",
! 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]);
! 414: }
! 415:
! 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>",
! 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:
! 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>",
! 433: 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"
! 440: "Null interface\n"
! 441: "Distance value for this route\n")
! 442: {
! 443: return zebra_static_ipv4 (vty, 0, argv[0], argv[1], argv[2], NULL, argv[3]);
! 444: }
! 445:
! 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>",
! 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]);
! 461: }
! 462:
! 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>",
! 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:
! 478: char *proto_rm[AFI_MAX][ZEBRA_ROUTE_MAX+1]; /* "any" == ZEBRA_ROUTE_MAX */
! 479:
! 480: DEFUN (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:
! 506: DEFUN (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:
! 531: /* New RIB. Detailed information for IPv4 route. */
! 532: static void
! 533: vty_show_ip_route_detail (struct vty *vty, struct route_node *rn)
! 534: {
! 535: struct rib *rib;
! 536: struct nexthop *nexthop;
! 537:
! 538: for (rib = rn->info; rib; rib = rib->next)
! 539: {
! 540: vty_out (vty, "Routing entry for %s/%d%s",
! 541: inet_ntoa (rn->p.u.prefix4), rn->p.prefixlen,
! 542: VTY_NEWLINE);
! 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");
! 547: if (rib->refcnt)
! 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);
! 554:
! 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)
! 561: {
! 562: time_t uptime;
! 563: struct tm *tm;
! 564:
! 565: uptime = time (NULL);
! 566: uptime -= rib->uptime;
! 567: tm = gmtime (&uptime);
! 568:
! 569: vty_out (vty, " Last update ");
! 570:
! 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);
! 577: else
! 578: vty_out (vty, "%02dw%dd%02dh",
! 579: tm->tm_yday/7,
! 580: tm->tm_yday - ((tm->tm_yday/7) * 7), tm->tm_hour);
! 581: vty_out (vty, " ago%s", VTY_NEWLINE);
! 582: }
! 583:
! 584: for (nexthop = rib->nexthop; nexthop; nexthop = nexthop->next)
! 585: {
! 586: char addrstr[32];
! 587:
! 588: vty_out (vty, " %c",
! 589: CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB) ? '*' : ' ');
! 590:
! 591: switch (nexthop->type)
! 592: {
! 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));
! 598: break;
! 599: case NEXTHOP_TYPE_IFINDEX:
! 600: vty_out (vty, " directly connected, %s",
! 601: ifindex2ifname (nexthop->ifindex));
! 602: break;
! 603: case NEXTHOP_TYPE_IFNAME:
! 604: vty_out (vty, " directly connected, %s", nexthop->ifname);
! 605: break;
! 606: case NEXTHOP_TYPE_BLACKHOLE:
! 607: vty_out (vty, " directly connected, Null0");
! 608: break;
! 609: default:
! 610: break;
! 611: }
! 612: if (! CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ACTIVE))
! 613: vty_out (vty, " inactive");
! 614:
! 615: if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_RECURSIVE))
! 616: {
! 617: vty_out (vty, " (recursive");
! 618:
! 619: switch (nexthop->rtype)
! 620: {
! 621: case NEXTHOP_TYPE_IPV4:
! 622: case NEXTHOP_TYPE_IPV4_IFINDEX:
! 623: vty_out (vty, " via %s)", inet_ntoa (nexthop->rgate.ipv4));
! 624: break;
! 625: case NEXTHOP_TYPE_IFINDEX:
! 626: case NEXTHOP_TYPE_IFNAME:
! 627: vty_out (vty, " is directly connected, %s)",
! 628: ifindex2ifname (nexthop->rifindex));
! 629: break;
! 630: default:
! 631: break;
! 632: }
! 633: }
! 634: switch (nexthop->type)
! 635: {
! 636: case NEXTHOP_TYPE_IPV4:
! 637: case NEXTHOP_TYPE_IPV4_IFINDEX:
! 638: case NEXTHOP_TYPE_IPV4_IFNAME:
! 639: if (nexthop->src.ipv4.s_addr)
! 640: {
! 641: if (inet_ntop(AF_INET, &nexthop->src.ipv4, addrstr,
! 642: sizeof addrstr))
! 643: vty_out (vty, ", src %s", addrstr);
! 644: }
! 645: break;
! 646: #ifdef HAVE_IPV6
! 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))
! 651: {
! 652: if (inet_ntop(AF_INET6, &nexthop->src.ipv6, addrstr,
! 653: sizeof addrstr))
! 654: vty_out (vty, ", src %s", addrstr);
! 655: }
! 656: break;
! 657: #endif /* HAVE_IPV6 */
! 658: default:
! 659: break;
! 660: }
! 661: vty_out (vty, "%s", VTY_NEWLINE);
! 662: }
! 663: vty_out (vty, "%s", VTY_NEWLINE);
! 664: }
! 665: }
! 666:
! 667: static void
! 668: vty_show_ip_route (struct vty *vty, struct route_node *rn, struct rib *rib)
! 669: {
! 670: struct nexthop *nexthop;
! 671: int len = 0;
! 672: char buf[BUFSIZ];
! 673:
! 674: /* Nexthop information. */
! 675: for (nexthop = rib->nexthop; nexthop; nexthop = nexthop->next)
! 676: {
! 677: if (nexthop == rib->nexthop)
! 678: {
! 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)
! 683: ? '>' : ' ',
! 684: CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB)
! 685: ? '*' : ' ',
! 686: inet_ntop (AF_INET, &rn->p.u.prefix, buf, BUFSIZ),
! 687: rn->p.prefixlen);
! 688:
! 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,
! 693: rib->metric);
! 694: }
! 695: else
! 696: vty_out (vty, " %c%*c",
! 697: CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB)
! 698: ? '*' : ' ',
! 699: len - 3, ' ');
! 700:
! 701: switch (nexthop->type)
! 702: {
! 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));
! 708: break;
! 709: case NEXTHOP_TYPE_IFINDEX:
! 710: vty_out (vty, " is directly connected, %s",
! 711: ifindex2ifname (nexthop->ifindex));
! 712: break;
! 713: case NEXTHOP_TYPE_IFNAME:
! 714: vty_out (vty, " is directly connected, %s", nexthop->ifname);
! 715: break;
! 716: case NEXTHOP_TYPE_BLACKHOLE:
! 717: vty_out (vty, " is directly connected, Null0");
! 718: break;
! 719: default:
! 720: break;
! 721: }
! 722: if (! CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ACTIVE))
! 723: vty_out (vty, " inactive");
! 724:
! 725: if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_RECURSIVE))
! 726: {
! 727: vty_out (vty, " (recursive");
! 728:
! 729: switch (nexthop->rtype)
! 730: {
! 731: case NEXTHOP_TYPE_IPV4:
! 732: case NEXTHOP_TYPE_IPV4_IFINDEX:
! 733: vty_out (vty, " via %s)", inet_ntoa (nexthop->rgate.ipv4));
! 734: break;
! 735: case NEXTHOP_TYPE_IFINDEX:
! 736: case NEXTHOP_TYPE_IFNAME:
! 737: vty_out (vty, " is directly connected, %s)",
! 738: ifindex2ifname (nexthop->rifindex));
! 739: break;
! 740: default:
! 741: break;
! 742: }
! 743: }
! 744: switch (nexthop->type)
! 745: {
! 746: case NEXTHOP_TYPE_IPV4:
! 747: case NEXTHOP_TYPE_IPV4_IFINDEX:
! 748: case NEXTHOP_TYPE_IPV4_IFNAME:
! 749: if (nexthop->src.ipv4.s_addr)
! 750: {
! 751: if (inet_ntop(AF_INET, &nexthop->src.ipv4, buf, sizeof buf))
! 752: vty_out (vty, ", src %s", buf);
! 753: }
! 754: break;
! 755: #ifdef HAVE_IPV6
! 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))
! 760: {
! 761: if (inet_ntop(AF_INET6, &nexthop->src.ipv6, buf, sizeof buf))
! 762: vty_out (vty, ", src %s", buf);
! 763: }
! 764: break;
! 765: #endif /* HAVE_IPV6 */
! 766: default:
! 767: break;
! 768: }
! 769:
! 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");
! 774:
! 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)
! 779: {
! 780: time_t uptime;
! 781: struct tm *tm;
! 782:
! 783: uptime = time (NULL);
! 784: uptime -= rib->uptime;
! 785: tm = gmtime (&uptime);
! 786:
! 787: #define ONE_DAY_SECOND 60*60*24
! 788: #define ONE_WEEK_SECOND 60*60*24*7
! 789:
! 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);
! 796: else
! 797: vty_out (vty, ", %02dw%dd%02dh",
! 798: tm->tm_yday/7,
! 799: tm->tm_yday - ((tm->tm_yday/7) * 7), tm->tm_hour);
! 800: }
! 801: vty_out (vty, "%s", VTY_NEWLINE);
! 802: }
! 803: }
! 804:
! 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"
! 808:
! 809: DEFUN (show_ip_route,
! 810: show_ip_route_cmd,
! 811: "show ip route",
! 812: SHOW_STR
! 813: IP_STR
! 814: "IP routing table\n")
! 815: {
! 816: struct route_table *table;
! 817: struct route_node *rn;
! 818: struct rib *rib;
! 819: int first = 1;
! 820:
! 821: table = vrf_table (AFI_IP, SAFI_UNICAST, 0);
! 822: if (! table)
! 823: return CMD_SUCCESS;
! 824:
! 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)
! 828: {
! 829: if (first)
! 830: {
! 831: vty_out (vty, SHOW_ROUTE_V4_HEADER, VTY_NEWLINE, VTY_NEWLINE,
! 832: VTY_NEWLINE);
! 833: first = 0;
! 834: }
! 835: vty_show_ip_route (vty, rn, rib);
! 836: }
! 837: return CMD_SUCCESS;
! 838: }
! 839:
! 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",
! 843: SHOW_STR
! 844: IP_STR
! 845: "IP routing table\n"
! 846: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
! 847: "Show route matching the specified Network/Mask pair only\n")
! 848: {
! 849: struct route_table *table;
! 850: struct route_node *rn;
! 851: struct rib *rib;
! 852: struct prefix p;
! 853: int ret;
! 854: int first = 1;
! 855:
! 856: ret = str2prefix (argv[0], &p);
! 857: if (! ret)
! 858: {
! 859: vty_out (vty, "%% Malformed Prefix%s", VTY_NEWLINE);
! 860: return CMD_WARNING;
! 861: }
! 862:
! 863: table = vrf_table (AFI_IP, SAFI_UNICAST, 0);
! 864: if (! table)
! 865: return CMD_SUCCESS;
! 866:
! 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))
! 871: {
! 872: if (first)
! 873: {
! 874: vty_out (vty, SHOW_ROUTE_V4_HEADER, VTY_NEWLINE,
! 875: VTY_NEWLINE, VTY_NEWLINE);
! 876: first = 0;
! 877: }
! 878: vty_show_ip_route (vty, rn, rib);
! 879: }
! 880: return CMD_SUCCESS;
! 881: }
! 882:
! 883: DEFUN (show_ip_route_supernets,
! 884: show_ip_route_supernets_cmd,
! 885: "show ip route supernets-only",
! 886: SHOW_STR
! 887: IP_STR
! 888: "IP routing table\n"
! 889: "Show supernet entries only\n")
! 890: {
! 891: struct route_table *table;
! 892: struct route_node *rn;
! 893: struct rib *rib;
! 894: u_int32_t addr;
! 895: int first = 1;
! 896:
! 897: table = vrf_table (AFI_IP, SAFI_UNICAST, 0);
! 898: if (! table)
! 899: return CMD_SUCCESS;
! 900:
! 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)
! 904: {
! 905: addr = ntohl (rn->p.u.prefix4.s_addr);
! 906:
! 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))
! 910: {
! 911: if (first)
! 912: {
! 913: vty_out (vty, SHOW_ROUTE_V4_HEADER, VTY_NEWLINE,
! 914: VTY_NEWLINE, VTY_NEWLINE);
! 915: first = 0;
! 916: }
! 917: vty_show_ip_route (vty, rn, rib);
! 918: }
! 919: }
! 920: return CMD_SUCCESS;
! 921: }
! 922:
! 923: DEFUN (show_ip_route_protocol,
! 924: show_ip_route_protocol_cmd,
! 925: "show ip route (bgp|connected|isis|kernel|ospf|rip|static)",
! 926: SHOW_STR
! 927: IP_STR
! 928: "IP routing table\n"
! 929: "Border Gateway Protocol (BGP)\n"
! 930: "Connected\n"
! 931: "ISO IS-IS (ISIS)\n"
! 932: "Kernel\n"
! 933: "Open Shortest Path First (OSPF)\n"
! 934: "Routing Information Protocol (RIP)\n"
! 935: "Static routes\n")
! 936: {
! 937: int type;
! 938: struct route_table *table;
! 939: struct route_node *rn;
! 940: struct rib *rib;
! 941: int first = 1;
! 942:
! 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;
! 957: else
! 958: {
! 959: vty_out (vty, "Unknown route type%s", VTY_NEWLINE);
! 960: return CMD_WARNING;
! 961: }
! 962:
! 963: table = vrf_table (AFI_IP, SAFI_UNICAST, 0);
! 964: if (! table)
! 965: return CMD_SUCCESS;
! 966:
! 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)
! 971: {
! 972: if (first)
! 973: {
! 974: vty_out (vty, SHOW_ROUTE_V4_HEADER,
! 975: VTY_NEWLINE, VTY_NEWLINE, VTY_NEWLINE);
! 976: first = 0;
! 977: }
! 978: vty_show_ip_route (vty, rn, rib);
! 979: }
! 980: return CMD_SUCCESS;
! 981: }
! 982:
! 983: DEFUN (show_ip_route_addr,
! 984: show_ip_route_addr_cmd,
! 985: "show ip route A.B.C.D",
! 986: SHOW_STR
! 987: IP_STR
! 988: "IP routing table\n"
! 989: "Network in the IP routing table to display\n")
! 990: {
! 991: int ret;
! 992: struct prefix_ipv4 p;
! 993: struct route_table *table;
! 994: struct route_node *rn;
! 995:
! 996: ret = str2prefix_ipv4 (argv[0], &p);
! 997: if (ret <= 0)
! 998: {
! 999: vty_out (vty, "%% Malformed IPv4 address%s", VTY_NEWLINE);
! 1000: return CMD_WARNING;
! 1001: }
! 1002:
! 1003: table = vrf_table (AFI_IP, SAFI_UNICAST, 0);
! 1004: if (! table)
! 1005: return CMD_SUCCESS;
! 1006:
! 1007: rn = route_node_match (table, (struct prefix *) &p);
! 1008: if (! rn)
! 1009: {
! 1010: vty_out (vty, "%% Network not in table%s", VTY_NEWLINE);
! 1011: return CMD_WARNING;
! 1012: }
! 1013:
! 1014: vty_show_ip_route_detail (vty, rn);
! 1015:
! 1016: route_unlock_node (rn);
! 1017:
! 1018: return CMD_SUCCESS;
! 1019: }
! 1020:
! 1021: DEFUN (show_ip_route_prefix,
! 1022: show_ip_route_prefix_cmd,
! 1023: "show ip route A.B.C.D/M",
! 1024: SHOW_STR
! 1025: IP_STR
! 1026: "IP routing table\n"
! 1027: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
! 1028: {
! 1029: int ret;
! 1030: struct prefix_ipv4 p;
! 1031: struct route_table *table;
! 1032: struct route_node *rn;
! 1033:
! 1034: ret = str2prefix_ipv4 (argv[0], &p);
! 1035: if (ret <= 0)
! 1036: {
! 1037: vty_out (vty, "%% Malformed IPv4 address%s", VTY_NEWLINE);
! 1038: return CMD_WARNING;
! 1039: }
! 1040:
! 1041: table = vrf_table (AFI_IP, SAFI_UNICAST, 0);
! 1042: if (! table)
! 1043: return CMD_SUCCESS;
! 1044:
! 1045: rn = route_node_match (table, (struct prefix *) &p);
! 1046: if (! rn || rn->p.prefixlen != p.prefixlen)
! 1047: {
! 1048: vty_out (vty, "%% Network not in table%s", VTY_NEWLINE);
! 1049: return CMD_WARNING;
! 1050: }
! 1051:
! 1052: vty_show_ip_route_detail (vty, rn);
! 1053:
! 1054: route_unlock_node (rn);
! 1055:
! 1056: return CMD_SUCCESS;
! 1057: }
! 1058:
! 1059: static void
! 1060: vty_show_ip_route_summary (struct vty *vty, struct route_table *table)
! 1061: {
! 1062: struct route_node *rn;
! 1063: struct rib *rib;
! 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];
! 1069: u_int32_t i;
! 1070:
! 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)
! 1076: {
! 1077: rib_cnt[ZEBRA_ROUTE_TOTAL]++;
! 1078: rib_cnt[rib->type]++;
! 1079: if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB))
! 1080: {
! 1081: fib_cnt[ZEBRA_ROUTE_TOTAL]++;
! 1082: fib_cnt[rib->type]++;
! 1083: }
! 1084: if (rib->type == ZEBRA_ROUTE_BGP &&
! 1085: CHECK_FLAG (rib->flags, ZEBRA_FLAG_IBGP))
! 1086: {
! 1087: rib_cnt[ZEBRA_ROUTE_IBGP]++;
! 1088: if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB))
! 1089: fib_cnt[ZEBRA_ROUTE_IBGP]++;
! 1090: }
! 1091: }
! 1092:
! 1093: vty_out (vty, "%-20s %-20s %-20s %s",
! 1094: "Route Source", "Routes", "FIB", VTY_NEWLINE);
! 1095:
! 1096: for (i = 0; i < ZEBRA_ROUTE_MAX; i++)
! 1097: {
! 1098: if (rib_cnt[i] > 0)
! 1099: {
! 1100: if (i == ZEBRA_ROUTE_BGP)
! 1101: {
! 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],
! 1105: VTY_NEWLINE);
! 1106: vty_out (vty, "%-20s %-20d %-20d %s", "ibgp",
! 1107: rib_cnt[ZEBRA_ROUTE_IBGP], fib_cnt[ZEBRA_ROUTE_IBGP],
! 1108: VTY_NEWLINE);
! 1109: }
! 1110: else
! 1111: vty_out (vty, "%-20s %-20d %-20d %s", zebra_route_string(i),
! 1112: rib_cnt[i], fib_cnt[i], VTY_NEWLINE);
! 1113: }
! 1114: }
! 1115:
! 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);
! 1119: }
! 1120:
! 1121: /* Show route summary. */
! 1122: DEFUN (show_ip_route_summary,
! 1123: show_ip_route_summary_cmd,
! 1124: "show ip route summary",
! 1125: SHOW_STR
! 1126: IP_STR
! 1127: "IP routing table\n"
! 1128: "Summary of all routes\n")
! 1129: {
! 1130: struct route_table *table;
! 1131:
! 1132: table = vrf_table (AFI_IP, SAFI_UNICAST, 0);
! 1133: if (! table)
! 1134: return CMD_SUCCESS;
! 1135:
! 1136: vty_show_ip_route_summary (vty, table);
! 1137:
! 1138: return CMD_SUCCESS;
! 1139: }
! 1140:
! 1141: /* Write IPv4 static route configuration. */
! 1142: static int
! 1143: static_config_ipv4 (struct vty *vty)
! 1144: {
! 1145: struct route_node *rn;
! 1146: struct static_ipv4 *si;
! 1147: struct route_table *stable;
! 1148: int write;
! 1149:
! 1150: write = 0;
! 1151:
! 1152: /* Lookup table. */
! 1153: stable = vrf_static_table (AFI_IP, SAFI_UNICAST, 0);
! 1154: if (! stable)
! 1155: return -1;
! 1156:
! 1157: for (rn = route_top (stable); rn; rn = route_next (rn))
! 1158: for (si = rn->info; si; si = si->next)
! 1159: {
! 1160: vty_out (vty, "ip route %s/%d", inet_ntoa (rn->p.u.prefix4),
! 1161: rn->p.prefixlen);
! 1162:
! 1163: switch (si->type)
! 1164: {
! 1165: case STATIC_IPV4_GATEWAY:
! 1166: vty_out (vty, " %s", inet_ntoa (si->gate.ipv4));
! 1167: break;
! 1168: case STATIC_IPV4_IFNAME:
! 1169: vty_out (vty, " %s", si->gate.ifname);
! 1170: break;
! 1171: case STATIC_IPV4_BLACKHOLE:
! 1172: vty_out (vty, " Null0");
! 1173: break;
! 1174: }
! 1175:
! 1176: /* flags are incompatible with STATIC_IPV4_BLACKHOLE */
! 1177: if (si->type != STATIC_IPV4_BLACKHOLE)
! 1178: {
! 1179: if (CHECK_FLAG(si->flags, ZEBRA_FLAG_REJECT))
! 1180: vty_out (vty, " %s", "reject");
! 1181:
! 1182: if (CHECK_FLAG(si->flags, ZEBRA_FLAG_BLACKHOLE))
! 1183: vty_out (vty, " %s", "blackhole");
! 1184: }
! 1185:
! 1186: if (si->distance != ZEBRA_STATIC_DISTANCE_DEFAULT)
! 1187: vty_out (vty, " %d", si->distance);
! 1188:
! 1189: vty_out (vty, "%s", VTY_NEWLINE);
! 1190:
! 1191: write = 1;
! 1192: }
! 1193: return write;
! 1194: }
! 1195:
! 1196: DEFUN (show_ip_protocol,
! 1197: show_ip_protocol_cmd,
! 1198: "show ip protocol",
! 1199: SHOW_STR
! 1200: IP_STR
! 1201: "IP protocol filtering status\n")
! 1202: {
! 1203: int i;
! 1204:
! 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++)
! 1208: {
! 1209: if (proto_rm[AFI_IP][i])
! 1210: vty_out (vty, "%-10s : %-10s%s", zebra_route_string(i),
! 1211: proto_rm[AFI_IP][i],
! 1212: VTY_NEWLINE);
! 1213: else
! 1214: vty_out (vty, "%-10s : none%s", zebra_route_string(i), VTY_NEWLINE);
! 1215: }
! 1216: if (proto_rm[AFI_IP][i])
! 1217: vty_out (vty, "%-10s : %-10s%s", "any", proto_rm[AFI_IP][i],
! 1218: VTY_NEWLINE);
! 1219: else
! 1220: vty_out (vty, "%-10s : none%s", "any", VTY_NEWLINE);
! 1221:
! 1222: return CMD_SUCCESS;
! 1223: }
! 1224:
! 1225:
! 1226: #ifdef HAVE_IPV6
! 1227: /* General fucntion for IPv6 static route. */
! 1228: static int
! 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)
! 1232: {
! 1233: int ret;
! 1234: u_char distance;
! 1235: struct prefix p;
! 1236: struct in6_addr *gate = NULL;
! 1237: struct in6_addr gate_addr;
! 1238: u_char type = 0;
! 1239: int table = 0;
! 1240: u_char flag = 0;
! 1241:
! 1242: ret = str2prefix (dest_str, &p);
! 1243: if (ret <= 0)
! 1244: {
! 1245: vty_out (vty, "%% Malformed address%s", VTY_NEWLINE);
! 1246: return CMD_WARNING;
! 1247: }
! 1248:
! 1249: /* Apply mask for given prefix. */
! 1250: apply_mask (&p);
! 1251:
! 1252: /* Route flags */
! 1253: if (flag_str) {
! 1254: switch(flag_str[0]) {
! 1255: case 'r':
! 1256: case 'R': /* XXX */
! 1257: SET_FLAG (flag, ZEBRA_FLAG_REJECT);
! 1258: break;
! 1259: case 'b':
! 1260: case 'B': /* XXX */
! 1261: SET_FLAG (flag, ZEBRA_FLAG_BLACKHOLE);
! 1262: break;
! 1263: default:
! 1264: vty_out (vty, "%% Malformed flag %s %s", flag_str, VTY_NEWLINE);
! 1265: return CMD_WARNING;
! 1266: }
! 1267: }
! 1268:
! 1269: /* Administrative distance. */
! 1270: if (distance_str)
! 1271: distance = atoi (distance_str);
! 1272: else
! 1273: distance = ZEBRA_STATIC_DISTANCE_DEFAULT;
! 1274:
! 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);
! 1278:
! 1279: if (ifname)
! 1280: {
! 1281: /* When ifname is specified. It must be come with gateway
! 1282: address. */
! 1283: if (ret != 1)
! 1284: {
! 1285: vty_out (vty, "%% Malformed address%s", VTY_NEWLINE);
! 1286: return CMD_WARNING;
! 1287: }
! 1288: type = STATIC_IPV6_GATEWAY_IFNAME;
! 1289: gate = &gate_addr;
! 1290: }
! 1291: else
! 1292: {
! 1293: if (ret == 1)
! 1294: {
! 1295: type = STATIC_IPV6_GATEWAY;
! 1296: gate = &gate_addr;
! 1297: }
! 1298: else
! 1299: {
! 1300: type = STATIC_IPV6_IFNAME;
! 1301: ifname = gate_str;
! 1302: }
! 1303: }
! 1304:
! 1305: if (add_cmd)
! 1306: static_add_ipv6 (&p, type, gate, ifname, flag, distance, table);
! 1307: else
! 1308: static_delete_ipv6 (&p, type, gate, ifname, distance, table);
! 1309:
! 1310: return CMD_SUCCESS;
! 1311: }
! 1312:
! 1313: DEFUN (ipv6_route,
! 1314: ipv6_route_cmd,
! 1315: "ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE)",
! 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: {
! 1322: return static_ipv6_func (vty, 1, argv[0], argv[1], NULL, NULL, NULL);
! 1323: }
! 1324:
! 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)",
! 1328: IP_STR
! 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")
! 1335: {
! 1336: return static_ipv6_func (vty, 1, argv[0], argv[1], NULL, argv[2], NULL);
! 1337: }
! 1338:
! 1339: DEFUN (ipv6_route_ifname,
! 1340: ipv6_route_ifname_cmd,
! 1341: "ipv6 route X:X::X:X/M X:X::X:X INTERFACE",
! 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: {
! 1348: return static_ipv6_func (vty, 1, argv[0], argv[1], argv[2], NULL, NULL);
! 1349: }
! 1350:
! 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)",
! 1354: IP_STR
! 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")
! 1361: {
! 1362: return static_ipv6_func (vty, 1, argv[0], argv[1], argv[2], argv[3], NULL);
! 1363: }
! 1364:
! 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>",
! 1368: IP_STR
! 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")
! 1374: {
! 1375: return static_ipv6_func (vty, 1, argv[0], argv[1], NULL, NULL, argv[2]);
! 1376: }
! 1377:
! 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>",
! 1381: IP_STR
! 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")
! 1389: {
! 1390: return static_ipv6_func (vty, 1, argv[0], argv[1], NULL, argv[2], argv[3]);
! 1391: }
! 1392:
! 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>",
! 1396: IP_STR
! 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")
! 1402: {
! 1403: return static_ipv6_func (vty, 1, argv[0], argv[1], argv[2], NULL, argv[3]);
! 1404: }
! 1405:
! 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>",
! 1409: IP_STR
! 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")
! 1417: {
! 1418: return static_ipv6_func (vty, 1, argv[0], argv[1], argv[2], argv[3], argv[4]);
! 1419: }
! 1420:
! 1421: DEFUN (no_ipv6_route,
! 1422: no_ipv6_route_cmd,
! 1423: "no ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE)",
! 1424: NO_STR
! 1425: IP_STR
! 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")
! 1430: {
! 1431: return static_ipv6_func (vty, 0, argv[0], argv[1], NULL, NULL, NULL);
! 1432: }
! 1433:
! 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)",
! 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: "Emit an ICMP unreachable when matched\n"
! 1444: "Silently discard pkts when matched\n")
! 1445:
! 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",
! 1449: NO_STR
! 1450: IP_STR
! 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")
! 1455: {
! 1456: return static_ipv6_func (vty, 0, argv[0], argv[1], argv[2], NULL, NULL);
! 1457: }
! 1458:
! 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)",
! 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: "Emit an ICMP unreachable when matched\n"
! 1469: "Silently discard pkts when matched\n")
! 1470:
! 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>",
! 1474: NO_STR
! 1475: IP_STR
! 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")
! 1481: {
! 1482: return static_ipv6_func (vty, 0, argv[0], argv[1], NULL, NULL, argv[2]);
! 1483: }
! 1484:
! 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>",
! 1488: NO_STR
! 1489: IP_STR
! 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")
! 1497: {
! 1498: /* We do not care about argv[2] */
! 1499: return static_ipv6_func (vty, 0, argv[0], argv[1], NULL, argv[2], argv[3]);
! 1500: }
! 1501:
! 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>",
! 1505: NO_STR
! 1506: IP_STR
! 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")
! 1512: {
! 1513: return static_ipv6_func (vty, 0, argv[0], argv[1], argv[2], NULL, argv[3]);
! 1514: }
! 1515:
! 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>",
! 1519: NO_STR
! 1520: IP_STR
! 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")
! 1528: {
! 1529: return static_ipv6_func (vty, 0, argv[0], argv[1], argv[2], argv[3], argv[4]);
! 1530: }
! 1531:
! 1532: /* New RIB. Detailed information for IPv6 route. */
! 1533: static void
! 1534: vty_show_ipv6_route_detail (struct vty *vty, struct route_node *rn)
! 1535: {
! 1536: struct rib *rib;
! 1537: struct nexthop *nexthop;
! 1538: char buf[BUFSIZ];
! 1539:
! 1540: for (rib = rn->info; rib; rib = rib->next)
! 1541: {
! 1542: vty_out (vty, "Routing entry for %s/%d%s",
! 1543: inet_ntop (AF_INET6, &rn->p.u.prefix6, buf, BUFSIZ),
! 1544: rn->p.prefixlen,
! 1545: VTY_NEWLINE);
! 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");
! 1550: if (rib->refcnt)
! 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);
! 1557:
! 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)
! 1564: {
! 1565: time_t uptime;
! 1566: struct tm *tm;
! 1567:
! 1568: uptime = time (NULL);
! 1569: uptime -= rib->uptime;
! 1570: tm = gmtime (&uptime);
! 1571:
! 1572: vty_out (vty, " Last update ");
! 1573:
! 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);
! 1580: else
! 1581: vty_out (vty, "%02dw%dd%02dh",
! 1582: tm->tm_yday/7,
! 1583: tm->tm_yday - ((tm->tm_yday/7) * 7), tm->tm_hour);
! 1584: vty_out (vty, " ago%s", VTY_NEWLINE);
! 1585: }
! 1586:
! 1587: for (nexthop = rib->nexthop; nexthop; nexthop = nexthop->next)
! 1588: {
! 1589: vty_out (vty, " %c",
! 1590: CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB) ? '*' : ' ');
! 1591:
! 1592: switch (nexthop->type)
! 1593: {
! 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));
! 1603: break;
! 1604: case NEXTHOP_TYPE_IFINDEX:
! 1605: vty_out (vty, " directly connected, %s",
! 1606: ifindex2ifname (nexthop->ifindex));
! 1607: break;
! 1608: case NEXTHOP_TYPE_IFNAME:
! 1609: vty_out (vty, " directly connected, %s",
! 1610: nexthop->ifname);
! 1611: break;
! 1612: default:
! 1613: break;
! 1614: }
! 1615: if (! CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ACTIVE))
! 1616: vty_out (vty, " inactive");
! 1617:
! 1618: if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_RECURSIVE))
! 1619: {
! 1620: vty_out (vty, " (recursive");
! 1621:
! 1622: switch (nexthop->rtype)
! 1623: {
! 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,
! 1629: buf, BUFSIZ));
! 1630: if (nexthop->rifindex)
! 1631: vty_out (vty, ", %s", ifindex2ifname (nexthop->rifindex));
! 1632: break;
! 1633: case NEXTHOP_TYPE_IFINDEX:
! 1634: case NEXTHOP_TYPE_IFNAME:
! 1635: vty_out (vty, " is directly connected, %s)",
! 1636: ifindex2ifname (nexthop->rifindex));
! 1637: break;
! 1638: default:
! 1639: break;
! 1640: }
! 1641: }
! 1642: vty_out (vty, "%s", VTY_NEWLINE);
! 1643: }
! 1644: vty_out (vty, "%s", VTY_NEWLINE);
! 1645: }
! 1646: }
! 1647:
! 1648: static void
! 1649: vty_show_ipv6_route (struct vty *vty, struct route_node *rn,
! 1650: struct rib *rib)
! 1651: {
! 1652: struct nexthop *nexthop;
! 1653: int len = 0;
! 1654: char buf[BUFSIZ];
! 1655:
! 1656: /* Nexthop information. */
! 1657: for (nexthop = rib->nexthop; nexthop; nexthop = nexthop->next)
! 1658: {
! 1659: if (nexthop == rib->nexthop)
! 1660: {
! 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)
! 1665: ? '>' : ' ',
! 1666: CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB)
! 1667: ? '*' : ' ',
! 1668: inet_ntop (AF_INET6, &rn->p.u.prefix6, buf, BUFSIZ),
! 1669: rn->p.prefixlen);
! 1670:
! 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,
! 1675: rib->metric);
! 1676: }
! 1677: else
! 1678: vty_out (vty, " %c%*c",
! 1679: CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB)
! 1680: ? '*' : ' ',
! 1681: len - 3, ' ');
! 1682:
! 1683: switch (nexthop->type)
! 1684: {
! 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));
! 1694: break;
! 1695: case NEXTHOP_TYPE_IFINDEX:
! 1696: vty_out (vty, " is directly connected, %s",
! 1697: ifindex2ifname (nexthop->ifindex));
! 1698: break;
! 1699: case NEXTHOP_TYPE_IFNAME:
! 1700: vty_out (vty, " is directly connected, %s",
! 1701: nexthop->ifname);
! 1702: break;
! 1703: default:
! 1704: break;
! 1705: }
! 1706: if (! CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ACTIVE))
! 1707: vty_out (vty, " inactive");
! 1708:
! 1709: if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_RECURSIVE))
! 1710: {
! 1711: vty_out (vty, " (recursive");
! 1712:
! 1713: switch (nexthop->rtype)
! 1714: {
! 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,
! 1720: buf, BUFSIZ));
! 1721: if (nexthop->rifindex)
! 1722: vty_out (vty, ", %s", ifindex2ifname (nexthop->rifindex));
! 1723: break;
! 1724: case NEXTHOP_TYPE_IFINDEX:
! 1725: case NEXTHOP_TYPE_IFNAME:
! 1726: vty_out (vty, " is directly connected, %s)",
! 1727: ifindex2ifname (nexthop->rifindex));
! 1728: break;
! 1729: default:
! 1730: break;
! 1731: }
! 1732: }
! 1733:
! 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");
! 1738:
! 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)
! 1743: {
! 1744: time_t uptime;
! 1745: struct tm *tm;
! 1746:
! 1747: uptime = time (NULL);
! 1748: uptime -= rib->uptime;
! 1749: tm = gmtime (&uptime);
! 1750:
! 1751: #define ONE_DAY_SECOND 60*60*24
! 1752: #define ONE_WEEK_SECOND 60*60*24*7
! 1753:
! 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);
! 1760: else
! 1761: vty_out (vty, ", %02dw%dd%02dh",
! 1762: tm->tm_yday/7,
! 1763: tm->tm_yday - ((tm->tm_yday/7) * 7), tm->tm_hour);
! 1764: }
! 1765: vty_out (vty, "%s", VTY_NEWLINE);
! 1766: }
! 1767: }
! 1768:
! 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"
! 1770:
! 1771: DEFUN (show_ipv6_route,
! 1772: show_ipv6_route_cmd,
! 1773: "show ipv6 route",
! 1774: SHOW_STR
! 1775: IP_STR
! 1776: "IPv6 routing table\n")
! 1777: {
! 1778: struct route_table *table;
! 1779: struct route_node *rn;
! 1780: struct rib *rib;
! 1781: int first = 1;
! 1782:
! 1783: table = vrf_table (AFI_IP6, SAFI_UNICAST, 0);
! 1784: if (! table)
! 1785: return CMD_SUCCESS;
! 1786:
! 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)
! 1790: {
! 1791: if (first)
! 1792: {
! 1793: vty_out (vty, SHOW_ROUTE_V6_HEADER, VTY_NEWLINE, VTY_NEWLINE, VTY_NEWLINE);
! 1794: first = 0;
! 1795: }
! 1796: vty_show_ipv6_route (vty, rn, rib);
! 1797: }
! 1798: return CMD_SUCCESS;
! 1799: }
! 1800:
! 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",
! 1804: SHOW_STR
! 1805: IP_STR
! 1806: "IPv6 routing table\n"
! 1807: "IPv6 prefix\n"
! 1808: "Show route matching the specified Network/Mask pair only\n")
! 1809: {
! 1810: struct route_table *table;
! 1811: struct route_node *rn;
! 1812: struct rib *rib;
! 1813: struct prefix p;
! 1814: int ret;
! 1815: int first = 1;
! 1816:
! 1817: table = vrf_table (AFI_IP6, SAFI_UNICAST, 0);
! 1818: if (! table)
! 1819: return CMD_SUCCESS;
! 1820:
! 1821: ret = str2prefix (argv[0], &p);
! 1822: if (! ret)
! 1823: {
! 1824: vty_out (vty, "%% Malformed Prefix%s", VTY_NEWLINE);
! 1825: return CMD_WARNING;
! 1826: }
! 1827:
! 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))
! 1832: {
! 1833: if (first)
! 1834: {
! 1835: vty_out (vty, SHOW_ROUTE_V6_HEADER, VTY_NEWLINE, VTY_NEWLINE, VTY_NEWLINE);
! 1836: first = 0;
! 1837: }
! 1838: vty_show_ipv6_route (vty, rn, rib);
! 1839: }
! 1840: return CMD_SUCCESS;
! 1841: }
! 1842:
! 1843: DEFUN (show_ipv6_route_protocol,
! 1844: show_ipv6_route_protocol_cmd,
! 1845: "show ipv6 route (bgp|connected|isis|kernel|ospf6|ripng|static)",
! 1846: SHOW_STR
! 1847: IP_STR
! 1848: "IP routing table\n"
! 1849: "Border Gateway Protocol (BGP)\n"
! 1850: "Connected\n"
! 1851: "ISO IS-IS (ISIS)\n"
! 1852: "Kernel\n"
! 1853: "Open Shortest Path First (OSPFv3)\n"
! 1854: "Routing Information Protocol (RIPng)\n"
! 1855: "Static routes\n")
! 1856: {
! 1857: int type;
! 1858: struct route_table *table;
! 1859: struct route_node *rn;
! 1860: struct rib *rib;
! 1861: int first = 1;
! 1862:
! 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;
! 1877: else
! 1878: {
! 1879: vty_out (vty, "Unknown route type%s", VTY_NEWLINE);
! 1880: return CMD_WARNING;
! 1881: }
! 1882:
! 1883: table = vrf_table (AFI_IP6, SAFI_UNICAST, 0);
! 1884: if (! table)
! 1885: return CMD_SUCCESS;
! 1886:
! 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)
! 1891: {
! 1892: if (first)
! 1893: {
! 1894: vty_out (vty, SHOW_ROUTE_V6_HEADER, VTY_NEWLINE, VTY_NEWLINE, VTY_NEWLINE);
! 1895: first = 0;
! 1896: }
! 1897: vty_show_ipv6_route (vty, rn, rib);
! 1898: }
! 1899: return CMD_SUCCESS;
! 1900: }
! 1901:
! 1902: DEFUN (show_ipv6_route_addr,
! 1903: show_ipv6_route_addr_cmd,
! 1904: "show ipv6 route X:X::X:X",
! 1905: SHOW_STR
! 1906: IP_STR
! 1907: "IPv6 routing table\n"
! 1908: "IPv6 Address\n")
! 1909: {
! 1910: int ret;
! 1911: struct prefix_ipv6 p;
! 1912: struct route_table *table;
! 1913: struct route_node *rn;
! 1914:
! 1915: ret = str2prefix_ipv6 (argv[0], &p);
! 1916: if (ret <= 0)
! 1917: {
! 1918: vty_out (vty, "Malformed IPv6 address%s", VTY_NEWLINE);
! 1919: return CMD_WARNING;
! 1920: }
! 1921:
! 1922: table = vrf_table (AFI_IP6, SAFI_UNICAST, 0);
! 1923: if (! table)
! 1924: return CMD_SUCCESS;
! 1925:
! 1926: rn = route_node_match (table, (struct prefix *) &p);
! 1927: if (! rn)
! 1928: {
! 1929: vty_out (vty, "%% Network not in table%s", VTY_NEWLINE);
! 1930: return CMD_WARNING;
! 1931: }
! 1932:
! 1933: vty_show_ipv6_route_detail (vty, rn);
! 1934:
! 1935: route_unlock_node (rn);
! 1936:
! 1937: return CMD_SUCCESS;
! 1938: }
! 1939:
! 1940: DEFUN (show_ipv6_route_prefix,
! 1941: show_ipv6_route_prefix_cmd,
! 1942: "show ipv6 route X:X::X:X/M",
! 1943: SHOW_STR
! 1944: IP_STR
! 1945: "IPv6 routing table\n"
! 1946: "IPv6 prefix\n")
! 1947: {
! 1948: int ret;
! 1949: struct prefix_ipv6 p;
! 1950: struct route_table *table;
! 1951: struct route_node *rn;
! 1952:
! 1953: ret = str2prefix_ipv6 (argv[0], &p);
! 1954: if (ret <= 0)
! 1955: {
! 1956: vty_out (vty, "Malformed IPv6 prefix%s", VTY_NEWLINE);
! 1957: return CMD_WARNING;
! 1958: }
! 1959:
! 1960: table = vrf_table (AFI_IP6, SAFI_UNICAST, 0);
! 1961: if (! table)
! 1962: return CMD_SUCCESS;
! 1963:
! 1964: rn = route_node_match (table, (struct prefix *) &p);
! 1965: if (! rn || rn->p.prefixlen != p.prefixlen)
! 1966: {
! 1967: vty_out (vty, "%% Network not in table%s", VTY_NEWLINE);
! 1968: return CMD_WARNING;
! 1969: }
! 1970:
! 1971: vty_show_ipv6_route_detail (vty, rn);
! 1972:
! 1973: route_unlock_node (rn);
! 1974:
! 1975: return CMD_SUCCESS;
! 1976: }
! 1977:
! 1978: /* Show route summary. */
! 1979: DEFUN (show_ipv6_route_summary,
! 1980: show_ipv6_route_summary_cmd,
! 1981: "show ipv6 route summary",
! 1982: SHOW_STR
! 1983: IP_STR
! 1984: "IPv6 routing table\n"
! 1985: "Summary of all IPv6 routes\n")
! 1986: {
! 1987: struct route_table *table;
! 1988:
! 1989: table = vrf_table (AFI_IP6, SAFI_UNICAST, 0);
! 1990: if (! table)
! 1991: return CMD_SUCCESS;
! 1992:
! 1993: vty_show_ip_route_summary (vty, table);
! 1994:
! 1995: return CMD_SUCCESS;
! 1996: }
! 1997:
! 1998: /* Write IPv6 static route configuration. */
! 1999: static int
! 2000: static_config_ipv6 (struct vty *vty)
! 2001: {
! 2002: struct route_node *rn;
! 2003: struct static_ipv6 *si;
! 2004: int write;
! 2005: char buf[BUFSIZ];
! 2006: struct route_table *stable;
! 2007:
! 2008: write = 0;
! 2009:
! 2010: /* Lookup table. */
! 2011: stable = vrf_static_table (AFI_IP6, SAFI_UNICAST, 0);
! 2012: if (! stable)
! 2013: return -1;
! 2014:
! 2015: for (rn = route_top (stable); rn; rn = route_next (rn))
! 2016: for (si = rn->info; si; si = si->next)
! 2017: {
! 2018: vty_out (vty, "ipv6 route %s/%d",
! 2019: inet_ntop (AF_INET6, &rn->p.u.prefix6, buf, BUFSIZ),
! 2020: rn->p.prefixlen);
! 2021:
! 2022: switch (si->type)
! 2023: {
! 2024: case STATIC_IPV6_GATEWAY:
! 2025: vty_out (vty, " %s", inet_ntop (AF_INET6, &si->ipv6, buf, BUFSIZ));
! 2026: break;
! 2027: case STATIC_IPV6_IFNAME:
! 2028: vty_out (vty, " %s", si->ifname);
! 2029: break;
! 2030: case STATIC_IPV6_GATEWAY_IFNAME:
! 2031: vty_out (vty, " %s %s",
! 2032: inet_ntop (AF_INET6, &si->ipv6, buf, BUFSIZ), si->ifname);
! 2033: break;
! 2034: }
! 2035:
! 2036: if (CHECK_FLAG(si->flags, ZEBRA_FLAG_REJECT))
! 2037: vty_out (vty, " %s", "reject");
! 2038:
! 2039: if (CHECK_FLAG(si->flags, ZEBRA_FLAG_BLACKHOLE))
! 2040: vty_out (vty, " %s", "blackhole");
! 2041:
! 2042: if (si->distance != ZEBRA_STATIC_DISTANCE_DEFAULT)
! 2043: vty_out (vty, " %d", si->distance);
! 2044: vty_out (vty, "%s", VTY_NEWLINE);
! 2045:
! 2046: write = 1;
! 2047: }
! 2048: return write;
! 2049: }
! 2050: #endif /* HAVE_IPV6 */
! 2051:
! 2052: /* Static ip route configuration write function. */
! 2053: static int
! 2054: zebra_ip_config (struct vty *vty)
! 2055: {
! 2056: int write = 0;
! 2057:
! 2058: write += static_config_ipv4 (vty);
! 2059: #ifdef HAVE_IPV6
! 2060: write += static_config_ipv6 (vty);
! 2061: #endif /* HAVE_IPV6 */
! 2062:
! 2063: return write;
! 2064: }
! 2065:
! 2066: /* ip protocol configuration write function */
! 2067: static int config_write_protocol(struct vty *vty)
! 2068: {
! 2069: int i;
! 2070:
! 2071: for (i=0;i<ZEBRA_ROUTE_MAX;i++)
! 2072: {
! 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);
! 2076: }
! 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);
! 2080:
! 2081: return 1;
! 2082: }
! 2083:
! 2084: /* table node for protocol filtering */
! 2085: static struct cmd_node protocol_node = { PROTOCOL_NODE, "", 1 };
! 2086:
! 2087: /* IP node for static routes. */
! 2088: static struct cmd_node ip_node = { IP_NODE, "", 1 };
! 2089:
! 2090: /* Route VTY. */
! 2091: void
! 2092: zebra_vty_init (void)
! 2093: {
! 2094: install_node (&ip_node, zebra_ip_config);
! 2095: install_node (&protocol_node, config_write_protocol);
! 2096:
! 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);
! 2124:
! 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);
! 2139:
! 2140: #ifdef HAVE_IPV6
! 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 */
! 2170: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>