blob: f4b327e428af52300d4b489ad8a25d45d21b4a70 [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
hasso508e53e2004-05-18 18:57:06 +000022#include <zebra.h>
23
24#include "log.h"
25#include "memory.h"
26#include "linklist.h"
27#include "thread.h"
28#include "vty.h"
29#include "command.h"
30#include "if.h"
31#include "prefix.h"
32#include "table.h"
hasso34956b32005-06-24 08:44:02 +000033#include "plist.h"
34#include "filter.h"
hasso508e53e2004-05-18 18:57:06 +000035
hasso508e53e2004-05-18 18:57:06 +000036#include "ospf6_proto.h"
37#include "ospf6_lsa.h"
38#include "ospf6_lsdb.h"
39#include "ospf6_route.h"
40#include "ospf6_spf.h"
41#include "ospf6_top.h"
42#include "ospf6_area.h"
43#include "ospf6_interface.h"
44#include "ospf6_intra.h"
hasso049207c2004-08-04 20:02:13 +000045#include "ospf6_abr.h"
46#include "ospf6d.h"
paul718e3742002-12-13 20:15:29 +000047
hasso508e53e2004-05-18 18:57:06 +000048int
49ospf6_area_cmp (void *va, void *vb)
paul718e3742002-12-13 20:15:29 +000050{
hasso508e53e2004-05-18 18:57:06 +000051 struct ospf6_area *oa = (struct ospf6_area *) va;
52 struct ospf6_area *ob = (struct ospf6_area *) vb;
hasso6452df02004-08-15 05:52:07 +000053 return (ntohl (oa->area_id) < ntohl (ob->area_id) ? -1 : 1);
paul718e3742002-12-13 20:15:29 +000054}
55
hasso508e53e2004-05-18 18:57:06 +000056/* schedule routing table recalculation */
Paul Jakma6ac29a52008-08-15 13:45:30 +010057static void
hasso508e53e2004-05-18 18:57:06 +000058ospf6_area_lsdb_hook_add (struct ospf6_lsa *lsa)
paul718e3742002-12-13 20:15:29 +000059{
hasso508e53e2004-05-18 18:57:06 +000060 switch (ntohs (lsa->header->type))
paul718e3742002-12-13 20:15:29 +000061 {
hasso508e53e2004-05-18 18:57:06 +000062 case OSPF6_LSTYPE_ROUTER:
63 case OSPF6_LSTYPE_NETWORK:
hasso1e058382004-09-01 21:36:14 +000064 if (IS_OSPF6_DEBUG_EXAMIN_TYPE (lsa->header->type))
65 {
hassoc6487d62004-12-24 06:00:11 +000066 zlog_debug ("Examin %s", lsa->name);
67 zlog_debug ("Schedule SPF Calculation for %s",
68 OSPF6_AREA (lsa->lsdb->data)->name);
hasso1e058382004-09-01 21:36:14 +000069 }
hasso6452df02004-08-15 05:52:07 +000070 ospf6_spf_schedule (OSPF6_AREA (lsa->lsdb->data));
hasso508e53e2004-05-18 18:57:06 +000071 break;
paul718e3742002-12-13 20:15:29 +000072
hasso508e53e2004-05-18 18:57:06 +000073 case OSPF6_LSTYPE_INTRA_PREFIX:
74 ospf6_intra_prefix_lsa_add (lsa);
75 break;
76
77 case OSPF6_LSTYPE_INTER_PREFIX:
78 case OSPF6_LSTYPE_INTER_ROUTER:
hassoccb59b12004-08-25 09:10:37 +000079 ospf6_abr_examin_summary (lsa, (struct ospf6_area *) lsa->lsdb->data);
hasso508e53e2004-05-18 18:57:06 +000080 break;
81
82 default:
hasso508e53e2004-05-18 18:57:06 +000083 break;
84 }
paul718e3742002-12-13 20:15:29 +000085}
86
Paul Jakma6ac29a52008-08-15 13:45:30 +010087static void
hasso508e53e2004-05-18 18:57:06 +000088ospf6_area_lsdb_hook_remove (struct ospf6_lsa *lsa)
paul718e3742002-12-13 20:15:29 +000089{
hasso508e53e2004-05-18 18:57:06 +000090 switch (ntohs (lsa->header->type))
paul718e3742002-12-13 20:15:29 +000091 {
hasso508e53e2004-05-18 18:57:06 +000092 case OSPF6_LSTYPE_ROUTER:
93 case OSPF6_LSTYPE_NETWORK:
hasso1e058382004-09-01 21:36:14 +000094 if (IS_OSPF6_DEBUG_EXAMIN_TYPE (lsa->header->type))
95 {
hassoc6487d62004-12-24 06:00:11 +000096 zlog_debug ("LSA disappearing: %s", lsa->name);
97 zlog_debug ("Schedule SPF Calculation for %s",
hasso1e058382004-09-01 21:36:14 +000098 OSPF6_AREA (lsa->lsdb->data)->name);
99 }
hasso6452df02004-08-15 05:52:07 +0000100 ospf6_spf_schedule (OSPF6_AREA (lsa->lsdb->data));
hasso508e53e2004-05-18 18:57:06 +0000101 break;
paul718e3742002-12-13 20:15:29 +0000102
hasso508e53e2004-05-18 18:57:06 +0000103 case OSPF6_LSTYPE_INTRA_PREFIX:
104 ospf6_intra_prefix_lsa_remove (lsa);
105 break;
106
107 case OSPF6_LSTYPE_INTER_PREFIX:
108 case OSPF6_LSTYPE_INTER_ROUTER:
hassoccb59b12004-08-25 09:10:37 +0000109 ospf6_abr_examin_summary (lsa, (struct ospf6_area *) lsa->lsdb->data);
hasso508e53e2004-05-18 18:57:06 +0000110 break;
111
112 default:
hasso508e53e2004-05-18 18:57:06 +0000113 break;
114 }
115}
116
Paul Jakma6ac29a52008-08-15 13:45:30 +0100117static void
hasso508e53e2004-05-18 18:57:06 +0000118ospf6_area_route_hook_add (struct ospf6_route *route)
119{
120 struct ospf6_route *copy = ospf6_route_copy (route);
121 ospf6_route_add (copy, ospf6->route_table);
122}
123
Paul Jakma6ac29a52008-08-15 13:45:30 +0100124static void
hasso508e53e2004-05-18 18:57:06 +0000125ospf6_area_route_hook_remove (struct ospf6_route *route)
126{
127 struct ospf6_route *copy;
128
129 copy = ospf6_route_lookup_identical (route, ospf6->route_table);
130 if (copy)
131 ospf6_route_remove (copy, ospf6->route_table);
paul718e3742002-12-13 20:15:29 +0000132}
133
134/* Make new area structure */
135struct ospf6_area *
hasso508e53e2004-05-18 18:57:06 +0000136ospf6_area_create (u_int32_t area_id, struct ospf6 *o)
paul718e3742002-12-13 20:15:29 +0000137{
hasso508e53e2004-05-18 18:57:06 +0000138 struct ospf6_area *oa;
hasso049207c2004-08-04 20:02:13 +0000139 struct ospf6_route *route;
paul718e3742002-12-13 20:15:29 +0000140
hasso508e53e2004-05-18 18:57:06 +0000141 oa = XCALLOC (MTYPE_OSPF6_AREA, sizeof (struct ospf6_area));
paul718e3742002-12-13 20:15:29 +0000142
hasso508e53e2004-05-18 18:57:06 +0000143 inet_ntop (AF_INET, &area_id, oa->name, sizeof (oa->name));
144 oa->area_id = area_id;
145 oa->if_list = list_new ();
paul718e3742002-12-13 20:15:29 +0000146
hasso6452df02004-08-15 05:52:07 +0000147 oa->lsdb = ospf6_lsdb_create (oa);
hasso508e53e2004-05-18 18:57:06 +0000148 oa->lsdb->hook_add = ospf6_area_lsdb_hook_add;
149 oa->lsdb->hook_remove = ospf6_area_lsdb_hook_remove;
hasso6452df02004-08-15 05:52:07 +0000150 oa->lsdb_self = ospf6_lsdb_create (oa);
paul718e3742002-12-13 20:15:29 +0000151
Paul Jakmacf1ce252006-05-15 10:46:07 +0000152 oa->spf_table = OSPF6_ROUTE_TABLE_CREATE (AREA, SPF_RESULTS);
153 oa->spf_table->scope = oa;
154 oa->route_table = OSPF6_ROUTE_TABLE_CREATE (AREA, ROUTES);
155 oa->route_table->scope = oa;
hasso508e53e2004-05-18 18:57:06 +0000156 oa->route_table->hook_add = ospf6_area_route_hook_add;
157 oa->route_table->hook_remove = ospf6_area_route_hook_remove;
paul718e3742002-12-13 20:15:29 +0000158
Paul Jakmacf1ce252006-05-15 10:46:07 +0000159 oa->range_table = OSPF6_ROUTE_TABLE_CREATE (AREA, PREFIX_RANGES);
160 oa->range_table->scope = oa;
161 oa->summary_prefix = OSPF6_ROUTE_TABLE_CREATE (AREA, SUMMARY_PREFIXES);
162 oa->summary_prefix->scope = oa;
163 oa->summary_router = OSPF6_ROUTE_TABLE_CREATE (AREA, SUMMARY_ROUTERS);
164 oa->summary_router->scope = oa;
hasso6452df02004-08-15 05:52:07 +0000165
hasso508e53e2004-05-18 18:57:06 +0000166 /* set default options */
167 OSPF6_OPT_SET (oa->options, OSPF6_OPT_V6);
168 OSPF6_OPT_SET (oa->options, OSPF6_OPT_E);
169 OSPF6_OPT_SET (oa->options, OSPF6_OPT_R);
paul718e3742002-12-13 20:15:29 +0000170
hasso508e53e2004-05-18 18:57:06 +0000171 oa->ospf6 = o;
172 listnode_add_sort (o->area_list, oa);
paul718e3742002-12-13 20:15:29 +0000173
hasso049207c2004-08-04 20:02:13 +0000174 /* import athoer area's routes as inter-area routes */
175 for (route = ospf6_route_head (o->route_table); route;
176 route = ospf6_route_next (route))
hasso6452df02004-08-15 05:52:07 +0000177 ospf6_abr_originate_summary_to_area (route, oa);
hasso049207c2004-08-04 20:02:13 +0000178
hasso508e53e2004-05-18 18:57:06 +0000179 return oa;
paul718e3742002-12-13 20:15:29 +0000180}
181
182void
hasso508e53e2004-05-18 18:57:06 +0000183ospf6_area_delete (struct ospf6_area *oa)
paul718e3742002-12-13 20:15:29 +0000184{
paul1eb8ef22005-04-07 07:30:20 +0000185 struct listnode *n, *nnode;
hasso508e53e2004-05-18 18:57:06 +0000186 struct ospf6_interface *oi;
paul718e3742002-12-13 20:15:29 +0000187
hasso6452df02004-08-15 05:52:07 +0000188 ospf6_route_table_delete (oa->range_table);
189 ospf6_route_table_delete (oa->summary_prefix);
190 ospf6_route_table_delete (oa->summary_router);
hasso049207c2004-08-04 20:02:13 +0000191
paul718e3742002-12-13 20:15:29 +0000192 /* ospf6 interface list */
paul1eb8ef22005-04-07 07:30:20 +0000193 for (ALL_LIST_ELEMENTS (oa->if_list, n, nnode, oi))
paul718e3742002-12-13 20:15:29 +0000194 {
hasso508e53e2004-05-18 18:57:06 +0000195 ospf6_interface_delete (oi);
paul718e3742002-12-13 20:15:29 +0000196 }
hasso508e53e2004-05-18 18:57:06 +0000197 list_delete (oa->if_list);
paul718e3742002-12-13 20:15:29 +0000198
hasso508e53e2004-05-18 18:57:06 +0000199 ospf6_lsdb_delete (oa->lsdb);
hasso6452df02004-08-15 05:52:07 +0000200 ospf6_lsdb_delete (oa->lsdb_self);
201
Tom Goff1d192342010-11-10 13:02:38 -0800202 ospf6_spf_table_finish (oa->spf_table);
hasso508e53e2004-05-18 18:57:06 +0000203 ospf6_route_table_delete (oa->spf_table);
204 ospf6_route_table_delete (oa->route_table);
paul718e3742002-12-13 20:15:29 +0000205
hasso508e53e2004-05-18 18:57:06 +0000206 THREAD_OFF (oa->thread_spf_calculation);
207 THREAD_OFF (oa->thread_route_calculation);
paul718e3742002-12-13 20:15:29 +0000208
hasso508e53e2004-05-18 18:57:06 +0000209 listnode_delete (oa->ospf6->area_list, oa);
210 oa->ospf6 = NULL;
paul718e3742002-12-13 20:15:29 +0000211
212 /* free area */
hasso508e53e2004-05-18 18:57:06 +0000213 XFREE (MTYPE_OSPF6_AREA, oa);
paul718e3742002-12-13 20:15:29 +0000214}
215
216struct ospf6_area *
hasso508e53e2004-05-18 18:57:06 +0000217ospf6_area_lookup (u_int32_t area_id, struct ospf6 *ospf6)
paul718e3742002-12-13 20:15:29 +0000218{
hasso508e53e2004-05-18 18:57:06 +0000219 struct ospf6_area *oa;
hasso52dc7ee2004-09-23 19:18:23 +0000220 struct listnode *n;
paul718e3742002-12-13 20:15:29 +0000221
paul1eb8ef22005-04-07 07:30:20 +0000222 for (ALL_LIST_ELEMENTS_RO (ospf6->area_list, n, oa))
223 if (oa->area_id == area_id)
224 return oa;
paul718e3742002-12-13 20:15:29 +0000225
226 return (struct ospf6_area *) NULL;
227}
228
Paul Jakma6ac29a52008-08-15 13:45:30 +0100229static struct ospf6_area *
hasso6452df02004-08-15 05:52:07 +0000230ospf6_area_get (u_int32_t area_id, struct ospf6 *o)
231{
232 struct ospf6_area *oa;
233 oa = ospf6_area_lookup (area_id, o);
234 if (oa == NULL)
235 oa = ospf6_area_create (area_id, o);
236 return oa;
237}
238
paul718e3742002-12-13 20:15:29 +0000239void
hasso508e53e2004-05-18 18:57:06 +0000240ospf6_area_enable (struct ospf6_area *oa)
paul718e3742002-12-13 20:15:29 +0000241{
paul1eb8ef22005-04-07 07:30:20 +0000242 struct listnode *node, *nnode;
hasso508e53e2004-05-18 18:57:06 +0000243 struct ospf6_interface *oi;
paul718e3742002-12-13 20:15:29 +0000244
hasso6452df02004-08-15 05:52:07 +0000245 SET_FLAG (oa->flag, OSPF6_AREA_ENABLE);
paul718e3742002-12-13 20:15:29 +0000246
paul1eb8ef22005-04-07 07:30:20 +0000247 for (ALL_LIST_ELEMENTS (oa->if_list, node, nnode, oi))
248 ospf6_interface_enable (oi);
paul718e3742002-12-13 20:15:29 +0000249}
250
251void
hasso508e53e2004-05-18 18:57:06 +0000252ospf6_area_disable (struct ospf6_area *oa)
paul718e3742002-12-13 20:15:29 +0000253{
paul1eb8ef22005-04-07 07:30:20 +0000254 struct listnode *node, *nnode;
hasso508e53e2004-05-18 18:57:06 +0000255 struct ospf6_interface *oi;
paul718e3742002-12-13 20:15:29 +0000256
hasso6452df02004-08-15 05:52:07 +0000257 UNSET_FLAG (oa->flag, OSPF6_AREA_ENABLE);
hasso508e53e2004-05-18 18:57:06 +0000258
paul1eb8ef22005-04-07 07:30:20 +0000259 for (ALL_LIST_ELEMENTS (oa->if_list, node, nnode, oi))
260 ospf6_interface_disable (oi);
paul718e3742002-12-13 20:15:29 +0000261}
262
hasso508e53e2004-05-18 18:57:06 +0000263
264void
265ospf6_area_show (struct vty *vty, struct ospf6_area *oa)
266{
hasso52dc7ee2004-09-23 19:18:23 +0000267 struct listnode *i;
hasso508e53e2004-05-18 18:57:06 +0000268 struct ospf6_interface *oi;
269
hasso049207c2004-08-04 20:02:13 +0000270 vty_out (vty, " Area %s%s", oa->name, VNL);
hasso508e53e2004-05-18 18:57:06 +0000271 vty_out (vty, " Number of Area scoped LSAs is %u%s",
hasso049207c2004-08-04 20:02:13 +0000272 oa->lsdb->count, VNL);
hasso508e53e2004-05-18 18:57:06 +0000273
274 vty_out (vty, " Interface attached to this area:");
paul1eb8ef22005-04-07 07:30:20 +0000275 for (ALL_LIST_ELEMENTS_RO (oa->if_list, i, oi))
276 vty_out (vty, " %s", oi->interface->name);
277
hasso049207c2004-08-04 20:02:13 +0000278 vty_out (vty, "%s", VNL);
hasso508e53e2004-05-18 18:57:06 +0000279}
280
281
hasso049207c2004-08-04 20:02:13 +0000282#define OSPF6_CMD_AREA_LOOKUP(str, oa) \
283{ \
284 u_int32_t area_id = 0; \
285 if (inet_pton (AF_INET, str, &area_id) != 1) \
286 { \
287 vty_out (vty, "Malformed Area-ID: %s%s", str, VNL); \
288 return CMD_SUCCESS; \
289 } \
290 oa = ospf6_area_lookup (area_id, ospf6); \
291 if (oa == NULL) \
292 { \
293 vty_out (vty, "No such Area: %s%s", str, VNL); \
294 return CMD_SUCCESS; \
295 } \
hasso508e53e2004-05-18 18:57:06 +0000296}
297
hasso6452df02004-08-15 05:52:07 +0000298#define OSPF6_CMD_AREA_GET(str, oa) \
299{ \
300 u_int32_t area_id = 0; \
301 if (inet_pton (AF_INET, str, &area_id) != 1) \
302 { \
303 vty_out (vty, "Malformed Area-ID: %s%s", str, VNL); \
304 return CMD_SUCCESS; \
305 } \
306 oa = ospf6_area_get (area_id, ospf6); \
307}
308
309DEFUN (area_range,
310 area_range_cmd,
311 "area A.B.C.D range X:X::X:X/M",
312 "OSPF area parameters\n"
313 OSPF6_AREA_ID_STR
314 "Configured address range\n"
315 "Specify IPv6 prefix\n"
316 )
317{
318 int ret;
319 struct ospf6_area *oa;
320 struct prefix prefix;
321 struct ospf6_route *range;
322
323 OSPF6_CMD_AREA_GET (argv[0], oa);
324 argc--;
325 argv++;
326
327 ret = str2prefix (argv[0], &prefix);
328 if (ret != 1 || prefix.family != AF_INET6)
329 {
330 vty_out (vty, "Malformed argument: %s%s", argv[0], VNL);
331 return CMD_SUCCESS;
332 }
333 argc--;
334 argv++;
335
336 range = ospf6_route_lookup (&prefix, oa->range_table);
337 if (range == NULL)
338 {
339 range = ospf6_route_create ();
340 range->type = OSPF6_DEST_TYPE_RANGE;
341 range->prefix = prefix;
342 }
343
344 if (argc)
345 {
346 if (! strcmp (argv[0], "not-advertise"))
347 SET_FLAG (range->flag, OSPF6_ROUTE_DO_NOT_ADVERTISE);
348 else if (! strcmp (argv[0], "advertise"))
349 UNSET_FLAG (range->flag, OSPF6_ROUTE_DO_NOT_ADVERTISE);
350 }
351
Jon86f9e5a2009-02-11 17:22:03 -0800352 if (range->rnode)
353 {
354 vty_out (vty, "Range already defined: %s%s", argv[-1], VNL);
355 return CMD_WARNING;
356 }
357
hasso6452df02004-08-15 05:52:07 +0000358 ospf6_route_add (range, oa->range_table);
359 return CMD_SUCCESS;
360}
361
362ALIAS (area_range,
363 area_range_advertise_cmd,
364 "area A.B.C.D range X:X::X:X/M (advertise|not-advertise)",
365 "OSPF area parameters\n"
366 OSPF6_AREA_ID_STR
367 "Configured address range\n"
368 "Specify IPv6 prefix\n"
Paul Jakma6ac29a52008-08-15 13:45:30 +0100369 )
hasso6452df02004-08-15 05:52:07 +0000370
371DEFUN (no_area_range,
372 no_area_range_cmd,
373 "no area A.B.C.D range X:X::X:X/M",
374 "OSPF area parameters\n"
375 OSPF6_AREA_ID_STR
376 "Configured address range\n"
377 "Specify IPv6 prefix\n"
378 )
379{
380 int ret;
381 struct ospf6_area *oa;
382 struct prefix prefix;
383 struct ospf6_route *range;
384
385 OSPF6_CMD_AREA_GET (argv[0], oa);
386 argc--;
387 argv++;
388
389 ret = str2prefix (argv[0], &prefix);
390 if (ret != 1 || prefix.family != AF_INET6)
391 {
392 vty_out (vty, "Malformed argument: %s%s", argv[0], VNL);
393 return CMD_SUCCESS;
394 }
395
396 range = ospf6_route_lookup (&prefix, oa->range_table);
397 if (range == NULL)
398 {
399 vty_out (vty, "Range %s does not exists.%s", argv[0], VNL);
400 return CMD_SUCCESS;
401 }
402
403 ospf6_route_remove (range, oa->range_table);
404 return CMD_SUCCESS;
405}
406
407void
408ospf6_area_config_write (struct vty *vty)
409{
hasso52dc7ee2004-09-23 19:18:23 +0000410 struct listnode *node;
hasso6452df02004-08-15 05:52:07 +0000411 struct ospf6_area *oa;
412 struct ospf6_route *range;
413 char buf[128];
414
paul1eb8ef22005-04-07 07:30:20 +0000415 for (ALL_LIST_ELEMENTS_RO (ospf6->area_list, node, oa))
hasso6452df02004-08-15 05:52:07 +0000416 {
hasso6452df02004-08-15 05:52:07 +0000417 for (range = ospf6_route_head (oa->range_table); range;
418 range = ospf6_route_next (range))
419 {
420 prefix2str (&range->prefix, buf, sizeof (buf));
421 vty_out (vty, " area %s range %s%s", oa->name, buf, VNL);
422 }
423 }
424}
425
hasso34956b32005-06-24 08:44:02 +0000426DEFUN (area_filter_list,
427 area_filter_list_cmd,
428 "area A.B.C.D filter-list prefix WORD (in|out)",
429 "OSPFv6 area parameters\n"
430 "OSPFv6 area ID in IP address format\n"
431 "Filter networks between OSPFv6 areas\n"
432 "Filter prefixes between OSPFv6 areas\n"
433 "Name of an IPv6 prefix-list\n"
434 "Filter networks sent to this area\n"
435 "Filter networks sent from this area\n")
436{
437 struct ospf6_area *area;
438 struct prefix_list *plist;
439
440 OSPF6_CMD_AREA_GET (argv[0], area);
441 argc--;
442 argv++;
443
444 plist = prefix_list_lookup (AFI_IP6, argv[1]);
445 if (strncmp (argv[2], "in", 2) == 0)
446 {
447 PREFIX_LIST_IN (area) = plist;
448 if (PREFIX_NAME_IN (area))
449 free (PREFIX_NAME_IN (area));
450
451 PREFIX_NAME_IN (area) = strdup (argv[1]);
452 ospf6_abr_reimport (area);
453 }
454 else
455 {
456 PREFIX_LIST_OUT (area) = plist;
457 if (PREFIX_NAME_OUT (area))
458 free (PREFIX_NAME_OUT (area));
459
460 PREFIX_NAME_OUT (area) = strdup (argv[1]);
461 ospf6_abr_enable_area (area);
462 }
463
464 return CMD_SUCCESS;
465}
466
467DEFUN (no_area_filter_list,
468 no_area_filter_list_cmd,
469 "no area A.B.C.D filter-list prefix WORD (in|out)",
470 NO_STR
471 "OSPFv6 area parameters\n"
472 "OSPFv6 area ID in IP address format\n"
473 "Filter networks between OSPFv6 areas\n"
474 "Filter prefixes between OSPFv6 areas\n"
475 "Name of an IPv6 prefix-list\n"
476 "Filter networks sent to this area\n"
477 "Filter networks sent from this area\n")
478{
479 struct ospf6_area *area;
480 struct prefix_list *plist;
481
482 OSPF6_CMD_AREA_GET (argv[0], area);
483 argc--;
484 argv++;
485
486 plist = prefix_list_lookup (AFI_IP6, argv[1]);
487 if (strncmp (argv[2], "in", 2) == 0)
488 {
489 if (PREFIX_NAME_IN (area))
490 if (strcmp (PREFIX_NAME_IN (area), argv[1]) != 0)
491 return CMD_SUCCESS;
492
493 PREFIX_LIST_IN (area) = NULL;
494 if (PREFIX_NAME_IN (area))
495 free (PREFIX_NAME_IN (area));
496
497 PREFIX_NAME_IN (area) = NULL;
498 ospf6_abr_reimport (area);
499 }
500 else
501 {
502 if (PREFIX_NAME_OUT (area))
503 if (strcmp (PREFIX_NAME_OUT (area), argv[1]) != 0)
504 return CMD_SUCCESS;
505
506 PREFIX_LIST_OUT (area) = NULL;
507 if (PREFIX_NAME_OUT (area))
508 free (PREFIX_NAME_OUT (area));
509
510 PREFIX_NAME_OUT (area) = NULL;
511 ospf6_abr_enable_area (area);
512 }
513
514 return CMD_SUCCESS;
515}
516
517DEFUN (area_import_list,
518 area_import_list_cmd,
519 "area A.B.C.D import-list NAME",
520 "OSPFv6 area parameters\n"
521 "OSPFv6 area ID in IP address format\n"
522 "Set the filter for networks from other areas announced to the specified one\n"
523 "Name of the acess-list\n")
524{
525 struct ospf6_area *area;
526 struct access_list *list;
527
528 OSPF6_CMD_AREA_GET(argv[0], area);
529
530 list = access_list_lookup (AFI_IP6, argv[1]);
531
532 IMPORT_LIST (area) = list;
533
534 if (IMPORT_NAME (area))
535 free (IMPORT_NAME (area));
536
537 IMPORT_NAME (area) = strdup (argv[1]);
538 ospf6_abr_reimport (area);
539
540 return CMD_SUCCESS;
541}
542
543DEFUN (no_area_import_list,
544 no_area_import_list_cmd,
545 "no area A.B.C.D import-list NAME",
546 "OSPFv6 area parameters\n"
547 "OSPFv6 area ID in IP address format\n"
548 "Unset the filter for networks announced to other areas\n"
549 "NAme of the access-list\n")
550{
551 struct ospf6_area *area;
552
553 OSPF6_CMD_AREA_GET(argv[0], area);
554
555 IMPORT_LIST (area) = 0;
556
557 if (IMPORT_NAME (area))
558 free (IMPORT_NAME (area));
559
560 IMPORT_NAME (area) = NULL;
561 ospf6_abr_reimport (area);
562
563 return CMD_SUCCESS;
564}
565
566DEFUN (area_export_list,
567 area_export_list_cmd,
568 "area A.B.C.D export-list NAME",
569 "OSPFv6 area parameters\n"
570 "OSPFv6 area ID in IP address format\n"
571 "Set the filter for networks announced to other areas\n"
572 "Name of the acess-list\n")
573{
574 struct ospf6_area *area;
575 struct access_list *list;
576
577 OSPF6_CMD_AREA_GET(argv[0], area);
578
579 list = access_list_lookup (AFI_IP6, argv[1]);
580
581 EXPORT_LIST (area) = list;
582
583 if (EXPORT_NAME (area))
584 free (EXPORT_NAME (area));
585
586 EXPORT_NAME (area) = strdup (argv[1]);
587 ospf6_abr_enable_area (area);
588
589 return CMD_SUCCESS;
590}
591
592DEFUN (no_area_export_list,
593 no_area_export_list_cmd,
594 "no area A.B.C.D export-list NAME",
595 "OSPFv6 area parameters\n"
596 "OSPFv6 area ID in IP address format\n"
597 "Unset the filter for networks announced to other areas\n"
598 "Name of the access-list\n")
599{
600 struct ospf6_area *area;
601
602 OSPF6_CMD_AREA_GET(argv[0], area);
603
604 EXPORT_LIST (area) = 0;
605
606 if (EXPORT_NAME (area))
607 free (EXPORT_NAME (area));
608
609 EXPORT_NAME (area) = NULL;
610 ospf6_abr_enable_area (area);
611
612 return CMD_SUCCESS;
613}
614
hasso508e53e2004-05-18 18:57:06 +0000615DEFUN (show_ipv6_ospf6_spf_tree,
616 show_ipv6_ospf6_spf_tree_cmd,
617 "show ipv6 ospf6 spf tree",
618 SHOW_STR
619 IP6_STR
620 OSPF6_STR
621 "Shortest Path First caculation\n"
622 "Show SPF tree\n")
623{
hasso52dc7ee2004-09-23 19:18:23 +0000624 struct listnode *node;
hasso508e53e2004-05-18 18:57:06 +0000625 struct ospf6_area *oa;
626 struct ospf6_vertex *root;
627 struct ospf6_route *route;
628 struct prefix prefix;
629
630 ospf6_linkstate_prefix (ospf6->router_id, htonl (0), &prefix);
paul1eb8ef22005-04-07 07:30:20 +0000631
632 for (ALL_LIST_ELEMENTS_RO (ospf6->area_list, node, oa))
hasso508e53e2004-05-18 18:57:06 +0000633 {
hasso508e53e2004-05-18 18:57:06 +0000634 route = ospf6_route_lookup (&prefix, oa->spf_table);
635 if (route == NULL)
636 {
637 vty_out (vty, "LS entry for root not found in area %s%s",
hasso049207c2004-08-04 20:02:13 +0000638 oa->name, VNL);
hasso508e53e2004-05-18 18:57:06 +0000639 continue;
640 }
641 root = (struct ospf6_vertex *) route->route_option;
642 ospf6_spf_display_subtree (vty, "", 0, root);
643 }
644
645 return CMD_SUCCESS;
646}
647
648DEFUN (show_ipv6_ospf6_area_spf_tree,
649 show_ipv6_ospf6_area_spf_tree_cmd,
650 "show ipv6 ospf6 area A.B.C.D spf tree",
651 SHOW_STR
652 IP6_STR
653 OSPF6_STR
654 OSPF6_AREA_STR
655 OSPF6_AREA_ID_STR
656 "Shortest Path First caculation\n"
657 "Show SPF tree\n")
658{
659 u_int32_t area_id;
660 struct ospf6_area *oa;
661 struct ospf6_vertex *root;
662 struct ospf6_route *route;
663 struct prefix prefix;
664
665 ospf6_linkstate_prefix (ospf6->router_id, htonl (0), &prefix);
666
667 if (inet_pton (AF_INET, argv[0], &area_id) != 1)
668 {
hasso049207c2004-08-04 20:02:13 +0000669 vty_out (vty, "Malformed Area-ID: %s%s", argv[0], VNL);
hasso508e53e2004-05-18 18:57:06 +0000670 return CMD_SUCCESS;
671 }
672 oa = ospf6_area_lookup (area_id, ospf6);
673 if (oa == NULL)
674 {
hasso049207c2004-08-04 20:02:13 +0000675 vty_out (vty, "No such Area: %s%s", argv[0], VNL);
hasso508e53e2004-05-18 18:57:06 +0000676 return CMD_SUCCESS;
677 }
678
679 route = ospf6_route_lookup (&prefix, oa->spf_table);
680 if (route == NULL)
681 {
682 vty_out (vty, "LS entry for root not found in area %s%s",
hasso049207c2004-08-04 20:02:13 +0000683 oa->name, VNL);
hasso508e53e2004-05-18 18:57:06 +0000684 return CMD_SUCCESS;
685 }
686 root = (struct ospf6_vertex *) route->route_option;
687 ospf6_spf_display_subtree (vty, "", 0, root);
688
689 return CMD_SUCCESS;
690}
691
hasso508e53e2004-05-18 18:57:06 +0000692DEFUN (show_ipv6_ospf6_simulate_spf_tree_root,
693 show_ipv6_ospf6_simulate_spf_tree_root_cmd,
694 "show ipv6 ospf6 simulate spf-tree A.B.C.D area A.B.C.D",
695 SHOW_STR
696 IP6_STR
697 OSPF6_STR
698 "Shortest Path First caculation\n"
699 "Show SPF tree\n"
700 "Specify root's router-id to calculate another router's SPF tree\n")
701{
702 u_int32_t area_id;
703 struct ospf6_area *oa;
704 struct ospf6_vertex *root;
705 struct ospf6_route *route;
706 struct prefix prefix;
707 u_int32_t router_id;
708 struct ospf6_route_table *spf_table;
709 unsigned char tmp_debug_ospf6_spf = 0;
710
711 inet_pton (AF_INET, argv[0], &router_id);
712 ospf6_linkstate_prefix (router_id, htonl (0), &prefix);
713
714 if (inet_pton (AF_INET, argv[1], &area_id) != 1)
715 {
hasso049207c2004-08-04 20:02:13 +0000716 vty_out (vty, "Malformed Area-ID: %s%s", argv[1], VNL);
hasso508e53e2004-05-18 18:57:06 +0000717 return CMD_SUCCESS;
718 }
719 oa = ospf6_area_lookup (area_id, ospf6);
720 if (oa == NULL)
721 {
hasso049207c2004-08-04 20:02:13 +0000722 vty_out (vty, "No such Area: %s%s", argv[1], VNL);
hasso508e53e2004-05-18 18:57:06 +0000723 return CMD_SUCCESS;
724 }
725
726 tmp_debug_ospf6_spf = conf_debug_ospf6_spf;
727 conf_debug_ospf6_spf = 0;
728
Paul Jakmacf1ce252006-05-15 10:46:07 +0000729 spf_table = OSPF6_ROUTE_TABLE_CREATE (NONE, SPF_RESULTS);
hasso508e53e2004-05-18 18:57:06 +0000730 ospf6_spf_calculation (router_id, spf_table, oa);
731
732 conf_debug_ospf6_spf = tmp_debug_ospf6_spf;
733
734 route = ospf6_route_lookup (&prefix, spf_table);
735 if (route == NULL)
736 {
737 ospf6_spf_table_finish (spf_table);
738 ospf6_route_table_delete (spf_table);
739 return CMD_SUCCESS;
740 }
741 root = (struct ospf6_vertex *) route->route_option;
742 ospf6_spf_display_subtree (vty, "", 0, root);
743
744 ospf6_spf_table_finish (spf_table);
745 ospf6_route_table_delete (spf_table);
746
747 return CMD_SUCCESS;
748}
paul718e3742002-12-13 20:15:29 +0000749
750void
Paul Jakma6ac29a52008-08-15 13:45:30 +0100751ospf6_area_init (void)
paul718e3742002-12-13 20:15:29 +0000752{
hasso508e53e2004-05-18 18:57:06 +0000753 install_element (VIEW_NODE, &show_ipv6_ospf6_spf_tree_cmd);
hasso508e53e2004-05-18 18:57:06 +0000754 install_element (VIEW_NODE, &show_ipv6_ospf6_area_spf_tree_cmd);
hasso508e53e2004-05-18 18:57:06 +0000755 install_element (VIEW_NODE, &show_ipv6_ospf6_simulate_spf_tree_root_cmd);
756
757 install_element (ENABLE_NODE, &show_ipv6_ospf6_spf_tree_cmd);
hasso508e53e2004-05-18 18:57:06 +0000758 install_element (ENABLE_NODE, &show_ipv6_ospf6_area_spf_tree_cmd);
hasso508e53e2004-05-18 18:57:06 +0000759 install_element (ENABLE_NODE, &show_ipv6_ospf6_simulate_spf_tree_root_cmd);
hasso6452df02004-08-15 05:52:07 +0000760
761 install_element (OSPF6_NODE, &area_range_cmd);
762 install_element (OSPF6_NODE, &area_range_advertise_cmd);
763 install_element (OSPF6_NODE, &no_area_range_cmd);
hasso34956b32005-06-24 08:44:02 +0000764
765 install_element (OSPF6_NODE, &area_import_list_cmd);
766 install_element (OSPF6_NODE, &no_area_import_list_cmd);
767 install_element (OSPF6_NODE, &area_export_list_cmd);
768 install_element (OSPF6_NODE, &no_area_export_list_cmd);
769
770 install_element (OSPF6_NODE, &area_filter_list_cmd);
771 install_element (OSPF6_NODE, &no_area_filter_list_cmd);
772
paul718e3742002-12-13 20:15:29 +0000773}
hasso049207c2004-08-04 20:02:13 +0000774
hasso6452df02004-08-15 05:52:07 +0000775