blob: f59b6f95c30289bac495365e1883a6e8a143b6c3 [file] [log] [blame]
paul718e3742002-12-13 20:15:29 +00001/*
hasso508e53e2004-05-18 18:57:06 +00002 * Copyright (C) 2003 Yasuhiro Ohara
paul718e3742002-12-13 20:15:29 +00003 *
4 * This file is part of GNU Zebra.
5 *
6 * GNU Zebra is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the
8 * Free Software Foundation; either version 2, or (at your option) any
9 * later version.
10 *
11 * GNU Zebra is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with GNU Zebra; see the file COPYING. If not, write to the
18 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 * Boston, MA 02111-1307, USA.
20 */
21
22#include <zebra.h>
23
24#include "log.h"
25#include "memory.h"
26#include "vty.h"
27#include "linklist.h"
28#include "prefix.h"
29#include "table.h"
30#include "thread.h"
31#include "command.h"
32
paul718e3742002-12-13 20:15:29 +000033#include "ospf6_proto.h"
hasso508e53e2004-05-18 18:57:06 +000034#include "ospf6_message.h"
paul718e3742002-12-13 20:15:29 +000035#include "ospf6_lsa.h"
36#include "ospf6_lsdb.h"
paul718e3742002-12-13 20:15:29 +000037#include "ospf6_route.h"
38#include "ospf6_zebra.h"
39
hasso508e53e2004-05-18 18:57:06 +000040#include "ospf6_top.h"
41#include "ospf6_area.h"
42#include "ospf6_interface.h"
43#include "ospf6_neighbor.h"
paul718e3742002-12-13 20:15:29 +000044
hasso6452df02004-08-15 05:52:07 +000045#include "ospf6_flood.h"
hasso508e53e2004-05-18 18:57:06 +000046#include "ospf6_asbr.h"
hasso049207c2004-08-04 20:02:13 +000047#include "ospf6_abr.h"
hasso6452df02004-08-15 05:52:07 +000048#include "ospf6_intra.h"
hasso049207c2004-08-04 20:02:13 +000049#include "ospf6d.h"
paul718e3742002-12-13 20:15:29 +000050
51/* global ospf6d variable */
52struct ospf6 *ospf6;
53
Paul Jakma6ac29a52008-08-15 13:45:30 +010054static void
hasso508e53e2004-05-18 18:57:06 +000055ospf6_top_lsdb_hook_add (struct ospf6_lsa *lsa)
paul718e3742002-12-13 20:15:29 +000056{
hasso508e53e2004-05-18 18:57:06 +000057 switch (ntohs (lsa->header->type))
paul718e3742002-12-13 20:15:29 +000058 {
hasso508e53e2004-05-18 18:57:06 +000059 case OSPF6_LSTYPE_AS_EXTERNAL:
60 ospf6_asbr_lsa_add (lsa);
61 break;
62
63 default:
hasso508e53e2004-05-18 18:57:06 +000064 break;
paul718e3742002-12-13 20:15:29 +000065 }
66}
67
Paul Jakma6ac29a52008-08-15 13:45:30 +010068static void
hasso508e53e2004-05-18 18:57:06 +000069ospf6_top_lsdb_hook_remove (struct ospf6_lsa *lsa)
paul718e3742002-12-13 20:15:29 +000070{
hasso508e53e2004-05-18 18:57:06 +000071 switch (ntohs (lsa->header->type))
paul718e3742002-12-13 20:15:29 +000072 {
hasso508e53e2004-05-18 18:57:06 +000073 case OSPF6_LSTYPE_AS_EXTERNAL:
74 ospf6_asbr_lsa_remove (lsa);
75 break;
76
77 default:
hasso508e53e2004-05-18 18:57:06 +000078 break;
paul718e3742002-12-13 20:15:29 +000079 }
80}
81
Paul Jakma6ac29a52008-08-15 13:45:30 +010082static void
hasso049207c2004-08-04 20:02:13 +000083ospf6_top_route_hook_add (struct ospf6_route *route)
84{
hasso6452df02004-08-15 05:52:07 +000085 ospf6_abr_originate_summary (route);
hasso049207c2004-08-04 20:02:13 +000086 ospf6_zebra_route_update_add (route);
87}
88
Paul Jakma6ac29a52008-08-15 13:45:30 +010089static void
hasso049207c2004-08-04 20:02:13 +000090ospf6_top_route_hook_remove (struct ospf6_route *route)
91{
hasso6452df02004-08-15 05:52:07 +000092 ospf6_abr_originate_summary (route);
hasso049207c2004-08-04 20:02:13 +000093 ospf6_zebra_route_update_remove (route);
94}
95
Paul Jakma6ac29a52008-08-15 13:45:30 +010096static void
hasso6452df02004-08-15 05:52:07 +000097ospf6_top_brouter_hook_add (struct ospf6_route *route)
98{
hassoccb59b12004-08-25 09:10:37 +000099 ospf6_abr_examin_brouter (ADV_ROUTER_IN_PREFIX (&route->prefix));
hasso6452df02004-08-15 05:52:07 +0000100 ospf6_asbr_lsentry_add (route);
hassoccb59b12004-08-25 09:10:37 +0000101 ospf6_abr_originate_summary (route);
hasso6452df02004-08-15 05:52:07 +0000102}
103
Paul Jakma6ac29a52008-08-15 13:45:30 +0100104static void
hasso6452df02004-08-15 05:52:07 +0000105ospf6_top_brouter_hook_remove (struct ospf6_route *route)
106{
hassoccb59b12004-08-25 09:10:37 +0000107 ospf6_abr_examin_brouter (ADV_ROUTER_IN_PREFIX (&route->prefix));
hasso6452df02004-08-15 05:52:07 +0000108 ospf6_asbr_lsentry_remove (route);
hassoccb59b12004-08-25 09:10:37 +0000109 ospf6_abr_originate_summary (route);
hasso6452df02004-08-15 05:52:07 +0000110}
111
Paul Jakma6ac29a52008-08-15 13:45:30 +0100112static struct ospf6 *
113ospf6_create (void)
paul718e3742002-12-13 20:15:29 +0000114{
hasso508e53e2004-05-18 18:57:06 +0000115 struct ospf6 *o;
paul718e3742002-12-13 20:15:29 +0000116
hasso508e53e2004-05-18 18:57:06 +0000117 o = XMALLOC (MTYPE_OSPF6_TOP, sizeof (struct ospf6));
118 memset (o, 0, sizeof (struct ospf6));
119
120 /* initialize */
121 gettimeofday (&o->starttime, (struct timezone *) NULL);
122 o->area_list = list_new ();
123 o->area_list->cmp = ospf6_area_cmp;
hasso6452df02004-08-15 05:52:07 +0000124 o->lsdb = ospf6_lsdb_create (o);
125 o->lsdb_self = ospf6_lsdb_create (o);
hasso508e53e2004-05-18 18:57:06 +0000126 o->lsdb->hook_add = ospf6_top_lsdb_hook_add;
127 o->lsdb->hook_remove = ospf6_top_lsdb_hook_remove;
128
Paul Jakmacf1ce252006-05-15 10:46:07 +0000129 o->route_table = OSPF6_ROUTE_TABLE_CREATE (GLOBAL, ROUTES);
130 o->route_table->scope = o;
hasso049207c2004-08-04 20:02:13 +0000131 o->route_table->hook_add = ospf6_top_route_hook_add;
132 o->route_table->hook_remove = ospf6_top_route_hook_remove;
hasso508e53e2004-05-18 18:57:06 +0000133
Paul Jakmacf1ce252006-05-15 10:46:07 +0000134 o->brouter_table = OSPF6_ROUTE_TABLE_CREATE (GLOBAL, BORDER_ROUTERS);
135 o->brouter_table->scope = o;
hasso6452df02004-08-15 05:52:07 +0000136 o->brouter_table->hook_add = ospf6_top_brouter_hook_add;
137 o->brouter_table->hook_remove = ospf6_top_brouter_hook_remove;
hasso049207c2004-08-04 20:02:13 +0000138
Paul Jakmacf1ce252006-05-15 10:46:07 +0000139 o->external_table = OSPF6_ROUTE_TABLE_CREATE (GLOBAL, EXTERNAL_ROUTES);
140 o->external_table->scope = o;
141
hasso508e53e2004-05-18 18:57:06 +0000142 o->external_id_table = route_table_init ();
143
144 return o;
145}
146
Paul Jakma6ac29a52008-08-15 13:45:30 +0100147static void
hasso508e53e2004-05-18 18:57:06 +0000148ospf6_delete (struct ospf6 *o)
149{
paul1eb8ef22005-04-07 07:30:20 +0000150 struct listnode *node, *nnode;
hasso508e53e2004-05-18 18:57:06 +0000151 struct ospf6_area *oa;
152
paul1eb8ef22005-04-07 07:30:20 +0000153 for (ALL_LIST_ELEMENTS (o->area_list, node, nnode, oa))
154 ospf6_area_delete (oa);
hasso508e53e2004-05-18 18:57:06 +0000155
156 ospf6_lsdb_delete (o->lsdb);
hasso6452df02004-08-15 05:52:07 +0000157 ospf6_lsdb_delete (o->lsdb_self);
hasso508e53e2004-05-18 18:57:06 +0000158
159 ospf6_route_table_delete (o->route_table);
hasso049207c2004-08-04 20:02:13 +0000160 ospf6_route_table_delete (o->brouter_table);
hasso508e53e2004-05-18 18:57:06 +0000161
162 ospf6_route_table_delete (o->external_table);
163 route_table_finish (o->external_id_table);
164
165 XFREE (MTYPE_OSPF6_TOP, o);
166}
167
Paul Jakma6ac29a52008-08-15 13:45:30 +0100168static void
hasso508e53e2004-05-18 18:57:06 +0000169ospf6_enable (struct ospf6 *o)
170{
paul1eb8ef22005-04-07 07:30:20 +0000171 struct listnode *node, *nnode;
hasso508e53e2004-05-18 18:57:06 +0000172 struct ospf6_area *oa;
173
174 if (CHECK_FLAG (o->flag, OSPF6_DISABLED))
175 {
176 UNSET_FLAG (o->flag, OSPF6_DISABLED);
paul1eb8ef22005-04-07 07:30:20 +0000177 for (ALL_LIST_ELEMENTS (o->area_list, node, nnode, oa))
178 ospf6_area_enable (oa);
paul718e3742002-12-13 20:15:29 +0000179 }
180}
181
Paul Jakma6ac29a52008-08-15 13:45:30 +0100182static void
hasso508e53e2004-05-18 18:57:06 +0000183ospf6_disable (struct ospf6 *o)
paul718e3742002-12-13 20:15:29 +0000184{
paul1eb8ef22005-04-07 07:30:20 +0000185 struct listnode *node, *nnode;
hasso508e53e2004-05-18 18:57:06 +0000186 struct ospf6_area *oa;
paul718e3742002-12-13 20:15:29 +0000187
hasso508e53e2004-05-18 18:57:06 +0000188 if (! CHECK_FLAG (o->flag, OSPF6_DISABLED))
189 {
190 SET_FLAG (o->flag, OSPF6_DISABLED);
paul1eb8ef22005-04-07 07:30:20 +0000191
192 for (ALL_LIST_ELEMENTS (o->area_list, node, nnode, oa))
193 ospf6_area_disable (oa);
paul718e3742002-12-13 20:15:29 +0000194
hasso508e53e2004-05-18 18:57:06 +0000195 ospf6_lsdb_remove_all (o->lsdb);
196 ospf6_route_remove_all (o->route_table);
hasso6452df02004-08-15 05:52:07 +0000197 ospf6_route_remove_all (o->brouter_table);
hasso508e53e2004-05-18 18:57:06 +0000198 }
199}
paul718e3742002-12-13 20:15:29 +0000200
Paul Jakma6ac29a52008-08-15 13:45:30 +0100201static int
hasso508e53e2004-05-18 18:57:06 +0000202ospf6_maxage_remover (struct thread *thread)
203{
204 struct ospf6 *o = (struct ospf6 *) THREAD_ARG (thread);
205 struct ospf6_area *oa;
206 struct ospf6_interface *oi;
207 struct ospf6_neighbor *on;
hasso52dc7ee2004-09-23 19:18:23 +0000208 struct listnode *i, *j, *k;
hasso508e53e2004-05-18 18:57:06 +0000209
210 o->maxage_remover = (struct thread *) NULL;
hasso508e53e2004-05-18 18:57:06 +0000211
paul1eb8ef22005-04-07 07:30:20 +0000212 for (ALL_LIST_ELEMENTS_RO (o->area_list, i, oa))
hasso508e53e2004-05-18 18:57:06 +0000213 {
paul1eb8ef22005-04-07 07:30:20 +0000214 for (ALL_LIST_ELEMENTS_RO (oa->if_list, j, oi))
hasso508e53e2004-05-18 18:57:06 +0000215 {
paul1eb8ef22005-04-07 07:30:20 +0000216 for (ALL_LIST_ELEMENTS_RO (oi->neighbor_list, k, on))
hasso508e53e2004-05-18 18:57:06 +0000217 {
hasso508e53e2004-05-18 18:57:06 +0000218 if (on->state != OSPF6_NEIGHBOR_EXCHANGE &&
219 on->state != OSPF6_NEIGHBOR_LOADING)
220 continue;
221
hasso508e53e2004-05-18 18:57:06 +0000222 return 0;
223 }
224 }
225 }
226
paul1eb8ef22005-04-07 07:30:20 +0000227 for (ALL_LIST_ELEMENTS_RO (o->area_list, i, oa))
hasso508e53e2004-05-18 18:57:06 +0000228 {
paul1eb8ef22005-04-07 07:30:20 +0000229 for (ALL_LIST_ELEMENTS_RO (oa->if_list, j, oi))
230 OSPF6_LSDB_MAXAGE_REMOVER (oi->lsdb);
231
hasso508e53e2004-05-18 18:57:06 +0000232 OSPF6_LSDB_MAXAGE_REMOVER (oa->lsdb);
233 }
234 OSPF6_LSDB_MAXAGE_REMOVER (o->lsdb);
235
paul718e3742002-12-13 20:15:29 +0000236 return 0;
237}
238
239void
hasso508e53e2004-05-18 18:57:06 +0000240ospf6_maxage_remove (struct ospf6 *o)
paul718e3742002-12-13 20:15:29 +0000241{
hasso508e53e2004-05-18 18:57:06 +0000242 if (o && ! o->maxage_remover)
243 o->maxage_remover = thread_add_event (master, ospf6_maxage_remover, o, 0);
244}
paul718e3742002-12-13 20:15:29 +0000245
hasso508e53e2004-05-18 18:57:06 +0000246/* start ospf6 */
247DEFUN (router_ospf6,
248 router_ospf6_cmd,
249 "router ospf6",
250 ROUTER_STR
251 OSPF6_STR)
252{
253 if (ospf6 == NULL)
254 ospf6 = ospf6_create ();
255 if (CHECK_FLAG (ospf6->flag, OSPF6_DISABLED))
256 ospf6_enable (ospf6);
257
258 /* set current ospf point. */
259 vty->node = OSPF6_NODE;
260 vty->index = ospf6;
261
262 return CMD_SUCCESS;
263}
264
265/* stop ospf6 */
266DEFUN (no_router_ospf6,
267 no_router_ospf6_cmd,
268 "no router ospf6",
269 NO_STR
270 OSPF6_ROUTER_STR)
271{
272 if (ospf6 == NULL || CHECK_FLAG (ospf6->flag, OSPF6_DISABLED))
hasso049207c2004-08-04 20:02:13 +0000273 vty_out (vty, "OSPFv3 is not running%s", VNL);
hasso508e53e2004-05-18 18:57:06 +0000274 else
275 ospf6_disable (ospf6);
276
277 /* return to config node . */
278 vty->node = CONFIG_NODE;
279 vty->index = NULL;
280
281 return CMD_SUCCESS;
282}
283
284/* change Router_ID commands. */
285DEFUN (ospf6_router_id,
286 ospf6_router_id_cmd,
287 "router-id A.B.C.D",
288 "Configure OSPF Router-ID\n"
289 V4NOTATION_STR)
290{
291 int ret;
292 u_int32_t router_id;
293 struct ospf6 *o;
294
295 o = (struct ospf6 *) vty->index;
296
297 ret = inet_pton (AF_INET, argv[0], &router_id);
298 if (ret == 0)
299 {
hasso049207c2004-08-04 20:02:13 +0000300 vty_out (vty, "malformed OSPF Router-ID: %s%s", argv[0], VNL);
hasso508e53e2004-05-18 18:57:06 +0000301 return CMD_SUCCESS;
302 }
303
hassoc8a440e2004-10-11 17:02:40 +0000304 o->router_id_static = router_id;
305 if (o->router_id == 0)
306 o->router_id = router_id;
307
hasso508e53e2004-05-18 18:57:06 +0000308 return CMD_SUCCESS;
309}
310
311DEFUN (ospf6_interface_area,
312 ospf6_interface_area_cmd,
313 "interface IFNAME area A.B.C.D",
314 "Enable routing on an IPv6 interface\n"
315 IFNAME_STR
316 "Specify the OSPF6 area ID\n"
317 "OSPF6 area ID in IPv4 address notation\n"
318 )
319{
320 struct ospf6 *o;
hasso3b687352004-08-19 06:56:53 +0000321 struct ospf6_area *oa;
hasso508e53e2004-05-18 18:57:06 +0000322 struct ospf6_interface *oi;
323 struct interface *ifp;
324 u_int32_t area_id;
325
326 o = (struct ospf6 *) vty->index;
327
328 /* find/create ospf6 interface */
329 ifp = if_get_by_name (argv[0]);
330 oi = (struct ospf6_interface *) ifp->info;
331 if (oi == NULL)
332 oi = ospf6_interface_create (ifp);
333 if (oi->area)
334 {
335 vty_out (vty, "%s already attached to Area %s%s",
hasso049207c2004-08-04 20:02:13 +0000336 oi->interface->name, oi->area->name, VNL);
hasso508e53e2004-05-18 18:57:06 +0000337 return CMD_SUCCESS;
338 }
339
340 /* parse Area-ID */
341 if (inet_pton (AF_INET, argv[1], &area_id) != 1)
342 {
hasso049207c2004-08-04 20:02:13 +0000343 vty_out (vty, "Invalid Area-ID: %s%s", argv[1], VNL);
hasso508e53e2004-05-18 18:57:06 +0000344 return CMD_SUCCESS;
345 }
346
347 /* find/create ospf6 area */
348 oa = ospf6_area_lookup (area_id, o);
349 if (oa == NULL)
350 oa = ospf6_area_create (area_id, o);
351
352 /* attach interface to area */
353 listnode_add (oa->if_list, oi); /* sort ?? */
354 oi->area = oa;
355
hasso6452df02004-08-15 05:52:07 +0000356 SET_FLAG (oa->flag, OSPF6_AREA_ENABLE);
357
hasso508e53e2004-05-18 18:57:06 +0000358 /* start up */
359 thread_add_event (master, interface_up, oi, 0);
hasso6452df02004-08-15 05:52:07 +0000360
hasso3b687352004-08-19 06:56:53 +0000361 /* If the router is ABR, originate summary routes */
362 if (ospf6_is_router_abr (o))
363 ospf6_abr_enable_area (oa);
hasso6452df02004-08-15 05:52:07 +0000364
hasso508e53e2004-05-18 18:57:06 +0000365 return CMD_SUCCESS;
366}
367
368DEFUN (no_ospf6_interface_area,
369 no_ospf6_interface_area_cmd,
370 "no interface IFNAME area A.B.C.D",
371 NO_STR
372 "Disable routing on an IPv6 interface\n"
373 IFNAME_STR
374 "Specify the OSPF6 area ID\n"
375 "OSPF6 area ID in IPv4 address notation\n"
376 )
377{
378 struct ospf6 *o;
379 struct ospf6_interface *oi;
hasso3b687352004-08-19 06:56:53 +0000380 struct ospf6_area *oa;
hasso508e53e2004-05-18 18:57:06 +0000381 struct interface *ifp;
382 u_int32_t area_id;
383
384 o = (struct ospf6 *) vty->index;
385
386 ifp = if_lookup_by_name (argv[0]);
387 if (ifp == NULL)
388 {
hasso049207c2004-08-04 20:02:13 +0000389 vty_out (vty, "No such interface %s%s", argv[0], VNL);
hasso508e53e2004-05-18 18:57:06 +0000390 return CMD_SUCCESS;
391 }
392
393 oi = (struct ospf6_interface *) ifp->info;
394 if (oi == NULL)
395 {
hasso049207c2004-08-04 20:02:13 +0000396 vty_out (vty, "Interface %s not enabled%s", ifp->name, VNL);
hasso508e53e2004-05-18 18:57:06 +0000397 return CMD_SUCCESS;
398 }
399
400 /* parse Area-ID */
401 if (inet_pton (AF_INET, argv[1], &area_id) != 1)
402 {
hasso049207c2004-08-04 20:02:13 +0000403 vty_out (vty, "Invalid Area-ID: %s%s", argv[1], VNL);
hasso508e53e2004-05-18 18:57:06 +0000404 return CMD_SUCCESS;
405 }
406
407 if (oi->area->area_id != area_id)
408 {
409 vty_out (vty, "Wrong Area-ID: %s is attached to area %s%s",
hasso049207c2004-08-04 20:02:13 +0000410 oi->interface->name, oi->area->name, VNL);
hasso508e53e2004-05-18 18:57:06 +0000411 return CMD_SUCCESS;
412 }
413
414 thread_execute (master, interface_down, oi, 0);
415
hasso6452df02004-08-15 05:52:07 +0000416 oa = oi->area;
hasso508e53e2004-05-18 18:57:06 +0000417 listnode_delete (oi->area->if_list, oi);
418 oi->area = (struct ospf6_area *) NULL;
419
hasso6452df02004-08-15 05:52:07 +0000420 /* Withdraw inter-area routes from this area, if necessary */
421 if (oa->if_list->count == 0)
422 {
423 UNSET_FLAG (oa->flag, OSPF6_AREA_ENABLE);
hasso3b687352004-08-19 06:56:53 +0000424 ospf6_abr_disable_area (oa);
hasso6452df02004-08-15 05:52:07 +0000425 }
426
hasso508e53e2004-05-18 18:57:06 +0000427 return CMD_SUCCESS;
paul718e3742002-12-13 20:15:29 +0000428}
429
Paul Jakma6ac29a52008-08-15 13:45:30 +0100430static void
hasso508e53e2004-05-18 18:57:06 +0000431ospf6_show (struct vty *vty, struct ospf6 *o)
paul718e3742002-12-13 20:15:29 +0000432{
hasso52dc7ee2004-09-23 19:18:23 +0000433 struct listnode *n;
hasso508e53e2004-05-18 18:57:06 +0000434 struct ospf6_area *oa;
435 char router_id[16], duration[32];
paul718e3742002-12-13 20:15:29 +0000436 struct timeval now, running;
437
438 /* process id, router id */
hasso508e53e2004-05-18 18:57:06 +0000439 inet_ntop (AF_INET, &o->router_id, router_id, sizeof (router_id));
440 vty_out (vty, " OSPFv3 Routing Process (0) with Router-ID %s%s",
hasso049207c2004-08-04 20:02:13 +0000441 router_id, VNL);
paul718e3742002-12-13 20:15:29 +0000442
443 /* running time */
444 gettimeofday (&now, (struct timezone *)NULL);
hasso508e53e2004-05-18 18:57:06 +0000445 timersub (&now, &o->starttime, &running);
446 timerstring (&running, duration, sizeof (duration));
hasso049207c2004-08-04 20:02:13 +0000447 vty_out (vty, " Running %s%s", duration, VNL);
paul718e3742002-12-13 20:15:29 +0000448
hasso508e53e2004-05-18 18:57:06 +0000449 /* Redistribute configuration */
450 /* XXX */
paul718e3742002-12-13 20:15:29 +0000451
452 /* LSAs */
453 vty_out (vty, " Number of AS scoped LSAs is %u%s",
hasso049207c2004-08-04 20:02:13 +0000454 o->lsdb->count, VNL);
paul718e3742002-12-13 20:15:29 +0000455
456 /* Areas */
457 vty_out (vty, " Number of areas in this router is %u%s",
hasso049207c2004-08-04 20:02:13 +0000458 listcount (o->area_list), VNL);
paul1eb8ef22005-04-07 07:30:20 +0000459
460 for (ALL_LIST_ELEMENTS_RO (o->area_list, n, oa))
461 ospf6_area_show (vty, oa);
paul718e3742002-12-13 20:15:29 +0000462}
463
hasso508e53e2004-05-18 18:57:06 +0000464/* show top level structures */
465DEFUN (show_ipv6_ospf6,
466 show_ipv6_ospf6_cmd,
467 "show ipv6 ospf6",
468 SHOW_STR
469 IP6_STR
470 OSPF6_STR)
paul718e3742002-12-13 20:15:29 +0000471{
hasso508e53e2004-05-18 18:57:06 +0000472 OSPF6_CMD_CHECK_RUNNING ();
paul718e3742002-12-13 20:15:29 +0000473
hasso508e53e2004-05-18 18:57:06 +0000474 ospf6_show (vty, ospf6);
475 return CMD_SUCCESS;
paul718e3742002-12-13 20:15:29 +0000476}
477
478DEFUN (show_ipv6_ospf6_route,
479 show_ipv6_ospf6_route_cmd,
480 "show ipv6 ospf6 route",
481 SHOW_STR
482 IP6_STR
483 OSPF6_STR
hasso508e53e2004-05-18 18:57:06 +0000484 ROUTE_STR
paul718e3742002-12-13 20:15:29 +0000485 )
486{
hasso508e53e2004-05-18 18:57:06 +0000487 ospf6_route_table_show (vty, argc, argv, ospf6->route_table);
488 return CMD_SUCCESS;
paul718e3742002-12-13 20:15:29 +0000489}
490
491ALIAS (show_ipv6_ospf6_route,
hasso508e53e2004-05-18 18:57:06 +0000492 show_ipv6_ospf6_route_detail_cmd,
hasso4846ef62004-09-03 06:04:00 +0000493 "show ipv6 ospf6 route (X:X::X:X|X:X::X:X/M|detail|summary)",
paul718e3742002-12-13 20:15:29 +0000494 SHOW_STR
495 IP6_STR
496 OSPF6_STR
hasso508e53e2004-05-18 18:57:06 +0000497 ROUTE_STR
498 "Specify IPv6 address\n"
499 "Specify IPv6 prefix\n"
500 "Detailed information\n"
501 "Summary of route table\n"
Paul Jakma6ac29a52008-08-15 13:45:30 +0100502 )
paul718e3742002-12-13 20:15:29 +0000503
hasso508e53e2004-05-18 18:57:06 +0000504DEFUN (show_ipv6_ospf6_route_match,
505 show_ipv6_ospf6_route_match_cmd,
hasso4846ef62004-09-03 06:04:00 +0000506 "show ipv6 ospf6 route X:X::X:X/M match",
paul718e3742002-12-13 20:15:29 +0000507 SHOW_STR
508 IP6_STR
509 OSPF6_STR
hasso508e53e2004-05-18 18:57:06 +0000510 ROUTE_STR
511 "Specify IPv6 prefix\n"
512 "Display routes which match the specified route\n"
paul718e3742002-12-13 20:15:29 +0000513 )
514{
paul0c083ee2004-10-10 12:54:58 +0000515 const char *sargv[CMD_ARGC_MAX];
hasso508e53e2004-05-18 18:57:06 +0000516 int i, sargc;
517
518 /* copy argv to sargv and then append "match" */
519 for (i = 0; i < argc; i++)
520 sargv[i] = argv[i];
521 sargc = argc;
522 sargv[sargc++] = "match";
523 sargv[sargc] = NULL;
524
525 ospf6_route_table_show (vty, sargc, sargv, ospf6->route_table);
526 return CMD_SUCCESS;
paul718e3742002-12-13 20:15:29 +0000527}
528
hasso508e53e2004-05-18 18:57:06 +0000529DEFUN (show_ipv6_ospf6_route_match_detail,
530 show_ipv6_ospf6_route_match_detail_cmd,
hasso4846ef62004-09-03 06:04:00 +0000531 "show ipv6 ospf6 route X:X::X:X/M match detail",
paul718e3742002-12-13 20:15:29 +0000532 SHOW_STR
533 IP6_STR
534 OSPF6_STR
hasso508e53e2004-05-18 18:57:06 +0000535 ROUTE_STR
536 "Specify IPv6 prefix\n"
537 "Display routes which match the specified route\n"
paul718e3742002-12-13 20:15:29 +0000538 "Detailed information\n"
539 )
hasso508e53e2004-05-18 18:57:06 +0000540{
paul0c083ee2004-10-10 12:54:58 +0000541 const char *sargv[CMD_ARGC_MAX];
hasso508e53e2004-05-18 18:57:06 +0000542 int i, sargc;
paul718e3742002-12-13 20:15:29 +0000543
hasso508e53e2004-05-18 18:57:06 +0000544 /* copy argv to sargv and then append "match" and "detail" */
545 for (i = 0; i < argc; i++)
546 sargv[i] = argv[i];
547 sargc = argc;
548 sargv[sargc++] = "match";
549 sargv[sargc++] = "detail";
550 sargv[sargc] = NULL;
paul718e3742002-12-13 20:15:29 +0000551
hasso508e53e2004-05-18 18:57:06 +0000552 ospf6_route_table_show (vty, sargc, sargv, ospf6->route_table);
553 return CMD_SUCCESS;
554}
555
Paul Jakmacb4b8842006-05-15 10:39:30 +0000556ALIAS (show_ipv6_ospf6_route_match,
557 show_ipv6_ospf6_route_longer_cmd,
558 "show ipv6 ospf6 route X:X::X:X/M longer",
559 SHOW_STR
560 IP6_STR
561 OSPF6_STR
562 ROUTE_STR
563 "Specify IPv6 prefix\n"
564 "Display routes longer than the specified route\n"
Paul Jakma6ac29a52008-08-15 13:45:30 +0100565 )
Paul Jakmacb4b8842006-05-15 10:39:30 +0000566
567DEFUN (show_ipv6_ospf6_route_match_detail,
568 show_ipv6_ospf6_route_longer_detail_cmd,
569 "show ipv6 ospf6 route X:X::X:X/M longer detail",
570 SHOW_STR
571 IP6_STR
572 OSPF6_STR
573 ROUTE_STR
574 "Specify IPv6 prefix\n"
575 "Display routes longer than the specified route\n"
576 "Detailed information\n"
577 );
578
hasso4846ef62004-09-03 06:04:00 +0000579ALIAS (show_ipv6_ospf6_route,
580 show_ipv6_ospf6_route_type_cmd,
581 "show ipv6 ospf6 route (intra-area|inter-area|external-1|external-2)",
582 SHOW_STR
583 IP6_STR
584 OSPF6_STR
585 ROUTE_STR
586 "Dispaly Intra-Area routes\n"
587 "Dispaly Inter-Area routes\n"
588 "Dispaly Type-1 External routes\n"
589 "Dispaly Type-2 External routes\n"
Paul Jakma6ac29a52008-08-15 13:45:30 +0100590 )
hasso4846ef62004-09-03 06:04:00 +0000591
592DEFUN (show_ipv6_ospf6_route_type_detail,
593 show_ipv6_ospf6_route_type_detail_cmd,
594 "show ipv6 ospf6 route (intra-area|inter-area|external-1|external-2) detail",
595 SHOW_STR
596 IP6_STR
597 OSPF6_STR
598 ROUTE_STR
599 "Dispaly Intra-Area routes\n"
600 "Dispaly Inter-Area routes\n"
601 "Dispaly Type-1 External routes\n"
602 "Dispaly Type-2 External routes\n"
603 "Detailed information\n"
604 )
605{
paul0c083ee2004-10-10 12:54:58 +0000606 const char *sargv[CMD_ARGC_MAX];
hasso4846ef62004-09-03 06:04:00 +0000607 int i, sargc;
608
609 /* copy argv to sargv and then append "detail" */
610 for (i = 0; i < argc; i++)
611 sargv[i] = argv[i];
612 sargc = argc;
613 sargv[sargc++] = "detail";
614 sargv[sargc] = NULL;
615
616 ospf6_route_table_show (vty, sargc, sargv, ospf6->route_table);
617 return CMD_SUCCESS;
618}
hasso508e53e2004-05-18 18:57:06 +0000619
620/* OSPF configuration write function. */
Paul Jakma6ac29a52008-08-15 13:45:30 +0100621static int
hasso508e53e2004-05-18 18:57:06 +0000622config_write_ospf6 (struct vty *vty)
623{
624 char router_id[16];
hasso52dc7ee2004-09-23 19:18:23 +0000625 struct listnode *j, *k;
hasso508e53e2004-05-18 18:57:06 +0000626 struct ospf6_area *oa;
627 struct ospf6_interface *oi;
628
629 /* OSPFv6 configuration. */
630 if (ospf6 == NULL)
631 return CMD_SUCCESS;
632 if (CHECK_FLAG (ospf6->flag, OSPF6_DISABLED))
633 return CMD_SUCCESS;
634
hassoc8a440e2004-10-11 17:02:40 +0000635 inet_ntop (AF_INET, &ospf6->router_id_static, router_id, sizeof (router_id));
hasso049207c2004-08-04 20:02:13 +0000636 vty_out (vty, "router ospf6%s", VNL);
hassoc8a440e2004-10-11 17:02:40 +0000637 if (ospf6->router_id_static != 0)
638 vty_out (vty, " router-id %s%s", router_id, VNL);
hasso508e53e2004-05-18 18:57:06 +0000639
640 ospf6_redistribute_config_write (vty);
hasso6452df02004-08-15 05:52:07 +0000641 ospf6_area_config_write (vty);
hasso508e53e2004-05-18 18:57:06 +0000642
paul1eb8ef22005-04-07 07:30:20 +0000643 for (ALL_LIST_ELEMENTS_RO (ospf6->area_list, j, oa))
hasso508e53e2004-05-18 18:57:06 +0000644 {
paul1eb8ef22005-04-07 07:30:20 +0000645 for (ALL_LIST_ELEMENTS_RO (oa->if_list, k, oi))
646 vty_out (vty, " interface %s area %s%s",
647 oi->interface->name, oa->name, VNL);
hasso508e53e2004-05-18 18:57:06 +0000648 }
hasso049207c2004-08-04 20:02:13 +0000649 vty_out (vty, "!%s", VNL);
hasso508e53e2004-05-18 18:57:06 +0000650 return 0;
651}
652
653/* OSPF6 node structure. */
654struct cmd_node ospf6_node =
655{
656 OSPF6_NODE,
657 "%s(config-ospf6)# ",
hasso69b4a812004-08-26 18:10:36 +0000658 1 /* VTYSH */
hasso508e53e2004-05-18 18:57:06 +0000659};
660
661/* Install ospf related commands. */
paul718e3742002-12-13 20:15:29 +0000662void
Paul Jakma6ac29a52008-08-15 13:45:30 +0100663ospf6_top_init (void)
paul718e3742002-12-13 20:15:29 +0000664{
hasso508e53e2004-05-18 18:57:06 +0000665 /* Install ospf6 top node. */
666 install_node (&ospf6_node, config_write_ospf6);
667
668 install_element (VIEW_NODE, &show_ipv6_ospf6_cmd);
669 install_element (ENABLE_NODE, &show_ipv6_ospf6_cmd);
670 install_element (CONFIG_NODE, &router_ospf6_cmd);
671
paul718e3742002-12-13 20:15:29 +0000672 install_element (VIEW_NODE, &show_ipv6_ospf6_route_cmd);
hasso508e53e2004-05-18 18:57:06 +0000673 install_element (VIEW_NODE, &show_ipv6_ospf6_route_detail_cmd);
674 install_element (VIEW_NODE, &show_ipv6_ospf6_route_match_cmd);
675 install_element (VIEW_NODE, &show_ipv6_ospf6_route_match_detail_cmd);
Paul Jakmacb4b8842006-05-15 10:39:30 +0000676 install_element (VIEW_NODE, &show_ipv6_ospf6_route_longer_cmd);
677 install_element (VIEW_NODE, &show_ipv6_ospf6_route_longer_detail_cmd);
hasso4846ef62004-09-03 06:04:00 +0000678 install_element (VIEW_NODE, &show_ipv6_ospf6_route_type_cmd);
679 install_element (VIEW_NODE, &show_ipv6_ospf6_route_type_detail_cmd);
paul718e3742002-12-13 20:15:29 +0000680 install_element (ENABLE_NODE, &show_ipv6_ospf6_route_cmd);
hasso508e53e2004-05-18 18:57:06 +0000681 install_element (ENABLE_NODE, &show_ipv6_ospf6_route_detail_cmd);
682 install_element (ENABLE_NODE, &show_ipv6_ospf6_route_match_cmd);
683 install_element (ENABLE_NODE, &show_ipv6_ospf6_route_match_detail_cmd);
Paul Jakmacb4b8842006-05-15 10:39:30 +0000684 install_element (ENABLE_NODE, &show_ipv6_ospf6_route_longer_cmd);
685 install_element (ENABLE_NODE, &show_ipv6_ospf6_route_longer_detail_cmd);
hasso4846ef62004-09-03 06:04:00 +0000686 install_element (ENABLE_NODE, &show_ipv6_ospf6_route_type_cmd);
687 install_element (ENABLE_NODE, &show_ipv6_ospf6_route_type_detail_cmd);
hasso508e53e2004-05-18 18:57:06 +0000688
689 install_default (OSPF6_NODE);
690 install_element (OSPF6_NODE, &ospf6_router_id_cmd);
691 install_element (OSPF6_NODE, &ospf6_interface_area_cmd);
692 install_element (OSPF6_NODE, &no_ospf6_interface_area_cmd);
693 install_element (OSPF6_NODE, &no_router_ospf6_cmd);
paul718e3742002-12-13 20:15:29 +0000694}
695
hasso508e53e2004-05-18 18:57:06 +0000696