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