blob: 94283dba73347d6c9128a1e8791c9f1200189de8 [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 */
paul718e3742002-12-13 20:15:29 +000057void
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
87void
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
117void
118ospf6_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
124void
125ospf6_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
hasso6452df02004-08-15 05:52:07 +0000233struct ospf6_area *
234ospf6_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
356 ospf6_route_add (range, oa->range_table);
357 return CMD_SUCCESS;
358}
359
360ALIAS (area_range,
361 area_range_advertise_cmd,
362 "area A.B.C.D range X:X::X:X/M (advertise|not-advertise)",
363 "OSPF area parameters\n"
364 OSPF6_AREA_ID_STR
365 "Configured address range\n"
366 "Specify IPv6 prefix\n"
367 );
368
369DEFUN (no_area_range,
370 no_area_range_cmd,
371 "no area A.B.C.D range X:X::X:X/M",
372 "OSPF area parameters\n"
373 OSPF6_AREA_ID_STR
374 "Configured address range\n"
375 "Specify IPv6 prefix\n"
376 )
377{
378 int ret;
379 struct ospf6_area *oa;
380 struct prefix prefix;
381 struct ospf6_route *range;
382
383 OSPF6_CMD_AREA_GET (argv[0], oa);
384 argc--;
385 argv++;
386
387 ret = str2prefix (argv[0], &prefix);
388 if (ret != 1 || prefix.family != AF_INET6)
389 {
390 vty_out (vty, "Malformed argument: %s%s", argv[0], VNL);
391 return CMD_SUCCESS;
392 }
393
394 range = ospf6_route_lookup (&prefix, oa->range_table);
395 if (range == NULL)
396 {
397 vty_out (vty, "Range %s does not exists.%s", argv[0], VNL);
398 return CMD_SUCCESS;
399 }
400
401 ospf6_route_remove (range, oa->range_table);
402 return CMD_SUCCESS;
403}
404
405void
406ospf6_area_config_write (struct vty *vty)
407{
hasso52dc7ee2004-09-23 19:18:23 +0000408 struct listnode *node;
hasso6452df02004-08-15 05:52:07 +0000409 struct ospf6_area *oa;
410 struct ospf6_route *range;
411 char buf[128];
412
paul1eb8ef22005-04-07 07:30:20 +0000413 for (ALL_LIST_ELEMENTS_RO (ospf6->area_list, node, oa))
hasso6452df02004-08-15 05:52:07 +0000414 {
hasso6452df02004-08-15 05:52:07 +0000415 for (range = ospf6_route_head (oa->range_table); range;
416 range = ospf6_route_next (range))
417 {
418 prefix2str (&range->prefix, buf, sizeof (buf));
419 vty_out (vty, " area %s range %s%s", oa->name, buf, VNL);
420 }
421 }
422}
423
hasso34956b32005-06-24 08:44:02 +0000424DEFUN (area_filter_list,
425 area_filter_list_cmd,
426 "area A.B.C.D filter-list prefix WORD (in|out)",
427 "OSPFv6 area parameters\n"
428 "OSPFv6 area ID in IP address format\n"
429 "Filter networks between OSPFv6 areas\n"
430 "Filter prefixes between OSPFv6 areas\n"
431 "Name of an IPv6 prefix-list\n"
432 "Filter networks sent to this area\n"
433 "Filter networks sent from this area\n")
434{
435 struct ospf6_area *area;
436 struct prefix_list *plist;
437
438 OSPF6_CMD_AREA_GET (argv[0], area);
439 argc--;
440 argv++;
441
442 plist = prefix_list_lookup (AFI_IP6, argv[1]);
443 if (strncmp (argv[2], "in", 2) == 0)
444 {
445 PREFIX_LIST_IN (area) = plist;
446 if (PREFIX_NAME_IN (area))
447 free (PREFIX_NAME_IN (area));
448
449 PREFIX_NAME_IN (area) = strdup (argv[1]);
450 ospf6_abr_reimport (area);
451 }
452 else
453 {
454 PREFIX_LIST_OUT (area) = plist;
455 if (PREFIX_NAME_OUT (area))
456 free (PREFIX_NAME_OUT (area));
457
458 PREFIX_NAME_OUT (area) = strdup (argv[1]);
459 ospf6_abr_enable_area (area);
460 }
461
462 return CMD_SUCCESS;
463}
464
465DEFUN (no_area_filter_list,
466 no_area_filter_list_cmd,
467 "no area A.B.C.D filter-list prefix WORD (in|out)",
468 NO_STR
469 "OSPFv6 area parameters\n"
470 "OSPFv6 area ID in IP address format\n"
471 "Filter networks between OSPFv6 areas\n"
472 "Filter prefixes between OSPFv6 areas\n"
473 "Name of an IPv6 prefix-list\n"
474 "Filter networks sent to this area\n"
475 "Filter networks sent from this area\n")
476{
477 struct ospf6_area *area;
478 struct prefix_list *plist;
479
480 OSPF6_CMD_AREA_GET (argv[0], area);
481 argc--;
482 argv++;
483
484 plist = prefix_list_lookup (AFI_IP6, argv[1]);
485 if (strncmp (argv[2], "in", 2) == 0)
486 {
487 if (PREFIX_NAME_IN (area))
488 if (strcmp (PREFIX_NAME_IN (area), argv[1]) != 0)
489 return CMD_SUCCESS;
490
491 PREFIX_LIST_IN (area) = NULL;
492 if (PREFIX_NAME_IN (area))
493 free (PREFIX_NAME_IN (area));
494
495 PREFIX_NAME_IN (area) = NULL;
496 ospf6_abr_reimport (area);
497 }
498 else
499 {
500 if (PREFIX_NAME_OUT (area))
501 if (strcmp (PREFIX_NAME_OUT (area), argv[1]) != 0)
502 return CMD_SUCCESS;
503
504 PREFIX_LIST_OUT (area) = NULL;
505 if (PREFIX_NAME_OUT (area))
506 free (PREFIX_NAME_OUT (area));
507
508 PREFIX_NAME_OUT (area) = NULL;
509 ospf6_abr_enable_area (area);
510 }
511
512 return CMD_SUCCESS;
513}
514
515DEFUN (area_import_list,
516 area_import_list_cmd,
517 "area A.B.C.D import-list NAME",
518 "OSPFv6 area parameters\n"
519 "OSPFv6 area ID in IP address format\n"
520 "Set the filter for networks from other areas announced to the specified one\n"
521 "Name of the acess-list\n")
522{
523 struct ospf6_area *area;
524 struct access_list *list;
525
526 OSPF6_CMD_AREA_GET(argv[0], area);
527
528 list = access_list_lookup (AFI_IP6, argv[1]);
529
530 IMPORT_LIST (area) = list;
531
532 if (IMPORT_NAME (area))
533 free (IMPORT_NAME (area));
534
535 IMPORT_NAME (area) = strdup (argv[1]);
536 ospf6_abr_reimport (area);
537
538 return CMD_SUCCESS;
539}
540
541DEFUN (no_area_import_list,
542 no_area_import_list_cmd,
543 "no area A.B.C.D import-list NAME",
544 "OSPFv6 area parameters\n"
545 "OSPFv6 area ID in IP address format\n"
546 "Unset the filter for networks announced to other areas\n"
547 "NAme of the access-list\n")
548{
549 struct ospf6_area *area;
550
551 OSPF6_CMD_AREA_GET(argv[0], area);
552
553 IMPORT_LIST (area) = 0;
554
555 if (IMPORT_NAME (area))
556 free (IMPORT_NAME (area));
557
558 IMPORT_NAME (area) = NULL;
559 ospf6_abr_reimport (area);
560
561 return CMD_SUCCESS;
562}
563
564DEFUN (area_export_list,
565 area_export_list_cmd,
566 "area A.B.C.D export-list NAME",
567 "OSPFv6 area parameters\n"
568 "OSPFv6 area ID in IP address format\n"
569 "Set the filter for networks announced to other areas\n"
570 "Name of the acess-list\n")
571{
572 struct ospf6_area *area;
573 struct access_list *list;
574
575 OSPF6_CMD_AREA_GET(argv[0], area);
576
577 list = access_list_lookup (AFI_IP6, argv[1]);
578
579 EXPORT_LIST (area) = list;
580
581 if (EXPORT_NAME (area))
582 free (EXPORT_NAME (area));
583
584 EXPORT_NAME (area) = strdup (argv[1]);
585 ospf6_abr_enable_area (area);
586
587 return CMD_SUCCESS;
588}
589
590DEFUN (no_area_export_list,
591 no_area_export_list_cmd,
592 "no area A.B.C.D export-list NAME",
593 "OSPFv6 area parameters\n"
594 "OSPFv6 area ID in IP address format\n"
595 "Unset the filter for networks announced to other areas\n"
596 "Name of the access-list\n")
597{
598 struct ospf6_area *area;
599
600 OSPF6_CMD_AREA_GET(argv[0], area);
601
602 EXPORT_LIST (area) = 0;
603
604 if (EXPORT_NAME (area))
605 free (EXPORT_NAME (area));
606
607 EXPORT_NAME (area) = NULL;
608 ospf6_abr_enable_area (area);
609
610 return CMD_SUCCESS;
611}
612
hasso508e53e2004-05-18 18:57:06 +0000613DEFUN (show_ipv6_ospf6_spf_tree,
614 show_ipv6_ospf6_spf_tree_cmd,
615 "show ipv6 ospf6 spf tree",
616 SHOW_STR
617 IP6_STR
618 OSPF6_STR
619 "Shortest Path First caculation\n"
620 "Show SPF tree\n")
621{
hasso52dc7ee2004-09-23 19:18:23 +0000622 struct listnode *node;
hasso508e53e2004-05-18 18:57:06 +0000623 struct ospf6_area *oa;
624 struct ospf6_vertex *root;
625 struct ospf6_route *route;
626 struct prefix prefix;
627
628 ospf6_linkstate_prefix (ospf6->router_id, htonl (0), &prefix);
paul1eb8ef22005-04-07 07:30:20 +0000629
630 for (ALL_LIST_ELEMENTS_RO (ospf6->area_list, node, oa))
hasso508e53e2004-05-18 18:57:06 +0000631 {
hasso508e53e2004-05-18 18:57:06 +0000632 route = ospf6_route_lookup (&prefix, oa->spf_table);
633 if (route == NULL)
634 {
635 vty_out (vty, "LS entry for root not found in area %s%s",
hasso049207c2004-08-04 20:02:13 +0000636 oa->name, VNL);
hasso508e53e2004-05-18 18:57:06 +0000637 continue;
638 }
639 root = (struct ospf6_vertex *) route->route_option;
640 ospf6_spf_display_subtree (vty, "", 0, root);
641 }
642
643 return CMD_SUCCESS;
644}
645
646DEFUN (show_ipv6_ospf6_area_spf_tree,
647 show_ipv6_ospf6_area_spf_tree_cmd,
648 "show ipv6 ospf6 area A.B.C.D spf tree",
649 SHOW_STR
650 IP6_STR
651 OSPF6_STR
652 OSPF6_AREA_STR
653 OSPF6_AREA_ID_STR
654 "Shortest Path First caculation\n"
655 "Show SPF tree\n")
656{
657 u_int32_t area_id;
658 struct ospf6_area *oa;
659 struct ospf6_vertex *root;
660 struct ospf6_route *route;
661 struct prefix prefix;
662
663 ospf6_linkstate_prefix (ospf6->router_id, htonl (0), &prefix);
664
665 if (inet_pton (AF_INET, argv[0], &area_id) != 1)
666 {
hasso049207c2004-08-04 20:02:13 +0000667 vty_out (vty, "Malformed Area-ID: %s%s", argv[0], VNL);
hasso508e53e2004-05-18 18:57:06 +0000668 return CMD_SUCCESS;
669 }
670 oa = ospf6_area_lookup (area_id, ospf6);
671 if (oa == NULL)
672 {
hasso049207c2004-08-04 20:02:13 +0000673 vty_out (vty, "No such Area: %s%s", argv[0], VNL);
hasso508e53e2004-05-18 18:57:06 +0000674 return CMD_SUCCESS;
675 }
676
677 route = ospf6_route_lookup (&prefix, oa->spf_table);
678 if (route == NULL)
679 {
680 vty_out (vty, "LS entry for root not found in area %s%s",
hasso049207c2004-08-04 20:02:13 +0000681 oa->name, VNL);
hasso508e53e2004-05-18 18:57:06 +0000682 return CMD_SUCCESS;
683 }
684 root = (struct ospf6_vertex *) route->route_option;
685 ospf6_spf_display_subtree (vty, "", 0, root);
686
687 return CMD_SUCCESS;
688}
689
hasso508e53e2004-05-18 18:57:06 +0000690DEFUN (show_ipv6_ospf6_simulate_spf_tree_root,
691 show_ipv6_ospf6_simulate_spf_tree_root_cmd,
692 "show ipv6 ospf6 simulate spf-tree A.B.C.D area A.B.C.D",
693 SHOW_STR
694 IP6_STR
695 OSPF6_STR
696 "Shortest Path First caculation\n"
697 "Show SPF tree\n"
698 "Specify root's router-id to calculate another router's SPF tree\n")
699{
700 u_int32_t area_id;
701 struct ospf6_area *oa;
702 struct ospf6_vertex *root;
703 struct ospf6_route *route;
704 struct prefix prefix;
705 u_int32_t router_id;
706 struct ospf6_route_table *spf_table;
707 unsigned char tmp_debug_ospf6_spf = 0;
708
709 inet_pton (AF_INET, argv[0], &router_id);
710 ospf6_linkstate_prefix (router_id, htonl (0), &prefix);
711
712 if (inet_pton (AF_INET, argv[1], &area_id) != 1)
713 {
hasso049207c2004-08-04 20:02:13 +0000714 vty_out (vty, "Malformed Area-ID: %s%s", argv[1], VNL);
hasso508e53e2004-05-18 18:57:06 +0000715 return CMD_SUCCESS;
716 }
717 oa = ospf6_area_lookup (area_id, ospf6);
718 if (oa == NULL)
719 {
hasso049207c2004-08-04 20:02:13 +0000720 vty_out (vty, "No such Area: %s%s", argv[1], VNL);
hasso508e53e2004-05-18 18:57:06 +0000721 return CMD_SUCCESS;
722 }
723
724 tmp_debug_ospf6_spf = conf_debug_ospf6_spf;
725 conf_debug_ospf6_spf = 0;
726
Paul Jakmacf1ce252006-05-15 10:46:07 +0000727 spf_table = OSPF6_ROUTE_TABLE_CREATE (NONE, SPF_RESULTS);
hasso508e53e2004-05-18 18:57:06 +0000728 ospf6_spf_calculation (router_id, spf_table, oa);
729
730 conf_debug_ospf6_spf = tmp_debug_ospf6_spf;
731
732 route = ospf6_route_lookup (&prefix, spf_table);
733 if (route == NULL)
734 {
735 ospf6_spf_table_finish (spf_table);
736 ospf6_route_table_delete (spf_table);
737 return CMD_SUCCESS;
738 }
739 root = (struct ospf6_vertex *) route->route_option;
740 ospf6_spf_display_subtree (vty, "", 0, root);
741
742 ospf6_spf_table_finish (spf_table);
743 ospf6_route_table_delete (spf_table);
744
745 return CMD_SUCCESS;
746}
paul718e3742002-12-13 20:15:29 +0000747
748void
749ospf6_area_init ()
750{
hasso508e53e2004-05-18 18:57:06 +0000751 install_element (VIEW_NODE, &show_ipv6_ospf6_spf_tree_cmd);
hasso508e53e2004-05-18 18:57:06 +0000752 install_element (VIEW_NODE, &show_ipv6_ospf6_area_spf_tree_cmd);
hasso508e53e2004-05-18 18:57:06 +0000753 install_element (VIEW_NODE, &show_ipv6_ospf6_simulate_spf_tree_root_cmd);
754
755 install_element (ENABLE_NODE, &show_ipv6_ospf6_spf_tree_cmd);
hasso508e53e2004-05-18 18:57:06 +0000756 install_element (ENABLE_NODE, &show_ipv6_ospf6_area_spf_tree_cmd);
hasso508e53e2004-05-18 18:57:06 +0000757 install_element (ENABLE_NODE, &show_ipv6_ospf6_simulate_spf_tree_root_cmd);
hasso6452df02004-08-15 05:52:07 +0000758
759 install_element (OSPF6_NODE, &area_range_cmd);
760 install_element (OSPF6_NODE, &area_range_advertise_cmd);
761 install_element (OSPF6_NODE, &no_area_range_cmd);
hasso34956b32005-06-24 08:44:02 +0000762
763 install_element (OSPF6_NODE, &area_import_list_cmd);
764 install_element (OSPF6_NODE, &no_area_import_list_cmd);
765 install_element (OSPF6_NODE, &area_export_list_cmd);
766 install_element (OSPF6_NODE, &no_area_export_list_cmd);
767
768 install_element (OSPF6_NODE, &area_filter_list_cmd);
769 install_element (OSPF6_NODE, &no_area_filter_list_cmd);
770
paul718e3742002-12-13 20:15:29 +0000771}
hasso049207c2004-08-04 20:02:13 +0000772
hasso6452df02004-08-15 05:52:07 +0000773