blob: 3c999bbcc9824e924e351693ab5ba9c67de15a3f [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
hasso508e53e2004-05-18 18:57:06 +0000202 ospf6_route_table_delete (oa->spf_table);
203 ospf6_route_table_delete (oa->route_table);
paul718e3742002-12-13 20:15:29 +0000204
hasso508e53e2004-05-18 18:57:06 +0000205#if 0
206 ospf6_spftree_delete (oa->spf_tree);
207 ospf6_route_table_delete (oa->topology_table);
208#endif /*0*/
paul718e3742002-12-13 20:15:29 +0000209
hasso508e53e2004-05-18 18:57:06 +0000210 THREAD_OFF (oa->thread_spf_calculation);
211 THREAD_OFF (oa->thread_route_calculation);
paul718e3742002-12-13 20:15:29 +0000212
hasso508e53e2004-05-18 18:57:06 +0000213 listnode_delete (oa->ospf6->area_list, oa);
214 oa->ospf6 = NULL;
paul718e3742002-12-13 20:15:29 +0000215
216 /* free area */
hasso508e53e2004-05-18 18:57:06 +0000217 XFREE (MTYPE_OSPF6_AREA, oa);
paul718e3742002-12-13 20:15:29 +0000218}
219
220struct ospf6_area *
hasso508e53e2004-05-18 18:57:06 +0000221ospf6_area_lookup (u_int32_t area_id, struct ospf6 *ospf6)
paul718e3742002-12-13 20:15:29 +0000222{
hasso508e53e2004-05-18 18:57:06 +0000223 struct ospf6_area *oa;
hasso52dc7ee2004-09-23 19:18:23 +0000224 struct listnode *n;
paul718e3742002-12-13 20:15:29 +0000225
paul1eb8ef22005-04-07 07:30:20 +0000226 for (ALL_LIST_ELEMENTS_RO (ospf6->area_list, n, oa))
227 if (oa->area_id == area_id)
228 return oa;
paul718e3742002-12-13 20:15:29 +0000229
230 return (struct ospf6_area *) NULL;
231}
232
Paul Jakma6ac29a52008-08-15 13:45:30 +0100233static struct ospf6_area *
hasso6452df02004-08-15 05:52:07 +0000234ospf6_area_get (u_int32_t area_id, struct ospf6 *o)
235{
236 struct ospf6_area *oa;
237 oa = ospf6_area_lookup (area_id, o);
238 if (oa == NULL)
239 oa = ospf6_area_create (area_id, o);
240 return oa;
241}
242
paul718e3742002-12-13 20:15:29 +0000243void
hasso508e53e2004-05-18 18:57:06 +0000244ospf6_area_enable (struct ospf6_area *oa)
paul718e3742002-12-13 20:15:29 +0000245{
paul1eb8ef22005-04-07 07:30:20 +0000246 struct listnode *node, *nnode;
hasso508e53e2004-05-18 18:57:06 +0000247 struct ospf6_interface *oi;
paul718e3742002-12-13 20:15:29 +0000248
hasso6452df02004-08-15 05:52:07 +0000249 SET_FLAG (oa->flag, OSPF6_AREA_ENABLE);
paul718e3742002-12-13 20:15:29 +0000250
paul1eb8ef22005-04-07 07:30:20 +0000251 for (ALL_LIST_ELEMENTS (oa->if_list, node, nnode, oi))
252 ospf6_interface_enable (oi);
paul718e3742002-12-13 20:15:29 +0000253}
254
255void
hasso508e53e2004-05-18 18:57:06 +0000256ospf6_area_disable (struct ospf6_area *oa)
paul718e3742002-12-13 20:15:29 +0000257{
paul1eb8ef22005-04-07 07:30:20 +0000258 struct listnode *node, *nnode;
hasso508e53e2004-05-18 18:57:06 +0000259 struct ospf6_interface *oi;
paul718e3742002-12-13 20:15:29 +0000260
hasso6452df02004-08-15 05:52:07 +0000261 UNSET_FLAG (oa->flag, OSPF6_AREA_ENABLE);
hasso508e53e2004-05-18 18:57:06 +0000262
paul1eb8ef22005-04-07 07:30:20 +0000263 for (ALL_LIST_ELEMENTS (oa->if_list, node, nnode, oi))
264 ospf6_interface_disable (oi);
paul718e3742002-12-13 20:15:29 +0000265}
266
hasso508e53e2004-05-18 18:57:06 +0000267
268void
269ospf6_area_show (struct vty *vty, struct ospf6_area *oa)
270{
hasso52dc7ee2004-09-23 19:18:23 +0000271 struct listnode *i;
hasso508e53e2004-05-18 18:57:06 +0000272 struct ospf6_interface *oi;
273
hasso049207c2004-08-04 20:02:13 +0000274 vty_out (vty, " Area %s%s", oa->name, VNL);
hasso508e53e2004-05-18 18:57:06 +0000275 vty_out (vty, " Number of Area scoped LSAs is %u%s",
hasso049207c2004-08-04 20:02:13 +0000276 oa->lsdb->count, VNL);
hasso508e53e2004-05-18 18:57:06 +0000277
278 vty_out (vty, " Interface attached to this area:");
paul1eb8ef22005-04-07 07:30:20 +0000279 for (ALL_LIST_ELEMENTS_RO (oa->if_list, i, oi))
280 vty_out (vty, " %s", oi->interface->name);
281
hasso049207c2004-08-04 20:02:13 +0000282 vty_out (vty, "%s", VNL);
hasso508e53e2004-05-18 18:57:06 +0000283}
284
285
hasso049207c2004-08-04 20:02:13 +0000286#define OSPF6_CMD_AREA_LOOKUP(str, oa) \
287{ \
288 u_int32_t area_id = 0; \
289 if (inet_pton (AF_INET, str, &area_id) != 1) \
290 { \
291 vty_out (vty, "Malformed Area-ID: %s%s", str, VNL); \
292 return CMD_SUCCESS; \
293 } \
294 oa = ospf6_area_lookup (area_id, ospf6); \
295 if (oa == NULL) \
296 { \
297 vty_out (vty, "No such Area: %s%s", str, VNL); \
298 return CMD_SUCCESS; \
299 } \
hasso508e53e2004-05-18 18:57:06 +0000300}
301
hasso6452df02004-08-15 05:52:07 +0000302#define OSPF6_CMD_AREA_GET(str, oa) \
303{ \
304 u_int32_t area_id = 0; \
305 if (inet_pton (AF_INET, str, &area_id) != 1) \
306 { \
307 vty_out (vty, "Malformed Area-ID: %s%s", str, VNL); \
308 return CMD_SUCCESS; \
309 } \
310 oa = ospf6_area_get (area_id, ospf6); \
311}
312
313DEFUN (area_range,
314 area_range_cmd,
315 "area A.B.C.D range X:X::X:X/M",
316 "OSPF area parameters\n"
317 OSPF6_AREA_ID_STR
318 "Configured address range\n"
319 "Specify IPv6 prefix\n"
320 )
321{
322 int ret;
323 struct ospf6_area *oa;
324 struct prefix prefix;
325 struct ospf6_route *range;
326
327 OSPF6_CMD_AREA_GET (argv[0], oa);
328 argc--;
329 argv++;
330
331 ret = str2prefix (argv[0], &prefix);
332 if (ret != 1 || prefix.family != AF_INET6)
333 {
334 vty_out (vty, "Malformed argument: %s%s", argv[0], VNL);
335 return CMD_SUCCESS;
336 }
337 argc--;
338 argv++;
339
340 range = ospf6_route_lookup (&prefix, oa->range_table);
341 if (range == NULL)
342 {
343 range = ospf6_route_create ();
344 range->type = OSPF6_DEST_TYPE_RANGE;
345 range->prefix = prefix;
346 }
347
348 if (argc)
349 {
350 if (! strcmp (argv[0], "not-advertise"))
351 SET_FLAG (range->flag, OSPF6_ROUTE_DO_NOT_ADVERTISE);
352 else if (! strcmp (argv[0], "advertise"))
353 UNSET_FLAG (range->flag, OSPF6_ROUTE_DO_NOT_ADVERTISE);
354 }
355
Jon86f9e5a2009-02-11 17:22:03 -0800356 if (range->rnode)
357 {
358 vty_out (vty, "Range already defined: %s%s", argv[-1], VNL);
359 return CMD_WARNING;
360 }
361
hasso6452df02004-08-15 05:52:07 +0000362 ospf6_route_add (range, oa->range_table);
363 return CMD_SUCCESS;
364}
365
366ALIAS (area_range,
367 area_range_advertise_cmd,
368 "area A.B.C.D range X:X::X:X/M (advertise|not-advertise)",
369 "OSPF area parameters\n"
370 OSPF6_AREA_ID_STR
371 "Configured address range\n"
372 "Specify IPv6 prefix\n"
Paul Jakma6ac29a52008-08-15 13:45:30 +0100373 )
hasso6452df02004-08-15 05:52:07 +0000374
375DEFUN (no_area_range,
376 no_area_range_cmd,
377 "no area A.B.C.D range X:X::X:X/M",
378 "OSPF area parameters\n"
379 OSPF6_AREA_ID_STR
380 "Configured address range\n"
381 "Specify IPv6 prefix\n"
382 )
383{
384 int ret;
385 struct ospf6_area *oa;
386 struct prefix prefix;
387 struct ospf6_route *range;
388
389 OSPF6_CMD_AREA_GET (argv[0], oa);
390 argc--;
391 argv++;
392
393 ret = str2prefix (argv[0], &prefix);
394 if (ret != 1 || prefix.family != AF_INET6)
395 {
396 vty_out (vty, "Malformed argument: %s%s", argv[0], VNL);
397 return CMD_SUCCESS;
398 }
399
400 range = ospf6_route_lookup (&prefix, oa->range_table);
401 if (range == NULL)
402 {
403 vty_out (vty, "Range %s does not exists.%s", argv[0], VNL);
404 return CMD_SUCCESS;
405 }
406
407 ospf6_route_remove (range, oa->range_table);
408 return CMD_SUCCESS;
409}
410
411void
412ospf6_area_config_write (struct vty *vty)
413{
hasso52dc7ee2004-09-23 19:18:23 +0000414 struct listnode *node;
hasso6452df02004-08-15 05:52:07 +0000415 struct ospf6_area *oa;
416 struct ospf6_route *range;
417 char buf[128];
418
paul1eb8ef22005-04-07 07:30:20 +0000419 for (ALL_LIST_ELEMENTS_RO (ospf6->area_list, node, oa))
hasso6452df02004-08-15 05:52:07 +0000420 {
hasso6452df02004-08-15 05:52:07 +0000421 for (range = ospf6_route_head (oa->range_table); range;
422 range = ospf6_route_next (range))
423 {
424 prefix2str (&range->prefix, buf, sizeof (buf));
425 vty_out (vty, " area %s range %s%s", oa->name, buf, VNL);
426 }
427 }
428}
429
hasso34956b32005-06-24 08:44:02 +0000430DEFUN (area_filter_list,
431 area_filter_list_cmd,
432 "area A.B.C.D filter-list prefix WORD (in|out)",
433 "OSPFv6 area parameters\n"
434 "OSPFv6 area ID in IP address format\n"
435 "Filter networks between OSPFv6 areas\n"
436 "Filter prefixes between OSPFv6 areas\n"
437 "Name of an IPv6 prefix-list\n"
438 "Filter networks sent to this area\n"
439 "Filter networks sent from this area\n")
440{
441 struct ospf6_area *area;
442 struct prefix_list *plist;
443
444 OSPF6_CMD_AREA_GET (argv[0], area);
445 argc--;
446 argv++;
447
448 plist = prefix_list_lookup (AFI_IP6, argv[1]);
449 if (strncmp (argv[2], "in", 2) == 0)
450 {
451 PREFIX_LIST_IN (area) = plist;
452 if (PREFIX_NAME_IN (area))
453 free (PREFIX_NAME_IN (area));
454
455 PREFIX_NAME_IN (area) = strdup (argv[1]);
456 ospf6_abr_reimport (area);
457 }
458 else
459 {
460 PREFIX_LIST_OUT (area) = plist;
461 if (PREFIX_NAME_OUT (area))
462 free (PREFIX_NAME_OUT (area));
463
464 PREFIX_NAME_OUT (area) = strdup (argv[1]);
465 ospf6_abr_enable_area (area);
466 }
467
468 return CMD_SUCCESS;
469}
470
471DEFUN (no_area_filter_list,
472 no_area_filter_list_cmd,
473 "no area A.B.C.D filter-list prefix WORD (in|out)",
474 NO_STR
475 "OSPFv6 area parameters\n"
476 "OSPFv6 area ID in IP address format\n"
477 "Filter networks between OSPFv6 areas\n"
478 "Filter prefixes between OSPFv6 areas\n"
479 "Name of an IPv6 prefix-list\n"
480 "Filter networks sent to this area\n"
481 "Filter networks sent from this area\n")
482{
483 struct ospf6_area *area;
484 struct prefix_list *plist;
485
486 OSPF6_CMD_AREA_GET (argv[0], area);
487 argc--;
488 argv++;
489
490 plist = prefix_list_lookup (AFI_IP6, argv[1]);
491 if (strncmp (argv[2], "in", 2) == 0)
492 {
493 if (PREFIX_NAME_IN (area))
494 if (strcmp (PREFIX_NAME_IN (area), argv[1]) != 0)
495 return CMD_SUCCESS;
496
497 PREFIX_LIST_IN (area) = NULL;
498 if (PREFIX_NAME_IN (area))
499 free (PREFIX_NAME_IN (area));
500
501 PREFIX_NAME_IN (area) = NULL;
502 ospf6_abr_reimport (area);
503 }
504 else
505 {
506 if (PREFIX_NAME_OUT (area))
507 if (strcmp (PREFIX_NAME_OUT (area), argv[1]) != 0)
508 return CMD_SUCCESS;
509
510 PREFIX_LIST_OUT (area) = NULL;
511 if (PREFIX_NAME_OUT (area))
512 free (PREFIX_NAME_OUT (area));
513
514 PREFIX_NAME_OUT (area) = NULL;
515 ospf6_abr_enable_area (area);
516 }
517
518 return CMD_SUCCESS;
519}
520
521DEFUN (area_import_list,
522 area_import_list_cmd,
523 "area A.B.C.D import-list NAME",
524 "OSPFv6 area parameters\n"
525 "OSPFv6 area ID in IP address format\n"
526 "Set the filter for networks from other areas announced to the specified one\n"
527 "Name of the acess-list\n")
528{
529 struct ospf6_area *area;
530 struct access_list *list;
531
532 OSPF6_CMD_AREA_GET(argv[0], area);
533
534 list = access_list_lookup (AFI_IP6, argv[1]);
535
536 IMPORT_LIST (area) = list;
537
538 if (IMPORT_NAME (area))
539 free (IMPORT_NAME (area));
540
541 IMPORT_NAME (area) = strdup (argv[1]);
542 ospf6_abr_reimport (area);
543
544 return CMD_SUCCESS;
545}
546
547DEFUN (no_area_import_list,
548 no_area_import_list_cmd,
549 "no area A.B.C.D import-list NAME",
550 "OSPFv6 area parameters\n"
551 "OSPFv6 area ID in IP address format\n"
552 "Unset the filter for networks announced to other areas\n"
553 "NAme of the access-list\n")
554{
555 struct ospf6_area *area;
556
557 OSPF6_CMD_AREA_GET(argv[0], area);
558
559 IMPORT_LIST (area) = 0;
560
561 if (IMPORT_NAME (area))
562 free (IMPORT_NAME (area));
563
564 IMPORT_NAME (area) = NULL;
565 ospf6_abr_reimport (area);
566
567 return CMD_SUCCESS;
568}
569
570DEFUN (area_export_list,
571 area_export_list_cmd,
572 "area A.B.C.D export-list NAME",
573 "OSPFv6 area parameters\n"
574 "OSPFv6 area ID in IP address format\n"
575 "Set the filter for networks announced to other areas\n"
576 "Name of the acess-list\n")
577{
578 struct ospf6_area *area;
579 struct access_list *list;
580
581 OSPF6_CMD_AREA_GET(argv[0], area);
582
583 list = access_list_lookup (AFI_IP6, argv[1]);
584
585 EXPORT_LIST (area) = list;
586
587 if (EXPORT_NAME (area))
588 free (EXPORT_NAME (area));
589
590 EXPORT_NAME (area) = strdup (argv[1]);
591 ospf6_abr_enable_area (area);
592
593 return CMD_SUCCESS;
594}
595
596DEFUN (no_area_export_list,
597 no_area_export_list_cmd,
598 "no area A.B.C.D export-list NAME",
599 "OSPFv6 area parameters\n"
600 "OSPFv6 area ID in IP address format\n"
601 "Unset the filter for networks announced to other areas\n"
602 "Name of the access-list\n")
603{
604 struct ospf6_area *area;
605
606 OSPF6_CMD_AREA_GET(argv[0], area);
607
608 EXPORT_LIST (area) = 0;
609
610 if (EXPORT_NAME (area))
611 free (EXPORT_NAME (area));
612
613 EXPORT_NAME (area) = NULL;
614 ospf6_abr_enable_area (area);
615
616 return CMD_SUCCESS;
617}
618
hasso508e53e2004-05-18 18:57:06 +0000619DEFUN (show_ipv6_ospf6_spf_tree,
620 show_ipv6_ospf6_spf_tree_cmd,
621 "show ipv6 ospf6 spf tree",
622 SHOW_STR
623 IP6_STR
624 OSPF6_STR
625 "Shortest Path First caculation\n"
626 "Show SPF tree\n")
627{
hasso52dc7ee2004-09-23 19:18:23 +0000628 struct listnode *node;
hasso508e53e2004-05-18 18:57:06 +0000629 struct ospf6_area *oa;
630 struct ospf6_vertex *root;
631 struct ospf6_route *route;
632 struct prefix prefix;
633
634 ospf6_linkstate_prefix (ospf6->router_id, htonl (0), &prefix);
paul1eb8ef22005-04-07 07:30:20 +0000635
636 for (ALL_LIST_ELEMENTS_RO (ospf6->area_list, node, oa))
hasso508e53e2004-05-18 18:57:06 +0000637 {
hasso508e53e2004-05-18 18:57:06 +0000638 route = ospf6_route_lookup (&prefix, oa->spf_table);
639 if (route == NULL)
640 {
641 vty_out (vty, "LS entry for root not found in area %s%s",
hasso049207c2004-08-04 20:02:13 +0000642 oa->name, VNL);
hasso508e53e2004-05-18 18:57:06 +0000643 continue;
644 }
645 root = (struct ospf6_vertex *) route->route_option;
646 ospf6_spf_display_subtree (vty, "", 0, root);
647 }
648
649 return CMD_SUCCESS;
650}
651
652DEFUN (show_ipv6_ospf6_area_spf_tree,
653 show_ipv6_ospf6_area_spf_tree_cmd,
654 "show ipv6 ospf6 area A.B.C.D spf tree",
655 SHOW_STR
656 IP6_STR
657 OSPF6_STR
658 OSPF6_AREA_STR
659 OSPF6_AREA_ID_STR
660 "Shortest Path First caculation\n"
661 "Show SPF tree\n")
662{
663 u_int32_t area_id;
664 struct ospf6_area *oa;
665 struct ospf6_vertex *root;
666 struct ospf6_route *route;
667 struct prefix prefix;
668
669 ospf6_linkstate_prefix (ospf6->router_id, htonl (0), &prefix);
670
671 if (inet_pton (AF_INET, argv[0], &area_id) != 1)
672 {
hasso049207c2004-08-04 20:02:13 +0000673 vty_out (vty, "Malformed Area-ID: %s%s", argv[0], VNL);
hasso508e53e2004-05-18 18:57:06 +0000674 return CMD_SUCCESS;
675 }
676 oa = ospf6_area_lookup (area_id, ospf6);
677 if (oa == NULL)
678 {
hasso049207c2004-08-04 20:02:13 +0000679 vty_out (vty, "No such Area: %s%s", argv[0], VNL);
hasso508e53e2004-05-18 18:57:06 +0000680 return CMD_SUCCESS;
681 }
682
683 route = ospf6_route_lookup (&prefix, oa->spf_table);
684 if (route == NULL)
685 {
686 vty_out (vty, "LS entry for root not found in area %s%s",
hasso049207c2004-08-04 20:02:13 +0000687 oa->name, VNL);
hasso508e53e2004-05-18 18:57:06 +0000688 return CMD_SUCCESS;
689 }
690 root = (struct ospf6_vertex *) route->route_option;
691 ospf6_spf_display_subtree (vty, "", 0, root);
692
693 return CMD_SUCCESS;
694}
695
hasso508e53e2004-05-18 18:57:06 +0000696DEFUN (show_ipv6_ospf6_simulate_spf_tree_root,
697 show_ipv6_ospf6_simulate_spf_tree_root_cmd,
698 "show ipv6 ospf6 simulate spf-tree A.B.C.D area A.B.C.D",
699 SHOW_STR
700 IP6_STR
701 OSPF6_STR
702 "Shortest Path First caculation\n"
703 "Show SPF tree\n"
704 "Specify root's router-id to calculate another router's SPF tree\n")
705{
706 u_int32_t area_id;
707 struct ospf6_area *oa;
708 struct ospf6_vertex *root;
709 struct ospf6_route *route;
710 struct prefix prefix;
711 u_int32_t router_id;
712 struct ospf6_route_table *spf_table;
713 unsigned char tmp_debug_ospf6_spf = 0;
714
715 inet_pton (AF_INET, argv[0], &router_id);
716 ospf6_linkstate_prefix (router_id, htonl (0), &prefix);
717
718 if (inet_pton (AF_INET, argv[1], &area_id) != 1)
719 {
hasso049207c2004-08-04 20:02:13 +0000720 vty_out (vty, "Malformed Area-ID: %s%s", argv[1], VNL);
hasso508e53e2004-05-18 18:57:06 +0000721 return CMD_SUCCESS;
722 }
723 oa = ospf6_area_lookup (area_id, ospf6);
724 if (oa == NULL)
725 {
hasso049207c2004-08-04 20:02:13 +0000726 vty_out (vty, "No such Area: %s%s", argv[1], VNL);
hasso508e53e2004-05-18 18:57:06 +0000727 return CMD_SUCCESS;
728 }
729
730 tmp_debug_ospf6_spf = conf_debug_ospf6_spf;
731 conf_debug_ospf6_spf = 0;
732
Paul Jakmacf1ce252006-05-15 10:46:07 +0000733 spf_table = OSPF6_ROUTE_TABLE_CREATE (NONE, SPF_RESULTS);
hasso508e53e2004-05-18 18:57:06 +0000734 ospf6_spf_calculation (router_id, spf_table, oa);
735
736 conf_debug_ospf6_spf = tmp_debug_ospf6_spf;
737
738 route = ospf6_route_lookup (&prefix, spf_table);
739 if (route == NULL)
740 {
741 ospf6_spf_table_finish (spf_table);
742 ospf6_route_table_delete (spf_table);
743 return CMD_SUCCESS;
744 }
745 root = (struct ospf6_vertex *) route->route_option;
746 ospf6_spf_display_subtree (vty, "", 0, root);
747
748 ospf6_spf_table_finish (spf_table);
749 ospf6_route_table_delete (spf_table);
750
751 return CMD_SUCCESS;
752}
paul718e3742002-12-13 20:15:29 +0000753
754void
Paul Jakma6ac29a52008-08-15 13:45:30 +0100755ospf6_area_init (void)
paul718e3742002-12-13 20:15:29 +0000756{
hasso508e53e2004-05-18 18:57:06 +0000757 install_element (VIEW_NODE, &show_ipv6_ospf6_spf_tree_cmd);
hasso508e53e2004-05-18 18:57:06 +0000758 install_element (VIEW_NODE, &show_ipv6_ospf6_area_spf_tree_cmd);
hasso508e53e2004-05-18 18:57:06 +0000759 install_element (VIEW_NODE, &show_ipv6_ospf6_simulate_spf_tree_root_cmd);
760
761 install_element (ENABLE_NODE, &show_ipv6_ospf6_spf_tree_cmd);
hasso508e53e2004-05-18 18:57:06 +0000762 install_element (ENABLE_NODE, &show_ipv6_ospf6_area_spf_tree_cmd);
hasso508e53e2004-05-18 18:57:06 +0000763 install_element (ENABLE_NODE, &show_ipv6_ospf6_simulate_spf_tree_root_cmd);
hasso6452df02004-08-15 05:52:07 +0000764
765 install_element (OSPF6_NODE, &area_range_cmd);
766 install_element (OSPF6_NODE, &area_range_advertise_cmd);
767 install_element (OSPF6_NODE, &no_area_range_cmd);
hasso34956b32005-06-24 08:44:02 +0000768
769 install_element (OSPF6_NODE, &area_import_list_cmd);
770 install_element (OSPF6_NODE, &no_area_import_list_cmd);
771 install_element (OSPF6_NODE, &area_export_list_cmd);
772 install_element (OSPF6_NODE, &no_area_export_list_cmd);
773
774 install_element (OSPF6_NODE, &area_filter_list_cmd);
775 install_element (OSPF6_NODE, &no_area_filter_list_cmd);
776
paul718e3742002-12-13 20:15:29 +0000777}
hasso049207c2004-08-04 20:02:13 +0000778
hasso6452df02004-08-15 05:52:07 +0000779