Ospf6d merge from Zebra repository with added privs stuff and merged
zclient changes.
diff --git a/ospf6d/ospf6_lsdb.h b/ospf6d/ospf6_lsdb.h
index 50eedc8..94dfcb6 100644
--- a/ospf6d/ospf6_lsdb.h
+++ b/ospf6d/ospf6_lsdb.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2002 Yasuhiro Ohara
+ * Copyright (C) 2003 Yasuhiro Ohara
  *
  * This file is part of GNU Zebra.
  *
@@ -25,64 +25,146 @@
 #include "prefix.h"
 #include "table.h"
 
-#include "ospf6_prefix.h"
-#include "ospf6_lsa.h"
-
-struct ospf6_lsdb_node
-{
-  struct prefix_ipv6 key;
-
-  struct route_node *node;
-  struct route_node *next;
-
-  struct ospf6_lsa *lsa;
-};
-
 struct ospf6_lsdb
 {
   struct route_table *table;
   u_int32_t count;
-  void (*hook) (struct ospf6_lsa *);
+  void (*hook_add) (struct ospf6_lsa *);
+  void (*hook_remove) (struct ospf6_lsa *);
 };
 
-/* int  ospf6_lsdb_is_end (struct ospf6_lsdb_node *lsdb_node); */
-#define ospf6_lsdb_is_end(lsdb_node) ((lsdb_node)->node == NULL ? 1 : 0)
+#define LSDB_FOREACH_LSA(vty, func, lsdb)                             \
+  do {                                                                \
+    struct ospf6_lsa *lsa;                                            \
+    for (lsa = ospf6_lsdb_head (lsdb); lsa;                           \
+         lsa = ospf6_lsdb_next (lsa))                                 \
+      {                                                               \
+        (*(func)) (vty, lsa);                                         \
+      }                                                               \
+  } while (0)
+#define LSDB_FOREACH_LSA_T(vty, func, lsdb, type)                     \
+  do {                                                                \
+    struct ospf6_lsa *lsa;                                            \
+    for (lsa = ospf6_lsdb_type_head (type, lsdb); lsa;                \
+         lsa = ospf6_lsdb_type_next (type, lsa))                      \
+      {                                                               \
+        (*(func)) (vty, lsa);                                         \
+      }                                                               \
+  } while (0)
+#define LSDB_FOREACH_LSA_I(vty, func, lsdb, id)                       \
+  do {                                                                \
+    struct ospf6_lsa *lsa;                                            \
+    for (lsa = ospf6_lsdb_head (lsdb); lsa;                           \
+         lsa = ospf6_lsdb_next (lsa))                                 \
+      {                                                               \
+        if (lsa->header->id != id)                                    \
+          continue;                                                   \
+        (*(func)) (vty, lsa);                                         \
+      }                                                               \
+  } while (0)
+#define LSDB_FOREACH_LSA_R(vty, func, lsdb, router)                   \
+  do {                                                                \
+    struct ospf6_lsa *lsa;                                            \
+    for (lsa = ospf6_lsdb_head (lsdb); lsa;                           \
+         lsa = ospf6_lsdb_next (lsa))                                 \
+      {                                                               \
+        if (lsa->header->adv_router != router)                        \
+          continue;                                                   \
+        (*(func)) (vty, lsa);                                         \
+      }                                                               \
+  } while (0)
+#define LSDB_FOREACH_LSA_TI(vty, func, lsdb, type, id)                \
+  do {                                                                \
+    struct ospf6_lsa *lsa;                                            \
+    for (lsa = ospf6_lsdb_type_head (type, lsdb); lsa;                \
+         lsa = ospf6_lsdb_type_next (type, lsa))                      \
+      {                                                               \
+        if (lsa->header->id != id)                                    \
+          continue;                                                   \
+        (*(func)) (vty, lsa);                                         \
+      }                                                               \
+  } while (0)
+#define LSDB_FOREACH_LSA_TR(vty, func, lsdb, type, router)            \
+  do {                                                                \
+    struct ospf6_lsa *lsa;                                            \
+    for (lsa = ospf6_lsdb_type_router_head (type, router, lsdb); lsa; \
+         lsa = ospf6_lsdb_type_router_next (type, router, lsa))       \
+      {                                                               \
+        (*(func)) (vty, lsa);                                         \
+      }                                                               \
+  } while (0)
+#define LSDB_FOREACH_LSA_IR(vty, func, lsdb, id, router)              \
+  do {                                                                \
+    struct ospf6_lsa *lsa;                                            \
+    for (lsa = ospf6_lsdb_head (lsdb); lsa;                           \
+         lsa = ospf6_lsdb_next (lsa))                                 \
+      {                                                               \
+        if (lsa->header->adv_router != router)                        \
+          continue;                                                   \
+        if (lsa->header->id != id)                                    \
+          continue;                                                   \
+        (*(func)) (vty, lsa);                                         \
+      }                                                               \
+  } while (0)
+#define LSDB_FOREACH_LSA_TIR(vty, func, lsdb, type, id, router)       \
+  do {                                                                \
+    struct ospf6_lsa *lsa;                                            \
+    lsa = ospf6_lsdb_lookup (type, id, router, lsdb);                 \
+    if (lsa)                                                          \
+      (*(func)) (vty, lsa);                                           \
+  } while (0)
 
