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_lsa_handler
*ospf6_lsa_handler
[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
= OSPF6_LSTYPE_INDEX (type
);
58 if (ospf6_lsa_handler
[index
])
59 return ospf6_lsa_handler
[index
]->name
;
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
- now
.tv_sec
);
134 /* this function calculates current age from its birth,
135 then update age field of LSA header. return value is current age */
137 ospf6_lsa_age_current (struct ospf6_lsa
*lsa
)
144 assert (lsa
->header
);
147 if (gettimeofday (&now
, (struct timezone
*)NULL
) < 0)
148 zlog_warn ("LSA: gettimeofday failed, may fail LSA AGEs: %s",
152 ulage
= now
.tv_sec
- lsa
->birth
.tv_sec
;
154 /* if over MAXAGE, set to it */
155 age
= (ulage
> MAXAGE
? MAXAGE
: ulage
);
157 lsa
->header
->age
= htons (age
);
161 /* update age field of LSA header with adding InfTransDelay */
163 ospf6_lsa_age_update_to_send (struct ospf6_lsa
*lsa
, u_int32_t transdelay
)
167 age
= ospf6_lsa_age_current (lsa
) + transdelay
;
170 lsa
->header
->age
= htons (age
);
174 ospf6_lsa_premature_aging (struct ospf6_lsa
*lsa
)
177 if (IS_OSPF6_DEBUG_LSA (ORIGINATE
))
178 zlog_info ("LSA: Premature aging: %s", lsa
->name
);
180 THREAD_OFF (lsa
->expire
);
181 THREAD_OFF (lsa
->refresh
);
183 memset (&lsa
->birth
, 0, sizeof (struct timeval
));
184 thread_execute (master
, ospf6_lsa_expire
, lsa
, 0);
187 /* check which is more recent. if a is more recent, return -1;
188 if the same, return 0; otherwise(b is more recent), return 1 */
190 ospf6_lsa_compare (struct ospf6_lsa
*a
, struct ospf6_lsa
*b
)
192 signed long seqnuma
, seqnumb
;
193 u_int16_t cksuma
, cksumb
;
194 u_int16_t agea
, ageb
;
196 assert (a
&& a
->header
);
197 assert (b
&& b
->header
);
198 assert (OSPF6_LSA_IS_SAME (a
, b
));
200 seqnuma
= ((signed long) ntohl (a
->header
->seqnum
))
201 - (signed long) INITIAL_SEQUENCE_NUMBER
;
202 seqnumb
= ((signed long) ntohl (b
->header
->seqnum
))
203 - (signed long) INITIAL_SEQUENCE_NUMBER
;
205 /* compare by sequence number */
206 /* XXX, LS sequence number wrapping */
207 if (seqnuma
> seqnumb
)
209 else if (seqnuma
< seqnumb
)
213 cksuma
= ntohs (a
->header
->checksum
);
214 cksumb
= ntohs (b
->header
->checksum
);
221 agea
= ospf6_lsa_age_current (a
);
222 ageb
= ospf6_lsa_age_current (b
);
225 if (agea
== MAXAGE
&& ageb
!= MAXAGE
)
227 else if (agea
!= MAXAGE
&& ageb
== MAXAGE
)
231 if (agea
> ageb
&& agea
- ageb
>= MAX_AGE_DIFF
)
233 else if (agea
< ageb
&& ageb
- agea
>= MAX_AGE_DIFF
)
241 ospf6_lsa_printbuf (struct ospf6_lsa
*lsa
, char *buf
, int size
)
243 char id
[16], adv_router
[16];
244 inet_ntop (AF_INET
, &lsa
->header
->id
, id
, sizeof (id
));
245 inet_ntop (AF_INET
, &lsa
->header
->adv_router
, adv_router
,
246 sizeof (adv_router
));
247 snprintf (buf
, size
, "[%s Id:%s Adv:%s]",
248 OSPF6_LSTYPE_NAME (lsa
->header
->type
), id
, adv_router
);
253 ospf6_lsa_header_print_raw (struct ospf6_lsa_header
*header
)
255 char id
[16], adv_router
[16];
256 inet_ntop (AF_INET
, &header
->id
, id
, sizeof (id
));
257 inet_ntop (AF_INET
, &header
->adv_router
, adv_router
,
258 sizeof (adv_router
));
259 zlog_info (" [%s Id:%s Adv:%s]",
260 OSPF6_LSTYPE_NAME (header
->type
), id
, adv_router
);
261 zlog_info (" Age: %4hu SeqNum: %#08lx Cksum: %04hx Len: %d",
262 ntohs (header
->age
), (u_long
) ntohl (header
->seqnum
),
263 ntohs (header
->checksum
), ntohs (header
->length
));
267 ospf6_lsa_header_print (struct ospf6_lsa
*lsa
)
269 ospf6_lsa_age_current (lsa
);
270 ospf6_lsa_header_print_raw (lsa
->header
);
274 ospf6_lsa_show_summary_header (struct vty
*vty
)
276 vty_out (vty
, "%-12s %-15s %-15s %4s %8s %4s %4s %-8s%s",
277 "Type", "LSId", "AdvRouter", "Age", "SeqNum",
278 "Cksm", "Len", "Duration", VNL
);
282 ospf6_lsa_show_summary (struct vty
*vty
, struct ospf6_lsa
*lsa
)
284 char adv_router
[16], id
[16];
285 struct timeval now
, res
;
289 assert (lsa
->header
);
291 inet_ntop (AF_INET
, &lsa
->header
->id
, id
, sizeof (id
));
292 inet_ntop (AF_INET
, &lsa
->header
->adv_router
, adv_router
,
293 sizeof (adv_router
));
295 gettimeofday (&now
, NULL
);
296 timersub (&now
, &lsa
->installed
, &res
);
297 timerstring (&res
, duration
, sizeof (duration
));
299 vty_out (vty
, "%-12s %-15s %-15s %4hu %8lx %04hx %4hu %8s%s",
300 OSPF6_LSTYPE_NAME (lsa
->header
->type
),
301 id
, adv_router
, ospf6_lsa_age_current (lsa
),
302 (u_long
) ntohl (lsa
->header
->seqnum
),
303 ntohs (lsa
->header
->checksum
), ntohs (lsa
->header
->length
),
308 ospf6_lsa_show_dump (struct vty
*vty
, struct ospf6_lsa
*lsa
)
310 u_char
*start
, *end
, *current
;
313 start
= (char *) lsa
->header
;
314 end
= (char *) lsa
->header
+ ntohs (lsa
->header
->length
);
316 vty_out (vty
, "%s", VNL
);
317 vty_out (vty
, "%s:%s", lsa
->name
, VNL
);
319 for (current
= start
; current
< end
; current
++)
321 if ((current
- start
) % 16 == 0)
322 vty_out (vty
, "%s ", VNL
);
323 else if ((current
- start
) % 4 == 0)
326 snprintf (byte
, sizeof (byte
), "%02x", *current
);
327 vty_out (vty
, "%s", byte
);
330 vty_out (vty
, "%s%s", VNL
, VNL
);
335 ospf6_lsa_show_internal (struct vty
*vty
, struct ospf6_lsa
*lsa
)
337 char adv_router
[64], id
[64];
339 assert (lsa
&& lsa
->header
);
341 inet_ntop (AF_INET
, &lsa
->header
->id
, id
, sizeof (id
));
342 inet_ntop (AF_INET
, &lsa
->header
->adv_router
,
343 adv_router
, sizeof (adv_router
));
345 vty_out (vty
, "%s", VNL
);
346 vty_out (vty
, "Age: %4hu Type: %s%s", ospf6_lsa_age_current (lsa
),
347 OSPF6_LSTYPE_NAME (lsa
->header
->type
), VNL
);
348 vty_out (vty
, "Link State ID: %s%s", id
, VNL
);
349 vty_out (vty
, "Advertising Router: %s%s", adv_router
, VNL
);
350 vty_out (vty
, "LS Sequence Number: %#010lx%s",
351 (u_long
) ntohl (lsa
->header
->seqnum
), VNL
);
352 vty_out (vty
, "CheckSum: %#06hx Length: %hu%s",
353 ntohs (lsa
->header
->checksum
),
354 ntohs (lsa
->header
->length
), VNL
);
355 vty_out (vty
, " Prev: %p This: %p Next: %p%s",
356 lsa
->prev
, lsa
, lsa
->next
, VNL
);
357 vty_out (vty
, "%s", VNL
);
362 ospf6_lsa_show (struct vty
*vty
, struct ospf6_lsa
*lsa
)
364 char adv_router
[64], id
[64];
367 assert (lsa
&& lsa
->header
);
369 inet_ntop (AF_INET
, &lsa
->header
->id
, id
, sizeof (id
));
370 inet_ntop (AF_INET
, &lsa
->header
->adv_router
,
371 adv_router
, sizeof (adv_router
));
373 vty_out (vty
, "Age: %4hu Type: %s%s", ospf6_lsa_age_current (lsa
),
374 OSPF6_LSTYPE_NAME (lsa
->header
->type
), VNL
);
375 vty_out (vty
, "Link State ID: %s%s", id
, VNL
);
376 vty_out (vty
, "Advertising Router: %s%s", adv_router
, VNL
);
377 vty_out (vty
, "LS Sequence Number: %#010lx%s",
378 (u_long
) ntohl (lsa
->header
->seqnum
), VNL
);
379 vty_out (vty
, "CheckSum: %#06hx Length: %hu%s",
380 ntohs (lsa
->header
->checksum
),
381 ntohs (lsa
->header
->length
), VNL
);
383 index
= OSPF6_LSTYPE_INDEX (lsa
->header
->type
);
384 if (ospf6_lsa_handler
[index
]->show
)
385 (*ospf6_lsa_handler
[index
]->show
) (vty
, lsa
);
388 ospf6_lsa_show_dump (vty
, lsa
);
389 vty_out (vty
, "%sUnknown LSA type ...%s", VNL
, VNL
);
392 vty_out (vty
, "%s", VNL
);
395 /* OSPFv3 LSA creation/deletion function */
397 ospf6_lsa_create (struct ospf6_lsa_header
*header
)
399 struct ospf6_lsa
*lsa
= NULL
;
400 struct ospf6_lsa_header
*new_header
= NULL
;
401 u_int16_t lsa_size
= 0;
403 /* size of the entire LSA */
404 lsa_size
= ntohs (header
->length
); /* XXX vulnerable */
406 /* allocate memory for this LSA */
407 new_header
= (struct ospf6_lsa_header
*)
408 XMALLOC (MTYPE_OSPF6_LSA
, lsa_size
);
410 /* copy LSA from original header */
411 memcpy (new_header
, header
, lsa_size
);
413 /* LSA information structure */
414 /* allocate memory */
415 lsa
= (struct ospf6_lsa
*)
416 XMALLOC (MTYPE_OSPF6_LSA
, sizeof (struct ospf6_lsa
));
417 memset (lsa
, 0, sizeof (struct ospf6_lsa
));
419 lsa
->header
= (struct ospf6_lsa_header
*) new_header
;
422 ospf6_lsa_printbuf (lsa
, lsa
->name
, sizeof (lsa
->name
));
424 /* calculate birth, expire and refresh of this lsa */
425 ospf6_lsa_age_set (lsa
);
427 if (IS_OSPF6_DEBUG_LSA (MEMORY
))
428 zlog_info ("Create LSA Memory: %s (%p/%p)",
429 lsa
->name
, lsa
, lsa
->header
);
435 ospf6_lsa_create_headeronly (struct ospf6_lsa_header
*header
)
437 struct ospf6_lsa
*lsa
= NULL
;
438 struct ospf6_lsa_header
*new_header
= NULL
;
440 /* allocate memory for this LSA */
441 new_header
= (struct ospf6_lsa_header
*)
442 XMALLOC (MTYPE_OSPF6_LSA
, sizeof (struct ospf6_lsa_header
));
444 /* copy LSA from original header */
445 memcpy (new_header
, header
, sizeof (struct ospf6_lsa_header
));
447 /* LSA information structure */
448 /* allocate memory */
449 lsa
= (struct ospf6_lsa
*)
450 XMALLOC (MTYPE_OSPF6_LSA
, sizeof (struct ospf6_lsa
));
451 memset (lsa
, 0, sizeof (struct ospf6_lsa
));
453 lsa
->header
= (struct ospf6_lsa_header
*) new_header
;
454 SET_FLAG (lsa
->flag
, OSPF6_LSA_HEADERONLY
);
457 ospf6_lsa_printbuf (lsa
, lsa
->name
, sizeof (lsa
->name
));
459 /* calculate birth, expire and refresh of this lsa */
460 ospf6_lsa_age_set (lsa
);
462 if (IS_OSPF6_DEBUG_LSA (MEMORY
))
463 zlog_info ("Create LSA (Header-only) Memory: %s (%p/%p)",
464 lsa
->name
, lsa
, lsa
->header
);
470 ospf6_lsa_delete (struct ospf6_lsa
*lsa
)
472 assert (lsa
->lock
== 0);
475 THREAD_OFF (lsa
->expire
);
476 THREAD_OFF (lsa
->refresh
);
478 if (IS_OSPF6_DEBUG_LSA (MEMORY
))
479 zlog_info ("Delete LSA %s Memory: %s (%p/%p)",
480 (CHECK_FLAG (lsa
->flag
, OSPF6_LSA_HEADERONLY
) ?
481 "(Header-only) " : ""), lsa
->name
, lsa
, lsa
->header
);
484 XFREE (MTYPE_OSPF6_LSA
, lsa
->header
);
485 XFREE (MTYPE_OSPF6_LSA
, lsa
);
489 ospf6_lsa_copy (struct ospf6_lsa
*lsa
)
491 struct ospf6_lsa
*copy
= NULL
;
493 if (IS_OSPF6_DEBUG_LSA (MEMORY
))
494 zlog_info ("Create LSA Copy from %s", lsa
->name
);
496 ospf6_lsa_age_current (lsa
);
497 if (CHECK_FLAG (lsa
->flag
, OSPF6_LSA_HEADERONLY
))
498 copy
= ospf6_lsa_create_headeronly (lsa
->header
);
500 copy
= ospf6_lsa_create (lsa
->header
);
501 assert (copy
->lock
== 0);
503 copy
->installed
= lsa
->installed
;
504 copy
->originated
= lsa
->originated
;
505 copy
->lsdb
= lsa
->lsdb
;
510 /* increment reference counter of struct ospf6_lsa */
512 ospf6_lsa_lock (struct ospf6_lsa
*lsa
)
518 /* decrement reference counter of struct ospf6_lsa */
520 ospf6_lsa_unlock (struct ospf6_lsa
*lsa
)
522 /* decrement reference counter */
523 assert (lsa
->lock
> 0);
529 ospf6_lsa_delete (lsa
);
533 /* ospf6 lsa expiry */
535 ospf6_lsa_expire (struct thread
*thread
)
537 struct ospf6_lsa
*lsa
;
539 lsa
= (struct ospf6_lsa
*) THREAD_ARG (thread
);
541 assert (lsa
&& lsa
->header
);
542 assert (OSPF6_LSA_IS_MAXAGE (lsa
));
543 assert (! lsa
->refresh
);
545 lsa
->expire
= (struct thread
*) NULL
;
547 if (IS_OSPF6_DEBUG_LSA (TIMER
))
549 zlog_info ("LSA Expire:");
550 ospf6_lsa_header_print (lsa
);
553 if (CHECK_FLAG (lsa
->flag
, OSPF6_LSA_HEADERONLY
))
554 return 0; /* dbexchange will do something ... */
557 ospf6_flood (NULL
, lsa
);
560 if (IS_OSPF6_DEBUG_LSA (DATABASE
))
561 zlog_info ("Reinstall MaxAge %s", lsa
->name
);
562 ospf6_lsdb_add (lsa
, lsa
->lsdb
);
564 /* schedule maxage remover */
565 ospf6_maxage_remove (ospf6
);
571 ospf6_lsa_refresh (struct thread
*thread
)
573 struct ospf6_lsa
*old
, *self
, *new;
574 struct ospf6_lsdb
*lsdb_self
;
577 old
= (struct ospf6_lsa
*) THREAD_ARG (thread
);
578 assert (old
&& old
->header
);
580 old
->refresh
= (struct thread
*) NULL
;
582 lsdb_self
= ospf6_get_scoped_lsdb_self (old
);
583 self
= ospf6_lsdb_lookup (old
->header
->type
, old
->header
->id
,
584 old
->header
->adv_router
, lsdb_self
);
587 ospf6_lsa_premature_aging (old
);
591 /* Reset age, increment LS sequence number. */
592 self
->header
->age
= htons (0);
593 self
->header
->seqnum
=
594 ospf6_new_ls_seqnum (self
->header
->type
, self
->header
->id
,
595 self
->header
->adv_router
, old
->lsdb
);
596 ospf6_lsa_checksum (self
->header
);
598 new = ospf6_lsa_create (self
->header
);
599 new->lsdb
= old
->lsdb
;
600 new->refresh
= thread_add_timer (master
, ospf6_lsa_refresh
, new,
603 /* store it in the LSDB for self-originated LSAs */
604 ospf6_lsdb_add (ospf6_lsa_copy (new), lsdb_self
);
606 if (IS_OSPF6_DEBUG_LSA (ORIGINATE
))
608 zlog_info ("LSA Refresh:");
609 ospf6_lsa_header_print (new);
612 ospf6_flood_clear (old
);
613 ospf6_flood (NULL
, new);
614 ospf6_install_lsa (new);
621 /* enhanced Fletcher checksum algorithm, RFC1008 7.2 */
623 #define LSA_CHECKSUM_OFFSET 15
626 ospf6_lsa_checksum (struct ospf6_lsa_header
*lsa_header
)
628 u_char
*sp
, *ep
, *p
, *q
;
633 lsa_header
->checksum
= 0;
634 length
= ntohs (lsa_header
->length
) - 2;
635 sp
= (char *) &lsa_header
->type
;
637 for (ep
= sp
+ length
; sp
< ep
; sp
= q
)
642 for (p
= sp
; p
< q
; p
++)
651 /* r = (c1 << 8) + c0; */
652 x
= ((length
- LSA_CHECKSUM_OFFSET
) * c0
- c1
) % 255;
659 lsa_header
->checksum
= htons ((x
<< 8) + y
);
661 return (lsa_header
->checksum
);
665 ospf6_unknown_lsa_show (struct vty
*vty
, struct ospf6_lsa
*lsa
)
667 u_char
*start
, *end
, *current
;
670 start
= (char *) lsa
->header
+ sizeof (struct ospf6_lsa_header
);
671 end
= (char *) lsa
->header
+ ntohs (lsa
->header
->length
);
673 vty_out (vty
, " Unknown contents:%s", VNL
);
674 for (current
= start
; current
< end
; current
++)
676 if ((current
- start
) % 16 == 0)
677 vty_out (vty
, "%s ", VNL
);
678 else if ((current
- start
) % 4 == 0)
681 snprintf (byte
, sizeof (byte
), "%02x", *current
);
682 vty_out (vty
, "%s", byte
);
685 vty_out (vty
, "%s%s", VNL
, VNL
);
690 ospf6_install_lsa_handler (struct ospf6_lsa_handler
*handler
)
692 /* might need to adjust dynamic array length ... */
693 int index
= OSPF6_LSTYPE_INDEX (htons (handler
->type
));
694 ospf6_lsa_handler
[index
] = handler
;
697 struct ospf6_lsa_handler unknown_handler
=
699 OSPF6_LSTYPE_UNKNOWN
,
701 ospf6_unknown_lsa_show
707 memset (ospf6_lsa_handler
, 0, sizeof (ospf6_lsa_handler
));
708 ospf6_install_lsa_handler (&unknown_handler
);
713 DEFUN (debug_ospf6_lsa_sendrecv
,
714 debug_ospf6_lsa_sendrecv_cmd
,
715 "debug ospf6 lsa (send|recv|originate|timer|database|memory|all)",
718 "Debug Link State Advertisements (LSAs)\n"
719 "Debug Sending LSAs\n"
720 "Debug Receiving LSAs\n"
721 "Debug Originating LSAs\n"
722 "Debug Timer Event of LSAs\n"
723 "Debug LSA Database\n"
724 "Debug Memory of LSAs\n"
728 unsigned char level
= 0;
732 if (! strncmp (argv
[0], "s", 1))
733 level
= OSPF6_DEBUG_LSA_SEND
;
734 else if (! strncmp (argv
[0], "r", 1))
735 level
= OSPF6_DEBUG_LSA_RECV
;
736 else if (! strncmp (argv
[0], "o", 1))
737 level
= OSPF6_DEBUG_LSA_ORIGINATE
;
738 else if (! strncmp (argv
[0], "t", 1))
739 level
= OSPF6_DEBUG_LSA_TIMER
;
740 else if (! strncmp (argv
[0], "d", 1))
741 level
= OSPF6_DEBUG_LSA_DATABASE
;
742 else if (! strncmp (argv
[0], "m", 1))
743 level
= OSPF6_DEBUG_LSA_MEMORY
;
744 else if (! strncmp (argv
[0], "a", 1))
746 level
= OSPF6_DEBUG_LSA_SEND
| OSPF6_DEBUG_LSA_RECV
|
747 OSPF6_DEBUG_LSA_ORIGINATE
| OSPF6_DEBUG_LSA_TIMER
|
748 OSPF6_DEBUG_LSA_DATABASE
| OSPF6_DEBUG_LSA_MEMORY
;
753 level
= OSPF6_DEBUG_LSA_SEND
| OSPF6_DEBUG_LSA_RECV
|
754 OSPF6_DEBUG_LSA_ORIGINATE
| OSPF6_DEBUG_LSA_TIMER
;
757 OSPF6_DEBUG_LSA_ON (level
);
761 ALIAS (debug_ospf6_lsa_sendrecv
,
767 "Debug Link State Advertisements (LSAs)\n"
770 DEFUN (no_debug_ospf6_lsa_sendrecv
,
771 no_debug_ospf6_lsa_sendrecv_cmd
,
772 "no debug ospf6 lsa (send|recv|originate|timer|database|memory|all)",
776 "Debug Link State Advertisements (LSAs)\n"
777 "Debug Sending LSAs\n"
778 "Debug Receiving LSAs\n"
779 "Debug Originating LSAs\n"
780 "Debug Timer Event of LSAs\n"
781 "Debug LSA Database\n"
782 "Debug Memory of LSAs\n"
786 unsigned char level
= 0;
790 if (! strncmp (argv
[0], "s", 1))
791 level
= OSPF6_DEBUG_LSA_SEND
;
792 else if (! strncmp (argv
[0], "r", 1))
793 level
= OSPF6_DEBUG_LSA_RECV
;
794 else if (! strncmp (argv
[0], "o", 1))
795 level
= OSPF6_DEBUG_LSA_ORIGINATE
;
796 else if (! strncmp (argv
[0], "t", 1))
797 level
= OSPF6_DEBUG_LSA_TIMER
;
798 else if (! strncmp (argv
[0], "d", 1))
799 level
= OSPF6_DEBUG_LSA_DATABASE
;
800 else if (! strncmp (argv
[0], "m", 1))
801 level
= OSPF6_DEBUG_LSA_MEMORY
;
802 else if (! strncmp (argv
[0], "a", 1))
804 level
= OSPF6_DEBUG_LSA_SEND
| OSPF6_DEBUG_LSA_RECV
|
805 OSPF6_DEBUG_LSA_ORIGINATE
| OSPF6_DEBUG_LSA_TIMER
|
806 OSPF6_DEBUG_LSA_DATABASE
| OSPF6_DEBUG_LSA_MEMORY
;
811 level
= OSPF6_DEBUG_LSA_SEND
| OSPF6_DEBUG_LSA_RECV
|
812 OSPF6_DEBUG_LSA_ORIGINATE
| OSPF6_DEBUG_LSA_TIMER
;
815 OSPF6_DEBUG_LSA_OFF (level
);
819 ALIAS (no_debug_ospf6_lsa_sendrecv
,
820 no_debug_ospf6_lsa_cmd
,
821 "no debug ospf6 lsa",
825 "Debug Link State Advertisements (LSAs)\n"
829 config_write_ospf6_debug_lsa (struct vty
*vty
)
831 if (conf_debug_ospf6_lsa
== OSPF6_DEBUG_LSA_ALL
)
832 vty_out (vty
, "debug ospf6 lsa all%s", VNL
);
835 if (conf_debug_ospf6_lsa
== OSPF6_DEBUG_LSA_DEFAULT
)
836 vty_out (vty
, "debug ospf6 lsa%s", VNL
);
839 if (IS_OSPF6_DEBUG_LSA (SEND
))
840 vty_out (vty
, "debug ospf6 lsa send%s", VNL
);
841 if (IS_OSPF6_DEBUG_LSA (RECV
))
842 vty_out (vty
, "debug ospf6 lsa recv%s", VNL
);
843 if (IS_OSPF6_DEBUG_LSA (ORIGINATE
))
844 vty_out (vty
, "debug ospf6 lsa originate%s", VNL
);
845 if (IS_OSPF6_DEBUG_LSA (TIMER
))
846 vty_out (vty
, "debug ospf6 lsa timer%s", VNL
);
849 if (IS_OSPF6_DEBUG_LSA (DATABASE
))
850 vty_out (vty
, "debug ospf6 lsa database%s", VNL
);
851 if (IS_OSPF6_DEBUG_LSA (MEMORY
))
852 vty_out (vty
, "debug ospf6 lsa memory%s", VNL
);
859 install_element_ospf6_debug_lsa ()
861 install_element (ENABLE_NODE
, &debug_ospf6_lsa_cmd
);
862 install_element (ENABLE_NODE
, &debug_ospf6_lsa_sendrecv_cmd
);
863 install_element (ENABLE_NODE
, &no_debug_ospf6_lsa_cmd
);
864 install_element (ENABLE_NODE
, &no_debug_ospf6_lsa_sendrecv_cmd
);
865 install_element (CONFIG_NODE
, &debug_ospf6_lsa_cmd
);
866 install_element (CONFIG_NODE
, &debug_ospf6_lsa_sendrecv_cmd
);
867 install_element (CONFIG_NODE
, &no_debug_ospf6_lsa_cmd
);
868 install_element (CONFIG_NODE
, &no_debug_ospf6_lsa_sendrecv_cmd
);