2 * Copyright (C) 2003 Yasuhiro Ohara
4 * This file is part of GNU Zebra.
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
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.
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.
24 /* Include other stuffs */
31 #include "ospf6_proto.h"
32 #include "ospf6_lsa.h"
33 #include "ospf6_lsdb.h"
34 #include "ospf6_message.h"
36 #include "ospf6_top.h"
37 #include "ospf6_area.h"
38 #include "ospf6_interface.h"
39 #include "ospf6_neighbor.h"
41 #include "ospf6_flood.h"
44 unsigned char conf_debug_ospf6_lsa
= 0;
46 struct ospf6_lstype ospf6_lstype
[OSPF6_LSTYPE_SIZE
];
48 char *ospf6_lstype_str
[OSPF6_LSTYPE_SIZE
] =
49 {"Unknown", "Router", "Network", "Inter-Prefix", "Inter-Router",
50 "AS-External", "Group-Membership", "Type-7", "Link", "Intra-Prefix"};
53 ospf6_lstype_name (u_int16_t type
)
56 int index
= ntohs (type
) & OSPF6_LSTYPE_FCODE_MASK
;
58 if (index
< OSPF6_LSTYPE_SIZE
&& ospf6_lstype_str
[index
])
59 return ospf6_lstype_str
[index
];
61 snprintf (buf
, sizeof (buf
), "0x%04hx", ntohs (type
));
65 /* RFC2328: Section 13.2 */
67 ospf6_lsa_is_differ (struct ospf6_lsa
*lsa1
,
68 struct ospf6_lsa
*lsa2
)
72 assert (OSPF6_LSA_IS_SAME (lsa1
, lsa2
));
74 /* XXX, Options ??? */
76 ospf6_lsa_age_current (lsa1
);
77 ospf6_lsa_age_current (lsa2
);
78 if (ntohs (lsa1
->header
->age
) == MAXAGE
&&
79 ntohs (lsa2
->header
->age
) != MAXAGE
)
81 if (ntohs (lsa1
->header
->age
) != MAXAGE
&&
82 ntohs (lsa2
->header
->age
) == MAXAGE
)
86 if (ntohs (lsa1
->header
->length
) != ntohs (lsa2
->header
->length
))
89 len
= ntohs (lsa1
->header
->length
) - sizeof (struct ospf6_lsa_header
);
90 return memcmp (lsa1
->header
+ 1, lsa2
->header
+ 1, len
);
94 ospf6_lsa_is_changed (struct ospf6_lsa
*lsa1
,
95 struct ospf6_lsa
*lsa2
)
99 if (OSPF6_LSA_IS_MAXAGE (lsa1
) ^ OSPF6_LSA_IS_MAXAGE (lsa2
))
101 if (ntohs (lsa1
->header
->length
) != ntohs (lsa2
->header
->length
))
104 length
= OSPF6_LSA_SIZE (lsa1
->header
) - sizeof (struct ospf6_lsa_header
);
107 return memcmp (OSPF6_LSA_HEADER_END (lsa1
->header
),
108 OSPF6_LSA_HEADER_END (lsa2
->header
), length
);
111 /* ospf6 age functions */
112 /* calculate birth and set expire timer */
114 ospf6_lsa_age_set (struct ospf6_lsa
*lsa
)
118 assert (lsa
&& lsa
->header
);
120 if (gettimeofday (&now
, (struct timezone
*)NULL
) < 0)
121 zlog_warn ("LSA: gettimeofday failed, may fail LSA AGEs: %s",
124 lsa
->birth
.tv_sec
= now
.tv_sec
- ntohs (lsa
->header
->age
);
125 lsa
->birth
.tv_usec
= now
.tv_usec
;
126 if (ntohs (lsa
->header
->age
) != MAXAGE
)
127 lsa
->expire
= thread_add_timer (master
, ospf6_lsa_expire
, lsa
,
128 MAXAGE
+ lsa
->birth
.tv_sec
135 /* this function calculates current age from its birth,
136 then update age field of LSA header. return value is current age */
138 ospf6_lsa_age_current (struct ospf6_lsa
*lsa
)
145 assert (lsa
->header
);
148 if (gettimeofday (&now
, (struct timezone
*)NULL
) < 0)
149 zlog_warn ("LSA: gettimeofday failed, may fail LSA AGEs: %s",
153 ulage
= now
.tv_sec
- lsa
->birth
.tv_sec
;
155 /* if over MAXAGE, set to it */
156 age
= (ulage
> MAXAGE
? MAXAGE
: ulage
);
158 lsa
->header
->age
= htons (age
);
162 /* update age field of LSA header with adding InfTransDelay */
164 ospf6_lsa_age_update_to_send (struct ospf6_lsa
*lsa
, u_int32_t transdelay
)
168 age
= ospf6_lsa_age_current (lsa
) + transdelay
;
171 lsa
->header
->age
= htons (age
);
175 ospf6_lsa_premature_aging (struct ospf6_lsa
*lsa
)
178 if (IS_OSPF6_DEBUG_LSA (ORIGINATE
))
179 zlog_info ("LSA: Premature aging: %s", lsa
->name
);
181 THREAD_OFF (lsa
->expire
);
182 THREAD_OFF (lsa
->refresh
);
184 memset (&lsa
->birth
, 0, sizeof (struct timeval
));
185 thread_execute (master
, ospf6_lsa_expire
, lsa
, 0);
188 /* check which is more recent. if a is more recent, return -1;
189 if the same, return 0; otherwise(b is more recent), return 1 */
191 ospf6_lsa_compare (struct ospf6_lsa
*a
, struct ospf6_lsa
*b
)
193 signed long seqnuma
, seqnumb
;
194 u_int16_t cksuma
, cksumb
;
195 u_int16_t agea
, ageb
;
197 assert (a
&& a
->header
);
198 assert (b
&& b
->header
);
199 assert (OSPF6_LSA_IS_SAME (a
, b
));
201 seqnuma
= ((signed long) ntohl (a
->header
->seqnum
))
202 - (signed long) INITIAL_SEQUENCE_NUMBER
;
203 seqnumb
= ((signed long) ntohl (b
->header
->seqnum
))
204 - (signed long) INITIAL_SEQUENCE_NUMBER
;
206 /* compare by sequence number */
207 /* XXX, LS sequence number wrapping */
208 if (seqnuma
> seqnumb
)
210 else if (seqnuma
< seqnumb
)
214 cksuma
= ntohs (a
->header
->checksum
);
215 cksumb
= ntohs (b
->header
->checksum
);
222 agea
= ospf6_lsa_age_current (a
);
223 ageb
= ospf6_lsa_age_current (b
);
226 if (agea
== MAXAGE
&& ageb
!= MAXAGE
)
228 else if (agea
!= MAXAGE
&& ageb
== MAXAGE
)
232 if (agea
> ageb
&& agea
- ageb
>= MAX_AGE_DIFF
)
234 else if (agea
< ageb
&& ageb
- agea
>= MAX_AGE_DIFF
)
242 ospf6_lsa_printbuf (struct ospf6_lsa
*lsa
, char *buf
, int size
)
244 char id
[16], adv_router
[16];
245 inet_ntop (AF_INET
, &lsa
->header
->id
, id
, sizeof (id
));
246 inet_ntop (AF_INET
, &lsa
->header
->adv_router
, adv_router
,
247 sizeof (adv_router
));
248 snprintf (buf
, size
, "[%s Id:%s Adv:%s]",
249 OSPF6_LSTYPE_NAME (lsa
->header
->type
), id
, adv_router
);
254 ospf6_lsa_header_print_raw (struct ospf6_lsa_header
*header
)
256 char id
[16], adv_router
[16];
257 inet_ntop (AF_INET
, &header
->id
, id
, sizeof (id
));
258 inet_ntop (AF_INET
, &header
->adv_router
, adv_router
,
259 sizeof (adv_router
));
260 zlog_info (" [%s Id:%s Adv:%s]",
261 OSPF6_LSTYPE_NAME (header
->type
), id
, adv_router
);
262 zlog_info (" Age: %4hu SeqNum: %#08lx Cksum: %04hx Len: %d",
263 ntohs (header
->age
), (u_long
) ntohl (header
->seqnum
),
264 ntohs (header
->checksum
), ntohs (header
->length
));
268 ospf6_lsa_header_print (struct ospf6_lsa
*lsa
)
270 ospf6_lsa_age_current (lsa
);
271 ospf6_lsa_header_print_raw (lsa
->header
);
275 ospf6_lsa_show (struct vty
*vty
, struct ospf6_lsa
*lsa
)
277 char adv_router
[64], id
[64];
280 assert (lsa
&& lsa
->header
);
282 inet_ntop (AF_INET
, &lsa
->header
->id
, id
, sizeof (id
));
283 inet_ntop (AF_INET
, &lsa
->header
->adv_router
,
284 adv_router
, sizeof (adv_router
));
286 vty_out (vty
, "Age: %4hu Type: %s%s", ospf6_lsa_age_current (lsa
),
287 OSPF6_LSTYPE_NAME (lsa
->header
->type
), VNL
);
288 vty_out (vty
, "Link State ID: %s%s", id
, VNL
);
289 vty_out (vty
, "Advertising Router: %s%s", adv_router
, VNL
);
290 vty_out (vty
, "LS Sequence Number: %#010lx%s",
291 (u_long
) ntohl (lsa
->header
->seqnum
), VNL
);
292 vty_out (vty
, "CheckSum: %#06hx Length: %hu%s",
293 ntohs (lsa
->header
->checksum
),
294 ntohs (lsa
->header
->length
), VNL
);
296 index
= OSPF6_LSTYPE_INDEX (ntohs (lsa
->header
->type
));
297 if (ospf6_lstype
[index
].show
)
298 (*ospf6_lstype
[index
].show
) (vty
, lsa
);
300 vty_out (vty
, "%sUnknown LSA type ...%s", VNL
, VNL
);
302 vty_out (vty
, "%s", VNL
);
306 ospf6_lsa_show_summary_header (struct vty
*vty
)
308 vty_out (vty
, "%-12s %-15s %-15s %4s %8s %4s %4s %-8s%s",
309 "Type", "LSId", "AdvRouter", "Age", "SeqNum",
310 "Cksm", "Len", "Duration", VNL
);
314 ospf6_lsa_show_summary (struct vty
*vty
, struct ospf6_lsa
*lsa
)
316 char adv_router
[16], id
[16];
317 struct timeval now
, res
;
321 assert (lsa
->header
);
323 inet_ntop (AF_INET
, &lsa
->header
->id
, id
, sizeof (id
));
324 inet_ntop (AF_INET
, &lsa
->header
->adv_router
, adv_router
,
325 sizeof (adv_router
));
327 gettimeofday (&now
, NULL
);
328 timersub (&now
, &lsa
->installed
, &res
);
329 timerstring (&res
, duration
, sizeof (duration
));
331 vty_out (vty
, "%-12s %-15s %-15s %4hu %8lx %04hx %4hu %8s%s",
332 OSPF6_LSTYPE_NAME (lsa
->header
->type
),
333 id
, adv_router
, ospf6_lsa_age_current (lsa
),
334 (u_long
) ntohl (lsa
->header
->seqnum
),
335 ntohs (lsa
->header
->checksum
), ntohs (lsa
->header
->length
),
340 ospf6_lsa_show_dump (struct vty
*vty
, struct ospf6_lsa
*lsa
)
342 u_char
*start
, *end
, *current
;
345 start
= (char *) lsa
->header
;
346 end
= (char *) lsa
->header
+ ntohs (lsa
->header
->length
);
348 vty_out (vty
, "%s", VNL
);
349 vty_out (vty
, "%s:%s", lsa
->name
, VNL
);
351 for (current
= start
; current
< end
; current
++)
353 if ((current
- start
) % 16 == 0)
354 vty_out (vty
, "%s ", VNL
);
355 else if ((current
- start
) % 4 == 0)
358 snprintf (byte
, sizeof (byte
), "%02x", *current
);
359 vty_out (vty
, "%s", byte
);
362 vty_out (vty
, "%s%s", VNL
, VNL
);
366 ospf6_lsa_show_internal (struct vty
*vty
, struct ospf6_lsa
*lsa
)
368 char adv_router
[64], id
[64];
370 assert (lsa
&& lsa
->header
);
372 inet_ntop (AF_INET
, &lsa
->header
->id
, id
, sizeof (id
));
373 inet_ntop (AF_INET
, &lsa
->header
->adv_router
,
374 adv_router
, sizeof (adv_router
));
376 vty_out (vty
, "%s", VNL
);
377 vty_out (vty
, "Age: %4hu Type: %s%s", ospf6_lsa_age_current (lsa
),
378 OSPF6_LSTYPE_NAME (lsa
->header
->type
), VNL
);
379 vty_out (vty
, "Link State ID: %s%s", id
, VNL
);
380 vty_out (vty
, "Advertising Router: %s%s", adv_router
, VNL
);
381 vty_out (vty
, "LS Sequence Number: %#010lx%s",
382 (u_long
) ntohl (lsa
->header
->seqnum
), VNL
);
383 vty_out (vty
, "CheckSum: %#06hx Length: %hu%s",
384 ntohs (lsa
->header
->checksum
),
385 ntohs (lsa
->header
->length
), VNL
);
386 vty_out (vty
, " Prev: %p This: %p Next: %p%s",
387 lsa
->prev
, lsa
, lsa
->next
, VNL
);
388 vty_out (vty
, "%s", VNL
);
391 /* OSPFv3 LSA creation/deletion function */
394 ospf6_lsa_create (struct ospf6_lsa_header
*header
)
396 struct ospf6_lsa
*lsa
= NULL
;
397 struct ospf6_lsa_header
*new_header
= NULL
;
398 u_int16_t lsa_size
= 0;
400 /* size of the entire LSA */
401 lsa_size
= ntohs (header
->length
); /* XXX vulnerable */
403 /* allocate memory for this LSA */
404 new_header
= (struct ospf6_lsa_header
*)
405 XMALLOC (MTYPE_OSPF6_LSA
, lsa_size
);
407 /* copy LSA from original header */
408 memcpy (new_header
, header
, lsa_size
);
410 /* LSA information structure */
411 /* allocate memory */
412 lsa
= (struct ospf6_lsa
*)
413 XMALLOC (MTYPE_OSPF6_LSA
, sizeof (struct ospf6_lsa
));
414 memset (lsa
, 0, sizeof (struct ospf6_lsa
));
416 lsa
->header
= (struct ospf6_lsa_header
*) new_header
;
417 lsa
->headeronly
= 0; /* this is not header only */
420 ospf6_lsa_printbuf (lsa
, lsa
->name
, sizeof (lsa
->name
));
422 /* calculate birth, expire and refresh of this lsa */
423 ospf6_lsa_age_set (lsa
);
425 if (IS_OSPF6_DEBUG_LSA (MEMORY
))
426 zlog_info ("Create LSA Memory: %s (%p/%p)",
427 lsa
->name
, lsa
, lsa
->header
);
433 ospf6_lsa_create_headeronly (struct ospf6_lsa_header
*header
)
435 struct ospf6_lsa
*lsa
= NULL
;
436 struct ospf6_lsa_header
*new_header
= NULL
;
438 /* allocate memory for this LSA */
439 new_header
= (struct ospf6_lsa_header
*)
440 XMALLOC (MTYPE_OSPF6_LSA
, sizeof (struct ospf6_lsa_header
));
442 /* copy LSA from original header */
443 memcpy (new_header
, header
, sizeof (struct ospf6_lsa_header
));
445 /* LSA information structure */
446 /* allocate memory */
447 lsa
= (struct ospf6_lsa
*)
448 XMALLOC (MTYPE_OSPF6_LSA
, sizeof (struct ospf6_lsa
));
449 memset (lsa
, 0, sizeof (struct ospf6_lsa
));
451 lsa
->header
= (struct ospf6_lsa_header
*) new_header
;
452 lsa
->headeronly
= 1; /* this is header only */
455 ospf6_lsa_printbuf (lsa
, lsa
->name
, sizeof (lsa
->name
));
457 /* calculate birth, expire and refresh of this lsa */
458 ospf6_lsa_age_set (lsa
);
460 if (IS_OSPF6_DEBUG_LSA (MEMORY
))
461 zlog_info ("Create LSA (Header-only) Memory: %s (%p/%p)",
462 lsa
->name
, lsa
, lsa
->header
);
468 ospf6_lsa_delete (struct ospf6_lsa
*lsa
)
470 assert (lsa
->lock
== 0);
473 THREAD_OFF (lsa
->expire
);
474 THREAD_OFF (lsa
->refresh
);
476 if (IS_OSPF6_DEBUG_LSA (MEMORY
))
477 zlog_info ("Delete LSA %s Memory: %s (%p/%p)",
478 (lsa
->headeronly
? "(Header-only) " : ""),
479 lsa
->name
, lsa
, lsa
->header
);
482 XFREE (MTYPE_OSPF6_LSA
, lsa
->header
);
483 XFREE (MTYPE_OSPF6_LSA
, lsa
);
487 ospf6_lsa_copy (struct ospf6_lsa
*lsa
)
489 struct ospf6_lsa
*copy
= NULL
;
491 if (IS_OSPF6_DEBUG_LSA (MEMORY
))
492 zlog_info ("Create LSA Copy from %s", lsa
->name
);
494 ospf6_lsa_age_current (lsa
);
496 copy
= ospf6_lsa_create_headeronly (lsa
->header
);
498 copy
= ospf6_lsa_create (lsa
->header
);
499 assert (copy
->lock
== 0);
501 copy
->installed
= lsa
->installed
;
502 copy
->originated
= lsa
->originated
;
503 copy
->scope
= lsa
->scope
;
508 /* increment reference counter of struct ospf6_lsa */
510 ospf6_lsa_lock (struct ospf6_lsa
*lsa
)
516 /* decrement reference counter of struct ospf6_lsa */
518 ospf6_lsa_unlock (struct ospf6_lsa
*lsa
)
520 /* decrement reference counter */
521 assert (lsa
->lock
> 0);
527 ospf6_lsa_delete (lsa
);
531 ospf6_lsa_originate (struct ospf6_lsa
*lsa
)
533 struct ospf6_lsa
*old
;
534 struct ospf6_lsdb
*lsdb
= NULL
;
536 /* find previous LSA */
537 lsdb
= ospf6_get_scoped_lsdb (lsa
->header
->type
, lsa
->scope
);
540 zlog_warn ("Can't decide scoped LSDB");
541 ospf6_lsa_delete (lsa
);
545 old
= ospf6_lsdb_lookup (lsa
->header
->type
, lsa
->header
->id
,
546 lsa
->header
->adv_router
, lsdb
);
549 /* If this origination is neither different instance nor refresh,
550 suppress this origination */
551 if (! CHECK_FLAG (old
->flag
, OSPF6_LSA_REFRESH
) &&
552 ! OSPF6_LSA_IS_DIFFER (lsa
, old
))
554 if (IS_OSPF6_DEBUG_LSA (ORIGINATE
))
555 zlog_info ("Suppress updating LSA: %s", lsa
->name
);
556 ospf6_lsa_delete (lsa
);
561 lsa
->refresh
= thread_add_timer (master
, ospf6_lsa_refresh
, lsa
,
564 if (IS_OSPF6_DEBUG_LSA (ORIGINATE
))
566 zlog_info ("LSA Originate:");
567 ospf6_lsa_header_print (lsa
);
571 ospf6_flood_clear (old
);
572 ospf6_flood_lsa (lsa
, NULL
);
573 ospf6_install_lsa (lsa
, lsdb
);
577 ospf6_lsa_re_originate (struct ospf6_lsa
*lsa
)
581 if (IS_OSPF6_DEBUG_LSA (ORIGINATE
))
583 zlog_info ("LSA Reoriginate:");
584 ospf6_lsa_header_print (lsa
);
587 index
= OSPF6_LSTYPE_INDEX (ntohs (lsa
->header
->type
));
588 if (ospf6_lstype
[index
].reoriginate
)
589 (*ospf6_lstype
[index
].reoriginate
) (lsa
);
591 ospf6_lsa_premature_aging (lsa
);
595 /* ospf6 lsa expiry */
597 ospf6_lsa_expire (struct thread
*thread
)
599 struct ospf6_lsa
*lsa
;
600 struct ospf6_lsdb
*lsdb
= NULL
;
602 lsa
= (struct ospf6_lsa
*) THREAD_ARG (thread
);
604 assert (lsa
&& lsa
->header
);
605 assert (OSPF6_LSA_IS_MAXAGE (lsa
));
606 assert (! lsa
->refresh
);
608 lsa
->expire
= (struct thread
*) NULL
;
610 if (IS_OSPF6_DEBUG_LSA (TIMER
))
612 zlog_info ("LSA Expire:");
613 ospf6_lsa_header_print (lsa
);
617 return 0; /* dbexchange will do something ... */
620 ospf6_flood_lsa (lsa
, NULL
);
623 lsdb
= ospf6_get_scoped_lsdb (lsa
->header
->type
, lsa
->scope
);
626 zlog_warn ("Can't decide scoped LSDB: %s", lsa
->name
);
629 if (IS_OSPF6_DEBUG_LSA (DATABASE
))
630 zlog_info ("Reinstall MaxAge %s", lsa
->name
);
631 ospf6_lsdb_add (lsa
, lsdb
);
633 /* schedule maxage remover */
634 ospf6_maxage_remove (ospf6
);
639 /* Below will become dummy thread.
640 refresh function must be set individually per each LSAs */
642 ospf6_lsa_refresh (struct thread
*thread
)
644 struct ospf6_lsa
*lsa
;
647 lsa
= (struct ospf6_lsa
*) THREAD_ARG (thread
);
648 assert (lsa
&& lsa
->header
);
650 lsa
->refresh
= (struct thread
*) NULL
;
652 /* this will be used later to decide really originate or not */
653 SET_FLAG (lsa
->flag
, OSPF6_LSA_REFRESH
);
655 if (IS_OSPF6_DEBUG_LSA (ORIGINATE
))
657 zlog_info ("LSA Refresh:");
658 ospf6_lsa_header_print (lsa
);
661 ospf6_lsa_re_originate (lsa
);
667 /* enhanced Fletcher checksum algorithm, RFC1008 7.2 */
669 #define LSA_CHECKSUM_OFFSET 15
672 ospf6_lsa_checksum (struct ospf6_lsa_header
*lsa_header
)
674 u_char
*sp
, *ep
, *p
, *q
;
679 lsa_header
->checksum
= 0;
680 length
= ntohs (lsa_header
->length
) - 2;
681 sp
= (char *) &lsa_header
->type
;
683 for (ep
= sp
+ length
; sp
< ep
; sp
= q
)
688 for (p
= sp
; p
< q
; p
++)
697 /* r = (c1 << 8) + c0; */
698 x
= ((length
- LSA_CHECKSUM_OFFSET
) * c0
- c1
) % 255;
705 lsa_header
->checksum
= htons ((x
<< 8) + y
);
707 return (lsa_header
->checksum
);
711 ospf6_unknown_reoriginate (struct ospf6_lsa
*lsa
)
713 ospf6_lsa_premature_aging (lsa
);
718 ospf6_unknown_show (struct vty
*vty
, struct ospf6_lsa
*lsa
)
720 u_char
*start
, *end
, *current
;
723 start
= (char *) lsa
->header
+ sizeof (struct ospf6_lsa_header
);
724 end
= (char *) lsa
->header
+ ntohs (lsa
->header
->length
);
726 vty_out (vty
, " Unknown contents:%s", VNL
);
727 for (current
= start
; current
< end
; current
++)
729 if ((current
- start
) % 16 == 0)
730 vty_out (vty
, "%s ", VNL
);
731 else if ((current
- start
) % 4 == 0)
734 snprintf (byte
, sizeof (byte
), "%02x", *current
);
735 vty_out (vty
, "%s", byte
);
738 vty_out (vty
, "%s%s", VNL
, VNL
);
745 memset (ospf6_lstype
, 0, sizeof (ospf6_lstype
));
747 ospf6_lstype
[0].name
= "Unknown";
748 ospf6_lstype
[0].reoriginate
= ospf6_unknown_reoriginate
;
749 ospf6_lstype
[0].show
= ospf6_unknown_show
;
754 DEFUN (debug_ospf6_lsa_sendrecv
,
755 debug_ospf6_lsa_sendrecv_cmd
,
756 "debug ospf6 lsa (send|recv|originate|timer|database|memory|all)",
759 "Debug Link State Advertisements (LSAs)\n"
760 "Debug Sending LSAs\n"
761 "Debug Receiving LSAs\n"
762 "Debug Originating LSAs\n"
763 "Debug Timer Event of LSAs\n"
764 "Debug LSA Database\n"
765 "Debug Memory of LSAs\n"
769 unsigned char level
= 0;
773 if (! strncmp (argv
[0], "s", 1))
774 level
= OSPF6_DEBUG_LSA_SEND
;
775 else if (! strncmp (argv
[0], "r", 1))
776 level
= OSPF6_DEBUG_LSA_RECV
;
777 else if (! strncmp (argv
[0], "o", 1))
778 level
= OSPF6_DEBUG_LSA_ORIGINATE
;
779 else if (! strncmp (argv
[0], "t", 1))
780 level
= OSPF6_DEBUG_LSA_TIMER
;
781 else if (! strncmp (argv
[0], "d", 1))
782 level
= OSPF6_DEBUG_LSA_DATABASE
;
783 else if (! strncmp (argv
[0], "m", 1))
784 level
= OSPF6_DEBUG_LSA_MEMORY
;
785 else if (! strncmp (argv
[0], "a", 1))
787 level
= OSPF6_DEBUG_LSA_SEND
| OSPF6_DEBUG_LSA_RECV
|
788 OSPF6_DEBUG_LSA_ORIGINATE
| OSPF6_DEBUG_LSA_TIMER
|
789 OSPF6_DEBUG_LSA_DATABASE
| OSPF6_DEBUG_LSA_MEMORY
;
794 level
= OSPF6_DEBUG_LSA_SEND
| OSPF6_DEBUG_LSA_RECV
|
795 OSPF6_DEBUG_LSA_ORIGINATE
| OSPF6_DEBUG_LSA_TIMER
;
798 OSPF6_DEBUG_LSA_ON (level
);
802 ALIAS (debug_ospf6_lsa_sendrecv
,
808 "Debug Link State Advertisements (LSAs)\n"
811 DEFUN (no_debug_ospf6_lsa_sendrecv
,
812 no_debug_ospf6_lsa_sendrecv_cmd
,
813 "no debug ospf6 lsa (send|recv|originate|timer|database|memory|all)",
817 "Debug Link State Advertisements (LSAs)\n"
818 "Debug Sending LSAs\n"
819 "Debug Receiving LSAs\n"
820 "Debug Originating LSAs\n"
821 "Debug Timer Event of LSAs\n"
822 "Debug LSA Database\n"
823 "Debug Memory of LSAs\n"
827 unsigned char level
= 0;
831 if (! strncmp (argv
[0], "s", 1))
832 level
= OSPF6_DEBUG_LSA_SEND
;
833 else if (! strncmp (argv
[0], "r", 1))
834 level
= OSPF6_DEBUG_LSA_RECV
;
835 else if (! strncmp (argv
[0], "o", 1))
836 level
= OSPF6_DEBUG_LSA_ORIGINATE
;
837 else if (! strncmp (argv
[0], "t", 1))
838 level
= OSPF6_DEBUG_LSA_TIMER
;
839 else if (! strncmp (argv
[0], "d", 1))
840 level
= OSPF6_DEBUG_LSA_DATABASE
;
841 else if (! strncmp (argv
[0], "m", 1))
842 level
= OSPF6_DEBUG_LSA_MEMORY
;
843 else if (! strncmp (argv
[0], "a", 1))
845 level
= OSPF6_DEBUG_LSA_SEND
| OSPF6_DEBUG_LSA_RECV
|
846 OSPF6_DEBUG_LSA_ORIGINATE
| OSPF6_DEBUG_LSA_TIMER
|
847 OSPF6_DEBUG_LSA_DATABASE
| OSPF6_DEBUG_LSA_MEMORY
;
852 level
= OSPF6_DEBUG_LSA_SEND
| OSPF6_DEBUG_LSA_RECV
|
853 OSPF6_DEBUG_LSA_ORIGINATE
| OSPF6_DEBUG_LSA_TIMER
;
856 OSPF6_DEBUG_LSA_OFF (level
);
860 ALIAS (no_debug_ospf6_lsa_sendrecv
,
861 no_debug_ospf6_lsa_cmd
,
862 "no debug ospf6 lsa",
866 "Debug Link State Advertisements (LSAs)\n"
870 config_write_ospf6_debug_lsa (struct vty
*vty
)
872 if (conf_debug_ospf6_lsa
== OSPF6_DEBUG_LSA_ALL
)
873 vty_out (vty
, "debug ospf6 lsa all%s", VNL
);
876 if (conf_debug_ospf6_lsa
== OSPF6_DEBUG_LSA_DEFAULT
)
877 vty_out (vty
, "debug ospf6 lsa%s", VNL
);
880 if (IS_OSPF6_DEBUG_LSA (SEND
))
881 vty_out (vty
, "debug ospf6 lsa send%s", VNL
);
882 if (IS_OSPF6_DEBUG_LSA (RECV
))
883 vty_out (vty
, "debug ospf6 lsa recv%s", VNL
);
884 if (IS_OSPF6_DEBUG_LSA (ORIGINATE
))
885 vty_out (vty
, "debug ospf6 lsa originate%s", VNL
);
886 if (IS_OSPF6_DEBUG_LSA (TIMER
))
887 vty_out (vty
, "debug ospf6 lsa timer%s", VNL
);
890 if (IS_OSPF6_DEBUG_LSA (DATABASE
))
891 vty_out (vty
, "debug ospf6 lsa database%s", VNL
);
892 if (IS_OSPF6_DEBUG_LSA (MEMORY
))
893 vty_out (vty
, "debug ospf6 lsa memory%s", VNL
);
900 install_element_ospf6_debug_lsa ()
902 install_element (ENABLE_NODE
, &debug_ospf6_lsa_cmd
);
903 install_element (ENABLE_NODE
, &debug_ospf6_lsa_sendrecv_cmd
);
904 install_element (ENABLE_NODE
, &no_debug_ospf6_lsa_cmd
);
905 install_element (ENABLE_NODE
, &no_debug_ospf6_lsa_sendrecv_cmd
);
906 install_element (CONFIG_NODE
, &debug_ospf6_lsa_cmd
);
907 install_element (CONFIG_NODE
, &debug_ospf6_lsa_sendrecv_cmd
);
908 install_element (CONFIG_NODE
, &no_debug_ospf6_lsa_cmd
);
909 install_element (CONFIG_NODE
, &no_debug_ospf6_lsa_sendrecv_cmd
);