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: #include "vrf.h"
31:
32: #include "zebra/zserv.h"
33:
34: static int do_show_ip_route(struct vty *vty, safi_t safi, vrf_id_t vrf_id);
35: static void vty_show_ip_route_detail (struct vty *vty, struct route_node *rn,
36: int mcast);
37: static void vty_show_ip_route (struct vty *vty, struct route_node *rn,
38: struct rib *rib);
39:
40: /* General function for static route. */
41: static int
42: zebra_static_ipv4_safi (struct vty *vty, safi_t safi, int add_cmd,
43: const char *dest_str, const char *mask_str,
44: const char *gate_str, const char *flag_str,
45: const char *distance_str, const char *vrf_id_str)
46: {
47: int ret;
48: u_char distance;
49: struct prefix p;
50: struct in_addr gate;
51: struct in_addr mask;
52: const char *ifname;
53: u_char flag = 0;
54: vrf_id_t vrf_id = VRF_DEFAULT;
55:
56: ret = str2prefix (dest_str, &p);
57: if (ret <= 0)
58: {
59: vty_out (vty, "%% Malformed address%s", VTY_NEWLINE);
60: return CMD_WARNING;
61: }
62:
63: /* Cisco like mask notation. */
64: if (mask_str)
65: {
66: ret = inet_aton (mask_str, &mask);
67: if (ret == 0)
68: {
69: vty_out (vty, "%% Malformed address%s", VTY_NEWLINE);
70: return CMD_WARNING;
71: }
72: p.prefixlen = ip_masklen (mask);
73: }
74:
75: /* Apply mask for given prefix. */
76: apply_mask (&p);
77:
78: /* Administrative distance. */
79: if (distance_str)
80: distance = atoi (distance_str);
81: else
82: distance = ZEBRA_STATIC_DISTANCE_DEFAULT;
83:
84: /* VRF id */
85: if (vrf_id_str)
86: VTY_GET_INTEGER ("VRF ID", vrf_id, vrf_id_str);
87:
88: /* Null0 static route. */
89: if ((gate_str != NULL) && (strncasecmp (gate_str, "Null0", strlen (gate_str)) == 0))
90: {
91: if (flag_str)
92: {
93: vty_out (vty, "%% can not have flag %s with Null0%s", flag_str, VTY_NEWLINE);
94: return CMD_WARNING;
95: }
96: if (add_cmd)
97: static_add_ipv4_safi (safi, &p, NULL, NULL, ZEBRA_FLAG_BLACKHOLE, distance, vrf_id);
98: else
99: static_delete_ipv4_safi (safi, &p, NULL, NULL, distance, vrf_id);
100: return CMD_SUCCESS;
101: }
102:
103: /* Route flags */
104: if (flag_str) {
105: switch(flag_str[0]) {
106: case 'r':
107: case 'R': /* XXX */
108: SET_FLAG (flag, ZEBRA_FLAG_REJECT);
109: break;
110: case 'b':
111: case 'B': /* XXX */
112: SET_FLAG (flag, ZEBRA_FLAG_BLACKHOLE);
113: break;
114: default:
115: vty_out (vty, "%% Malformed flag %s %s", flag_str, VTY_NEWLINE);
116: return CMD_WARNING;
117: }
118: }
119:
120: if (gate_str == NULL)
121: {
122: if (add_cmd)
123: static_add_ipv4_safi (safi, &p, NULL, NULL, flag, distance, vrf_id);
124: else
125: static_delete_ipv4_safi (safi, &p, NULL, NULL, distance, vrf_id);
126:
127: return CMD_SUCCESS;
128: }
129:
130: /* When gateway is A.B.C.D format, gate is treated as nexthop
131: address other case gate is treated as interface name. */
132: ret = inet_aton (gate_str, &gate);
133: if (ret)
134: ifname = NULL;
135: else
136: ifname = gate_str;
137:
138: if (add_cmd)
139: static_add_ipv4_safi (safi, &p, ifname ? NULL : &gate, ifname, flag, distance, vrf_id);
140: else
141: static_delete_ipv4_safi (safi, &p, ifname ? NULL : &gate, ifname, distance, vrf_id);
142:
143: return CMD_SUCCESS;
144: }
145:
146: static int
147: zebra_static_ipv4 (struct vty *vty, int add_cmd, const char *dest_str,
148: const char *mask_str, const char *gate_str,
149: const char *flag_str, const char *distance_str,
150: const char *vrf_id_str)
151: {
152: return zebra_static_ipv4_safi (vty, SAFI_UNICAST, add_cmd, dest_str, mask_str,
153: gate_str, flag_str, distance_str, vrf_id_str);
154: }
155:
156: /* Static unicast routes for multicast RPF lookup. */
157: DEFUN (ip_mroute_dist,
158: ip_mroute_dist_cmd,
159: "ip mroute A.B.C.D/M (A.B.C.D|INTERFACE) <1-255>",
160: IP_STR
161: "Configure static unicast route into MRIB for multicast RPF lookup\n"
162: "IP destination prefix (e.g. 10.0.0.0/8)\n"
163: "Nexthop address\n"
164: "Nexthop interface name\n"
165: "Distance\n")
166: {
167: VTY_WARN_EXPERIMENTAL();
168: return zebra_static_ipv4_safi(vty, SAFI_MULTICAST, 1, argv[0], NULL, argv[1],
169: NULL, argc > 2 ? argv[2] : NULL, NULL);
170: }
171:
172: ALIAS (ip_mroute_dist,
173: ip_mroute_cmd,
174: "ip mroute A.B.C.D/M (A.B.C.D|INTERFACE)",
175: IP_STR
176: "Configure static unicast route into MRIB for multicast RPF lookup\n"
177: "IP destination prefix (e.g. 10.0.0.0/8)\n"
178: "Nexthop address\n"
179: "Nexthop interface name\n")
180:
181: DEFUN (ip_mroute_dist_vrf,
182: ip_mroute_dist_vrf_cmd,
183: "ip mroute A.B.C.D/M (A.B.C.D|INTERFACE) <1-255> " VRF_CMD_STR,
184: IP_STR
185: "Configure static unicast route into MRIB for multicast RPF lookup\n"
186: "IP destination prefix (e.g. 10.0.0.0/8)\n"
187: "Nexthop address\n"
188: "Nexthop interface name\n"
189: "Distance\n"
190: VRF_CMD_HELP_STR)
191: {
192: VTY_WARN_EXPERIMENTAL();
193: return zebra_static_ipv4_safi(vty, SAFI_MULTICAST, 1, argv[0], NULL, argv[1],
194: NULL, argc > 3 ? argv[2] : NULL,
195: argc > 3 ? argv[3] : argv[2]);
196: }
197:
198: ALIAS (ip_mroute_dist_vrf,
199: ip_mroute_vrf_cmd,
200: "ip mroute A.B.C.D/M (A.B.C.D|INTERFACE) "VRF_CMD_STR,
201: IP_STR
202: "Configure static unicast route into MRIB for multicast RPF lookup\n"
203: "IP destination prefix (e.g. 10.0.0.0/8)\n"
204: "Nexthop address\n"
205: "Nexthop interface name\n"
206: VRF_CMD_HELP_STR)
207:
208: DEFUN (no_ip_mroute_dist,
209: no_ip_mroute_dist_cmd,
210: "no ip mroute A.B.C.D/M (A.B.C.D|INTERFACE) <1-255>",
211: IP_STR
212: "Configure static unicast route into MRIB for multicast RPF lookup\n"
213: "IP destination prefix (e.g. 10.0.0.0/8)\n"
214: "Nexthop address\n"
215: "Nexthop interface name\n"
216: "Distance\n")
217: {
218: VTY_WARN_EXPERIMENTAL();
219: return zebra_static_ipv4_safi(vty, SAFI_MULTICAST, 0, argv[0], NULL, argv[1],
220: NULL, argc > 2 ? argv[2] : NULL, NULL);
221: }
222:
223: ALIAS (no_ip_mroute_dist,
224: no_ip_mroute_cmd,
225: "no ip mroute A.B.C.D/M (A.B.C.D|INTERFACE)",
226: NO_STR
227: IP_STR
228: "Configure static unicast route into MRIB for multicast RPF lookup\n"
229: "IP destination prefix (e.g. 10.0.0.0/8)\n"
230: "Nexthop address\n"
231: "Nexthop interface name\n")
232:
233: DEFUN (no_ip_mroute_dist_vrf,
234: no_ip_mroute_dist_vrf_cmd,
235: "no ip mroute A.B.C.D/M (A.B.C.D|INTERFACE) <1-255> " VRF_CMD_STR,
236: IP_STR
237: "Configure static unicast route into MRIB for multicast RPF lookup\n"
238: "IP destination prefix (e.g. 10.0.0.0/8)\n"
239: "Nexthop address\n"
240: "Nexthop interface name\n"
241: "Distance\n"
242: VRF_CMD_HELP_STR)
243: {
244: VTY_WARN_EXPERIMENTAL();
245: return zebra_static_ipv4_safi(vty, SAFI_MULTICAST, 0, argv[0], NULL, argv[1],
246: NULL, argc > 3 ? argv[2] : NULL,
247: argc > 3 ? argv[3] : argv[2]);
248: }
249:
250: ALIAS (no_ip_mroute_dist_vrf,
251: no_ip_mroute_vrf_cmd,
252: "no ip mroute A.B.C.D/M (A.B.C.D|INTERFACE) " VRF_CMD_STR,
253: NO_STR
254: IP_STR
255: "Configure static unicast route into MRIB for multicast RPF lookup\n"
256: "IP destination prefix (e.g. 10.0.0.0/8)\n"
257: "Nexthop address\n"
258: "Nexthop interface name\n"
259: VRF_CMD_HELP_STR)
260:
261: DEFUN (ip_multicast_mode,
262: ip_multicast_mode_cmd,
263: "ip multicast rpf-lookup-mode (urib-only|mrib-only|mrib-then-urib|lower-distance|longer-prefix)",
264: IP_STR
265: "Multicast options\n"
266: "RPF lookup behavior\n"
267: "Lookup in unicast RIB only\n"
268: "Lookup in multicast RIB only\n"
269: "Try multicast RIB first, fall back to unicast RIB\n"
270: "Lookup both, use entry with lower distance\n"
271: "Lookup both, use entry with longer prefix\n")
272: {
273: VTY_WARN_EXPERIMENTAL();
274:
275: if (!strncmp (argv[0], "u", 1))
276: multicast_mode_ipv4_set (MCAST_URIB_ONLY);
277: else if (!strncmp (argv[0], "mrib-o", 6))
278: multicast_mode_ipv4_set (MCAST_MRIB_ONLY);
279: else if (!strncmp (argv[0], "mrib-t", 6))
280: multicast_mode_ipv4_set (MCAST_MIX_MRIB_FIRST);
281: else if (!strncmp (argv[0], "low", 3))
282: multicast_mode_ipv4_set (MCAST_MIX_DISTANCE);
283: else if (!strncmp (argv[0], "lon", 3))
284: multicast_mode_ipv4_set (MCAST_MIX_PFXLEN);
285: else
286: {
287: vty_out (vty, "Invalid mode specified%s", VTY_NEWLINE);
288: return CMD_WARNING;
289: }
290:
291: return CMD_SUCCESS;
292: }
293:
294: DEFUN (no_ip_multicast_mode,
295: no_ip_multicast_mode_cmd,
296: "no ip multicast rpf-lookup-mode (urib-only|mrib-only|mrib-then-urib|lower-distance|longer-prefix)",
297: NO_STR
298: IP_STR
299: "Multicast options\n"
300: "RPF lookup behavior\n"
301: "Lookup in unicast RIB only\n"
302: "Lookup in multicast RIB only\n"
303: "Try multicast RIB first, fall back to unicast RIB\n"
304: "Lookup both, use entry with lower distance\n"
305: "Lookup both, use entry with longer prefix\n")
306: {
307: multicast_mode_ipv4_set (MCAST_NO_CONFIG);
308: return CMD_SUCCESS;
309: }
310:
311: ALIAS (no_ip_multicast_mode,
312: no_ip_multicast_mode_noarg_cmd,
313: "no ip multicast rpf-lookup-mode",
314: NO_STR
315: IP_STR
316: "Multicast options\n"
317: "RPF lookup behavior\n")
318:
319: DEFUN (show_ip_rpf,
320: show_ip_rpf_cmd,
321: "show ip rpf",
322: SHOW_STR
323: IP_STR
324: "Display RPF information for multicast source\n")
325: {
326: vrf_id_t vrf_id = VRF_DEFAULT;
327:
328: if (argc > 0)
329: VTY_GET_INTEGER ("VRF ID", vrf_id, argv[0]);
330:
331: VTY_WARN_EXPERIMENTAL();
332: return do_show_ip_route(vty, SAFI_MULTICAST, vrf_id);
333: }
334:
335: ALIAS (show_ip_rpf,
336: show_ip_rpf_vrf_cmd,
337: "show ip rpf " VRF_CMD_STR,
338: SHOW_STR
339: IP_STR
340: "Display RPF information for multicast source\n"
341: VRF_CMD_HELP_STR)
342:
343: DEFUN (show_ip_rpf_addr,
344: show_ip_rpf_addr_cmd,
345: "show ip rpf A.B.C.D",
346: SHOW_STR
347: IP_STR
348: "Display RPF information for multicast source\n"
349: "IP multicast source address (e.g. 10.0.0.0)\n")
350: {
351: struct in_addr addr;
352: struct route_node *rn;
353: struct rib *rib;
354: vrf_id_t vrf_id = VRF_DEFAULT;
355: int ret;
356:
357: if (argc > 1)
358: VTY_GET_INTEGER ("VRF ID", vrf_id, argv[1]);
359:
360: VTY_WARN_EXPERIMENTAL();
361:
362: ret = inet_aton (argv[0], &addr);
363: if (ret == 0)
364: {
365: vty_out (vty, "%% Malformed address%s", VTY_NEWLINE);
366: return CMD_WARNING;
367: }
368:
369: rib = rib_match_ipv4_multicast (addr, &rn, vrf_id);
370:
371: if (rib)
372: vty_show_ip_route_detail (vty, rn, 1);
373: else
374: vty_out (vty, "%% No match for RPF lookup%s", VTY_NEWLINE);
375:
376: return CMD_SUCCESS;
377: }
378:
379: ALIAS (show_ip_rpf_addr,
380: show_ip_rpf_addr_vrf_cmd,
381: "show ip rpf A.B.C.D " VRF_CMD_STR,
382: SHOW_STR
383: IP_STR
384: "Display RPF information for multicast source\n"
385: "IP multicast source address (e.g. 10.0.0.0)\n"
386: VRF_CMD_HELP_STR)
387:
388: DEFUN (show_ip_rpf_vrf_all,
389: show_ip_rpf_vrf_all_cmd,
390: "show ip rpf " VRF_ALL_CMD_STR,
391: SHOW_STR
392: IP_STR
393: "Display RPF information for multicast source\n"
394: VRF_ALL_CMD_HELP_STR)
395: {
396: struct zebra_vrf *zvrf;
397: struct route_table *table;
398: struct route_node *rn;
399: struct rib *rib;
400: vrf_iter_t iter;
401: int first = 1;
402:
403: VTY_WARN_EXPERIMENTAL();
404:
405: for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
406: {
407: if ((zvrf = vrf_iter2info (iter)) == NULL ||
408: (table = zvrf->table[AFI_IP][SAFI_MULTICAST]) == NULL)
409: continue;
410:
411: /* Show all IPv4 routes. */
412: for (rn = route_top (table); rn; rn = route_next (rn))
413: RNODE_FOREACH_RIB (rn, rib)
414: {
415: if (first)
416: {
417: vty_out (vty, SHOW_ROUTE_V4_HEADER);
418: first = 0;
419: }
420: vty_show_ip_route (vty, rn, rib);
421: }
422: }
423:
424: return CMD_SUCCESS;
425: }
426:
427: DEFUN (show_ip_rpf_addr_vrf_all,
428: show_ip_rpf_addr_vrf_all_cmd,
429: "show ip rpf A.B.C.D " VRF_ALL_CMD_STR,
430: SHOW_STR
431: IP_STR
432: "Display RPF information for multicast source\n"
433: "IP multicast source address (e.g. 10.0.0.0)\n"
434: VRF_ALL_CMD_HELP_STR)
435: {
436: struct in_addr addr;
437: struct route_node *rn;
438: vrf_iter_t iter;
439: int ret;
440:
441: VTY_WARN_EXPERIMENTAL();
442:
443: ret = inet_aton (argv[0], &addr);
444: if (ret == 0)
445: {
446: vty_out (vty, "%% Malformed address%s", VTY_NEWLINE);
447: return CMD_WARNING;
448: }
449:
450: for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
451: {
452: if (rib_match_ipv4_multicast (addr, &rn, vrf_iter2id (iter)))
453: vty_show_ip_route_detail (vty, rn, 1);
454: }
455:
456: return CMD_SUCCESS;
457: }
458:
459: /* Static route configuration. */
460: DEFUN (ip_route,
461: ip_route_cmd,
462: "ip route A.B.C.D/M (A.B.C.D|INTERFACE|null0)",
463: IP_STR
464: "Establish static routes\n"
465: "IP destination prefix (e.g. 10.0.0.0/8)\n"
466: "IP gateway address\n"
467: "IP gateway interface name\n"
468: "Null interface\n")
469: {
470: return zebra_static_ipv4 (vty, 1, argv[0], NULL, argv[1], NULL, NULL,
471: NULL);
472: }
473:
474: DEFUN (ip_route_flags,
475: ip_route_flags_cmd,
476: "ip route A.B.C.D/M (A.B.C.D|INTERFACE) (reject|blackhole)",
477: IP_STR
478: "Establish static routes\n"
479: "IP destination prefix (e.g. 10.0.0.0/8)\n"
480: "IP gateway address\n"
481: "IP gateway interface name\n"
482: "Emit an ICMP unreachable when matched\n"
483: "Silently discard pkts when matched\n")
484: {
485: return zebra_static_ipv4 (vty, 1, argv[0], NULL, argv[1], argv[2], NULL,
486: NULL);
487: }
488:
489: DEFUN (ip_route_flags2,
490: ip_route_flags2_cmd,
491: "ip route A.B.C.D/M (reject|blackhole)",
492: IP_STR
493: "Establish static routes\n"
494: "IP destination prefix (e.g. 10.0.0.0/8)\n"
495: "Emit an ICMP unreachable when matched\n"
496: "Silently discard pkts when matched\n")
497: {
498: return zebra_static_ipv4 (vty, 1, argv[0], NULL, NULL, argv[1], NULL,
499: NULL);
500: }
501:
502: /* Mask as A.B.C.D format. */
503: DEFUN (ip_route_mask,
504: ip_route_mask_cmd,
505: "ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE|null0)",
506: IP_STR
507: "Establish static routes\n"
508: "IP destination prefix\n"
509: "IP destination prefix mask\n"
510: "IP gateway address\n"
511: "IP gateway interface name\n"
512: "Null interface\n")
513: {
514: return zebra_static_ipv4 (vty, 1, argv[0], argv[1], argv[2], NULL, NULL,
515: NULL);
516: }
517:
518: DEFUN (ip_route_mask_flags,
519: ip_route_mask_flags_cmd,
520: "ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE) (reject|blackhole)",
521: IP_STR
522: "Establish static routes\n"
523: "IP destination prefix\n"
524: "IP destination prefix mask\n"
525: "IP gateway address\n"
526: "IP gateway interface name\n"
527: "Emit an ICMP unreachable when matched\n"
528: "Silently discard pkts when matched\n")
529: {
530: return zebra_static_ipv4 (vty, 1, argv[0], argv[1], argv[2], argv[3], NULL,
531: NULL);
532: }
533:
534: DEFUN (ip_route_mask_flags2,
535: ip_route_mask_flags2_cmd,
536: "ip route A.B.C.D A.B.C.D (reject|blackhole)",
537: IP_STR
538: "Establish static routes\n"
539: "IP destination prefix\n"
540: "IP destination prefix mask\n"
541: "Emit an ICMP unreachable when matched\n"
542: "Silently discard pkts when matched\n")
543: {
544: return zebra_static_ipv4 (vty, 1, argv[0], argv[1], NULL, argv[2], NULL,
545: NULL);
546: }
547:
548: /* Distance option value. */
549: DEFUN (ip_route_distance,
550: ip_route_distance_cmd,
551: "ip route A.B.C.D/M (A.B.C.D|INTERFACE|null0) <1-255>",
552: IP_STR
553: "Establish static routes\n"
554: "IP destination prefix (e.g. 10.0.0.0/8)\n"
555: "IP gateway address\n"
556: "IP gateway interface name\n"
557: "Null interface\n"
558: "Distance value for this route\n")
559: {
560: return zebra_static_ipv4 (vty, 1, argv[0], NULL, argv[1], NULL, argv[2],
561: NULL);
562: }
563:
564: DEFUN (ip_route_flags_distance,
565: ip_route_flags_distance_cmd,
566: "ip route A.B.C.D/M (A.B.C.D|INTERFACE) (reject|blackhole) <1-255>",
567: IP_STR
568: "Establish static routes\n"
569: "IP destination prefix (e.g. 10.0.0.0/8)\n"
570: "IP gateway address\n"
571: "IP gateway interface name\n"
572: "Emit an ICMP unreachable when matched\n"
573: "Silently discard pkts when matched\n"
574: "Distance value for this route\n")
575: {
576: return zebra_static_ipv4 (vty, 1, argv[0], NULL, argv[1], argv[2], argv[3],
577: NULL);
578: }
579:
580: DEFUN (ip_route_flags_distance2,
581: ip_route_flags_distance2_cmd,
582: "ip route A.B.C.D/M (reject|blackhole) <1-255>",
583: IP_STR
584: "Establish static routes\n"
585: "IP destination prefix (e.g. 10.0.0.0/8)\n"
586: "Emit an ICMP unreachable when matched\n"
587: "Silently discard pkts when matched\n"
588: "Distance value for this route\n")
589: {
590: return zebra_static_ipv4 (vty, 1, argv[0], NULL, NULL, argv[1], argv[2],
591: NULL);
592: }
593:
594: DEFUN (ip_route_mask_distance,
595: ip_route_mask_distance_cmd,
596: "ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE|null0) <1-255>",
597: IP_STR
598: "Establish static routes\n"
599: "IP destination prefix\n"
600: "IP destination prefix mask\n"
601: "IP gateway address\n"
602: "IP gateway interface name\n"
603: "Null interface\n"
604: "Distance value for this route\n")
605: {
606: return zebra_static_ipv4 (vty, 1, argv[0], argv[1], argv[2], NULL, argv[3],
607: NULL);
608: }
609:
610: DEFUN (ip_route_mask_flags_distance,
611: ip_route_mask_flags_distance_cmd,
612: "ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE) (reject|blackhole) <1-255>",
613: IP_STR
614: "Establish static routes\n"
615: "IP destination prefix\n"
616: "IP destination prefix mask\n"
617: "IP gateway address\n"
618: "IP gateway interface name\n"
619: "Emit an ICMP unreachable when matched\n"
620: "Silently discard pkts when matched\n"
621: "Distance value for this route\n")
622: {
623: return zebra_static_ipv4 (vty, 1, argv[0], argv[1], argv[2], argv[3], argv[4],
624: NULL);
625: }
626:
627: DEFUN (ip_route_mask_flags_distance2,
628: ip_route_mask_flags_distance2_cmd,
629: "ip route A.B.C.D A.B.C.D (reject|blackhole) <1-255>",
630: IP_STR
631: "Establish static routes\n"
632: "IP destination prefix\n"
633: "IP destination prefix mask\n"
634: "Emit an ICMP unreachable when matched\n"
635: "Silently discard pkts when matched\n"
636: "Distance value for this route\n")
637: {
638: return zebra_static_ipv4 (vty, 1, argv[0], argv[1], NULL, argv[2], argv[3],
639: NULL);
640: }
641:
642: DEFUN (no_ip_route,
643: no_ip_route_cmd,
644: "no ip route A.B.C.D/M (A.B.C.D|INTERFACE|null0)",
645: NO_STR
646: IP_STR
647: "Establish static routes\n"
648: "IP destination prefix (e.g. 10.0.0.0/8)\n"
649: "IP gateway address\n"
650: "IP gateway interface name\n"
651: "Null interface\n")
652: {
653: return zebra_static_ipv4 (vty, 0, argv[0], NULL, argv[1], NULL, NULL,
654: NULL);
655: }
656:
657: ALIAS (no_ip_route,
658: no_ip_route_flags_cmd,
659: "no ip route A.B.C.D/M (A.B.C.D|INTERFACE) (reject|blackhole)",
660: NO_STR
661: IP_STR
662: "Establish static routes\n"
663: "IP destination prefix (e.g. 10.0.0.0/8)\n"
664: "IP gateway address\n"
665: "IP gateway interface name\n"
666: "Emit an ICMP unreachable when matched\n"
667: "Silently discard pkts when matched\n")
668:
669: DEFUN (no_ip_route_flags2,
670: no_ip_route_flags2_cmd,
671: "no ip route A.B.C.D/M (reject|blackhole)",
672: NO_STR
673: IP_STR
674: "Establish static routes\n"
675: "IP destination prefix (e.g. 10.0.0.0/8)\n"
676: "Emit an ICMP unreachable when matched\n"
677: "Silently discard pkts when matched\n")
678: {
679: return zebra_static_ipv4 (vty, 0, argv[0], NULL, NULL, NULL, NULL,
680: NULL);
681: }
682:
683: DEFUN (no_ip_route_mask,
684: no_ip_route_mask_cmd,
685: "no ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE|null0)",
686: NO_STR
687: IP_STR
688: "Establish static routes\n"
689: "IP destination prefix\n"
690: "IP destination prefix mask\n"
691: "IP gateway address\n"
692: "IP gateway interface name\n"
693: "Null interface\n")
694: {
695: return zebra_static_ipv4 (vty, 0, argv[0], argv[1], argv[2], NULL, NULL,
696: NULL);
697: }
698:
699: ALIAS (no_ip_route_mask,
700: no_ip_route_mask_flags_cmd,
701: "no ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE) (reject|blackhole)",
702: NO_STR
703: IP_STR
704: "Establish static routes\n"
705: "IP destination prefix\n"
706: "IP destination prefix mask\n"
707: "IP gateway address\n"
708: "IP gateway interface name\n"
709: "Emit an ICMP unreachable when matched\n"
710: "Silently discard pkts when matched\n")
711:
712: DEFUN (no_ip_route_mask_flags2,
713: no_ip_route_mask_flags2_cmd,
714: "no ip route A.B.C.D A.B.C.D (reject|blackhole)",
715: NO_STR
716: IP_STR
717: "Establish static routes\n"
718: "IP destination prefix\n"
719: "IP destination prefix mask\n"
720: "Emit an ICMP unreachable when matched\n"
721: "Silently discard pkts when matched\n")
722: {
723: return zebra_static_ipv4 (vty, 0, argv[0], argv[1], NULL, NULL, NULL,
724: NULL);
725: }
726:
727: DEFUN (no_ip_route_distance,
728: no_ip_route_distance_cmd,
729: "no ip route A.B.C.D/M (A.B.C.D|INTERFACE|null0) <1-255>",
730: NO_STR
731: IP_STR
732: "Establish static routes\n"
733: "IP destination prefix (e.g. 10.0.0.0/8)\n"
734: "IP gateway address\n"
735: "IP gateway interface name\n"
736: "Null interface\n"
737: "Distance value for this route\n")
738: {
739: return zebra_static_ipv4 (vty, 0, argv[0], NULL, argv[1], NULL, argv[2],
740: NULL);
741: }
742:
743: DEFUN (no_ip_route_flags_distance,
744: no_ip_route_flags_distance_cmd,
745: "no ip route A.B.C.D/M (A.B.C.D|INTERFACE) (reject|blackhole) <1-255>",
746: NO_STR
747: IP_STR
748: "Establish static routes\n"
749: "IP destination prefix (e.g. 10.0.0.0/8)\n"
750: "IP gateway address\n"
751: "IP gateway interface name\n"
752: "Emit an ICMP unreachable when matched\n"
753: "Silently discard pkts when matched\n"
754: "Distance value for this route\n")
755: {
756: return zebra_static_ipv4 (vty, 0, argv[0], NULL, argv[1], argv[2], argv[3],
757: NULL);
758: }
759:
760: DEFUN (no_ip_route_flags_distance2,
761: no_ip_route_flags_distance2_cmd,
762: "no ip route A.B.C.D/M (reject|blackhole) <1-255>",
763: NO_STR
764: IP_STR
765: "Establish static routes\n"
766: "IP destination prefix (e.g. 10.0.0.0/8)\n"
767: "Emit an ICMP unreachable when matched\n"
768: "Silently discard pkts when matched\n"
769: "Distance value for this route\n")
770: {
771: return zebra_static_ipv4 (vty, 0, argv[0], NULL, NULL, argv[1], argv[2],
772: NULL);
773: }
774:
775: DEFUN (no_ip_route_mask_distance,
776: no_ip_route_mask_distance_cmd,
777: "no ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE|null0) <1-255>",
778: NO_STR
779: IP_STR
780: "Establish static routes\n"
781: "IP destination prefix\n"
782: "IP destination prefix mask\n"
783: "IP gateway address\n"
784: "IP gateway interface name\n"
785: "Null interface\n"
786: "Distance value for this route\n")
787: {
788: return zebra_static_ipv4 (vty, 0, argv[0], argv[1], argv[2], NULL, argv[3],
789: NULL);
790: }
791:
792: DEFUN (no_ip_route_mask_flags_distance,
793: no_ip_route_mask_flags_distance_cmd,
794: "no ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE) (reject|blackhole) <1-255>",
795: NO_STR
796: IP_STR
797: "Establish static routes\n"
798: "IP destination prefix\n"
799: "IP destination prefix mask\n"
800: "IP gateway address\n"
801: "IP gateway interface name\n"
802: "Emit an ICMP unreachable when matched\n"
803: "Silently discard pkts when matched\n"
804: "Distance value for this route\n")
805: {
806: return zebra_static_ipv4 (vty, 0, argv[0], argv[1], argv[2], argv[3], argv[4],
807: NULL);
808: }
809:
810: DEFUN (no_ip_route_mask_flags_distance2,
811: no_ip_route_mask_flags_distance2_cmd,
812: "no ip route A.B.C.D A.B.C.D (reject|blackhole) <1-255>",
813: NO_STR
814: IP_STR
815: "Establish static routes\n"
816: "IP destination prefix\n"
817: "IP destination prefix mask\n"
818: "Emit an ICMP unreachable when matched\n"
819: "Silently discard pkts when matched\n"
820: "Distance value for this route\n")
821: {
822: return zebra_static_ipv4 (vty, 0, argv[0], argv[1], NULL, argv[2], argv[3],
823: NULL);
824: }
825:
826: DEFUN (ip_route_vrf,
827: ip_route_vrf_cmd,
828: "ip route A.B.C.D/M (A.B.C.D|INTERFACE|null0) " VRF_CMD_STR,
829: IP_STR
830: "Establish static routes\n"
831: "IP destination prefix (e.g. 10.0.0.0/8)\n"
832: "IP gateway address\n"
833: "IP gateway interface name\n"
834: "Null interface\n"
835: VRF_CMD_HELP_STR)
836: {
837: return zebra_static_ipv4 (vty, 1, argv[0], NULL, argv[1], NULL, NULL,
838: argv[2]);
839: }
840:
841: DEFUN (ip_route_flags_vrf,
842: ip_route_flags_vrf_cmd,
843: "ip route A.B.C.D/M (A.B.C.D|INTERFACE) (reject|blackhole) " VRF_CMD_STR,
844: IP_STR
845: "Establish static routes\n"
846: "IP destination prefix (e.g. 10.0.0.0/8)\n"
847: "IP gateway address\n"
848: "IP gateway interface name\n"
849: "Emit an ICMP unreachable when matched\n"
850: "Silently discard pkts when matched\n"
851: VRF_CMD_HELP_STR)
852: {
853: return zebra_static_ipv4 (vty, 1, argv[0], NULL, argv[1], argv[2], NULL,
854: argv[3]);
855: }
856:
857: DEFUN (ip_route_flags2_vrf,
858: ip_route_flags2_vrf_cmd,
859: "ip route A.B.C.D/M (reject|blackhole) " VRF_CMD_STR,
860: IP_STR
861: "Establish static routes\n"
862: "IP destination prefix (e.g. 10.0.0.0/8)\n"
863: "Emit an ICMP unreachable when matched\n"
864: "Silently discard pkts when matched\n"
865: VRF_CMD_HELP_STR)
866: {
867: return zebra_static_ipv4 (vty, 1, argv[0], NULL, NULL, argv[1], NULL,
868: argv[2]);
869: }
870:
871: /* Mask as A.B.C.D format. */
872: DEFUN (ip_route_mask_vrf,
873: ip_route_mask_vrf_cmd,
874: "ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE|null0) " VRF_CMD_STR,
875: IP_STR
876: "Establish static routes\n"
877: "IP destination prefix\n"
878: "IP destination prefix mask\n"
879: "IP gateway address\n"
880: "IP gateway interface name\n"
881: "Null interface\n"
882: VRF_CMD_HELP_STR)
883: {
884: return zebra_static_ipv4 (vty, 1, argv[0], argv[1], argv[2], NULL, NULL,
885: argv[3]);
886: }
887:
888: DEFUN (ip_route_mask_flags_vrf,
889: ip_route_mask_flags_vrf_cmd,
890: "ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE) (reject|blackhole) " VRF_CMD_STR,
891: IP_STR
892: "Establish static routes\n"
893: "IP destination prefix\n"
894: "IP destination prefix mask\n"
895: "IP gateway address\n"
896: "IP gateway interface name\n"
897: "Emit an ICMP unreachable when matched\n"
898: "Silently discard pkts when matched\n"
899: VRF_CMD_HELP_STR)
900: {
901: return zebra_static_ipv4 (vty, 1, argv[0], argv[1], argv[2], argv[3], NULL,
902: argv[4]);
903: }
904:
905: DEFUN (ip_route_mask_flags2_vrf,
906: ip_route_mask_flags2_vrf_cmd,
907: "ip route A.B.C.D A.B.C.D (reject|blackhole) " VRF_CMD_STR,
908: IP_STR
909: "Establish static routes\n"
910: "IP destination prefix\n"
911: "IP destination prefix mask\n"
912: "Emit an ICMP unreachable when matched\n"
913: "Silently discard pkts when matched\n"
914: VRF_CMD_HELP_STR)
915: {
916: return zebra_static_ipv4 (vty, 1, argv[0], argv[1], NULL, argv[2], NULL,
917: argv[3]);
918: }
919:
920: /* Distance option value. */
921: DEFUN (ip_route_distance_vrf,
922: ip_route_distance_vrf_cmd,
923: "ip route A.B.C.D/M (A.B.C.D|INTERFACE|null0) <1-255> " VRF_CMD_STR,
924: IP_STR
925: "Establish static routes\n"
926: "IP destination prefix (e.g. 10.0.0.0/8)\n"
927: "IP gateway address\n"
928: "IP gateway interface name\n"
929: "Null interface\n"
930: "Distance value for this route\n"
931: VRF_CMD_HELP_STR)
932: {
933: return zebra_static_ipv4 (vty, 1, argv[0], NULL, argv[1], NULL, argv[2],
934: argv[3]);
935: }
936:
937: DEFUN (ip_route_flags_distance_vrf,
938: ip_route_flags_distance_vrf_cmd,
939: "ip route A.B.C.D/M (A.B.C.D|INTERFACE) (reject|blackhole) <1-255> " VRF_CMD_STR,
940: IP_STR
941: "Establish static routes\n"
942: "IP destination prefix (e.g. 10.0.0.0/8)\n"
943: "IP gateway address\n"
944: "IP gateway interface name\n"
945: "Emit an ICMP unreachable when matched\n"
946: "Silently discard pkts when matched\n"
947: "Distance value for this route\n"
948: VRF_CMD_HELP_STR)
949: {
950: return zebra_static_ipv4 (vty, 1, argv[0], NULL, argv[1], argv[2], argv[3],
951: argv[4]);
952: }
953:
954: DEFUN (ip_route_flags_distance2_vrf,
955: ip_route_flags_distance2_vrf_cmd,
956: "ip route A.B.C.D/M (reject|blackhole) <1-255> " VRF_CMD_STR,
957: IP_STR
958: "Establish static routes\n"
959: "IP destination prefix (e.g. 10.0.0.0/8)\n"
960: "Emit an ICMP unreachable when matched\n"
961: "Silently discard pkts when matched\n"
962: "Distance value for this route\n"
963: VRF_CMD_HELP_STR)
964: {
965: return zebra_static_ipv4 (vty, 1, argv[0], NULL, NULL, argv[1], argv[2],
966: argv[3]);
967: }
968:
969: DEFUN (ip_route_mask_distance_vrf,
970: ip_route_mask_distance_vrf_cmd,
971: "ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE|null0) <1-255> " VRF_CMD_STR,
972: IP_STR
973: "Establish static routes\n"
974: "IP destination prefix\n"
975: "IP destination prefix mask\n"
976: "IP gateway address\n"
977: "IP gateway interface name\n"
978: "Null interface\n"
979: "Distance value for this route\n"
980: VRF_CMD_HELP_STR)
981: {
982: return zebra_static_ipv4 (vty, 1, argv[0], argv[1], argv[2], NULL, argv[3],
983: argv[4]);
984: }
985:
986: DEFUN (ip_route_mask_flags_distance_vrf,
987: ip_route_mask_flags_distance_vrf_cmd,
988: "ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE) (reject|blackhole) <1-255> " VRF_CMD_STR,
989: IP_STR
990: "Establish static routes\n"
991: "IP destination prefix\n"
992: "IP destination prefix mask\n"
993: "IP gateway address\n"
994: "IP gateway interface name\n"
995: "Emit an ICMP unreachable when matched\n"
996: "Silently discard pkts when matched\n"
997: "Distance value for this route\n"
998: VRF_CMD_HELP_STR)
999: {
1000: return zebra_static_ipv4 (vty, 1, argv[0], argv[1], argv[2], argv[3], argv[4],
1001: argv[5]);
1002: }
1003:
1004: DEFUN (ip_route_mask_flags_distance2_vrf,
1005: ip_route_mask_flags_distance2_vrf_cmd,
1006: "ip route A.B.C.D A.B.C.D (reject|blackhole) <1-255> " VRF_CMD_STR,
1007: IP_STR
1008: "Establish static routes\n"
1009: "IP destination prefix\n"
1010: "IP destination prefix mask\n"
1011: "Emit an ICMP unreachable when matched\n"
1012: "Silently discard pkts when matched\n"
1013: "Distance value for this route\n"
1014: VRF_CMD_HELP_STR)
1015: {
1016: return zebra_static_ipv4 (vty, 1, argv[0], argv[1], NULL, argv[2], argv[3],
1017: argv[4]);
1018: }
1019:
1020: DEFUN (no_ip_route_vrf,
1021: no_ip_route_vrf_cmd,
1022: "no ip route A.B.C.D/M (A.B.C.D|INTERFACE|null0) " VRF_CMD_STR,
1023: NO_STR
1024: IP_STR
1025: "Establish static routes\n"
1026: "IP destination prefix (e.g. 10.0.0.0/8)\n"
1027: "IP gateway address\n"
1028: "IP gateway interface name\n"
1029: "Null interface\n"
1030: VRF_CMD_HELP_STR)
1031: {
1032: return zebra_static_ipv4 (vty, 0, argv[0], NULL, argv[1], NULL, NULL,
1033: (argc > 3) ? argv[3] : argv[2]);
1034: }
1035:
1036: ALIAS (no_ip_route_vrf,
1037: no_ip_route_flags_vrf_cmd,
1038: "no ip route A.B.C.D/M (A.B.C.D|INTERFACE) (reject|blackhole) " VRF_CMD_STR,
1039: NO_STR
1040: IP_STR
1041: "Establish static routes\n"
1042: "IP destination prefix (e.g. 10.0.0.0/8)\n"
1043: "IP gateway address\n"
1044: "IP gateway interface name\n"
1045: "Emit an ICMP unreachable when matched\n"
1046: "Silently discard pkts when matched\n"
1047: VRF_CMD_HELP_STR)
1048:
1049: DEFUN (no_ip_route_flags2_vrf,
1050: no_ip_route_flags2_vrf_cmd,
1051: "no ip route A.B.C.D/M (reject|blackhole) " VRF_CMD_STR,
1052: NO_STR
1053: IP_STR
1054: "Establish static routes\n"
1055: "IP destination prefix (e.g. 10.0.0.0/8)\n"
1056: "Emit an ICMP unreachable when matched\n"
1057: "Silently discard pkts when matched\n"
1058: VRF_CMD_HELP_STR)
1059: {
1060: return zebra_static_ipv4 (vty, 0, argv[0], NULL, NULL, NULL, NULL,
1061: argv[2]);
1062: }
1063:
1064: DEFUN (no_ip_route_mask_vrf,
1065: no_ip_route_mask_vrf_cmd,
1066: "no ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE|null0) " VRF_CMD_STR,
1067: NO_STR
1068: IP_STR
1069: "Establish static routes\n"
1070: "IP destination prefix\n"
1071: "IP destination prefix mask\n"
1072: "IP gateway address\n"
1073: "IP gateway interface name\n"
1074: "Null interface\n"
1075: VRF_CMD_HELP_STR)
1076: {
1077: return zebra_static_ipv4 (vty, 0, argv[0], argv[1], argv[2], NULL, NULL,
1078: (argc > 4) ? argv[4] : argv[3]);
1079: }
1080:
1081: ALIAS (no_ip_route_mask_vrf,
1082: no_ip_route_mask_flags_vrf_cmd,
1083: "no ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE) (reject|blackhole) " VRF_CMD_STR,
1084: NO_STR
1085: IP_STR
1086: "Establish static routes\n"
1087: "IP destination prefix\n"
1088: "IP destination prefix mask\n"
1089: "IP gateway address\n"
1090: "IP gateway interface name\n"
1091: "Emit an ICMP unreachable when matched\n"
1092: "Silently discard pkts when matched\n"
1093: VRF_CMD_HELP_STR)
1094:
1095: DEFUN (no_ip_route_mask_flags2_vrf,
1096: no_ip_route_mask_flags2_vrf_cmd,
1097: "no ip route A.B.C.D A.B.C.D (reject|blackhole) " VRF_CMD_STR,
1098: NO_STR
1099: IP_STR
1100: "Establish static routes\n"
1101: "IP destination prefix\n"
1102: "IP destination prefix mask\n"
1103: "Emit an ICMP unreachable when matched\n"
1104: "Silently discard pkts when matched\n"
1105: VRF_CMD_HELP_STR)
1106: {
1107: return zebra_static_ipv4 (vty, 0, argv[0], argv[1], NULL, NULL, NULL,
1108: argv[2]);
1109: }
1110:
1111: DEFUN (no_ip_route_distance_vrf,
1112: no_ip_route_distance_vrf_cmd,
1113: "no ip route A.B.C.D/M (A.B.C.D|INTERFACE|null0) <1-255> " VRF_CMD_STR,
1114: NO_STR
1115: IP_STR
1116: "Establish static routes\n"
1117: "IP destination prefix (e.g. 10.0.0.0/8)\n"
1118: "IP gateway address\n"
1119: "IP gateway interface name\n"
1120: "Null interface\n"
1121: "Distance value for this route\n"
1122: VRF_CMD_HELP_STR)
1123: {
1124: return zebra_static_ipv4 (vty, 0, argv[0], NULL, argv[1], NULL, argv[2],
1125: argv[3]);
1126: }
1127:
1128: DEFUN (no_ip_route_flags_distance_vrf,
1129: no_ip_route_flags_distance_vrf_cmd,
1130: "no ip route A.B.C.D/M (A.B.C.D|INTERFACE) (reject|blackhole) <1-255> " VRF_CMD_STR,
1131: NO_STR
1132: IP_STR
1133: "Establish static routes\n"
1134: "IP destination prefix (e.g. 10.0.0.0/8)\n"
1135: "IP gateway address\n"
1136: "IP gateway interface name\n"
1137: "Emit an ICMP unreachable when matched\n"
1138: "Silently discard pkts when matched\n"
1139: "Distance value for this route\n"
1140: VRF_CMD_HELP_STR)
1141: {
1142: return zebra_static_ipv4 (vty, 0, argv[0], NULL, argv[1], argv[2], argv[3],
1143: argv[4]);
1144: }
1145:
1146: DEFUN (no_ip_route_flags_distance2_vrf,
1147: no_ip_route_flags_distance2_vrf_cmd,
1148: "no ip route A.B.C.D/M (reject|blackhole) <1-255> " VRF_CMD_STR,
1149: NO_STR
1150: IP_STR
1151: "Establish static routes\n"
1152: "IP destination prefix (e.g. 10.0.0.0/8)\n"
1153: "Emit an ICMP unreachable when matched\n"
1154: "Silently discard pkts when matched\n"
1155: "Distance value for this route\n"
1156: VRF_CMD_HELP_STR)
1157: {
1158: return zebra_static_ipv4 (vty, 0, argv[0], NULL, NULL, argv[1], argv[2],
1159: argv[3]);
1160: }
1161:
1162: DEFUN (no_ip_route_mask_distance_vrf,
1163: no_ip_route_mask_distance_vrf_cmd,
1164: "no ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE|null0) <1-255> " VRF_CMD_STR,
1165: NO_STR
1166: IP_STR
1167: "Establish static routes\n"
1168: "IP destination prefix\n"
1169: "IP destination prefix mask\n"
1170: "IP gateway address\n"
1171: "IP gateway interface name\n"
1172: "Null interface\n"
1173: "Distance value for this route\n"
1174: VRF_CMD_HELP_STR)
1175: {
1176: return zebra_static_ipv4 (vty, 0, argv[0], argv[1], argv[2], NULL, argv[3],
1177: argv[4]);
1178: }
1179:
1180: DEFUN (no_ip_route_mask_flags_distance_vrf,
1181: no_ip_route_mask_flags_distance_vrf_cmd,
1182: "no ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE) (reject|blackhole) <1-255> " VRF_CMD_STR,
1183: NO_STR
1184: IP_STR
1185: "Establish static routes\n"
1186: "IP destination prefix\n"
1187: "IP destination prefix mask\n"
1188: "IP gateway address\n"
1189: "IP gateway interface name\n"
1190: "Emit an ICMP unreachable when matched\n"
1191: "Silently discard pkts when matched\n"
1192: "Distance value for this route\n"
1193: VRF_CMD_HELP_STR)
1194: {
1195: return zebra_static_ipv4 (vty, 0, argv[0], argv[1], argv[2], argv[3], argv[4],
1196: argv[5]);
1197: }
1198:
1199: DEFUN (no_ip_route_mask_flags_distance2_vrf,
1200: no_ip_route_mask_flags_distance2_vrf_cmd,
1201: "no ip route A.B.C.D A.B.C.D (reject|blackhole) <1-255> " VRF_CMD_STR,
1202: NO_STR
1203: IP_STR
1204: "Establish static routes\n"
1205: "IP destination prefix\n"
1206: "IP destination prefix mask\n"
1207: "Emit an ICMP unreachable when matched\n"
1208: "Silently discard pkts when matched\n"
1209: "Distance value for this route\n"
1210: VRF_CMD_HELP_STR)
1211: {
1212: return zebra_static_ipv4 (vty, 0, argv[0], argv[1], NULL, argv[2], argv[3],
1213: argv[4]);
1214: }
1215:
1216: char *proto_rm[AFI_MAX][ZEBRA_ROUTE_MAX+1]; /* "any" == ZEBRA_ROUTE_MAX */
1217:
1218: DEFUN (ip_protocol,
1219: ip_protocol_cmd,
1220: "ip protocol PROTO route-map ROUTE-MAP",
1221: NO_STR
1222: "Apply route map to PROTO\n"
1223: "Protocol name\n"
1224: "Route map name\n")
1225: {
1226: int i;
1227:
1228: if (strcasecmp(argv[0], "any") == 0)
1229: i = ZEBRA_ROUTE_MAX;
1230: else
1231: i = proto_name2num(argv[0]);
1232: if (i < 0)
1233: {
1234: vty_out (vty, "invalid protocol name \"%s\"%s", argv[0] ? argv[0] : "",
1235: VTY_NEWLINE);
1236: return CMD_WARNING;
1237: }
1238: if (proto_rm[AFI_IP][i])
1239: XFREE (MTYPE_ROUTE_MAP_NAME, proto_rm[AFI_IP][i]);
1240: proto_rm[AFI_IP][i] = XSTRDUP (MTYPE_ROUTE_MAP_NAME, argv[1]);
1241: return CMD_SUCCESS;
1242: }
1243:
1244: DEFUN (no_ip_protocol,
1245: no_ip_protocol_cmd,
1246: "no ip protocol PROTO",
1247: NO_STR
1248: "Remove route map from PROTO\n"
1249: "Protocol name\n")
1250: {
1251: int i;
1252:
1253: if (strcasecmp(argv[0], "any") == 0)
1254: i = ZEBRA_ROUTE_MAX;
1255: else
1256: i = proto_name2num(argv[0]);
1257: if (i < 0)
1258: {
1259: vty_out (vty, "invalid protocol name \"%s\"%s", argv[0] ? argv[0] : "",
1260: VTY_NEWLINE);
1261: return CMD_WARNING;
1262: }
1263: if (proto_rm[AFI_IP][i])
1264: XFREE (MTYPE_ROUTE_MAP_NAME, proto_rm[AFI_IP][i]);
1265: proto_rm[AFI_IP][i] = NULL;
1266: return CMD_SUCCESS;
1267: }
1268:
1269: /* New RIB. Detailed information for IPv4 route. */
1270: static void
1271: vty_show_ip_route_detail (struct vty *vty, struct route_node *rn, int mcast)
1272: {
1273: struct rib *rib;
1274: struct nexthop *nexthop, *tnexthop;
1275: int recursing;
1276: char buf[PREFIX_STRLEN];
1277:
1278: RNODE_FOREACH_RIB (rn, rib)
1279: {
1280: const char *mcast_info = "";
1281: if (mcast)
1282: {
1283: rib_table_info_t *info = rn->table->info;
1284: mcast_info = (info->safi == SAFI_MULTICAST)
1285: ? " using Multicast RIB"
1286: : " using Unicast RIB";
1287: }
1288: vty_out (vty, "Routing entry for %s%s%s",
1289: prefix2str (&rn->p, buf, sizeof(buf)), mcast_info,
1290: VTY_NEWLINE);
1291: vty_out (vty, " Known via \"%s\"", zebra_route_string (rib->type));
1292: vty_out (vty, ", distance %u, metric %u", rib->distance, rib->metric);
1293: if (rib->mtu)
1294: vty_out (vty, ", mtu %u", rib->mtu);
1295: vty_out (vty, ", vrf %u", rib->vrf_id);
1296: if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_SELECTED))
1297: vty_out (vty, ", best");
1298: if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_FIB_OVERRIDE))
1299: vty_out (vty, ", fib-override");
1300: if (CHECK_FLAG (rib->status, RIB_ENTRY_SELECTED_FIB))
1301: vty_out (vty, ", fib");
1302: if (rib->refcnt)
1303: vty_out (vty, ", refcnt %ld", rib->refcnt);
1304: if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_BLACKHOLE))
1305: vty_out (vty, ", blackhole");
1306: if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_REJECT))
1307: vty_out (vty, ", reject");
1308: vty_out (vty, "%s", VTY_NEWLINE);
1309:
1310: #define ONE_DAY_SECOND 60*60*24
1311: #define ONE_WEEK_SECOND 60*60*24*7
1312: if (rib->type == ZEBRA_ROUTE_RIP
1313: || rib->type == ZEBRA_ROUTE_RIPNG
1314: || rib->type == ZEBRA_ROUTE_OSPF
1315: || rib->type == ZEBRA_ROUTE_OSPF6
1316: || rib->type == ZEBRA_ROUTE_BABEL
1317: || rib->type == ZEBRA_ROUTE_ISIS
1318: || rib->type == ZEBRA_ROUTE_BGP)
1319: {
1320: time_t uptime;
1321: struct tm *tm;
1322:
1323: uptime = time (NULL);
1324: uptime -= rib->uptime;
1325: tm = gmtime (&uptime);
1326:
1327: vty_out (vty, " Last update ");
1328:
1329: if (uptime < ONE_DAY_SECOND)
1330: vty_out (vty, "%02d:%02d:%02d",
1331: tm->tm_hour, tm->tm_min, tm->tm_sec);
1332: else if (uptime < ONE_WEEK_SECOND)
1333: vty_out (vty, "%dd%02dh%02dm",
1334: tm->tm_yday, tm->tm_hour, tm->tm_min);
1335: else
1336: vty_out (vty, "%02dw%dd%02dh",
1337: tm->tm_yday/7,
1338: tm->tm_yday - ((tm->tm_yday/7) * 7), tm->tm_hour);
1339: vty_out (vty, " ago%s", VTY_NEWLINE);
1340: }
1341:
1342: for (ALL_NEXTHOPS_RO(rib->nexthop, nexthop, tnexthop, recursing))
1343: {
1344: vty_out (vty, " %c%s",
1345: CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB) ? '*' : ' ',
1346: recursing ? " " : "");
1347:
1348: switch (nexthop->type)
1349: {
1350: case NEXTHOP_TYPE_IPV4:
1351: case NEXTHOP_TYPE_IPV4_IFINDEX:
1352: vty_out (vty, " %s", inet_ntoa (nexthop->gate.ipv4));
1353: if (nexthop->ifindex)
1354: vty_out (vty, ", via %s",
1355: ifindex2ifname_vrf (nexthop->ifindex, rib->vrf_id));
1356: break;
1357: case NEXTHOP_TYPE_IPV6:
1358: case NEXTHOP_TYPE_IPV6_IFINDEX:
1359: case NEXTHOP_TYPE_IPV6_IFNAME:
1360: vty_out (vty, " %s",
1361: inet_ntop (AF_INET6, &nexthop->gate.ipv6, buf, sizeof(buf)));
1362: if (nexthop->type == NEXTHOP_TYPE_IPV6_IFNAME)
1363: vty_out (vty, ", %s", nexthop->ifname);
1364: else if (nexthop->ifindex)
1365: vty_out (vty, ", via %s",
1366: ifindex2ifname_vrf (nexthop->ifindex, rib->vrf_id));
1367: break;
1368: case NEXTHOP_TYPE_IFINDEX:
1369: vty_out (vty, " directly connected, %s",
1370: ifindex2ifname_vrf (nexthop->ifindex, rib->vrf_id));
1371: break;
1372: case NEXTHOP_TYPE_IFNAME:
1373: vty_out (vty, " directly connected, %s", nexthop->ifname);
1374: break;
1375: case NEXTHOP_TYPE_BLACKHOLE:
1376: vty_out (vty, " directly connected, Null0");
1377: break;
1378: default:
1379: break;
1380: }
1381: if (! CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ACTIVE))
1382: vty_out (vty, " inactive");
1383:
1384: if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ONLINK))
1385: vty_out (vty, " onlink");
1386:
1387: if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_RECURSIVE))
1388: vty_out (vty, " (recursive)");
1389:
1390: switch (nexthop->type)
1391: {
1392: case NEXTHOP_TYPE_IPV4:
1393: case NEXTHOP_TYPE_IPV4_IFINDEX:
1394: case NEXTHOP_TYPE_IPV4_IFNAME:
1395: if (nexthop->src.ipv4.s_addr)
1396: {
1397: if (inet_ntop(AF_INET, &nexthop->src.ipv4, buf, sizeof buf))
1398: vty_out (vty, ", src %s", buf);
1399: }
1400: break;
1401: #ifdef HAVE_IPV6
1402: case NEXTHOP_TYPE_IPV6:
1403: case NEXTHOP_TYPE_IPV6_IFINDEX:
1404: case NEXTHOP_TYPE_IPV6_IFNAME:
1405: if (!IPV6_ADDR_SAME(&nexthop->src.ipv6, &in6addr_any))
1406: {
1407: if (inet_ntop(AF_INET6, &nexthop->src.ipv6, buf, sizeof buf))
1408: vty_out (vty, ", src %s", buf);
1409: }
1410: break;
1411: #endif /* HAVE_IPV6 */
1412: default:
1413: break;
1414: }
1415: vty_out (vty, "%s", VTY_NEWLINE);
1416: }
1417: vty_out (vty, "%s", VTY_NEWLINE);
1418: }
1419: }
1420:
1421: static void
1422: vty_show_ip_route (struct vty *vty, struct route_node *rn, struct rib *rib)
1423: {
1424: struct nexthop *nexthop, *tnexthop;
1425: int recursing;
1426: int len = 0;
1427: char buf[BUFSIZ];
1428:
1429: /* Nexthop information. */
1430: for (ALL_NEXTHOPS_RO(rib->nexthop, nexthop, tnexthop, recursing))
1431: {
1432: if (nexthop == rib->nexthop)
1433: {
1434: /* Prefix information. */
1435: len = vty_out (vty, "%c%c%c %s",
1436: zebra_route_char (rib->type),
1437: CHECK_FLAG (rib->flags, ZEBRA_FLAG_SELECTED)
1438: ? '>' : ' ',
1439: CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB)
1440: ? '*' : ' ',
1441: prefix2str (&rn->p, buf, sizeof buf));
1442:
1443: /* Distance and metric display. */
1444: if (rib->type != ZEBRA_ROUTE_CONNECT
1445: && rib->type != ZEBRA_ROUTE_KERNEL)
1446: len += vty_out (vty, " [%d/%d]", rib->distance,
1447: rib->metric);
1448:
1449: if (rib->vrf_id != VRF_DEFAULT)
1450: len += vty_out (vty, " [vrf %u]", rib->vrf_id);
1451: }
1452: else
1453: vty_out (vty, " %c%*c",
1454: CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB)
1455: ? '*' : ' ',
1456: len - 3 + (2 * recursing), ' ');
1457:
1458: switch (nexthop->type)
1459: {
1460: case NEXTHOP_TYPE_IPV4:
1461: case NEXTHOP_TYPE_IPV4_IFINDEX:
1462: vty_out (vty, " via %s", inet_ntoa (nexthop->gate.ipv4));
1463: if (nexthop->ifindex)
1464: vty_out (vty, ", %s",
1465: ifindex2ifname_vrf (nexthop->ifindex, rib->vrf_id));
1466: break;
1467: case NEXTHOP_TYPE_IPV6:
1468: case NEXTHOP_TYPE_IPV6_IFINDEX:
1469: case NEXTHOP_TYPE_IPV6_IFNAME:
1470: vty_out (vty, " via %s",
1471: inet_ntop (AF_INET6, &nexthop->gate.ipv6, buf, BUFSIZ));
1472: if (nexthop->type == NEXTHOP_TYPE_IPV6_IFNAME)
1473: vty_out (vty, ", %s", nexthop->ifname);
1474: else if (nexthop->ifindex)
1475: vty_out (vty, ", %s",
1476: ifindex2ifname_vrf (nexthop->ifindex, rib->vrf_id));
1477: break;
1478: case NEXTHOP_TYPE_IFINDEX:
1479: vty_out (vty, " is directly connected, %s",
1480: ifindex2ifname_vrf (nexthop->ifindex, rib->vrf_id));
1481: break;
1482: case NEXTHOP_TYPE_IFNAME:
1483: vty_out (vty, " is directly connected, %s", nexthop->ifname);
1484: break;
1485: case NEXTHOP_TYPE_BLACKHOLE:
1486: vty_out (vty, " is directly connected, Null0");
1487: break;
1488: default:
1489: break;
1490: }
1491: if (! CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ACTIVE))
1492: vty_out (vty, " inactive");
1493:
1494: if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ONLINK))
1495: vty_out (vty, " onlink");
1496:
1497: if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_RECURSIVE))
1498: vty_out (vty, " (recursive)");
1499:
1500: switch (nexthop->type)
1501: {
1502: case NEXTHOP_TYPE_IPV4:
1503: case NEXTHOP_TYPE_IPV4_IFINDEX:
1504: case NEXTHOP_TYPE_IPV4_IFNAME:
1505: if (nexthop->src.ipv4.s_addr)
1506: {
1507: if (inet_ntop(AF_INET, &nexthop->src.ipv4, buf, sizeof buf))
1508: vty_out (vty, ", src %s", buf);
1509: }
1510: break;
1511: #ifdef HAVE_IPV6
1512: case NEXTHOP_TYPE_IPV6:
1513: case NEXTHOP_TYPE_IPV6_IFINDEX:
1514: case NEXTHOP_TYPE_IPV6_IFNAME:
1515: if (!IPV6_ADDR_SAME(&nexthop->src.ipv6, &in6addr_any))
1516: {
1517: if (inet_ntop(AF_INET6, &nexthop->src.ipv6, buf, sizeof buf))
1518: vty_out (vty, ", src %s", buf);
1519: }
1520: break;
1521: #endif /* HAVE_IPV6 */
1522: default:
1523: break;
1524: }
1525:
1526: if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_BLACKHOLE))
1527: vty_out (vty, ", bh");
1528: if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_REJECT))
1529: vty_out (vty, ", rej");
1530:
1531: if (rib->type == ZEBRA_ROUTE_RIP
1532: || rib->type == ZEBRA_ROUTE_RIPNG
1533: || rib->type == ZEBRA_ROUTE_OSPF
1534: || rib->type == ZEBRA_ROUTE_OSPF6
1535: || rib->type == ZEBRA_ROUTE_BABEL
1536: || rib->type == ZEBRA_ROUTE_ISIS
1537: || rib->type == ZEBRA_ROUTE_BGP)
1538: {
1539: time_t uptime;
1540: struct tm *tm;
1541:
1542: uptime = time (NULL);
1543: uptime -= rib->uptime;
1544: tm = gmtime (&uptime);
1545:
1546: #define ONE_DAY_SECOND 60*60*24
1547: #define ONE_WEEK_SECOND 60*60*24*7
1548:
1549: if (uptime < ONE_DAY_SECOND)
1550: vty_out (vty, ", %02d:%02d:%02d",
1551: tm->tm_hour, tm->tm_min, tm->tm_sec);
1552: else if (uptime < ONE_WEEK_SECOND)
1553: vty_out (vty, ", %dd%02dh%02dm",
1554: tm->tm_yday, tm->tm_hour, tm->tm_min);
1555: else
1556: vty_out (vty, ", %02dw%dd%02dh",
1557: tm->tm_yday/7,
1558: tm->tm_yday - ((tm->tm_yday/7) * 7), tm->tm_hour);
1559: }
1560: vty_out (vty, "%s", VTY_NEWLINE);
1561: }
1562: }
1563:
1564: DEFUN (show_ip_route,
1565: show_ip_route_cmd,
1566: "show ip route",
1567: SHOW_STR
1568: IP_STR
1569: "IP routing table\n")
1570: {
1571: vrf_id_t vrf_id = VRF_DEFAULT;
1572:
1573: if (argc > 0)
1574: VTY_GET_INTEGER ("VRF ID", vrf_id, argv[0]);
1575:
1576: return do_show_ip_route(vty, SAFI_UNICAST, vrf_id);
1577: }
1578:
1579: static int do_show_ip_route(struct vty *vty, safi_t safi, vrf_id_t vrf_id)
1580: {
1581: struct route_table *table;
1582: struct route_node *rn;
1583: struct rib *rib;
1584: int first = 1;
1585:
1586: table = zebra_vrf_table (AFI_IP, safi, vrf_id);
1587: if (! table)
1588: return CMD_SUCCESS;
1589:
1590: /* Show all IPv4 routes. */
1591: for (rn = route_top (table); rn; rn = route_next (rn))
1592: RNODE_FOREACH_RIB (rn, rib)
1593: {
1594: if (first)
1595: {
1596: vty_out (vty, SHOW_ROUTE_V4_HEADER);
1597: first = 0;
1598: }
1599: vty_show_ip_route (vty, rn, rib);
1600: }
1601: return CMD_SUCCESS;
1602: }
1603:
1604: ALIAS (show_ip_route,
1605: show_ip_route_vrf_cmd,
1606: "show ip route " VRF_CMD_STR,
1607: SHOW_STR
1608: IP_STR
1609: "IP routing table\n"
1610: VRF_CMD_HELP_STR)
1611:
1612: DEFUN (show_ip_route_prefix_longer,
1613: show_ip_route_prefix_longer_cmd,
1614: "show ip route A.B.C.D/M longer-prefixes",
1615: SHOW_STR
1616: IP_STR
1617: "IP routing table\n"
1618: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1619: "Show route matching the specified Network/Mask pair only\n")
1620: {
1621: struct route_table *table;
1622: struct route_node *rn;
1623: struct rib *rib;
1624: struct prefix p;
1625: int ret;
1626: int first = 1;
1627: vrf_id_t vrf_id = VRF_DEFAULT;
1628:
1629: ret = str2prefix (argv[0], &p);
1630: if (! ret)
1631: {
1632: vty_out (vty, "%% Malformed Prefix%s", VTY_NEWLINE);
1633: return CMD_WARNING;
1634: }
1635:
1636: if (argc > 1)
1637: VTY_GET_INTEGER ("VRF ID", vrf_id, argv[1]);
1638:
1639: table = zebra_vrf_table (AFI_IP, SAFI_UNICAST, vrf_id);
1640: if (! table)
1641: return CMD_SUCCESS;
1642:
1643: /* Show matched type IPv4 routes. */
1644: for (rn = route_top (table); rn; rn = route_next (rn))
1645: RNODE_FOREACH_RIB (rn, rib)
1646: if (prefix_match (&p, &rn->p))
1647: {
1648: if (first)
1649: {
1650: vty_out (vty, SHOW_ROUTE_V4_HEADER);
1651: first = 0;
1652: }
1653: vty_show_ip_route (vty, rn, rib);
1654: }
1655: return CMD_SUCCESS;
1656: }
1657:
1658: ALIAS (show_ip_route_prefix_longer,
1659: show_ip_route_prefix_longer_vrf_cmd,
1660: "show ip route A.B.C.D/M longer-prefixes " VRF_CMD_STR,
1661: SHOW_STR
1662: IP_STR
1663: "IP routing table\n"
1664: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1665: "Show route matching the specified Network/Mask pair only\n"
1666: VRF_CMD_HELP_STR)
1667:
1668: DEFUN (show_ip_route_supernets,
1669: show_ip_route_supernets_cmd,
1670: "show ip route supernets-only",
1671: SHOW_STR
1672: IP_STR
1673: "IP routing table\n"
1674: "Show supernet entries only\n")
1675: {
1676: struct route_table *table;
1677: struct route_node *rn;
1678: struct rib *rib;
1679: u_int32_t addr;
1680: int first = 1;
1681: vrf_id_t vrf_id = VRF_DEFAULT;
1682:
1683: if (argc > 0)
1684: VTY_GET_INTEGER ("VRF ID", vrf_id, argv[0]);
1685:
1686: table = zebra_vrf_table (AFI_IP, SAFI_UNICAST, vrf_id);
1687: if (! table)
1688: return CMD_SUCCESS;
1689:
1690: /* Show matched type IPv4 routes. */
1691: for (rn = route_top (table); rn; rn = route_next (rn))
1692: RNODE_FOREACH_RIB (rn, rib)
1693: {
1694: addr = ntohl (rn->p.u.prefix4.s_addr);
1695:
1696: if ((IN_CLASSC (addr) && rn->p.prefixlen < 24)
1697: || (IN_CLASSB (addr) && rn->p.prefixlen < 16)
1698: || (IN_CLASSA (addr) && rn->p.prefixlen < 8))
1699: {
1700: if (first)
1701: {
1702: vty_out (vty, SHOW_ROUTE_V4_HEADER);
1703: first = 0;
1704: }
1705: vty_show_ip_route (vty, rn, rib);
1706: }
1707: }
1708: return CMD_SUCCESS;
1709: }
1710:
1711: ALIAS (show_ip_route_supernets,
1712: show_ip_route_supernets_vrf_cmd,
1713: "show ip route supernets-only " VRF_CMD_STR,
1714: SHOW_STR
1715: IP_STR
1716: "IP routing table\n"
1717: "Show supernet entries only\n"
1718: VRF_CMD_HELP_STR)
1719:
1720: DEFUN (show_ip_route_protocol,
1721: show_ip_route_protocol_cmd,
1722: "show ip route " QUAGGA_IP_REDIST_STR_ZEBRA,
1723: SHOW_STR
1724: IP_STR
1725: "IP routing table\n"
1726: QUAGGA_IP_REDIST_HELP_STR_ZEBRA)
1727: {
1728: int type;
1729: struct route_table *table;
1730: struct route_node *rn;
1731: struct rib *rib;
1732: int first = 1;
1733: vrf_id_t vrf_id = VRF_DEFAULT;
1734:
1735: type = proto_redistnum (AFI_IP, argv[0]);
1736: if (type < 0)
1737: {
1738: vty_out (vty, "Unknown route type%s", VTY_NEWLINE);
1739: return CMD_WARNING;
1740: }
1741:
1742: if (argc > 1)
1743: VTY_GET_INTEGER ("VRF ID", vrf_id, argv[1]);
1744:
1745: table = zebra_vrf_table (AFI_IP, SAFI_UNICAST, vrf_id);
1746: if (! table)
1747: return CMD_SUCCESS;
1748:
1749: /* Show matched type IPv4 routes. */
1750: for (rn = route_top (table); rn; rn = route_next (rn))
1751: RNODE_FOREACH_RIB (rn, rib)
1752: if (rib->type == type)
1753: {
1754: if (first)
1755: {
1756: vty_out (vty, SHOW_ROUTE_V4_HEADER);
1757: first = 0;
1758: }
1759: vty_show_ip_route (vty, rn, rib);
1760: }
1761: return CMD_SUCCESS;
1762: }
1763:
1764: ALIAS (show_ip_route_protocol,
1765: show_ip_route_protocol_vrf_cmd,
1766: "show ip route " QUAGGA_IP_REDIST_STR_ZEBRA " " VRF_CMD_STR,
1767: SHOW_STR
1768: IP_STR
1769: "IP routing table\n"
1770: QUAGGA_IP_REDIST_HELP_STR_ZEBRA
1771: VRF_CMD_HELP_STR)
1772:
1773: DEFUN (show_ip_route_addr,
1774: show_ip_route_addr_cmd,
1775: "show ip route A.B.C.D",
1776: SHOW_STR
1777: IP_STR
1778: "IP routing table\n"
1779: "Network in the IP routing table to display\n")
1780: {
1781: int ret;
1782: struct prefix_ipv4 p;
1783: struct route_table *table;
1784: struct route_node *rn;
1785: vrf_id_t vrf_id = VRF_DEFAULT;
1786:
1787: ret = str2prefix_ipv4 (argv[0], &p);
1788: if (ret <= 0)
1789: {
1790: vty_out (vty, "%% Malformed IPv4 address%s", VTY_NEWLINE);
1791: return CMD_WARNING;
1792: }
1793:
1794: if (argc > 1)
1795: VTY_GET_INTEGER ("VRF ID", vrf_id, argv[1]);
1796:
1797: table = zebra_vrf_table (AFI_IP, SAFI_UNICAST, vrf_id);
1798: if (! table)
1799: return CMD_SUCCESS;
1800:
1801: rn = route_node_match (table, (struct prefix *) &p);
1802: if (! rn)
1803: {
1804: vty_out (vty, "%% Network not in table%s", VTY_NEWLINE);
1805: return CMD_WARNING;
1806: }
1807:
1808: vty_show_ip_route_detail (vty, rn, 0);
1809:
1810: route_unlock_node (rn);
1811:
1812: return CMD_SUCCESS;
1813: }
1814:
1815: ALIAS (show_ip_route_addr,
1816: show_ip_route_addr_vrf_cmd,
1817: "show ip route A.B.C.D " VRF_CMD_STR,
1818: SHOW_STR
1819: IP_STR
1820: "IP routing table\n"
1821: "Network in the IP routing table to display\n"
1822: VRF_CMD_HELP_STR)
1823:
1824: DEFUN (show_ip_route_prefix,
1825: show_ip_route_prefix_cmd,
1826: "show ip route A.B.C.D/M",
1827: SHOW_STR
1828: IP_STR
1829: "IP routing table\n"
1830: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
1831: {
1832: int ret;
1833: struct prefix_ipv4 p;
1834: struct route_table *table;
1835: struct route_node *rn;
1836: vrf_id_t vrf_id = VRF_DEFAULT;
1837:
1838: ret = str2prefix_ipv4 (argv[0], &p);
1839: if (ret <= 0)
1840: {
1841: vty_out (vty, "%% Malformed IPv4 address%s", VTY_NEWLINE);
1842: return CMD_WARNING;
1843: }
1844:
1845: if (argc > 1)
1846: VTY_GET_INTEGER ("VRF ID", vrf_id, argv[1]);
1847:
1848: table = zebra_vrf_table (AFI_IP, SAFI_UNICAST, vrf_id);
1849: if (! table)
1850: return CMD_SUCCESS;
1851:
1852: rn = route_node_match (table, (struct prefix *) &p);
1853: if (! rn || rn->p.prefixlen != p.prefixlen)
1854: {
1855: vty_out (vty, "%% Network not in table%s", VTY_NEWLINE);
1856: if (rn)
1857: route_unlock_node (rn);
1858: return CMD_WARNING;
1859: }
1860:
1861: vty_show_ip_route_detail (vty, rn, 0);
1862:
1863: route_unlock_node (rn);
1864:
1865: return CMD_SUCCESS;
1866: }
1867:
1868: ALIAS (show_ip_route_prefix,
1869: show_ip_route_prefix_vrf_cmd,
1870: "show ip route A.B.C.D/M " VRF_CMD_STR,
1871: SHOW_STR
1872: IP_STR
1873: "IP routing table\n"
1874: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
1875: VRF_CMD_HELP_STR)
1876:
1877: static void
1878: vty_show_ip_route_summary (struct vty *vty, struct route_table *table)
1879: {
1880: struct route_node *rn;
1881: struct rib *rib;
1882: struct nexthop *nexthop;
1883: #define ZEBRA_ROUTE_IBGP ZEBRA_ROUTE_MAX
1884: #define ZEBRA_ROUTE_TOTAL (ZEBRA_ROUTE_IBGP + 1)
1885: u_int32_t rib_cnt[ZEBRA_ROUTE_TOTAL + 1];
1886: u_int32_t fib_cnt[ZEBRA_ROUTE_TOTAL + 1];
1887: u_int32_t i;
1888:
1889: memset (&rib_cnt, 0, sizeof(rib_cnt));
1890: memset (&fib_cnt, 0, sizeof(fib_cnt));
1891: for (rn = route_top (table); rn; rn = route_next (rn))
1892: RNODE_FOREACH_RIB (rn, rib)
1893: for (nexthop = rib->nexthop; nexthop; nexthop = nexthop->next)
1894: {
1895: rib_cnt[ZEBRA_ROUTE_TOTAL]++;
1896: rib_cnt[rib->type]++;
1897: if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB)
1898: || nexthop_has_fib_child(nexthop))
1899: {
1900: fib_cnt[ZEBRA_ROUTE_TOTAL]++;
1901: fib_cnt[rib->type]++;
1902: }
1903: if (rib->type == ZEBRA_ROUTE_BGP &&
1904: CHECK_FLAG (rib->flags, ZEBRA_FLAG_IBGP))
1905: {
1906: rib_cnt[ZEBRA_ROUTE_IBGP]++;
1907: if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB)
1908: || nexthop_has_fib_child(nexthop))
1909: fib_cnt[ZEBRA_ROUTE_IBGP]++;
1910: }
1911: }
1912:
1913: vty_out (vty, "%-20s %-20s %s (vrf %u)%s",
1914: "Route Source", "Routes", "FIB",
1915: ((rib_table_info_t *)table->info)->zvrf->vrf_id,
1916: VTY_NEWLINE);
1917:
1918: for (i = 0; i < ZEBRA_ROUTE_MAX; i++)
1919: {
1920: if (rib_cnt[i] > 0)
1921: {
1922: if (i == ZEBRA_ROUTE_BGP)
1923: {
1924: vty_out (vty, "%-20s %-20d %-20d %s", "ebgp",
1925: rib_cnt[ZEBRA_ROUTE_BGP] - rib_cnt[ZEBRA_ROUTE_IBGP],
1926: fib_cnt[ZEBRA_ROUTE_BGP] - fib_cnt[ZEBRA_ROUTE_IBGP],
1927: VTY_NEWLINE);
1928: vty_out (vty, "%-20s %-20d %-20d %s", "ibgp",
1929: rib_cnt[ZEBRA_ROUTE_IBGP], fib_cnt[ZEBRA_ROUTE_IBGP],
1930: VTY_NEWLINE);
1931: }
1932: else
1933: vty_out (vty, "%-20s %-20d %-20d %s", zebra_route_string(i),
1934: rib_cnt[i], fib_cnt[i], VTY_NEWLINE);
1935: }
1936: }
1937:
1938: vty_out (vty, "------%s", VTY_NEWLINE);
1939: vty_out (vty, "%-20s %-20d %-20d %s", "Totals", rib_cnt[ZEBRA_ROUTE_TOTAL],
1940: fib_cnt[ZEBRA_ROUTE_TOTAL], VTY_NEWLINE);
1941: vty_out (vty, "%s", VTY_NEWLINE);
1942: }
1943:
1944: /*
1945: * Implementation of the ip route summary prefix command.
1946: *
1947: * This command prints the primary prefixes that have been installed by various
1948: * protocols on the box.
1949: *
1950: */
1951: static void
1952: vty_show_ip_route_summary_prefix (struct vty *vty, struct route_table *table)
1953: {
1954: struct route_node *rn;
1955: struct rib *rib;
1956: struct nexthop *nexthop;
1957: #define ZEBRA_ROUTE_IBGP ZEBRA_ROUTE_MAX
1958: #define ZEBRA_ROUTE_TOTAL (ZEBRA_ROUTE_IBGP + 1)
1959: u_int32_t rib_cnt[ZEBRA_ROUTE_TOTAL + 1];
1960: u_int32_t fib_cnt[ZEBRA_ROUTE_TOTAL + 1];
1961: u_int32_t i;
1962: int cnt;
1963:
1964: memset (&rib_cnt, 0, sizeof(rib_cnt));
1965: memset (&fib_cnt, 0, sizeof(fib_cnt));
1966: for (rn = route_top (table); rn; rn = route_next (rn))
1967: RNODE_FOREACH_RIB (rn, rib)
1968: {
1969:
1970: /*
1971: * In case of ECMP, count only once.
1972: */
1973: cnt = 0;
1974: for (nexthop = rib->nexthop; (!cnt && nexthop); nexthop = nexthop->next)
1975: {
1976: cnt++;
1977: rib_cnt[ZEBRA_ROUTE_TOTAL]++;
1978: rib_cnt[rib->type]++;
1979: if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB))
1980: {
1981: fib_cnt[ZEBRA_ROUTE_TOTAL]++;
1982: fib_cnt[rib->type]++;
1983: }
1984: if (rib->type == ZEBRA_ROUTE_BGP &&
1985: CHECK_FLAG (rib->flags, ZEBRA_FLAG_IBGP))
1986: {
1987: rib_cnt[ZEBRA_ROUTE_IBGP]++;
1988: if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB))
1989: fib_cnt[ZEBRA_ROUTE_IBGP]++;
1990: }
1991: }
1992: }
1993:
1994: vty_out (vty, "%-20s %-20s %s (vrf %u)%s",
1995: "Route Source", "Prefix Routes", "FIB",
1996: ((rib_table_info_t *)table->info)->zvrf->vrf_id,
1997: VTY_NEWLINE);
1998:
1999: for (i = 0; i < ZEBRA_ROUTE_MAX; i++)
2000: {
2001: if (rib_cnt[i] > 0)
2002: {
2003: if (i == ZEBRA_ROUTE_BGP)
2004: {
2005: vty_out (vty, "%-20s %-20d %-20d %s", "ebgp",
2006: rib_cnt[ZEBRA_ROUTE_BGP] - rib_cnt[ZEBRA_ROUTE_IBGP],
2007: fib_cnt[ZEBRA_ROUTE_BGP] - fib_cnt[ZEBRA_ROUTE_IBGP],
2008: VTY_NEWLINE);
2009: vty_out (vty, "%-20s %-20d %-20d %s", "ibgp",
2010: rib_cnt[ZEBRA_ROUTE_IBGP], fib_cnt[ZEBRA_ROUTE_IBGP],
2011: VTY_NEWLINE);
2012: }
2013: else
2014: vty_out (vty, "%-20s %-20d %-20d %s", zebra_route_string(i),
2015: rib_cnt[i], fib_cnt[i], VTY_NEWLINE);
2016: }
2017: }
2018:
2019: vty_out (vty, "------%s", VTY_NEWLINE);
2020: vty_out (vty, "%-20s %-20d %-20d %s", "Totals", rib_cnt[ZEBRA_ROUTE_TOTAL],
2021: fib_cnt[ZEBRA_ROUTE_TOTAL], VTY_NEWLINE);
2022: vty_out (vty, "%s", VTY_NEWLINE);
2023: }
2024:
2025: /* Show route summary. */
2026: DEFUN (show_ip_route_summary,
2027: show_ip_route_summary_cmd,
2028: "show ip route summary",
2029: SHOW_STR
2030: IP_STR
2031: "IP routing table\n"
2032: "Summary of all routes\n")
2033: {
2034: struct route_table *table;
2035: vrf_id_t vrf_id = VRF_DEFAULT;
2036:
2037: if (argc > 0)
2038: VTY_GET_INTEGER ("VRF ID", vrf_id, argv[0]);
2039:
2040: table = zebra_vrf_table (AFI_IP, SAFI_UNICAST, vrf_id);
2041: if (! table)
2042: return CMD_SUCCESS;
2043:
2044: vty_show_ip_route_summary (vty, table);
2045:
2046: return CMD_SUCCESS;
2047: }
2048:
2049: ALIAS (show_ip_route_summary,
2050: show_ip_route_summary_vrf_cmd,
2051: "show ip route summary " VRF_CMD_STR,
2052: SHOW_STR
2053: IP_STR
2054: "IP routing table\n"
2055: "Summary of all routes\n"
2056: VRF_CMD_HELP_STR)
2057:
2058: /* Show route summary prefix. */
2059: DEFUN (show_ip_route_summary_prefix,
2060: show_ip_route_summary_prefix_cmd,
2061: "show ip route summary prefix",
2062: SHOW_STR
2063: IP_STR
2064: "IP routing table\n"
2065: "Summary of all routes\n"
2066: "Prefix routes\n")
2067: {
2068: struct route_table *table;
2069: vrf_id_t vrf_id = VRF_DEFAULT;
2070:
2071: if (argc > 0)
2072: VTY_GET_INTEGER ("VRF ID", vrf_id, argv[0]);
2073:
2074: table = zebra_vrf_table (AFI_IP, SAFI_UNICAST, vrf_id);
2075: if (! table)
2076: return CMD_SUCCESS;
2077:
2078: vty_show_ip_route_summary_prefix (vty, table);
2079:
2080: return CMD_SUCCESS;
2081: }
2082:
2083: ALIAS (show_ip_route_summary_prefix,
2084: show_ip_route_summary_prefix_vrf_cmd,
2085: "show ip route summary prefix " VRF_CMD_STR,
2086: SHOW_STR
2087: IP_STR
2088: "IP routing table\n"
2089: "Summary of all routes\n"
2090: "Prefix routes\n"
2091: VRF_CMD_HELP_STR)
2092:
2093: DEFUN (show_ip_route_vrf_all,
2094: show_ip_route_vrf_all_cmd,
2095: "show ip route " VRF_ALL_CMD_STR,
2096: SHOW_STR
2097: IP_STR
2098: "IP routing table\n"
2099: VRF_ALL_CMD_HELP_STR)
2100: {
2101: struct route_table *table;
2102: struct route_node *rn;
2103: struct rib *rib;
2104: struct zebra_vrf *zvrf;
2105: vrf_iter_t iter;
2106: int first = 1;
2107:
2108: for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
2109: {
2110: if ((zvrf = vrf_iter2info (iter)) == NULL ||
2111: (table = zvrf->table[AFI_IP][SAFI_UNICAST]) == NULL)
2112: continue;
2113:
2114: /* Show all IPv4 routes. */
2115: for (rn = route_top (table); rn; rn = route_next (rn))
2116: RNODE_FOREACH_RIB (rn, rib)
2117: {
2118: if (first)
2119: {
2120: vty_out (vty, SHOW_ROUTE_V4_HEADER);
2121: first = 0;
2122: }
2123: vty_show_ip_route (vty, rn, rib);
2124: }
2125: }
2126:
2127: return CMD_SUCCESS;
2128: }
2129:
2130: DEFUN (show_ip_route_prefix_longer_vrf_all,
2131: show_ip_route_prefix_longer_vrf_all_cmd,
2132: "show ip route A.B.C.D/M longer-prefixes " VRF_ALL_CMD_STR,
2133: SHOW_STR
2134: IP_STR
2135: "IP routing table\n"
2136: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
2137: "Show route matching the specified Network/Mask pair only\n"
2138: VRF_ALL_CMD_HELP_STR)
2139: {
2140: struct route_table *table;
2141: struct route_node *rn;
2142: struct rib *rib;
2143: struct prefix p;
2144: struct zebra_vrf *zvrf;
2145: vrf_iter_t iter;
2146: int ret;
2147: int first = 1;
2148:
2149: ret = str2prefix (argv[0], &p);
2150: if (! ret)
2151: {
2152: vty_out (vty, "%% Malformed Prefix%s", VTY_NEWLINE);
2153: return CMD_WARNING;
2154: }
2155:
2156: for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
2157: {
2158: if ((zvrf = vrf_iter2info (iter)) == NULL ||
2159: (table = zvrf->table[AFI_IP][SAFI_UNICAST]) == NULL)
2160: continue;
2161:
2162: /* Show matched type IPv4 routes. */
2163: for (rn = route_top (table); rn; rn = route_next (rn))
2164: RNODE_FOREACH_RIB (rn, rib)
2165: if (prefix_match (&p, &rn->p))
2166: {
2167: if (first)
2168: {
2169: vty_out (vty, SHOW_ROUTE_V4_HEADER);
2170: first = 0;
2171: }
2172: vty_show_ip_route (vty, rn, rib);
2173: }
2174: }
2175:
2176: return CMD_SUCCESS;
2177: }
2178:
2179: DEFUN (show_ip_route_supernets_vrf_all,
2180: show_ip_route_supernets_vrf_all_cmd,
2181: "show ip route supernets-only " VRF_ALL_CMD_STR,
2182: SHOW_STR
2183: IP_STR
2184: "IP routing table\n"
2185: "Show supernet entries only\n"
2186: VRF_ALL_CMD_HELP_STR)
2187: {
2188: struct route_table *table;
2189: struct route_node *rn;
2190: struct rib *rib;
2191: struct zebra_vrf *zvrf;
2192: vrf_iter_t iter;
2193: u_int32_t addr;
2194: int first = 1;
2195:
2196: for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
2197: {
2198: if ((zvrf = vrf_iter2info (iter)) == NULL ||
2199: (table = zvrf->table[AFI_IP][SAFI_UNICAST]) == NULL)
2200: continue;
2201:
2202: /* Show matched type IPv4 routes. */
2203: for (rn = route_top (table); rn; rn = route_next (rn))
2204: RNODE_FOREACH_RIB (rn, rib)
2205: {
2206: addr = ntohl (rn->p.u.prefix4.s_addr);
2207:
2208: if ((IN_CLASSC (addr) && rn->p.prefixlen < 24)
2209: || (IN_CLASSB (addr) && rn->p.prefixlen < 16)
2210: || (IN_CLASSA (addr) && rn->p.prefixlen < 8))
2211: {
2212: if (first)
2213: {
2214: vty_out (vty, SHOW_ROUTE_V4_HEADER);
2215: first = 0;
2216: }
2217: vty_show_ip_route (vty, rn, rib);
2218: }
2219: }
2220: }
2221:
2222: return CMD_SUCCESS;
2223: }
2224:
2225: DEFUN (show_ip_route_protocol_vrf_all,
2226: show_ip_route_protocol_vrf_all_cmd,
2227: "show ip route " QUAGGA_IP_REDIST_STR_ZEBRA " " VRF_ALL_CMD_STR,
2228: SHOW_STR
2229: IP_STR
2230: "IP routing table\n"
2231: QUAGGA_IP_REDIST_HELP_STR_ZEBRA
2232: VRF_ALL_CMD_HELP_STR)
2233: {
2234: int type;
2235: struct route_table *table;
2236: struct route_node *rn;
2237: struct rib *rib;
2238: struct zebra_vrf *zvrf;
2239: vrf_iter_t iter;
2240: int first = 1;
2241:
2242: type = proto_redistnum (AFI_IP, argv[0]);
2243: if (type < 0)
2244: {
2245: vty_out (vty, "Unknown route type%s", VTY_NEWLINE);
2246: return CMD_WARNING;
2247: }
2248:
2249: for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
2250: {
2251: if ((zvrf = vrf_iter2info (iter)) == NULL ||
2252: (table = zvrf->table[AFI_IP][SAFI_UNICAST]) == NULL)
2253: continue;
2254:
2255: /* Show matched type IPv4 routes. */
2256: for (rn = route_top (table); rn; rn = route_next (rn))
2257: RNODE_FOREACH_RIB (rn, rib)
2258: if (rib->type == type)
2259: {
2260: if (first)
2261: {
2262: vty_out (vty, SHOW_ROUTE_V4_HEADER);
2263: first = 0;
2264: }
2265: vty_show_ip_route (vty, rn, rib);
2266: }
2267: }
2268:
2269: return CMD_SUCCESS;
2270: }
2271:
2272: DEFUN (show_ip_route_addr_vrf_all,
2273: show_ip_route_addr_vrf_all_cmd,
2274: "show ip route A.B.C.D " VRF_ALL_CMD_STR,
2275: SHOW_STR
2276: IP_STR
2277: "IP routing table\n"
2278: "Network in the IP routing table to display\n"
2279: VRF_ALL_CMD_HELP_STR)
2280: {
2281: int ret;
2282: struct prefix_ipv4 p;
2283: struct route_table *table;
2284: struct route_node *rn;
2285: struct zebra_vrf *zvrf;
2286: vrf_iter_t iter;
2287:
2288: ret = str2prefix_ipv4 (argv[0], &p);
2289: if (ret <= 0)
2290: {
2291: vty_out (vty, "%% Malformed IPv4 address%s", VTY_NEWLINE);
2292: return CMD_WARNING;
2293: }
2294:
2295: for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
2296: {
2297: if ((zvrf = vrf_iter2info (iter)) == NULL ||
2298: (table = zvrf->table[AFI_IP][SAFI_UNICAST]) == NULL)
2299: continue;
2300:
2301: rn = route_node_match (table, (struct prefix *) &p);
2302: if (! rn)
2303: continue;
2304:
2305: vty_show_ip_route_detail (vty, rn, 0);
2306:
2307: route_unlock_node (rn);
2308: }
2309:
2310: return CMD_SUCCESS;
2311: }
2312:
2313: DEFUN (show_ip_route_prefix_vrf_all,
2314: show_ip_route_prefix_vrf_all_cmd,
2315: "show ip route A.B.C.D/M " VRF_ALL_CMD_STR,
2316: SHOW_STR
2317: IP_STR
2318: "IP routing table\n"
2319: "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
2320: VRF_ALL_CMD_HELP_STR)
2321: {
2322: int ret;
2323: struct prefix_ipv4 p;
2324: struct route_table *table;
2325: struct route_node *rn;
2326: struct zebra_vrf *zvrf;
2327: vrf_iter_t iter;
2328:
2329: ret = str2prefix_ipv4 (argv[0], &p);
2330: if (ret <= 0)
2331: {
2332: vty_out (vty, "%% Malformed IPv4 address%s", VTY_NEWLINE);
2333: return CMD_WARNING;
2334: }
2335:
2336: for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
2337: {
2338: if ((zvrf = vrf_iter2info (iter)) == NULL ||
2339: (table = zvrf->table[AFI_IP][SAFI_UNICAST]) == NULL)
2340: continue;
2341:
2342: rn = route_node_match (table, (struct prefix *) &p);
2343: if (! rn)
2344: continue;
2345: if (rn->p.prefixlen != p.prefixlen)
2346: {
2347: route_unlock_node (rn);
2348: continue;
2349: }
2350:
2351: vty_show_ip_route_detail (vty, rn, 0);
2352:
2353: route_unlock_node (rn);
2354: }
2355:
2356: return CMD_SUCCESS;
2357: }
2358:
2359: DEFUN (show_ip_route_summary_vrf_all,
2360: show_ip_route_summary_vrf_all_cmd,
2361: "show ip route summary " VRF_ALL_CMD_STR,
2362: SHOW_STR
2363: IP_STR
2364: "IP routing table\n"
2365: "Summary of all routes\n"
2366: VRF_ALL_CMD_HELP_STR)
2367: {
2368: struct zebra_vrf *zvrf;
2369: vrf_iter_t iter;
2370:
2371: for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
2372: if ((zvrf = vrf_iter2info (iter)) != NULL)
2373: vty_show_ip_route_summary (vty, zvrf->table[AFI_IP][SAFI_UNICAST]);
2374:
2375: return CMD_SUCCESS;
2376: }
2377:
2378: DEFUN (show_ip_route_summary_prefix_vrf_all,
2379: show_ip_route_summary_prefix_vrf_all_cmd,
2380: "show ip route summary prefix " VRF_ALL_CMD_STR,
2381: SHOW_STR
2382: IP_STR
2383: "IP routing table\n"
2384: "Summary of all routes\n"
2385: "Prefix routes\n"
2386: VRF_ALL_CMD_HELP_STR)
2387: {
2388: struct zebra_vrf *zvrf;
2389: vrf_iter_t iter;
2390:
2391: for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
2392: if ((zvrf = vrf_iter2info (iter)) != NULL)
2393: vty_show_ip_route_summary_prefix (vty, zvrf->table[AFI_IP][SAFI_UNICAST]);
2394:
2395: return CMD_SUCCESS;
2396: }
2397:
2398: /* Write IPv4 static route configuration. */
2399: static int
2400: static_config_ipv4 (struct vty *vty, safi_t safi, const char *cmd)
2401: {
2402: struct route_node *rn;
2403: struct static_route *si;
2404: struct route_table *stable;
2405: struct zebra_vrf *zvrf;
2406: vrf_iter_t iter;
2407: int write;
2408:
2409: write = 0;
2410:
2411: for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
2412: {
2413: if ((zvrf = vrf_iter2info (iter)) == NULL ||
2414: (stable = zvrf->stable[AFI_IP][safi]) == NULL)
2415: continue;
2416:
2417: for (rn = route_top (stable); rn; rn = route_next (rn))
2418: for (si = rn->info; si; si = si->next)
2419: {
2420: vty_out (vty, "%s %s/%d", cmd, inet_ntoa (rn->p.u.prefix4),
2421: rn->p.prefixlen);
2422:
2423: switch (si->type)
2424: {
2425: case STATIC_IPV4_GATEWAY:
2426: vty_out (vty, " %s", inet_ntoa (si->addr.ipv4));
2427: break;
2428: case STATIC_IPV4_IFNAME:
2429: vty_out (vty, " %s", si->ifname);
2430: break;
2431: case STATIC_IPV4_BLACKHOLE:
2432: vty_out (vty, " Null0");
2433: break;
2434: }
2435:
2436: /* flags are incompatible with STATIC_IPV4_BLACKHOLE */
2437: if (si->type != STATIC_IPV4_BLACKHOLE)
2438: {
2439: if (CHECK_FLAG(si->flags, ZEBRA_FLAG_REJECT))
2440: vty_out (vty, " %s", "reject");
2441:
2442: if (CHECK_FLAG(si->flags, ZEBRA_FLAG_BLACKHOLE))
2443: vty_out (vty, " %s", "blackhole");
2444: }
2445:
2446: if (si->distance != ZEBRA_STATIC_DISTANCE_DEFAULT)
2447: vty_out (vty, " %d", si->distance);
2448:
2449: if (si->vrf_id != VRF_DEFAULT)
2450: vty_out (vty, " vrf %u", si->vrf_id);
2451:
2452: vty_out (vty, "%s", VTY_NEWLINE);
2453:
2454: write = 1;
2455: }
2456: }
2457: return write;
2458: }
2459:
2460: DEFUN (show_ip_protocol,
2461: show_ip_protocol_cmd,
2462: "show ip protocol",
2463: SHOW_STR
2464: IP_STR
2465: "IP protocol filtering status\n")
2466: {
2467: int i;
2468:
2469: vty_out(vty, "Protocol : route-map %s", VTY_NEWLINE);
2470: vty_out(vty, "------------------------%s", VTY_NEWLINE);
2471: for (i=0;i<ZEBRA_ROUTE_MAX;i++)
2472: {
2473: if (proto_rm[AFI_IP][i])
2474: vty_out (vty, "%-10s : %-10s%s", zebra_route_string(i),
2475: proto_rm[AFI_IP][i],
2476: VTY_NEWLINE);
2477: else
2478: vty_out (vty, "%-10s : none%s", zebra_route_string(i), VTY_NEWLINE);
2479: }
2480: if (proto_rm[AFI_IP][i])
2481: vty_out (vty, "%-10s : %-10s%s", "any", proto_rm[AFI_IP][i],
2482: VTY_NEWLINE);
2483: else
2484: vty_out (vty, "%-10s : none%s", "any", VTY_NEWLINE);
2485:
2486: return CMD_SUCCESS;
2487: }
2488:
2489: #ifdef HAVE_IPV6
2490: /* General fucntion for IPv6 static route. */
2491: static int
2492: static_ipv6_func (struct vty *vty, int add_cmd, const char *dest_str,
2493: const char *gate_str, const char *ifname,
2494: const char *flag_str, const char *distance_str,
2495: const char *vrf_id_str)
2496: {
2497: int ret;
2498: u_char distance;
2499: struct prefix p;
2500: struct in6_addr *gate = NULL;
2501: struct in6_addr gate_addr;
2502: u_char type = 0;
2503: vrf_id_t vrf_id = VRF_DEFAULT;
2504: u_char flag = 0;
2505:
2506: ret = str2prefix (dest_str, &p);
2507: if (ret <= 0)
2508: {
2509: vty_out (vty, "%% Malformed address%s", VTY_NEWLINE);
2510: return CMD_WARNING;
2511: }
2512:
2513: /* Apply mask for given prefix. */
2514: apply_mask (&p);
2515:
2516: /* Route flags */
2517: if (flag_str) {
2518: switch(flag_str[0]) {
2519: case 'r':
2520: case 'R': /* XXX */
2521: SET_FLAG (flag, ZEBRA_FLAG_REJECT);
2522: break;
2523: case 'b':
2524: case 'B': /* XXX */
2525: SET_FLAG (flag, ZEBRA_FLAG_BLACKHOLE);
2526: break;
2527: default:
2528: vty_out (vty, "%% Malformed flag %s %s", flag_str, VTY_NEWLINE);
2529: return CMD_WARNING;
2530: }
2531: }
2532:
2533: /* Administrative distance. */
2534: if (distance_str)
2535: distance = atoi (distance_str);
2536: else
2537: distance = ZEBRA_STATIC_DISTANCE_DEFAULT;
2538:
2539: /* When gateway is valid IPv6 addrees, then gate is treated as
2540: nexthop address other case gate is treated as interface name. */
2541: ret = inet_pton (AF_INET6, gate_str, &gate_addr);
2542:
2543: if (ifname)
2544: {
2545: /* When ifname is specified. It must be come with gateway
2546: address. */
2547: if (ret != 1)
2548: {
2549: vty_out (vty, "%% Malformed address%s", VTY_NEWLINE);
2550: return CMD_WARNING;
2551: }
2552: type = STATIC_IPV6_GATEWAY_IFNAME;
2553: gate = &gate_addr;
2554: }
2555: else
2556: {
2557: if (ret == 1)
2558: {
2559: type = STATIC_IPV6_GATEWAY;
2560: gate = &gate_addr;
2561: }
2562: else
2563: {
2564: type = STATIC_IPV6_IFNAME;
2565: ifname = gate_str;
2566: }
2567: }
2568:
2569: /* VRF id */
2570: if (vrf_id_str)
2571: VTY_GET_INTEGER ("VRF ID", vrf_id, vrf_id_str);
2572:
2573: if (add_cmd)
2574: static_add_ipv6 (&p, type, gate, ifname, flag, distance, vrf_id);
2575: else
2576: static_delete_ipv6 (&p, type, gate, ifname, distance, vrf_id);
2577:
2578: return CMD_SUCCESS;
2579: }
2580:
2581: DEFUN (ipv6_route,
2582: ipv6_route_cmd,
2583: "ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE)",
2584: IP_STR
2585: "Establish static routes\n"
2586: "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
2587: "IPv6 gateway address\n"
2588: "IPv6 gateway interface name\n")
2589: {
2590: return static_ipv6_func (vty, 1, argv[0], argv[1], NULL, NULL, NULL,
2591: NULL);
2592: }
2593:
2594: DEFUN (ipv6_route_flags,
2595: ipv6_route_flags_cmd,
2596: "ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) (reject|blackhole)",
2597: IP_STR
2598: "Establish static routes\n"
2599: "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
2600: "IPv6 gateway address\n"
2601: "IPv6 gateway interface name\n"
2602: "Emit an ICMP unreachable when matched\n"
2603: "Silently discard pkts when matched\n")
2604: {
2605: return static_ipv6_func (vty, 1, argv[0], argv[1], NULL, argv[2], NULL,
2606: NULL);
2607: }
2608:
2609: DEFUN (ipv6_route_ifname,
2610: ipv6_route_ifname_cmd,
2611: "ipv6 route X:X::X:X/M X:X::X:X INTERFACE",
2612: IP_STR
2613: "Establish static routes\n"
2614: "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
2615: "IPv6 gateway address\n"
2616: "IPv6 gateway interface name\n")
2617: {
2618: return static_ipv6_func (vty, 1, argv[0], argv[1], argv[2], NULL, NULL,
2619: NULL);
2620: }
2621:
2622: DEFUN (ipv6_route_ifname_flags,
2623: ipv6_route_ifname_flags_cmd,
2624: "ipv6 route X:X::X:X/M X:X::X:X INTERFACE (reject|blackhole)",
2625: IP_STR
2626: "Establish static routes\n"
2627: "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
2628: "IPv6 gateway address\n"
2629: "IPv6 gateway interface name\n"
2630: "Emit an ICMP unreachable when matched\n"
2631: "Silently discard pkts when matched\n")
2632: {
2633: return static_ipv6_func (vty, 1, argv[0], argv[1], argv[2], argv[3], NULL,
2634: NULL);
2635: }
2636:
2637: DEFUN (ipv6_route_pref,
2638: ipv6_route_pref_cmd,
2639: "ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) <1-255>",
2640: IP_STR
2641: "Establish static routes\n"
2642: "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
2643: "IPv6 gateway address\n"
2644: "IPv6 gateway interface name\n"
2645: "Distance value for this prefix\n")
2646: {
2647: return static_ipv6_func (vty, 1, argv[0], argv[1], NULL, NULL, argv[2],
2648: NULL);
2649: }
2650:
2651: DEFUN (ipv6_route_flags_pref,
2652: ipv6_route_flags_pref_cmd,
2653: "ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) (reject|blackhole) <1-255>",
2654: IP_STR
2655: "Establish static routes\n"
2656: "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
2657: "IPv6 gateway address\n"
2658: "IPv6 gateway interface name\n"
2659: "Emit an ICMP unreachable when matched\n"
2660: "Silently discard pkts when matched\n"
2661: "Distance value for this prefix\n")
2662: {
2663: return static_ipv6_func (vty, 1, argv[0], argv[1], NULL, argv[2], argv[3],
2664: NULL);
2665: }
2666:
2667: DEFUN (ipv6_route_ifname_pref,
2668: ipv6_route_ifname_pref_cmd,
2669: "ipv6 route X:X::X:X/M X:X::X:X INTERFACE <1-255>",
2670: IP_STR
2671: "Establish static routes\n"
2672: "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
2673: "IPv6 gateway address\n"
2674: "IPv6 gateway interface name\n"
2675: "Distance value for this prefix\n")
2676: {
2677: return static_ipv6_func (vty, 1, argv[0], argv[1], argv[2], NULL, argv[3],
2678: NULL);
2679: }
2680:
2681: DEFUN (ipv6_route_ifname_flags_pref,
2682: ipv6_route_ifname_flags_pref_cmd,
2683: "ipv6 route X:X::X:X/M X:X::X:X INTERFACE (reject|blackhole) <1-255>",
2684: IP_STR
2685: "Establish static routes\n"
2686: "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
2687: "IPv6 gateway address\n"
2688: "IPv6 gateway interface name\n"
2689: "Emit an ICMP unreachable when matched\n"
2690: "Silently discard pkts when matched\n"
2691: "Distance value for this prefix\n")
2692: {
2693: return static_ipv6_func (vty, 1, argv[0], argv[1], argv[2], argv[3], argv[4],
2694: NULL);
2695: }
2696:
2697: DEFUN (no_ipv6_route,
2698: no_ipv6_route_cmd,
2699: "no ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE)",
2700: NO_STR
2701: IP_STR
2702: "Establish static routes\n"
2703: "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
2704: "IPv6 gateway address\n"
2705: "IPv6 gateway interface name\n")
2706: {
2707: return static_ipv6_func (vty, 0, argv[0], argv[1], NULL, NULL, NULL,
2708: NULL);
2709: }
2710:
2711: ALIAS (no_ipv6_route,
2712: no_ipv6_route_flags_cmd,
2713: "no ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) (reject|blackhole)",
2714: NO_STR
2715: IP_STR
2716: "Establish static routes\n"
2717: "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
2718: "IPv6 gateway address\n"
2719: "IPv6 gateway interface name\n"
2720: "Emit an ICMP unreachable when matched\n"
2721: "Silently discard pkts when matched\n")
2722:
2723: DEFUN (no_ipv6_route_ifname,
2724: no_ipv6_route_ifname_cmd,
2725: "no ipv6 route X:X::X:X/M X:X::X:X INTERFACE",
2726: NO_STR
2727: IP_STR
2728: "Establish static routes\n"
2729: "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
2730: "IPv6 gateway address\n"
2731: "IPv6 gateway interface name\n")
2732: {
2733: return static_ipv6_func (vty, 0, argv[0], argv[1], argv[2], NULL, NULL,
2734: NULL);
2735: }
2736:
2737: ALIAS (no_ipv6_route_ifname,
2738: no_ipv6_route_ifname_flags_cmd,
2739: "no ipv6 route X:X::X:X/M X:X::X:X INTERFACE (reject|blackhole)",
2740: NO_STR
2741: IP_STR
2742: "Establish static routes\n"
2743: "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
2744: "IPv6 gateway address\n"
2745: "IPv6 gateway interface name\n"
2746: "Emit an ICMP unreachable when matched\n"
2747: "Silently discard pkts when matched\n")
2748:
2749: DEFUN (no_ipv6_route_pref,
2750: no_ipv6_route_pref_cmd,
2751: "no ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) <1-255>",
2752: NO_STR
2753: IP_STR
2754: "Establish static routes\n"
2755: "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
2756: "IPv6 gateway address\n"
2757: "IPv6 gateway interface name\n"
2758: "Distance value for this prefix\n")
2759: {
2760: return static_ipv6_func (vty, 0, argv[0], argv[1], NULL, NULL, argv[2],
2761: NULL);
2762: }
2763:
2764: DEFUN (no_ipv6_route_flags_pref,
2765: no_ipv6_route_flags_pref_cmd,
2766: "no ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) (reject|blackhole) <1-255>",
2767: NO_STR
2768: IP_STR
2769: "Establish static routes\n"
2770: "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
2771: "IPv6 gateway address\n"
2772: "IPv6 gateway interface name\n"
2773: "Emit an ICMP unreachable when matched\n"
2774: "Silently discard pkts when matched\n"
2775: "Distance value for this prefix\n")
2776: {
2777: /* We do not care about argv[2] */
2778: return static_ipv6_func (vty, 0, argv[0], argv[1], NULL, argv[2], argv[3],
2779: NULL);
2780: }
2781:
2782: DEFUN (no_ipv6_route_ifname_pref,
2783: no_ipv6_route_ifname_pref_cmd,
2784: "no ipv6 route X:X::X:X/M X:X::X:X INTERFACE <1-255>",
2785: NO_STR
2786: IP_STR
2787: "Establish static routes\n"
2788: "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
2789: "IPv6 gateway address\n"
2790: "IPv6 gateway interface name\n"
2791: "Distance value for this prefix\n")
2792: {
2793: return static_ipv6_func (vty, 0, argv[0], argv[1], argv[2], NULL, argv[3],
2794: NULL);
2795: }
2796:
2797: DEFUN (no_ipv6_route_ifname_flags_pref,
2798: no_ipv6_route_ifname_flags_pref_cmd,
2799: "no ipv6 route X:X::X:X/M X:X::X:X INTERFACE (reject|blackhole) <1-255>",
2800: NO_STR
2801: IP_STR
2802: "Establish static routes\n"
2803: "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
2804: "IPv6 gateway address\n"
2805: "IPv6 gateway interface name\n"
2806: "Emit an ICMP unreachable when matched\n"
2807: "Silently discard pkts when matched\n"
2808: "Distance value for this prefix\n")
2809: {
2810: return static_ipv6_func (vty, 0, argv[0], argv[1], argv[2], argv[3], argv[4],
2811: NULL);
2812: }
2813:
2814: DEFUN (ipv6_route_vrf,
2815: ipv6_route_vrf_cmd,
2816: "ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) " VRF_CMD_STR,
2817: IP_STR
2818: "Establish static routes\n"
2819: "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
2820: "IPv6 gateway address\n"
2821: "IPv6 gateway interface name\n"
2822: VRF_CMD_HELP_STR)
2823: {
2824: return static_ipv6_func (vty, 1, argv[0], argv[1], NULL, NULL, NULL,
2825: argv[2]);
2826: }
2827:
2828: DEFUN (ipv6_route_flags_vrf,
2829: ipv6_route_flags_vrf_cmd,
2830: "ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) (reject|blackhole) " VRF_CMD_STR,
2831: IP_STR
2832: "Establish static routes\n"
2833: "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
2834: "IPv6 gateway address\n"
2835: "IPv6 gateway interface name\n"
2836: "Emit an ICMP unreachable when matched\n"
2837: "Silently discard pkts when matched\n"
2838: VRF_CMD_HELP_STR)
2839: {
2840: return static_ipv6_func (vty, 1, argv[0], argv[1], NULL, argv[2], NULL,
2841: argv[3]);
2842: }
2843:
2844: DEFUN (ipv6_route_ifname_vrf,
2845: ipv6_route_ifname_vrf_cmd,
2846: "ipv6 route X:X::X:X/M X:X::X:X INTERFACE " VRF_CMD_STR,
2847: IP_STR
2848: "Establish static routes\n"
2849: "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
2850: "IPv6 gateway address\n"
2851: "IPv6 gateway interface name\n"
2852: VRF_CMD_HELP_STR)
2853: {
2854: return static_ipv6_func (vty, 1, argv[0], argv[1], argv[2], NULL, NULL,
2855: argv[3]);
2856: }
2857:
2858: DEFUN (ipv6_route_ifname_flags_vrf,
2859: ipv6_route_ifname_flags_vrf_cmd,
2860: "ipv6 route X:X::X:X/M X:X::X:X INTERFACE (reject|blackhole) " VRF_CMD_STR,
2861: IP_STR
2862: "Establish static routes\n"
2863: "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
2864: "IPv6 gateway address\n"
2865: "IPv6 gateway interface name\n"
2866: "Emit an ICMP unreachable when matched\n"
2867: "Silently discard pkts when matched\n"
2868: VRF_CMD_HELP_STR)
2869: {
2870: return static_ipv6_func (vty, 1, argv[0], argv[1], argv[2], argv[3], NULL,
2871: argv[4]);
2872: }
2873:
2874: DEFUN (ipv6_route_pref_vrf,
2875: ipv6_route_pref_vrf_cmd,
2876: "ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) <1-255> " VRF_CMD_STR,
2877: IP_STR
2878: "Establish static routes\n"
2879: "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
2880: "IPv6 gateway address\n"
2881: "IPv6 gateway interface name\n"
2882: "Distance value for this prefix\n"
2883: VRF_CMD_HELP_STR)
2884: {
2885: return static_ipv6_func (vty, 1, argv[0], argv[1], NULL, NULL, argv[2],
2886: argv[3]);
2887: }
2888:
2889: DEFUN (ipv6_route_flags_pref_vrf,
2890: ipv6_route_flags_pref_vrf_cmd,
2891: "ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) (reject|blackhole) <1-255> " VRF_CMD_STR,
2892: IP_STR
2893: "Establish static routes\n"
2894: "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
2895: "IPv6 gateway address\n"
2896: "IPv6 gateway interface name\n"
2897: "Emit an ICMP unreachable when matched\n"
2898: "Silently discard pkts when matched\n"
2899: "Distance value for this prefix\n"
2900: VRF_CMD_HELP_STR)
2901: {
2902: return static_ipv6_func (vty, 1, argv[0], argv[1], NULL, argv[2], argv[3],
2903: argv[4]);
2904: }
2905:
2906: DEFUN (ipv6_route_ifname_pref_vrf,
2907: ipv6_route_ifname_pref_vrf_cmd,
2908: "ipv6 route X:X::X:X/M X:X::X:X INTERFACE <1-255> " VRF_CMD_STR,
2909: IP_STR
2910: "Establish static routes\n"
2911: "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
2912: "IPv6 gateway address\n"
2913: "IPv6 gateway interface name\n"
2914: "Distance value for this prefix\n"
2915: VRF_CMD_HELP_STR)
2916: {
2917: return static_ipv6_func (vty, 1, argv[0], argv[1], argv[2], NULL, argv[3],
2918: argv[4]);
2919: }
2920:
2921: DEFUN (ipv6_route_ifname_flags_pref_vrf,
2922: ipv6_route_ifname_flags_pref_vrf_cmd,
2923: "ipv6 route X:X::X:X/M X:X::X:X INTERFACE (reject|blackhole) <1-255> " VRF_CMD_STR,
2924: IP_STR
2925: "Establish static routes\n"
2926: "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
2927: "IPv6 gateway address\n"
2928: "IPv6 gateway interface name\n"
2929: "Emit an ICMP unreachable when matched\n"
2930: "Silently discard pkts when matched\n"
2931: "Distance value for this prefix\n"
2932: VRF_CMD_HELP_STR)
2933: {
2934: return static_ipv6_func (vty, 1, argv[0], argv[1], argv[2], argv[3], argv[4],
2935: argv[5]);
2936: }
2937:
2938: DEFUN (no_ipv6_route_vrf,
2939: no_ipv6_route_vrf_cmd,
2940: "no ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) " VRF_CMD_STR,
2941: NO_STR
2942: IP_STR
2943: "Establish static routes\n"
2944: "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
2945: "IPv6 gateway address\n"
2946: "IPv6 gateway interface name\n"
2947: VRF_CMD_HELP_STR)
2948: {
2949: return static_ipv6_func (vty, 0, argv[0], argv[1], NULL, NULL, NULL,
2950: (argc > 3) ? argv[3] : argv[2]);
2951: }
2952:
2953: ALIAS (no_ipv6_route_vrf,
2954: no_ipv6_route_flags_vrf_cmd,
2955: "no ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) (reject|blackhole) " VRF_CMD_STR,
2956: NO_STR
2957: IP_STR
2958: "Establish static routes\n"
2959: "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
2960: "IPv6 gateway address\n"
2961: "IPv6 gateway interface name\n"
2962: "Emit an ICMP unreachable when matched\n"
2963: "Silently discard pkts when matched\n"
2964: VRF_CMD_HELP_STR)
2965:
2966: DEFUN (no_ipv6_route_ifname_vrf,
2967: no_ipv6_route_ifname_vrf_cmd,
2968: "no ipv6 route X:X::X:X/M X:X::X:X INTERFACE " VRF_CMD_STR,
2969: NO_STR
2970: IP_STR
2971: "Establish static routes\n"
2972: "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
2973: "IPv6 gateway address\n"
2974: "IPv6 gateway interface name\n"
2975: VRF_CMD_HELP_STR)
2976: {
2977: return static_ipv6_func (vty, 0, argv[0], argv[1], argv[2], NULL, NULL,
2978: (argc > 4) ? argv[4] : argv[3]);
2979: }
2980:
2981: ALIAS (no_ipv6_route_ifname_vrf,
2982: no_ipv6_route_ifname_flags_vrf_cmd,
2983: "no ipv6 route X:X::X:X/M X:X::X:X INTERFACE (reject|blackhole) " VRF_CMD_STR,
2984: NO_STR
2985: IP_STR
2986: "Establish static routes\n"
2987: "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
2988: "IPv6 gateway address\n"
2989: "IPv6 gateway interface name\n"
2990: "Emit an ICMP unreachable when matched\n"
2991: "Silently discard pkts when matched\n"
2992: VRF_CMD_HELP_STR)
2993:
2994: DEFUN (no_ipv6_route_pref_vrf,
2995: no_ipv6_route_pref_vrf_cmd,
2996: "no ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) <1-255> " VRF_CMD_STR,
2997: NO_STR
2998: IP_STR
2999: "Establish static routes\n"
3000: "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
3001: "IPv6 gateway address\n"
3002: "IPv6 gateway interface name\n"
3003: "Distance value for this prefix\n"
3004: VRF_CMD_HELP_STR)
3005: {
3006: return static_ipv6_func (vty, 0, argv[0], argv[1], NULL, NULL, argv[2],
3007: argv[3]);
3008: }
3009:
3010: DEFUN (no_ipv6_route_flags_pref_vrf,
3011: no_ipv6_route_flags_pref_vrf_cmd,
3012: "no ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) (reject|blackhole) <1-255> " VRF_CMD_STR,
3013: NO_STR
3014: IP_STR
3015: "Establish static routes\n"
3016: "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
3017: "IPv6 gateway address\n"
3018: "IPv6 gateway interface name\n"
3019: "Emit an ICMP unreachable when matched\n"
3020: "Silently discard pkts when matched\n"
3021: "Distance value for this prefix\n"
3022: VRF_CMD_HELP_STR)
3023: {
3024: /* We do not care about argv[2] */
3025: return static_ipv6_func (vty, 0, argv[0], argv[1], NULL, argv[2], argv[3],
3026: argv[4]);
3027: }
3028:
3029: DEFUN (no_ipv6_route_ifname_pref_vrf,
3030: no_ipv6_route_ifname_pref_vrf_cmd,
3031: "no ipv6 route X:X::X:X/M X:X::X:X INTERFACE <1-255> " VRF_CMD_STR,
3032: NO_STR
3033: IP_STR
3034: "Establish static routes\n"
3035: "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
3036: "IPv6 gateway address\n"
3037: "IPv6 gateway interface name\n"
3038: "Distance value for this prefix\n"
3039: VRF_CMD_HELP_STR)
3040: {
3041: return static_ipv6_func (vty, 0, argv[0], argv[1], argv[2], NULL, argv[3],
3042: argv[4]);
3043: }
3044:
3045: DEFUN (no_ipv6_route_ifname_flags_pref_vrf,
3046: no_ipv6_route_ifname_flags_pref_vrf_cmd,
3047: "no ipv6 route X:X::X:X/M X:X::X:X INTERFACE (reject|blackhole) <1-255> " VRF_CMD_STR,
3048: NO_STR
3049: IP_STR
3050: "Establish static routes\n"
3051: "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
3052: "IPv6 gateway address\n"
3053: "IPv6 gateway interface name\n"
3054: "Emit an ICMP unreachable when matched\n"
3055: "Silently discard pkts when matched\n"
3056: "Distance value for this prefix\n"
3057: VRF_CMD_HELP_STR)
3058: {
3059: return static_ipv6_func (vty, 0, argv[0], argv[1], argv[2], argv[3], argv[4],
3060: argv[5]);
3061: }
3062:
3063: DEFUN (show_ipv6_route,
3064: show_ipv6_route_cmd,
3065: "show ipv6 route",
3066: SHOW_STR
3067: IP_STR
3068: "IPv6 routing table\n")
3069: {
3070: struct route_table *table;
3071: struct route_node *rn;
3072: struct rib *rib;
3073: int first = 1;
3074: vrf_id_t vrf_id = VRF_DEFAULT;
3075:
3076: if (argc > 0)
3077: VTY_GET_INTEGER ("VRF ID", vrf_id, argv[0]);
3078:
3079: table = zebra_vrf_table (AFI_IP6, SAFI_UNICAST, vrf_id);
3080: if (! table)
3081: return CMD_SUCCESS;
3082:
3083: /* Show all IPv6 route. */
3084: for (rn = route_top (table); rn; rn = route_next (rn))
3085: RNODE_FOREACH_RIB (rn, rib)
3086: {
3087: if (first)
3088: {
3089: vty_out (vty, SHOW_ROUTE_V6_HEADER);
3090: first = 0;
3091: }
3092: vty_show_ip_route (vty, rn, rib);
3093: }
3094: return CMD_SUCCESS;
3095: }
3096:
3097: ALIAS (show_ipv6_route,
3098: show_ipv6_route_vrf_cmd,
3099: "show ipv6 route " VRF_CMD_STR,
3100: SHOW_STR
3101: IP_STR
3102: "IPv6 routing table\n"
3103: VRF_CMD_HELP_STR)
3104:
3105: DEFUN (show_ipv6_route_prefix_longer,
3106: show_ipv6_route_prefix_longer_cmd,
3107: "show ipv6 route X:X::X:X/M longer-prefixes",
3108: SHOW_STR
3109: IP_STR
3110: "IPv6 routing table\n"
3111: "IPv6 prefix\n"
3112: "Show route matching the specified Network/Mask pair only\n")
3113: {
3114: struct route_table *table;
3115: struct route_node *rn;
3116: struct rib *rib;
3117: struct prefix p;
3118: int ret;
3119: int first = 1;
3120: vrf_id_t vrf_id = VRF_DEFAULT;
3121:
3122: ret = str2prefix (argv[0], &p);
3123: if (! ret)
3124: {
3125: vty_out (vty, "%% Malformed Prefix%s", VTY_NEWLINE);
3126: return CMD_WARNING;
3127: }
3128:
3129: if (argc > 1)
3130: VTY_GET_INTEGER ("VRF ID", vrf_id, argv[1]);
3131:
3132: table = zebra_vrf_table (AFI_IP6, SAFI_UNICAST, vrf_id);
3133: if (! table)
3134: return CMD_SUCCESS;
3135:
3136: /* Show matched type IPv6 routes. */
3137: for (rn = route_top (table); rn; rn = route_next (rn))
3138: RNODE_FOREACH_RIB (rn, rib)
3139: if (prefix_match (&p, &rn->p))
3140: {
3141: if (first)
3142: {
3143: vty_out (vty, SHOW_ROUTE_V6_HEADER);
3144: first = 0;
3145: }
3146: vty_show_ip_route (vty, rn, rib);
3147: }
3148: return CMD_SUCCESS;
3149: }
3150:
3151: ALIAS (show_ipv6_route_prefix_longer,
3152: show_ipv6_route_prefix_longer_vrf_cmd,
3153: "show ipv6 route X:X::X:X/M longer-prefixes " VRF_CMD_STR,
3154: SHOW_STR
3155: IP_STR
3156: "IPv6 routing table\n"
3157: "IPv6 prefix\n"
3158: "Show route matching the specified Network/Mask pair only\n"
3159: VRF_CMD_HELP_STR)
3160:
3161: DEFUN (show_ipv6_route_protocol,
3162: show_ipv6_route_protocol_cmd,
3163: "show ipv6 route " QUAGGA_IP6_REDIST_STR_ZEBRA,
3164: SHOW_STR
3165: IP_STR
3166: "IP routing table\n"
3167: QUAGGA_IP6_REDIST_HELP_STR_ZEBRA)
3168: {
3169: int type;
3170: struct route_table *table;
3171: struct route_node *rn;
3172: struct rib *rib;
3173: int first = 1;
3174: vrf_id_t vrf_id = VRF_DEFAULT;
3175:
3176: type = proto_redistnum (AFI_IP6, argv[0]);
3177: if (type < 0)
3178: {
3179: vty_out (vty, "Unknown route type%s", VTY_NEWLINE);
3180: return CMD_WARNING;
3181: }
3182:
3183: if (argc > 1)
3184: VTY_GET_INTEGER ("VRF ID", vrf_id, argv[1]);
3185:
3186: table = zebra_vrf_table (AFI_IP6, SAFI_UNICAST, vrf_id);
3187: if (! table)
3188: return CMD_SUCCESS;
3189:
3190: /* Show matched type IPv6 routes. */
3191: for (rn = route_top (table); rn; rn = route_next (rn))
3192: RNODE_FOREACH_RIB (rn, rib)
3193: if (rib->type == type)
3194: {
3195: if (first)
3196: {
3197: vty_out (vty, SHOW_ROUTE_V6_HEADER);
3198: first = 0;
3199: }
3200: vty_show_ip_route (vty, rn, rib);
3201: }
3202: return CMD_SUCCESS;
3203: }
3204:
3205: ALIAS (show_ipv6_route_protocol,
3206: show_ipv6_route_protocol_vrf_cmd,
3207: "show ipv6 route " QUAGGA_IP6_REDIST_STR_ZEBRA " " VRF_CMD_STR,
3208: SHOW_STR
3209: IP_STR
3210: "IP routing table\n"
3211: QUAGGA_IP6_REDIST_HELP_STR_ZEBRA
3212: VRF_CMD_HELP_STR)
3213:
3214: DEFUN (show_ipv6_route_addr,
3215: show_ipv6_route_addr_cmd,
3216: "show ipv6 route X:X::X:X",
3217: SHOW_STR
3218: IP_STR
3219: "IPv6 routing table\n"
3220: "IPv6 Address\n")
3221: {
3222: int ret;
3223: struct prefix_ipv6 p;
3224: struct route_table *table;
3225: struct route_node *rn;
3226: vrf_id_t vrf_id = VRF_DEFAULT;
3227:
3228: ret = str2prefix_ipv6 (argv[0], &p);
3229: if (ret <= 0)
3230: {
3231: vty_out (vty, "Malformed IPv6 address%s", VTY_NEWLINE);
3232: return CMD_WARNING;
3233: }
3234:
3235: if (argc > 1)
3236: VTY_GET_INTEGER ("VRF ID", vrf_id, argv[1]);
3237:
3238: table = zebra_vrf_table (AFI_IP6, SAFI_UNICAST, vrf_id);
3239: if (! table)
3240: return CMD_SUCCESS;
3241:
3242: rn = route_node_match (table, (struct prefix *) &p);
3243: if (! rn)
3244: {
3245: vty_out (vty, "%% Network not in table%s", VTY_NEWLINE);
3246: return CMD_WARNING;
3247: }
3248:
3249: vty_show_ip_route_detail (vty, rn, 0);
3250:
3251: route_unlock_node (rn);
3252:
3253: return CMD_SUCCESS;
3254: }
3255:
3256: ALIAS (show_ipv6_route_addr,
3257: show_ipv6_route_addr_vrf_cmd,
3258: "show ipv6 route X:X::X:X " VRF_CMD_STR,
3259: SHOW_STR
3260: IP_STR
3261: "IPv6 routing table\n"
3262: "IPv6 Address\n"
3263: VRF_CMD_HELP_STR)
3264:
3265: DEFUN (show_ipv6_route_prefix,
3266: show_ipv6_route_prefix_cmd,
3267: "show ipv6 route X:X::X:X/M",
3268: SHOW_STR
3269: IP_STR
3270: "IPv6 routing table\n"
3271: "IPv6 prefix\n")
3272: {
3273: int ret;
3274: struct prefix_ipv6 p;
3275: struct route_table *table;
3276: struct route_node *rn;
3277: vrf_id_t vrf_id = VRF_DEFAULT;
3278:
3279: ret = str2prefix_ipv6 (argv[0], &p);
3280: if (ret <= 0)
3281: {
3282: vty_out (vty, "Malformed IPv6 prefix%s", VTY_NEWLINE);
3283: return CMD_WARNING;
3284: }
3285:
3286: if (argc > 1)
3287: VTY_GET_INTEGER ("VRF ID", vrf_id, argv[1]);
3288:
3289: table = zebra_vrf_table (AFI_IP6, SAFI_UNICAST, vrf_id);
3290: if (! table)
3291: return CMD_SUCCESS;
3292:
3293: rn = route_node_match (table, (struct prefix *) &p);
3294: if (! rn || rn->p.prefixlen != p.prefixlen)
3295: {
3296: vty_out (vty, "%% Network not in table%s", VTY_NEWLINE);
3297: if (rn)
3298: route_unlock_node (rn);
3299: return CMD_WARNING;
3300: }
3301:
3302: vty_show_ip_route_detail (vty, rn, 0);
3303:
3304: route_unlock_node (rn);
3305:
3306: return CMD_SUCCESS;
3307: }
3308:
3309: ALIAS (show_ipv6_route_prefix,
3310: show_ipv6_route_prefix_vrf_cmd,
3311: "show ipv6 route X:X::X:X/M " VRF_CMD_STR,
3312: SHOW_STR
3313: IP_STR
3314: "IPv6 routing table\n"
3315: "IPv6 prefix\n"
3316: VRF_CMD_HELP_STR)
3317:
3318: /* Show route summary. */
3319: DEFUN (show_ipv6_route_summary,
3320: show_ipv6_route_summary_cmd,
3321: "show ipv6 route summary",
3322: SHOW_STR
3323: IP_STR
3324: "IPv6 routing table\n"
3325: "Summary of all IPv6 routes\n")
3326: {
3327: struct route_table *table;
3328: vrf_id_t vrf_id = VRF_DEFAULT;
3329:
3330: if (argc > 0)
3331: VTY_GET_INTEGER ("VRF ID", vrf_id, argv[0]);
3332:
3333: table = zebra_vrf_table (AFI_IP6, SAFI_UNICAST, vrf_id);
3334: if (! table)
3335: return CMD_SUCCESS;
3336:
3337: vty_show_ip_route_summary (vty, table);
3338:
3339: return CMD_SUCCESS;
3340: }
3341:
3342: ALIAS (show_ipv6_route_summary,
3343: show_ipv6_route_summary_vrf_cmd,
3344: "show ipv6 route summary " VRF_CMD_STR,
3345: SHOW_STR
3346: IP_STR
3347: "IPv6 routing table\n"
3348: "Summary of all IPv6 routes\n"
3349: VRF_CMD_HELP_STR)
3350:
3351: /* Show ipv6 route summary prefix. */
3352: DEFUN (show_ipv6_route_summary_prefix,
3353: show_ipv6_route_summary_prefix_cmd,
3354: "show ipv6 route summary prefix",
3355: SHOW_STR
3356: IP_STR
3357: "IPv6 routing table\n"
3358: "Summary of all IPv6 routes\n"
3359: "Prefix routes\n")
3360: {
3361: struct route_table *table;
3362: vrf_id_t vrf_id = VRF_DEFAULT;
3363:
3364: if (argc > 0)
3365: VTY_GET_INTEGER ("VRF ID", vrf_id, argv[0]);
3366:
3367: table = zebra_vrf_table (AFI_IP6, SAFI_UNICAST, vrf_id);
3368: if (! table)
3369: return CMD_SUCCESS;
3370:
3371: vty_show_ip_route_summary_prefix (vty, table);
3372:
3373: return CMD_SUCCESS;
3374: }
3375:
3376: ALIAS (show_ipv6_route_summary_prefix,
3377: show_ipv6_route_summary_prefix_vrf_cmd,
3378: "show ipv6 route summary prefix " VRF_CMD_STR,
3379: SHOW_STR
3380: IP_STR
3381: "IPv6 routing table\n"
3382: "Summary of all IPv6 routes\n"
3383: "Prefix routes\n"
3384: VRF_CMD_HELP_STR)
3385:
3386: /*
3387: * Show IPv6 mroute command.Used to dump
3388: * the Multicast routing table.
3389: */
3390:
3391: DEFUN (show_ipv6_mroute,
3392: show_ipv6_mroute_cmd,
3393: "show ipv6 mroute",
3394: SHOW_STR
3395: IP_STR
3396: "IPv6 Multicast routing table\n")
3397: {
3398: struct route_table *table;
3399: struct route_node *rn;
3400: struct rib *rib;
3401: int first = 1;
3402: vrf_id_t vrf_id = VRF_DEFAULT;
3403:
3404: if (argc > 0)
3405: VTY_GET_INTEGER ("VRF ID", vrf_id, argv[0]);
3406:
3407: table = zebra_vrf_table (AFI_IP6, SAFI_MULTICAST, vrf_id);
3408: if (! table)
3409: return CMD_SUCCESS;
3410:
3411: /* Show all IPv6 route. */
3412: for (rn = route_top (table); rn; rn = route_next (rn))
3413: RNODE_FOREACH_RIB (rn, rib)
3414: {
3415: if (first)
3416: {
3417: vty_out (vty, SHOW_ROUTE_V6_HEADER);
3418: first = 0;
3419: }
3420: vty_show_ip_route (vty, rn, rib);
3421: }
3422: return CMD_SUCCESS;
3423: }
3424:
3425: ALIAS (show_ipv6_mroute,
3426: show_ipv6_mroute_vrf_cmd,
3427: "show ipv6 mroute " VRF_CMD_STR,
3428: SHOW_STR
3429: IP_STR
3430: "IPv6 Multicast routing table\n"
3431: VRF_CMD_HELP_STR)
3432:
3433: DEFUN (show_ipv6_route_vrf_all,
3434: show_ipv6_route_vrf_all_cmd,
3435: "show ipv6 route " VRF_ALL_CMD_STR,
3436: SHOW_STR
3437: IP_STR
3438: "IPv6 routing table\n"
3439: VRF_ALL_CMD_HELP_STR)
3440: {
3441: struct route_table *table;
3442: struct route_node *rn;
3443: struct rib *rib;
3444: struct zebra_vrf *zvrf;
3445: vrf_iter_t iter;
3446: int first = 1;
3447:
3448: for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
3449: {
3450: if ((zvrf = vrf_iter2info (iter)) == NULL ||
3451: (table = zvrf->table[AFI_IP6][SAFI_UNICAST]) == NULL)
3452: continue;
3453:
3454: /* Show all IPv6 route. */
3455: for (rn = route_top (table); rn; rn = route_next (rn))
3456: RNODE_FOREACH_RIB (rn, rib)
3457: {
3458: if (first)
3459: {
3460: vty_out (vty, SHOW_ROUTE_V6_HEADER);
3461: first = 0;
3462: }
3463: vty_show_ip_route (vty, rn, rib);
3464: }
3465: }
3466:
3467: return CMD_SUCCESS;
3468: }
3469:
3470: DEFUN (show_ipv6_route_prefix_longer_vrf_all,
3471: show_ipv6_route_prefix_longer_vrf_all_cmd,
3472: "show ipv6 route X:X::X:X/M longer-prefixes " VRF_ALL_CMD_STR,
3473: SHOW_STR
3474: IP_STR
3475: "IPv6 routing table\n"
3476: "IPv6 prefix\n"
3477: "Show route matching the specified Network/Mask pair only\n"
3478: VRF_ALL_CMD_HELP_STR)
3479: {
3480: struct route_table *table;
3481: struct route_node *rn;
3482: struct rib *rib;
3483: struct prefix p;
3484: struct zebra_vrf *zvrf;
3485: vrf_iter_t iter;
3486: int ret;
3487: int first = 1;
3488:
3489: ret = str2prefix (argv[0], &p);
3490: if (! ret)
3491: {
3492: vty_out (vty, "%% Malformed Prefix%s", VTY_NEWLINE);
3493: return CMD_WARNING;
3494: }
3495:
3496: for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
3497: {
3498: if ((zvrf = vrf_iter2info (iter)) == NULL ||
3499: (table = zvrf->table[AFI_IP6][SAFI_UNICAST]) == NULL)
3500: continue;
3501:
3502: /* Show matched type IPv6 routes. */
3503: for (rn = route_top (table); rn; rn = route_next (rn))
3504: RNODE_FOREACH_RIB (rn, rib)
3505: if (prefix_match (&p, &rn->p))
3506: {
3507: if (first)
3508: {
3509: vty_out (vty, SHOW_ROUTE_V6_HEADER);
3510: first = 0;
3511: }
3512: vty_show_ip_route (vty, rn, rib);
3513: }
3514: }
3515:
3516: return CMD_SUCCESS;
3517: }
3518:
3519: DEFUN (show_ipv6_route_protocol_vrf_all,
3520: show_ipv6_route_protocol_vrf_all_cmd,
3521: "show ipv6 route " QUAGGA_IP6_REDIST_STR_ZEBRA " " VRF_ALL_CMD_STR,
3522: SHOW_STR
3523: IP_STR
3524: "IP routing table\n"
3525: QUAGGA_IP6_REDIST_HELP_STR_ZEBRA
3526: VRF_ALL_CMD_HELP_STR)
3527: {
3528: int type;
3529: struct route_table *table;
3530: struct route_node *rn;
3531: struct rib *rib;
3532: struct zebra_vrf *zvrf;
3533: vrf_iter_t iter;
3534: int first = 1;
3535:
3536: type = proto_redistnum (AFI_IP6, argv[0]);
3537: if (type < 0)
3538: {
3539: vty_out (vty, "Unknown route type%s", VTY_NEWLINE);
3540: return CMD_WARNING;
3541: }
3542:
3543: for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
3544: {
3545: if ((zvrf = vrf_iter2info (iter)) == NULL ||
3546: (table = zvrf->table[AFI_IP6][SAFI_UNICAST]) == NULL)
3547: continue;
3548:
3549: /* Show matched type IPv6 routes. */
3550: for (rn = route_top (table); rn; rn = route_next (rn))
3551: RNODE_FOREACH_RIB (rn, rib)
3552: if (rib->type == type)
3553: {
3554: if (first)
3555: {
3556: vty_out (vty, SHOW_ROUTE_V6_HEADER);
3557: first = 0;
3558: }
3559: vty_show_ip_route (vty, rn, rib);
3560: }
3561: }
3562:
3563: return CMD_SUCCESS;
3564: }
3565:
3566: DEFUN (show_ipv6_route_addr_vrf_all,
3567: show_ipv6_route_addr_vrf_all_cmd,
3568: "show ipv6 route X:X::X:X " VRF_ALL_CMD_STR,
3569: SHOW_STR
3570: IP_STR
3571: "IPv6 routing table\n"
3572: "IPv6 Address\n"
3573: VRF_ALL_CMD_HELP_STR)
3574: {
3575: int ret;
3576: struct prefix_ipv6 p;
3577: struct route_table *table;
3578: struct route_node *rn;
3579: struct zebra_vrf *zvrf;
3580: vrf_iter_t iter;
3581:
3582: ret = str2prefix_ipv6 (argv[0], &p);
3583: if (ret <= 0)
3584: {
3585: vty_out (vty, "Malformed IPv6 address%s", VTY_NEWLINE);
3586: return CMD_WARNING;
3587: }
3588:
3589: for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
3590: {
3591: if ((zvrf = vrf_iter2info (iter)) == NULL ||
3592: (table = zvrf->table[AFI_IP6][SAFI_UNICAST]) == NULL)
3593: continue;
3594:
3595: rn = route_node_match (table, (struct prefix *) &p);
3596: if (! rn)
3597: continue;
3598:
3599: vty_show_ip_route_detail (vty, rn, 0);
3600:
3601: route_unlock_node (rn);
3602: }
3603:
3604: return CMD_SUCCESS;
3605: }
3606:
3607: DEFUN (show_ipv6_route_prefix_vrf_all,
3608: show_ipv6_route_prefix_vrf_all_cmd,
3609: "show ipv6 route X:X::X:X/M " VRF_ALL_CMD_STR,
3610: SHOW_STR
3611: IP_STR
3612: "IPv6 routing table\n"
3613: "IPv6 prefix\n"
3614: VRF_ALL_CMD_HELP_STR)
3615: {
3616: int ret;
3617: struct prefix_ipv6 p;
3618: struct route_table *table;
3619: struct route_node *rn;
3620: struct zebra_vrf *zvrf;
3621: vrf_iter_t iter;
3622:
3623: ret = str2prefix_ipv6 (argv[0], &p);
3624: if (ret <= 0)
3625: {
3626: vty_out (vty, "Malformed IPv6 prefix%s", VTY_NEWLINE);
3627: return CMD_WARNING;
3628: }
3629:
3630: for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
3631: {
3632: if ((zvrf = vrf_iter2info (iter)) == NULL ||
3633: (table = zvrf->table[AFI_IP6][SAFI_UNICAST]) == NULL)
3634: continue;
3635:
3636: rn = route_node_match (table, (struct prefix *) &p);
3637: if (! rn)
3638: continue;
3639: if (rn->p.prefixlen != p.prefixlen)
3640: {
3641: route_unlock_node (rn);
3642: continue;
3643: }
3644:
3645: vty_show_ip_route_detail (vty, rn, 0);
3646:
3647: route_unlock_node (rn);
3648: }
3649:
3650: return CMD_SUCCESS;
3651: }
3652:
3653: /* Show route summary. */
3654: DEFUN (show_ipv6_route_summary_vrf_all,
3655: show_ipv6_route_summary_vrf_all_cmd,
3656: "show ipv6 route summary " VRF_ALL_CMD_STR,
3657: SHOW_STR
3658: IP_STR
3659: "IPv6 routing table\n"
3660: "Summary of all IPv6 routes\n"
3661: VRF_ALL_CMD_HELP_STR)
3662: {
3663: struct zebra_vrf *zvrf;
3664: vrf_iter_t iter;
3665:
3666: for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
3667: if ((zvrf = vrf_iter2info (iter)) != NULL)
3668: vty_show_ip_route_summary (vty, zvrf->table[AFI_IP6][SAFI_UNICAST]);
3669:
3670: return CMD_SUCCESS;
3671: }
3672:
3673: DEFUN (show_ipv6_mroute_vrf_all,
3674: show_ipv6_mroute_vrf_all_cmd,
3675: "show ipv6 mroute " VRF_ALL_CMD_STR,
3676: SHOW_STR
3677: IP_STR
3678: "IPv6 Multicast routing table\n"
3679: VRF_ALL_CMD_HELP_STR)
3680: {
3681: struct route_table *table;
3682: struct route_node *rn;
3683: struct rib *rib;
3684: struct zebra_vrf *zvrf;
3685: vrf_iter_t iter;
3686: int first = 1;
3687:
3688: for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
3689: {
3690: if ((zvrf = vrf_iter2info (iter)) == NULL ||
3691: (table = zvrf->table[AFI_IP6][SAFI_UNICAST]) == NULL)
3692: continue;
3693:
3694: /* Show all IPv6 route. */
3695: for (rn = route_top (table); rn; rn = route_next (rn))
3696: RNODE_FOREACH_RIB (rn, rib)
3697: {
3698: if (first)
3699: {
3700: vty_out (vty, SHOW_ROUTE_V6_HEADER);
3701: first = 0;
3702: }
3703: vty_show_ip_route (vty, rn, rib);
3704: }
3705: }
3706: return CMD_SUCCESS;
3707: }
3708:
3709: DEFUN (show_ipv6_route_summary_prefix_vrf_all,
3710: show_ipv6_route_summary_prefix_vrf_all_cmd,
3711: "show ipv6 route summary prefix " VRF_ALL_CMD_STR,
3712: SHOW_STR
3713: IP_STR
3714: "IPv6 routing table\n"
3715: "Summary of all IPv6 routes\n"
3716: "Prefix routes\n"
3717: VRF_ALL_CMD_HELP_STR)
3718: {
3719: struct zebra_vrf *zvrf;
3720: vrf_iter_t iter;
3721:
3722: for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
3723: if ((zvrf = vrf_iter2info (iter)) != NULL)
3724: vty_show_ip_route_summary_prefix (vty, zvrf->table[AFI_IP6][SAFI_UNICAST]);
3725:
3726: return CMD_SUCCESS;
3727: }
3728:
3729: /* Write IPv6 static route configuration. */
3730: static int
3731: static_config_ipv6 (struct vty *vty)
3732: {
3733: struct route_node *rn;
3734: struct static_route *si;
3735: int write;
3736: char buf[BUFSIZ];
3737: struct route_table *stable;
3738: struct zebra_vrf *zvrf;
3739: vrf_iter_t iter;
3740:
3741: write = 0;
3742:
3743: for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
3744: {
3745: if ((zvrf = vrf_iter2info (iter)) == NULL ||
3746: (stable = zvrf->stable[AFI_IP6][SAFI_UNICAST]) == NULL)
3747: continue;
3748:
3749: for (rn = route_top (stable); rn; rn = route_next (rn))
3750: for (si = rn->info; si; si = si->next)
3751: {
3752: vty_out (vty, "ipv6 route %s", prefix2str (&rn->p, buf, sizeof buf));
3753:
3754: switch (si->type)
3755: {
3756: case STATIC_IPV6_GATEWAY:
3757: vty_out (vty, " %s",
3758: inet_ntop (AF_INET6, &si->addr.ipv6, buf, BUFSIZ));
3759: break;
3760: case STATIC_IPV6_IFNAME:
3761: vty_out (vty, " %s", si->ifname);
3762: break;
3763: case STATIC_IPV6_GATEWAY_IFNAME:
3764: vty_out (vty, " %s %s",
3765: inet_ntop (AF_INET6, &si->addr.ipv6, buf, BUFSIZ),
3766: si->ifname);
3767: break;
3768: }
3769:
3770: if (CHECK_FLAG(si->flags, ZEBRA_FLAG_REJECT))
3771: vty_out (vty, " %s", "reject");
3772:
3773: if (CHECK_FLAG(si->flags, ZEBRA_FLAG_BLACKHOLE))
3774: vty_out (vty, " %s", "blackhole");
3775:
3776: if (si->distance != ZEBRA_STATIC_DISTANCE_DEFAULT)
3777: vty_out (vty, " %d", si->distance);
3778:
3779: if (si->vrf_id != VRF_DEFAULT)
3780: vty_out (vty, " vrf %u", si->vrf_id);
3781:
3782: vty_out (vty, "%s", VTY_NEWLINE);
3783:
3784: write = 1;
3785: }
3786: }
3787: return write;
3788: }
3789: #endif /* HAVE_IPV6 */
3790:
3791: /* Static ip route configuration write function. */
3792: static int
3793: zebra_ip_config (struct vty *vty)
3794: {
3795: int write = 0;
3796:
3797: write += static_config_ipv4 (vty, SAFI_UNICAST, "ip route");
3798: write += static_config_ipv4 (vty, SAFI_MULTICAST, "ip mroute");
3799: #ifdef HAVE_IPV6
3800: write += static_config_ipv6 (vty);
3801: #endif /* HAVE_IPV6 */
3802:
3803: return write;
3804: }
3805:
3806: static int config_write_vty(struct vty *vty)
3807: {
3808: int i;
3809: enum multicast_mode ipv4_multicast_mode = multicast_mode_ipv4_get ();
3810:
3811: if (ipv4_multicast_mode != MCAST_NO_CONFIG)
3812: vty_out (vty, "ip multicast rpf-lookup-mode %s%s",
3813: ipv4_multicast_mode == MCAST_URIB_ONLY ? "urib-only" :
3814: ipv4_multicast_mode == MCAST_MRIB_ONLY ? "mrib-only" :
3815: ipv4_multicast_mode == MCAST_MIX_MRIB_FIRST ? "mrib-then-urib" :
3816: ipv4_multicast_mode == MCAST_MIX_DISTANCE ? "lower-distance" :
3817: "longer-prefix",
3818: VTY_NEWLINE);
3819:
3820: for (i=0;i<ZEBRA_ROUTE_MAX;i++)
3821: {
3822: if (proto_rm[AFI_IP][i])
3823: vty_out (vty, "ip protocol %s route-map %s%s", zebra_route_string(i),
3824: proto_rm[AFI_IP][i], VTY_NEWLINE);
3825: }
3826: if (proto_rm[AFI_IP][ZEBRA_ROUTE_MAX])
3827: vty_out (vty, "ip protocol %s route-map %s%s", "any",
3828: proto_rm[AFI_IP][ZEBRA_ROUTE_MAX], VTY_NEWLINE);
3829:
3830: return 1;
3831: }
3832:
3833: /* table node for protocol filtering */
3834: static struct cmd_node protocol_node = { PROTOCOL_NODE, "", 1 };
3835:
3836: /* IP node for static routes. */
3837: static struct cmd_node ip_node = { IP_NODE, "", 1 };
3838:
3839: /* Route VTY. */
3840: void
3841: zebra_vty_init (void)
3842: {
3843: install_node (&ip_node, zebra_ip_config);
3844: install_node (&protocol_node, config_write_vty);
3845:
3846: install_element (CONFIG_NODE, &ip_mroute_cmd);
3847: install_element (CONFIG_NODE, &ip_mroute_dist_cmd);
3848: install_element (CONFIG_NODE, &no_ip_mroute_cmd);
3849: install_element (CONFIG_NODE, &no_ip_mroute_dist_cmd);
3850: install_element (CONFIG_NODE, &ip_multicast_mode_cmd);
3851: install_element (CONFIG_NODE, &no_ip_multicast_mode_cmd);
3852: install_element (CONFIG_NODE, &no_ip_multicast_mode_noarg_cmd);
3853: install_element (CONFIG_NODE, &ip_protocol_cmd);
3854: install_element (CONFIG_NODE, &no_ip_protocol_cmd);
3855: install_element (VIEW_NODE, &show_ip_protocol_cmd);
3856: install_element (ENABLE_NODE, &show_ip_protocol_cmd);
3857: install_element (CONFIG_NODE, &ip_route_cmd);
3858: install_element (CONFIG_NODE, &ip_route_flags_cmd);
3859: install_element (CONFIG_NODE, &ip_route_flags2_cmd);
3860: install_element (CONFIG_NODE, &ip_route_mask_cmd);
3861: install_element (CONFIG_NODE, &ip_route_mask_flags_cmd);
3862: install_element (CONFIG_NODE, &ip_route_mask_flags2_cmd);
3863: install_element (CONFIG_NODE, &no_ip_route_cmd);
3864: install_element (CONFIG_NODE, &no_ip_route_flags_cmd);
3865: install_element (CONFIG_NODE, &no_ip_route_flags2_cmd);
3866: install_element (CONFIG_NODE, &no_ip_route_mask_cmd);
3867: install_element (CONFIG_NODE, &no_ip_route_mask_flags_cmd);
3868: install_element (CONFIG_NODE, &no_ip_route_mask_flags2_cmd);
3869: install_element (CONFIG_NODE, &ip_route_distance_cmd);
3870: install_element (CONFIG_NODE, &ip_route_flags_distance_cmd);
3871: install_element (CONFIG_NODE, &ip_route_flags_distance2_cmd);
3872: install_element (CONFIG_NODE, &ip_route_mask_distance_cmd);
3873: install_element (CONFIG_NODE, &ip_route_mask_flags_distance_cmd);
3874: install_element (CONFIG_NODE, &ip_route_mask_flags_distance2_cmd);
3875: install_element (CONFIG_NODE, &no_ip_route_distance_cmd);
3876: install_element (CONFIG_NODE, &no_ip_route_flags_distance_cmd);
3877: install_element (CONFIG_NODE, &no_ip_route_flags_distance2_cmd);
3878: install_element (CONFIG_NODE, &no_ip_route_mask_flags_distance_cmd);
3879: install_element (CONFIG_NODE, &no_ip_route_mask_flags_distance2_cmd);
3880:
3881: install_element (VIEW_NODE, &show_ip_route_cmd);
3882: install_element (VIEW_NODE, &show_ip_route_addr_cmd);
3883: install_element (VIEW_NODE, &show_ip_route_prefix_cmd);
3884: install_element (VIEW_NODE, &show_ip_route_prefix_longer_cmd);
3885: install_element (VIEW_NODE, &show_ip_route_protocol_cmd);
3886: install_element (VIEW_NODE, &show_ip_route_supernets_cmd);
3887: install_element (VIEW_NODE, &show_ip_route_summary_cmd);
3888: install_element (VIEW_NODE, &show_ip_route_summary_prefix_cmd);
3889: install_element (ENABLE_NODE, &show_ip_route_cmd);
3890: install_element (ENABLE_NODE, &show_ip_route_addr_cmd);
3891: install_element (ENABLE_NODE, &show_ip_route_prefix_cmd);
3892: install_element (ENABLE_NODE, &show_ip_route_prefix_longer_cmd);
3893: install_element (ENABLE_NODE, &show_ip_route_protocol_cmd);
3894: install_element (ENABLE_NODE, &show_ip_route_supernets_cmd);
3895: install_element (ENABLE_NODE, &show_ip_route_summary_cmd);
3896: install_element (ENABLE_NODE, &show_ip_route_summary_prefix_cmd);
3897:
3898: install_element (VIEW_NODE, &show_ip_rpf_cmd);
3899: install_element (ENABLE_NODE, &show_ip_rpf_cmd);
3900: install_element (VIEW_NODE, &show_ip_rpf_addr_cmd);
3901: install_element (ENABLE_NODE, &show_ip_rpf_addr_cmd);
3902:
3903: /* Commands for VRF */
3904:
3905: install_element (CONFIG_NODE, &ip_mroute_vrf_cmd);
3906: install_element (CONFIG_NODE, &ip_mroute_dist_vrf_cmd);
3907: install_element (CONFIG_NODE, &no_ip_mroute_vrf_cmd);
3908: install_element (CONFIG_NODE, &no_ip_mroute_dist_vrf_cmd);
3909:
3910: install_element (CONFIG_NODE, &ip_route_vrf_cmd);
3911: install_element (CONFIG_NODE, &ip_route_flags_vrf_cmd);
3912: install_element (CONFIG_NODE, &ip_route_flags2_vrf_cmd);
3913: install_element (CONFIG_NODE, &ip_route_mask_vrf_cmd);
3914: install_element (CONFIG_NODE, &ip_route_mask_flags_vrf_cmd);
3915: install_element (CONFIG_NODE, &ip_route_mask_flags2_vrf_cmd);
3916: install_element (CONFIG_NODE, &no_ip_route_vrf_cmd);
3917: install_element (CONFIG_NODE, &no_ip_route_flags_vrf_cmd);
3918: install_element (CONFIG_NODE, &no_ip_route_flags2_vrf_cmd);
3919: install_element (CONFIG_NODE, &no_ip_route_mask_vrf_cmd);
3920: install_element (CONFIG_NODE, &no_ip_route_mask_flags_vrf_cmd);
3921: install_element (CONFIG_NODE, &no_ip_route_mask_flags2_vrf_cmd);
3922: install_element (CONFIG_NODE, &ip_route_distance_vrf_cmd);
3923: install_element (CONFIG_NODE, &ip_route_flags_distance_vrf_cmd);
3924: install_element (CONFIG_NODE, &ip_route_flags_distance2_vrf_cmd);
3925: install_element (CONFIG_NODE, &ip_route_mask_distance_vrf_cmd);
3926: install_element (CONFIG_NODE, &ip_route_mask_flags_distance_vrf_cmd);
3927: install_element (CONFIG_NODE, &ip_route_mask_flags_distance2_vrf_cmd);
3928: install_element (CONFIG_NODE, &no_ip_route_distance_vrf_cmd);
3929: install_element (CONFIG_NODE, &no_ip_route_flags_distance_vrf_cmd);
3930: install_element (CONFIG_NODE, &no_ip_route_flags_distance2_vrf_cmd);
3931: install_element (CONFIG_NODE, &no_ip_route_mask_flags_distance_vrf_cmd);
3932: install_element (CONFIG_NODE, &no_ip_route_mask_flags_distance2_vrf_cmd);
3933:
3934: install_element (VIEW_NODE, &show_ip_route_vrf_cmd);
3935: install_element (VIEW_NODE, &show_ip_route_addr_vrf_cmd);
3936: install_element (VIEW_NODE, &show_ip_route_prefix_vrf_cmd);
3937: install_element (VIEW_NODE, &show_ip_route_prefix_longer_vrf_cmd);
3938: install_element (VIEW_NODE, &show_ip_route_protocol_vrf_cmd);
3939: install_element (VIEW_NODE, &show_ip_route_supernets_vrf_cmd);
3940: install_element (VIEW_NODE, &show_ip_route_summary_vrf_cmd);
3941: install_element (VIEW_NODE, &show_ip_route_summary_prefix_vrf_cmd);
3942: install_element (ENABLE_NODE, &show_ip_route_vrf_cmd);
3943: install_element (ENABLE_NODE, &show_ip_route_addr_vrf_cmd);
3944: install_element (ENABLE_NODE, &show_ip_route_prefix_vrf_cmd);
3945: install_element (ENABLE_NODE, &show_ip_route_prefix_longer_vrf_cmd);
3946: install_element (ENABLE_NODE, &show_ip_route_protocol_vrf_cmd);
3947: install_element (ENABLE_NODE, &show_ip_route_supernets_vrf_cmd);
3948: install_element (ENABLE_NODE, &show_ip_route_summary_vrf_cmd);
3949: install_element (ENABLE_NODE, &show_ip_route_summary_prefix_vrf_cmd);
3950:
3951: install_element (VIEW_NODE, &show_ip_route_vrf_all_cmd);
3952: install_element (VIEW_NODE, &show_ip_route_addr_vrf_all_cmd);
3953: install_element (VIEW_NODE, &show_ip_route_prefix_vrf_all_cmd);
3954: install_element (VIEW_NODE, &show_ip_route_prefix_longer_vrf_all_cmd);
3955: install_element (VIEW_NODE, &show_ip_route_protocol_vrf_all_cmd);
3956: install_element (VIEW_NODE, &show_ip_route_supernets_vrf_all_cmd);
3957: install_element (VIEW_NODE, &show_ip_route_summary_vrf_all_cmd);
3958: install_element (VIEW_NODE, &show_ip_route_summary_prefix_vrf_all_cmd);
3959: install_element (ENABLE_NODE, &show_ip_route_vrf_all_cmd);
3960: install_element (ENABLE_NODE, &show_ip_route_addr_vrf_all_cmd);
3961: install_element (ENABLE_NODE, &show_ip_route_prefix_vrf_all_cmd);
3962: install_element (ENABLE_NODE, &show_ip_route_prefix_longer_vrf_all_cmd);
3963: install_element (ENABLE_NODE, &show_ip_route_protocol_vrf_all_cmd);
3964: install_element (ENABLE_NODE, &show_ip_route_supernets_vrf_all_cmd);
3965: install_element (ENABLE_NODE, &show_ip_route_summary_vrf_all_cmd);
3966: install_element (ENABLE_NODE, &show_ip_route_summary_prefix_vrf_all_cmd);
3967:
3968: install_element (VIEW_NODE, &show_ip_rpf_vrf_cmd);
3969: install_element (VIEW_NODE, &show_ip_rpf_vrf_all_cmd);
3970: install_element (VIEW_NODE, &show_ip_rpf_addr_vrf_cmd);
3971: install_element (VIEW_NODE, &show_ip_rpf_addr_vrf_all_cmd);
3972: install_element (ENABLE_NODE, &show_ip_rpf_vrf_cmd);
3973: install_element (ENABLE_NODE, &show_ip_rpf_vrf_all_cmd);
3974: install_element (ENABLE_NODE, &show_ip_rpf_addr_vrf_cmd);
3975: install_element (ENABLE_NODE, &show_ip_rpf_addr_vrf_all_cmd);
3976:
3977: #ifdef HAVE_IPV6
3978: install_element (CONFIG_NODE, &ipv6_route_cmd);
3979: install_element (CONFIG_NODE, &ipv6_route_flags_cmd);
3980: install_element (CONFIG_NODE, &ipv6_route_ifname_cmd);
3981: install_element (CONFIG_NODE, &ipv6_route_ifname_flags_cmd);
3982: install_element (CONFIG_NODE, &no_ipv6_route_cmd);
3983: install_element (CONFIG_NODE, &no_ipv6_route_flags_cmd);
3984: install_element (CONFIG_NODE, &no_ipv6_route_ifname_cmd);
3985: install_element (CONFIG_NODE, &no_ipv6_route_ifname_flags_cmd);
3986: install_element (CONFIG_NODE, &ipv6_route_pref_cmd);
3987: install_element (CONFIG_NODE, &ipv6_route_flags_pref_cmd);
3988: install_element (CONFIG_NODE, &ipv6_route_ifname_pref_cmd);
3989: install_element (CONFIG_NODE, &ipv6_route_ifname_flags_pref_cmd);
3990: install_element (CONFIG_NODE, &no_ipv6_route_pref_cmd);
3991: install_element (CONFIG_NODE, &no_ipv6_route_flags_pref_cmd);
3992: install_element (CONFIG_NODE, &no_ipv6_route_ifname_pref_cmd);
3993: install_element (CONFIG_NODE, &no_ipv6_route_ifname_flags_pref_cmd);
3994: install_element (VIEW_NODE, &show_ipv6_route_cmd);
3995: install_element (VIEW_NODE, &show_ipv6_route_summary_cmd);
3996: install_element (VIEW_NODE, &show_ipv6_route_summary_prefix_cmd);
3997: install_element (VIEW_NODE, &show_ipv6_route_protocol_cmd);
3998: install_element (VIEW_NODE, &show_ipv6_route_addr_cmd);
3999: install_element (VIEW_NODE, &show_ipv6_route_prefix_cmd);
4000: install_element (VIEW_NODE, &show_ipv6_route_prefix_longer_cmd);
4001: install_element (ENABLE_NODE, &show_ipv6_route_cmd);
4002: install_element (ENABLE_NODE, &show_ipv6_route_protocol_cmd);
4003: install_element (ENABLE_NODE, &show_ipv6_route_addr_cmd);
4004: install_element (ENABLE_NODE, &show_ipv6_route_prefix_cmd);
4005: install_element (ENABLE_NODE, &show_ipv6_route_prefix_longer_cmd);
4006: install_element (ENABLE_NODE, &show_ipv6_route_summary_cmd);
4007: install_element (ENABLE_NODE, &show_ipv6_route_summary_prefix_cmd);
4008:
4009: install_element (VIEW_NODE, &show_ipv6_mroute_cmd);
4010: install_element (ENABLE_NODE, &show_ipv6_mroute_cmd);
4011:
4012: /* Commands for VRF */
4013:
4014: install_element (CONFIG_NODE, &ipv6_route_vrf_cmd);
4015: install_element (CONFIG_NODE, &ipv6_route_flags_vrf_cmd);
4016: install_element (CONFIG_NODE, &ipv6_route_ifname_vrf_cmd);
4017: install_element (CONFIG_NODE, &ipv6_route_ifname_flags_vrf_cmd);
4018: install_element (CONFIG_NODE, &no_ipv6_route_vrf_cmd);
4019: install_element (CONFIG_NODE, &no_ipv6_route_flags_vrf_cmd);
4020: install_element (CONFIG_NODE, &no_ipv6_route_ifname_vrf_cmd);
4021: install_element (CONFIG_NODE, &no_ipv6_route_ifname_flags_vrf_cmd);
4022: install_element (CONFIG_NODE, &ipv6_route_pref_vrf_cmd);
4023: install_element (CONFIG_NODE, &ipv6_route_flags_pref_vrf_cmd);
4024: install_element (CONFIG_NODE, &ipv6_route_ifname_pref_vrf_cmd);
4025: install_element (CONFIG_NODE, &ipv6_route_ifname_flags_pref_vrf_cmd);
4026: install_element (CONFIG_NODE, &no_ipv6_route_pref_vrf_cmd);
4027: install_element (CONFIG_NODE, &no_ipv6_route_flags_pref_vrf_cmd);
4028: install_element (CONFIG_NODE, &no_ipv6_route_ifname_pref_vrf_cmd);
4029: install_element (CONFIG_NODE, &no_ipv6_route_ifname_flags_pref_vrf_cmd);
4030:
4031: install_element (VIEW_NODE, &show_ipv6_route_vrf_cmd);
4032: install_element (VIEW_NODE, &show_ipv6_route_summary_vrf_cmd);
4033: install_element (VIEW_NODE, &show_ipv6_route_summary_prefix_vrf_cmd);
4034: install_element (VIEW_NODE, &show_ipv6_route_protocol_vrf_cmd);
4035: install_element (VIEW_NODE, &show_ipv6_route_addr_vrf_cmd);
4036: install_element (VIEW_NODE, &show_ipv6_route_prefix_vrf_cmd);
4037: install_element (VIEW_NODE, &show_ipv6_route_prefix_longer_vrf_cmd);
4038: install_element (ENABLE_NODE, &show_ipv6_route_vrf_cmd);
4039: install_element (ENABLE_NODE, &show_ipv6_route_protocol_vrf_cmd);
4040: install_element (ENABLE_NODE, &show_ipv6_route_addr_vrf_cmd);
4041: install_element (ENABLE_NODE, &show_ipv6_route_prefix_vrf_cmd);
4042: install_element (ENABLE_NODE, &show_ipv6_route_prefix_longer_vrf_cmd);
4043: install_element (ENABLE_NODE, &show_ipv6_route_summary_vrf_cmd);
4044: install_element (ENABLE_NODE, &show_ipv6_route_summary_prefix_vrf_cmd);
4045:
4046: install_element (VIEW_NODE, &show_ipv6_route_vrf_all_cmd);
4047: install_element (VIEW_NODE, &show_ipv6_route_summary_vrf_all_cmd);
4048: install_element (VIEW_NODE, &show_ipv6_route_summary_prefix_vrf_all_cmd);
4049: install_element (VIEW_NODE, &show_ipv6_route_protocol_vrf_all_cmd);
4050: install_element (VIEW_NODE, &show_ipv6_route_addr_vrf_all_cmd);
4051: install_element (VIEW_NODE, &show_ipv6_route_prefix_vrf_all_cmd);
4052: install_element (VIEW_NODE, &show_ipv6_route_prefix_longer_vrf_all_cmd);
4053: install_element (ENABLE_NODE, &show_ipv6_route_vrf_all_cmd);
4054: install_element (ENABLE_NODE, &show_ipv6_route_protocol_vrf_all_cmd);
4055: install_element (ENABLE_NODE, &show_ipv6_route_addr_vrf_all_cmd);
4056: install_element (ENABLE_NODE, &show_ipv6_route_prefix_vrf_all_cmd);
4057: install_element (ENABLE_NODE, &show_ipv6_route_prefix_longer_vrf_all_cmd);
4058: install_element (ENABLE_NODE, &show_ipv6_route_summary_vrf_all_cmd);
4059: install_element (ENABLE_NODE, &show_ipv6_route_summary_prefix_vrf_all_cmd);
4060:
4061: install_element (VIEW_NODE, &show_ipv6_mroute_vrf_cmd);
4062: install_element (ENABLE_NODE, &show_ipv6_mroute_vrf_cmd);
4063:
4064: install_element (VIEW_NODE, &show_ipv6_mroute_vrf_all_cmd);
4065: install_element (ENABLE_NODE, &show_ipv6_mroute_vrf_all_cmd);
4066: #endif /* HAVE_IPV6 */
4067: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>