-/* global holding hooks for each LS type */
-struct ospf6_lsdb_hook_t
-{
-  void (*hook) (struct ospf6_lsa *old, struct ospf6_lsa *new);
-};
-extern struct ospf6_lsdb_hook_t *ospf6_lsdb_hook;
+#define OSPF6_LSDB_MAXAGE_REMOVER(lsdb)                                  \
+  do {                                                                   \
+    struct ospf6_lsa *lsa;                                               \
+    for (lsa = ospf6_lsdb_head (lsdb); lsa; lsa = ospf6_lsdb_next (lsa)) \
+      {                                                                  \
+        if (! OSPF6_LSA_IS_MAXAGE (lsa))                                 \
+          continue;                                                      \
+        if (lsa->refcnt != 0)                                            \
+          continue;                                                      \
+        if (IS_OSPF6_DEBUG_LSA (TIMER))                                  \
+          zlog_info (" remove maxage %s", lsa->name);                    \
+        ospf6_lsdb_remove (lsa, lsdb);                                   \
+      }                                                                  \
+  } while (0)
 
 /* Function Prototypes */
-struct ospf6_lsdb * ospf6_lsdb_create ();
+struct ospf6_lsdb *ospf6_lsdb_create ();
 void ospf6_lsdb_delete (struct ospf6_lsdb *lsdb);
 
-void ospf6_lsdb_remove_maxage (struct ospf6_lsdb *lsdb);
-
-struct ospf6_lsa *
-ospf6_lsdb_lookup (u_int16_t type, u_int32_t id, u_int32_t adv_router,
-                   void *scope);
-
-void ospf6_lsdb_install (struct ospf6_lsa *new);
-
-void ospf6_lsdb_head (struct ospf6_lsdb_node *node, struct ospf6_lsdb *lsdb);
-void ospf6_lsdb_type (struct ospf6_lsdb_node *node, u_int16_t type,
-                      struct ospf6_lsdb *lsdb);
-void ospf6_lsdb_type_router (struct ospf6_lsdb_node *node, u_int16_t type,
-                             u_int32_t adv_router, struct ospf6_lsdb *lsdb);
-void ospf6_lsdb_next (struct ospf6_lsdb_node *node);
+struct ospf6_lsa *ospf6_lsdb_lookup (u_int16_t type, u_int32_t id,
+                                     u_int32_t adv_router,
+                                     struct ospf6_lsdb *lsdb);
 
 void ospf6_lsdb_add (struct ospf6_lsa *lsa, struct ospf6_lsdb *lsdb);
 void ospf6_lsdb_remove (struct ospf6_lsa *lsa, struct ospf6_lsdb *lsdb);
+
+struct ospf6_lsa *ospf6_lsdb_head (struct ospf6_lsdb *lsdb);
+struct ospf6_lsa *ospf6_lsdb_next (struct ospf6_lsa *lsa);
+
+struct ospf6_lsa *ospf6_lsdb_type_router_head (u_int16_t type,
+                                               u_int32_t adv_router,
+                                               struct ospf6_lsdb *lsdb);
+struct ospf6_lsa *ospf6_lsdb_type_router_next (u_int16_t type,
+                                               u_int32_t adv_router,
+                                               struct ospf6_lsa *lsa);
+
+struct ospf6_lsa *ospf6_lsdb_type_head (u_int16_t type,
+                                        struct ospf6_lsdb *lsdb);
+struct ospf6_lsa *ospf6_lsdb_type_next (u_int16_t type,
+                                        struct ospf6_lsa *lsa);
+
 void ospf6_lsdb_remove_all (struct ospf6_lsdb *lsdb);
 
-struct ospf6_lsa *
-ospf6_lsdb_lookup_lsdb (u_int16_t type, u_int32_t id, u_int32_t adv_router,
-                        struct ospf6_lsdb *lsdb);
+int ospf6_lsdb_show (struct vty *vty, int argc, char **argv,
+                     struct ospf6_lsdb *lsdb);
 
+#if 0
 void ospf6_lsdb_init ();
+void ospf6_lsdb_remove_maxage (struct ospf6_lsdb *lsdb);
+#endif
 
 #endif /* OSPF6_LSDB_H */
 
+