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