Annotation of embedaddon/quagga/ospfd/ospf_vty.c, revision 1.1.1.1
1.1 misho 1: /* OSPF VTY interface.
2: * Copyright (C) 2005 6WIND <alain.ritoux@6wind.com>
3: * Copyright (C) 2000 Toshiaki Takada
4: *
5: * This file is part of GNU Zebra.
6: *
7: * GNU Zebra is free software; you can redistribute it and/or modify it
8: * under the terms of the GNU General Public License as published by the
9: * Free Software Foundation; either version 2, or (at your option) any
10: * later version.
11: *
12: * GNU Zebra is distributed in the hope that it will be useful, but
13: * WITHOUT ANY WARRANTY; without even the implied warranty of
14: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15: * General Public License for more details.
16: *
17: * You should have received a copy of the GNU General Public License
18: * along with GNU Zebra; see the file COPYING. If not, write to the Free
19: * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
20: * 02111-1307, USA.
21: */
22:
23: #include <zebra.h>
24:
25: #include "memory.h"
26: #include "thread.h"
27: #include "prefix.h"
28: #include "table.h"
29: #include "vty.h"
30: #include "command.h"
31: #include "plist.h"
32: #include "log.h"
33: #include "zclient.h"
34:
35: #include "ospfd/ospfd.h"
36: #include "ospfd/ospf_asbr.h"
37: #include "ospfd/ospf_lsa.h"
38: #include "ospfd/ospf_lsdb.h"
39: #include "ospfd/ospf_ism.h"
40: #include "ospfd/ospf_interface.h"
41: #include "ospfd/ospf_nsm.h"
42: #include "ospfd/ospf_neighbor.h"
43: #include "ospfd/ospf_flood.h"
44: #include "ospfd/ospf_abr.h"
45: #include "ospfd/ospf_spf.h"
46: #include "ospfd/ospf_route.h"
47: #include "ospfd/ospf_zebra.h"
48: /*#include "ospfd/ospf_routemap.h" */
49: #include "ospfd/ospf_vty.h"
50: #include "ospfd/ospf_dump.h"
51:
52:
53: static const char *ospf_network_type_str[] =
54: {
55: "Null",
56: "POINTOPOINT",
57: "BROADCAST",
58: "NBMA",
59: "POINTOMULTIPOINT",
60: "VIRTUALLINK",
61: "LOOPBACK"
62: };
63:
64:
65: /* Utility functions. */
66: static int
67: ospf_str2area_id (const char *str, struct in_addr *area_id, int *format)
68: {
69: char *endptr = NULL;
70: unsigned long ret;
71:
72: /* match "A.B.C.D". */
73: if (strchr (str, '.') != NULL)
74: {
75: ret = inet_aton (str, area_id);
76: if (!ret)
77: return -1;
78: *format = OSPF_AREA_ID_FORMAT_ADDRESS;
79: }
80: /* match "<0-4294967295>". */
81: else
82: {
83: ret = strtoul (str, &endptr, 10);
84: if (*endptr != '\0' || (ret == ULONG_MAX && errno == ERANGE))
85: return -1;
86:
87: area_id->s_addr = htonl (ret);
88: *format = OSPF_AREA_ID_FORMAT_DECIMAL;
89: }
90:
91: return 0;
92: }
93:
94:
95: static int
96: str2distribute_source (const char *str, int *source)
97: {
98: /* Sanity check. */
99: if (str == NULL)
100: return 0;
101:
102: if (strncmp (str, "k", 1) == 0)
103: *source = ZEBRA_ROUTE_KERNEL;
104: else if (strncmp (str, "c", 1) == 0)
105: *source = ZEBRA_ROUTE_CONNECT;
106: else if (strncmp (str, "s", 1) == 0)
107: *source = ZEBRA_ROUTE_STATIC;
108: else if (strncmp (str, "r", 1) == 0)
109: *source = ZEBRA_ROUTE_RIP;
110: else if (strncmp (str, "b", 1) == 0)
111: *source = ZEBRA_ROUTE_BGP;
112: else
113: return 0;
114:
115: return 1;
116: }
117:
118: static int
119: str2metric (const char *str, int *metric)
120: {
121: /* Sanity check. */
122: if (str == NULL)
123: return 0;
124:
125: *metric = strtol (str, NULL, 10);
126: if (*metric < 0 && *metric > 16777214)
127: {
128: /* vty_out (vty, "OSPF metric value is invalid%s", VTY_NEWLINE); */
129: return 0;
130: }
131:
132: return 1;
133: }
134:
135: static int
136: str2metric_type (const char *str, int *metric_type)
137: {
138: /* Sanity check. */
139: if (str == NULL)
140: return 0;
141:
142: if (strncmp (str, "1", 1) == 0)
143: *metric_type = EXTERNAL_METRIC_TYPE_1;
144: else if (strncmp (str, "2", 1) == 0)
145: *metric_type = EXTERNAL_METRIC_TYPE_2;
146: else
147: return 0;
148:
149: return 1;
150: }
151:
152: int
153: ospf_oi_count (struct interface *ifp)
154: {
155: struct route_node *rn;
156: int i = 0;
157:
158: for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn))
159: if (rn->info)
160: i++;
161:
162: return i;
163: }
164:
165:
166: DEFUN (router_ospf,
167: router_ospf_cmd,
168: "router ospf",
169: "Enable a routing process\n"
170: "Start OSPF configuration\n")
171: {
172: vty->node = OSPF_NODE;
173: vty->index = ospf_get ();
174:
175: return CMD_SUCCESS;
176: }
177:
178: DEFUN (no_router_ospf,
179: no_router_ospf_cmd,
180: "no router ospf",
181: NO_STR
182: "Enable a routing process\n"
183: "Start OSPF configuration\n")
184: {
185: struct ospf *ospf;
186:
187: ospf = ospf_lookup ();
188: if (ospf == NULL)
189: {
190: vty_out (vty, "There isn't active ospf instance%s", VTY_NEWLINE);
191: return CMD_WARNING;
192: }
193:
194: ospf_finish (ospf);
195:
196: return CMD_SUCCESS;
197: }
198:
199: DEFUN (ospf_router_id,
200: ospf_router_id_cmd,
201: "ospf router-id A.B.C.D",
202: "OSPF specific commands\n"
203: "router-id for the OSPF process\n"
204: "OSPF router-id in IP address format\n")
205: {
206: struct ospf *ospf = vty->index;
207: struct in_addr router_id;
208: int ret;
209:
210: ret = inet_aton (argv[0], &router_id);
211: if (!ret)
212: {
213: vty_out (vty, "Please specify Router ID by A.B.C.D%s", VTY_NEWLINE);
214: return CMD_WARNING;
215: }
216:
217: ospf->router_id_static = router_id;
218:
219: ospf_router_id_update (ospf);
220:
221: return CMD_SUCCESS;
222: }
223:
224: ALIAS (ospf_router_id,
225: router_ospf_id_cmd,
226: "router-id A.B.C.D",
227: "router-id for the OSPF process\n"
228: "OSPF router-id in IP address format\n")
229:
230: DEFUN (no_ospf_router_id,
231: no_ospf_router_id_cmd,
232: "no ospf router-id",
233: NO_STR
234: "OSPF specific commands\n"
235: "router-id for the OSPF process\n")
236: {
237: struct ospf *ospf = vty->index;
238:
239: ospf->router_id_static.s_addr = 0;
240:
241: ospf_router_id_update (ospf);
242:
243: return CMD_SUCCESS;
244: }
245:
246: ALIAS (no_ospf_router_id,
247: no_router_ospf_id_cmd,
248: "no router-id",
249: NO_STR
250: "router-id for the OSPF process\n")
251:
252: static void
253: ospf_passive_interface_default (struct ospf *ospf, u_char newval)
254: {
255: struct listnode *ln;
256: struct interface *ifp;
257: struct ospf_interface *oi;
258:
259: ospf->passive_interface_default = newval;
260:
261: for (ALL_LIST_ELEMENTS_RO (om->iflist, ln, ifp))
262: {
263: if (ifp &&
264: OSPF_IF_PARAM_CONFIGURED (IF_DEF_PARAMS (ifp), passive_interface))
265: UNSET_IF_PARAM (IF_DEF_PARAMS (ifp), passive_interface);
266: }
267: for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, ln, oi))
268: {
269: if (OSPF_IF_PARAM_CONFIGURED (oi->params, passive_interface))
270: UNSET_IF_PARAM (oi->params, passive_interface);
271: /* update multicast memberships */
272: ospf_if_set_multicast(oi);
273: }
274: }
275:
276: static void
277: ospf_passive_interface_update (struct ospf *ospf, struct interface *ifp,
278: struct in_addr addr,
279: struct ospf_if_params *params, u_char value)
280: {
281: u_char dflt;
282:
283: params->passive_interface = value;
284: if (params != IF_DEF_PARAMS (ifp))
285: {
286: if (OSPF_IF_PARAM_CONFIGURED (IF_DEF_PARAMS (ifp), passive_interface))
287: dflt = IF_DEF_PARAMS (ifp)->passive_interface;
288: else
289: dflt = ospf->passive_interface_default;
290:
291: if (value != dflt)
292: SET_IF_PARAM (params, passive_interface);
293: else
294: UNSET_IF_PARAM (params, passive_interface);
295:
296: ospf_free_if_params (ifp, addr);
297: ospf_if_update_params (ifp, addr);
298: }
299: else
300: {
301: if (value != ospf->passive_interface_default)
302: SET_IF_PARAM (params, passive_interface);
303: else
304: UNSET_IF_PARAM (params, passive_interface);
305: }
306: }
307:
308: DEFUN (ospf_passive_interface,
309: ospf_passive_interface_addr_cmd,
310: "passive-interface IFNAME A.B.C.D",
311: "Suppress routing updates on an interface\n"
312: "Interface's name\n")
313: {
314: struct interface *ifp;
315: struct in_addr addr;
316: int ret;
317: struct ospf_if_params *params;
318: struct route_node *rn;
319: struct ospf *ospf = vty->index;
320:
321: if (argc == 0)
322: {
323: ospf_passive_interface_default (ospf, OSPF_IF_PASSIVE);
324: return CMD_SUCCESS;
325: }
326:
327: ifp = if_get_by_name (argv[0]);
328:
329: params = IF_DEF_PARAMS (ifp);
330:
331: if (argc == 2)
332: {
333: ret = inet_aton(argv[1], &addr);
334: if (!ret)
335: {
336: vty_out (vty, "Please specify interface address by A.B.C.D%s",
337: VTY_NEWLINE);
338: return CMD_WARNING;
339: }
340:
341: params = ospf_get_if_params (ifp, addr);
342: ospf_if_update_params (ifp, addr);
343: }
344: ospf_passive_interface_update (ospf, ifp, addr, params, OSPF_IF_PASSIVE);
345:
346: /* XXX We should call ospf_if_set_multicast on exactly those
347: * interfaces for which the passive property changed. It is too much
348: * work to determine this set, so we do this for every interface.
349: * This is safe and reasonable because ospf_if_set_multicast uses a
350: * record of joined groups to avoid systems calls if the desired
351: * memberships match the current memership.
352: */
353:
354: for (rn = route_top(IF_OIFS(ifp)); rn; rn = route_next (rn))
355: {
356: struct ospf_interface *oi = rn->info;
357:
358: if (oi && (OSPF_IF_PARAM(oi, passive_interface) == OSPF_IF_PASSIVE))
359: ospf_if_set_multicast(oi);
360: }
361: /*
362: * XXX It is not clear what state transitions the interface needs to
363: * undergo when going from active to passive. Fixing this will
364: * require precise identification of interfaces having such a
365: * transition.
366: */
367:
368: return CMD_SUCCESS;
369: }
370:
371: ALIAS (ospf_passive_interface,
372: ospf_passive_interface_cmd,
373: "passive-interface IFNAME",
374: "Suppress routing updates on an interface\n"
375: "Interface's name\n")
376:
377: ALIAS (ospf_passive_interface,
378: ospf_passive_interface_default_cmd,
379: "passive-interface default",
380: "Suppress routing updates on an interface\n"
381: "Suppress routing updates on interfaces by default\n")
382:
383: DEFUN (no_ospf_passive_interface,
384: no_ospf_passive_interface_addr_cmd,
385: "no passive-interface IFNAME A.B.C.D",
386: NO_STR
387: "Allow routing updates on an interface\n"
388: "Interface's name\n")
389: {
390: struct interface *ifp;
391: struct in_addr addr;
392: struct ospf_if_params *params;
393: int ret;
394: struct route_node *rn;
395: struct ospf *ospf = vty->index;
396:
397: if (argc == 0)
398: {
399: ospf_passive_interface_default (ospf, OSPF_IF_ACTIVE);
400: return CMD_SUCCESS;
401: }
402:
403: ifp = if_get_by_name (argv[0]);
404:
405: params = IF_DEF_PARAMS (ifp);
406:
407: if (argc == 2)
408: {
409: ret = inet_aton(argv[1], &addr);
410: if (!ret)
411: {
412: vty_out (vty, "Please specify interface address by A.B.C.D%s",
413: VTY_NEWLINE);
414: return CMD_WARNING;
415: }
416:
417: params = ospf_lookup_if_params (ifp, addr);
418: if (params == NULL)
419: return CMD_SUCCESS;
420: }
421: ospf_passive_interface_update (ospf, ifp, addr, params, OSPF_IF_ACTIVE);
422:
423: /* XXX We should call ospf_if_set_multicast on exactly those
424: * interfaces for which the passive property changed. It is too much
425: * work to determine this set, so we do this for every interface.
426: * This is safe and reasonable because ospf_if_set_multicast uses a
427: * record of joined groups to avoid systems calls if the desired
428: * memberships match the current memership.
429: */
430: for (rn = route_top(IF_OIFS(ifp)); rn; rn = route_next (rn))
431: {
432: struct ospf_interface *oi = rn->info;
433:
434: if (oi && (OSPF_IF_PARAM(oi, passive_interface) == OSPF_IF_ACTIVE))
435: ospf_if_set_multicast(oi);
436: }
437:
438: return CMD_SUCCESS;
439: }
440:
441: ALIAS (no_ospf_passive_interface,
442: no_ospf_passive_interface_cmd,
443: "no passive-interface IFNAME",
444: NO_STR
445: "Allow routing updates on an interface\n"
446: "Interface's name\n")
447:
448: ALIAS (no_ospf_passive_interface,
449: no_ospf_passive_interface_default_cmd,
450: "no passive-interface default",
451: NO_STR
452: "Allow routing updates on an interface\n"
453: "Allow routing updates on interfaces by default\n")
454:
455: DEFUN (ospf_network_area,
456: ospf_network_area_cmd,
457: "network A.B.C.D/M area (A.B.C.D|<0-4294967295>)",
458: "Enable routing on an IP network\n"
459: "OSPF network prefix\n"
460: "Set the OSPF area ID\n"
461: "OSPF area ID in IP address format\n"
462: "OSPF area ID as a decimal value\n")
463: {
464: struct ospf *ospf= vty->index;
465: struct prefix_ipv4 p;
466: struct in_addr area_id;
467: int ret, format;
468:
469: /* Get network prefix and Area ID. */
470: VTY_GET_IPV4_PREFIX ("network prefix", p, argv[0]);
471: VTY_GET_OSPF_AREA_ID (area_id, format, argv[1]);
472:
473: ret = ospf_network_set (ospf, &p, area_id);
474: if (ret == 0)
475: {
476: vty_out (vty, "There is already same network statement.%s", VTY_NEWLINE);
477: return CMD_WARNING;
478: }
479:
480: return CMD_SUCCESS;
481: }
482:
483: DEFUN (no_ospf_network_area,
484: no_ospf_network_area_cmd,
485: "no network A.B.C.D/M area (A.B.C.D|<0-4294967295>)",
486: NO_STR
487: "Enable routing on an IP network\n"
488: "OSPF network prefix\n"
489: "Set the OSPF area ID\n"
490: "OSPF area ID in IP address format\n"
491: "OSPF area ID as a decimal value\n")
492: {
493: struct ospf *ospf = (struct ospf *) vty->index;
494: struct prefix_ipv4 p;
495: struct in_addr area_id;
496: int ret, format;
497:
498: /* Get network prefix and Area ID. */
499: VTY_GET_IPV4_PREFIX ("network prefix", p, argv[0]);
500: VTY_GET_OSPF_AREA_ID (area_id, format, argv[1]);
501:
502: ret = ospf_network_unset (ospf, &p, area_id);
503: if (ret == 0)
504: {
505: vty_out (vty, "Can't find specified network area configuration.%s",
506: VTY_NEWLINE);
507: return CMD_WARNING;
508: }
509:
510: return CMD_SUCCESS;
511: }
512:
513:
514: DEFUN (ospf_area_range,
515: ospf_area_range_cmd,
516: "area (A.B.C.D|<0-4294967295>) range A.B.C.D/M",
517: "OSPF area parameters\n"
518: "OSPF area ID in IP address format\n"
519: "OSPF area ID as a decimal value\n"
520: "Summarize routes matching address/mask (border routers only)\n"
521: "Area range prefix\n")
522: {
523: struct ospf *ospf = vty->index;
524: struct prefix_ipv4 p;
525: struct in_addr area_id;
526: int format;
527: u_int32_t cost;
528:
529: VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
530: VTY_GET_IPV4_PREFIX ("area range", p, argv[1]);
531:
532: ospf_area_range_set (ospf, area_id, &p, OSPF_AREA_RANGE_ADVERTISE);
533: if (argc > 2)
534: {
535: VTY_GET_INTEGER ("range cost", cost, argv[2]);
536: ospf_area_range_cost_set (ospf, area_id, &p, cost);
537: }
538:
539: return CMD_SUCCESS;
540: }
541:
542: ALIAS (ospf_area_range,
543: ospf_area_range_advertise_cmd,
544: "area (A.B.C.D|<0-4294967295>) range A.B.C.D/M advertise",
545: "OSPF area parameters\n"
546: "OSPF area ID in IP address format\n"
547: "OSPF area ID as a decimal value\n"
548: "OSPF area range for route advertise (default)\n"
549: "Area range prefix\n"
550: "Advertise this range (default)\n")
551:
552: ALIAS (ospf_area_range,
553: ospf_area_range_cost_cmd,
554: "area (A.B.C.D|<0-4294967295>) range A.B.C.D/M cost <0-16777215>",
555: "OSPF area parameters\n"
556: "OSPF area ID in IP address format\n"
557: "OSPF area ID as a decimal value\n"
558: "Summarize routes matching address/mask (border routers only)\n"
559: "Area range prefix\n"
560: "User specified metric for this range\n"
561: "Advertised metric for this range\n")
562:
563: ALIAS (ospf_area_range,
564: ospf_area_range_advertise_cost_cmd,
565: "area (A.B.C.D|<0-4294967295>) range A.B.C.D/M advertise cost <0-16777215>",
566: "OSPF area parameters\n"
567: "OSPF area ID in IP address format\n"
568: "OSPF area ID as a decimal value\n"
569: "Summarize routes matching address/mask (border routers only)\n"
570: "Area range prefix\n"
571: "Advertise this range (default)\n"
572: "User specified metric for this range\n"
573: "Advertised metric for this range\n")
574:
575: DEFUN (ospf_area_range_not_advertise,
576: ospf_area_range_not_advertise_cmd,
577: "area (A.B.C.D|<0-4294967295>) range A.B.C.D/M not-advertise",
578: "OSPF area parameters\n"
579: "OSPF area ID in IP address format\n"
580: "OSPF area ID as a decimal value\n"
581: "Summarize routes matching address/mask (border routers only)\n"
582: "Area range prefix\n"
583: "DoNotAdvertise this range\n")
584: {
585: struct ospf *ospf = vty->index;
586: struct prefix_ipv4 p;
587: struct in_addr area_id;
588: int format;
589:
590: VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
591: VTY_GET_IPV4_PREFIX ("area range", p, argv[1]);
592:
593: ospf_area_range_set (ospf, area_id, &p, 0);
594:
595: return CMD_SUCCESS;
596: }
597:
598: DEFUN (no_ospf_area_range,
599: no_ospf_area_range_cmd,
600: "no area (A.B.C.D|<0-4294967295>) range A.B.C.D/M",
601: NO_STR
602: "OSPF area parameters\n"
603: "OSPF area ID in IP address format\n"
604: "OSPF area ID as a decimal value\n"
605: "Summarize routes matching address/mask (border routers only)\n"
606: "Area range prefix\n")
607: {
608: struct ospf *ospf = vty->index;
609: struct prefix_ipv4 p;
610: struct in_addr area_id;
611: int format;
612:
613: VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
614: VTY_GET_IPV4_PREFIX ("area range", p, argv[1]);
615:
616: ospf_area_range_unset (ospf, area_id, &p);
617:
618: return CMD_SUCCESS;
619: }
620:
621: ALIAS (no_ospf_area_range,
622: no_ospf_area_range_advertise_cmd,
623: "no area (A.B.C.D|<0-4294967295>) range A.B.C.D/M (advertise|not-advertise)",
624: NO_STR
625: "OSPF area parameters\n"
626: "OSPF area ID in IP address format\n"
627: "OSPF area ID as a decimal value\n"
628: "Summarize routes matching address/mask (border routers only)\n"
629: "Area range prefix\n"
630: "Advertise this range (default)\n"
631: "DoNotAdvertise this range\n")
632:
633: ALIAS (no_ospf_area_range,
634: no_ospf_area_range_cost_cmd,
635: "no area (A.B.C.D|<0-4294967295>) range A.B.C.D/M cost <0-16777215>",
636: NO_STR
637: "OSPF area parameters\n"
638: "OSPF area ID in IP address format\n"
639: "OSPF area ID as a decimal value\n"
640: "Summarize routes matching address/mask (border routers only)\n"
641: "Area range prefix\n"
642: "User specified metric for this range\n"
643: "Advertised metric for this range\n")
644:
645: ALIAS (no_ospf_area_range,
646: no_ospf_area_range_advertise_cost_cmd,
647: "no area (A.B.C.D|<0-4294967295>) range A.B.C.D/M advertise cost <0-16777215>",
648: NO_STR
649: "OSPF area parameters\n"
650: "OSPF area ID in IP address format\n"
651: "OSPF area ID as a decimal value\n"
652: "Summarize routes matching address/mask (border routers only)\n"
653: "Area range prefix\n"
654: "Advertise this range (default)\n"
655: "User specified metric for this range\n"
656: "Advertised metric for this range\n")
657:
658: DEFUN (ospf_area_range_substitute,
659: ospf_area_range_substitute_cmd,
660: "area (A.B.C.D|<0-4294967295>) range A.B.C.D/M substitute A.B.C.D/M",
661: "OSPF area parameters\n"
662: "OSPF area ID in IP address format\n"
663: "OSPF area ID as a decimal value\n"
664: "Summarize routes matching address/mask (border routers only)\n"
665: "Area range prefix\n"
666: "Announce area range as another prefix\n"
667: "Network prefix to be announced instead of range\n")
668: {
669: struct ospf *ospf = vty->index;
670: struct prefix_ipv4 p, s;
671: struct in_addr area_id;
672: int format;
673:
674: VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
675: VTY_GET_IPV4_PREFIX ("area range", p, argv[1]);
676: VTY_GET_IPV4_PREFIX ("substituted network prefix", s, argv[2]);
677:
678: ospf_area_range_substitute_set (ospf, area_id, &p, &s);
679:
680: return CMD_SUCCESS;
681: }
682:
683: DEFUN (no_ospf_area_range_substitute,
684: no_ospf_area_range_substitute_cmd,
685: "no area (A.B.C.D|<0-4294967295>) range A.B.C.D/M substitute A.B.C.D/M",
686: NO_STR
687: "OSPF area parameters\n"
688: "OSPF area ID in IP address format\n"
689: "OSPF area ID as a decimal value\n"
690: "Summarize routes matching address/mask (border routers only)\n"
691: "Area range prefix\n"
692: "Announce area range as another prefix\n"
693: "Network prefix to be announced instead of range\n")
694: {
695: struct ospf *ospf = vty->index;
696: struct prefix_ipv4 p, s;
697: struct in_addr area_id;
698: int format;
699:
700: VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
701: VTY_GET_IPV4_PREFIX ("area range", p, argv[1]);
702: VTY_GET_IPV4_PREFIX ("substituted network prefix", s, argv[2]);
703:
704: ospf_area_range_substitute_unset (ospf, area_id, &p);
705:
706: return CMD_SUCCESS;
707: }
708:
709:
710: /* Command Handler Logic in VLink stuff is delicate!!
711:
712: ALTER AT YOUR OWN RISK!!!!
713:
714: Various dummy values are used to represent 'NoChange' state for
715: VLink configuration NOT being changed by a VLink command, and
716: special syntax is used within the command strings so that the
717: typed in command verbs can be seen in the configuration command
718: bacckend handler. This is to drastically reduce the verbeage
719: required to coe up with a reasonably compatible Cisco VLink command
720:
721: - Matthew Grant <grantma@anathoth.gen.nz>
722: Wed, 21 Feb 2001 15:13:52 +1300
723: */
724:
725:
726: /* Configuration data for virtual links
727: */
728: struct ospf_vl_config_data {
729: struct vty *vty; /* vty stuff */
730: struct in_addr area_id; /* area ID from command line */
731: int format; /* command line area ID format */
732: struct in_addr vl_peer; /* command line vl_peer */
733: int auth_type; /* Authehntication type, if given */
734: char *auth_key; /* simple password if present */
735: int crypto_key_id; /* Cryptographic key ID */
736: char *md5_key; /* MD5 authentication key */
737: int hello_interval; /* Obvious what these are... */
738: int retransmit_interval;
739: int transmit_delay;
740: int dead_interval;
741: };
742:
743: static void
744: ospf_vl_config_data_init (struct ospf_vl_config_data *vl_config,
745: struct vty *vty)
746: {
747: memset (vl_config, 0, sizeof (struct ospf_vl_config_data));
748: vl_config->auth_type = OSPF_AUTH_CMD_NOTSEEN;
749: vl_config->vty = vty;
750: }
751:
752: static struct ospf_vl_data *
753: ospf_find_vl_data (struct ospf *ospf, struct ospf_vl_config_data *vl_config)
754: {
755: struct ospf_area *area;
756: struct ospf_vl_data *vl_data;
757: struct vty *vty;
758: struct in_addr area_id;
759:
760: vty = vl_config->vty;
761: area_id = vl_config->area_id;
762:
763: if (area_id.s_addr == OSPF_AREA_BACKBONE)
764: {
765: vty_out (vty,
766: "Configuring VLs over the backbone is not allowed%s",
767: VTY_NEWLINE);
768: return NULL;
769: }
770: area = ospf_area_get (ospf, area_id, vl_config->format);
771:
772: if (area->external_routing != OSPF_AREA_DEFAULT)
773: {
774: if (vl_config->format == OSPF_AREA_ID_FORMAT_ADDRESS)
775: vty_out (vty, "Area %s is %s%s",
776: inet_ntoa (area_id),
777: area->external_routing == OSPF_AREA_NSSA?"nssa":"stub",
778: VTY_NEWLINE);
779: else
780: vty_out (vty, "Area %ld is %s%s",
781: (u_long)ntohl (area_id.s_addr),
782: area->external_routing == OSPF_AREA_NSSA?"nssa":"stub",
783: VTY_NEWLINE);
784: return NULL;
785: }
786:
787: if ((vl_data = ospf_vl_lookup (ospf, area, vl_config->vl_peer)) == NULL)
788: {
789: vl_data = ospf_vl_data_new (area, vl_config->vl_peer);
790: if (vl_data->vl_oi == NULL)
791: {
792: vl_data->vl_oi = ospf_vl_new (ospf, vl_data);
793: ospf_vl_add (ospf, vl_data);
794: ospf_spf_calculate_schedule (ospf);
795: }
796: }
797: return vl_data;
798: }
799:
800:
801: static int
802: ospf_vl_set_security (struct ospf_vl_data *vl_data,
803: struct ospf_vl_config_data *vl_config)
804: {
805: struct crypt_key *ck;
806: struct vty *vty;
807: struct interface *ifp = vl_data->vl_oi->ifp;
808:
809: vty = vl_config->vty;
810:
811: if (vl_config->auth_type != OSPF_AUTH_CMD_NOTSEEN)
812: {
813: SET_IF_PARAM (IF_DEF_PARAMS (ifp), auth_type);
814: IF_DEF_PARAMS (ifp)->auth_type = vl_config->auth_type;
815: }
816:
817: if (vl_config->auth_key)
818: {
819: memset(IF_DEF_PARAMS (ifp)->auth_simple, 0, OSPF_AUTH_SIMPLE_SIZE+1);
820: strncpy ((char *) IF_DEF_PARAMS (ifp)->auth_simple, vl_config->auth_key,
821: OSPF_AUTH_SIMPLE_SIZE);
822: }
823: else if (vl_config->md5_key)
824: {
825: if (ospf_crypt_key_lookup (IF_DEF_PARAMS (ifp)->auth_crypt, vl_config->crypto_key_id)
826: != NULL)
827: {
828: vty_out (vty, "OSPF: Key %d already exists%s",
829: vl_config->crypto_key_id, VTY_NEWLINE);
830: return CMD_WARNING;
831: }
832: ck = ospf_crypt_key_new ();
833: ck->key_id = vl_config->crypto_key_id;
834: memset(ck->auth_key, 0, OSPF_AUTH_MD5_SIZE+1);
835: strncpy ((char *) ck->auth_key, vl_config->md5_key, OSPF_AUTH_MD5_SIZE);
836:
837: ospf_crypt_key_add (IF_DEF_PARAMS (ifp)->auth_crypt, ck);
838: }
839: else if (vl_config->crypto_key_id != 0)
840: {
841: /* Delete a key */
842:
843: if (ospf_crypt_key_lookup (IF_DEF_PARAMS (ifp)->auth_crypt,
844: vl_config->crypto_key_id) == NULL)
845: {
846: vty_out (vty, "OSPF: Key %d does not exist%s",
847: vl_config->crypto_key_id, VTY_NEWLINE);
848: return CMD_WARNING;
849: }
850:
851: ospf_crypt_key_delete (IF_DEF_PARAMS (ifp)->auth_crypt, vl_config->crypto_key_id);
852:
853: }
854:
855: return CMD_SUCCESS;
856: }
857:
858: static int
859: ospf_vl_set_timers (struct ospf_vl_data *vl_data,
860: struct ospf_vl_config_data *vl_config)
861: {
862: struct interface *ifp = ifp = vl_data->vl_oi->ifp;
863: /* Virtual Link data initialised to defaults, so only set
864: if a value given */
865: if (vl_config->hello_interval)
866: {
867: SET_IF_PARAM (IF_DEF_PARAMS (ifp), v_hello);
868: IF_DEF_PARAMS (ifp)->v_hello = vl_config->hello_interval;
869: }
870:
871: if (vl_config->dead_interval)
872: {
873: SET_IF_PARAM (IF_DEF_PARAMS (ifp), v_wait);
874: IF_DEF_PARAMS (ifp)->v_wait = vl_config->dead_interval;
875: }
876:
877: if (vl_config->retransmit_interval)
878: {
879: SET_IF_PARAM (IF_DEF_PARAMS (ifp), retransmit_interval);
880: IF_DEF_PARAMS (ifp)->retransmit_interval = vl_config->retransmit_interval;
881: }
882:
883: if (vl_config->transmit_delay)
884: {
885: SET_IF_PARAM (IF_DEF_PARAMS (ifp), transmit_delay);
886: IF_DEF_PARAMS (ifp)->transmit_delay = vl_config->transmit_delay;
887: }
888:
889: return CMD_SUCCESS;
890: }
891:
892:
893:
894: /* The business end of all of the above */
895: static int
896: ospf_vl_set (struct ospf *ospf, struct ospf_vl_config_data *vl_config)
897: {
898: struct ospf_vl_data *vl_data;
899: int ret;
900:
901: vl_data = ospf_find_vl_data (ospf, vl_config);
902: if (!vl_data)
903: return CMD_WARNING;
904:
905: /* Process this one first as it can have a fatal result, which can
906: only logically occur if the virtual link exists already
907: Thus a command error does not result in a change to the
908: running configuration such as unexpectedly altered timer
909: values etc.*/
910: ret = ospf_vl_set_security (vl_data, vl_config);
911: if (ret != CMD_SUCCESS)
912: return ret;
913:
914: /* Set any time based parameters, these area already range checked */
915:
916: ret = ospf_vl_set_timers (vl_data, vl_config);
917: if (ret != CMD_SUCCESS)
918: return ret;
919:
920: return CMD_SUCCESS;
921:
922: }
923:
924: /* This stuff exists to make specifying all the alias commands A LOT simpler
925: */
926: #define VLINK_HELPSTR_IPADDR \
927: "OSPF area parameters\n" \
928: "OSPF area ID in IP address format\n" \
929: "OSPF area ID as a decimal value\n" \
930: "Configure a virtual link\n" \
931: "Router ID of the remote ABR\n"
932:
933: #define VLINK_HELPSTR_AUTHTYPE_SIMPLE \
934: "Enable authentication on this virtual link\n" \
935: "dummy string \n"
936:
937: #define VLINK_HELPSTR_AUTHTYPE_ALL \
938: VLINK_HELPSTR_AUTHTYPE_SIMPLE \
939: "Use null authentication\n" \
940: "Use message-digest authentication\n"
941:
942: #define VLINK_HELPSTR_TIME_PARAM_NOSECS \
943: "Time between HELLO packets\n" \
944: "Time between retransmitting lost link state advertisements\n" \
945: "Link state transmit delay\n" \
946: "Interval after which a neighbor is declared dead\n"
947:
948: #define VLINK_HELPSTR_TIME_PARAM \
949: VLINK_HELPSTR_TIME_PARAM_NOSECS \
950: "Seconds\n"
951:
952: #define VLINK_HELPSTR_AUTH_SIMPLE \
953: "Authentication password (key)\n" \
954: "The OSPF password (key)"
955:
956: #define VLINK_HELPSTR_AUTH_MD5 \
957: "Message digest authentication password (key)\n" \
958: "dummy string \n" \
959: "Key ID\n" \
960: "Use MD5 algorithm\n" \
961: "The OSPF password (key)"
962:
963: DEFUN (ospf_area_vlink,
964: ospf_area_vlink_cmd,
965: "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D",
966: VLINK_HELPSTR_IPADDR)
967: {
968: struct ospf *ospf = vty->index;
969: struct ospf_vl_config_data vl_config;
970: char auth_key[OSPF_AUTH_SIMPLE_SIZE+1];
971: char md5_key[OSPF_AUTH_MD5_SIZE+1];
972: int i;
973: int ret;
974:
975: ospf_vl_config_data_init(&vl_config, vty);
976:
977: /* Read off first 2 parameters and check them */
978: ret = ospf_str2area_id (argv[0], &vl_config.area_id, &vl_config.format);
979: if (ret < 0)
980: {
981: vty_out (vty, "OSPF area ID is invalid%s", VTY_NEWLINE);
982: return CMD_WARNING;
983: }
984:
985: ret = inet_aton (argv[1], &vl_config.vl_peer);
986: if (! ret)
987: {
988: vty_out (vty, "Please specify valid Router ID as a.b.c.d%s",
989: VTY_NEWLINE);
990: return CMD_WARNING;
991: }
992:
993: if (argc <=2)
994: {
995: /* Thats all folks! - BUGS B. strikes again!!!*/
996:
997: return ospf_vl_set (ospf, &vl_config);
998: }
999:
1000: /* Deal with other parameters */
1001: for (i=2; i < argc; i++)
1002: {
1003:
1004: /* vty_out (vty, "argv[%d] - %s%s", i, argv[i], VTY_NEWLINE); */
1005:
1006: switch (argv[i][0])
1007: {
1008:
1009: case 'a':
1010: if (i > 2 || strncmp (argv[i], "authentication-", 15) == 0)
1011: {
1012: /* authentication-key - this option can occur anywhere on
1013: command line. At start of command line
1014: must check for authentication option. */
1015: memset (auth_key, 0, OSPF_AUTH_SIMPLE_SIZE + 1);
1016: strncpy (auth_key, argv[i+1], OSPF_AUTH_SIMPLE_SIZE);
1017: vl_config.auth_key = auth_key;
1018: i++;
1019: }
1020: else if (strncmp (argv[i], "authentication", 14) == 0)
1021: {
1022: /* authentication - this option can only occur at start
1023: of command line */
1024: vl_config.auth_type = OSPF_AUTH_SIMPLE;
1025: if ((i+1) < argc)
1026: {
1027: if (strncmp (argv[i+1], "n", 1) == 0)
1028: {
1029: /* "authentication null" */
1030: vl_config.auth_type = OSPF_AUTH_NULL;
1031: i++;
1032: }
1033: else if (strncmp (argv[i+1], "m", 1) == 0
1034: && strcmp (argv[i+1], "message-digest-") != 0)
1035: {
1036: /* "authentication message-digest" */
1037: vl_config.auth_type = OSPF_AUTH_CRYPTOGRAPHIC;
1038: i++;
1039: }
1040: }
1041: }
1042: break;
1043:
1044: case 'm':
1045: /* message-digest-key */
1046: i++;
1047: vl_config.crypto_key_id = strtol (argv[i], NULL, 10);
1048: if (vl_config.crypto_key_id < 0)
1049: return CMD_WARNING;
1050: i++;
1051: memset(md5_key, 0, OSPF_AUTH_MD5_SIZE+1);
1052: strncpy (md5_key, argv[i], OSPF_AUTH_MD5_SIZE);
1053: vl_config.md5_key = md5_key;
1054: break;
1055:
1056: case 'h':
1057: /* Hello interval */
1058: i++;
1059: vl_config.hello_interval = strtol (argv[i], NULL, 10);
1060: if (vl_config.hello_interval < 0)
1061: return CMD_WARNING;
1062: break;
1063:
1064: case 'r':
1065: /* Retransmit Interval */
1066: i++;
1067: vl_config.retransmit_interval = strtol (argv[i], NULL, 10);
1068: if (vl_config.retransmit_interval < 0)
1069: return CMD_WARNING;
1070: break;
1071:
1072: case 't':
1073: /* Transmit Delay */
1074: i++;
1075: vl_config.transmit_delay = strtol (argv[i], NULL, 10);
1076: if (vl_config.transmit_delay < 0)
1077: return CMD_WARNING;
1078: break;
1079:
1080: case 'd':
1081: /* Dead Interval */
1082: i++;
1083: vl_config.dead_interval = strtol (argv[i], NULL, 10);
1084: if (vl_config.dead_interval < 0)
1085: return CMD_WARNING;
1086: break;
1087: }
1088: }
1089:
1090:
1091: /* Action configuration */
1092:
1093: return ospf_vl_set (ospf, &vl_config);
1094:
1095: }
1096:
1097: DEFUN (no_ospf_area_vlink,
1098: no_ospf_area_vlink_cmd,
1099: "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D",
1100: NO_STR
1101: VLINK_HELPSTR_IPADDR)
1102: {
1103: struct ospf *ospf = vty->index;
1104: struct ospf_area *area;
1105: struct ospf_vl_config_data vl_config;
1106: struct ospf_vl_data *vl_data = NULL;
1107: char auth_key[OSPF_AUTH_SIMPLE_SIZE+1];
1108: int i;
1109: int ret, format;
1110:
1111: ospf_vl_config_data_init(&vl_config, vty);
1112:
1113: ret = ospf_str2area_id (argv[0], &vl_config.area_id, &format);
1114: if (ret < 0)
1115: {
1116: vty_out (vty, "OSPF area ID is invalid%s", VTY_NEWLINE);
1117: return CMD_WARNING;
1118: }
1119:
1120: area = ospf_area_lookup_by_area_id (ospf, vl_config.area_id);
1121: if (!area)
1122: {
1123: vty_out (vty, "Area does not exist%s", VTY_NEWLINE);
1124: return CMD_WARNING;
1125: }
1126:
1127: ret = inet_aton (argv[1], &vl_config.vl_peer);
1128: if (! ret)
1129: {
1130: vty_out (vty, "Please specify valid Router ID as a.b.c.d%s",
1131: VTY_NEWLINE);
1132: return CMD_WARNING;
1133: }
1134:
1135: if (argc <=2)
1136: {
1137: /* Basic VLink no command */
1138: /* Thats all folks! - BUGS B. strikes again!!!*/
1139: if ((vl_data = ospf_vl_lookup (ospf, area, vl_config.vl_peer)))
1140: ospf_vl_delete (ospf, vl_data);
1141:
1142: ospf_area_check_free (ospf, vl_config.area_id);
1143:
1144: return CMD_SUCCESS;
1145: }
1146:
1147: /* If we are down here, we are reseting parameters */
1148:
1149: /* Deal with other parameters */
1150: for (i=2; i < argc; i++)
1151: {
1152: /* vty_out (vty, "argv[%d] - %s%s", i, argv[i], VTY_NEWLINE); */
1153:
1154: switch (argv[i][0])
1155: {
1156:
1157: case 'a':
1158: if (i > 2 || strncmp (argv[i], "authentication-", 15) == 0)
1159: {
1160: /* authentication-key - this option can occur anywhere on
1161: command line. At start of command line
1162: must check for authentication option. */
1163: memset (auth_key, 0, OSPF_AUTH_SIMPLE_SIZE + 1);
1164: vl_config.auth_key = auth_key;
1165: }
1166: else if (strncmp (argv[i], "authentication", 14) == 0)
1167: {
1168: /* authentication - this option can only occur at start
1169: of command line */
1170: vl_config.auth_type = OSPF_AUTH_NOTSET;
1171: }
1172: break;
1173:
1174: case 'm':
1175: /* message-digest-key */
1176: /* Delete one key */
1177: i++;
1178: vl_config.crypto_key_id = strtol (argv[i], NULL, 10);
1179: if (vl_config.crypto_key_id < 0)
1180: return CMD_WARNING;
1181: vl_config.md5_key = NULL;
1182: break;
1183:
1184: case 'h':
1185: /* Hello interval */
1186: vl_config.hello_interval = OSPF_HELLO_INTERVAL_DEFAULT;
1187: break;
1188:
1189: case 'r':
1190: /* Retransmit Interval */
1191: vl_config.retransmit_interval = OSPF_RETRANSMIT_INTERVAL_DEFAULT;
1192: break;
1193:
1194: case 't':
1195: /* Transmit Delay */
1196: vl_config.transmit_delay = OSPF_TRANSMIT_DELAY_DEFAULT;
1197: break;
1198:
1199: case 'd':
1200: /* Dead Interval */
1201: i++;
1202: vl_config.dead_interval = OSPF_ROUTER_DEAD_INTERVAL_DEFAULT;
1203: break;
1204: }
1205: }
1206:
1207:
1208: /* Action configuration */
1209:
1210: return ospf_vl_set (ospf, &vl_config);
1211: }
1212:
1213: ALIAS (ospf_area_vlink,
1214: ospf_area_vlink_param1_cmd,
1215: "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1216: "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535>",
1217: VLINK_HELPSTR_IPADDR
1218: VLINK_HELPSTR_TIME_PARAM)
1219:
1220: ALIAS (no_ospf_area_vlink,
1221: no_ospf_area_vlink_param1_cmd,
1222: "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1223: "(hello-interval|retransmit-interval|transmit-delay|dead-interval)",
1224: NO_STR
1225: VLINK_HELPSTR_IPADDR
1226: VLINK_HELPSTR_TIME_PARAM)
1227:
1228: ALIAS (ospf_area_vlink,
1229: ospf_area_vlink_param2_cmd,
1230: "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1231: "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535> "
1232: "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535>",
1233: VLINK_HELPSTR_IPADDR
1234: VLINK_HELPSTR_TIME_PARAM
1235: VLINK_HELPSTR_TIME_PARAM)
1236:
1237: ALIAS (no_ospf_area_vlink,
1238: no_ospf_area_vlink_param2_cmd,
1239: "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1240: "(hello-interval|retransmit-interval|transmit-delay|dead-interval) "
1241: "(hello-interval|retransmit-interval|transmit-delay|dead-interval)",
1242: NO_STR
1243: VLINK_HELPSTR_IPADDR
1244: VLINK_HELPSTR_TIME_PARAM
1245: VLINK_HELPSTR_TIME_PARAM)
1246:
1247: ALIAS (ospf_area_vlink,
1248: ospf_area_vlink_param3_cmd,
1249: "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1250: "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535> "
1251: "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535> "
1252: "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535>",
1253: VLINK_HELPSTR_IPADDR
1254: VLINK_HELPSTR_TIME_PARAM
1255: VLINK_HELPSTR_TIME_PARAM
1256: VLINK_HELPSTR_TIME_PARAM)
1257:
1258: ALIAS (no_ospf_area_vlink,
1259: no_ospf_area_vlink_param3_cmd,
1260: "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1261: "(hello-interval|retransmit-interval|transmit-delay|dead-interval) "
1262: "(hello-interval|retransmit-interval|transmit-delay|dead-interval) "
1263: "(hello-interval|retransmit-interval|transmit-delay|dead-interval)",
1264: NO_STR
1265: VLINK_HELPSTR_IPADDR
1266: VLINK_HELPSTR_TIME_PARAM
1267: VLINK_HELPSTR_TIME_PARAM
1268: VLINK_HELPSTR_TIME_PARAM)
1269:
1270: ALIAS (ospf_area_vlink,
1271: ospf_area_vlink_param4_cmd,
1272: "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1273: "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535> "
1274: "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535> "
1275: "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535> "
1276: "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535>",
1277: VLINK_HELPSTR_IPADDR
1278: VLINK_HELPSTR_TIME_PARAM
1279: VLINK_HELPSTR_TIME_PARAM
1280: VLINK_HELPSTR_TIME_PARAM
1281: VLINK_HELPSTR_TIME_PARAM)
1282:
1283: ALIAS (no_ospf_area_vlink,
1284: no_ospf_area_vlink_param4_cmd,
1285: "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1286: "(hello-interval|retransmit-interval|transmit-delay|dead-interval) "
1287: "(hello-interval|retransmit-interval|transmit-delay|dead-interval) "
1288: "(hello-interval|retransmit-interval|transmit-delay|dead-interval) "
1289: "(hello-interval|retransmit-interval|transmit-delay|dead-interval)",
1290: NO_STR
1291: VLINK_HELPSTR_IPADDR
1292: VLINK_HELPSTR_TIME_PARAM
1293: VLINK_HELPSTR_TIME_PARAM
1294: VLINK_HELPSTR_TIME_PARAM
1295: VLINK_HELPSTR_TIME_PARAM)
1296:
1297: ALIAS (ospf_area_vlink,
1298: ospf_area_vlink_authtype_args_cmd,
1299: "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1300: "(authentication|) (message-digest|null)",
1301: VLINK_HELPSTR_IPADDR
1302: VLINK_HELPSTR_AUTHTYPE_ALL)
1303:
1304: ALIAS (ospf_area_vlink,
1305: ospf_area_vlink_authtype_cmd,
1306: "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1307: "(authentication|)",
1308: VLINK_HELPSTR_IPADDR
1309: VLINK_HELPSTR_AUTHTYPE_SIMPLE)
1310:
1311: ALIAS (no_ospf_area_vlink,
1312: no_ospf_area_vlink_authtype_cmd,
1313: "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1314: "(authentication|)",
1315: NO_STR
1316: VLINK_HELPSTR_IPADDR
1317: VLINK_HELPSTR_AUTHTYPE_SIMPLE)
1318:
1319: ALIAS (ospf_area_vlink,
1320: ospf_area_vlink_md5_cmd,
1321: "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1322: "(message-digest-key|) <1-255> md5 KEY",
1323: VLINK_HELPSTR_IPADDR
1324: VLINK_HELPSTR_AUTH_MD5)
1325:
1326: ALIAS (no_ospf_area_vlink,
1327: no_ospf_area_vlink_md5_cmd,
1328: "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1329: "(message-digest-key|) <1-255>",
1330: NO_STR
1331: VLINK_HELPSTR_IPADDR
1332: VLINK_HELPSTR_AUTH_MD5)
1333:
1334: ALIAS (ospf_area_vlink,
1335: ospf_area_vlink_authkey_cmd,
1336: "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1337: "(authentication-key|) AUTH_KEY",
1338: VLINK_HELPSTR_IPADDR
1339: VLINK_HELPSTR_AUTH_SIMPLE)
1340:
1341: ALIAS (no_ospf_area_vlink,
1342: no_ospf_area_vlink_authkey_cmd,
1343: "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1344: "(authentication-key|)",
1345: NO_STR
1346: VLINK_HELPSTR_IPADDR
1347: VLINK_HELPSTR_AUTH_SIMPLE)
1348:
1349: ALIAS (ospf_area_vlink,
1350: ospf_area_vlink_authtype_args_authkey_cmd,
1351: "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1352: "(authentication|) (message-digest|null) "
1353: "(authentication-key|) AUTH_KEY",
1354: VLINK_HELPSTR_IPADDR
1355: VLINK_HELPSTR_AUTHTYPE_ALL
1356: VLINK_HELPSTR_AUTH_SIMPLE)
1357:
1358: ALIAS (ospf_area_vlink,
1359: ospf_area_vlink_authtype_authkey_cmd,
1360: "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1361: "(authentication|) "
1362: "(authentication-key|) AUTH_KEY",
1363: VLINK_HELPSTR_IPADDR
1364: VLINK_HELPSTR_AUTHTYPE_SIMPLE
1365: VLINK_HELPSTR_AUTH_SIMPLE)
1366:
1367: ALIAS (no_ospf_area_vlink,
1368: no_ospf_area_vlink_authtype_authkey_cmd,
1369: "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1370: "(authentication|) "
1371: "(authentication-key|)",
1372: NO_STR
1373: VLINK_HELPSTR_IPADDR
1374: VLINK_HELPSTR_AUTHTYPE_SIMPLE
1375: VLINK_HELPSTR_AUTH_SIMPLE)
1376:
1377: ALIAS (ospf_area_vlink,
1378: ospf_area_vlink_authtype_args_md5_cmd,
1379: "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1380: "(authentication|) (message-digest|null) "
1381: "(message-digest-key|) <1-255> md5 KEY",
1382: VLINK_HELPSTR_IPADDR
1383: VLINK_HELPSTR_AUTHTYPE_ALL
1384: VLINK_HELPSTR_AUTH_MD5)
1385:
1386: ALIAS (ospf_area_vlink,
1387: ospf_area_vlink_authtype_md5_cmd,
1388: "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1389: "(authentication|) "
1390: "(message-digest-key|) <1-255> md5 KEY",
1391: VLINK_HELPSTR_IPADDR
1392: VLINK_HELPSTR_AUTHTYPE_SIMPLE
1393: VLINK_HELPSTR_AUTH_MD5)
1394:
1395: ALIAS (no_ospf_area_vlink,
1396: no_ospf_area_vlink_authtype_md5_cmd,
1397: "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
1398: "(authentication|) "
1399: "(message-digest-key|)",
1400: NO_STR
1401: VLINK_HELPSTR_IPADDR
1402: VLINK_HELPSTR_AUTHTYPE_SIMPLE
1403: VLINK_HELPSTR_AUTH_MD5)
1404:
1405:
1406: DEFUN (ospf_area_shortcut,
1407: ospf_area_shortcut_cmd,
1408: "area (A.B.C.D|<0-4294967295>) shortcut (default|enable|disable)",
1409: "OSPF area parameters\n"
1410: "OSPF area ID in IP address format\n"
1411: "OSPF area ID as a decimal value\n"
1412: "Configure the area's shortcutting mode\n"
1413: "Set default shortcutting behavior\n"
1414: "Enable shortcutting through the area\n"
1415: "Disable shortcutting through the area\n")
1416: {
1417: struct ospf *ospf = vty->index;
1418: struct ospf_area *area;
1419: struct in_addr area_id;
1420: int mode;
1421: int format;
1422:
1423: VTY_GET_OSPF_AREA_ID_NO_BB ("shortcut", area_id, format, argv[0]);
1424:
1425: area = ospf_area_get (ospf, area_id, format);
1426:
1427: if (strncmp (argv[1], "de", 2) == 0)
1428: mode = OSPF_SHORTCUT_DEFAULT;
1429: else if (strncmp (argv[1], "di", 2) == 0)
1430: mode = OSPF_SHORTCUT_DISABLE;
1431: else if (strncmp (argv[1], "e", 1) == 0)
1432: mode = OSPF_SHORTCUT_ENABLE;
1433: else
1434: return CMD_WARNING;
1435:
1436: ospf_area_shortcut_set (ospf, area, mode);
1437:
1438: if (ospf->abr_type != OSPF_ABR_SHORTCUT)
1439: vty_out (vty, "Shortcut area setting will take effect "
1440: "only when the router is configured as Shortcut ABR%s",
1441: VTY_NEWLINE);
1442:
1443: return CMD_SUCCESS;
1444: }
1445:
1446: DEFUN (no_ospf_area_shortcut,
1447: no_ospf_area_shortcut_cmd,
1448: "no area (A.B.C.D|<0-4294967295>) shortcut (enable|disable)",
1449: NO_STR
1450: "OSPF area parameters\n"
1451: "OSPF area ID in IP address format\n"
1452: "OSPF area ID as a decimal value\n"
1453: "Deconfigure the area's shortcutting mode\n"
1454: "Deconfigure enabled shortcutting through the area\n"
1455: "Deconfigure disabled shortcutting through the area\n")
1456: {
1457: struct ospf *ospf = vty->index;
1458: struct ospf_area *area;
1459: struct in_addr area_id;
1460: int format;
1461:
1462: VTY_GET_OSPF_AREA_ID_NO_BB ("shortcut", area_id, format, argv[0]);
1463:
1464: area = ospf_area_lookup_by_area_id (ospf, area_id);
1465: if (!area)
1466: return CMD_SUCCESS;
1467:
1468: ospf_area_shortcut_unset (ospf, area);
1469:
1470: return CMD_SUCCESS;
1471: }
1472:
1473:
1474: DEFUN (ospf_area_stub,
1475: ospf_area_stub_cmd,
1476: "area (A.B.C.D|<0-4294967295>) stub",
1477: "OSPF area parameters\n"
1478: "OSPF area ID in IP address format\n"
1479: "OSPF area ID as a decimal value\n"
1480: "Configure OSPF area as stub\n")
1481: {
1482: struct ospf *ospf = vty->index;
1483: struct in_addr area_id;
1484: int ret, format;
1485:
1486: VTY_GET_OSPF_AREA_ID_NO_BB ("stub", area_id, format, argv[0]);
1487:
1488: ret = ospf_area_stub_set (ospf, area_id);
1489: if (ret == 0)
1490: {
1491: vty_out (vty, "First deconfigure all virtual link through this area%s",
1492: VTY_NEWLINE);
1493: return CMD_WARNING;
1494: }
1495:
1496: ospf_area_no_summary_unset (ospf, area_id);
1497:
1498: return CMD_SUCCESS;
1499: }
1500:
1501: DEFUN (ospf_area_stub_no_summary,
1502: ospf_area_stub_no_summary_cmd,
1503: "area (A.B.C.D|<0-4294967295>) stub no-summary",
1504: "OSPF stub parameters\n"
1505: "OSPF area ID in IP address format\n"
1506: "OSPF area ID as a decimal value\n"
1507: "Configure OSPF area as stub\n"
1508: "Do not inject inter-area routes into stub\n")
1509: {
1510: struct ospf *ospf = vty->index;
1511: struct in_addr area_id;
1512: int ret, format;
1513:
1514: VTY_GET_OSPF_AREA_ID_NO_BB ("stub", area_id, format, argv[0]);
1515:
1516: ret = ospf_area_stub_set (ospf, area_id);
1517: if (ret == 0)
1518: {
1519: vty_out (vty, "%% Area cannot be stub as it contains a virtual link%s",
1520: VTY_NEWLINE);
1521: return CMD_WARNING;
1522: }
1523:
1524: ospf_area_no_summary_set (ospf, area_id);
1525:
1526: return CMD_SUCCESS;
1527: }
1528:
1529: DEFUN (no_ospf_area_stub,
1530: no_ospf_area_stub_cmd,
1531: "no area (A.B.C.D|<0-4294967295>) stub",
1532: NO_STR
1533: "OSPF area parameters\n"
1534: "OSPF area ID in IP address format\n"
1535: "OSPF area ID as a decimal value\n"
1536: "Configure OSPF area as stub\n")
1537: {
1538: struct ospf *ospf = vty->index;
1539: struct in_addr area_id;
1540: int format;
1541:
1542: VTY_GET_OSPF_AREA_ID_NO_BB ("stub", area_id, format, argv[0]);
1543:
1544: ospf_area_stub_unset (ospf, area_id);
1545: ospf_area_no_summary_unset (ospf, area_id);
1546:
1547: return CMD_SUCCESS;
1548: }
1549:
1550: DEFUN (no_ospf_area_stub_no_summary,
1551: no_ospf_area_stub_no_summary_cmd,
1552: "no area (A.B.C.D|<0-4294967295>) stub no-summary",
1553: NO_STR
1554: "OSPF area parameters\n"
1555: "OSPF area ID in IP address format\n"
1556: "OSPF area ID as a decimal value\n"
1557: "Configure OSPF area as stub\n"
1558: "Do not inject inter-area routes into area\n")
1559: {
1560: struct ospf *ospf = vty->index;
1561: struct in_addr area_id;
1562: int format;
1563:
1564: VTY_GET_OSPF_AREA_ID_NO_BB ("stub", area_id, format, argv[0]);
1565: ospf_area_no_summary_unset (ospf, area_id);
1566:
1567: return CMD_SUCCESS;
1568: }
1569:
1570: static int
1571: ospf_area_nssa_cmd_handler (struct vty *vty, int argc, const char *argv[],
1572: int nosum)
1573: {
1574: struct ospf *ospf = vty->index;
1575: struct in_addr area_id;
1576: int ret, format;
1577:
1578: VTY_GET_OSPF_AREA_ID_NO_BB ("NSSA", area_id, format, argv[0]);
1579:
1580: ret = ospf_area_nssa_set (ospf, area_id);
1581: if (ret == 0)
1582: {
1583: vty_out (vty, "%% Area cannot be nssa as it contains a virtual link%s",
1584: VTY_NEWLINE);
1585: return CMD_WARNING;
1586: }
1587:
1588: if (argc > 1)
1589: {
1590: if (strncmp (argv[1], "translate-c", 11) == 0)
1591: ospf_area_nssa_translator_role_set (ospf, area_id,
1592: OSPF_NSSA_ROLE_CANDIDATE);
1593: else if (strncmp (argv[1], "translate-n", 11) == 0)
1594: ospf_area_nssa_translator_role_set (ospf, area_id,
1595: OSPF_NSSA_ROLE_NEVER);
1596: else if (strncmp (argv[1], "translate-a", 11) == 0)
1597: ospf_area_nssa_translator_role_set (ospf, area_id,
1598: OSPF_NSSA_ROLE_ALWAYS);
1599: }
1600: else
1601: {
1602: ospf_area_nssa_translator_role_set (ospf, area_id,
1603: OSPF_NSSA_ROLE_CANDIDATE);
1604: }
1605:
1606: if (nosum)
1607: ospf_area_no_summary_set (ospf, area_id);
1608: else
1609: ospf_area_no_summary_unset (ospf, area_id);
1610:
1611: ospf_schedule_abr_task (ospf);
1612:
1613: return CMD_SUCCESS;
1614: }
1615:
1616: DEFUN (ospf_area_nssa_translate_no_summary,
1617: ospf_area_nssa_translate_no_summary_cmd,
1618: "area (A.B.C.D|<0-4294967295>) nssa (translate-candidate|translate-never|translate-always) no-summary",
1619: "OSPF area parameters\n"
1620: "OSPF area ID in IP address format\n"
1621: "OSPF area ID as a decimal value\n"
1622: "Configure OSPF area as nssa\n"
1623: "Configure NSSA-ABR for translate election (default)\n"
1624: "Configure NSSA-ABR to never translate\n"
1625: "Configure NSSA-ABR to always translate\n"
1626: "Do not inject inter-area routes into nssa\n")
1627: {
1628: return ospf_area_nssa_cmd_handler (vty, argc, argv, 1);
1629: }
1630:
1631: DEFUN (ospf_area_nssa_translate,
1632: ospf_area_nssa_translate_cmd,
1633: "area (A.B.C.D|<0-4294967295>) nssa (translate-candidate|translate-never|translate-always)",
1634: "OSPF area parameters\n"
1635: "OSPF area ID in IP address format\n"
1636: "OSPF area ID as a decimal value\n"
1637: "Configure OSPF area as nssa\n"
1638: "Configure NSSA-ABR for translate election (default)\n"
1639: "Configure NSSA-ABR to never translate\n"
1640: "Configure NSSA-ABR to always translate\n")
1641: {
1642: return ospf_area_nssa_cmd_handler (vty, argc, argv, 0);
1643: }
1644:
1645: DEFUN (ospf_area_nssa,
1646: ospf_area_nssa_cmd,
1647: "area (A.B.C.D|<0-4294967295>) nssa",
1648: "OSPF area parameters\n"
1649: "OSPF area ID in IP address format\n"
1650: "OSPF area ID as a decimal value\n"
1651: "Configure OSPF area as nssa\n")
1652: {
1653: return ospf_area_nssa_cmd_handler (vty, argc, argv, 0);
1654: }
1655:
1656: DEFUN (ospf_area_nssa_no_summary,
1657: ospf_area_nssa_no_summary_cmd,
1658: "area (A.B.C.D|<0-4294967295>) nssa no-summary",
1659: "OSPF area parameters\n"
1660: "OSPF area ID in IP address format\n"
1661: "OSPF area ID as a decimal value\n"
1662: "Configure OSPF area as nssa\n"
1663: "Do not inject inter-area routes into nssa\n")
1664: {
1665: return ospf_area_nssa_cmd_handler (vty, argc, argv, 1);
1666: }
1667:
1668: DEFUN (no_ospf_area_nssa,
1669: no_ospf_area_nssa_cmd,
1670: "no area (A.B.C.D|<0-4294967295>) nssa",
1671: NO_STR
1672: "OSPF area parameters\n"
1673: "OSPF area ID in IP address format\n"
1674: "OSPF area ID as a decimal value\n"
1675: "Configure OSPF area as nssa\n")
1676: {
1677: struct ospf *ospf = vty->index;
1678: struct in_addr area_id;
1679: int format;
1680:
1681: VTY_GET_OSPF_AREA_ID_NO_BB ("NSSA", area_id, format, argv[0]);
1682:
1683: ospf_area_nssa_unset (ospf, area_id);
1684: ospf_area_no_summary_unset (ospf, area_id);
1685:
1686: ospf_schedule_abr_task (ospf);
1687:
1688: return CMD_SUCCESS;
1689: }
1690:
1691: DEFUN (no_ospf_area_nssa_no_summary,
1692: no_ospf_area_nssa_no_summary_cmd,
1693: "no area (A.B.C.D|<0-4294967295>) nssa no-summary",
1694: NO_STR
1695: "OSPF area parameters\n"
1696: "OSPF area ID in IP address format\n"
1697: "OSPF area ID as a decimal value\n"
1698: "Configure OSPF area as nssa\n"
1699: "Do not inject inter-area routes into nssa\n")
1700: {
1701: struct ospf *ospf = vty->index;
1702: struct in_addr area_id;
1703: int format;
1704:
1705: VTY_GET_OSPF_AREA_ID_NO_BB ("NSSA", area_id, format, argv[0]);
1706: ospf_area_no_summary_unset (ospf, area_id);
1707:
1708: return CMD_SUCCESS;
1709: }
1710:
1711: DEFUN (ospf_area_default_cost,
1712: ospf_area_default_cost_cmd,
1713: "area (A.B.C.D|<0-4294967295>) default-cost <0-16777215>",
1714: "OSPF area parameters\n"
1715: "OSPF area ID in IP address format\n"
1716: "OSPF area ID as a decimal value\n"
1717: "Set the summary-default cost of a NSSA or stub area\n"
1718: "Stub's advertised default summary cost\n")
1719: {
1720: struct ospf *ospf = vty->index;
1721: struct ospf_area *area;
1722: struct in_addr area_id;
1723: u_int32_t cost;
1724: int format;
1725: struct prefix_ipv4 p;
1726:
1727: VTY_GET_OSPF_AREA_ID_NO_BB ("default-cost", area_id, format, argv[0]);
1728: VTY_GET_INTEGER_RANGE ("stub default cost", cost, argv[1], 0, 16777215);
1729:
1730: area = ospf_area_get (ospf, area_id, format);
1731:
1732: if (area->external_routing == OSPF_AREA_DEFAULT)
1733: {
1734: vty_out (vty, "The area is neither stub, nor NSSA%s", VTY_NEWLINE);
1735: return CMD_WARNING;
1736: }
1737:
1738: area->default_cost = cost;
1739:
1740: p.family = AF_INET;
1741: p.prefix.s_addr = OSPF_DEFAULT_DESTINATION;
1742: p.prefixlen = 0;
1743: if (IS_DEBUG_OSPF_EVENT)
1744: zlog_debug ("ospf_abr_announce_stub_defaults(): "
1745: "announcing 0.0.0.0/0 to area %s",
1746: inet_ntoa (area->area_id));
1747: ospf_abr_announce_network_to_area (&p, area->default_cost, area);
1748:
1749: return CMD_SUCCESS;
1750: }
1751:
1752: DEFUN (no_ospf_area_default_cost,
1753: no_ospf_area_default_cost_cmd,
1754: "no area (A.B.C.D|<0-4294967295>) default-cost <0-16777215>",
1755: NO_STR
1756: "OSPF area parameters\n"
1757: "OSPF area ID in IP address format\n"
1758: "OSPF area ID as a decimal value\n"
1759: "Set the summary-default cost of a NSSA or stub area\n"
1760: "Stub's advertised default summary cost\n")
1761: {
1762: struct ospf *ospf = vty->index;
1763: struct ospf_area *area;
1764: struct in_addr area_id;
1765: u_int32_t cost;
1766: int format;
1767: struct prefix_ipv4 p;
1768:
1769: VTY_GET_OSPF_AREA_ID_NO_BB ("default-cost", area_id, format, argv[0]);
1770: VTY_GET_INTEGER_RANGE ("stub default cost", cost, argv[1], 0, 16777215);
1771:
1772: area = ospf_area_lookup_by_area_id (ospf, area_id);
1773: if (area == NULL)
1774: return CMD_SUCCESS;
1775:
1776: if (area->external_routing == OSPF_AREA_DEFAULT)
1777: {
1778: vty_out (vty, "The area is neither stub, nor NSSA%s", VTY_NEWLINE);
1779: return CMD_WARNING;
1780: }
1781:
1782: area->default_cost = 1;
1783:
1784: p.family = AF_INET;
1785: p.prefix.s_addr = OSPF_DEFAULT_DESTINATION;
1786: p.prefixlen = 0;
1787: if (IS_DEBUG_OSPF_EVENT)
1788: zlog_debug ("ospf_abr_announce_stub_defaults(): "
1789: "announcing 0.0.0.0/0 to area %s",
1790: inet_ntoa (area->area_id));
1791: ospf_abr_announce_network_to_area (&p, area->default_cost, area);
1792:
1793:
1794: ospf_area_check_free (ospf, area_id);
1795:
1796: return CMD_SUCCESS;
1797: }
1798:
1799: DEFUN (ospf_area_export_list,
1800: ospf_area_export_list_cmd,
1801: "area (A.B.C.D|<0-4294967295>) export-list NAME",
1802: "OSPF area parameters\n"
1803: "OSPF area ID in IP address format\n"
1804: "OSPF area ID as a decimal value\n"
1805: "Set the filter for networks announced to other areas\n"
1806: "Name of the access-list\n")
1807: {
1808: struct ospf *ospf = vty->index;
1809: struct ospf_area *area;
1810: struct in_addr area_id;
1811: int format;
1812:
1813: VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
1814:
1815: area = ospf_area_get (ospf, area_id, format);
1816: ospf_area_export_list_set (ospf, area, argv[1]);
1817:
1818: return CMD_SUCCESS;
1819: }
1820:
1821: DEFUN (no_ospf_area_export_list,
1822: no_ospf_area_export_list_cmd,
1823: "no area (A.B.C.D|<0-4294967295>) export-list NAME",
1824: NO_STR
1825: "OSPF area parameters\n"
1826: "OSPF area ID in IP address format\n"
1827: "OSPF area ID as a decimal value\n"
1828: "Unset the filter for networks announced to other areas\n"
1829: "Name of the access-list\n")
1830: {
1831: struct ospf *ospf = vty->index;
1832: struct ospf_area *area;
1833: struct in_addr area_id;
1834: int format;
1835:
1836: VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
1837:
1838: area = ospf_area_lookup_by_area_id (ospf, area_id);
1839: if (area == NULL)
1840: return CMD_SUCCESS;
1841:
1842: ospf_area_export_list_unset (ospf, area);
1843:
1844: return CMD_SUCCESS;
1845: }
1846:
1847:
1848: DEFUN (ospf_area_import_list,
1849: ospf_area_import_list_cmd,
1850: "area (A.B.C.D|<0-4294967295>) import-list NAME",
1851: "OSPF area parameters\n"
1852: "OSPF area ID in IP address format\n"
1853: "OSPF area ID as a decimal value\n"
1854: "Set the filter for networks from other areas announced to the specified one\n"
1855: "Name of the access-list\n")
1856: {
1857: struct ospf *ospf = vty->index;
1858: struct ospf_area *area;
1859: struct in_addr area_id;
1860: int format;
1861:
1862: VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
1863:
1864: area = ospf_area_get (ospf, area_id, format);
1865: ospf_area_import_list_set (ospf, area, argv[1]);
1866:
1867: return CMD_SUCCESS;
1868: }
1869:
1870: DEFUN (no_ospf_area_import_list,
1871: no_ospf_area_import_list_cmd,
1872: "no area (A.B.C.D|<0-4294967295>) import-list NAME",
1873: NO_STR
1874: "OSPF area parameters\n"
1875: "OSPF area ID in IP address format\n"
1876: "OSPF area ID as a decimal value\n"
1877: "Unset the filter for networks announced to other areas\n"
1878: "Name of the access-list\n")
1879: {
1880: struct ospf *ospf = vty->index;
1881: struct ospf_area *area;
1882: struct in_addr area_id;
1883: int format;
1884:
1885: VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
1886:
1887: area = ospf_area_lookup_by_area_id (ospf, area_id);
1888: if (area == NULL)
1889: return CMD_SUCCESS;
1890:
1891: ospf_area_import_list_unset (ospf, area);
1892:
1893: return CMD_SUCCESS;
1894: }
1895:
1896: DEFUN (ospf_area_filter_list,
1897: ospf_area_filter_list_cmd,
1898: "area (A.B.C.D|<0-4294967295>) filter-list prefix WORD (in|out)",
1899: "OSPF area parameters\n"
1900: "OSPF area ID in IP address format\n"
1901: "OSPF area ID as a decimal value\n"
1902: "Filter networks between OSPF areas\n"
1903: "Filter prefixes between OSPF areas\n"
1904: "Name of an IP prefix-list\n"
1905: "Filter networks sent to this area\n"
1906: "Filter networks sent from this area\n")
1907: {
1908: struct ospf *ospf = vty->index;
1909: struct ospf_area *area;
1910: struct in_addr area_id;
1911: struct prefix_list *plist;
1912: int format;
1913:
1914: VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
1915:
1916: area = ospf_area_get (ospf, area_id, format);
1917: plist = prefix_list_lookup (AFI_IP, argv[1]);
1918: if (strncmp (argv[2], "in", 2) == 0)
1919: {
1920: PREFIX_LIST_IN (area) = plist;
1921: if (PREFIX_NAME_IN (area))
1922: free (PREFIX_NAME_IN (area));
1923:
1924: PREFIX_NAME_IN (area) = strdup (argv[1]);
1925: ospf_schedule_abr_task (ospf);
1926: }
1927: else
1928: {
1929: PREFIX_LIST_OUT (area) = plist;
1930: if (PREFIX_NAME_OUT (area))
1931: free (PREFIX_NAME_OUT (area));
1932:
1933: PREFIX_NAME_OUT (area) = strdup (argv[1]);
1934: ospf_schedule_abr_task (ospf);
1935: }
1936:
1937: return CMD_SUCCESS;
1938: }
1939:
1940: DEFUN (no_ospf_area_filter_list,
1941: no_ospf_area_filter_list_cmd,
1942: "no area (A.B.C.D|<0-4294967295>) filter-list prefix WORD (in|out)",
1943: NO_STR
1944: "OSPF area parameters\n"
1945: "OSPF area ID in IP address format\n"
1946: "OSPF area ID as a decimal value\n"
1947: "Filter networks between OSPF areas\n"
1948: "Filter prefixes between OSPF areas\n"
1949: "Name of an IP prefix-list\n"
1950: "Filter networks sent to this area\n"
1951: "Filter networks sent from this area\n")
1952: {
1953: struct ospf *ospf = vty->index;
1954: struct ospf_area *area;
1955: struct in_addr area_id;
1956: struct prefix_list *plist;
1957: int format;
1958:
1959: VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
1960:
1961: if ((area = ospf_area_lookup_by_area_id (ospf, area_id)) == NULL)
1962: return CMD_SUCCESS;
1963:
1964: plist = prefix_list_lookup (AFI_IP, argv[1]);
1965: if (strncmp (argv[2], "in", 2) == 0)
1966: {
1967: if (PREFIX_NAME_IN (area))
1968: if (strcmp (PREFIX_NAME_IN (area), argv[1]) != 0)
1969: return CMD_SUCCESS;
1970:
1971: PREFIX_LIST_IN (area) = NULL;
1972: if (PREFIX_NAME_IN (area))
1973: free (PREFIX_NAME_IN (area));
1974:
1975: PREFIX_NAME_IN (area) = NULL;
1976:
1977: ospf_schedule_abr_task (ospf);
1978: }
1979: else
1980: {
1981: if (PREFIX_NAME_OUT (area))
1982: if (strcmp (PREFIX_NAME_OUT (area), argv[1]) != 0)
1983: return CMD_SUCCESS;
1984:
1985: PREFIX_LIST_OUT (area) = NULL;
1986: if (PREFIX_NAME_OUT (area))
1987: free (PREFIX_NAME_OUT (area));
1988:
1989: PREFIX_NAME_OUT (area) = NULL;
1990:
1991: ospf_schedule_abr_task (ospf);
1992: }
1993:
1994: return CMD_SUCCESS;
1995: }
1996:
1997:
1998: DEFUN (ospf_area_authentication_message_digest,
1999: ospf_area_authentication_message_digest_cmd,
2000: "area (A.B.C.D|<0-4294967295>) authentication message-digest",
2001: "OSPF area parameters\n"
2002: "Enable authentication\n"
2003: "Use message-digest authentication\n")
2004: {
2005: struct ospf *ospf = vty->index;
2006: struct ospf_area *area;
2007: struct in_addr area_id;
2008: int format;
2009:
2010: VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
2011:
2012: area = ospf_area_get (ospf, area_id, format);
2013: area->auth_type = OSPF_AUTH_CRYPTOGRAPHIC;
2014:
2015: return CMD_SUCCESS;
2016: }
2017:
2018: DEFUN (ospf_area_authentication,
2019: ospf_area_authentication_cmd,
2020: "area (A.B.C.D|<0-4294967295>) authentication",
2021: "OSPF area parameters\n"
2022: "OSPF area ID in IP address format\n"
2023: "OSPF area ID as a decimal value\n"
2024: "Enable authentication\n")
2025: {
2026: struct ospf *ospf = vty->index;
2027: struct ospf_area *area;
2028: struct in_addr area_id;
2029: int format;
2030:
2031: VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
2032:
2033: area = ospf_area_get (ospf, area_id, format);
2034: area->auth_type = OSPF_AUTH_SIMPLE;
2035:
2036: return CMD_SUCCESS;
2037: }
2038:
2039: DEFUN (no_ospf_area_authentication,
2040: no_ospf_area_authentication_cmd,
2041: "no area (A.B.C.D|<0-4294967295>) authentication",
2042: NO_STR
2043: "OSPF area parameters\n"
2044: "OSPF area ID in IP address format\n"
2045: "OSPF area ID as a decimal value\n"
2046: "Enable authentication\n")
2047: {
2048: struct ospf *ospf = vty->index;
2049: struct ospf_area *area;
2050: struct in_addr area_id;
2051: int format;
2052:
2053: VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
2054:
2055: area = ospf_area_lookup_by_area_id (ospf, area_id);
2056: if (area == NULL)
2057: return CMD_SUCCESS;
2058:
2059: area->auth_type = OSPF_AUTH_NULL;
2060:
2061: ospf_area_check_free (ospf, area_id);
2062:
2063: return CMD_SUCCESS;
2064: }
2065:
2066:
2067: DEFUN (ospf_abr_type,
2068: ospf_abr_type_cmd,
2069: "ospf abr-type (cisco|ibm|shortcut|standard)",
2070: "OSPF specific commands\n"
2071: "Set OSPF ABR type\n"
2072: "Alternative ABR, cisco implementation\n"
2073: "Alternative ABR, IBM implementation\n"
2074: "Shortcut ABR\n"
2075: "Standard behavior (RFC2328)\n")
2076: {
2077: struct ospf *ospf = vty->index;
2078: u_char abr_type = OSPF_ABR_UNKNOWN;
2079:
2080: if (strncmp (argv[0], "c", 1) == 0)
2081: abr_type = OSPF_ABR_CISCO;
2082: else if (strncmp (argv[0], "i", 1) == 0)
2083: abr_type = OSPF_ABR_IBM;
2084: else if (strncmp (argv[0], "sh", 2) == 0)
2085: abr_type = OSPF_ABR_SHORTCUT;
2086: else if (strncmp (argv[0], "st", 2) == 0)
2087: abr_type = OSPF_ABR_STAND;
2088: else
2089: return CMD_WARNING;
2090:
2091: /* If ABR type value is changed, schedule ABR task. */
2092: if (ospf->abr_type != abr_type)
2093: {
2094: ospf->abr_type = abr_type;
2095: ospf_schedule_abr_task (ospf);
2096: }
2097:
2098: return CMD_SUCCESS;
2099: }
2100:
2101: DEFUN (no_ospf_abr_type,
2102: no_ospf_abr_type_cmd,
2103: "no ospf abr-type (cisco|ibm|shortcut|standard)",
2104: NO_STR
2105: "OSPF specific commands\n"
2106: "Set OSPF ABR type\n"
2107: "Alternative ABR, cisco implementation\n"
2108: "Alternative ABR, IBM implementation\n"
2109: "Shortcut ABR\n")
2110: {
2111: struct ospf *ospf = vty->index;
2112: u_char abr_type = OSPF_ABR_UNKNOWN;
2113:
2114: if (strncmp (argv[0], "c", 1) == 0)
2115: abr_type = OSPF_ABR_CISCO;
2116: else if (strncmp (argv[0], "i", 1) == 0)
2117: abr_type = OSPF_ABR_IBM;
2118: else if (strncmp (argv[0], "sh", 2) == 0)
2119: abr_type = OSPF_ABR_SHORTCUT;
2120: else if (strncmp (argv[0], "st", 2) == 0)
2121: abr_type = OSPF_ABR_STAND;
2122: else
2123: return CMD_WARNING;
2124:
2125: /* If ABR type value is changed, schedule ABR task. */
2126: if (ospf->abr_type == abr_type)
2127: {
2128: ospf->abr_type = OSPF_ABR_DEFAULT;
2129: ospf_schedule_abr_task (ospf);
2130: }
2131:
2132: return CMD_SUCCESS;
2133: }
2134:
2135: DEFUN (ospf_log_adjacency_changes,
2136: ospf_log_adjacency_changes_cmd,
2137: "log-adjacency-changes",
2138: "Log changes in adjacency state\n")
2139: {
2140: struct ospf *ospf = vty->index;
2141:
2142: SET_FLAG(ospf->config, OSPF_LOG_ADJACENCY_CHANGES);
2143: return CMD_SUCCESS;
2144: }
2145:
2146: DEFUN (ospf_log_adjacency_changes_detail,
2147: ospf_log_adjacency_changes_detail_cmd,
2148: "log-adjacency-changes detail",
2149: "Log changes in adjacency state\n"
2150: "Log all state changes\n")
2151: {
2152: struct ospf *ospf = vty->index;
2153:
2154: SET_FLAG(ospf->config, OSPF_LOG_ADJACENCY_CHANGES);
2155: SET_FLAG(ospf->config, OSPF_LOG_ADJACENCY_DETAIL);
2156: return CMD_SUCCESS;
2157: }
2158:
2159: DEFUN (no_ospf_log_adjacency_changes,
2160: no_ospf_log_adjacency_changes_cmd,
2161: "no log-adjacency-changes",
2162: NO_STR
2163: "Log changes in adjacency state\n")
2164: {
2165: struct ospf *ospf = vty->index;
2166:
2167: UNSET_FLAG(ospf->config, OSPF_LOG_ADJACENCY_DETAIL);
2168: UNSET_FLAG(ospf->config, OSPF_LOG_ADJACENCY_CHANGES);
2169: return CMD_SUCCESS;
2170: }
2171:
2172: DEFUN (no_ospf_log_adjacency_changes_detail,
2173: no_ospf_log_adjacency_changes_detail_cmd,
2174: "no log-adjacency-changes detail",
2175: NO_STR
2176: "Log changes in adjacency state\n"
2177: "Log all state changes\n")
2178: {
2179: struct ospf *ospf = vty->index;
2180:
2181: UNSET_FLAG(ospf->config, OSPF_LOG_ADJACENCY_DETAIL);
2182: return CMD_SUCCESS;
2183: }
2184:
2185: DEFUN (ospf_compatible_rfc1583,
2186: ospf_compatible_rfc1583_cmd,
2187: "compatible rfc1583",
2188: "OSPF compatibility list\n"
2189: "compatible with RFC 1583\n")
2190: {
2191: struct ospf *ospf = vty->index;
2192:
2193: if (!CHECK_FLAG (ospf->config, OSPF_RFC1583_COMPATIBLE))
2194: {
2195: SET_FLAG (ospf->config, OSPF_RFC1583_COMPATIBLE);
2196: ospf_spf_calculate_schedule (ospf);
2197: }
2198: return CMD_SUCCESS;
2199: }
2200:
2201: DEFUN (no_ospf_compatible_rfc1583,
2202: no_ospf_compatible_rfc1583_cmd,
2203: "no compatible rfc1583",
2204: NO_STR
2205: "OSPF compatibility list\n"
2206: "compatible with RFC 1583\n")
2207: {
2208: struct ospf *ospf = vty->index;
2209:
2210: if (CHECK_FLAG (ospf->config, OSPF_RFC1583_COMPATIBLE))
2211: {
2212: UNSET_FLAG (ospf->config, OSPF_RFC1583_COMPATIBLE);
2213: ospf_spf_calculate_schedule (ospf);
2214: }
2215: return CMD_SUCCESS;
2216: }
2217:
2218: ALIAS (ospf_compatible_rfc1583,
2219: ospf_rfc1583_flag_cmd,
2220: "ospf rfc1583compatibility",
2221: "OSPF specific commands\n"
2222: "Enable the RFC1583Compatibility flag\n")
2223:
2224: ALIAS (no_ospf_compatible_rfc1583,
2225: no_ospf_rfc1583_flag_cmd,
2226: "no ospf rfc1583compatibility",
2227: NO_STR
2228: "OSPF specific commands\n"
2229: "Disable the RFC1583Compatibility flag\n")
2230:
2231: static int
2232: ospf_timers_spf_set (struct vty *vty, unsigned int delay,
2233: unsigned int hold,
2234: unsigned int max)
2235: {
2236: struct ospf *ospf = vty->index;
2237:
2238: ospf->spf_delay = delay;
2239: ospf->spf_holdtime = hold;
2240: ospf->spf_max_holdtime = max;
2241:
2242: return CMD_SUCCESS;
2243: }
2244:
2245: DEFUN (ospf_timers_throttle_spf,
2246: ospf_timers_throttle_spf_cmd,
2247: "timers throttle spf <0-600000> <0-600000> <0-600000>",
2248: "Adjust routing timers\n"
2249: "Throttling adaptive timer\n"
2250: "OSPF SPF timers\n"
2251: "Delay (msec) from first change received till SPF calculation\n"
2252: "Initial hold time (msec) between consecutive SPF calculations\n"
2253: "Maximum hold time (msec)\n")
2254: {
2255: unsigned int delay, hold, max;
2256:
2257: if (argc != 3)
2258: {
2259: vty_out (vty, "Insufficient arguments%s", VTY_NEWLINE);
2260: return CMD_WARNING;
2261: }
2262:
2263: VTY_GET_INTEGER_RANGE ("SPF delay timer", delay, argv[0], 0, 600000);
2264: VTY_GET_INTEGER_RANGE ("SPF hold timer", hold, argv[1], 0, 600000);
2265: VTY_GET_INTEGER_RANGE ("SPF max-hold timer", max, argv[2], 0, 600000);
2266:
2267: return ospf_timers_spf_set (vty, delay, hold, max);
2268: }
2269:
2270: DEFUN_DEPRECATED (ospf_timers_spf,
2271: ospf_timers_spf_cmd,
2272: "timers spf <0-4294967295> <0-4294967295>",
2273: "Adjust routing timers\n"
2274: "OSPF SPF timers\n"
2275: "Delay (s) between receiving a change to SPF calculation\n"
2276: "Hold time (s) between consecutive SPF calculations\n")
2277: {
2278: unsigned int delay, hold;
2279:
2280: if (argc != 2)
2281: {
2282: vty_out (vty, "Insufficient number of arguments%s", VTY_NEWLINE);
2283: return CMD_WARNING;
2284: }
2285:
2286: VTY_GET_INTEGER ("SPF delay timer", delay, argv[0]);
2287: VTY_GET_INTEGER ("SPF hold timer", hold, argv[1]);
2288:
2289: /* truncate down the second values if they're greater than 600000ms */
2290: if (delay > (600000 / 1000))
2291: delay = 600000;
2292: else if (delay == 0)
2293: /* 0s delay was probably specified because of lack of ms resolution */
2294: delay = OSPF_SPF_DELAY_DEFAULT;
2295: if (hold > (600000 / 1000))
2296: hold = 600000;
2297:
2298: return ospf_timers_spf_set (vty, delay * 1000, hold * 1000, hold * 1000);
2299: }
2300:
2301: DEFUN (no_ospf_timers_throttle_spf,
2302: no_ospf_timers_throttle_spf_cmd,
2303: "no timers throttle spf",
2304: NO_STR
2305: "Adjust routing timers\n"
2306: "Throttling adaptive timer\n"
2307: "OSPF SPF timers\n")
2308: {
2309: return ospf_timers_spf_set (vty,
2310: OSPF_SPF_DELAY_DEFAULT,
2311: OSPF_SPF_HOLDTIME_DEFAULT,
2312: OSPF_SPF_MAX_HOLDTIME_DEFAULT);
2313: }
2314:
2315: ALIAS_DEPRECATED (no_ospf_timers_throttle_spf,
2316: no_ospf_timers_spf_cmd,
2317: "no timers spf",
2318: NO_STR
2319: "Adjust routing timers\n"
2320: "OSPF SPF timers\n")
2321:
2322: DEFUN (ospf_neighbor,
2323: ospf_neighbor_cmd,
2324: "neighbor A.B.C.D",
2325: NEIGHBOR_STR
2326: "Neighbor IP address\n")
2327: {
2328: struct ospf *ospf = vty->index;
2329: struct in_addr nbr_addr;
2330: unsigned int priority = OSPF_NEIGHBOR_PRIORITY_DEFAULT;
2331: unsigned int interval = OSPF_POLL_INTERVAL_DEFAULT;
2332:
2333: VTY_GET_IPV4_ADDRESS ("neighbor address", nbr_addr, argv[0]);
2334:
2335: if (argc > 1)
2336: VTY_GET_INTEGER_RANGE ("neighbor priority", priority, argv[1], 0, 255);
2337:
2338: if (argc > 2)
2339: VTY_GET_INTEGER_RANGE ("poll interval", interval, argv[2], 1, 65535);
2340:
2341: ospf_nbr_nbma_set (ospf, nbr_addr);
2342: if (argc > 1)
2343: ospf_nbr_nbma_priority_set (ospf, nbr_addr, priority);
2344: if (argc > 2)
2345: ospf_nbr_nbma_poll_interval_set (ospf, nbr_addr, priority);
2346:
2347: return CMD_SUCCESS;
2348: }
2349:
2350: ALIAS (ospf_neighbor,
2351: ospf_neighbor_priority_poll_interval_cmd,
2352: "neighbor A.B.C.D priority <0-255> poll-interval <1-65535>",
2353: NEIGHBOR_STR
2354: "Neighbor IP address\n"
2355: "Neighbor Priority\n"
2356: "Priority\n"
2357: "Dead Neighbor Polling interval\n"
2358: "Seconds\n")
2359:
2360: ALIAS (ospf_neighbor,
2361: ospf_neighbor_priority_cmd,
2362: "neighbor A.B.C.D priority <0-255>",
2363: NEIGHBOR_STR
2364: "Neighbor IP address\n"
2365: "Neighbor Priority\n"
2366: "Seconds\n")
2367:
2368: DEFUN (ospf_neighbor_poll_interval,
2369: ospf_neighbor_poll_interval_cmd,
2370: "neighbor A.B.C.D poll-interval <1-65535>",
2371: NEIGHBOR_STR
2372: "Neighbor IP address\n"
2373: "Dead Neighbor Polling interval\n"
2374: "Seconds\n")
2375: {
2376: struct ospf *ospf = vty->index;
2377: struct in_addr nbr_addr;
2378: unsigned int priority = OSPF_NEIGHBOR_PRIORITY_DEFAULT;
2379: unsigned int interval = OSPF_POLL_INTERVAL_DEFAULT;
2380:
2381: VTY_GET_IPV4_ADDRESS ("neighbor address", nbr_addr, argv[0]);
2382:
2383: if (argc > 1)
2384: VTY_GET_INTEGER_RANGE ("poll interval", interval, argv[1], 1, 65535);
2385:
2386: if (argc > 2)
2387: VTY_GET_INTEGER_RANGE ("neighbor priority", priority, argv[2], 0, 255);
2388:
2389: ospf_nbr_nbma_set (ospf, nbr_addr);
2390: if (argc > 1)
2391: ospf_nbr_nbma_poll_interval_set (ospf, nbr_addr, interval);
2392: if (argc > 2)
2393: ospf_nbr_nbma_priority_set (ospf, nbr_addr, priority);
2394:
2395: return CMD_SUCCESS;
2396: }
2397:
2398: ALIAS (ospf_neighbor_poll_interval,
2399: ospf_neighbor_poll_interval_priority_cmd,
2400: "neighbor A.B.C.D poll-interval <1-65535> priority <0-255>",
2401: NEIGHBOR_STR
2402: "Neighbor address\n"
2403: "OSPF dead-router polling interval\n"
2404: "Seconds\n"
2405: "OSPF priority of non-broadcast neighbor\n"
2406: "Priority\n")
2407:
2408: DEFUN (no_ospf_neighbor,
2409: no_ospf_neighbor_cmd,
2410: "no neighbor A.B.C.D",
2411: NO_STR
2412: NEIGHBOR_STR
2413: "Neighbor IP address\n")
2414: {
2415: struct ospf *ospf = vty->index;
2416: struct in_addr nbr_addr;
2417: int ret;
2418:
2419: VTY_GET_IPV4_ADDRESS ("neighbor address", nbr_addr, argv[0]);
2420:
2421: ret = ospf_nbr_nbma_unset (ospf, nbr_addr);
2422:
2423: return CMD_SUCCESS;
2424: }
2425:
2426: ALIAS (no_ospf_neighbor,
2427: no_ospf_neighbor_priority_cmd,
2428: "no neighbor A.B.C.D priority <0-255>",
2429: NO_STR
2430: NEIGHBOR_STR
2431: "Neighbor IP address\n"
2432: "Neighbor Priority\n"
2433: "Priority\n")
2434:
2435: ALIAS (no_ospf_neighbor,
2436: no_ospf_neighbor_poll_interval_cmd,
2437: "no neighbor A.B.C.D poll-interval <1-65535>",
2438: NO_STR
2439: NEIGHBOR_STR
2440: "Neighbor IP address\n"
2441: "Dead Neighbor Polling interval\n"
2442: "Seconds\n")
2443:
2444: ALIAS (no_ospf_neighbor,
2445: no_ospf_neighbor_priority_pollinterval_cmd,
2446: "no neighbor A.B.C.D priority <0-255> poll-interval <1-65535>",
2447: NO_STR
2448: NEIGHBOR_STR
2449: "Neighbor IP address\n"
2450: "Neighbor Priority\n"
2451: "Priority\n"
2452: "Dead Neighbor Polling interval\n"
2453: "Seconds\n")
2454:
2455:
2456: DEFUN (ospf_refresh_timer, ospf_refresh_timer_cmd,
2457: "refresh timer <10-1800>",
2458: "Adjust refresh parameters\n"
2459: "Set refresh timer\n"
2460: "Timer value in seconds\n")
2461: {
2462: struct ospf *ospf = vty->index;
2463: unsigned int interval;
2464:
2465: VTY_GET_INTEGER_RANGE ("refresh timer", interval, argv[0], 10, 1800);
2466: interval = (interval / 10) * 10;
2467:
2468: ospf_timers_refresh_set (ospf, interval);
2469:
2470: return CMD_SUCCESS;
2471: }
2472:
2473: DEFUN (no_ospf_refresh_timer, no_ospf_refresh_timer_val_cmd,
2474: "no refresh timer <10-1800>",
2475: "Adjust refresh parameters\n"
2476: "Unset refresh timer\n"
2477: "Timer value in seconds\n")
2478: {
2479: struct ospf *ospf = vty->index;
2480: unsigned int interval;
2481:
2482: if (argc == 1)
2483: {
2484: VTY_GET_INTEGER_RANGE ("refresh timer", interval, argv[0], 10, 1800);
2485:
2486: if (ospf->lsa_refresh_interval != interval ||
2487: interval == OSPF_LSA_REFRESH_INTERVAL_DEFAULT)
2488: return CMD_SUCCESS;
2489: }
2490:
2491: ospf_timers_refresh_unset (ospf);
2492:
2493: return CMD_SUCCESS;
2494: }
2495:
2496: ALIAS (no_ospf_refresh_timer,
2497: no_ospf_refresh_timer_cmd,
2498: "no refresh timer",
2499: "Adjust refresh parameters\n"
2500: "Unset refresh timer\n")
2501:
2502: DEFUN (ospf_auto_cost_reference_bandwidth,
2503: ospf_auto_cost_reference_bandwidth_cmd,
2504: "auto-cost reference-bandwidth <1-4294967>",
2505: "Calculate OSPF interface cost according to bandwidth\n"
2506: "Use reference bandwidth method to assign OSPF cost\n"
2507: "The reference bandwidth in terms of Mbits per second\n")
2508: {
2509: struct ospf *ospf = vty->index;
2510: u_int32_t refbw;
2511: struct listnode *node;
2512: struct interface *ifp;
2513:
2514: refbw = strtol (argv[0], NULL, 10);
2515: if (refbw < 1 || refbw > 4294967)
2516: {
2517: vty_out (vty, "reference-bandwidth value is invalid%s", VTY_NEWLINE);
2518: return CMD_WARNING;
2519: }
2520:
2521: /* If reference bandwidth is changed. */
2522: if ((refbw * 1000) == ospf->ref_bandwidth)
2523: return CMD_SUCCESS;
2524:
2525: ospf->ref_bandwidth = refbw * 1000;
2526: for (ALL_LIST_ELEMENTS_RO (om->iflist, node, ifp))
2527: ospf_if_recalculate_output_cost (ifp);
2528:
2529: return CMD_SUCCESS;
2530: }
2531:
2532: DEFUN (no_ospf_auto_cost_reference_bandwidth,
2533: no_ospf_auto_cost_reference_bandwidth_cmd,
2534: "no auto-cost reference-bandwidth",
2535: NO_STR
2536: "Calculate OSPF interface cost according to bandwidth\n"
2537: "Use reference bandwidth method to assign OSPF cost\n")
2538: {
2539: struct ospf *ospf = vty->index;
2540: struct listnode *node, *nnode;
2541: struct interface *ifp;
2542:
2543: if (ospf->ref_bandwidth == OSPF_DEFAULT_REF_BANDWIDTH)
2544: return CMD_SUCCESS;
2545:
2546: ospf->ref_bandwidth = OSPF_DEFAULT_REF_BANDWIDTH;
2547: vty_out (vty, "%% OSPF: Reference bandwidth is changed.%s", VTY_NEWLINE);
2548: vty_out (vty, " Please ensure reference bandwidth is consistent across all routers%s", VTY_NEWLINE);
2549:
2550: for (ALL_LIST_ELEMENTS (om->iflist, node, nnode, ifp))
2551: ospf_if_recalculate_output_cost (ifp);
2552:
2553: return CMD_SUCCESS;
2554: }
2555:
2556: const char *ospf_abr_type_descr_str[] =
2557: {
2558: "Unknown",
2559: "Standard (RFC2328)",
2560: "Alternative IBM",
2561: "Alternative Cisco",
2562: "Alternative Shortcut"
2563: };
2564:
2565: const char *ospf_shortcut_mode_descr_str[] =
2566: {
2567: "Default",
2568: "Enabled",
2569: "Disabled"
2570: };
2571:
2572:
2573:
2574: static void
2575: show_ip_ospf_area (struct vty *vty, struct ospf_area *area)
2576: {
2577: /* Show Area ID. */
2578: vty_out (vty, " Area ID: %s", inet_ntoa (area->area_id));
2579:
2580: /* Show Area type/mode. */
2581: if (OSPF_IS_AREA_BACKBONE (area))
2582: vty_out (vty, " (Backbone)%s", VTY_NEWLINE);
2583: else
2584: {
2585: if (area->external_routing == OSPF_AREA_STUB)
2586: vty_out (vty, " (Stub%s%s)",
2587: area->no_summary ? ", no summary" : "",
2588: area->shortcut_configured ? "; " : "");
2589:
2590: else if (area->external_routing == OSPF_AREA_NSSA)
2591: vty_out (vty, " (NSSA%s%s)",
2592: area->no_summary ? ", no summary" : "",
2593: area->shortcut_configured ? "; " : "");
2594:
2595: vty_out (vty, "%s", VTY_NEWLINE);
2596: vty_out (vty, " Shortcutting mode: %s",
2597: ospf_shortcut_mode_descr_str[area->shortcut_configured]);
2598: vty_out (vty, ", S-bit consensus: %s%s",
2599: area->shortcut_capability ? "ok" : "no", VTY_NEWLINE);
2600: }
2601:
2602: /* Show number of interfaces. */
2603: vty_out (vty, " Number of interfaces in this area: Total: %d, "
2604: "Active: %d%s", listcount (area->oiflist),
2605: area->act_ints, VTY_NEWLINE);
2606:
2607: if (area->external_routing == OSPF_AREA_NSSA)
2608: {
2609: vty_out (vty, " It is an NSSA configuration. %s Elected NSSA/ABR performs type-7/type-5 LSA translation. %s", VTY_NEWLINE, VTY_NEWLINE);
2610: if (! IS_OSPF_ABR (area->ospf))
2611: vty_out (vty, " It is not ABR, therefore not Translator. %s",
2612: VTY_NEWLINE);
2613: else if (area->NSSATranslatorState)
2614: {
2615: vty_out (vty, " We are an ABR and ");
2616: if (area->NSSATranslatorRole == OSPF_NSSA_ROLE_CANDIDATE)
2617: vty_out (vty, "the NSSA Elected Translator. %s",
2618: VTY_NEWLINE);
2619: else if (area->NSSATranslatorRole == OSPF_NSSA_ROLE_ALWAYS)
2620: vty_out (vty, "always an NSSA Translator. %s",
2621: VTY_NEWLINE);
2622: }
2623: else
2624: {
2625: vty_out (vty, " We are an ABR, but ");
2626: if (area->NSSATranslatorRole == OSPF_NSSA_ROLE_CANDIDATE)
2627: vty_out (vty, "not the NSSA Elected Translator. %s",
2628: VTY_NEWLINE);
2629: else
2630: vty_out (vty, "never an NSSA Translator. %s",
2631: VTY_NEWLINE);
2632: }
2633: }
2634: /* Stub-router state for this area */
2635: if (CHECK_FLAG (area->stub_router_state, OSPF_AREA_IS_STUB_ROUTED))
2636: {
2637: char timebuf[OSPF_TIME_DUMP_SIZE];
2638: vty_out (vty, " Originating stub / maximum-distance Router-LSA%s",
2639: VTY_NEWLINE);
2640: if (CHECK_FLAG(area->stub_router_state, OSPF_AREA_ADMIN_STUB_ROUTED))
2641: vty_out (vty, " Administratively activated (indefinitely)%s",
2642: VTY_NEWLINE);
2643: if (area->t_stub_router)
2644: vty_out (vty, " Active from startup, %s remaining%s",
2645: ospf_timer_dump (area->t_stub_router, timebuf,
2646: sizeof(timebuf)), VTY_NEWLINE);
2647: }
2648:
2649: /* Show number of fully adjacent neighbors. */
2650: vty_out (vty, " Number of fully adjacent neighbors in this area:"
2651: " %d%s", area->full_nbrs, VTY_NEWLINE);
2652:
2653: /* Show authentication type. */
2654: vty_out (vty, " Area has ");
2655: if (area->auth_type == OSPF_AUTH_NULL)
2656: vty_out (vty, "no authentication%s", VTY_NEWLINE);
2657: else if (area->auth_type == OSPF_AUTH_SIMPLE)
2658: vty_out (vty, "simple password authentication%s", VTY_NEWLINE);
2659: else if (area->auth_type == OSPF_AUTH_CRYPTOGRAPHIC)
2660: vty_out (vty, "message digest authentication%s", VTY_NEWLINE);
2661:
2662: if (!OSPF_IS_AREA_BACKBONE (area))
2663: vty_out (vty, " Number of full virtual adjacencies going through"
2664: " this area: %d%s", area->full_vls, VTY_NEWLINE);
2665:
2666: /* Show SPF calculation times. */
2667: vty_out (vty, " SPF algorithm executed %d times%s",
2668: area->spf_calculation, VTY_NEWLINE);
2669:
2670: /* Show number of LSA. */
2671: vty_out (vty, " Number of LSA %ld%s", area->lsdb->total, VTY_NEWLINE);
2672: vty_out (vty, " Number of router LSA %ld. Checksum Sum 0x%08x%s",
2673: ospf_lsdb_count (area->lsdb, OSPF_ROUTER_LSA),
2674: ospf_lsdb_checksum (area->lsdb, OSPF_ROUTER_LSA), VTY_NEWLINE);
2675: vty_out (vty, " Number of network LSA %ld. Checksum Sum 0x%08x%s",
2676: ospf_lsdb_count (area->lsdb, OSPF_NETWORK_LSA),
2677: ospf_lsdb_checksum (area->lsdb, OSPF_NETWORK_LSA), VTY_NEWLINE);
2678: vty_out (vty, " Number of summary LSA %ld. Checksum Sum 0x%08x%s",
2679: ospf_lsdb_count (area->lsdb, OSPF_SUMMARY_LSA),
2680: ospf_lsdb_checksum (area->lsdb, OSPF_SUMMARY_LSA), VTY_NEWLINE);
2681: vty_out (vty, " Number of ASBR summary LSA %ld. Checksum Sum 0x%08x%s",
2682: ospf_lsdb_count (area->lsdb, OSPF_ASBR_SUMMARY_LSA),
2683: ospf_lsdb_checksum (area->lsdb, OSPF_ASBR_SUMMARY_LSA), VTY_NEWLINE);
2684: vty_out (vty, " Number of NSSA LSA %ld. Checksum Sum 0x%08x%s",
2685: ospf_lsdb_count (area->lsdb, OSPF_AS_NSSA_LSA),
2686: ospf_lsdb_checksum (area->lsdb, OSPF_AS_NSSA_LSA), VTY_NEWLINE);
2687: #ifdef HAVE_OPAQUE_LSA
2688: vty_out (vty, " Number of opaque link LSA %ld. Checksum Sum 0x%08x%s",
2689: ospf_lsdb_count (area->lsdb, OSPF_OPAQUE_LINK_LSA),
2690: ospf_lsdb_checksum (area->lsdb, OSPF_OPAQUE_LINK_LSA), VTY_NEWLINE);
2691: vty_out (vty, " Number of opaque area LSA %ld. Checksum Sum 0x%08x%s",
2692: ospf_lsdb_count (area->lsdb, OSPF_OPAQUE_AREA_LSA),
2693: ospf_lsdb_checksum (area->lsdb, OSPF_OPAQUE_AREA_LSA), VTY_NEWLINE);
2694: #endif /* HAVE_OPAQUE_LSA */
2695: vty_out (vty, "%s", VTY_NEWLINE);
2696: }
2697:
2698: DEFUN (show_ip_ospf,
2699: show_ip_ospf_cmd,
2700: "show ip ospf",
2701: SHOW_STR
2702: IP_STR
2703: "OSPF information\n")
2704: {
2705: struct listnode *node, *nnode;
2706: struct ospf_area * area;
2707: struct ospf *ospf;
2708: struct timeval result;
2709: char timebuf[OSPF_TIME_DUMP_SIZE];
2710:
2711: /* Check OSPF is enable. */
2712: ospf = ospf_lookup ();
2713: if (ospf == NULL)
2714: {
2715: vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
2716: return CMD_SUCCESS;
2717: }
2718:
2719: /* Show Router ID. */
2720: vty_out (vty, " OSPF Routing Process, Router ID: %s%s",
2721: inet_ntoa (ospf->router_id),
2722: VTY_NEWLINE);
2723:
2724: /* Graceful shutdown */
2725: if (ospf->t_deferred_shutdown)
2726: vty_out (vty, " Deferred shutdown in progress, %s remaining%s",
2727: ospf_timer_dump (ospf->t_deferred_shutdown,
2728: timebuf, sizeof (timebuf)), VTY_NEWLINE);
2729: /* Show capability. */
2730: vty_out (vty, " Supports only single TOS (TOS0) routes%s", VTY_NEWLINE);
2731: vty_out (vty, " This implementation conforms to RFC2328%s", VTY_NEWLINE);
2732: vty_out (vty, " RFC1583Compatibility flag is %s%s",
2733: CHECK_FLAG (ospf->config, OSPF_RFC1583_COMPATIBLE) ?
2734: "enabled" : "disabled", VTY_NEWLINE);
2735: #ifdef HAVE_OPAQUE_LSA
2736: vty_out (vty, " OpaqueCapability flag is %s%s%s",
2737: CHECK_FLAG (ospf->config, OSPF_OPAQUE_CAPABLE) ?
2738: "enabled" : "disabled",
2739: IS_OPAQUE_LSA_ORIGINATION_BLOCKED (ospf->opaque) ?
2740: " (origination blocked)" : "",
2741: VTY_NEWLINE);
2742: #endif /* HAVE_OPAQUE_LSA */
2743:
2744: /* Show stub-router configuration */
2745: if (ospf->stub_router_startup_time != OSPF_STUB_ROUTER_UNCONFIGURED
2746: || ospf->stub_router_shutdown_time != OSPF_STUB_ROUTER_UNCONFIGURED)
2747: {
2748: vty_out (vty, " Stub router advertisement is configured%s",
2749: VTY_NEWLINE);
2750: if (ospf->stub_router_startup_time != OSPF_STUB_ROUTER_UNCONFIGURED)
2751: vty_out (vty, " Enabled for %us after start-up%s",
2752: ospf->stub_router_startup_time, VTY_NEWLINE);
2753: if (ospf->stub_router_shutdown_time != OSPF_STUB_ROUTER_UNCONFIGURED)
2754: vty_out (vty, " Enabled for %us prior to full shutdown%s",
2755: ospf->stub_router_shutdown_time, VTY_NEWLINE);
2756: }
2757:
2758: /* Show SPF timers. */
2759: vty_out (vty, " Initial SPF scheduling delay %d millisec(s)%s"
2760: " Minimum hold time between consecutive SPFs %d millisec(s)%s"
2761: " Maximum hold time between consecutive SPFs %d millisec(s)%s"
2762: " Hold time multiplier is currently %d%s",
2763: ospf->spf_delay, VTY_NEWLINE,
2764: ospf->spf_holdtime, VTY_NEWLINE,
2765: ospf->spf_max_holdtime, VTY_NEWLINE,
2766: ospf->spf_hold_multiplier, VTY_NEWLINE);
2767: vty_out (vty, " SPF algorithm ");
2768: if (ospf->ts_spf.tv_sec || ospf->ts_spf.tv_usec)
2769: {
2770: result = tv_sub (recent_relative_time (), ospf->ts_spf);
2771: vty_out (vty, "last executed %s ago%s",
2772: ospf_timeval_dump (&result, timebuf, sizeof (timebuf)),
2773: VTY_NEWLINE);
2774: }
2775: else
2776: vty_out (vty, "has not been run%s", VTY_NEWLINE);
2777: vty_out (vty, " SPF timer %s%s%s",
2778: (ospf->t_spf_calc ? "due in " : "is "),
2779: ospf_timer_dump (ospf->t_spf_calc, timebuf, sizeof (timebuf)),
2780: VTY_NEWLINE);
2781:
2782: /* Show refresh parameters. */
2783: vty_out (vty, " Refresh timer %d secs%s",
2784: ospf->lsa_refresh_interval, VTY_NEWLINE);
2785:
2786: /* Show ABR/ASBR flags. */
2787: if (CHECK_FLAG (ospf->flags, OSPF_FLAG_ABR))
2788: vty_out (vty, " This router is an ABR, ABR type is: %s%s",
2789: ospf_abr_type_descr_str[ospf->abr_type], VTY_NEWLINE);
2790:
2791: if (CHECK_FLAG (ospf->flags, OSPF_FLAG_ASBR))
2792: vty_out (vty, " This router is an ASBR "
2793: "(injecting external routing information)%s", VTY_NEWLINE);
2794:
2795: /* Show Number of AS-external-LSAs. */
2796: vty_out (vty, " Number of external LSA %ld. Checksum Sum 0x%08x%s",
2797: ospf_lsdb_count (ospf->lsdb, OSPF_AS_EXTERNAL_LSA),
2798: ospf_lsdb_checksum (ospf->lsdb, OSPF_AS_EXTERNAL_LSA), VTY_NEWLINE);
2799: #ifdef HAVE_OPAQUE_LSA
2800: vty_out (vty, " Number of opaque AS LSA %ld. Checksum Sum 0x%08x%s",
2801: ospf_lsdb_count (ospf->lsdb, OSPF_OPAQUE_AS_LSA),
2802: ospf_lsdb_checksum (ospf->lsdb, OSPF_OPAQUE_AS_LSA), VTY_NEWLINE);
2803: #endif /* HAVE_OPAQUE_LSA */
2804: /* Show number of areas attached. */
2805: vty_out (vty, " Number of areas attached to this router: %d%s",
2806: listcount (ospf->areas), VTY_NEWLINE);
2807:
2808: if (CHECK_FLAG(ospf->config, OSPF_LOG_ADJACENCY_CHANGES))
2809: {
2810: if (CHECK_FLAG(ospf->config, OSPF_LOG_ADJACENCY_DETAIL))
2811: vty_out(vty, " All adjacency changes are logged%s",VTY_NEWLINE);
2812: else
2813: vty_out(vty, " Adjacency changes are logged%s",VTY_NEWLINE);
2814: }
2815:
2816: vty_out (vty, "%s",VTY_NEWLINE);
2817:
2818: /* Show each area status. */
2819: for (ALL_LIST_ELEMENTS (ospf->areas, node, nnode, area))
2820: show_ip_ospf_area (vty, area);
2821:
2822: return CMD_SUCCESS;
2823: }
2824:
2825:
2826: static void
2827: show_ip_ospf_interface_sub (struct vty *vty, struct ospf *ospf,
2828: struct interface *ifp)
2829: {
2830: int is_up;
2831: struct ospf_neighbor *nbr;
2832: struct route_node *rn;
2833:
2834: /* Is interface up? */
2835: vty_out (vty, "%s is %s%s", ifp->name,
2836: ((is_up = if_is_operative(ifp)) ? "up" : "down"), VTY_NEWLINE);
2837: vty_out (vty, " ifindex %u, MTU %u bytes, BW %u Kbit %s%s",
2838: ifp->ifindex, ifp->mtu, ifp->bandwidth, if_flag_dump(ifp->flags),
2839: VTY_NEWLINE);
2840:
2841: /* Is interface OSPF enabled? */
2842: if (ospf_oi_count(ifp) == 0)
2843: {
2844: vty_out (vty, " OSPF not enabled on this interface%s", VTY_NEWLINE);
2845: return;
2846: }
2847: else if (!is_up)
2848: {
2849: vty_out (vty, " OSPF is enabled, but not running on this interface%s",
2850: VTY_NEWLINE);
2851: return;
2852: }
2853:
2854: for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn))
2855: {
2856: struct ospf_interface *oi = rn->info;
2857:
2858: if (oi == NULL)
2859: continue;
2860:
2861: /* Show OSPF interface information. */
2862: vty_out (vty, " Internet Address %s/%d,",
2863: inet_ntoa (oi->address->u.prefix4), oi->address->prefixlen);
2864:
2865: if (oi->connected->destination || oi->type == OSPF_IFTYPE_VIRTUALLINK)
2866: {
2867: struct in_addr *dest;
2868: const char *dstr;
2869:
2870: if (CONNECTED_PEER(oi->connected)
2871: || oi->type == OSPF_IFTYPE_VIRTUALLINK)
2872: dstr = "Peer";
2873: else
2874: dstr = "Broadcast";
2875:
2876: /* For Vlinks, showing the peer address is probably more
2877: * informative than the local interface that is being used
2878: */
2879: if (oi->type == OSPF_IFTYPE_VIRTUALLINK)
2880: dest = &oi->vl_data->peer_addr;
2881: else
2882: dest = &oi->connected->destination->u.prefix4;
2883:
2884: vty_out (vty, " %s %s,", dstr, inet_ntoa (*dest));
2885: }
2886:
2887: vty_out (vty, " Area %s%s", ospf_area_desc_string (oi->area),
2888: VTY_NEWLINE);
2889:
2890: vty_out (vty, " MTU mismatch detection:%s%s",
2891: OSPF_IF_PARAM(oi, mtu_ignore) ? "disabled" : "enabled", VTY_NEWLINE);
2892:
2893: vty_out (vty, " Router ID %s, Network Type %s, Cost: %d%s",
2894: inet_ntoa (ospf->router_id), ospf_network_type_str[oi->type],
2895: oi->output_cost, VTY_NEWLINE);
2896:
2897: vty_out (vty, " Transmit Delay is %d sec, State %s, Priority %d%s",
2898: OSPF_IF_PARAM (oi,transmit_delay), LOOKUP (ospf_ism_state_msg, oi->state),
2899: PRIORITY (oi), VTY_NEWLINE);
2900:
2901: /* Show DR information. */
2902: if (DR (oi).s_addr == 0)
2903: vty_out (vty, " No designated router on this network%s", VTY_NEWLINE);
2904: else
2905: {
2906: nbr = ospf_nbr_lookup_by_addr (oi->nbrs, &DR (oi));
2907: if (nbr == NULL)
2908: vty_out (vty, " No designated router on this network%s", VTY_NEWLINE);
2909: else
2910: {
2911: vty_out (vty, " Designated Router (ID) %s,",
2912: inet_ntoa (nbr->router_id));
2913: vty_out (vty, " Interface Address %s%s",
2914: inet_ntoa (nbr->address.u.prefix4), VTY_NEWLINE);
2915: }
2916: }
2917:
2918: /* Show BDR information. */
2919: if (BDR (oi).s_addr == 0)
2920: vty_out (vty, " No backup designated router on this network%s",
2921: VTY_NEWLINE);
2922: else
2923: {
2924: nbr = ospf_nbr_lookup_by_addr (oi->nbrs, &BDR (oi));
2925: if (nbr == NULL)
2926: vty_out (vty, " No backup designated router on this network%s",
2927: VTY_NEWLINE);
2928: else
2929: {
2930: vty_out (vty, " Backup Designated Router (ID) %s,",
2931: inet_ntoa (nbr->router_id));
2932: vty_out (vty, " Interface Address %s%s",
2933: inet_ntoa (nbr->address.u.prefix4), VTY_NEWLINE);
2934: }
2935: }
2936:
2937: /* Next network-LSA sequence number we'll use, if we're elected DR */
2938: if (oi->params && ntohl (oi->params->network_lsa_seqnum)
2939: != OSPF_INITIAL_SEQUENCE_NUMBER)
2940: vty_out (vty, " Saved Network-LSA sequence number 0x%x%s",
2941: ntohl (oi->params->network_lsa_seqnum), VTY_NEWLINE);
2942:
2943: vty_out (vty, " Multicast group memberships:");
2944: if (OI_MEMBER_CHECK(oi, MEMBER_ALLROUTERS)
2945: || OI_MEMBER_CHECK(oi, MEMBER_DROUTERS))
2946: {
2947: if (OI_MEMBER_CHECK(oi, MEMBER_ALLROUTERS))
2948: vty_out (vty, " OSPFAllRouters");
2949: if (OI_MEMBER_CHECK(oi, MEMBER_DROUTERS))
2950: vty_out (vty, " OSPFDesignatedRouters");
2951: }
2952: else
2953: vty_out (vty, " <None>");
2954: vty_out (vty, "%s", VTY_NEWLINE);
2955:
2956: vty_out (vty, " Timer intervals configured,");
2957: vty_out (vty, " Hello ");
2958: if (OSPF_IF_PARAM (oi, fast_hello) == 0)
2959: vty_out (vty, "%ds,", OSPF_IF_PARAM (oi, v_hello));
2960: else
2961: vty_out (vty, "%dms,", 1000 / OSPF_IF_PARAM (oi, fast_hello));
2962: vty_out (vty, " Dead %ds, Wait %ds, Retransmit %d%s",
2963: OSPF_IF_PARAM (oi, v_wait),
2964: OSPF_IF_PARAM (oi, v_wait),
2965: OSPF_IF_PARAM (oi, retransmit_interval),
2966: VTY_NEWLINE);
2967:
2968: if (OSPF_IF_PASSIVE_STATUS (oi) == OSPF_IF_ACTIVE)
2969: {
2970: char timebuf[OSPF_TIME_DUMP_SIZE];
2971: vty_out (vty, " Hello due in %s%s",
2972: ospf_timer_dump (oi->t_hello, timebuf, sizeof(timebuf)),
2973: VTY_NEWLINE);
2974: }
2975: else /* passive-interface is set */
2976: vty_out (vty, " No Hellos (Passive interface)%s", VTY_NEWLINE);
2977:
2978: vty_out (vty, " Neighbor Count is %d, Adjacent neighbor count is %d%s",
2979: ospf_nbr_count (oi, 0), ospf_nbr_count (oi, NSM_Full),
2980: VTY_NEWLINE);
2981: }
2982: }
2983:
2984: DEFUN (show_ip_ospf_interface,
2985: show_ip_ospf_interface_cmd,
2986: "show ip ospf interface [INTERFACE]",
2987: SHOW_STR
2988: IP_STR
2989: "OSPF information\n"
2990: "Interface information\n"
2991: "Interface name\n")
2992: {
2993: struct interface *ifp;
2994: struct ospf *ospf;
2995: struct listnode *node;
2996:
2997: ospf = ospf_lookup ();
2998: if (ospf == NULL)
2999: {
3000: vty_out (vty, "OSPF Routing Process not enabled%s", VTY_NEWLINE);
3001: return CMD_SUCCESS;
3002: }
3003:
3004: /* Show All Interfaces. */
3005: if (argc == 0)
3006: for (ALL_LIST_ELEMENTS_RO (iflist, node, ifp))
3007: show_ip_ospf_interface_sub (vty, ospf, ifp);
3008: /* Interface name is specified. */
3009: else
3010: {
3011: if ((ifp = if_lookup_by_name (argv[0])) == NULL)
3012: vty_out (vty, "No such interface name%s", VTY_NEWLINE);
3013: else
3014: show_ip_ospf_interface_sub (vty, ospf, ifp);
3015: }
3016:
3017: return CMD_SUCCESS;
3018: }
3019:
3020: static void
3021: show_ip_ospf_neighbour_header (struct vty *vty)
3022: {
3023: vty_out (vty, "%s%15s %3s %-15s %9s %-15s %-20s %5s %5s %5s%s",
3024: VTY_NEWLINE,
3025: "Neighbor ID", "Pri", "State", "Dead Time",
3026: "Address", "Interface", "RXmtL", "RqstL", "DBsmL",
3027: VTY_NEWLINE);
3028: }
3029:
3030: static void
3031: show_ip_ospf_neighbor_sub (struct vty *vty, struct ospf_interface *oi)
3032: {
3033: struct route_node *rn;
3034: struct ospf_neighbor *nbr;
3035: char msgbuf[16];
3036: char timebuf[OSPF_TIME_DUMP_SIZE];
3037:
3038: for (rn = route_top (oi->nbrs); rn; rn = route_next (rn))
3039: if ((nbr = rn->info))
3040: /* Do not show myself. */
3041: if (nbr != oi->nbr_self)
3042: /* Down state is not shown. */
3043: if (nbr->state != NSM_Down)
3044: {
3045: ospf_nbr_state_message (nbr, msgbuf, 16);
3046:
3047: if (nbr->state == NSM_Attempt && nbr->router_id.s_addr == 0)
3048: vty_out (vty, "%-15s %3d %-15s ",
3049: "-", nbr->priority,
3050: msgbuf);
3051: else
3052: vty_out (vty, "%-15s %3d %-15s ",
3053: inet_ntoa (nbr->router_id), nbr->priority,
3054: msgbuf);
3055:
3056: vty_out (vty, "%9s ",
3057: ospf_timer_dump (nbr->t_inactivity, timebuf,
3058: sizeof(timebuf)));
3059:
3060: vty_out (vty, "%-15s ", inet_ntoa (nbr->src));
3061: vty_out (vty, "%-20s %5ld %5ld %5d%s",
3062: IF_NAME (oi), ospf_ls_retransmit_count (nbr),
3063: ospf_ls_request_count (nbr), ospf_db_summary_count (nbr),
3064: VTY_NEWLINE);
3065: }
3066: }
3067:
3068: DEFUN (show_ip_ospf_neighbor,
3069: show_ip_ospf_neighbor_cmd,
3070: "show ip ospf neighbor",
3071: SHOW_STR
3072: IP_STR
3073: "OSPF information\n"
3074: "Neighbor list\n")
3075: {
3076: struct ospf *ospf;
3077: struct ospf_interface *oi;
3078: struct listnode *node;
3079:
3080: ospf = ospf_lookup ();
3081: if (ospf == NULL)
3082: {
3083: vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
3084: return CMD_SUCCESS;
3085: }
3086:
3087: show_ip_ospf_neighbour_header (vty);
3088:
3089: for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi))
3090: show_ip_ospf_neighbor_sub (vty, oi);
3091:
3092: return CMD_SUCCESS;
3093: }
3094:
3095: DEFUN (show_ip_ospf_neighbor_all,
3096: show_ip_ospf_neighbor_all_cmd,
3097: "show ip ospf neighbor all",
3098: SHOW_STR
3099: IP_STR
3100: "OSPF information\n"
3101: "Neighbor list\n"
3102: "include down status neighbor\n")
3103: {
3104: struct ospf *ospf = ospf_lookup ();
3105: struct listnode *node;
3106: struct ospf_interface *oi;
3107:
3108: if (ospf == NULL)
3109: {
3110: vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
3111: return CMD_SUCCESS;
3112: }
3113:
3114: show_ip_ospf_neighbour_header (vty);
3115:
3116: for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi))
3117: {
3118: struct listnode *nbr_node;
3119: struct ospf_nbr_nbma *nbr_nbma;
3120:
3121: show_ip_ospf_neighbor_sub (vty, oi);
3122:
3123: /* print Down neighbor status */
3124: for (ALL_LIST_ELEMENTS_RO (oi->nbr_nbma, nbr_node, nbr_nbma))
3125: {
3126: if (nbr_nbma->nbr == NULL
3127: || nbr_nbma->nbr->state == NSM_Down)
3128: {
3129: vty_out (vty, "%-15s %3d %-15s %9s ",
3130: "-", nbr_nbma->priority, "Down", "-");
3131: vty_out (vty, "%-15s %-20s %5d %5d %5d%s",
3132: inet_ntoa (nbr_nbma->addr), IF_NAME (oi),
3133: 0, 0, 0, VTY_NEWLINE);
3134: }
3135: }
3136: }
3137:
3138: return CMD_SUCCESS;
3139: }
3140:
3141: DEFUN (show_ip_ospf_neighbor_int,
3142: show_ip_ospf_neighbor_int_cmd,
3143: "show ip ospf neighbor IFNAME",
3144: SHOW_STR
3145: IP_STR
3146: "OSPF information\n"
3147: "Neighbor list\n"
3148: "Interface name\n")
3149: {
3150: struct ospf *ospf;
3151: struct interface *ifp;
3152: struct route_node *rn;
3153:
3154: ifp = if_lookup_by_name (argv[0]);
3155: if (!ifp)
3156: {
3157: vty_out (vty, "No such interface.%s", VTY_NEWLINE);
3158: return CMD_WARNING;
3159: }
3160:
3161: ospf = ospf_lookup ();
3162: if (ospf == NULL)
3163: {
3164: vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
3165: return CMD_SUCCESS;
3166: }
3167:
3168: show_ip_ospf_neighbour_header (vty);
3169:
3170: for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn))
3171: {
3172: struct ospf_interface *oi = rn->info;
3173:
3174: if (oi == NULL)
3175: continue;
3176:
3177: show_ip_ospf_neighbor_sub (vty, oi);
3178: }
3179:
3180: return CMD_SUCCESS;
3181: }
3182:
3183: static void
3184: show_ip_ospf_nbr_nbma_detail_sub (struct vty *vty, struct ospf_interface *oi,
3185: struct ospf_nbr_nbma *nbr_nbma)
3186: {
3187: char timebuf[OSPF_TIME_DUMP_SIZE];
3188:
3189: /* Show neighbor ID. */
3190: vty_out (vty, " Neighbor %s,", "-");
3191:
3192: /* Show interface address. */
3193: vty_out (vty, " interface address %s%s",
3194: inet_ntoa (nbr_nbma->addr), VTY_NEWLINE);
3195: /* Show Area ID. */
3196: vty_out (vty, " In the area %s via interface %s%s",
3197: ospf_area_desc_string (oi->area), IF_NAME (oi), VTY_NEWLINE);
3198: /* Show neighbor priority and state. */
3199: vty_out (vty, " Neighbor priority is %d, State is %s,",
3200: nbr_nbma->priority, "Down");
3201: /* Show state changes. */
3202: vty_out (vty, " %d state changes%s", nbr_nbma->state_change, VTY_NEWLINE);
3203:
3204: /* Show PollInterval */
3205: vty_out (vty, " Poll interval %d%s", nbr_nbma->v_poll, VTY_NEWLINE);
3206:
3207: /* Show poll-interval timer. */
3208: vty_out (vty, " Poll timer due in %s%s",
3209: ospf_timer_dump (nbr_nbma->t_poll, timebuf, sizeof(timebuf)),
3210: VTY_NEWLINE);
3211:
3212: /* Show poll-interval timer thread. */
3213: vty_out (vty, " Thread Poll Timer %s%s",
3214: nbr_nbma->t_poll != NULL ? "on" : "off", VTY_NEWLINE);
3215: }
3216:
3217: static void
3218: show_ip_ospf_neighbor_detail_sub (struct vty *vty, struct ospf_interface *oi,
3219: struct ospf_neighbor *nbr)
3220: {
3221: char timebuf[OSPF_TIME_DUMP_SIZE];
3222:
3223: /* Show neighbor ID. */
3224: if (nbr->state == NSM_Attempt && nbr->router_id.s_addr == 0)
3225: vty_out (vty, " Neighbor %s,", "-");
3226: else
3227: vty_out (vty, " Neighbor %s,", inet_ntoa (nbr->router_id));
3228:
3229: /* Show interface address. */
3230: vty_out (vty, " interface address %s%s",
3231: inet_ntoa (nbr->address.u.prefix4), VTY_NEWLINE);
3232: /* Show Area ID. */
3233: vty_out (vty, " In the area %s via interface %s%s",
3234: ospf_area_desc_string (oi->area), oi->ifp->name, VTY_NEWLINE);
3235: /* Show neighbor priority and state. */
3236: vty_out (vty, " Neighbor priority is %d, State is %s,",
3237: nbr->priority, LOOKUP (ospf_nsm_state_msg, nbr->state));
3238: /* Show state changes. */
3239: vty_out (vty, " %d state changes%s", nbr->state_change, VTY_NEWLINE);
3240: if (nbr->ts_last_progress.tv_sec || nbr->ts_last_progress.tv_usec)
3241: {
3242: struct timeval res
3243: = tv_sub (recent_relative_time (), nbr->ts_last_progress);
3244: vty_out (vty, " Most recent state change statistics:%s",
3245: VTY_NEWLINE);
3246: vty_out (vty, " Progressive change %s ago%s",
3247: ospf_timeval_dump (&res, timebuf, sizeof(timebuf)),
3248: VTY_NEWLINE);
3249: }
3250: if (nbr->ts_last_regress.tv_sec || nbr->ts_last_regress.tv_usec)
3251: {
3252: struct timeval res
3253: = tv_sub (recent_relative_time (), nbr->ts_last_regress);
3254: vty_out (vty, " Regressive change %s ago, due to %s%s",
3255: ospf_timeval_dump (&res, timebuf, sizeof(timebuf)),
3256: (nbr->last_regress_str ? nbr->last_regress_str : "??"),
3257: VTY_NEWLINE);
3258: }
3259: /* Show Designated Rotuer ID. */
3260: vty_out (vty, " DR is %s,", inet_ntoa (nbr->d_router));
3261: /* Show Backup Designated Rotuer ID. */
3262: vty_out (vty, " BDR is %s%s", inet_ntoa (nbr->bd_router), VTY_NEWLINE);
3263: /* Show options. */
3264: vty_out (vty, " Options %d %s%s", nbr->options,
3265: ospf_options_dump (nbr->options), VTY_NEWLINE);
3266: /* Show Router Dead interval timer. */
3267: vty_out (vty, " Dead timer due in %s%s",
3268: ospf_timer_dump (nbr->t_inactivity, timebuf, sizeof (timebuf)),
3269: VTY_NEWLINE);
3270: /* Show Database Summary list. */
3271: vty_out (vty, " Database Summary List %d%s",
3272: ospf_db_summary_count (nbr), VTY_NEWLINE);
3273: /* Show Link State Request list. */
3274: vty_out (vty, " Link State Request List %ld%s",
3275: ospf_ls_request_count (nbr), VTY_NEWLINE);
3276: /* Show Link State Retransmission list. */
3277: vty_out (vty, " Link State Retransmission List %ld%s",
3278: ospf_ls_retransmit_count (nbr), VTY_NEWLINE);
3279: /* Show inactivity timer thread. */
3280: vty_out (vty, " Thread Inactivity Timer %s%s",
3281: nbr->t_inactivity != NULL ? "on" : "off", VTY_NEWLINE);
3282: /* Show Database Description retransmission thread. */
3283: vty_out (vty, " Thread Database Description Retransmision %s%s",
3284: nbr->t_db_desc != NULL ? "on" : "off", VTY_NEWLINE);
3285: /* Show Link State Request Retransmission thread. */
3286: vty_out (vty, " Thread Link State Request Retransmission %s%s",
3287: nbr->t_ls_req != NULL ? "on" : "off", VTY_NEWLINE);
3288: /* Show Link State Update Retransmission thread. */
3289: vty_out (vty, " Thread Link State Update Retransmission %s%s%s",
3290: nbr->t_ls_upd != NULL ? "on" : "off", VTY_NEWLINE, VTY_NEWLINE);
3291: }
3292:
3293: DEFUN (show_ip_ospf_neighbor_id,
3294: show_ip_ospf_neighbor_id_cmd,
3295: "show ip ospf neighbor A.B.C.D",
3296: SHOW_STR
3297: IP_STR
3298: "OSPF information\n"
3299: "Neighbor list\n"
3300: "Neighbor ID\n")
3301: {
3302: struct ospf *ospf;
3303: struct listnode *node;
3304: struct ospf_neighbor *nbr;
3305: struct ospf_interface *oi;
3306: struct in_addr router_id;
3307: int ret;
3308:
3309: ret = inet_aton (argv[0], &router_id);
3310: if (!ret)
3311: {
3312: vty_out (vty, "Please specify Neighbor ID by A.B.C.D%s", VTY_NEWLINE);
3313: return CMD_WARNING;
3314: }
3315:
3316: ospf = ospf_lookup ();
3317: if (ospf == NULL)
3318: {
3319: vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
3320: return CMD_SUCCESS;
3321: }
3322:
3323: for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi))
3324: if ((nbr = ospf_nbr_lookup_by_routerid (oi->nbrs, &router_id)))
3325: show_ip_ospf_neighbor_detail_sub (vty, oi, nbr);
3326:
3327: return CMD_SUCCESS;
3328: }
3329:
3330: DEFUN (show_ip_ospf_neighbor_detail,
3331: show_ip_ospf_neighbor_detail_cmd,
3332: "show ip ospf neighbor detail",
3333: SHOW_STR
3334: IP_STR
3335: "OSPF information\n"
3336: "Neighbor list\n"
3337: "detail of all neighbors\n")
3338: {
3339: struct ospf *ospf;
3340: struct ospf_interface *oi;
3341: struct listnode *node;
3342:
3343: ospf = ospf_lookup ();
3344: if (ospf == NULL)
3345: {
3346: vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
3347: return CMD_SUCCESS;
3348: }
3349:
3350: for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi))
3351: {
3352: struct route_node *rn;
3353: struct ospf_neighbor *nbr;
3354:
3355: for (rn = route_top (oi->nbrs); rn; rn = route_next (rn))
3356: if ((nbr = rn->info))
3357: if (nbr != oi->nbr_self)
3358: if (nbr->state != NSM_Down)
3359: show_ip_ospf_neighbor_detail_sub (vty, oi, nbr);
3360: }
3361:
3362: return CMD_SUCCESS;
3363: }
3364:
3365: DEFUN (show_ip_ospf_neighbor_detail_all,
3366: show_ip_ospf_neighbor_detail_all_cmd,
3367: "show ip ospf neighbor detail all",
3368: SHOW_STR
3369: IP_STR
3370: "OSPF information\n"
3371: "Neighbor list\n"
3372: "detail of all neighbors\n"
3373: "include down status neighbor\n")
3374: {
3375: struct ospf *ospf;
3376: struct listnode *node;
3377: struct ospf_interface *oi;
3378:
3379: ospf = ospf_lookup ();
3380: if (ospf == NULL)
3381: {
3382: vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
3383: return CMD_SUCCESS;
3384: }
3385:
3386: for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi))
3387: {
3388: struct route_node *rn;
3389: struct ospf_neighbor *nbr;
3390: struct ospf_nbr_nbma *nbr_nbma;
3391:
3392: for (rn = route_top (oi->nbrs); rn; rn = route_next (rn))
3393: if ((nbr = rn->info))
3394: if (nbr != oi->nbr_self)
3395: if (oi->type == OSPF_IFTYPE_NBMA && nbr->state != NSM_Down)
3396: show_ip_ospf_neighbor_detail_sub (vty, oi, rn->info);
3397:
3398: if (oi->type == OSPF_IFTYPE_NBMA)
3399: {
3400: struct listnode *nd;
3401:
3402: for (ALL_LIST_ELEMENTS_RO (oi->nbr_nbma, nd, nbr_nbma))
3403: if (nbr_nbma->nbr == NULL
3404: || nbr_nbma->nbr->state == NSM_Down)
3405: show_ip_ospf_nbr_nbma_detail_sub (vty, oi, nbr_nbma);
3406: }
3407: }
3408:
3409: return CMD_SUCCESS;
3410: }
3411:
3412: DEFUN (show_ip_ospf_neighbor_int_detail,
3413: show_ip_ospf_neighbor_int_detail_cmd,
3414: "show ip ospf neighbor IFNAME detail",
3415: SHOW_STR
3416: IP_STR
3417: "OSPF information\n"
3418: "Neighbor list\n"
3419: "Interface name\n"
3420: "detail of all neighbors")
3421: {
3422: struct ospf *ospf;
3423: struct ospf_interface *oi;
3424: struct interface *ifp;
3425: struct route_node *rn, *nrn;
3426: struct ospf_neighbor *nbr;
3427:
3428: ifp = if_lookup_by_name (argv[0]);
3429: if (!ifp)
3430: {
3431: vty_out (vty, "No such interface.%s", VTY_NEWLINE);
3432: return CMD_WARNING;
3433: }
3434:
3435: ospf = ospf_lookup ();
3436: if (ospf == NULL)
3437: {
3438: vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
3439: return CMD_SUCCESS;
3440: }
3441:
3442:
3443: for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn))
3444: if ((oi = rn->info))
3445: for (nrn = route_top (oi->nbrs); nrn; nrn = route_next (nrn))
3446: if ((nbr = nrn->info))
3447: if (nbr != oi->nbr_self)
3448: if (nbr->state != NSM_Down)
3449: show_ip_ospf_neighbor_detail_sub (vty, oi, nbr);
3450:
3451: return CMD_SUCCESS;
3452: }
3453:
3454:
3455: /* Show functions */
3456: static int
3457: show_lsa_summary (struct vty *vty, struct ospf_lsa *lsa, int self)
3458: {
3459: struct router_lsa *rl;
3460: struct summary_lsa *sl;
3461: struct as_external_lsa *asel;
3462: struct prefix_ipv4 p;
3463:
3464: if (lsa != NULL)
3465: /* If self option is set, check LSA self flag. */
3466: if (self == 0 || IS_LSA_SELF (lsa))
3467: {
3468: /* LSA common part show. */
3469: vty_out (vty, "%-15s ", inet_ntoa (lsa->data->id));
3470: vty_out (vty, "%-15s %4d 0x%08lx 0x%04x",
3471: inet_ntoa (lsa->data->adv_router), LS_AGE (lsa),
3472: (u_long)ntohl (lsa->data->ls_seqnum), ntohs (lsa->data->checksum));
3473: /* LSA specific part show. */
3474: switch (lsa->data->type)
3475: {
3476: case OSPF_ROUTER_LSA:
3477: rl = (struct router_lsa *) lsa->data;
3478: vty_out (vty, " %-d", ntohs (rl->links));
3479: break;
3480: case OSPF_SUMMARY_LSA:
3481: sl = (struct summary_lsa *) lsa->data;
3482:
3483: p.family = AF_INET;
3484: p.prefix = sl->header.id;
3485: p.prefixlen = ip_masklen (sl->mask);
3486: apply_mask_ipv4 (&p);
3487:
3488: vty_out (vty, " %s/%d", inet_ntoa (p.prefix), p.prefixlen);
3489: break;
3490: case OSPF_AS_EXTERNAL_LSA:
3491: case OSPF_AS_NSSA_LSA:
3492: asel = (struct as_external_lsa *) lsa->data;
3493:
3494: p.family = AF_INET;
3495: p.prefix = asel->header.id;
3496: p.prefixlen = ip_masklen (asel->mask);
3497: apply_mask_ipv4 (&p);
3498:
3499: vty_out (vty, " %s %s/%d [0x%lx]",
3500: IS_EXTERNAL_METRIC (asel->e[0].tos) ? "E2" : "E1",
3501: inet_ntoa (p.prefix), p.prefixlen,
3502: (u_long)ntohl (asel->e[0].route_tag));
3503: break;
3504: case OSPF_NETWORK_LSA:
3505: case OSPF_ASBR_SUMMARY_LSA:
3506: #ifdef HAVE_OPAQUE_LSA
3507: case OSPF_OPAQUE_LINK_LSA:
3508: case OSPF_OPAQUE_AREA_LSA:
3509: case OSPF_OPAQUE_AS_LSA:
3510: #endif /* HAVE_OPAQUE_LSA */
3511: default:
3512: break;
3513: }
3514: vty_out (vty, VTY_NEWLINE);
3515: }
3516:
3517: return 0;
3518: }
3519:
3520: static const char *show_database_desc[] =
3521: {
3522: "unknown",
3523: "Router Link States",
3524: "Net Link States",
3525: "Summary Link States",
3526: "ASBR-Summary Link States",
3527: "AS External Link States",
3528: "Group Membership LSA",
3529: "NSSA-external Link States",
3530: #ifdef HAVE_OPAQUE_LSA
3531: "Type-8 LSA",
3532: "Link-Local Opaque-LSA",
3533: "Area-Local Opaque-LSA",
3534: "AS-external Opaque-LSA",
3535: #endif /* HAVE_OPAQUE_LSA */
3536: };
3537:
3538: static const char *show_database_header[] =
3539: {
3540: "",
3541: "Link ID ADV Router Age Seq# CkSum Link count",
3542: "Link ID ADV Router Age Seq# CkSum",
3543: "Link ID ADV Router Age Seq# CkSum Route",
3544: "Link ID ADV Router Age Seq# CkSum",
3545: "Link ID ADV Router Age Seq# CkSum Route",
3546: " --- header for Group Member ----",
3547: "Link ID ADV Router Age Seq# CkSum Route",
3548: #ifdef HAVE_OPAQUE_LSA
3549: " --- type-8 ---",
3550: "Opaque-Type/Id ADV Router Age Seq# CkSum",
3551: "Opaque-Type/Id ADV Router Age Seq# CkSum",
3552: "Opaque-Type/Id ADV Router Age Seq# CkSum",
3553: #endif /* HAVE_OPAQUE_LSA */
3554: };
3555:
3556: static void
3557: show_ip_ospf_database_header (struct vty *vty, struct ospf_lsa *lsa)
3558: {
3559: struct router_lsa *rlsa = (struct router_lsa*) lsa->data;
3560:
3561: vty_out (vty, " LS age: %d%s", LS_AGE (lsa), VTY_NEWLINE);
3562: vty_out (vty, " Options: 0x%-2x : %s%s",
3563: lsa->data->options,
3564: ospf_options_dump(lsa->data->options),
3565: VTY_NEWLINE);
3566: vty_out (vty, " LS Flags: 0x%-2x %s%s",
3567: lsa->flags,
3568: ((lsa->flags & OSPF_LSA_LOCAL_XLT) ? "(Translated from Type-7)" : ""),
3569: VTY_NEWLINE);
3570:
3571: if (lsa->data->type == OSPF_ROUTER_LSA)
3572: {
3573: vty_out (vty, " Flags: 0x%x" , rlsa->flags);
3574:
3575: if (rlsa->flags)
3576: vty_out (vty, " :%s%s%s%s",
3577: IS_ROUTER_LSA_BORDER (rlsa) ? " ABR" : "",
3578: IS_ROUTER_LSA_EXTERNAL (rlsa) ? " ASBR" : "",
3579: IS_ROUTER_LSA_VIRTUAL (rlsa) ? " VL-endpoint" : "",
3580: IS_ROUTER_LSA_SHORTCUT (rlsa) ? " Shortcut" : "");
3581:
3582: vty_out (vty, "%s", VTY_NEWLINE);
3583: }
3584: vty_out (vty, " LS Type: %s%s",
3585: LOOKUP (ospf_lsa_type_msg, lsa->data->type), VTY_NEWLINE);
3586: vty_out (vty, " Link State ID: %s %s%s", inet_ntoa (lsa->data->id),
3587: LOOKUP (ospf_link_state_id_type_msg, lsa->data->type), VTY_NEWLINE);
3588: vty_out (vty, " Advertising Router: %s%s",
3589: inet_ntoa (lsa->data->adv_router), VTY_NEWLINE);
3590: vty_out (vty, " LS Seq Number: %08lx%s", (u_long)ntohl (lsa->data->ls_seqnum),
3591: VTY_NEWLINE);
3592: vty_out (vty, " Checksum: 0x%04x%s", ntohs (lsa->data->checksum),
3593: VTY_NEWLINE);
3594: vty_out (vty, " Length: %d%s", ntohs (lsa->data->length), VTY_NEWLINE);
3595: }
3596:
3597: const char *link_type_desc[] =
3598: {
3599: "(null)",
3600: "another Router (point-to-point)",
3601: "a Transit Network",
3602: "Stub Network",
3603: "a Virtual Link",
3604: };
3605:
3606: const char *link_id_desc[] =
3607: {
3608: "(null)",
3609: "Neighboring Router ID",
3610: "Designated Router address",
3611: "Net",
3612: "Neighboring Router ID",
3613: };
3614:
3615: const char *link_data_desc[] =
3616: {
3617: "(null)",
3618: "Router Interface address",
3619: "Router Interface address",
3620: "Network Mask",
3621: "Router Interface address",
3622: };
3623:
3624: /* Show router-LSA each Link information. */
3625: static void
3626: show_ip_ospf_database_router_links (struct vty *vty,
3627: struct router_lsa *rl)
3628: {
3629: int len, i, type;
3630:
3631: len = ntohs (rl->header.length) - 4;
3632: for (i = 0; i < ntohs (rl->links) && len > 0; len -= 12, i++)
3633: {
3634: type = rl->link[i].type;
3635:
3636: vty_out (vty, " Link connected to: %s%s",
3637: link_type_desc[type], VTY_NEWLINE);
3638: vty_out (vty, " (Link ID) %s: %s%s", link_id_desc[type],
3639: inet_ntoa (rl->link[i].link_id), VTY_NEWLINE);
3640: vty_out (vty, " (Link Data) %s: %s%s", link_data_desc[type],
3641: inet_ntoa (rl->link[i].link_data), VTY_NEWLINE);
3642: vty_out (vty, " Number of TOS metrics: 0%s", VTY_NEWLINE);
3643: vty_out (vty, " TOS 0 Metric: %d%s",
3644: ntohs (rl->link[i].metric), VTY_NEWLINE);
3645: vty_out (vty, "%s", VTY_NEWLINE);
3646: }
3647: }
3648:
3649: /* Show router-LSA detail information. */
3650: static int
3651: show_router_lsa_detail (struct vty *vty, struct ospf_lsa *lsa)
3652: {
3653: if (lsa != NULL)
3654: {
3655: struct router_lsa *rl = (struct router_lsa *) lsa->data;
3656:
3657: show_ip_ospf_database_header (vty, lsa);
3658:
3659: vty_out (vty, " Number of Links: %d%s%s", ntohs (rl->links),
3660: VTY_NEWLINE, VTY_NEWLINE);
3661:
3662: show_ip_ospf_database_router_links (vty, rl);
3663: vty_out (vty, "%s", VTY_NEWLINE);
3664: }
3665:
3666: return 0;
3667: }
3668:
3669: /* Show network-LSA detail information. */
3670: static int
3671: show_network_lsa_detail (struct vty *vty, struct ospf_lsa *lsa)
3672: {
3673: int length, i;
3674:
3675: if (lsa != NULL)
3676: {
3677: struct network_lsa *nl = (struct network_lsa *) lsa->data;
3678:
3679: show_ip_ospf_database_header (vty, lsa);
3680:
3681: vty_out (vty, " Network Mask: /%d%s",
3682: ip_masklen (nl->mask), VTY_NEWLINE);
3683:
3684: length = ntohs (lsa->data->length) - OSPF_LSA_HEADER_SIZE - 4;
3685:
3686: for (i = 0; length > 0; i++, length -= 4)
3687: vty_out (vty, " Attached Router: %s%s",
3688: inet_ntoa (nl->routers[i]), VTY_NEWLINE);
3689:
3690: vty_out (vty, "%s", VTY_NEWLINE);
3691: }
3692:
3693: return 0;
3694: }
3695:
3696: /* Show summary-LSA detail information. */
3697: static int
3698: show_summary_lsa_detail (struct vty *vty, struct ospf_lsa *lsa)
3699: {
3700: if (lsa != NULL)
3701: {
3702: struct summary_lsa *sl = (struct summary_lsa *) lsa->data;
3703:
3704: show_ip_ospf_database_header (vty, lsa);
3705:
3706: vty_out (vty, " Network Mask: /%d%s", ip_masklen (sl->mask),
3707: VTY_NEWLINE);
3708: vty_out (vty, " TOS: 0 Metric: %d%s", GET_METRIC (sl->metric),
3709: VTY_NEWLINE);
3710: vty_out (vty, "%s", VTY_NEWLINE);
3711: }
3712:
3713: return 0;
3714: }
3715:
3716: /* Show summary-ASBR-LSA detail information. */
3717: static int
3718: show_summary_asbr_lsa_detail (struct vty *vty, struct ospf_lsa *lsa)
3719: {
3720: if (lsa != NULL)
3721: {
3722: struct summary_lsa *sl = (struct summary_lsa *) lsa->data;
3723:
3724: show_ip_ospf_database_header (vty, lsa);
3725:
3726: vty_out (vty, " Network Mask: /%d%s",
3727: ip_masklen (sl->mask), VTY_NEWLINE);
3728: vty_out (vty, " TOS: 0 Metric: %d%s", GET_METRIC (sl->metric),
3729: VTY_NEWLINE);
3730: vty_out (vty, "%s", VTY_NEWLINE);
3731: }
3732:
3733: return 0;
3734: }
3735:
3736: /* Show AS-external-LSA detail information. */
3737: static int
3738: show_as_external_lsa_detail (struct vty *vty, struct ospf_lsa *lsa)
3739: {
3740: if (lsa != NULL)
3741: {
3742: struct as_external_lsa *al = (struct as_external_lsa *) lsa->data;
3743:
3744: show_ip_ospf_database_header (vty, lsa);
3745:
3746: vty_out (vty, " Network Mask: /%d%s",
3747: ip_masklen (al->mask), VTY_NEWLINE);
3748: vty_out (vty, " Metric Type: %s%s",
3749: IS_EXTERNAL_METRIC (al->e[0].tos) ?
3750: "2 (Larger than any link state path)" : "1", VTY_NEWLINE);
3751: vty_out (vty, " TOS: 0%s", VTY_NEWLINE);
3752: vty_out (vty, " Metric: %d%s",
3753: GET_METRIC (al->e[0].metric), VTY_NEWLINE);
3754: vty_out (vty, " Forward Address: %s%s",
3755: inet_ntoa (al->e[0].fwd_addr), VTY_NEWLINE);
3756:
3757: vty_out (vty, " External Route Tag: %lu%s%s",
3758: (u_long)ntohl (al->e[0].route_tag), VTY_NEWLINE, VTY_NEWLINE);
3759: }
3760:
3761: return 0;
3762: }
3763:
3764: /* N.B. This function currently seems to be unused. */
3765: static int
3766: show_as_external_lsa_stdvty (struct ospf_lsa *lsa)
3767: {
3768: struct as_external_lsa *al = (struct as_external_lsa *) lsa->data;
3769:
3770: /* show_ip_ospf_database_header (vty, lsa); */
3771:
3772: zlog_debug( " Network Mask: /%d%s",
3773: ip_masklen (al->mask), "\n");
3774: zlog_debug( " Metric Type: %s%s",
3775: IS_EXTERNAL_METRIC (al->e[0].tos) ?
3776: "2 (Larger than any link state path)" : "1", "\n");
3777: zlog_debug( " TOS: 0%s", "\n");
3778: zlog_debug( " Metric: %d%s",
3779: GET_METRIC (al->e[0].metric), "\n");
3780: zlog_debug( " Forward Address: %s%s",
3781: inet_ntoa (al->e[0].fwd_addr), "\n");
3782:
3783: zlog_debug( " External Route Tag: %u%s%s",
3784: ntohl (al->e[0].route_tag), "\n", "\n");
3785:
3786: return 0;
3787: }
3788:
3789: /* Show AS-NSSA-LSA detail information. */
3790: static int
3791: show_as_nssa_lsa_detail (struct vty *vty, struct ospf_lsa *lsa)
3792: {
3793: if (lsa != NULL)
3794: {
3795: struct as_external_lsa *al = (struct as_external_lsa *) lsa->data;
3796:
3797: show_ip_ospf_database_header (vty, lsa);
3798:
3799: vty_out (vty, " Network Mask: /%d%s",
3800: ip_masklen (al->mask), VTY_NEWLINE);
3801: vty_out (vty, " Metric Type: %s%s",
3802: IS_EXTERNAL_METRIC (al->e[0].tos) ?
3803: "2 (Larger than any link state path)" : "1", VTY_NEWLINE);
3804: vty_out (vty, " TOS: 0%s", VTY_NEWLINE);
3805: vty_out (vty, " Metric: %d%s",
3806: GET_METRIC (al->e[0].metric), VTY_NEWLINE);
3807: vty_out (vty, " NSSA: Forward Address: %s%s",
3808: inet_ntoa (al->e[0].fwd_addr), VTY_NEWLINE);
3809:
3810: vty_out (vty, " External Route Tag: %u%s%s",
3811: ntohl (al->e[0].route_tag), VTY_NEWLINE, VTY_NEWLINE);
3812: }
3813:
3814: return 0;
3815: }
3816:
3817: static int
3818: show_func_dummy (struct vty *vty, struct ospf_lsa *lsa)
3819: {
3820: return 0;
3821: }
3822:
3823: #ifdef HAVE_OPAQUE_LSA
3824: static int
3825: show_opaque_lsa_detail (struct vty *vty, struct ospf_lsa *lsa)
3826: {
3827: if (lsa != NULL)
3828: {
3829: show_ip_ospf_database_header (vty, lsa);
3830: show_opaque_info_detail (vty, lsa);
3831:
3832: vty_out (vty, "%s", VTY_NEWLINE);
3833: }
3834: return 0;
3835: }
3836: #endif /* HAVE_OPAQUE_LSA */
3837:
3838: int (*show_function[])(struct vty *, struct ospf_lsa *) =
3839: {
3840: NULL,
3841: show_router_lsa_detail,
3842: show_network_lsa_detail,
3843: show_summary_lsa_detail,
3844: show_summary_asbr_lsa_detail,
3845: show_as_external_lsa_detail,
3846: show_func_dummy,
3847: show_as_nssa_lsa_detail, /* almost same as external */
3848: #ifdef HAVE_OPAQUE_LSA
3849: NULL, /* type-8 */
3850: show_opaque_lsa_detail,
3851: show_opaque_lsa_detail,
3852: show_opaque_lsa_detail,
3853: #endif /* HAVE_OPAQUE_LSA */
3854: };
3855:
3856: static void
3857: show_lsa_prefix_set (struct vty *vty, struct prefix_ls *lp, struct in_addr *id,
3858: struct in_addr *adv_router)
3859: {
3860: memset (lp, 0, sizeof (struct prefix_ls));
3861: lp->family = 0;
3862: if (id == NULL)
3863: lp->prefixlen = 0;
3864: else if (adv_router == NULL)
3865: {
3866: lp->prefixlen = 32;
3867: lp->id = *id;
3868: }
3869: else
3870: {
3871: lp->prefixlen = 64;
3872: lp->id = *id;
3873: lp->adv_router = *adv_router;
3874: }
3875: }
3876:
3877: static void
3878: show_lsa_detail_proc (struct vty *vty, struct route_table *rt,
3879: struct in_addr *id, struct in_addr *adv_router)
3880: {
3881: struct prefix_ls lp;
3882: struct route_node *rn, *start;
3883: struct ospf_lsa *lsa;
3884:
3885: show_lsa_prefix_set (vty, &lp, id, adv_router);
3886: start = route_node_get (rt, (struct prefix *) &lp);
3887: if (start)
3888: {
3889: route_lock_node (start);
3890: for (rn = start; rn; rn = route_next_until (rn, start))
3891: if ((lsa = rn->info))
3892: {
3893: if (show_function[lsa->data->type] != NULL)
3894: show_function[lsa->data->type] (vty, lsa);
3895: }
3896: route_unlock_node (start);
3897: }
3898: }
3899:
3900: /* Show detail LSA information
3901: -- if id is NULL then show all LSAs. */
3902: static void
3903: show_lsa_detail (struct vty *vty, struct ospf *ospf, int type,
3904: struct in_addr *id, struct in_addr *adv_router)
3905: {
3906: struct listnode *node;
3907: struct ospf_area *area;
3908:
3909: switch (type)
3910: {
3911: case OSPF_AS_EXTERNAL_LSA:
3912: #ifdef HAVE_OPAQUE_LSA
3913: case OSPF_OPAQUE_AS_LSA:
3914: #endif /* HAVE_OPAQUE_LSA */
3915: vty_out (vty, " %s %s%s",
3916: show_database_desc[type],
3917: VTY_NEWLINE, VTY_NEWLINE);
3918: show_lsa_detail_proc (vty, AS_LSDB (ospf, type), id, adv_router);
3919: break;
3920: default:
3921: for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area))
3922: {
3923: vty_out (vty, "%s %s (Area %s)%s%s",
3924: VTY_NEWLINE, show_database_desc[type],
3925: ospf_area_desc_string (area), VTY_NEWLINE, VTY_NEWLINE);
3926: show_lsa_detail_proc (vty, AREA_LSDB (area, type), id, adv_router);
3927: }
3928: break;
3929: }
3930: }
3931:
3932: static void
3933: show_lsa_detail_adv_router_proc (struct vty *vty, struct route_table *rt,
3934: struct in_addr *adv_router)
3935: {
3936: struct route_node *rn;
3937: struct ospf_lsa *lsa;
3938:
3939: for (rn = route_top (rt); rn; rn = route_next (rn))
3940: if ((lsa = rn->info))
3941: if (IPV4_ADDR_SAME (adv_router, &lsa->data->adv_router))
3942: {
3943: if (CHECK_FLAG (lsa->flags, OSPF_LSA_LOCAL_XLT))
3944: continue;
3945: if (show_function[lsa->data->type] != NULL)
3946: show_function[lsa->data->type] (vty, lsa);
3947: }
3948: }
3949:
3950: /* Show detail LSA information. */
3951: static void
3952: show_lsa_detail_adv_router (struct vty *vty, struct ospf *ospf, int type,
3953: struct in_addr *adv_router)
3954: {
3955: struct listnode *node;
3956: struct ospf_area *area;
3957:
3958: switch (type)
3959: {
3960: case OSPF_AS_EXTERNAL_LSA:
3961: #ifdef HAVE_OPAQUE_LSA
3962: case OSPF_OPAQUE_AS_LSA:
3963: #endif /* HAVE_OPAQUE_LSA */
3964: vty_out (vty, " %s %s%s",
3965: show_database_desc[type],
3966: VTY_NEWLINE, VTY_NEWLINE);
3967: show_lsa_detail_adv_router_proc (vty, AS_LSDB (ospf, type),
3968: adv_router);
3969: break;
3970: default:
3971: for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area))
3972: {
3973: vty_out (vty, "%s %s (Area %s)%s%s",
3974: VTY_NEWLINE, show_database_desc[type],
3975: ospf_area_desc_string (area), VTY_NEWLINE, VTY_NEWLINE);
3976: show_lsa_detail_adv_router_proc (vty, AREA_LSDB (area, type),
3977: adv_router);
3978: }
3979: break;
3980: }
3981: }
3982:
3983: static void
3984: show_ip_ospf_database_summary (struct vty *vty, struct ospf *ospf, int self)
3985: {
3986: struct ospf_lsa *lsa;
3987: struct route_node *rn;
3988: struct ospf_area *area;
3989: struct listnode *node;
3990: int type;
3991:
3992: for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area))
3993: {
3994: for (type = OSPF_MIN_LSA; type < OSPF_MAX_LSA; type++)
3995: {
3996: switch (type)
3997: {
3998: case OSPF_AS_EXTERNAL_LSA:
3999: #ifdef HAVE_OPAQUE_LSA
4000: case OSPF_OPAQUE_AS_LSA:
4001: #endif /* HAVE_OPAQUE_LSA */
4002: continue;
4003: default:
4004: break;
4005: }
4006: if (ospf_lsdb_count_self (area->lsdb, type) > 0 ||
4007: (!self && ospf_lsdb_count (area->lsdb, type) > 0))
4008: {
4009: vty_out (vty, " %s (Area %s)%s%s",
4010: show_database_desc[type],
4011: ospf_area_desc_string (area),
4012: VTY_NEWLINE, VTY_NEWLINE);
4013: vty_out (vty, "%s%s", show_database_header[type], VTY_NEWLINE);
4014:
4015: LSDB_LOOP (AREA_LSDB (area, type), rn, lsa)
4016: show_lsa_summary (vty, lsa, self);
4017:
4018: vty_out (vty, "%s", VTY_NEWLINE);
4019: }
4020: }
4021: }
4022:
4023: for (type = OSPF_MIN_LSA; type < OSPF_MAX_LSA; type++)
4024: {
4025: switch (type)
4026: {
4027: case OSPF_AS_EXTERNAL_LSA:
4028: #ifdef HAVE_OPAQUE_LSA
4029: case OSPF_OPAQUE_AS_LSA:
4030: #endif /* HAVE_OPAQUE_LSA */
4031: break;
4032: default:
4033: continue;
4034: }
4035: if (ospf_lsdb_count_self (ospf->lsdb, type) ||
4036: (!self && ospf_lsdb_count (ospf->lsdb, type)))
4037: {
4038: vty_out (vty, " %s%s%s",
4039: show_database_desc[type],
4040: VTY_NEWLINE, VTY_NEWLINE);
4041: vty_out (vty, "%s%s", show_database_header[type],
4042: VTY_NEWLINE);
4043:
4044: LSDB_LOOP (AS_LSDB (ospf, type), rn, lsa)
4045: show_lsa_summary (vty, lsa, self);
4046:
4047: vty_out (vty, "%s", VTY_NEWLINE);
4048: }
4049: }
4050:
4051: vty_out (vty, "%s", VTY_NEWLINE);
4052: }
4053:
4054: static void
4055: show_ip_ospf_database_maxage (struct vty *vty, struct ospf *ospf)
4056: {
4057: struct listnode *node;
4058: struct ospf_lsa *lsa;
4059:
4060: vty_out (vty, "%s MaxAge Link States:%s%s",
4061: VTY_NEWLINE, VTY_NEWLINE, VTY_NEWLINE);
4062:
4063: for (ALL_LIST_ELEMENTS_RO (ospf->maxage_lsa, node, lsa))
4064: {
4065: vty_out (vty, "Link type: %d%s", lsa->data->type, VTY_NEWLINE);
4066: vty_out (vty, "Link State ID: %s%s",
4067: inet_ntoa (lsa->data->id), VTY_NEWLINE);
4068: vty_out (vty, "Advertising Router: %s%s",
4069: inet_ntoa (lsa->data->adv_router), VTY_NEWLINE);
4070: vty_out (vty, "LSA lock count: %d%s", lsa->lock, VTY_NEWLINE);
4071: vty_out (vty, "%s", VTY_NEWLINE);
4072: }
4073: }
4074:
4075: #define OSPF_LSA_TYPE_NSSA_DESC "NSSA external link state\n"
4076: #define OSPF_LSA_TYPE_NSSA_CMD_STR "|nssa-external"
4077:
4078: #ifdef HAVE_OPAQUE_LSA
4079: #define OSPF_LSA_TYPE_OPAQUE_LINK_DESC "Link local Opaque-LSA\n"
4080: #define OSPF_LSA_TYPE_OPAQUE_AREA_DESC "Link area Opaque-LSA\n"
4081: #define OSPF_LSA_TYPE_OPAQUE_AS_DESC "Link AS Opaque-LSA\n"
4082: #define OSPF_LSA_TYPE_OPAQUE_CMD_STR "|opaque-link|opaque-area|opaque-as"
4083: #else /* HAVE_OPAQUE_LSA */
4084: #define OSPF_LSA_TYPE_OPAQUE_LINK_DESC ""
4085: #define OSPF_LSA_TYPE_OPAQUE_AREA_DESC ""
4086: #define OSPF_LSA_TYPE_OPAQUE_AS_DESC ""
4087: #define OSPF_LSA_TYPE_OPAQUE_CMD_STR ""
4088: #endif /* HAVE_OPAQUE_LSA */
4089:
4090: #define OSPF_LSA_TYPES_CMD_STR \
4091: "asbr-summary|external|network|router|summary" \
4092: OSPF_LSA_TYPE_NSSA_CMD_STR \
4093: OSPF_LSA_TYPE_OPAQUE_CMD_STR
4094:
4095: #define OSPF_LSA_TYPES_DESC \
4096: "ASBR summary link states\n" \
4097: "External link states\n" \
4098: "Network link states\n" \
4099: "Router link states\n" \
4100: "Network summary link states\n" \
4101: OSPF_LSA_TYPE_NSSA_DESC \
4102: OSPF_LSA_TYPE_OPAQUE_LINK_DESC \
4103: OSPF_LSA_TYPE_OPAQUE_AREA_DESC \
4104: OSPF_LSA_TYPE_OPAQUE_AS_DESC
4105:
4106: DEFUN (show_ip_ospf_database,
4107: show_ip_ospf_database_cmd,
4108: "show ip ospf database",
4109: SHOW_STR
4110: IP_STR
4111: "OSPF information\n"
4112: "Database summary\n")
4113: {
4114: struct ospf *ospf;
4115: int type, ret;
4116: struct in_addr id, adv_router;
4117:
4118: ospf = ospf_lookup ();
4119: if (ospf == NULL)
4120: {
4121: vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
4122: return CMD_SUCCESS;
4123: }
4124:
4125: vty_out (vty, "%s OSPF Router with ID (%s)%s%s", VTY_NEWLINE,
4126: inet_ntoa (ospf->router_id), VTY_NEWLINE, VTY_NEWLINE);
4127:
4128: /* Show all LSA. */
4129: if (argc == 0)
4130: {
4131: show_ip_ospf_database_summary (vty, ospf, 0);
4132: return CMD_SUCCESS;
4133: }
4134:
4135: /* Set database type to show. */
4136: if (strncmp (argv[0], "r", 1) == 0)
4137: type = OSPF_ROUTER_LSA;
4138: else if (strncmp (argv[0], "ne", 2) == 0)
4139: type = OSPF_NETWORK_LSA;
4140: else if (strncmp (argv[0], "ns", 2) == 0)
4141: type = OSPF_AS_NSSA_LSA;
4142: else if (strncmp (argv[0], "su", 2) == 0)
4143: type = OSPF_SUMMARY_LSA;
4144: else if (strncmp (argv[0], "a", 1) == 0)
4145: type = OSPF_ASBR_SUMMARY_LSA;
4146: else if (strncmp (argv[0], "e", 1) == 0)
4147: type = OSPF_AS_EXTERNAL_LSA;
4148: else if (strncmp (argv[0], "se", 2) == 0)
4149: {
4150: show_ip_ospf_database_summary (vty, ospf, 1);
4151: return CMD_SUCCESS;
4152: }
4153: else if (strncmp (argv[0], "m", 1) == 0)
4154: {
4155: show_ip_ospf_database_maxage (vty, ospf);
4156: return CMD_SUCCESS;
4157: }
4158: #ifdef HAVE_OPAQUE_LSA
4159: else if (strncmp (argv[0], "opaque-l", 8) == 0)
4160: type = OSPF_OPAQUE_LINK_LSA;
4161: else if (strncmp (argv[0], "opaque-ar", 9) == 0)
4162: type = OSPF_OPAQUE_AREA_LSA;
4163: else if (strncmp (argv[0], "opaque-as", 9) == 0)
4164: type = OSPF_OPAQUE_AS_LSA;
4165: #endif /* HAVE_OPAQUE_LSA */
4166: else
4167: return CMD_WARNING;
4168:
4169: /* `show ip ospf database LSA'. */
4170: if (argc == 1)
4171: show_lsa_detail (vty, ospf, type, NULL, NULL);
4172: else if (argc >= 2)
4173: {
4174: ret = inet_aton (argv[1], &id);
4175: if (!ret)
4176: return CMD_WARNING;
4177:
4178: /* `show ip ospf database LSA ID'. */
4179: if (argc == 2)
4180: show_lsa_detail (vty, ospf, type, &id, NULL);
4181: /* `show ip ospf database LSA ID adv-router ADV_ROUTER'. */
4182: else if (argc == 3)
4183: {
4184: if (strncmp (argv[2], "s", 1) == 0)
4185: adv_router = ospf->router_id;
4186: else
4187: {
4188: ret = inet_aton (argv[2], &adv_router);
4189: if (!ret)
4190: return CMD_WARNING;
4191: }
4192: show_lsa_detail (vty, ospf, type, &id, &adv_router);
4193: }
4194: }
4195:
4196: return CMD_SUCCESS;
4197: }
4198:
4199: ALIAS (show_ip_ospf_database,
4200: show_ip_ospf_database_type_cmd,
4201: "show ip ospf database (" OSPF_LSA_TYPES_CMD_STR "|max-age|self-originate)",
4202: SHOW_STR
4203: IP_STR
4204: "OSPF information\n"
4205: "Database summary\n"
4206: OSPF_LSA_TYPES_DESC
4207: "LSAs in MaxAge list\n"
4208: "Self-originated link states\n")
4209:
4210: ALIAS (show_ip_ospf_database,
4211: show_ip_ospf_database_type_id_cmd,
4212: "show ip ospf database (" OSPF_LSA_TYPES_CMD_STR ") A.B.C.D",
4213: SHOW_STR
4214: IP_STR
4215: "OSPF information\n"
4216: "Database summary\n"
4217: OSPF_LSA_TYPES_DESC
4218: "Link State ID (as an IP address)\n")
4219:
4220: ALIAS (show_ip_ospf_database,
4221: show_ip_ospf_database_type_id_adv_router_cmd,
4222: "show ip ospf database (" OSPF_LSA_TYPES_CMD_STR ") A.B.C.D adv-router A.B.C.D",
4223: SHOW_STR
4224: IP_STR
4225: "OSPF information\n"
4226: "Database summary\n"
4227: OSPF_LSA_TYPES_DESC
4228: "Link State ID (as an IP address)\n"
4229: "Advertising Router link states\n"
4230: "Advertising Router (as an IP address)\n")
4231:
4232: ALIAS (show_ip_ospf_database,
4233: show_ip_ospf_database_type_id_self_cmd,
4234: "show ip ospf database (" OSPF_LSA_TYPES_CMD_STR ") A.B.C.D (self-originate|)",
4235: SHOW_STR
4236: IP_STR
4237: "OSPF information\n"
4238: "Database summary\n"
4239: OSPF_LSA_TYPES_DESC
4240: "Link State ID (as an IP address)\n"
4241: "Self-originated link states\n"
4242: "\n")
4243:
4244: DEFUN (show_ip_ospf_database_type_adv_router,
4245: show_ip_ospf_database_type_adv_router_cmd,
4246: "show ip ospf database (" OSPF_LSA_TYPES_CMD_STR ") adv-router A.B.C.D",
4247: SHOW_STR
4248: IP_STR
4249: "OSPF information\n"
4250: "Database summary\n"
4251: OSPF_LSA_TYPES_DESC
4252: "Advertising Router link states\n"
4253: "Advertising Router (as an IP address)\n")
4254: {
4255: struct ospf *ospf;
4256: int type, ret;
4257: struct in_addr adv_router;
4258:
4259: ospf = ospf_lookup ();
4260: if (ospf == NULL)
4261: {
4262: vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
4263: return CMD_SUCCESS;
4264: }
4265:
4266: vty_out (vty, "%s OSPF Router with ID (%s)%s%s", VTY_NEWLINE,
4267: inet_ntoa (ospf->router_id), VTY_NEWLINE, VTY_NEWLINE);
4268:
4269: if (argc != 2)
4270: return CMD_WARNING;
4271:
4272: /* Set database type to show. */
4273: if (strncmp (argv[0], "r", 1) == 0)
4274: type = OSPF_ROUTER_LSA;
4275: else if (strncmp (argv[0], "ne", 2) == 0)
4276: type = OSPF_NETWORK_LSA;
4277: else if (strncmp (argv[0], "ns", 2) == 0)
4278: type = OSPF_AS_NSSA_LSA;
4279: else if (strncmp (argv[0], "s", 1) == 0)
4280: type = OSPF_SUMMARY_LSA;
4281: else if (strncmp (argv[0], "a", 1) == 0)
4282: type = OSPF_ASBR_SUMMARY_LSA;
4283: else if (strncmp (argv[0], "e", 1) == 0)
4284: type = OSPF_AS_EXTERNAL_LSA;
4285: #ifdef HAVE_OPAQUE_LSA
4286: else if (strncmp (argv[0], "opaque-l", 8) == 0)
4287: type = OSPF_OPAQUE_LINK_LSA;
4288: else if (strncmp (argv[0], "opaque-ar", 9) == 0)
4289: type = OSPF_OPAQUE_AREA_LSA;
4290: else if (strncmp (argv[0], "opaque-as", 9) == 0)
4291: type = OSPF_OPAQUE_AS_LSA;
4292: #endif /* HAVE_OPAQUE_LSA */
4293: else
4294: return CMD_WARNING;
4295:
4296: /* `show ip ospf database LSA adv-router ADV_ROUTER'. */
4297: if (strncmp (argv[1], "s", 1) == 0)
4298: adv_router = ospf->router_id;
4299: else
4300: {
4301: ret = inet_aton (argv[1], &adv_router);
4302: if (!ret)
4303: return CMD_WARNING;
4304: }
4305:
4306: show_lsa_detail_adv_router (vty, ospf, type, &adv_router);
4307:
4308: return CMD_SUCCESS;
4309: }
4310:
4311: ALIAS (show_ip_ospf_database_type_adv_router,
4312: show_ip_ospf_database_type_self_cmd,
4313: "show ip ospf database (" OSPF_LSA_TYPES_CMD_STR ") (self-originate|)",
4314: SHOW_STR
4315: IP_STR
4316: "OSPF information\n"
4317: "Database summary\n"
4318: OSPF_LSA_TYPES_DESC
4319: "Self-originated link states\n")
4320:
4321:
4322: DEFUN (ip_ospf_authentication_args,
4323: ip_ospf_authentication_args_addr_cmd,
4324: "ip ospf authentication (null|message-digest) A.B.C.D",
4325: "IP Information\n"
4326: "OSPF interface commands\n"
4327: "Enable authentication on this interface\n"
4328: "Use null authentication\n"
4329: "Use message-digest authentication\n"
4330: "Address of interface")
4331: {
4332: struct interface *ifp;
4333: struct in_addr addr;
4334: int ret;
4335: struct ospf_if_params *params;
4336:
4337: ifp = vty->index;
4338: params = IF_DEF_PARAMS (ifp);
4339:
4340: if (argc == 2)
4341: {
4342: ret = inet_aton(argv[1], &addr);
4343: if (!ret)
4344: {
4345: vty_out (vty, "Please specify interface address by A.B.C.D%s",
4346: VTY_NEWLINE);
4347: return CMD_WARNING;
4348: }
4349:
4350: params = ospf_get_if_params (ifp, addr);
4351: ospf_if_update_params (ifp, addr);
4352: }
4353:
4354: /* Handle null authentication */
4355: if ( argv[0][0] == 'n' )
4356: {
4357: SET_IF_PARAM (params, auth_type);
4358: params->auth_type = OSPF_AUTH_NULL;
4359: return CMD_SUCCESS;
4360: }
4361:
4362: /* Handle message-digest authentication */
4363: if ( argv[0][0] == 'm' )
4364: {
4365: SET_IF_PARAM (params, auth_type);
4366: params->auth_type = OSPF_AUTH_CRYPTOGRAPHIC;
4367: return CMD_SUCCESS;
4368: }
4369:
4370: vty_out (vty, "You shouldn't get here!%s", VTY_NEWLINE);
4371: return CMD_WARNING;
4372: }
4373:
4374: ALIAS (ip_ospf_authentication_args,
4375: ip_ospf_authentication_args_cmd,
4376: "ip ospf authentication (null|message-digest)",
4377: "IP Information\n"
4378: "OSPF interface commands\n"
4379: "Enable authentication on this interface\n"
4380: "Use null authentication\n"
4381: "Use message-digest authentication\n")
4382:
4383: DEFUN (ip_ospf_authentication,
4384: ip_ospf_authentication_addr_cmd,
4385: "ip ospf authentication A.B.C.D",
4386: "IP Information\n"
4387: "OSPF interface commands\n"
4388: "Enable authentication on this interface\n"
4389: "Address of interface")
4390: {
4391: struct interface *ifp;
4392: struct in_addr addr;
4393: int ret;
4394: struct ospf_if_params *params;
4395:
4396: ifp = vty->index;
4397: params = IF_DEF_PARAMS (ifp);
4398:
4399: if (argc == 1)
4400: {
4401: ret = inet_aton(argv[0], &addr);
4402: if (!ret)
4403: {
4404: vty_out (vty, "Please specify interface address by A.B.C.D%s",
4405: VTY_NEWLINE);
4406: return CMD_WARNING;
4407: }
4408:
4409: params = ospf_get_if_params (ifp, addr);
4410: ospf_if_update_params (ifp, addr);
4411: }
4412:
4413: SET_IF_PARAM (params, auth_type);
4414: params->auth_type = OSPF_AUTH_SIMPLE;
4415:
4416: return CMD_SUCCESS;
4417: }
4418:
4419: ALIAS (ip_ospf_authentication,
4420: ip_ospf_authentication_cmd,
4421: "ip ospf authentication",
4422: "IP Information\n"
4423: "OSPF interface commands\n"
4424: "Enable authentication on this interface\n")
4425:
4426: DEFUN (no_ip_ospf_authentication,
4427: no_ip_ospf_authentication_addr_cmd,
4428: "no ip ospf authentication A.B.C.D",
4429: NO_STR
4430: "IP Information\n"
4431: "OSPF interface commands\n"
4432: "Enable authentication on this interface\n"
4433: "Address of interface")
4434: {
4435: struct interface *ifp;
4436: struct in_addr addr;
4437: int ret;
4438: struct ospf_if_params *params;
4439:
4440: ifp = vty->index;
4441: params = IF_DEF_PARAMS (ifp);
4442:
4443: if (argc == 1)
4444: {
4445: ret = inet_aton(argv[0], &addr);
4446: if (!ret)
4447: {
4448: vty_out (vty, "Please specify interface address by A.B.C.D%s",
4449: VTY_NEWLINE);
4450: return CMD_WARNING;
4451: }
4452:
4453: params = ospf_lookup_if_params (ifp, addr);
4454: if (params == NULL)
4455: return CMD_SUCCESS;
4456: }
4457:
4458: params->auth_type = OSPF_AUTH_NOTSET;
4459: UNSET_IF_PARAM (params, auth_type);
4460:
4461: if (params != IF_DEF_PARAMS (ifp))
4462: {
4463: ospf_free_if_params (ifp, addr);
4464: ospf_if_update_params (ifp, addr);
4465: }
4466:
4467: return CMD_SUCCESS;
4468: }
4469:
4470: ALIAS (no_ip_ospf_authentication,
4471: no_ip_ospf_authentication_cmd,
4472: "no ip ospf authentication",
4473: NO_STR
4474: "IP Information\n"
4475: "OSPF interface commands\n"
4476: "Enable authentication on this interface\n")
4477:
4478: DEFUN (ip_ospf_authentication_key,
4479: ip_ospf_authentication_key_addr_cmd,
4480: "ip ospf authentication-key AUTH_KEY A.B.C.D",
4481: "IP Information\n"
4482: "OSPF interface commands\n"
4483: "Authentication password (key)\n"
4484: "The OSPF password (key)\n"
4485: "Address of interface")
4486: {
4487: struct interface *ifp;
4488: struct in_addr addr;
4489: int ret;
4490: struct ospf_if_params *params;
4491:
4492: ifp = vty->index;
4493: params = IF_DEF_PARAMS (ifp);
4494:
4495: if (argc == 2)
4496: {
4497: ret = inet_aton(argv[1], &addr);
4498: if (!ret)
4499: {
4500: vty_out (vty, "Please specify interface address by A.B.C.D%s",
4501: VTY_NEWLINE);
4502: return CMD_WARNING;
4503: }
4504:
4505: params = ospf_get_if_params (ifp, addr);
4506: ospf_if_update_params (ifp, addr);
4507: }
4508:
4509:
4510: memset (params->auth_simple, 0, OSPF_AUTH_SIMPLE_SIZE + 1);
4511: strncpy ((char *) params->auth_simple, argv[0], OSPF_AUTH_SIMPLE_SIZE);
4512: SET_IF_PARAM (params, auth_simple);
4513:
4514: return CMD_SUCCESS;
4515: }
4516:
4517: ALIAS (ip_ospf_authentication_key,
4518: ip_ospf_authentication_key_cmd,
4519: "ip ospf authentication-key AUTH_KEY",
4520: "IP Information\n"
4521: "OSPF interface commands\n"
4522: "Authentication password (key)\n"
4523: "The OSPF password (key)")
4524:
4525: ALIAS (ip_ospf_authentication_key,
4526: ospf_authentication_key_cmd,
4527: "ospf authentication-key AUTH_KEY",
4528: "OSPF interface commands\n"
4529: "Authentication password (key)\n"
4530: "The OSPF password (key)")
4531:
4532: DEFUN (no_ip_ospf_authentication_key,
4533: no_ip_ospf_authentication_key_addr_cmd,
4534: "no ip ospf authentication-key A.B.C.D",
4535: NO_STR
4536: "IP Information\n"
4537: "OSPF interface commands\n"
4538: "Authentication password (key)\n"
4539: "Address of interface")
4540: {
4541: struct interface *ifp;
4542: struct in_addr addr;
4543: int ret;
4544: struct ospf_if_params *params;
4545:
4546: ifp = vty->index;
4547: params = IF_DEF_PARAMS (ifp);
4548:
4549: if (argc == 1)
4550: {
4551: ret = inet_aton(argv[0], &addr);
4552: if (!ret)
4553: {
4554: vty_out (vty, "Please specify interface address by A.B.C.D%s",
4555: VTY_NEWLINE);
4556: return CMD_WARNING;
4557: }
4558:
4559: params = ospf_lookup_if_params (ifp, addr);
4560: if (params == NULL)
4561: return CMD_SUCCESS;
4562: }
4563:
4564: memset (params->auth_simple, 0, OSPF_AUTH_SIMPLE_SIZE);
4565: UNSET_IF_PARAM (params, auth_simple);
4566:
4567: if (params != IF_DEF_PARAMS (ifp))
4568: {
4569: ospf_free_if_params (ifp, addr);
4570: ospf_if_update_params (ifp, addr);
4571: }
4572:
4573: return CMD_SUCCESS;
4574: }
4575:
4576: ALIAS (no_ip_ospf_authentication_key,
4577: no_ip_ospf_authentication_key_cmd,
4578: "no ip ospf authentication-key",
4579: NO_STR
4580: "IP Information\n"
4581: "OSPF interface commands\n"
4582: "Authentication password (key)\n")
4583:
4584: ALIAS (no_ip_ospf_authentication_key,
4585: no_ospf_authentication_key_cmd,
4586: "no ospf authentication-key",
4587: NO_STR
4588: "OSPF interface commands\n"
4589: "Authentication password (key)\n")
4590:
4591: DEFUN (ip_ospf_message_digest_key,
4592: ip_ospf_message_digest_key_addr_cmd,
4593: "ip ospf message-digest-key <1-255> md5 KEY A.B.C.D",
4594: "IP Information\n"
4595: "OSPF interface commands\n"
4596: "Message digest authentication password (key)\n"
4597: "Key ID\n"
4598: "Use MD5 algorithm\n"
4599: "The OSPF password (key)"
4600: "Address of interface")
4601: {
4602: struct interface *ifp;
4603: struct crypt_key *ck;
4604: u_char key_id;
4605: struct in_addr addr;
4606: int ret;
4607: struct ospf_if_params *params;
4608:
4609: ifp = vty->index;
4610: params = IF_DEF_PARAMS (ifp);
4611:
4612: if (argc == 3)
4613: {
4614: ret = inet_aton(argv[2], &addr);
4615: if (!ret)
4616: {
4617: vty_out (vty, "Please specify interface address by A.B.C.D%s",
4618: VTY_NEWLINE);
4619: return CMD_WARNING;
4620: }
4621:
4622: params = ospf_get_if_params (ifp, addr);
4623: ospf_if_update_params (ifp, addr);
4624: }
4625:
4626: key_id = strtol (argv[0], NULL, 10);
4627: if (ospf_crypt_key_lookup (params->auth_crypt, key_id) != NULL)
4628: {
4629: vty_out (vty, "OSPF: Key %d already exists%s", key_id, VTY_NEWLINE);
4630: return CMD_WARNING;
4631: }
4632:
4633: ck = ospf_crypt_key_new ();
4634: ck->key_id = (u_char) key_id;
4635: memset (ck->auth_key, 0, OSPF_AUTH_MD5_SIZE+1);
4636: strncpy ((char *) ck->auth_key, argv[1], OSPF_AUTH_MD5_SIZE);
4637:
4638: ospf_crypt_key_add (params->auth_crypt, ck);
4639: SET_IF_PARAM (params, auth_crypt);
4640:
4641: return CMD_SUCCESS;
4642: }
4643:
4644: ALIAS (ip_ospf_message_digest_key,
4645: ip_ospf_message_digest_key_cmd,
4646: "ip ospf message-digest-key <1-255> md5 KEY",
4647: "IP Information\n"
4648: "OSPF interface commands\n"
4649: "Message digest authentication password (key)\n"
4650: "Key ID\n"
4651: "Use MD5 algorithm\n"
4652: "The OSPF password (key)")
4653:
4654: ALIAS (ip_ospf_message_digest_key,
4655: ospf_message_digest_key_cmd,
4656: "ospf message-digest-key <1-255> md5 KEY",
4657: "OSPF interface commands\n"
4658: "Message digest authentication password (key)\n"
4659: "Key ID\n"
4660: "Use MD5 algorithm\n"
4661: "The OSPF password (key)")
4662:
4663: DEFUN (no_ip_ospf_message_digest_key,
4664: no_ip_ospf_message_digest_key_addr_cmd,
4665: "no ip ospf message-digest-key <1-255> A.B.C.D",
4666: NO_STR
4667: "IP Information\n"
4668: "OSPF interface commands\n"
4669: "Message digest authentication password (key)\n"
4670: "Key ID\n"
4671: "Address of interface")
4672: {
4673: struct interface *ifp;
4674: struct crypt_key *ck;
4675: int key_id;
4676: struct in_addr addr;
4677: int ret;
4678: struct ospf_if_params *params;
4679:
4680: ifp = vty->index;
4681: params = IF_DEF_PARAMS (ifp);
4682:
4683: if (argc == 2)
4684: {
4685: ret = inet_aton(argv[1], &addr);
4686: if (!ret)
4687: {
4688: vty_out (vty, "Please specify interface address by A.B.C.D%s",
4689: VTY_NEWLINE);
4690: return CMD_WARNING;
4691: }
4692:
4693: params = ospf_lookup_if_params (ifp, addr);
4694: if (params == NULL)
4695: return CMD_SUCCESS;
4696: }
4697:
4698: key_id = strtol (argv[0], NULL, 10);
4699: ck = ospf_crypt_key_lookup (params->auth_crypt, key_id);
4700: if (ck == NULL)
4701: {
4702: vty_out (vty, "OSPF: Key %d does not exist%s", key_id, VTY_NEWLINE);
4703: return CMD_WARNING;
4704: }
4705:
4706: ospf_crypt_key_delete (params->auth_crypt, key_id);
4707:
4708: if (params != IF_DEF_PARAMS (ifp))
4709: {
4710: ospf_free_if_params (ifp, addr);
4711: ospf_if_update_params (ifp, addr);
4712: }
4713:
4714: return CMD_SUCCESS;
4715: }
4716:
4717: ALIAS (no_ip_ospf_message_digest_key,
4718: no_ip_ospf_message_digest_key_cmd,
4719: "no ip ospf message-digest-key <1-255>",
4720: NO_STR
4721: "IP Information\n"
4722: "OSPF interface commands\n"
4723: "Message digest authentication password (key)\n"
4724: "Key ID\n")
4725:
4726: ALIAS (no_ip_ospf_message_digest_key,
4727: no_ospf_message_digest_key_cmd,
4728: "no ospf message-digest-key <1-255>",
4729: NO_STR
4730: "OSPF interface commands\n"
4731: "Message digest authentication password (key)\n"
4732: "Key ID\n")
4733:
4734: DEFUN (ip_ospf_cost,
4735: ip_ospf_cost_u32_inet4_cmd,
4736: "ip ospf cost <1-65535> A.B.C.D",
4737: "IP Information\n"
4738: "OSPF interface commands\n"
4739: "Interface cost\n"
4740: "Cost\n"
4741: "Address of interface")
4742: {
4743: struct interface *ifp = vty->index;
4744: u_int32_t cost;
4745: struct in_addr addr;
4746: int ret;
4747: struct ospf_if_params *params;
4748:
4749: params = IF_DEF_PARAMS (ifp);
4750:
4751: cost = strtol (argv[0], NULL, 10);
4752:
4753: /* cost range is <1-65535>. */
4754: if (cost < 1 || cost > 65535)
4755: {
4756: vty_out (vty, "Interface output cost is invalid%s", VTY_NEWLINE);
4757: return CMD_WARNING;
4758: }
4759:
4760: if (argc == 2)
4761: {
4762: ret = inet_aton(argv[1], &addr);
4763: if (!ret)
4764: {
4765: vty_out (vty, "Please specify interface address by A.B.C.D%s",
4766: VTY_NEWLINE);
4767: return CMD_WARNING;
4768: }
4769:
4770: params = ospf_get_if_params (ifp, addr);
4771: ospf_if_update_params (ifp, addr);
4772: }
4773:
4774: SET_IF_PARAM (params, output_cost_cmd);
4775: params->output_cost_cmd = cost;
4776:
4777: ospf_if_recalculate_output_cost (ifp);
4778:
4779: return CMD_SUCCESS;
4780: }
4781:
4782: ALIAS (ip_ospf_cost,
4783: ip_ospf_cost_u32_cmd,
4784: "ip ospf cost <1-65535>",
4785: "IP Information\n"
4786: "OSPF interface commands\n"
4787: "Interface cost\n"
4788: "Cost")
4789:
4790: ALIAS (ip_ospf_cost,
4791: ospf_cost_u32_cmd,
4792: "ospf cost <1-65535>",
4793: "OSPF interface commands\n"
4794: "Interface cost\n"
4795: "Cost")
4796:
4797: ALIAS (ip_ospf_cost,
4798: ospf_cost_u32_inet4_cmd,
4799: "ospf cost <1-65535> A.B.C.D",
4800: "OSPF interface commands\n"
4801: "Interface cost\n"
4802: "Cost\n"
4803: "Address of interface")
4804:
4805: DEFUN (no_ip_ospf_cost,
4806: no_ip_ospf_cost_inet4_cmd,
4807: "no ip ospf cost A.B.C.D",
4808: NO_STR
4809: "IP Information\n"
4810: "OSPF interface commands\n"
4811: "Interface cost\n"
4812: "Address of interface")
4813: {
4814: struct interface *ifp = vty->index;
4815: struct in_addr addr;
4816: int ret;
4817: struct ospf_if_params *params;
4818:
4819: ifp = vty->index;
4820: params = IF_DEF_PARAMS (ifp);
4821:
4822: if (argc == 1)
4823: {
4824: ret = inet_aton(argv[0], &addr);
4825: if (!ret)
4826: {
4827: vty_out (vty, "Please specify interface address by A.B.C.D%s",
4828: VTY_NEWLINE);
4829: return CMD_WARNING;
4830: }
4831:
4832: params = ospf_lookup_if_params (ifp, addr);
4833: if (params == NULL)
4834: return CMD_SUCCESS;
4835: }
4836:
4837: UNSET_IF_PARAM (params, output_cost_cmd);
4838:
4839: if (params != IF_DEF_PARAMS (ifp))
4840: {
4841: ospf_free_if_params (ifp, addr);
4842: ospf_if_update_params (ifp, addr);
4843: }
4844:
4845: ospf_if_recalculate_output_cost (ifp);
4846:
4847: return CMD_SUCCESS;
4848: }
4849:
4850: ALIAS (no_ip_ospf_cost,
4851: no_ip_ospf_cost_cmd,
4852: "no ip ospf cost",
4853: NO_STR
4854: "IP Information\n"
4855: "OSPF interface commands\n"
4856: "Interface cost\n")
4857:
4858: ALIAS (no_ip_ospf_cost,
4859: no_ospf_cost_cmd,
4860: "no ospf cost",
4861: NO_STR
4862: "OSPF interface commands\n"
4863: "Interface cost\n")
4864:
4865: ALIAS (no_ip_ospf_cost,
4866: no_ospf_cost_inet4_cmd,
4867: "no ospf cost A.B.C.D",
4868: NO_STR
4869: "OSPF interface commands\n"
4870: "Interface cost\n"
4871: "Address of interface")
4872:
4873: DEFUN (no_ip_ospf_cost2,
4874: no_ip_ospf_cost_u32_cmd,
4875: "no ip ospf cost <1-65535>",
4876: NO_STR
4877: "IP Information\n"
4878: "OSPF interface commands\n"
4879: "Interface cost\n"
4880: "Cost")
4881: {
4882: struct interface *ifp = vty->index;
4883: struct in_addr addr;
4884: u_int32_t cost;
4885: int ret;
4886: struct ospf_if_params *params;
4887:
4888: ifp = vty->index;
4889: params = IF_DEF_PARAMS (ifp);
4890:
4891: /* According to the semantics we are mimicking "no ip ospf cost N" is
4892: * always treated as "no ip ospf cost" regardless of the actual value
4893: * of N already configured for the interface. Thus the first argument
4894: * is always checked to be a number, but is ignored after that.
4895: */
4896: cost = strtol (argv[0], NULL, 10);
4897: if (cost < 1 || cost > 65535)
4898: {
4899: vty_out (vty, "Interface output cost is invalid%s", VTY_NEWLINE);
4900: return CMD_WARNING;
4901: }
4902:
4903: if (argc == 2)
4904: {
4905: ret = inet_aton(argv[1], &addr);
4906: if (!ret)
4907: {
4908: vty_out (vty, "Please specify interface address by A.B.C.D%s",
4909: VTY_NEWLINE);
4910: return CMD_WARNING;
4911: }
4912:
4913: params = ospf_lookup_if_params (ifp, addr);
4914: if (params == NULL)
4915: return CMD_SUCCESS;
4916: }
4917:
4918: UNSET_IF_PARAM (params, output_cost_cmd);
4919:
4920: if (params != IF_DEF_PARAMS (ifp))
4921: {
4922: ospf_free_if_params (ifp, addr);
4923: ospf_if_update_params (ifp, addr);
4924: }
4925:
4926: ospf_if_recalculate_output_cost (ifp);
4927:
4928: return CMD_SUCCESS;
4929: }
4930:
4931: ALIAS (no_ip_ospf_cost2,
4932: no_ospf_cost_u32_cmd,
4933: "no ospf cost <1-65535>",
4934: NO_STR
4935: "OSPF interface commands\n"
4936: "Interface cost\n"
4937: "Cost")
4938:
4939: ALIAS (no_ip_ospf_cost2,
4940: no_ip_ospf_cost_u32_inet4_cmd,
4941: "no ip ospf cost <1-65535> A.B.C.D",
4942: NO_STR
4943: "IP Information\n"
4944: "OSPF interface commands\n"
4945: "Interface cost\n"
4946: "Cost\n"
4947: "Address of interface")
4948:
4949: ALIAS (no_ip_ospf_cost2,
4950: no_ospf_cost_u32_inet4_cmd,
4951: "no ospf cost <1-65535> A.B.C.D",
4952: NO_STR
4953: "OSPF interface commands\n"
4954: "Interface cost\n"
4955: "Cost\n"
4956: "Address of interface")
4957:
4958: static void
4959: ospf_nbr_timer_update (struct ospf_interface *oi)
4960: {
4961: struct route_node *rn;
4962: struct ospf_neighbor *nbr;
4963:
4964: for (rn = route_top (oi->nbrs); rn; rn = route_next (rn))
4965: if ((nbr = rn->info))
4966: {
4967: nbr->v_inactivity = OSPF_IF_PARAM (oi, v_wait);
4968: nbr->v_db_desc = OSPF_IF_PARAM (oi, retransmit_interval);
4969: nbr->v_ls_req = OSPF_IF_PARAM (oi, retransmit_interval);
4970: nbr->v_ls_upd = OSPF_IF_PARAM (oi, retransmit_interval);
4971: }
4972: }
4973:
4974: static int
4975: ospf_vty_dead_interval_set (struct vty *vty, const char *interval_str,
4976: const char *nbr_str,
4977: const char *fast_hello_str)
4978: {
4979: struct interface *ifp = vty->index;
4980: u_int32_t seconds;
4981: u_char hellomult;
4982: struct in_addr addr;
4983: int ret;
4984: struct ospf_if_params *params;
4985: struct ospf_interface *oi;
4986: struct route_node *rn;
4987:
4988: params = IF_DEF_PARAMS (ifp);
4989:
4990: if (nbr_str)
4991: {
4992: ret = inet_aton(nbr_str, &addr);
4993: if (!ret)
4994: {
4995: vty_out (vty, "Please specify interface address by A.B.C.D%s",
4996: VTY_NEWLINE);
4997: return CMD_WARNING;
4998: }
4999:
5000: params = ospf_get_if_params (ifp, addr);
5001: ospf_if_update_params (ifp, addr);
5002: }
5003:
5004: if (interval_str)
5005: {
5006: VTY_GET_INTEGER_RANGE ("Router Dead Interval", seconds, interval_str,
5007: 1, 65535);
5008:
5009: /* reset fast_hello too, just to be sure */
5010: UNSET_IF_PARAM (params, fast_hello);
5011: params->fast_hello = OSPF_FAST_HELLO_DEFAULT;
5012: }
5013: else if (fast_hello_str)
5014: {
5015: VTY_GET_INTEGER_RANGE ("Hello Multiplier", hellomult, fast_hello_str,
5016: 1, 10);
5017: /* 1s dead-interval with sub-second hellos desired */
5018: seconds = OSPF_ROUTER_DEAD_INTERVAL_MINIMAL;
5019: SET_IF_PARAM (params, fast_hello);
5020: params->fast_hello = hellomult;
5021: }
5022: else
5023: {
5024: vty_out (vty, "Please specify dead-interval or hello-multiplier%s",
5025: VTY_NEWLINE);
5026: return CMD_WARNING;
5027: }
5028:
5029: SET_IF_PARAM (params, v_wait);
5030: params->v_wait = seconds;
5031:
5032: /* Update timer values in neighbor structure. */
5033: if (nbr_str)
5034: {
5035: struct ospf *ospf;
5036: if ((ospf = ospf_lookup()))
5037: {
5038: oi = ospf_if_lookup_by_local_addr (ospf, ifp, addr);
5039: if (oi)
5040: ospf_nbr_timer_update (oi);
5041: }
5042: }
5043: else
5044: {
5045: for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn))
5046: if ((oi = rn->info))
5047: ospf_nbr_timer_update (oi);
5048: }
5049:
5050: return CMD_SUCCESS;
5051: }
5052:
5053:
5054: DEFUN (ip_ospf_dead_interval,
5055: ip_ospf_dead_interval_addr_cmd,
5056: "ip ospf dead-interval <1-65535> A.B.C.D",
5057: "IP Information\n"
5058: "OSPF interface commands\n"
5059: "Interval after which a neighbor is declared dead\n"
5060: "Seconds\n"
5061: "Address of interface\n")
5062: {
5063: if (argc == 2)
5064: return ospf_vty_dead_interval_set (vty, argv[0], argv[1], NULL);
5065: else
5066: return ospf_vty_dead_interval_set (vty, argv[0], NULL, NULL);
5067: }
5068:
5069: ALIAS (ip_ospf_dead_interval,
5070: ip_ospf_dead_interval_cmd,
5071: "ip ospf dead-interval <1-65535>",
5072: "IP Information\n"
5073: "OSPF interface commands\n"
5074: "Interval after which a neighbor is declared dead\n"
5075: "Seconds\n")
5076:
5077: ALIAS (ip_ospf_dead_interval,
5078: ospf_dead_interval_cmd,
5079: "ospf dead-interval <1-65535>",
5080: "OSPF interface commands\n"
5081: "Interval after which a neighbor is declared dead\n"
5082: "Seconds\n")
5083:
5084: DEFUN (ip_ospf_dead_interval_minimal,
5085: ip_ospf_dead_interval_minimal_addr_cmd,
5086: "ip ospf dead-interval minimal hello-multiplier <1-10> A.B.C.D",
5087: "IP Information\n"
5088: "OSPF interface commands\n"
5089: "Interval after which a neighbor is declared dead\n"
5090: "Minimal 1s dead-interval with fast sub-second hellos\n"
5091: "Hello multiplier factor\n"
5092: "Number of Hellos to send each second\n"
5093: "Address of interface\n")
5094: {
5095: if (argc == 2)
5096: return ospf_vty_dead_interval_set (vty, NULL, argv[1], argv[0]);
5097: else
5098: return ospf_vty_dead_interval_set (vty, NULL, NULL, argv[0]);
5099: }
5100:
5101: ALIAS (ip_ospf_dead_interval_minimal,
5102: ip_ospf_dead_interval_minimal_cmd,
5103: "ip ospf dead-interval minimal hello-multiplier <1-10>",
5104: "IP Information\n"
5105: "OSPF interface commands\n"
5106: "Interval after which a neighbor is declared dead\n"
5107: "Minimal 1s dead-interval with fast sub-second hellos\n"
5108: "Hello multiplier factor\n"
5109: "Number of Hellos to send each second\n")
5110:
5111: DEFUN (no_ip_ospf_dead_interval,
5112: no_ip_ospf_dead_interval_addr_cmd,
5113: "no ip ospf dead-interval A.B.C.D",
5114: NO_STR
5115: "IP Information\n"
5116: "OSPF interface commands\n"
5117: "Interval after which a neighbor is declared dead\n"
5118: "Address of interface")
5119: {
5120: struct interface *ifp = vty->index;
5121: struct in_addr addr;
5122: int ret;
5123: struct ospf_if_params *params;
5124: struct ospf_interface *oi;
5125: struct route_node *rn;
5126:
5127: ifp = vty->index;
5128: params = IF_DEF_PARAMS (ifp);
5129:
5130: if (argc == 1)
5131: {
5132: ret = inet_aton(argv[0], &addr);
5133: if (!ret)
5134: {
5135: vty_out (vty, "Please specify interface address by A.B.C.D%s",
5136: VTY_NEWLINE);
5137: return CMD_WARNING;
5138: }
5139:
5140: params = ospf_lookup_if_params (ifp, addr);
5141: if (params == NULL)
5142: return CMD_SUCCESS;
5143: }
5144:
5145: UNSET_IF_PARAM (params, v_wait);
5146: params->v_wait = OSPF_ROUTER_DEAD_INTERVAL_DEFAULT;
5147:
5148: UNSET_IF_PARAM (params, fast_hello);
5149: params->fast_hello = OSPF_FAST_HELLO_DEFAULT;
5150:
5151: if (params != IF_DEF_PARAMS (ifp))
5152: {
5153: ospf_free_if_params (ifp, addr);
5154: ospf_if_update_params (ifp, addr);
5155: }
5156:
5157: /* Update timer values in neighbor structure. */
5158: if (argc == 1)
5159: {
5160: struct ospf *ospf;
5161:
5162: if ((ospf = ospf_lookup()))
5163: {
5164: oi = ospf_if_lookup_by_local_addr (ospf, ifp, addr);
5165: if (oi)
5166: ospf_nbr_timer_update (oi);
5167: }
5168: }
5169: else
5170: {
5171: for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn))
5172: if ((oi = rn->info))
5173: ospf_nbr_timer_update (oi);
5174: }
5175:
5176: return CMD_SUCCESS;
5177: }
5178:
5179: ALIAS (no_ip_ospf_dead_interval,
5180: no_ip_ospf_dead_interval_cmd,
5181: "no ip ospf dead-interval",
5182: NO_STR
5183: "IP Information\n"
5184: "OSPF interface commands\n"
5185: "Interval after which a neighbor is declared dead\n")
5186:
5187: ALIAS (no_ip_ospf_dead_interval,
5188: no_ospf_dead_interval_cmd,
5189: "no ospf dead-interval",
5190: NO_STR
5191: "OSPF interface commands\n"
5192: "Interval after which a neighbor is declared dead\n")
5193:
5194: DEFUN (ip_ospf_hello_interval,
5195: ip_ospf_hello_interval_addr_cmd,
5196: "ip ospf hello-interval <1-65535> A.B.C.D",
5197: "IP Information\n"
5198: "OSPF interface commands\n"
5199: "Time between HELLO packets\n"
5200: "Seconds\n"
5201: "Address of interface")
5202: {
5203: struct interface *ifp = vty->index;
5204: u_int32_t seconds;
5205: struct in_addr addr;
5206: int ret;
5207: struct ospf_if_params *params;
5208:
5209: params = IF_DEF_PARAMS (ifp);
5210:
5211: seconds = strtol (argv[0], NULL, 10);
5212:
5213: /* HelloInterval range is <1-65535>. */
5214: if (seconds < 1 || seconds > 65535)
5215: {
5216: vty_out (vty, "Hello Interval is invalid%s", VTY_NEWLINE);
5217: return CMD_WARNING;
5218: }
5219:
5220: if (argc == 2)
5221: {
5222: ret = inet_aton(argv[1], &addr);
5223: if (!ret)
5224: {
5225: vty_out (vty, "Please specify interface address by A.B.C.D%s",
5226: VTY_NEWLINE);
5227: return CMD_WARNING;
5228: }
5229:
5230: params = ospf_get_if_params (ifp, addr);
5231: ospf_if_update_params (ifp, addr);
5232: }
5233:
5234: SET_IF_PARAM (params, v_hello);
5235: params->v_hello = seconds;
5236:
5237: return CMD_SUCCESS;
5238: }
5239:
5240: ALIAS (ip_ospf_hello_interval,
5241: ip_ospf_hello_interval_cmd,
5242: "ip ospf hello-interval <1-65535>",
5243: "IP Information\n"
5244: "OSPF interface commands\n"
5245: "Time between HELLO packets\n"
5246: "Seconds\n")
5247:
5248: ALIAS (ip_ospf_hello_interval,
5249: ospf_hello_interval_cmd,
5250: "ospf hello-interval <1-65535>",
5251: "OSPF interface commands\n"
5252: "Time between HELLO packets\n"
5253: "Seconds\n")
5254:
5255: DEFUN (no_ip_ospf_hello_interval,
5256: no_ip_ospf_hello_interval_addr_cmd,
5257: "no ip ospf hello-interval A.B.C.D",
5258: NO_STR
5259: "IP Information\n"
5260: "OSPF interface commands\n"
5261: "Time between HELLO packets\n"
5262: "Address of interface")
5263: {
5264: struct interface *ifp = vty->index;
5265: struct in_addr addr;
5266: int ret;
5267: struct ospf_if_params *params;
5268:
5269: ifp = vty->index;
5270: params = IF_DEF_PARAMS (ifp);
5271:
5272: if (argc == 1)
5273: {
5274: ret = inet_aton(argv[0], &addr);
5275: if (!ret)
5276: {
5277: vty_out (vty, "Please specify interface address by A.B.C.D%s",
5278: VTY_NEWLINE);
5279: return CMD_WARNING;
5280: }
5281:
5282: params = ospf_lookup_if_params (ifp, addr);
5283: if (params == NULL)
5284: return CMD_SUCCESS;
5285: }
5286:
5287: UNSET_IF_PARAM (params, v_hello);
5288: params->v_hello = OSPF_HELLO_INTERVAL_DEFAULT;
5289:
5290: if (params != IF_DEF_PARAMS (ifp))
5291: {
5292: ospf_free_if_params (ifp, addr);
5293: ospf_if_update_params (ifp, addr);
5294: }
5295:
5296: return CMD_SUCCESS;
5297: }
5298:
5299: ALIAS (no_ip_ospf_hello_interval,
5300: no_ip_ospf_hello_interval_cmd,
5301: "no ip ospf hello-interval",
5302: NO_STR
5303: "IP Information\n"
5304: "OSPF interface commands\n"
5305: "Time between HELLO packets\n")
5306:
5307: ALIAS (no_ip_ospf_hello_interval,
5308: no_ospf_hello_interval_cmd,
5309: "no ospf hello-interval",
5310: NO_STR
5311: "OSPF interface commands\n"
5312: "Time between HELLO packets\n")
5313:
5314: DEFUN (ip_ospf_network,
5315: ip_ospf_network_cmd,
5316: "ip ospf network (broadcast|non-broadcast|point-to-multipoint|point-to-point)",
5317: "IP Information\n"
5318: "OSPF interface commands\n"
5319: "Network type\n"
5320: "Specify OSPF broadcast multi-access network\n"
5321: "Specify OSPF NBMA network\n"
5322: "Specify OSPF point-to-multipoint network\n"
5323: "Specify OSPF point-to-point network\n")
5324: {
5325: struct interface *ifp = vty->index;
5326: int old_type = IF_DEF_PARAMS (ifp)->type;
5327: struct route_node *rn;
5328:
5329: if (strncmp (argv[0], "b", 1) == 0)
5330: IF_DEF_PARAMS (ifp)->type = OSPF_IFTYPE_BROADCAST;
5331: else if (strncmp (argv[0], "n", 1) == 0)
5332: IF_DEF_PARAMS (ifp)->type = OSPF_IFTYPE_NBMA;
5333: else if (strncmp (argv[0], "point-to-m", 10) == 0)
5334: IF_DEF_PARAMS (ifp)->type = OSPF_IFTYPE_POINTOMULTIPOINT;
5335: else if (strncmp (argv[0], "point-to-p", 10) == 0)
5336: IF_DEF_PARAMS (ifp)->type = OSPF_IFTYPE_POINTOPOINT;
5337:
5338: if (IF_DEF_PARAMS (ifp)->type == old_type)
5339: return CMD_SUCCESS;
5340:
5341: SET_IF_PARAM (IF_DEF_PARAMS (ifp), type);
5342:
5343: for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn))
5344: {
5345: struct ospf_interface *oi = rn->info;
5346:
5347: if (!oi)
5348: continue;
5349:
5350: oi->type = IF_DEF_PARAMS (ifp)->type;
5351:
5352: if (oi->state > ISM_Down)
5353: {
5354: OSPF_ISM_EVENT_EXECUTE (oi, ISM_InterfaceDown);
5355: OSPF_ISM_EVENT_EXECUTE (oi, ISM_InterfaceUp);
5356: }
5357: }
5358:
5359: return CMD_SUCCESS;
5360: }
5361:
5362: ALIAS (ip_ospf_network,
5363: ospf_network_cmd,
5364: "ospf network (broadcast|non-broadcast|point-to-multipoint|point-to-point)",
5365: "OSPF interface commands\n"
5366: "Network type\n"
5367: "Specify OSPF broadcast multi-access network\n"
5368: "Specify OSPF NBMA network\n"
5369: "Specify OSPF point-to-multipoint network\n"
5370: "Specify OSPF point-to-point network\n")
5371:
5372: DEFUN (no_ip_ospf_network,
5373: no_ip_ospf_network_cmd,
5374: "no ip ospf network",
5375: NO_STR
5376: "IP Information\n"
5377: "OSPF interface commands\n"
5378: "Network type\n")
5379: {
5380: struct interface *ifp = vty->index;
5381: int old_type = IF_DEF_PARAMS (ifp)->type;
5382: struct route_node *rn;
5383:
5384: IF_DEF_PARAMS (ifp)->type = ospf_default_iftype(ifp);
5385:
5386: if (IF_DEF_PARAMS (ifp)->type == old_type)
5387: return CMD_SUCCESS;
5388:
5389: for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn))
5390: {
5391: struct ospf_interface *oi = rn->info;
5392:
5393: if (!oi)
5394: continue;
5395:
5396: oi->type = IF_DEF_PARAMS (ifp)->type;
5397:
5398: if (oi->state > ISM_Down)
5399: {
5400: OSPF_ISM_EVENT_EXECUTE (oi, ISM_InterfaceDown);
5401: OSPF_ISM_EVENT_EXECUTE (oi, ISM_InterfaceUp);
5402: }
5403: }
5404:
5405: return CMD_SUCCESS;
5406: }
5407:
5408: ALIAS (no_ip_ospf_network,
5409: no_ospf_network_cmd,
5410: "no ospf network",
5411: NO_STR
5412: "OSPF interface commands\n"
5413: "Network type\n")
5414:
5415: DEFUN (ip_ospf_priority,
5416: ip_ospf_priority_addr_cmd,
5417: "ip ospf priority <0-255> A.B.C.D",
5418: "IP Information\n"
5419: "OSPF interface commands\n"
5420: "Router priority\n"
5421: "Priority\n"
5422: "Address of interface")
5423: {
5424: struct interface *ifp = vty->index;
5425: u_int32_t priority;
5426: struct route_node *rn;
5427: struct in_addr addr;
5428: int ret;
5429: struct ospf_if_params *params;
5430:
5431: params = IF_DEF_PARAMS (ifp);
5432:
5433: priority = strtol (argv[0], NULL, 10);
5434:
5435: /* Router Priority range is <0-255>. */
5436: if (priority < 0 || priority > 255)
5437: {
5438: vty_out (vty, "Router Priority is invalid%s", VTY_NEWLINE);
5439: return CMD_WARNING;
5440: }
5441:
5442: if (argc == 2)
5443: {
5444: ret = inet_aton(argv[1], &addr);
5445: if (!ret)
5446: {
5447: vty_out (vty, "Please specify interface address by A.B.C.D%s",
5448: VTY_NEWLINE);
5449: return CMD_WARNING;
5450: }
5451:
5452: params = ospf_get_if_params (ifp, addr);
5453: ospf_if_update_params (ifp, addr);
5454: }
5455:
5456: SET_IF_PARAM (params, priority);
5457: params->priority = priority;
5458:
5459: for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn))
5460: {
5461: struct ospf_interface *oi = rn->info;
5462:
5463: if (!oi)
5464: continue;
5465:
5466:
5467: if (PRIORITY (oi) != OSPF_IF_PARAM (oi, priority))
5468: {
5469: PRIORITY (oi) = OSPF_IF_PARAM (oi, priority);
5470: OSPF_ISM_EVENT_SCHEDULE (oi, ISM_NeighborChange);
5471: }
5472: }
5473:
5474: return CMD_SUCCESS;
5475: }
5476:
5477: ALIAS (ip_ospf_priority,
5478: ip_ospf_priority_cmd,
5479: "ip ospf priority <0-255>",
5480: "IP Information\n"
5481: "OSPF interface commands\n"
5482: "Router priority\n"
5483: "Priority\n")
5484:
5485: ALIAS (ip_ospf_priority,
5486: ospf_priority_cmd,
5487: "ospf priority <0-255>",
5488: "OSPF interface commands\n"
5489: "Router priority\n"
5490: "Priority\n")
5491:
5492: DEFUN (no_ip_ospf_priority,
5493: no_ip_ospf_priority_addr_cmd,
5494: "no ip ospf priority A.B.C.D",
5495: NO_STR
5496: "IP Information\n"
5497: "OSPF interface commands\n"
5498: "Router priority\n"
5499: "Address of interface")
5500: {
5501: struct interface *ifp = vty->index;
5502: struct route_node *rn;
5503: struct in_addr addr;
5504: int ret;
5505: struct ospf_if_params *params;
5506:
5507: ifp = vty->index;
5508: params = IF_DEF_PARAMS (ifp);
5509:
5510: if (argc == 1)
5511: {
5512: ret = inet_aton(argv[0], &addr);
5513: if (!ret)
5514: {
5515: vty_out (vty, "Please specify interface address by A.B.C.D%s",
5516: VTY_NEWLINE);
5517: return CMD_WARNING;
5518: }
5519:
5520: params = ospf_lookup_if_params (ifp, addr);
5521: if (params == NULL)
5522: return CMD_SUCCESS;
5523: }
5524:
5525: UNSET_IF_PARAM (params, priority);
5526: params->priority = OSPF_ROUTER_PRIORITY_DEFAULT;
5527:
5528: if (params != IF_DEF_PARAMS (ifp))
5529: {
5530: ospf_free_if_params (ifp, addr);
5531: ospf_if_update_params (ifp, addr);
5532: }
5533:
5534: for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn))
5535: {
5536: struct ospf_interface *oi = rn->info;
5537:
5538: if (!oi)
5539: continue;
5540:
5541:
5542: if (PRIORITY (oi) != OSPF_IF_PARAM (oi, priority))
5543: {
5544: PRIORITY (oi) = OSPF_IF_PARAM (oi, priority);
5545: OSPF_ISM_EVENT_SCHEDULE (oi, ISM_NeighborChange);
5546: }
5547: }
5548:
5549: return CMD_SUCCESS;
5550: }
5551:
5552: ALIAS (no_ip_ospf_priority,
5553: no_ip_ospf_priority_cmd,
5554: "no ip ospf priority",
5555: NO_STR
5556: "IP Information\n"
5557: "OSPF interface commands\n"
5558: "Router priority\n")
5559:
5560: ALIAS (no_ip_ospf_priority,
5561: no_ospf_priority_cmd,
5562: "no ospf priority",
5563: NO_STR
5564: "OSPF interface commands\n"
5565: "Router priority\n")
5566:
5567: DEFUN (ip_ospf_retransmit_interval,
5568: ip_ospf_retransmit_interval_addr_cmd,
5569: "ip ospf retransmit-interval <3-65535> A.B.C.D",
5570: "IP Information\n"
5571: "OSPF interface commands\n"
5572: "Time between retransmitting lost link state advertisements\n"
5573: "Seconds\n"
5574: "Address of interface")
5575: {
5576: struct interface *ifp = vty->index;
5577: u_int32_t seconds;
5578: struct in_addr addr;
5579: int ret;
5580: struct ospf_if_params *params;
5581:
5582: params = IF_DEF_PARAMS (ifp);
5583: seconds = strtol (argv[0], NULL, 10);
5584:
5585: /* Retransmit Interval range is <3-65535>. */
5586: if (seconds < 3 || seconds > 65535)
5587: {
5588: vty_out (vty, "Retransmit Interval is invalid%s", VTY_NEWLINE);
5589: return CMD_WARNING;
5590: }
5591:
5592:
5593: if (argc == 2)
5594: {
5595: ret = inet_aton(argv[1], &addr);
5596: if (!ret)
5597: {
5598: vty_out (vty, "Please specify interface address by A.B.C.D%s",
5599: VTY_NEWLINE);
5600: return CMD_WARNING;
5601: }
5602:
5603: params = ospf_get_if_params (ifp, addr);
5604: ospf_if_update_params (ifp, addr);
5605: }
5606:
5607: SET_IF_PARAM (params, retransmit_interval);
5608: params->retransmit_interval = seconds;
5609:
5610: return CMD_SUCCESS;
5611: }
5612:
5613: ALIAS (ip_ospf_retransmit_interval,
5614: ip_ospf_retransmit_interval_cmd,
5615: "ip ospf retransmit-interval <3-65535>",
5616: "IP Information\n"
5617: "OSPF interface commands\n"
5618: "Time between retransmitting lost link state advertisements\n"
5619: "Seconds\n")
5620:
5621: ALIAS (ip_ospf_retransmit_interval,
5622: ospf_retransmit_interval_cmd,
5623: "ospf retransmit-interval <3-65535>",
5624: "OSPF interface commands\n"
5625: "Time between retransmitting lost link state advertisements\n"
5626: "Seconds\n")
5627:
5628: DEFUN (no_ip_ospf_retransmit_interval,
5629: no_ip_ospf_retransmit_interval_addr_cmd,
5630: "no ip ospf retransmit-interval A.B.C.D",
5631: NO_STR
5632: "IP Information\n"
5633: "OSPF interface commands\n"
5634: "Time between retransmitting lost link state advertisements\n"
5635: "Address of interface")
5636: {
5637: struct interface *ifp = vty->index;
5638: struct in_addr addr;
5639: int ret;
5640: struct ospf_if_params *params;
5641:
5642: ifp = vty->index;
5643: params = IF_DEF_PARAMS (ifp);
5644:
5645: if (argc == 1)
5646: {
5647: ret = inet_aton(argv[0], &addr);
5648: if (!ret)
5649: {
5650: vty_out (vty, "Please specify interface address by A.B.C.D%s",
5651: VTY_NEWLINE);
5652: return CMD_WARNING;
5653: }
5654:
5655: params = ospf_lookup_if_params (ifp, addr);
5656: if (params == NULL)
5657: return CMD_SUCCESS;
5658: }
5659:
5660: UNSET_IF_PARAM (params, retransmit_interval);
5661: params->retransmit_interval = OSPF_RETRANSMIT_INTERVAL_DEFAULT;
5662:
5663: if (params != IF_DEF_PARAMS (ifp))
5664: {
5665: ospf_free_if_params (ifp, addr);
5666: ospf_if_update_params (ifp, addr);
5667: }
5668:
5669: return CMD_SUCCESS;
5670: }
5671:
5672: ALIAS (no_ip_ospf_retransmit_interval,
5673: no_ip_ospf_retransmit_interval_cmd,
5674: "no ip ospf retransmit-interval",
5675: NO_STR
5676: "IP Information\n"
5677: "OSPF interface commands\n"
5678: "Time between retransmitting lost link state advertisements\n")
5679:
5680: ALIAS (no_ip_ospf_retransmit_interval,
5681: no_ospf_retransmit_interval_cmd,
5682: "no ospf retransmit-interval",
5683: NO_STR
5684: "OSPF interface commands\n"
5685: "Time between retransmitting lost link state advertisements\n")
5686:
5687: DEFUN (ip_ospf_transmit_delay,
5688: ip_ospf_transmit_delay_addr_cmd,
5689: "ip ospf transmit-delay <1-65535> A.B.C.D",
5690: "IP Information\n"
5691: "OSPF interface commands\n"
5692: "Link state transmit delay\n"
5693: "Seconds\n"
5694: "Address of interface")
5695: {
5696: struct interface *ifp = vty->index;
5697: u_int32_t seconds;
5698: struct in_addr addr;
5699: int ret;
5700: struct ospf_if_params *params;
5701:
5702: params = IF_DEF_PARAMS (ifp);
5703: seconds = strtol (argv[0], NULL, 10);
5704:
5705: /* Transmit Delay range is <1-65535>. */
5706: if (seconds < 1 || seconds > 65535)
5707: {
5708: vty_out (vty, "Transmit Delay is invalid%s", VTY_NEWLINE);
5709: return CMD_WARNING;
5710: }
5711:
5712: if (argc == 2)
5713: {
5714: ret = inet_aton(argv[1], &addr);
5715: if (!ret)
5716: {
5717: vty_out (vty, "Please specify interface address by A.B.C.D%s",
5718: VTY_NEWLINE);
5719: return CMD_WARNING;
5720: }
5721:
5722: params = ospf_get_if_params (ifp, addr);
5723: ospf_if_update_params (ifp, addr);
5724: }
5725:
5726: SET_IF_PARAM (params, transmit_delay);
5727: params->transmit_delay = seconds;
5728:
5729: return CMD_SUCCESS;
5730: }
5731:
5732: ALIAS (ip_ospf_transmit_delay,
5733: ip_ospf_transmit_delay_cmd,
5734: "ip ospf transmit-delay <1-65535>",
5735: "IP Information\n"
5736: "OSPF interface commands\n"
5737: "Link state transmit delay\n"
5738: "Seconds\n")
5739:
5740: ALIAS (ip_ospf_transmit_delay,
5741: ospf_transmit_delay_cmd,
5742: "ospf transmit-delay <1-65535>",
5743: "OSPF interface commands\n"
5744: "Link state transmit delay\n"
5745: "Seconds\n")
5746:
5747: DEFUN (no_ip_ospf_transmit_delay,
5748: no_ip_ospf_transmit_delay_addr_cmd,
5749: "no ip ospf transmit-delay A.B.C.D",
5750: NO_STR
5751: "IP Information\n"
5752: "OSPF interface commands\n"
5753: "Link state transmit delay\n"
5754: "Address of interface")
5755: {
5756: struct interface *ifp = vty->index;
5757: struct in_addr addr;
5758: int ret;
5759: struct ospf_if_params *params;
5760:
5761: ifp = vty->index;
5762: params = IF_DEF_PARAMS (ifp);
5763:
5764: if (argc == 1)
5765: {
5766: ret = inet_aton(argv[0], &addr);
5767: if (!ret)
5768: {
5769: vty_out (vty, "Please specify interface address by A.B.C.D%s",
5770: VTY_NEWLINE);
5771: return CMD_WARNING;
5772: }
5773:
5774: params = ospf_lookup_if_params (ifp, addr);
5775: if (params == NULL)
5776: return CMD_SUCCESS;
5777: }
5778:
5779: UNSET_IF_PARAM (params, transmit_delay);
5780: params->transmit_delay = OSPF_TRANSMIT_DELAY_DEFAULT;
5781:
5782: if (params != IF_DEF_PARAMS (ifp))
5783: {
5784: ospf_free_if_params (ifp, addr);
5785: ospf_if_update_params (ifp, addr);
5786: }
5787:
5788: return CMD_SUCCESS;
5789: }
5790:
5791: ALIAS (no_ip_ospf_transmit_delay,
5792: no_ip_ospf_transmit_delay_cmd,
5793: "no ip ospf transmit-delay",
5794: NO_STR
5795: "IP Information\n"
5796: "OSPF interface commands\n"
5797: "Link state transmit delay\n")
5798:
5799: ALIAS (no_ip_ospf_transmit_delay,
5800: no_ospf_transmit_delay_cmd,
5801: "no ospf transmit-delay",
5802: NO_STR
5803: "OSPF interface commands\n"
5804: "Link state transmit delay\n")
5805:
5806:
5807: DEFUN (ospf_redistribute_source_metric_type,
5808: ospf_redistribute_source_metric_type_routemap_cmd,
5809: "redistribute " QUAGGA_REDIST_STR_OSPFD
5810: " metric <0-16777214> metric-type (1|2) route-map WORD",
5811: REDIST_STR
5812: QUAGGA_REDIST_HELP_STR_OSPFD
5813: "Metric for redistributed routes\n"
5814: "OSPF default metric\n"
5815: "OSPF exterior metric type for redistributed routes\n"
5816: "Set OSPF External Type 1 metrics\n"
5817: "Set OSPF External Type 2 metrics\n"
5818: "Route map reference\n"
5819: "Pointer to route-map entries\n")
5820: {
5821: struct ospf *ospf = vty->index;
5822: int source;
5823: int type = -1;
5824: int metric = -1;
5825:
5826: /* Get distribute source. */
5827: if (!str2distribute_source (argv[0], &source))
5828: return CMD_WARNING;
5829:
5830: /* Get metric value. */
5831: if (argc >= 2)
5832: if (!str2metric (argv[1], &metric))
5833: return CMD_WARNING;
5834:
5835: /* Get metric type. */
5836: if (argc >= 3)
5837: if (!str2metric_type (argv[2], &type))
5838: return CMD_WARNING;
5839:
5840: if (argc == 4)
5841: ospf_routemap_set (ospf, source, argv[3]);
5842: else
5843: ospf_routemap_unset (ospf, source);
5844:
5845: return ospf_redistribute_set (ospf, source, type, metric);
5846: }
5847:
5848: ALIAS (ospf_redistribute_source_metric_type,
5849: ospf_redistribute_source_metric_type_cmd,
5850: "redistribute " QUAGGA_REDIST_STR_OSPFD
5851: " metric <0-16777214> metric-type (1|2)",
5852: REDIST_STR
5853: QUAGGA_REDIST_HELP_STR_OSPFD
5854: "Metric for redistributed routes\n"
5855: "OSPF default metric\n"
5856: "OSPF exterior metric type for redistributed routes\n"
5857: "Set OSPF External Type 1 metrics\n"
5858: "Set OSPF External Type 2 metrics\n")
5859:
5860: ALIAS (ospf_redistribute_source_metric_type,
5861: ospf_redistribute_source_metric_cmd,
5862: "redistribute " QUAGGA_REDIST_STR_OSPFD " metric <0-16777214>",
5863: REDIST_STR
5864: QUAGGA_REDIST_HELP_STR_OSPFD
5865: "Metric for redistributed routes\n"
5866: "OSPF default metric\n")
5867:
5868: DEFUN (ospf_redistribute_source_type_metric,
5869: ospf_redistribute_source_type_metric_routemap_cmd,
5870: "redistribute " QUAGGA_REDIST_STR_OSPFD
5871: " metric-type (1|2) metric <0-16777214> route-map WORD",
5872: REDIST_STR
5873: QUAGGA_REDIST_HELP_STR_OSPFD
5874: "OSPF exterior metric type for redistributed routes\n"
5875: "Set OSPF External Type 1 metrics\n"
5876: "Set OSPF External Type 2 metrics\n"
5877: "Metric for redistributed routes\n"
5878: "OSPF default metric\n"
5879: "Route map reference\n"
5880: "Pointer to route-map entries\n")
5881: {
5882: struct ospf *ospf = vty->index;
5883: int source;
5884: int type = -1;
5885: int metric = -1;
5886:
5887: /* Get distribute source. */
5888: if (!str2distribute_source (argv[0], &source))
5889: return CMD_WARNING;
5890:
5891: /* Get metric value. */
5892: if (argc >= 2)
5893: if (!str2metric_type (argv[1], &type))
5894: return CMD_WARNING;
5895:
5896: /* Get metric type. */
5897: if (argc >= 3)
5898: if (!str2metric (argv[2], &metric))
5899: return CMD_WARNING;
5900:
5901: if (argc == 4)
5902: ospf_routemap_set (ospf, source, argv[3]);
5903: else
5904: ospf_routemap_unset (ospf, source);
5905:
5906: return ospf_redistribute_set (ospf, source, type, metric);
5907: }
5908:
5909: ALIAS (ospf_redistribute_source_type_metric,
5910: ospf_redistribute_source_type_metric_cmd,
5911: "redistribute " QUAGGA_REDIST_STR_OSPFD
5912: " metric-type (1|2) metric <0-16777214>",
5913: REDIST_STR
5914: QUAGGA_REDIST_HELP_STR_OSPFD
5915: "OSPF exterior metric type for redistributed routes\n"
5916: "Set OSPF External Type 1 metrics\n"
5917: "Set OSPF External Type 2 metrics\n"
5918: "Metric for redistributed routes\n"
5919: "OSPF default metric\n")
5920:
5921: ALIAS (ospf_redistribute_source_type_metric,
5922: ospf_redistribute_source_type_cmd,
5923: "redistribute " QUAGGA_REDIST_STR_OSPFD " metric-type (1|2)",
5924: REDIST_STR
5925: QUAGGA_REDIST_HELP_STR_OSPFD
5926: "OSPF exterior metric type for redistributed routes\n"
5927: "Set OSPF External Type 1 metrics\n"
5928: "Set OSPF External Type 2 metrics\n")
5929:
5930: ALIAS (ospf_redistribute_source_type_metric,
5931: ospf_redistribute_source_cmd,
5932: "redistribute " QUAGGA_REDIST_STR_OSPFD,
5933: REDIST_STR
5934: QUAGGA_REDIST_HELP_STR_OSPFD)
5935:
5936: DEFUN (ospf_redistribute_source_metric_routemap,
5937: ospf_redistribute_source_metric_routemap_cmd,
5938: "redistribute " QUAGGA_REDIST_STR_OSPFD
5939: " metric <0-16777214> route-map WORD",
5940: REDIST_STR
5941: QUAGGA_REDIST_HELP_STR_OSPFD
5942: "Metric for redistributed routes\n"
5943: "OSPF default metric\n"
5944: "Route map reference\n"
5945: "Pointer to route-map entries\n")
5946: {
5947: struct ospf *ospf = vty->index;
5948: int source;
5949: int metric = -1;
5950:
5951: /* Get distribute source. */
5952: if (!str2distribute_source (argv[0], &source))
5953: return CMD_WARNING;
5954:
5955: /* Get metric value. */
5956: if (argc >= 2)
5957: if (!str2metric (argv[1], &metric))
5958: return CMD_WARNING;
5959:
5960: if (argc == 3)
5961: ospf_routemap_set (ospf, source, argv[2]);
5962: else
5963: ospf_routemap_unset (ospf, source);
5964:
5965: return ospf_redistribute_set (ospf, source, -1, metric);
5966: }
5967:
5968: DEFUN (ospf_redistribute_source_type_routemap,
5969: ospf_redistribute_source_type_routemap_cmd,
5970: "redistribute " QUAGGA_REDIST_STR_OSPFD
5971: " metric-type (1|2) route-map WORD",
5972: REDIST_STR
5973: QUAGGA_REDIST_HELP_STR_OSPFD
5974: "OSPF exterior metric type for redistributed routes\n"
5975: "Set OSPF External Type 1 metrics\n"
5976: "Set OSPF External Type 2 metrics\n"
5977: "Route map reference\n"
5978: "Pointer to route-map entries\n")
5979: {
5980: struct ospf *ospf = vty->index;
5981: int source;
5982: int type = -1;
5983:
5984: /* Get distribute source. */
5985: if (!str2distribute_source (argv[0], &source))
5986: return CMD_WARNING;
5987:
5988: /* Get metric value. */
5989: if (argc >= 2)
5990: if (!str2metric_type (argv[1], &type))
5991: return CMD_WARNING;
5992:
5993: if (argc == 3)
5994: ospf_routemap_set (ospf, source, argv[2]);
5995: else
5996: ospf_routemap_unset (ospf, source);
5997:
5998: return ospf_redistribute_set (ospf, source, type, -1);
5999: }
6000:
6001: DEFUN (ospf_redistribute_source_routemap,
6002: ospf_redistribute_source_routemap_cmd,
6003: "redistribute " QUAGGA_REDIST_STR_OSPFD " route-map WORD",
6004: REDIST_STR
6005: QUAGGA_REDIST_HELP_STR_OSPFD
6006: "Route map reference\n"
6007: "Pointer to route-map entries\n")
6008: {
6009: struct ospf *ospf = vty->index;
6010: int source;
6011:
6012: /* Get distribute source. */
6013: if (!str2distribute_source (argv[0], &source))
6014: return CMD_WARNING;
6015:
6016: if (argc == 2)
6017: ospf_routemap_set (ospf, source, argv[1]);
6018: else
6019: ospf_routemap_unset (ospf, source);
6020:
6021: return ospf_redistribute_set (ospf, source, -1, -1);
6022: }
6023:
6024: DEFUN (no_ospf_redistribute_source,
6025: no_ospf_redistribute_source_cmd,
6026: "no redistribute " QUAGGA_REDIST_STR_OSPFD,
6027: NO_STR
6028: REDIST_STR
6029: QUAGGA_REDIST_HELP_STR_OSPFD)
6030: {
6031: struct ospf *ospf = vty->index;
6032: int source;
6033:
6034: if (!str2distribute_source (argv[0], &source))
6035: return CMD_WARNING;
6036:
6037: ospf_routemap_unset (ospf, source);
6038: return ospf_redistribute_unset (ospf, source);
6039: }
6040:
6041: DEFUN (ospf_distribute_list_out,
6042: ospf_distribute_list_out_cmd,
6043: "distribute-list WORD out " QUAGGA_REDIST_STR_OSPFD,
6044: "Filter networks in routing updates\n"
6045: "Access-list name\n"
6046: OUT_STR
6047: QUAGGA_REDIST_HELP_STR_OSPFD)
6048: {
6049: struct ospf *ospf = vty->index;
6050: int source;
6051:
6052: /* Get distribute source. */
6053: if (!str2distribute_source (argv[1], &source))
6054: return CMD_WARNING;
6055:
6056: return ospf_distribute_list_out_set (ospf, source, argv[0]);
6057: }
6058:
6059: DEFUN (no_ospf_distribute_list_out,
6060: no_ospf_distribute_list_out_cmd,
6061: "no distribute-list WORD out " QUAGGA_REDIST_STR_OSPFD,
6062: NO_STR
6063: "Filter networks in routing updates\n"
6064: "Access-list name\n"
6065: OUT_STR
6066: QUAGGA_REDIST_HELP_STR_OSPFD)
6067: {
6068: struct ospf *ospf = vty->index;
6069: int source;
6070:
6071: if (!str2distribute_source (argv[1], &source))
6072: return CMD_WARNING;
6073:
6074: return ospf_distribute_list_out_unset (ospf, source, argv[0]);
6075: }
6076:
6077: /* Default information originate. */
6078: DEFUN (ospf_default_information_originate_metric_type_routemap,
6079: ospf_default_information_originate_metric_type_routemap_cmd,
6080: "default-information originate metric <0-16777214> metric-type (1|2) route-map WORD",
6081: "Control distribution of default information\n"
6082: "Distribute a default route\n"
6083: "OSPF default metric\n"
6084: "OSPF metric\n"
6085: "OSPF metric type for default routes\n"
6086: "Set OSPF External Type 1 metrics\n"
6087: "Set OSPF External Type 2 metrics\n"
6088: "Route map reference\n"
6089: "Pointer to route-map entries\n")
6090: {
6091: struct ospf *ospf = vty->index;
6092: int type = -1;
6093: int metric = -1;
6094:
6095: /* Get metric value. */
6096: if (argc >= 1)
6097: if (!str2metric (argv[0], &metric))
6098: return CMD_WARNING;
6099:
6100: /* Get metric type. */
6101: if (argc >= 2)
6102: if (!str2metric_type (argv[1], &type))
6103: return CMD_WARNING;
6104:
6105: if (argc == 3)
6106: ospf_routemap_set (ospf, DEFAULT_ROUTE, argv[2]);
6107: else
6108: ospf_routemap_unset (ospf, DEFAULT_ROUTE);
6109:
6110: return ospf_redistribute_default_set (ospf, DEFAULT_ORIGINATE_ZEBRA,
6111: type, metric);
6112: }
6113:
6114: ALIAS (ospf_default_information_originate_metric_type_routemap,
6115: ospf_default_information_originate_metric_type_cmd,
6116: "default-information originate metric <0-16777214> metric-type (1|2)",
6117: "Control distribution of default information\n"
6118: "Distribute a default route\n"
6119: "OSPF default metric\n"
6120: "OSPF metric\n"
6121: "OSPF metric type for default routes\n"
6122: "Set OSPF External Type 1 metrics\n"
6123: "Set OSPF External Type 2 metrics\n")
6124:
6125: ALIAS (ospf_default_information_originate_metric_type_routemap,
6126: ospf_default_information_originate_metric_cmd,
6127: "default-information originate metric <0-16777214>",
6128: "Control distribution of default information\n"
6129: "Distribute a default route\n"
6130: "OSPF default metric\n"
6131: "OSPF metric\n")
6132:
6133: ALIAS (ospf_default_information_originate_metric_type_routemap,
6134: ospf_default_information_originate_cmd,
6135: "default-information originate",
6136: "Control distribution of default information\n"
6137: "Distribute a default route\n")
6138:
6139: /* Default information originate. */
6140: DEFUN (ospf_default_information_originate_metric_routemap,
6141: ospf_default_information_originate_metric_routemap_cmd,
6142: "default-information originate metric <0-16777214> route-map WORD",
6143: "Control distribution of default information\n"
6144: "Distribute a default route\n"
6145: "OSPF default metric\n"
6146: "OSPF metric\n"
6147: "Route map reference\n"
6148: "Pointer to route-map entries\n")
6149: {
6150: struct ospf *ospf = vty->index;
6151: int metric = -1;
6152:
6153: /* Get metric value. */
6154: if (argc >= 1)
6155: if (!str2metric (argv[0], &metric))
6156: return CMD_WARNING;
6157:
6158: if (argc == 2)
6159: ospf_routemap_set (ospf, DEFAULT_ROUTE, argv[1]);
6160: else
6161: ospf_routemap_unset (ospf, DEFAULT_ROUTE);
6162:
6163: return ospf_redistribute_default_set (ospf, DEFAULT_ORIGINATE_ZEBRA,
6164: -1, metric);
6165: }
6166:
6167: /* Default information originate. */
6168: DEFUN (ospf_default_information_originate_routemap,
6169: ospf_default_information_originate_routemap_cmd,
6170: "default-information originate route-map WORD",
6171: "Control distribution of default information\n"
6172: "Distribute a default route\n"
6173: "Route map reference\n"
6174: "Pointer to route-map entries\n")
6175: {
6176: struct ospf *ospf = vty->index;
6177:
6178: if (argc == 1)
6179: ospf_routemap_set (ospf, DEFAULT_ROUTE, argv[0]);
6180: else
6181: ospf_routemap_unset (ospf, DEFAULT_ROUTE);
6182:
6183: return ospf_redistribute_default_set (ospf, DEFAULT_ORIGINATE_ZEBRA, -1, -1);
6184: }
6185:
6186: DEFUN (ospf_default_information_originate_type_metric_routemap,
6187: ospf_default_information_originate_type_metric_routemap_cmd,
6188: "default-information originate metric-type (1|2) metric <0-16777214> route-map WORD",
6189: "Control distribution of default information\n"
6190: "Distribute a default route\n"
6191: "OSPF metric type for default routes\n"
6192: "Set OSPF External Type 1 metrics\n"
6193: "Set OSPF External Type 2 metrics\n"
6194: "OSPF default metric\n"
6195: "OSPF metric\n"
6196: "Route map reference\n"
6197: "Pointer to route-map entries\n")
6198: {
6199: struct ospf *ospf = vty->index;
6200: int type = -1;
6201: int metric = -1;
6202:
6203: /* Get metric type. */
6204: if (argc >= 1)
6205: if (!str2metric_type (argv[0], &type))
6206: return CMD_WARNING;
6207:
6208: /* Get metric value. */
6209: if (argc >= 2)
6210: if (!str2metric (argv[1], &metric))
6211: return CMD_WARNING;
6212:
6213: if (argc == 3)
6214: ospf_routemap_set (ospf, DEFAULT_ROUTE, argv[2]);
6215: else
6216: ospf_routemap_unset (ospf, DEFAULT_ROUTE);
6217:
6218: return ospf_redistribute_default_set (ospf, DEFAULT_ORIGINATE_ZEBRA,
6219: type, metric);
6220: }
6221:
6222: ALIAS (ospf_default_information_originate_type_metric_routemap,
6223: ospf_default_information_originate_type_metric_cmd,
6224: "default-information originate metric-type (1|2) metric <0-16777214>",
6225: "Control distribution of default information\n"
6226: "Distribute a default route\n"
6227: "OSPF metric type for default routes\n"
6228: "Set OSPF External Type 1 metrics\n"
6229: "Set OSPF External Type 2 metrics\n"
6230: "OSPF default metric\n"
6231: "OSPF metric\n")
6232:
6233: ALIAS (ospf_default_information_originate_type_metric_routemap,
6234: ospf_default_information_originate_type_cmd,
6235: "default-information originate metric-type (1|2)",
6236: "Control distribution of default information\n"
6237: "Distribute a default route\n"
6238: "OSPF metric type for default routes\n"
6239: "Set OSPF External Type 1 metrics\n"
6240: "Set OSPF External Type 2 metrics\n")
6241:
6242: DEFUN (ospf_default_information_originate_type_routemap,
6243: ospf_default_information_originate_type_routemap_cmd,
6244: "default-information originate metric-type (1|2) route-map WORD",
6245: "Control distribution of default information\n"
6246: "Distribute a default route\n"
6247: "OSPF metric type for default routes\n"
6248: "Set OSPF External Type 1 metrics\n"
6249: "Set OSPF External Type 2 metrics\n"
6250: "Route map reference\n"
6251: "Pointer to route-map entries\n")
6252: {
6253: struct ospf *ospf = vty->index;
6254: int type = -1;
6255:
6256: /* Get metric type. */
6257: if (argc >= 1)
6258: if (!str2metric_type (argv[0], &type))
6259: return CMD_WARNING;
6260:
6261: if (argc == 2)
6262: ospf_routemap_set (ospf, DEFAULT_ROUTE, argv[1]);
6263: else
6264: ospf_routemap_unset (ospf, DEFAULT_ROUTE);
6265:
6266: return ospf_redistribute_default_set (ospf, DEFAULT_ORIGINATE_ZEBRA,
6267: type, -1);
6268: }
6269:
6270: DEFUN (ospf_default_information_originate_always_metric_type_routemap,
6271: ospf_default_information_originate_always_metric_type_routemap_cmd,
6272: "default-information originate always metric <0-16777214> metric-type (1|2) route-map WORD",
6273: "Control distribution of default information\n"
6274: "Distribute a default route\n"
6275: "Always advertise default route\n"
6276: "OSPF default metric\n"
6277: "OSPF metric\n"
6278: "OSPF metric type for default routes\n"
6279: "Set OSPF External Type 1 metrics\n"
6280: "Set OSPF External Type 2 metrics\n"
6281: "Route map reference\n"
6282: "Pointer to route-map entries\n")
6283: {
6284: struct ospf *ospf = vty->index;
6285: int type = -1;
6286: int metric = -1;
6287:
6288: /* Get metric value. */
6289: if (argc >= 1)
6290: if (!str2metric (argv[0], &metric))
6291: return CMD_WARNING;
6292:
6293: /* Get metric type. */
6294: if (argc >= 2)
6295: if (!str2metric_type (argv[1], &type))
6296: return CMD_WARNING;
6297:
6298: if (argc == 3)
6299: ospf_routemap_set (ospf, DEFAULT_ROUTE, argv[2]);
6300: else
6301: ospf_routemap_unset (ospf, DEFAULT_ROUTE);
6302:
6303: return ospf_redistribute_default_set (ospf, DEFAULT_ORIGINATE_ALWAYS,
6304: type, metric);
6305: }
6306:
6307: ALIAS (ospf_default_information_originate_always_metric_type_routemap,
6308: ospf_default_information_originate_always_metric_type_cmd,
6309: "default-information originate always metric <0-16777214> metric-type (1|2)",
6310: "Control distribution of default information\n"
6311: "Distribute a default route\n"
6312: "Always advertise default route\n"
6313: "OSPF default metric\n"
6314: "OSPF metric\n"
6315: "OSPF metric type for default routes\n"
6316: "Set OSPF External Type 1 metrics\n"
6317: "Set OSPF External Type 2 metrics\n")
6318:
6319: ALIAS (ospf_default_information_originate_always_metric_type_routemap,
6320: ospf_default_information_originate_always_metric_cmd,
6321: "default-information originate always metric <0-16777214>",
6322: "Control distribution of default information\n"
6323: "Distribute a default route\n"
6324: "Always advertise default route\n"
6325: "OSPF default metric\n"
6326: "OSPF metric\n"
6327: "OSPF metric type for default routes\n")
6328:
6329: ALIAS (ospf_default_information_originate_always_metric_type_routemap,
6330: ospf_default_information_originate_always_cmd,
6331: "default-information originate always",
6332: "Control distribution of default information\n"
6333: "Distribute a default route\n"
6334: "Always advertise default route\n")
6335:
6336: DEFUN (ospf_default_information_originate_always_metric_routemap,
6337: ospf_default_information_originate_always_metric_routemap_cmd,
6338: "default-information originate always metric <0-16777214> route-map WORD",
6339: "Control distribution of default information\n"
6340: "Distribute a default route\n"
6341: "Always advertise default route\n"
6342: "OSPF default metric\n"
6343: "OSPF metric\n"
6344: "Route map reference\n"
6345: "Pointer to route-map entries\n")
6346: {
6347: struct ospf *ospf = vty->index;
6348: int metric = -1;
6349:
6350: /* Get metric value. */
6351: if (argc >= 1)
6352: if (!str2metric (argv[0], &metric))
6353: return CMD_WARNING;
6354:
6355: if (argc == 2)
6356: ospf_routemap_set (ospf, DEFAULT_ROUTE, argv[1]);
6357: else
6358: ospf_routemap_unset (ospf, DEFAULT_ROUTE);
6359:
6360: return ospf_redistribute_default_set (ospf, DEFAULT_ORIGINATE_ALWAYS,
6361: -1, metric);
6362: }
6363:
6364: DEFUN (ospf_default_information_originate_always_routemap,
6365: ospf_default_information_originate_always_routemap_cmd,
6366: "default-information originate always route-map WORD",
6367: "Control distribution of default information\n"
6368: "Distribute a default route\n"
6369: "Always advertise default route\n"
6370: "Route map reference\n"
6371: "Pointer to route-map entries\n")
6372: {
6373: struct ospf *ospf = vty->index;
6374:
6375: if (argc == 1)
6376: ospf_routemap_set (ospf, DEFAULT_ROUTE, argv[0]);
6377: else
6378: ospf_routemap_unset (ospf, DEFAULT_ROUTE);
6379:
6380: return ospf_redistribute_default_set (ospf, DEFAULT_ORIGINATE_ALWAYS, -1, -1);
6381: }
6382:
6383: DEFUN (ospf_default_information_originate_always_type_metric_routemap,
6384: ospf_default_information_originate_always_type_metric_routemap_cmd,
6385: "default-information originate always metric-type (1|2) metric <0-16777214> route-map WORD",
6386: "Control distribution of default information\n"
6387: "Distribute a default route\n"
6388: "Always advertise default route\n"
6389: "OSPF metric type for default routes\n"
6390: "Set OSPF External Type 1 metrics\n"
6391: "Set OSPF External Type 2 metrics\n"
6392: "OSPF default metric\n"
6393: "OSPF metric\n"
6394: "Route map reference\n"
6395: "Pointer to route-map entries\n")
6396: {
6397: struct ospf *ospf = vty->index;
6398: int type = -1;
6399: int metric = -1;
6400:
6401: /* Get metric type. */
6402: if (argc >= 1)
6403: if (!str2metric_type (argv[0], &type))
6404: return CMD_WARNING;
6405:
6406: /* Get metric value. */
6407: if (argc >= 2)
6408: if (!str2metric (argv[1], &metric))
6409: return CMD_WARNING;
6410:
6411: if (argc == 3)
6412: ospf_routemap_set (ospf, DEFAULT_ROUTE, argv[2]);
6413: else
6414: ospf_routemap_unset (ospf, DEFAULT_ROUTE);
6415:
6416: return ospf_redistribute_default_set (ospf, DEFAULT_ORIGINATE_ALWAYS,
6417: type, metric);
6418: }
6419:
6420: ALIAS (ospf_default_information_originate_always_type_metric_routemap,
6421: ospf_default_information_originate_always_type_metric_cmd,
6422: "default-information originate always metric-type (1|2) metric <0-16777214>",
6423: "Control distribution of default information\n"
6424: "Distribute a default route\n"
6425: "Always advertise default route\n"
6426: "OSPF metric type for default routes\n"
6427: "Set OSPF External Type 1 metrics\n"
6428: "Set OSPF External Type 2 metrics\n"
6429: "OSPF default metric\n"
6430: "OSPF metric\n")
6431:
6432: ALIAS (ospf_default_information_originate_always_type_metric_routemap,
6433: ospf_default_information_originate_always_type_cmd,
6434: "default-information originate always metric-type (1|2)",
6435: "Control distribution of default information\n"
6436: "Distribute a default route\n"
6437: "Always advertise default route\n"
6438: "OSPF metric type for default routes\n"
6439: "Set OSPF External Type 1 metrics\n"
6440: "Set OSPF External Type 2 metrics\n")
6441:
6442: DEFUN (ospf_default_information_originate_always_type_routemap,
6443: ospf_default_information_originate_always_type_routemap_cmd,
6444: "default-information originate always metric-type (1|2) route-map WORD",
6445: "Control distribution of default information\n"
6446: "Distribute a default route\n"
6447: "Always advertise default route\n"
6448: "OSPF metric type for default routes\n"
6449: "Set OSPF External Type 1 metrics\n"
6450: "Set OSPF External Type 2 metrics\n"
6451: "Route map reference\n"
6452: "Pointer to route-map entries\n")
6453: {
6454: struct ospf *ospf = vty->index;
6455: int type = -1;
6456:
6457: /* Get metric type. */
6458: if (argc >= 1)
6459: if (!str2metric_type (argv[0], &type))
6460: return CMD_WARNING;
6461:
6462: if (argc == 2)
6463: ospf_routemap_set (ospf, DEFAULT_ROUTE, argv[1]);
6464: else
6465: ospf_routemap_unset (ospf, DEFAULT_ROUTE);
6466:
6467: return ospf_redistribute_default_set (ospf, DEFAULT_ORIGINATE_ALWAYS,
6468: type, -1);
6469: }
6470:
6471: DEFUN (no_ospf_default_information_originate,
6472: no_ospf_default_information_originate_cmd,
6473: "no default-information originate",
6474: NO_STR
6475: "Control distribution of default information\n"
6476: "Distribute a default route\n")
6477: {
6478: struct ospf *ospf = vty->index;
6479: struct prefix_ipv4 p;
6480:
6481: p.family = AF_INET;
6482: p.prefix.s_addr = 0;
6483: p.prefixlen = 0;
6484:
6485: ospf_external_lsa_flush (ospf, DEFAULT_ROUTE, &p, 0);
6486:
6487: if (EXTERNAL_INFO (DEFAULT_ROUTE)) {
6488: ospf_external_info_delete (DEFAULT_ROUTE, p);
6489: route_table_finish (EXTERNAL_INFO (DEFAULT_ROUTE));
6490: EXTERNAL_INFO (DEFAULT_ROUTE) = NULL;
6491: }
6492:
6493: ospf_routemap_unset (ospf, DEFAULT_ROUTE);
6494: return ospf_redistribute_default_unset (ospf);
6495: }
6496:
6497: DEFUN (ospf_default_metric,
6498: ospf_default_metric_cmd,
6499: "default-metric <0-16777214>",
6500: "Set metric of redistributed routes\n"
6501: "Default metric\n")
6502: {
6503: struct ospf *ospf = vty->index;
6504: int metric = -1;
6505:
6506: if (!str2metric (argv[0], &metric))
6507: return CMD_WARNING;
6508:
6509: ospf->default_metric = metric;
6510:
6511: return CMD_SUCCESS;
6512: }
6513:
6514: DEFUN (no_ospf_default_metric,
6515: no_ospf_default_metric_cmd,
6516: "no default-metric",
6517: NO_STR
6518: "Set metric of redistributed routes\n")
6519: {
6520: struct ospf *ospf = vty->index;
6521:
6522: ospf->default_metric = -1;
6523:
6524: return CMD_SUCCESS;
6525: }
6526:
6527: ALIAS (no_ospf_default_metric,
6528: no_ospf_default_metric_val_cmd,
6529: "no default-metric <0-16777214>",
6530: NO_STR
6531: "Set metric of redistributed routes\n"
6532: "Default metric\n")
6533:
6534: DEFUN (ospf_distance,
6535: ospf_distance_cmd,
6536: "distance <1-255>",
6537: "Define an administrative distance\n"
6538: "OSPF Administrative distance\n")
6539: {
6540: struct ospf *ospf = vty->index;
6541:
6542: ospf->distance_all = atoi (argv[0]);
6543:
6544: return CMD_SUCCESS;
6545: }
6546:
6547: DEFUN (no_ospf_distance,
6548: no_ospf_distance_cmd,
6549: "no distance <1-255>",
6550: NO_STR
6551: "Define an administrative distance\n"
6552: "OSPF Administrative distance\n")
6553: {
6554: struct ospf *ospf = vty->index;
6555:
6556: ospf->distance_all = 0;
6557:
6558: return CMD_SUCCESS;
6559: }
6560:
6561: DEFUN (no_ospf_distance_ospf,
6562: no_ospf_distance_ospf_cmd,
6563: "no distance ospf",
6564: NO_STR
6565: "Define an administrative distance\n"
6566: "OSPF Administrative distance\n"
6567: "OSPF Distance\n")
6568: {
6569: struct ospf *ospf = vty->index;
6570:
6571: ospf->distance_intra = 0;
6572: ospf->distance_inter = 0;
6573: ospf->distance_external = 0;
6574:
6575: return CMD_SUCCESS;
6576: }
6577:
6578: DEFUN (ospf_distance_ospf_intra,
6579: ospf_distance_ospf_intra_cmd,
6580: "distance ospf intra-area <1-255>",
6581: "Define an administrative distance\n"
6582: "OSPF Administrative distance\n"
6583: "Intra-area routes\n"
6584: "Distance for intra-area routes\n")
6585: {
6586: struct ospf *ospf = vty->index;
6587:
6588: ospf->distance_intra = atoi (argv[0]);
6589:
6590: return CMD_SUCCESS;
6591: }
6592:
6593: DEFUN (ospf_distance_ospf_intra_inter,
6594: ospf_distance_ospf_intra_inter_cmd,
6595: "distance ospf intra-area <1-255> inter-area <1-255>",
6596: "Define an administrative distance\n"
6597: "OSPF Administrative distance\n"
6598: "Intra-area routes\n"
6599: "Distance for intra-area routes\n"
6600: "Inter-area routes\n"
6601: "Distance for inter-area routes\n")
6602: {
6603: struct ospf *ospf = vty->index;
6604:
6605: ospf->distance_intra = atoi (argv[0]);
6606: ospf->distance_inter = atoi (argv[1]);
6607:
6608: return CMD_SUCCESS;
6609: }
6610:
6611: DEFUN (ospf_distance_ospf_intra_external,
6612: ospf_distance_ospf_intra_external_cmd,
6613: "distance ospf intra-area <1-255> external <1-255>",
6614: "Define an administrative distance\n"
6615: "OSPF Administrative distance\n"
6616: "Intra-area routes\n"
6617: "Distance for intra-area routes\n"
6618: "External routes\n"
6619: "Distance for external routes\n")
6620: {
6621: struct ospf *ospf = vty->index;
6622:
6623: ospf->distance_intra = atoi (argv[0]);
6624: ospf->distance_external = atoi (argv[1]);
6625:
6626: return CMD_SUCCESS;
6627: }
6628:
6629: DEFUN (ospf_distance_ospf_intra_inter_external,
6630: ospf_distance_ospf_intra_inter_external_cmd,
6631: "distance ospf intra-area <1-255> inter-area <1-255> external <1-255>",
6632: "Define an administrative distance\n"
6633: "OSPF Administrative distance\n"
6634: "Intra-area routes\n"
6635: "Distance for intra-area routes\n"
6636: "Inter-area routes\n"
6637: "Distance for inter-area routes\n"
6638: "External routes\n"
6639: "Distance for external routes\n")
6640: {
6641: struct ospf *ospf = vty->index;
6642:
6643: ospf->distance_intra = atoi (argv[0]);
6644: ospf->distance_inter = atoi (argv[1]);
6645: ospf->distance_external = atoi (argv[2]);
6646:
6647: return CMD_SUCCESS;
6648: }
6649:
6650: DEFUN (ospf_distance_ospf_intra_external_inter,
6651: ospf_distance_ospf_intra_external_inter_cmd,
6652: "distance ospf intra-area <1-255> external <1-255> inter-area <1-255>",
6653: "Define an administrative distance\n"
6654: "OSPF Administrative distance\n"
6655: "Intra-area routes\n"
6656: "Distance for intra-area routes\n"
6657: "External routes\n"
6658: "Distance for external routes\n"
6659: "Inter-area routes\n"
6660: "Distance for inter-area routes\n")
6661: {
6662: struct ospf *ospf = vty->index;
6663:
6664: ospf->distance_intra = atoi (argv[0]);
6665: ospf->distance_external = atoi (argv[1]);
6666: ospf->distance_inter = atoi (argv[2]);
6667:
6668: return CMD_SUCCESS;
6669: }
6670:
6671: DEFUN (ospf_distance_ospf_inter,
6672: ospf_distance_ospf_inter_cmd,
6673: "distance ospf inter-area <1-255>",
6674: "Define an administrative distance\n"
6675: "OSPF Administrative distance\n"
6676: "Inter-area routes\n"
6677: "Distance for inter-area routes\n")
6678: {
6679: struct ospf *ospf = vty->index;
6680:
6681: ospf->distance_inter = atoi (argv[0]);
6682:
6683: return CMD_SUCCESS;
6684: }
6685:
6686: DEFUN (ospf_distance_ospf_inter_intra,
6687: ospf_distance_ospf_inter_intra_cmd,
6688: "distance ospf inter-area <1-255> intra-area <1-255>",
6689: "Define an administrative distance\n"
6690: "OSPF Administrative distance\n"
6691: "Inter-area routes\n"
6692: "Distance for inter-area routes\n"
6693: "Intra-area routes\n"
6694: "Distance for intra-area routes\n")
6695: {
6696: struct ospf *ospf = vty->index;
6697:
6698: ospf->distance_inter = atoi (argv[0]);
6699: ospf->distance_intra = atoi (argv[1]);
6700:
6701: return CMD_SUCCESS;
6702: }
6703:
6704: DEFUN (ospf_distance_ospf_inter_external,
6705: ospf_distance_ospf_inter_external_cmd,
6706: "distance ospf inter-area <1-255> external <1-255>",
6707: "Define an administrative distance\n"
6708: "OSPF Administrative distance\n"
6709: "Inter-area routes\n"
6710: "Distance for inter-area routes\n"
6711: "External routes\n"
6712: "Distance for external routes\n")
6713: {
6714: struct ospf *ospf = vty->index;
6715:
6716: ospf->distance_inter = atoi (argv[0]);
6717: ospf->distance_external = atoi (argv[1]);
6718:
6719: return CMD_SUCCESS;
6720: }
6721:
6722: DEFUN (ospf_distance_ospf_inter_intra_external,
6723: ospf_distance_ospf_inter_intra_external_cmd,
6724: "distance ospf inter-area <1-255> intra-area <1-255> external <1-255>",
6725: "Define an administrative distance\n"
6726: "OSPF Administrative distance\n"
6727: "Inter-area routes\n"
6728: "Distance for inter-area routes\n"
6729: "Intra-area routes\n"
6730: "Distance for intra-area routes\n"
6731: "External routes\n"
6732: "Distance for external routes\n")
6733: {
6734: struct ospf *ospf = vty->index;
6735:
6736: ospf->distance_inter = atoi (argv[0]);
6737: ospf->distance_intra = atoi (argv[1]);
6738: ospf->distance_external = atoi (argv[2]);
6739:
6740: return CMD_SUCCESS;
6741: }
6742:
6743: DEFUN (ospf_distance_ospf_inter_external_intra,
6744: ospf_distance_ospf_inter_external_intra_cmd,
6745: "distance ospf inter-area <1-255> external <1-255> intra-area <1-255>",
6746: "Define an administrative distance\n"
6747: "OSPF Administrative distance\n"
6748: "Inter-area routes\n"
6749: "Distance for inter-area routes\n"
6750: "External routes\n"
6751: "Distance for external routes\n"
6752: "Intra-area routes\n"
6753: "Distance for intra-area routes\n")
6754: {
6755: struct ospf *ospf = vty->index;
6756:
6757: ospf->distance_inter = atoi (argv[0]);
6758: ospf->distance_external = atoi (argv[1]);
6759: ospf->distance_intra = atoi (argv[2]);
6760:
6761: return CMD_SUCCESS;
6762: }
6763:
6764: DEFUN (ospf_distance_ospf_external,
6765: ospf_distance_ospf_external_cmd,
6766: "distance ospf external <1-255>",
6767: "Define an administrative distance\n"
6768: "OSPF Administrative distance\n"
6769: "External routes\n"
6770: "Distance for external routes\n")
6771: {
6772: struct ospf *ospf = vty->index;
6773:
6774: ospf->distance_external = atoi (argv[0]);
6775:
6776: return CMD_SUCCESS;
6777: }
6778:
6779: DEFUN (ospf_distance_ospf_external_intra,
6780: ospf_distance_ospf_external_intra_cmd,
6781: "distance ospf external <1-255> intra-area <1-255>",
6782: "Define an administrative distance\n"
6783: "OSPF Administrative distance\n"
6784: "External routes\n"
6785: "Distance for external routes\n"
6786: "Intra-area routes\n"
6787: "Distance for intra-area routes\n")
6788: {
6789: struct ospf *ospf = vty->index;
6790:
6791: ospf->distance_external = atoi (argv[0]);
6792: ospf->distance_intra = atoi (argv[1]);
6793:
6794: return CMD_SUCCESS;
6795: }
6796:
6797: DEFUN (ospf_distance_ospf_external_inter,
6798: ospf_distance_ospf_external_inter_cmd,
6799: "distance ospf external <1-255> inter-area <1-255>",
6800: "Define an administrative distance\n"
6801: "OSPF Administrative distance\n"
6802: "External routes\n"
6803: "Distance for external routes\n"
6804: "Inter-area routes\n"
6805: "Distance for inter-area routes\n")
6806: {
6807: struct ospf *ospf = vty->index;
6808:
6809: ospf->distance_external = atoi (argv[0]);
6810: ospf->distance_inter = atoi (argv[1]);
6811:
6812: return CMD_SUCCESS;
6813: }
6814:
6815: DEFUN (ospf_distance_ospf_external_intra_inter,
6816: ospf_distance_ospf_external_intra_inter_cmd,
6817: "distance ospf external <1-255> intra-area <1-255> inter-area <1-255>",
6818: "Define an administrative distance\n"
6819: "OSPF Administrative distance\n"
6820: "External routes\n"
6821: "Distance for external routes\n"
6822: "Intra-area routes\n"
6823: "Distance for intra-area routes\n"
6824: "Inter-area routes\n"
6825: "Distance for inter-area routes\n")
6826: {
6827: struct ospf *ospf = vty->index;
6828:
6829: ospf->distance_external = atoi (argv[0]);
6830: ospf->distance_intra = atoi (argv[1]);
6831: ospf->distance_inter = atoi (argv[2]);
6832:
6833: return CMD_SUCCESS;
6834: }
6835:
6836: DEFUN (ospf_distance_ospf_external_inter_intra,
6837: ospf_distance_ospf_external_inter_intra_cmd,
6838: "distance ospf external <1-255> inter-area <1-255> intra-area <1-255>",
6839: "Define an administrative distance\n"
6840: "OSPF Administrative distance\n"
6841: "External routes\n"
6842: "Distance for external routes\n"
6843: "Inter-area routes\n"
6844: "Distance for inter-area routes\n"
6845: "Intra-area routes\n"
6846: "Distance for intra-area routes\n")
6847: {
6848: struct ospf *ospf = vty->index;
6849:
6850: ospf->distance_external = atoi (argv[0]);
6851: ospf->distance_inter = atoi (argv[1]);
6852: ospf->distance_intra = atoi (argv[2]);
6853:
6854: return CMD_SUCCESS;
6855: }
6856:
6857: DEFUN (ospf_distance_source,
6858: ospf_distance_source_cmd,
6859: "distance <1-255> A.B.C.D/M",
6860: "Administrative distance\n"
6861: "Distance value\n"
6862: "IP source prefix\n")
6863: {
6864: struct ospf *ospf = vty->index;
6865:
6866: ospf_distance_set (vty, ospf, argv[0], argv[1], NULL);
6867:
6868: return CMD_SUCCESS;
6869: }
6870:
6871: DEFUN (no_ospf_distance_source,
6872: no_ospf_distance_source_cmd,
6873: "no distance <1-255> A.B.C.D/M",
6874: NO_STR
6875: "Administrative distance\n"
6876: "Distance value\n"
6877: "IP source prefix\n")
6878: {
6879: struct ospf *ospf = vty->index;
6880:
6881: ospf_distance_unset (vty, ospf, argv[0], argv[1], NULL);
6882:
6883: return CMD_SUCCESS;
6884: }
6885:
6886: DEFUN (ospf_distance_source_access_list,
6887: ospf_distance_source_access_list_cmd,
6888: "distance <1-255> A.B.C.D/M WORD",
6889: "Administrative distance\n"
6890: "Distance value\n"
6891: "IP source prefix\n"
6892: "Access list name\n")
6893: {
6894: struct ospf *ospf = vty->index;
6895:
6896: ospf_distance_set (vty, ospf, argv[0], argv[1], argv[2]);
6897:
6898: return CMD_SUCCESS;
6899: }
6900:
6901: DEFUN (no_ospf_distance_source_access_list,
6902: no_ospf_distance_source_access_list_cmd,
6903: "no distance <1-255> A.B.C.D/M WORD",
6904: NO_STR
6905: "Administrative distance\n"
6906: "Distance value\n"
6907: "IP source prefix\n"
6908: "Access list name\n")
6909: {
6910: struct ospf *ospf = vty->index;
6911:
6912: ospf_distance_unset (vty, ospf, argv[0], argv[1], argv[2]);
6913:
6914: return CMD_SUCCESS;
6915: }
6916:
6917: DEFUN (ip_ospf_mtu_ignore,
6918: ip_ospf_mtu_ignore_addr_cmd,
6919: "ip ospf mtu-ignore A.B.C.D",
6920: "IP Information\n"
6921: "OSPF interface commands\n"
6922: "Disable mtu mismatch detection\n"
6923: "Address of interface")
6924: {
6925: struct interface *ifp = vty->index;
6926: struct in_addr addr;
6927: int ret;
6928:
6929: struct ospf_if_params *params;
6930: params = IF_DEF_PARAMS (ifp);
6931:
6932: if (argc == 1)
6933: {
6934: ret = inet_aton(argv[0], &addr);
6935: if (!ret)
6936: {
6937: vty_out (vty, "Please specify interface address by A.B.C.D%s",
6938: VTY_NEWLINE);
6939: return CMD_WARNING;
6940: }
6941: params = ospf_get_if_params (ifp, addr);
6942: ospf_if_update_params (ifp, addr);
6943: }
6944: params->mtu_ignore = 1;
6945: if (params->mtu_ignore != OSPF_MTU_IGNORE_DEFAULT)
6946: SET_IF_PARAM (params, mtu_ignore);
6947: else
6948: {
6949: UNSET_IF_PARAM (params, mtu_ignore);
6950: if (params != IF_DEF_PARAMS (ifp))
6951: {
6952: ospf_free_if_params (ifp, addr);
6953: ospf_if_update_params (ifp, addr);
6954: }
6955: }
6956: return CMD_SUCCESS;
6957: }
6958:
6959: ALIAS (ip_ospf_mtu_ignore,
6960: ip_ospf_mtu_ignore_cmd,
6961: "ip ospf mtu-ignore",
6962: "IP Information\n"
6963: "OSPF interface commands\n"
6964: "Disable mtu mismatch detection\n")
6965:
6966:
6967: DEFUN (no_ip_ospf_mtu_ignore,
6968: no_ip_ospf_mtu_ignore_addr_cmd,
6969: "no ip ospf mtu-ignore A.B.C.D",
6970: "IP Information\n"
6971: "OSPF interface commands\n"
6972: "Disable mtu mismatch detection\n"
6973: "Address of interface")
6974: {
6975: struct interface *ifp = vty->index;
6976: struct in_addr addr;
6977: int ret;
6978:
6979: struct ospf_if_params *params;
6980: params = IF_DEF_PARAMS (ifp);
6981:
6982: if (argc == 1)
6983: {
6984: ret = inet_aton(argv[0], &addr);
6985: if (!ret)
6986: {
6987: vty_out (vty, "Please specify interface address by A.B.C.D%s",
6988: VTY_NEWLINE);
6989: return CMD_WARNING;
6990: }
6991: params = ospf_get_if_params (ifp, addr);
6992: ospf_if_update_params (ifp, addr);
6993: }
6994: params->mtu_ignore = 0;
6995: if (params->mtu_ignore != OSPF_MTU_IGNORE_DEFAULT)
6996: SET_IF_PARAM (params, mtu_ignore);
6997: else
6998: {
6999: UNSET_IF_PARAM (params, mtu_ignore);
7000: if (params != IF_DEF_PARAMS (ifp))
7001: {
7002: ospf_free_if_params (ifp, addr);
7003: ospf_if_update_params (ifp, addr);
7004: }
7005: }
7006: return CMD_SUCCESS;
7007: }
7008:
7009: ALIAS (no_ip_ospf_mtu_ignore,
7010: no_ip_ospf_mtu_ignore_cmd,
7011: "no ip ospf mtu-ignore",
7012: "IP Information\n"
7013: "OSPF interface commands\n"
7014: "Disable mtu mismatch detection\n")
7015:
7016: DEFUN (ospf_max_metric_router_lsa_admin,
7017: ospf_max_metric_router_lsa_admin_cmd,
7018: "max-metric router-lsa administrative",
7019: "OSPF maximum / infinite-distance metric\n"
7020: "Advertise own Router-LSA with infinite distance (stub router)\n"
7021: "Administratively applied, for an indefinite period\n")
7022: {
7023: struct listnode *ln;
7024: struct ospf_area *area;
7025: struct ospf *ospf = vty->index;
7026:
7027: for (ALL_LIST_ELEMENTS_RO (ospf->areas, ln, area))
7028: {
7029: SET_FLAG (area->stub_router_state, OSPF_AREA_ADMIN_STUB_ROUTED);
7030:
7031: if (!CHECK_FLAG (area->stub_router_state, OSPF_AREA_IS_STUB_ROUTED))
7032: ospf_router_lsa_update_area (area);
7033: }
7034: return CMD_SUCCESS;
7035: }
7036:
7037: DEFUN (no_ospf_max_metric_router_lsa_admin,
7038: no_ospf_max_metric_router_lsa_admin_cmd,
7039: "no max-metric router-lsa administrative",
7040: NO_STR
7041: "OSPF maximum / infinite-distance metric\n"
7042: "Advertise own Router-LSA with infinite distance (stub router)\n"
7043: "Administratively applied, for an indefinite period\n")
7044: {
7045: struct listnode *ln;
7046: struct ospf_area *area;
7047: struct ospf *ospf = vty->index;
7048:
7049: for (ALL_LIST_ELEMENTS_RO (ospf->areas, ln, area))
7050: {
7051: UNSET_FLAG (area->stub_router_state, OSPF_AREA_ADMIN_STUB_ROUTED);
7052:
7053: /* Don't trample on the start-up stub timer */
7054: if (CHECK_FLAG (area->stub_router_state, OSPF_AREA_IS_STUB_ROUTED)
7055: && !area->t_stub_router)
7056: {
7057: UNSET_FLAG (area->stub_router_state, OSPF_AREA_IS_STUB_ROUTED);
7058: ospf_router_lsa_update_area (area);
7059: }
7060: }
7061: return CMD_SUCCESS;
7062: }
7063:
7064: DEFUN (ospf_max_metric_router_lsa_startup,
7065: ospf_max_metric_router_lsa_startup_cmd,
7066: "max-metric router-lsa on-startup <5-86400>",
7067: "OSPF maximum / infinite-distance metric\n"
7068: "Advertise own Router-LSA with infinite distance (stub router)\n"
7069: "Automatically advertise stub Router-LSA on startup of OSPF\n"
7070: "Time (seconds) to advertise self as stub-router\n")
7071: {
7072: unsigned int seconds;
7073: struct ospf *ospf = vty->index;
7074:
7075: if (argc != 1)
7076: {
7077: vty_out (vty, "%% Must supply stub-router period");
7078: return CMD_WARNING;
7079: }
7080:
7081: VTY_GET_INTEGER ("stub-router startup period", seconds, argv[0]);
7082:
7083: ospf->stub_router_startup_time = seconds;
7084:
7085: return CMD_SUCCESS;
7086: }
7087:
7088: DEFUN (no_ospf_max_metric_router_lsa_startup,
7089: no_ospf_max_metric_router_lsa_startup_cmd,
7090: "no max-metric router-lsa on-startup",
7091: NO_STR
7092: "OSPF maximum / infinite-distance metric\n"
7093: "Advertise own Router-LSA with infinite distance (stub router)\n"
7094: "Automatically advertise stub Router-LSA on startup of OSPF\n")
7095: {
7096: struct listnode *ln;
7097: struct ospf_area *area;
7098: struct ospf *ospf = vty->index;
7099:
7100: ospf->stub_router_startup_time = OSPF_STUB_ROUTER_UNCONFIGURED;
7101:
7102: for (ALL_LIST_ELEMENTS_RO (ospf->areas, ln, area))
7103: {
7104: SET_FLAG (area->stub_router_state, OSPF_AREA_WAS_START_STUB_ROUTED);
7105: OSPF_TIMER_OFF (area->t_stub_router);
7106:
7107: /* Don't trample on admin stub routed */
7108: if (!CHECK_FLAG (area->stub_router_state, OSPF_AREA_ADMIN_STUB_ROUTED))
7109: {
7110: UNSET_FLAG (area->stub_router_state, OSPF_AREA_IS_STUB_ROUTED);
7111: ospf_router_lsa_update_area (area);
7112: }
7113: }
7114: return CMD_SUCCESS;
7115: }
7116:
7117: DEFUN (ospf_max_metric_router_lsa_shutdown,
7118: ospf_max_metric_router_lsa_shutdown_cmd,
7119: "max-metric router-lsa on-shutdown <5-86400>",
7120: "OSPF maximum / infinite-distance metric\n"
7121: "Advertise own Router-LSA with infinite distance (stub router)\n"
7122: "Advertise stub-router prior to full shutdown of OSPF\n"
7123: "Time (seconds) to wait till full shutdown\n")
7124: {
7125: unsigned int seconds;
7126: struct ospf *ospf = vty->index;
7127:
7128: if (argc != 1)
7129: {
7130: vty_out (vty, "%% Must supply stub-router shutdown period");
7131: return CMD_WARNING;
7132: }
7133:
7134: VTY_GET_INTEGER ("stub-router shutdown wait period", seconds, argv[0]);
7135:
7136: ospf->stub_router_shutdown_time = seconds;
7137:
7138: return CMD_SUCCESS;
7139: }
7140:
7141: DEFUN (no_ospf_max_metric_router_lsa_shutdown,
7142: no_ospf_max_metric_router_lsa_shutdown_cmd,
7143: "no max-metric router-lsa on-shutdown",
7144: NO_STR
7145: "OSPF maximum / infinite-distance metric\n"
7146: "Advertise own Router-LSA with infinite distance (stub router)\n"
7147: "Advertise stub-router prior to full shutdown of OSPF\n")
7148: {
7149: struct ospf *ospf = vty->index;
7150:
7151: ospf->stub_router_shutdown_time = OSPF_STUB_ROUTER_UNCONFIGURED;
7152:
7153: return CMD_SUCCESS;
7154: }
7155:
7156: static void
7157: config_write_stub_router (struct vty *vty, struct ospf *ospf)
7158: {
7159: struct listnode *ln;
7160: struct ospf_area *area;
7161:
7162: if (ospf->stub_router_startup_time != OSPF_STUB_ROUTER_UNCONFIGURED)
7163: vty_out (vty, " max-metric router-lsa on-startup %u%s",
7164: ospf->stub_router_startup_time, VTY_NEWLINE);
7165: if (ospf->stub_router_shutdown_time != OSPF_STUB_ROUTER_UNCONFIGURED)
7166: vty_out (vty, " max-metric router-lsa on-shutdown %u%s",
7167: ospf->stub_router_shutdown_time, VTY_NEWLINE);
7168: for (ALL_LIST_ELEMENTS_RO (ospf->areas, ln, area))
7169: {
7170: if (CHECK_FLAG (area->stub_router_state, OSPF_AREA_ADMIN_STUB_ROUTED))
7171: {
7172: vty_out (vty, " max-metric router-lsa administrative%s",
7173: VTY_NEWLINE);
7174: break;
7175: }
7176: }
7177: return;
7178: }
7179:
7180: static void
7181: show_ip_ospf_route_network (struct vty *vty, struct route_table *rt)
7182: {
7183: struct route_node *rn;
7184: struct ospf_route *or;
7185: struct listnode *pnode, *pnnode;
7186: struct ospf_path *path;
7187:
7188: vty_out (vty, "============ OSPF network routing table ============%s",
7189: VTY_NEWLINE);
7190:
7191: for (rn = route_top (rt); rn; rn = route_next (rn))
7192: if ((or = rn->info) != NULL)
7193: {
7194: char buf1[19];
7195: snprintf (buf1, 19, "%s/%d",
7196: inet_ntoa (rn->p.u.prefix4), rn->p.prefixlen);
7197:
7198: switch (or->path_type)
7199: {
7200: case OSPF_PATH_INTER_AREA:
7201: if (or->type == OSPF_DESTINATION_NETWORK)
7202: vty_out (vty, "N IA %-18s [%d] area: %s%s", buf1, or->cost,
7203: inet_ntoa (or->u.std.area_id), VTY_NEWLINE);
7204: else if (or->type == OSPF_DESTINATION_DISCARD)
7205: vty_out (vty, "D IA %-18s Discard entry%s", buf1, VTY_NEWLINE);
7206: break;
7207: case OSPF_PATH_INTRA_AREA:
7208: vty_out (vty, "N %-18s [%d] area: %s%s", buf1, or->cost,
7209: inet_ntoa (or->u.std.area_id), VTY_NEWLINE);
7210: break;
7211: default:
7212: break;
7213: }
7214:
7215: if (or->type == OSPF_DESTINATION_NETWORK)
7216: for (ALL_LIST_ELEMENTS (or->paths, pnode, pnnode, path))
7217: {
7218: if (if_lookup_by_index(path->ifindex))
7219: {
7220: if (path->nexthop.s_addr == 0)
7221: vty_out (vty, "%24s directly attached to %s%s",
7222: "", ifindex2ifname (path->ifindex), VTY_NEWLINE);
7223: else
7224: vty_out (vty, "%24s via %s, %s%s", "",
7225: inet_ntoa (path->nexthop),
7226: ifindex2ifname (path->ifindex), VTY_NEWLINE);
7227: }
7228: }
7229: }
7230: vty_out (vty, "%s", VTY_NEWLINE);
7231: }
7232:
7233: static void
7234: show_ip_ospf_route_router (struct vty *vty, struct route_table *rtrs)
7235: {
7236: struct route_node *rn;
7237: struct ospf_route *or;
7238: struct listnode *pnode;
7239: struct listnode *node;
7240: struct ospf_path *path;
7241:
7242: vty_out (vty, "============ OSPF router routing table =============%s",
7243: VTY_NEWLINE);
7244: for (rn = route_top (rtrs); rn; rn = route_next (rn))
7245: if (rn->info)
7246: {
7247: int flag = 0;
7248:
7249: vty_out (vty, "R %-15s ", inet_ntoa (rn->p.u.prefix4));
7250:
7251: for (ALL_LIST_ELEMENTS_RO ((struct list *)rn->info, node, or))
7252: {
7253: if (flag++)
7254: vty_out (vty, "%24s", "");
7255:
7256: /* Show path. */
7257: vty_out (vty, "%s [%d] area: %s",
7258: (or->path_type == OSPF_PATH_INTER_AREA ? "IA" : " "),
7259: or->cost, inet_ntoa (or->u.std.area_id));
7260: /* Show flags. */
7261: vty_out (vty, "%s%s%s",
7262: (or->u.std.flags & ROUTER_LSA_BORDER ? ", ABR" : ""),
7263: (or->u.std.flags & ROUTER_LSA_EXTERNAL ? ", ASBR" : ""),
7264: VTY_NEWLINE);
7265:
7266: for (ALL_LIST_ELEMENTS_RO (or->paths, pnode, path))
7267: {
7268: if (if_lookup_by_index(path->ifindex))
7269: {
7270: if (path->nexthop.s_addr == 0)
7271: vty_out (vty, "%24s directly attached to %s%s",
7272: "", ifindex2ifname (path->ifindex),
7273: VTY_NEWLINE);
7274: else
7275: vty_out (vty, "%24s via %s, %s%s", "",
7276: inet_ntoa (path->nexthop),
7277: ifindex2ifname (path->ifindex),
7278: VTY_NEWLINE);
7279: }
7280: }
7281: }
7282: }
7283: vty_out (vty, "%s", VTY_NEWLINE);
7284: }
7285:
7286: static void
7287: show_ip_ospf_route_external (struct vty *vty, struct route_table *rt)
7288: {
7289: struct route_node *rn;
7290: struct ospf_route *er;
7291: struct listnode *pnode, *pnnode;
7292: struct ospf_path *path;
7293:
7294: vty_out (vty, "============ OSPF external routing table ===========%s",
7295: VTY_NEWLINE);
7296: for (rn = route_top (rt); rn; rn = route_next (rn))
7297: if ((er = rn->info) != NULL)
7298: {
7299: char buf1[19];
7300: snprintf (buf1, 19, "%s/%d",
7301: inet_ntoa (rn->p.u.prefix4), rn->p.prefixlen);
7302:
7303: switch (er->path_type)
7304: {
7305: case OSPF_PATH_TYPE1_EXTERNAL:
7306: vty_out (vty, "N E1 %-18s [%d] tag: %u%s", buf1,
7307: er->cost, er->u.ext.tag, VTY_NEWLINE);
7308: break;
7309: case OSPF_PATH_TYPE2_EXTERNAL:
7310: vty_out (vty, "N E2 %-18s [%d/%d] tag: %u%s", buf1, er->cost,
7311: er->u.ext.type2_cost, er->u.ext.tag, VTY_NEWLINE);
7312: break;
7313: }
7314:
7315: for (ALL_LIST_ELEMENTS (er->paths, pnode, pnnode, path))
7316: {
7317: if (if_lookup_by_index(path->ifindex))
7318: {
7319: if (path->nexthop.s_addr == 0)
7320: vty_out (vty, "%24s directly attached to %s%s",
7321: "", ifindex2ifname (path->ifindex), VTY_NEWLINE);
7322: else
7323: vty_out (vty, "%24s via %s, %s%s", "",
7324: inet_ntoa (path->nexthop),
7325: ifindex2ifname (path->ifindex),
7326: VTY_NEWLINE);
7327: }
7328: }
7329: }
7330: vty_out (vty, "%s", VTY_NEWLINE);
7331: }
7332:
7333: DEFUN (show_ip_ospf_border_routers,
7334: show_ip_ospf_border_routers_cmd,
7335: "show ip ospf border-routers",
7336: SHOW_STR
7337: IP_STR
7338: "show all the ABR's and ASBR's\n"
7339: "for this area\n")
7340: {
7341: struct ospf *ospf;
7342:
7343: if ((ospf = ospf_lookup ()) == NULL)
7344: {
7345: vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
7346: return CMD_SUCCESS;
7347: }
7348:
7349: if (ospf->new_table == NULL)
7350: {
7351: vty_out (vty, "No OSPF routing information exist%s", VTY_NEWLINE);
7352: return CMD_SUCCESS;
7353: }
7354:
7355: /* Show Network routes.
7356: show_ip_ospf_route_network (vty, ospf->new_table); */
7357:
7358: /* Show Router routes. */
7359: show_ip_ospf_route_router (vty, ospf->new_rtrs);
7360:
7361: return CMD_SUCCESS;
7362: }
7363:
7364: DEFUN (show_ip_ospf_route,
7365: show_ip_ospf_route_cmd,
7366: "show ip ospf route",
7367: SHOW_STR
7368: IP_STR
7369: "OSPF information\n"
7370: "OSPF routing table\n")
7371: {
7372: struct ospf *ospf;
7373:
7374: if ((ospf = ospf_lookup ()) == NULL)
7375: {
7376: vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
7377: return CMD_SUCCESS;
7378: }
7379:
7380: if (ospf->new_table == NULL)
7381: {
7382: vty_out (vty, "No OSPF routing information exist%s", VTY_NEWLINE);
7383: return CMD_SUCCESS;
7384: }
7385:
7386: /* Show Network routes. */
7387: show_ip_ospf_route_network (vty, ospf->new_table);
7388:
7389: /* Show Router routes. */
7390: show_ip_ospf_route_router (vty, ospf->new_rtrs);
7391:
7392: /* Show AS External routes. */
7393: show_ip_ospf_route_external (vty, ospf->old_external_route);
7394:
7395: return CMD_SUCCESS;
7396: }
7397:
7398:
7399: const char *ospf_abr_type_str[] =
7400: {
7401: "unknown",
7402: "standard",
7403: "ibm",
7404: "cisco",
7405: "shortcut"
7406: };
7407:
7408: const char *ospf_shortcut_mode_str[] =
7409: {
7410: "default",
7411: "enable",
7412: "disable"
7413: };
7414:
7415:
7416: static void
7417: area_id2str (char *buf, int length, struct ospf_area *area)
7418: {
7419: memset (buf, 0, length);
7420:
7421: if (area->format == OSPF_AREA_ID_FORMAT_ADDRESS)
7422: strncpy (buf, inet_ntoa (area->area_id), length);
7423: else
7424: sprintf (buf, "%lu", (unsigned long) ntohl (area->area_id.s_addr));
7425: }
7426:
7427:
7428: const char *ospf_int_type_str[] =
7429: {
7430: "unknown", /* should never be used. */
7431: "point-to-point",
7432: "broadcast",
7433: "non-broadcast",
7434: "point-to-multipoint",
7435: "virtual-link", /* should never be used. */
7436: "loopback"
7437: };
7438:
7439: /* Configuration write function for ospfd. */
7440: static int
7441: config_write_interface (struct vty *vty)
7442: {
7443: struct listnode *n1, *n2;
7444: struct interface *ifp;
7445: struct crypt_key *ck;
7446: int write = 0;
7447: struct route_node *rn = NULL;
7448: struct ospf_if_params *params;
7449:
7450: for (ALL_LIST_ELEMENTS_RO (iflist, n1, ifp))
7451: {
7452: if (memcmp (ifp->name, "VLINK", 5) == 0)
7453: continue;
7454:
7455: vty_out (vty, "!%s", VTY_NEWLINE);
7456: vty_out (vty, "interface %s%s", ifp->name,
7457: VTY_NEWLINE);
7458: if (ifp->desc)
7459: vty_out (vty, " description %s%s", ifp->desc,
7460: VTY_NEWLINE);
7461:
7462: write++;
7463:
7464: params = IF_DEF_PARAMS (ifp);
7465:
7466: do {
7467: /* Interface Network print. */
7468: if (OSPF_IF_PARAM_CONFIGURED (params, type) &&
7469: params->type != OSPF_IFTYPE_LOOPBACK)
7470: {
7471: if (params->type != ospf_default_iftype(ifp))
7472: {
7473: vty_out (vty, " ip ospf network %s",
7474: ospf_int_type_str[params->type]);
7475: if (params != IF_DEF_PARAMS (ifp))
7476: vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
7477: vty_out (vty, "%s", VTY_NEWLINE);
7478: }
7479: }
7480:
7481: /* OSPF interface authentication print */
7482: if (OSPF_IF_PARAM_CONFIGURED (params, auth_type) &&
7483: params->auth_type != OSPF_AUTH_NOTSET)
7484: {
7485: const char *auth_str;
7486:
7487: /* Translation tables are not that much help here due to syntax
7488: of the simple option */
7489: switch (params->auth_type)
7490: {
7491:
7492: case OSPF_AUTH_NULL:
7493: auth_str = " null";
7494: break;
7495:
7496: case OSPF_AUTH_SIMPLE:
7497: auth_str = "";
7498: break;
7499:
7500: case OSPF_AUTH_CRYPTOGRAPHIC:
7501: auth_str = " message-digest";
7502: break;
7503:
7504: default:
7505: auth_str = "";
7506: break;
7507: }
7508:
7509: vty_out (vty, " ip ospf authentication%s", auth_str);
7510: if (params != IF_DEF_PARAMS (ifp))
7511: vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
7512: vty_out (vty, "%s", VTY_NEWLINE);
7513: }
7514:
7515: /* Simple Authentication Password print. */
7516: if (OSPF_IF_PARAM_CONFIGURED (params, auth_simple) &&
7517: params->auth_simple[0] != '\0')
7518: {
7519: vty_out (vty, " ip ospf authentication-key %s",
7520: params->auth_simple);
7521: if (params != IF_DEF_PARAMS (ifp))
7522: vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
7523: vty_out (vty, "%s", VTY_NEWLINE);
7524: }
7525:
7526: /* Cryptographic Authentication Key print. */
7527: for (ALL_LIST_ELEMENTS_RO (params->auth_crypt, n2, ck))
7528: {
7529: vty_out (vty, " ip ospf message-digest-key %d md5 %s",
7530: ck->key_id, ck->auth_key);
7531: if (params != IF_DEF_PARAMS (ifp))
7532: vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
7533: vty_out (vty, "%s", VTY_NEWLINE);
7534: }
7535:
7536: /* Interface Output Cost print. */
7537: if (OSPF_IF_PARAM_CONFIGURED (params, output_cost_cmd))
7538: {
7539: vty_out (vty, " ip ospf cost %u", params->output_cost_cmd);
7540: if (params != IF_DEF_PARAMS (ifp))
7541: vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
7542: vty_out (vty, "%s", VTY_NEWLINE);
7543: }
7544:
7545: /* Hello Interval print. */
7546: if (OSPF_IF_PARAM_CONFIGURED (params, v_hello) &&
7547: params->v_hello != OSPF_HELLO_INTERVAL_DEFAULT)
7548: {
7549: vty_out (vty, " ip ospf hello-interval %u", params->v_hello);
7550: if (params != IF_DEF_PARAMS (ifp))
7551: vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
7552: vty_out (vty, "%s", VTY_NEWLINE);
7553: }
7554:
7555:
7556: /* Router Dead Interval print. */
7557: if (OSPF_IF_PARAM_CONFIGURED (params, v_wait) &&
7558: params->v_wait != OSPF_ROUTER_DEAD_INTERVAL_DEFAULT)
7559: {
7560: vty_out (vty, " ip ospf dead-interval ");
7561:
7562: /* fast hello ? */
7563: if (OSPF_IF_PARAM_CONFIGURED (params, fast_hello))
7564: vty_out (vty, "minimal hello-multiplier %d",
7565: params->fast_hello);
7566: else
7567: vty_out (vty, "%u", params->v_wait);
7568:
7569: if (params != IF_DEF_PARAMS (ifp))
7570: vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
7571: vty_out (vty, "%s", VTY_NEWLINE);
7572: }
7573:
7574: /* Router Priority print. */
7575: if (OSPF_IF_PARAM_CONFIGURED (params, priority) &&
7576: params->priority != OSPF_ROUTER_PRIORITY_DEFAULT)
7577: {
7578: vty_out (vty, " ip ospf priority %u", params->priority);
7579: if (params != IF_DEF_PARAMS (ifp))
7580: vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
7581: vty_out (vty, "%s", VTY_NEWLINE);
7582: }
7583:
7584: /* Retransmit Interval print. */
7585: if (OSPF_IF_PARAM_CONFIGURED (params, retransmit_interval) &&
7586: params->retransmit_interval != OSPF_RETRANSMIT_INTERVAL_DEFAULT)
7587: {
7588: vty_out (vty, " ip ospf retransmit-interval %u",
7589: params->retransmit_interval);
7590: if (params != IF_DEF_PARAMS (ifp))
7591: vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
7592: vty_out (vty, "%s", VTY_NEWLINE);
7593: }
7594:
7595: /* Transmit Delay print. */
7596: if (OSPF_IF_PARAM_CONFIGURED (params, transmit_delay) &&
7597: params->transmit_delay != OSPF_TRANSMIT_DELAY_DEFAULT)
7598: {
7599: vty_out (vty, " ip ospf transmit-delay %u", params->transmit_delay);
7600: if (params != IF_DEF_PARAMS (ifp))
7601: vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
7602: vty_out (vty, "%s", VTY_NEWLINE);
7603: }
7604:
7605: /* MTU ignore print. */
7606: if (OSPF_IF_PARAM_CONFIGURED (params, mtu_ignore) &&
7607: params->mtu_ignore != OSPF_MTU_IGNORE_DEFAULT)
7608: {
7609: if (params->mtu_ignore == 0)
7610: vty_out (vty, " no ip ospf mtu-ignore");
7611: else
7612: vty_out (vty, " ip ospf mtu-ignore");
7613: if (params != IF_DEF_PARAMS (ifp))
7614: vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
7615: vty_out (vty, "%s", VTY_NEWLINE);
7616: }
7617:
7618:
7619: while (1)
7620: {
7621: if (rn == NULL)
7622: rn = route_top (IF_OIFS_PARAMS (ifp));
7623: else
7624: rn = route_next (rn);
7625:
7626: if (rn == NULL)
7627: break;
7628: params = rn->info;
7629: if (params != NULL)
7630: break;
7631: }
7632: } while (rn);
7633:
7634: #ifdef HAVE_OPAQUE_LSA
7635: ospf_opaque_config_write_if (vty, ifp);
7636: #endif /* HAVE_OPAQUE_LSA */
7637: }
7638:
7639: return write;
7640: }
7641:
7642: static int
7643: config_write_network_area (struct vty *vty, struct ospf *ospf)
7644: {
7645: struct route_node *rn;
7646: u_char buf[INET_ADDRSTRLEN];
7647:
7648: /* `network area' print. */
7649: for (rn = route_top (ospf->networks); rn; rn = route_next (rn))
7650: if (rn->info)
7651: {
7652: struct ospf_network *n = rn->info;
7653:
7654: memset (buf, 0, INET_ADDRSTRLEN);
7655:
7656: /* Create Area ID string by specified Area ID format. */
7657: if (n->format == OSPF_AREA_ID_FORMAT_ADDRESS)
7658: strncpy ((char *) buf, inet_ntoa (n->area_id), INET_ADDRSTRLEN);
7659: else
7660: sprintf ((char *) buf, "%lu",
7661: (unsigned long int) ntohl (n->area_id.s_addr));
7662:
7663: /* Network print. */
7664: vty_out (vty, " network %s/%d area %s%s",
7665: inet_ntoa (rn->p.u.prefix4), rn->p.prefixlen,
7666: buf, VTY_NEWLINE);
7667: }
7668:
7669: return 0;
7670: }
7671:
7672: static int
7673: config_write_ospf_area (struct vty *vty, struct ospf *ospf)
7674: {
7675: struct listnode *node;
7676: struct ospf_area *area;
7677: u_char buf[INET_ADDRSTRLEN];
7678:
7679: /* Area configuration print. */
7680: for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area))
7681: {
7682: struct route_node *rn1;
7683:
7684: area_id2str ((char *) buf, INET_ADDRSTRLEN, area);
7685:
7686: if (area->auth_type != OSPF_AUTH_NULL)
7687: {
7688: if (area->auth_type == OSPF_AUTH_SIMPLE)
7689: vty_out (vty, " area %s authentication%s", buf, VTY_NEWLINE);
7690: else
7691: vty_out (vty, " area %s authentication message-digest%s",
7692: buf, VTY_NEWLINE);
7693: }
7694:
7695: if (area->shortcut_configured != OSPF_SHORTCUT_DEFAULT)
7696: vty_out (vty, " area %s shortcut %s%s", buf,
7697: ospf_shortcut_mode_str[area->shortcut_configured],
7698: VTY_NEWLINE);
7699:
7700: if ((area->external_routing == OSPF_AREA_STUB)
7701: || (area->external_routing == OSPF_AREA_NSSA)
7702: )
7703: {
7704: if (area->external_routing == OSPF_AREA_STUB)
7705: vty_out (vty, " area %s stub", buf);
7706: else if (area->external_routing == OSPF_AREA_NSSA)
7707: {
7708: vty_out (vty, " area %s nssa", buf);
7709: switch (area->NSSATranslatorRole)
7710: {
7711: case OSPF_NSSA_ROLE_NEVER:
7712: vty_out (vty, " translate-never");
7713: break;
7714: case OSPF_NSSA_ROLE_ALWAYS:
7715: vty_out (vty, " translate-always");
7716: break;
7717: case OSPF_NSSA_ROLE_CANDIDATE:
7718: default:
7719: vty_out (vty, " translate-candidate");
7720: }
7721: }
7722:
7723: if (area->no_summary)
7724: vty_out (vty, " no-summary");
7725:
7726: vty_out (vty, "%s", VTY_NEWLINE);
7727:
7728: if (area->default_cost != 1)
7729: vty_out (vty, " area %s default-cost %d%s", buf,
7730: area->default_cost, VTY_NEWLINE);
7731: }
7732:
7733: for (rn1 = route_top (area->ranges); rn1; rn1 = route_next (rn1))
7734: if (rn1->info)
7735: {
7736: struct ospf_area_range *range = rn1->info;
7737:
7738: vty_out (vty, " area %s range %s/%d", buf,
7739: inet_ntoa (rn1->p.u.prefix4), rn1->p.prefixlen);
7740:
7741: if (range->cost_config != OSPF_AREA_RANGE_COST_UNSPEC)
7742: vty_out (vty, " cost %d", range->cost_config);
7743:
7744: if (!CHECK_FLAG (range->flags, OSPF_AREA_RANGE_ADVERTISE))
7745: vty_out (vty, " not-advertise");
7746:
7747: if (CHECK_FLAG (range->flags, OSPF_AREA_RANGE_SUBSTITUTE))
7748: vty_out (vty, " substitute %s/%d",
7749: inet_ntoa (range->subst_addr), range->subst_masklen);
7750:
7751: vty_out (vty, "%s", VTY_NEWLINE);
7752: }
7753:
7754: if (EXPORT_NAME (area))
7755: vty_out (vty, " area %s export-list %s%s", buf,
7756: EXPORT_NAME (area), VTY_NEWLINE);
7757:
7758: if (IMPORT_NAME (area))
7759: vty_out (vty, " area %s import-list %s%s", buf,
7760: IMPORT_NAME (area), VTY_NEWLINE);
7761:
7762: if (PREFIX_NAME_IN (area))
7763: vty_out (vty, " area %s filter-list prefix %s in%s", buf,
7764: PREFIX_NAME_IN (area), VTY_NEWLINE);
7765:
7766: if (PREFIX_NAME_OUT (area))
7767: vty_out (vty, " area %s filter-list prefix %s out%s", buf,
7768: PREFIX_NAME_OUT (area), VTY_NEWLINE);
7769: }
7770:
7771: return 0;
7772: }
7773:
7774: static int
7775: config_write_ospf_nbr_nbma (struct vty *vty, struct ospf *ospf)
7776: {
7777: struct ospf_nbr_nbma *nbr_nbma;
7778: struct route_node *rn;
7779:
7780: /* Static Neighbor configuration print. */
7781: for (rn = route_top (ospf->nbr_nbma); rn; rn = route_next (rn))
7782: if ((nbr_nbma = rn->info))
7783: {
7784: vty_out (vty, " neighbor %s", inet_ntoa (nbr_nbma->addr));
7785:
7786: if (nbr_nbma->priority != OSPF_NEIGHBOR_PRIORITY_DEFAULT)
7787: vty_out (vty, " priority %d", nbr_nbma->priority);
7788:
7789: if (nbr_nbma->v_poll != OSPF_POLL_INTERVAL_DEFAULT)
7790: vty_out (vty, " poll-interval %d", nbr_nbma->v_poll);
7791:
7792: vty_out (vty, "%s", VTY_NEWLINE);
7793: }
7794:
7795: return 0;
7796: }
7797:
7798: static int
7799: config_write_virtual_link (struct vty *vty, struct ospf *ospf)
7800: {
7801: struct listnode *node;
7802: struct ospf_vl_data *vl_data;
7803: u_char buf[INET_ADDRSTRLEN];
7804:
7805: /* Virtual-Link print */
7806: for (ALL_LIST_ELEMENTS_RO (ospf->vlinks, node, vl_data))
7807: {
7808: struct listnode *n2;
7809: struct crypt_key *ck;
7810: struct ospf_interface *oi;
7811:
7812: if (vl_data != NULL)
7813: {
7814: memset (buf, 0, INET_ADDRSTRLEN);
7815:
7816: if (vl_data->format == OSPF_AREA_ID_FORMAT_ADDRESS)
7817: strncpy ((char *) buf, inet_ntoa (vl_data->vl_area_id), INET_ADDRSTRLEN);
7818: else
7819: sprintf ((char *) buf, "%lu",
7820: (unsigned long int) ntohl (vl_data->vl_area_id.s_addr));
7821: oi = vl_data->vl_oi;
7822:
7823: /* timers */
7824: if (OSPF_IF_PARAM (oi, v_hello) != OSPF_HELLO_INTERVAL_DEFAULT ||
7825: OSPF_IF_PARAM (oi, v_wait) != OSPF_ROUTER_DEAD_INTERVAL_DEFAULT ||
7826: OSPF_IF_PARAM (oi, retransmit_interval) != OSPF_RETRANSMIT_INTERVAL_DEFAULT ||
7827: OSPF_IF_PARAM (oi, transmit_delay) != OSPF_TRANSMIT_DELAY_DEFAULT)
7828: vty_out (vty, " area %s virtual-link %s hello-interval %d retransmit-interval %d transmit-delay %d dead-interval %d%s",
7829: buf,
7830: inet_ntoa (vl_data->vl_peer),
7831: OSPF_IF_PARAM (oi, v_hello),
7832: OSPF_IF_PARAM (oi, retransmit_interval),
7833: OSPF_IF_PARAM (oi, transmit_delay),
7834: OSPF_IF_PARAM (oi, v_wait),
7835: VTY_NEWLINE);
7836: else
7837: vty_out (vty, " area %s virtual-link %s%s", buf,
7838: inet_ntoa (vl_data->vl_peer), VTY_NEWLINE);
7839: /* Auth key */
7840: if (IF_DEF_PARAMS (vl_data->vl_oi->ifp)->auth_simple[0] != '\0')
7841: vty_out (vty, " area %s virtual-link %s authentication-key %s%s",
7842: buf,
7843: inet_ntoa (vl_data->vl_peer),
7844: IF_DEF_PARAMS (vl_data->vl_oi->ifp)->auth_simple,
7845: VTY_NEWLINE);
7846: /* md5 keys */
7847: for (ALL_LIST_ELEMENTS_RO (IF_DEF_PARAMS (vl_data->vl_oi->ifp)->auth_crypt,
7848: n2, ck))
7849: vty_out (vty, " area %s virtual-link %s"
7850: " message-digest-key %d md5 %s%s",
7851: buf,
7852: inet_ntoa (vl_data->vl_peer),
7853: ck->key_id, ck->auth_key, VTY_NEWLINE);
7854:
7855: }
7856: }
7857:
7858: return 0;
7859: }
7860:
7861:
7862: static int
7863: config_write_ospf_redistribute (struct vty *vty, struct ospf *ospf)
7864: {
7865: int type;
7866:
7867: /* redistribute print. */
7868: for (type = 0; type < ZEBRA_ROUTE_MAX; type++)
7869: if (type != zclient->redist_default && zclient->redist[type])
7870: {
7871: vty_out (vty, " redistribute %s", zebra_route_string(type));
7872: if (ospf->dmetric[type].value >= 0)
7873: vty_out (vty, " metric %d", ospf->dmetric[type].value);
7874:
7875: if (ospf->dmetric[type].type == EXTERNAL_METRIC_TYPE_1)
7876: vty_out (vty, " metric-type 1");
7877:
7878: if (ROUTEMAP_NAME (ospf, type))
7879: vty_out (vty, " route-map %s", ROUTEMAP_NAME (ospf, type));
7880:
7881: vty_out (vty, "%s", VTY_NEWLINE);
7882: }
7883:
7884: return 0;
7885: }
7886:
7887: static int
7888: config_write_ospf_default_metric (struct vty *vty, struct ospf *ospf)
7889: {
7890: if (ospf->default_metric != -1)
7891: vty_out (vty, " default-metric %d%s", ospf->default_metric,
7892: VTY_NEWLINE);
7893: return 0;
7894: }
7895:
7896: static int
7897: config_write_ospf_distribute (struct vty *vty, struct ospf *ospf)
7898: {
7899: int type;
7900:
7901: if (ospf)
7902: {
7903: /* distribute-list print. */
7904: for (type = 0; type < ZEBRA_ROUTE_MAX; type++)
7905: if (DISTRIBUTE_NAME (ospf, type))
7906: vty_out (vty, " distribute-list %s out %s%s",
7907: DISTRIBUTE_NAME (ospf, type),
7908: zebra_route_string(type), VTY_NEWLINE);
7909:
7910: /* default-information print. */
7911: if (ospf->default_originate != DEFAULT_ORIGINATE_NONE)
7912: {
7913: vty_out (vty, " default-information originate");
7914: if (ospf->default_originate == DEFAULT_ORIGINATE_ALWAYS)
7915: vty_out (vty, " always");
7916:
7917: if (ospf->dmetric[DEFAULT_ROUTE].value >= 0)
7918: vty_out (vty, " metric %d",
7919: ospf->dmetric[DEFAULT_ROUTE].value);
7920: if (ospf->dmetric[DEFAULT_ROUTE].type == EXTERNAL_METRIC_TYPE_1)
7921: vty_out (vty, " metric-type 1");
7922:
7923: if (ROUTEMAP_NAME (ospf, DEFAULT_ROUTE))
7924: vty_out (vty, " route-map %s",
7925: ROUTEMAP_NAME (ospf, DEFAULT_ROUTE));
7926:
7927: vty_out (vty, "%s", VTY_NEWLINE);
7928: }
7929:
7930: }
7931:
7932: return 0;
7933: }
7934:
7935: static int
7936: config_write_ospf_distance (struct vty *vty, struct ospf *ospf)
7937: {
7938: struct route_node *rn;
7939: struct ospf_distance *odistance;
7940:
7941: if (ospf->distance_all)
7942: vty_out (vty, " distance %d%s", ospf->distance_all, VTY_NEWLINE);
7943:
7944: if (ospf->distance_intra
7945: || ospf->distance_inter
7946: || ospf->distance_external)
7947: {
7948: vty_out (vty, " distance ospf");
7949:
7950: if (ospf->distance_intra)
7951: vty_out (vty, " intra-area %d", ospf->distance_intra);
7952: if (ospf->distance_inter)
7953: vty_out (vty, " inter-area %d", ospf->distance_inter);
7954: if (ospf->distance_external)
7955: vty_out (vty, " external %d", ospf->distance_external);
7956:
7957: vty_out (vty, "%s", VTY_NEWLINE);
7958: }
7959:
7960: for (rn = route_top (ospf->distance_table); rn; rn = route_next (rn))
7961: if ((odistance = rn->info) != NULL)
7962: {
7963: vty_out (vty, " distance %d %s/%d %s%s", odistance->distance,
7964: inet_ntoa (rn->p.u.prefix4), rn->p.prefixlen,
7965: odistance->access_list ? odistance->access_list : "",
7966: VTY_NEWLINE);
7967: }
7968: return 0;
7969: }
7970:
7971: /* OSPF configuration write function. */
7972: static int
7973: ospf_config_write (struct vty *vty)
7974: {
7975: struct ospf *ospf;
7976: struct interface *ifp;
7977: struct ospf_interface *oi;
7978: struct listnode *node;
7979: int write = 0;
7980:
7981: ospf = ospf_lookup ();
7982: if (ospf != NULL)
7983: {
7984: /* `router ospf' print. */
7985: vty_out (vty, "router ospf%s", VTY_NEWLINE);
7986:
7987: write++;
7988:
7989: if (!ospf->networks)
7990: return write;
7991:
7992: /* Router ID print. */
7993: if (ospf->router_id_static.s_addr != 0)
7994: vty_out (vty, " ospf router-id %s%s",
7995: inet_ntoa (ospf->router_id_static), VTY_NEWLINE);
7996:
7997: /* ABR type print. */
7998: if (ospf->abr_type != OSPF_ABR_DEFAULT)
7999: vty_out (vty, " ospf abr-type %s%s",
8000: ospf_abr_type_str[ospf->abr_type], VTY_NEWLINE);
8001:
8002: /* log-adjacency-changes flag print. */
8003: if (CHECK_FLAG(ospf->config, OSPF_LOG_ADJACENCY_CHANGES))
8004: {
8005: vty_out(vty, " log-adjacency-changes");
8006: if (CHECK_FLAG(ospf->config, OSPF_LOG_ADJACENCY_DETAIL))
8007: vty_out(vty, " detail");
8008: vty_out(vty, "%s", VTY_NEWLINE);
8009: }
8010:
8011: /* RFC1583 compatibility flag print -- Compatible with CISCO 12.1. */
8012: if (CHECK_FLAG (ospf->config, OSPF_RFC1583_COMPATIBLE))
8013: vty_out (vty, " compatible rfc1583%s", VTY_NEWLINE);
8014:
8015: /* auto-cost reference-bandwidth configuration. */
8016: if (ospf->ref_bandwidth != OSPF_DEFAULT_REF_BANDWIDTH)
8017: {
8018: vty_out (vty, "! Important: ensure reference bandwidth "
8019: "is consistent across all routers%s", VTY_NEWLINE);
8020: vty_out (vty, " auto-cost reference-bandwidth %d%s",
8021: ospf->ref_bandwidth / 1000, VTY_NEWLINE);
8022: }
8023:
8024: /* SPF timers print. */
8025: if (ospf->spf_delay != OSPF_SPF_DELAY_DEFAULT ||
8026: ospf->spf_holdtime != OSPF_SPF_HOLDTIME_DEFAULT ||
8027: ospf->spf_max_holdtime != OSPF_SPF_MAX_HOLDTIME_DEFAULT)
8028: vty_out (vty, " timers throttle spf %d %d %d%s",
8029: ospf->spf_delay, ospf->spf_holdtime,
8030: ospf->spf_max_holdtime, VTY_NEWLINE);
8031:
8032: /* Max-metric router-lsa print */
8033: config_write_stub_router (vty, ospf);
8034:
8035: /* SPF refresh parameters print. */
8036: if (ospf->lsa_refresh_interval != OSPF_LSA_REFRESH_INTERVAL_DEFAULT)
8037: vty_out (vty, " refresh timer %d%s",
8038: ospf->lsa_refresh_interval, VTY_NEWLINE);
8039:
8040: /* Redistribute information print. */
8041: config_write_ospf_redistribute (vty, ospf);
8042:
8043: /* passive-interface print. */
8044: if (ospf->passive_interface_default == OSPF_IF_PASSIVE)
8045: vty_out (vty, " passive-interface default%s", VTY_NEWLINE);
8046:
8047: for (ALL_LIST_ELEMENTS_RO (om->iflist, node, ifp))
8048: if (OSPF_IF_PARAM_CONFIGURED (IF_DEF_PARAMS (ifp), passive_interface)
8049: && IF_DEF_PARAMS (ifp)->passive_interface !=
8050: ospf->passive_interface_default)
8051: {
8052: vty_out (vty, " %spassive-interface %s%s",
8053: IF_DEF_PARAMS (ifp)->passive_interface ? "" : "no ",
8054: ifp->name, VTY_NEWLINE);
8055: }
8056: for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi))
8057: {
8058: if (!OSPF_IF_PARAM_CONFIGURED (oi->params, passive_interface))
8059: continue;
8060: if (OSPF_IF_PARAM_CONFIGURED (IF_DEF_PARAMS (oi->ifp),
8061: passive_interface))
8062: {
8063: if (oi->params->passive_interface == IF_DEF_PARAMS (oi->ifp)->passive_interface)
8064: continue;
8065: }
8066: else if (oi->params->passive_interface == ospf->passive_interface_default)
8067: continue;
8068:
8069: vty_out (vty, " %spassive-interface %s %s%s",
8070: oi->params->passive_interface ? "" : "no ",
8071: oi->ifp->name,
8072: inet_ntoa (oi->address->u.prefix4), VTY_NEWLINE);
8073: }
8074:
8075: /* Network area print. */
8076: config_write_network_area (vty, ospf);
8077:
8078: /* Area config print. */
8079: config_write_ospf_area (vty, ospf);
8080:
8081: /* static neighbor print. */
8082: config_write_ospf_nbr_nbma (vty, ospf);
8083:
8084: /* Virtual-Link print. */
8085: config_write_virtual_link (vty, ospf);
8086:
8087: /* Default metric configuration. */
8088: config_write_ospf_default_metric (vty, ospf);
8089:
8090: /* Distribute-list and default-information print. */
8091: config_write_ospf_distribute (vty, ospf);
8092:
8093: /* Distance configuration. */
8094: config_write_ospf_distance (vty, ospf);
8095:
8096: #ifdef HAVE_OPAQUE_LSA
8097: ospf_opaque_config_write_router (vty, ospf);
8098: #endif /* HAVE_OPAQUE_LSA */
8099: }
8100:
8101: return write;
8102: }
8103:
8104: void
8105: ospf_vty_show_init (void)
8106: {
8107: /* "show ip ospf" commands. */
8108: install_element (VIEW_NODE, &show_ip_ospf_cmd);
8109: install_element (ENABLE_NODE, &show_ip_ospf_cmd);
8110:
8111: /* "show ip ospf database" commands. */
8112: install_element (VIEW_NODE, &show_ip_ospf_database_type_cmd);
8113: install_element (VIEW_NODE, &show_ip_ospf_database_type_id_cmd);
8114: install_element (VIEW_NODE, &show_ip_ospf_database_type_id_adv_router_cmd);
8115: install_element (VIEW_NODE, &show_ip_ospf_database_type_adv_router_cmd);
8116: install_element (VIEW_NODE, &show_ip_ospf_database_type_id_self_cmd);
8117: install_element (VIEW_NODE, &show_ip_ospf_database_type_self_cmd);
8118: install_element (VIEW_NODE, &show_ip_ospf_database_cmd);
8119: install_element (ENABLE_NODE, &show_ip_ospf_database_type_cmd);
8120: install_element (ENABLE_NODE, &show_ip_ospf_database_type_id_cmd);
8121: install_element (ENABLE_NODE, &show_ip_ospf_database_type_id_adv_router_cmd);
8122: install_element (ENABLE_NODE, &show_ip_ospf_database_type_adv_router_cmd);
8123: install_element (ENABLE_NODE, &show_ip_ospf_database_type_id_self_cmd);
8124: install_element (ENABLE_NODE, &show_ip_ospf_database_type_self_cmd);
8125: install_element (ENABLE_NODE, &show_ip_ospf_database_cmd);
8126:
8127: /* "show ip ospf interface" commands. */
8128: install_element (VIEW_NODE, &show_ip_ospf_interface_cmd);
8129: install_element (ENABLE_NODE, &show_ip_ospf_interface_cmd);
8130:
8131: /* "show ip ospf neighbor" commands. */
8132: install_element (VIEW_NODE, &show_ip_ospf_neighbor_int_detail_cmd);
8133: install_element (VIEW_NODE, &show_ip_ospf_neighbor_int_cmd);
8134: install_element (VIEW_NODE, &show_ip_ospf_neighbor_id_cmd);
8135: install_element (VIEW_NODE, &show_ip_ospf_neighbor_detail_all_cmd);
8136: install_element (VIEW_NODE, &show_ip_ospf_neighbor_detail_cmd);
8137: install_element (VIEW_NODE, &show_ip_ospf_neighbor_cmd);
8138: install_element (VIEW_NODE, &show_ip_ospf_neighbor_all_cmd);
8139: install_element (ENABLE_NODE, &show_ip_ospf_neighbor_int_detail_cmd);
8140: install_element (ENABLE_NODE, &show_ip_ospf_neighbor_int_cmd);
8141: install_element (ENABLE_NODE, &show_ip_ospf_neighbor_id_cmd);
8142: install_element (ENABLE_NODE, &show_ip_ospf_neighbor_detail_all_cmd);
8143: install_element (ENABLE_NODE, &show_ip_ospf_neighbor_detail_cmd);
8144: install_element (ENABLE_NODE, &show_ip_ospf_neighbor_cmd);
8145: install_element (ENABLE_NODE, &show_ip_ospf_neighbor_all_cmd);
8146:
8147: /* "show ip ospf route" commands. */
8148: install_element (VIEW_NODE, &show_ip_ospf_route_cmd);
8149: install_element (ENABLE_NODE, &show_ip_ospf_route_cmd);
8150: install_element (VIEW_NODE, &show_ip_ospf_border_routers_cmd);
8151: install_element (ENABLE_NODE, &show_ip_ospf_border_routers_cmd);
8152: }
8153:
8154:
8155: /* ospfd's interface node. */
8156: static struct cmd_node interface_node =
8157: {
8158: INTERFACE_NODE,
8159: "%s(config-if)# ",
8160: 1
8161: };
8162:
8163: /* Initialization of OSPF interface. */
8164: static void
8165: ospf_vty_if_init (void)
8166: {
8167: /* Install interface node. */
8168: install_node (&interface_node, config_write_interface);
8169:
8170: install_element (CONFIG_NODE, &interface_cmd);
8171: install_element (CONFIG_NODE, &no_interface_cmd);
8172: install_default (INTERFACE_NODE);
8173:
8174: /* "description" commands. */
8175: install_element (INTERFACE_NODE, &interface_desc_cmd);
8176: install_element (INTERFACE_NODE, &no_interface_desc_cmd);
8177:
8178: /* "ip ospf authentication" commands. */
8179: install_element (INTERFACE_NODE, &ip_ospf_authentication_args_addr_cmd);
8180: install_element (INTERFACE_NODE, &ip_ospf_authentication_args_cmd);
8181: install_element (INTERFACE_NODE, &ip_ospf_authentication_addr_cmd);
8182: install_element (INTERFACE_NODE, &ip_ospf_authentication_cmd);
8183: install_element (INTERFACE_NODE, &no_ip_ospf_authentication_addr_cmd);
8184: install_element (INTERFACE_NODE, &no_ip_ospf_authentication_cmd);
8185: install_element (INTERFACE_NODE, &ip_ospf_authentication_key_addr_cmd);
8186: install_element (INTERFACE_NODE, &ip_ospf_authentication_key_cmd);
8187: install_element (INTERFACE_NODE, &no_ip_ospf_authentication_key_addr_cmd);
8188: install_element (INTERFACE_NODE, &no_ip_ospf_authentication_key_cmd);
8189:
8190: /* "ip ospf message-digest-key" commands. */
8191: install_element (INTERFACE_NODE, &ip_ospf_message_digest_key_addr_cmd);
8192: install_element (INTERFACE_NODE, &ip_ospf_message_digest_key_cmd);
8193: install_element (INTERFACE_NODE, &no_ip_ospf_message_digest_key_addr_cmd);
8194: install_element (INTERFACE_NODE, &no_ip_ospf_message_digest_key_cmd);
8195:
8196: /* "ip ospf cost" commands. */
8197: install_element (INTERFACE_NODE, &ip_ospf_cost_u32_inet4_cmd);
8198: install_element (INTERFACE_NODE, &ip_ospf_cost_u32_cmd);
8199: install_element (INTERFACE_NODE, &no_ip_ospf_cost_u32_cmd);
8200: install_element (INTERFACE_NODE, &no_ip_ospf_cost_u32_inet4_cmd);
8201: install_element (INTERFACE_NODE, &no_ip_ospf_cost_inet4_cmd);
8202: install_element (INTERFACE_NODE, &no_ip_ospf_cost_cmd);
8203:
8204: /* "ip ospf mtu-ignore" commands. */
8205: install_element (INTERFACE_NODE, &ip_ospf_mtu_ignore_addr_cmd);
8206: install_element (INTERFACE_NODE, &ip_ospf_mtu_ignore_cmd);
8207: install_element (INTERFACE_NODE, &no_ip_ospf_mtu_ignore_addr_cmd);
8208: install_element (INTERFACE_NODE, &no_ip_ospf_mtu_ignore_cmd);
8209:
8210: /* "ip ospf dead-interval" commands. */
8211: install_element (INTERFACE_NODE, &ip_ospf_dead_interval_addr_cmd);
8212: install_element (INTERFACE_NODE, &ip_ospf_dead_interval_cmd);
8213: install_element (INTERFACE_NODE, &ip_ospf_dead_interval_minimal_addr_cmd);
8214: install_element (INTERFACE_NODE, &ip_ospf_dead_interval_minimal_cmd);
8215: install_element (INTERFACE_NODE, &no_ip_ospf_dead_interval_addr_cmd);
8216: install_element (INTERFACE_NODE, &no_ip_ospf_dead_interval_cmd);
8217:
8218: /* "ip ospf hello-interval" commands. */
8219: install_element (INTERFACE_NODE, &ip_ospf_hello_interval_addr_cmd);
8220: install_element (INTERFACE_NODE, &ip_ospf_hello_interval_cmd);
8221: install_element (INTERFACE_NODE, &no_ip_ospf_hello_interval_addr_cmd);
8222: install_element (INTERFACE_NODE, &no_ip_ospf_hello_interval_cmd);
8223:
8224: /* "ip ospf network" commands. */
8225: install_element (INTERFACE_NODE, &ip_ospf_network_cmd);
8226: install_element (INTERFACE_NODE, &no_ip_ospf_network_cmd);
8227:
8228: /* "ip ospf priority" commands. */
8229: install_element (INTERFACE_NODE, &ip_ospf_priority_addr_cmd);
8230: install_element (INTERFACE_NODE, &ip_ospf_priority_cmd);
8231: install_element (INTERFACE_NODE, &no_ip_ospf_priority_addr_cmd);
8232: install_element (INTERFACE_NODE, &no_ip_ospf_priority_cmd);
8233:
8234: /* "ip ospf retransmit-interval" commands. */
8235: install_element (INTERFACE_NODE, &ip_ospf_retransmit_interval_addr_cmd);
8236: install_element (INTERFACE_NODE, &ip_ospf_retransmit_interval_cmd);
8237: install_element (INTERFACE_NODE, &no_ip_ospf_retransmit_interval_addr_cmd);
8238: install_element (INTERFACE_NODE, &no_ip_ospf_retransmit_interval_cmd);
8239:
8240: /* "ip ospf transmit-delay" commands. */
8241: install_element (INTERFACE_NODE, &ip_ospf_transmit_delay_addr_cmd);
8242: install_element (INTERFACE_NODE, &ip_ospf_transmit_delay_cmd);
8243: install_element (INTERFACE_NODE, &no_ip_ospf_transmit_delay_addr_cmd);
8244: install_element (INTERFACE_NODE, &no_ip_ospf_transmit_delay_cmd);
8245:
8246: /* These commands are compatibitliy for previous version. */
8247: install_element (INTERFACE_NODE, &ospf_authentication_key_cmd);
8248: install_element (INTERFACE_NODE, &no_ospf_authentication_key_cmd);
8249: install_element (INTERFACE_NODE, &ospf_message_digest_key_cmd);
8250: install_element (INTERFACE_NODE, &no_ospf_message_digest_key_cmd);
8251: install_element (INTERFACE_NODE, &ospf_cost_u32_cmd);
8252: install_element (INTERFACE_NODE, &ospf_cost_u32_inet4_cmd);
8253: install_element (INTERFACE_NODE, &no_ospf_cost_cmd);
8254: install_element (INTERFACE_NODE, &no_ospf_cost_u32_cmd);
8255: install_element (INTERFACE_NODE, &no_ospf_cost_u32_inet4_cmd);
8256: install_element (INTERFACE_NODE, &no_ospf_cost_inet4_cmd);
8257: install_element (INTERFACE_NODE, &ospf_dead_interval_cmd);
8258: install_element (INTERFACE_NODE, &no_ospf_dead_interval_cmd);
8259: install_element (INTERFACE_NODE, &ospf_hello_interval_cmd);
8260: install_element (INTERFACE_NODE, &no_ospf_hello_interval_cmd);
8261: install_element (INTERFACE_NODE, &ospf_network_cmd);
8262: install_element (INTERFACE_NODE, &no_ospf_network_cmd);
8263: install_element (INTERFACE_NODE, &ospf_priority_cmd);
8264: install_element (INTERFACE_NODE, &no_ospf_priority_cmd);
8265: install_element (INTERFACE_NODE, &ospf_retransmit_interval_cmd);
8266: install_element (INTERFACE_NODE, &no_ospf_retransmit_interval_cmd);
8267: install_element (INTERFACE_NODE, &ospf_transmit_delay_cmd);
8268: install_element (INTERFACE_NODE, &no_ospf_transmit_delay_cmd);
8269: }
8270:
8271: static void
8272: ospf_vty_zebra_init (void)
8273: {
8274: install_element (OSPF_NODE, &ospf_redistribute_source_type_metric_cmd);
8275: install_element (OSPF_NODE, &ospf_redistribute_source_metric_type_cmd);
8276: install_element (OSPF_NODE, &ospf_redistribute_source_type_cmd);
8277: install_element (OSPF_NODE, &ospf_redistribute_source_metric_cmd);
8278: install_element (OSPF_NODE, &ospf_redistribute_source_cmd);
8279: install_element (OSPF_NODE,
8280: &ospf_redistribute_source_metric_type_routemap_cmd);
8281: install_element (OSPF_NODE,
8282: &ospf_redistribute_source_type_metric_routemap_cmd);
8283: install_element (OSPF_NODE, &ospf_redistribute_source_metric_routemap_cmd);
8284: install_element (OSPF_NODE, &ospf_redistribute_source_type_routemap_cmd);
8285: install_element (OSPF_NODE, &ospf_redistribute_source_routemap_cmd);
8286:
8287: install_element (OSPF_NODE, &no_ospf_redistribute_source_cmd);
8288:
8289: install_element (OSPF_NODE, &ospf_distribute_list_out_cmd);
8290: install_element (OSPF_NODE, &no_ospf_distribute_list_out_cmd);
8291:
8292: install_element (OSPF_NODE,
8293: &ospf_default_information_originate_metric_type_cmd);
8294: install_element (OSPF_NODE, &ospf_default_information_originate_metric_cmd);
8295: install_element (OSPF_NODE,
8296: &ospf_default_information_originate_type_metric_cmd);
8297: install_element (OSPF_NODE, &ospf_default_information_originate_type_cmd);
8298: install_element (OSPF_NODE, &ospf_default_information_originate_cmd);
8299: install_element (OSPF_NODE,
8300: &ospf_default_information_originate_always_metric_type_cmd);
8301: install_element (OSPF_NODE,
8302: &ospf_default_information_originate_always_metric_cmd);
8303: install_element (OSPF_NODE,
8304: &ospf_default_information_originate_always_cmd);
8305: install_element (OSPF_NODE,
8306: &ospf_default_information_originate_always_type_metric_cmd);
8307: install_element (OSPF_NODE,
8308: &ospf_default_information_originate_always_type_cmd);
8309:
8310: install_element (OSPF_NODE,
8311: &ospf_default_information_originate_metric_type_routemap_cmd);
8312: install_element (OSPF_NODE,
8313: &ospf_default_information_originate_metric_routemap_cmd);
8314: install_element (OSPF_NODE,
8315: &ospf_default_information_originate_routemap_cmd);
8316: install_element (OSPF_NODE,
8317: &ospf_default_information_originate_type_metric_routemap_cmd);
8318: install_element (OSPF_NODE,
8319: &ospf_default_information_originate_type_routemap_cmd);
8320: install_element (OSPF_NODE,
8321: &ospf_default_information_originate_always_metric_type_routemap_cmd);
8322: install_element (OSPF_NODE,
8323: &ospf_default_information_originate_always_metric_routemap_cmd);
8324: install_element (OSPF_NODE,
8325: &ospf_default_information_originate_always_routemap_cmd);
8326: install_element (OSPF_NODE,
8327: &ospf_default_information_originate_always_type_metric_routemap_cmd);
8328: install_element (OSPF_NODE,
8329: &ospf_default_information_originate_always_type_routemap_cmd);
8330:
8331: install_element (OSPF_NODE, &no_ospf_default_information_originate_cmd);
8332:
8333: install_element (OSPF_NODE, &ospf_default_metric_cmd);
8334: install_element (OSPF_NODE, &no_ospf_default_metric_cmd);
8335: install_element (OSPF_NODE, &no_ospf_default_metric_val_cmd);
8336:
8337: install_element (OSPF_NODE, &ospf_distance_cmd);
8338: install_element (OSPF_NODE, &no_ospf_distance_cmd);
8339: install_element (OSPF_NODE, &no_ospf_distance_ospf_cmd);
8340: install_element (OSPF_NODE, &ospf_distance_ospf_intra_cmd);
8341: install_element (OSPF_NODE, &ospf_distance_ospf_intra_inter_cmd);
8342: install_element (OSPF_NODE, &ospf_distance_ospf_intra_external_cmd);
8343: install_element (OSPF_NODE, &ospf_distance_ospf_intra_inter_external_cmd);
8344: install_element (OSPF_NODE, &ospf_distance_ospf_intra_external_inter_cmd);
8345: install_element (OSPF_NODE, &ospf_distance_ospf_inter_cmd);
8346: install_element (OSPF_NODE, &ospf_distance_ospf_inter_intra_cmd);
8347: install_element (OSPF_NODE, &ospf_distance_ospf_inter_external_cmd);
8348: install_element (OSPF_NODE, &ospf_distance_ospf_inter_intra_external_cmd);
8349: install_element (OSPF_NODE, &ospf_distance_ospf_inter_external_intra_cmd);
8350: install_element (OSPF_NODE, &ospf_distance_ospf_external_cmd);
8351: install_element (OSPF_NODE, &ospf_distance_ospf_external_intra_cmd);
8352: install_element (OSPF_NODE, &ospf_distance_ospf_external_inter_cmd);
8353: install_element (OSPF_NODE, &ospf_distance_ospf_external_intra_inter_cmd);
8354: install_element (OSPF_NODE, &ospf_distance_ospf_external_inter_intra_cmd);
8355: #if 0
8356: install_element (OSPF_NODE, &ospf_distance_source_cmd);
8357: install_element (OSPF_NODE, &no_ospf_distance_source_cmd);
8358: install_element (OSPF_NODE, &ospf_distance_source_access_list_cmd);
8359: install_element (OSPF_NODE, &no_ospf_distance_source_access_list_cmd);
8360: #endif /* 0 */
8361: }
8362:
8363: static struct cmd_node ospf_node =
8364: {
8365: OSPF_NODE,
8366: "%s(config-router)# ",
8367: 1
8368: };
8369:
8370:
8371: /* Install OSPF related vty commands. */
8372: void
8373: ospf_vty_init (void)
8374: {
8375: /* Install ospf top node. */
8376: install_node (&ospf_node, ospf_config_write);
8377:
8378: /* "router ospf" commands. */
8379: install_element (CONFIG_NODE, &router_ospf_cmd);
8380: install_element (CONFIG_NODE, &no_router_ospf_cmd);
8381:
8382: install_default (OSPF_NODE);
8383:
8384: /* "ospf router-id" commands. */
8385: install_element (OSPF_NODE, &ospf_router_id_cmd);
8386: install_element (OSPF_NODE, &no_ospf_router_id_cmd);
8387: install_element (OSPF_NODE, &router_ospf_id_cmd);
8388: install_element (OSPF_NODE, &no_router_ospf_id_cmd);
8389:
8390: /* "passive-interface" commands. */
8391: install_element (OSPF_NODE, &ospf_passive_interface_addr_cmd);
8392: install_element (OSPF_NODE, &ospf_passive_interface_cmd);
8393: install_element (OSPF_NODE, &ospf_passive_interface_default_cmd);
8394: install_element (OSPF_NODE, &no_ospf_passive_interface_addr_cmd);
8395: install_element (OSPF_NODE, &no_ospf_passive_interface_cmd);
8396: install_element (OSPF_NODE, &no_ospf_passive_interface_default_cmd);
8397:
8398: /* "ospf abr-type" commands. */
8399: install_element (OSPF_NODE, &ospf_abr_type_cmd);
8400: install_element (OSPF_NODE, &no_ospf_abr_type_cmd);
8401:
8402: /* "ospf log-adjacency-changes" commands. */
8403: install_element (OSPF_NODE, &ospf_log_adjacency_changes_cmd);
8404: install_element (OSPF_NODE, &ospf_log_adjacency_changes_detail_cmd);
8405: install_element (OSPF_NODE, &no_ospf_log_adjacency_changes_cmd);
8406: install_element (OSPF_NODE, &no_ospf_log_adjacency_changes_detail_cmd);
8407:
8408: /* "ospf rfc1583-compatible" commands. */
8409: install_element (OSPF_NODE, &ospf_rfc1583_flag_cmd);
8410: install_element (OSPF_NODE, &no_ospf_rfc1583_flag_cmd);
8411: install_element (OSPF_NODE, &ospf_compatible_rfc1583_cmd);
8412: install_element (OSPF_NODE, &no_ospf_compatible_rfc1583_cmd);
8413:
8414: /* "network area" commands. */
8415: install_element (OSPF_NODE, &ospf_network_area_cmd);
8416: install_element (OSPF_NODE, &no_ospf_network_area_cmd);
8417:
8418: /* "area authentication" commands. */
8419: install_element (OSPF_NODE, &ospf_area_authentication_message_digest_cmd);
8420: install_element (OSPF_NODE, &ospf_area_authentication_cmd);
8421: install_element (OSPF_NODE, &no_ospf_area_authentication_cmd);
8422:
8423: /* "area range" commands. */
8424: install_element (OSPF_NODE, &ospf_area_range_cmd);
8425: install_element (OSPF_NODE, &ospf_area_range_advertise_cmd);
8426: install_element (OSPF_NODE, &ospf_area_range_cost_cmd);
8427: install_element (OSPF_NODE, &ospf_area_range_advertise_cost_cmd);
8428: install_element (OSPF_NODE, &ospf_area_range_not_advertise_cmd);
8429: install_element (OSPF_NODE, &no_ospf_area_range_cmd);
8430: install_element (OSPF_NODE, &no_ospf_area_range_advertise_cmd);
8431: install_element (OSPF_NODE, &no_ospf_area_range_cost_cmd);
8432: install_element (OSPF_NODE, &no_ospf_area_range_advertise_cost_cmd);
8433: install_element (OSPF_NODE, &ospf_area_range_substitute_cmd);
8434: install_element (OSPF_NODE, &no_ospf_area_range_substitute_cmd);
8435:
8436: /* "area virtual-link" commands. */
8437: install_element (OSPF_NODE, &ospf_area_vlink_cmd);
8438: install_element (OSPF_NODE, &no_ospf_area_vlink_cmd);
8439:
8440: install_element (OSPF_NODE, &ospf_area_vlink_param1_cmd);
8441: install_element (OSPF_NODE, &no_ospf_area_vlink_param1_cmd);
8442:
8443: install_element (OSPF_NODE, &ospf_area_vlink_param2_cmd);
8444: install_element (OSPF_NODE, &no_ospf_area_vlink_param2_cmd);
8445:
8446: install_element (OSPF_NODE, &ospf_area_vlink_param3_cmd);
8447: install_element (OSPF_NODE, &no_ospf_area_vlink_param3_cmd);
8448:
8449: install_element (OSPF_NODE, &ospf_area_vlink_param4_cmd);
8450: install_element (OSPF_NODE, &no_ospf_area_vlink_param4_cmd);
8451:
8452: install_element (OSPF_NODE, &ospf_area_vlink_authtype_args_cmd);
8453: install_element (OSPF_NODE, &ospf_area_vlink_authtype_cmd);
8454: install_element (OSPF_NODE, &no_ospf_area_vlink_authtype_cmd);
8455:
8456: install_element (OSPF_NODE, &ospf_area_vlink_md5_cmd);
8457: install_element (OSPF_NODE, &no_ospf_area_vlink_md5_cmd);
8458:
8459: install_element (OSPF_NODE, &ospf_area_vlink_authkey_cmd);
8460: install_element (OSPF_NODE, &no_ospf_area_vlink_authkey_cmd);
8461:
8462: install_element (OSPF_NODE, &ospf_area_vlink_authtype_args_authkey_cmd);
8463: install_element (OSPF_NODE, &ospf_area_vlink_authtype_authkey_cmd);
8464: install_element (OSPF_NODE, &no_ospf_area_vlink_authtype_authkey_cmd);
8465:
8466: install_element (OSPF_NODE, &ospf_area_vlink_authtype_args_md5_cmd);
8467: install_element (OSPF_NODE, &ospf_area_vlink_authtype_md5_cmd);
8468: install_element (OSPF_NODE, &no_ospf_area_vlink_authtype_md5_cmd);
8469:
8470: /* "area stub" commands. */
8471: install_element (OSPF_NODE, &ospf_area_stub_no_summary_cmd);
8472: install_element (OSPF_NODE, &ospf_area_stub_cmd);
8473: install_element (OSPF_NODE, &no_ospf_area_stub_no_summary_cmd);
8474: install_element (OSPF_NODE, &no_ospf_area_stub_cmd);
8475:
8476: /* "area nssa" commands. */
8477: install_element (OSPF_NODE, &ospf_area_nssa_cmd);
8478: install_element (OSPF_NODE, &ospf_area_nssa_translate_no_summary_cmd);
8479: install_element (OSPF_NODE, &ospf_area_nssa_translate_cmd);
8480: install_element (OSPF_NODE, &ospf_area_nssa_no_summary_cmd);
8481: install_element (OSPF_NODE, &no_ospf_area_nssa_cmd);
8482: install_element (OSPF_NODE, &no_ospf_area_nssa_no_summary_cmd);
8483:
8484: install_element (OSPF_NODE, &ospf_area_default_cost_cmd);
8485: install_element (OSPF_NODE, &no_ospf_area_default_cost_cmd);
8486:
8487: install_element (OSPF_NODE, &ospf_area_shortcut_cmd);
8488: install_element (OSPF_NODE, &no_ospf_area_shortcut_cmd);
8489:
8490: install_element (OSPF_NODE, &ospf_area_export_list_cmd);
8491: install_element (OSPF_NODE, &no_ospf_area_export_list_cmd);
8492:
8493: install_element (OSPF_NODE, &ospf_area_filter_list_cmd);
8494: install_element (OSPF_NODE, &no_ospf_area_filter_list_cmd);
8495:
8496: install_element (OSPF_NODE, &ospf_area_import_list_cmd);
8497: install_element (OSPF_NODE, &no_ospf_area_import_list_cmd);
8498:
8499: /* SPF timer commands */
8500: install_element (OSPF_NODE, &ospf_timers_spf_cmd);
8501: install_element (OSPF_NODE, &no_ospf_timers_spf_cmd);
8502: install_element (OSPF_NODE, &ospf_timers_throttle_spf_cmd);
8503: install_element (OSPF_NODE, &no_ospf_timers_throttle_spf_cmd);
8504:
8505: /* refresh timer commands */
8506: install_element (OSPF_NODE, &ospf_refresh_timer_cmd);
8507: install_element (OSPF_NODE, &no_ospf_refresh_timer_val_cmd);
8508: install_element (OSPF_NODE, &no_ospf_refresh_timer_cmd);
8509:
8510: /* max-metric commands */
8511: install_element (OSPF_NODE, &ospf_max_metric_router_lsa_admin_cmd);
8512: install_element (OSPF_NODE, &no_ospf_max_metric_router_lsa_admin_cmd);
8513: install_element (OSPF_NODE, &ospf_max_metric_router_lsa_startup_cmd);
8514: install_element (OSPF_NODE, &no_ospf_max_metric_router_lsa_startup_cmd);
8515: install_element (OSPF_NODE, &ospf_max_metric_router_lsa_shutdown_cmd);
8516: install_element (OSPF_NODE, &no_ospf_max_metric_router_lsa_shutdown_cmd);
8517:
8518: /* reference bandwidth commands */
8519: install_element (OSPF_NODE, &ospf_auto_cost_reference_bandwidth_cmd);
8520: install_element (OSPF_NODE, &no_ospf_auto_cost_reference_bandwidth_cmd);
8521:
8522: /* "neighbor" commands. */
8523: install_element (OSPF_NODE, &ospf_neighbor_cmd);
8524: install_element (OSPF_NODE, &ospf_neighbor_priority_poll_interval_cmd);
8525: install_element (OSPF_NODE, &ospf_neighbor_priority_cmd);
8526: install_element (OSPF_NODE, &ospf_neighbor_poll_interval_cmd);
8527: install_element (OSPF_NODE, &ospf_neighbor_poll_interval_priority_cmd);
8528: install_element (OSPF_NODE, &no_ospf_neighbor_cmd);
8529: install_element (OSPF_NODE, &no_ospf_neighbor_priority_cmd);
8530: install_element (OSPF_NODE, &no_ospf_neighbor_poll_interval_cmd);
8531:
8532: /* Init interface related vty commands. */
8533: ospf_vty_if_init ();
8534:
8535: /* Init zebra related vty commands. */
8536: ospf_vty_zebra_init ();
8537: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>