Ospf6d merge from Zebra repository with added privs stuff and merged
zclient changes.
diff --git a/ospf6d/ospf6_route.h b/ospf6d/ospf6_route.h
index 71b2562..834774c 100644
--- a/ospf6d/ospf6_route.h
+++ b/ospf6d/ospf6_route.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1999 Yasuhiro Ohara
+ * Copyright (C) 2003 Yasuhiro Ohara
  *
  * This file is part of GNU Zebra.
  *
@@ -22,40 +22,49 @@
 #ifndef OSPF6_ROUTE_H
 #define OSPF6_ROUTE_H
 
-#include "ospf6_hook.h"
-#include "ospf6_linklist.h"
+#define OSPF6_MULTI_PATH_LIMIT    4
 
-struct ospf6_route_table
+/* Debug option */
+extern unsigned char conf_debug_ospf6_route;
+#define OSPF6_DEBUG_ROUTE_TABLE   0x01
+#define OSPF6_DEBUG_ROUTE_INTRA   0x02
+#define OSPF6_DEBUG_ROUTE_INTER   0x04
+#define OSPF6_DEBUG_ROUTE_ON(level) \
+  (conf_debug_ospf6_route |= (level))
+#define OSPF6_DEBUG_ROUTE_OFF(level) \
+  (conf_debug_ospf6_route &= ~(level))
+#define IS_OSPF6_DEBUG_ROUTE(e) \
+  (conf_debug_ospf6_route & OSPF6_DEBUG_ROUTE_ ## e)
+
+/* Nexthop */
+struct ospf6_nexthop
 {
-  char name[128];
+  /* Interface index */
+  unsigned int ifindex;
 
-  int freeze;
-
-  /* radix tree */
-  struct route_table *table;
-
-  /* list of hooks */
-  struct linklist *hook_list[3];
-  void (*hook_add) (void *);
-  void (*hook_change) (void *);
-  void (*hook_remove) (void *);
-
-  u_int32_t route_id;
+  /* IP address, if any */
+  struct in6_addr address;
 };
 
-
-
-struct ospf6_route
-{
-  /* Destination ID */
-  struct prefix prefix;
-
-  /* Destination Type */
-  u_char type;
-};
+#define ospf6_nexthop_is_set(x)                                \
+  ((x)->ifindex || ! IN6_IS_ADDR_UNSPECIFIED (&(x)->address))
+#define ospf6_nexthop_is_same(a,b)                             \
+  ((a)->ifindex == (b)->ifindex &&                            \
+   IN6_ARE_ADDR_EQUAL (&(a)->address, &(b)->address))
+#define ospf6_nexthop_clear(x)                                \
+  do {                                                        \
+    (x)->ifindex = 0;                                         \
+    memset (&(x)->address, 0, sizeof (struct in6_addr));      \
+  } while (0)
+#define ospf6_nexthop_copy(a, b)                              \
+  do {                                                        \
+    (a)->ifindex = (b)->ifindex;                              \
+    memcpy (&(a)->address, &(b)->address,                     \
+            sizeof (struct in6_addr));                        \
+  } while (0)
 
 /* Path */
-struct ls_origin
+struct ospf6_ls_origin
 {
   u_int16_t type;
   u_int32_t id;
@@ -65,13 +74,13 @@
 struct ospf6_path
 {
   /* Link State Origin */
-  struct ls_origin origin;
+  struct ospf6_ls_origin origin;
 
   /* Router bits */
   u_char router_bits;
 
   /* Optional Capabilities */
-  u_char capability[3];
+  u_char options[3];
 
   /* Prefix Options */
   u_char prefix_options;
@@ -88,122 +97,165 @@
   u_int32_t cost_e2;
 };
 
-/* Nexthop */
-struct ospf6_nexthop
+#define OSPF6_PATH_TYPE_NONE       0
+#define OSPF6_PATH_TYPE_INTRA      1
+#define OSPF6_PATH_TYPE_INTER      2
+#define OSPF6_PATH_TYPE_EXTERNAL1  3
+#define OSPF6_PATH_TYPE_EXTERNAL2  4
+#define OSPF6_PATH_TYPE_MAX        5
+
+#include "prefix.h"
+#include "table.h"
+
+struct ospf6_route
 {
-  /* Interface index */
-  unsigned int ifindex;
+  struct route_node *rnode;
 
-  /* IP address, if any */
-  struct in6_addr address;
-};
+  struct ospf6_route *prev;
+  struct ospf6_route *next;
 
-struct ospf6_route_node
-{
-  struct ospf6_route_table *table;
-  int count;
-  u_int32_t route_id;
+  unsigned int lock;
 
-  struct route_node  *route_node;
-  struct ospf6_route  route;
-  struct linklist    *path_list;
-};
+  /* Destination Type */
+  u_char type;
 
-struct ospf6_path_node
-{
-  struct ospf6_route_node *route_node;
-  struct ospf6_path        path;
-  struct linklist         *nexthop_list;
-};
+  /* Destination ID */
+  struct prefix prefix;
 
-struct ospf6_nexthop_node
-{
-  int            flag;
+  /* Time */
   struct timeval installed;
+  struct timeval changed;
 
-  struct ospf6_path_node *path_node;
-  struct ospf6_nexthop    nexthop;
-};
+  /* flag */
+  u_char flag;
 
-struct ospf6_route_req
-{
-  struct ospf6_route_table *table;
-  struct route_node    *route_node;
-  struct linklist_node  path_lnode;
-  struct linklist_node  nexthop_lnode;
-  u_int32_t route_id;
+  /* path */
+  struct ospf6_path path;
 
-  int count;
-  struct ospf6_route   route;
-  struct ospf6_path    path;
-  struct ospf6_nexthop nexthop;
+  /* nexthop */
+  struct ospf6_nexthop nexthop[OSPF6_MULTI_PATH_LIMIT];
+
+  /* route option */
+  void *route_option;
 };
 
 #define OSPF6_DEST_TYPE_NONE       0
 #define OSPF6_DEST_TYPE_ROUTER     1
 #define OSPF6_DEST_TYPE_NETWORK    2
 #define OSPF6_DEST_TYPE_DISCARD    3
-#define OSPF6_DEST_TYPE_MAX        4
+#define OSPF6_DEST_TYPE_LINKSTATE  4
+#define OSPF6_DEST_TYPE_MAX        5
 
-#define OSPF6_PATH_TYPE_NONE       0
-#define OSPF6_PATH_TYPE_INTRA      1
-#define OSPF6_PATH_TYPE_INTER      2
-#define OSPF6_PATH_TYPE_EXTERNAL1  3
-#define OSPF6_PATH_TYPE_EXTERNAL2  4
-#define OSPF6_PATH_TYPE_ZOFFSET    5
-#define OSPF6_PATH_TYPE_ZSYSTEM  (OSPF6_PATH_TYPE_ZOFFSET + ZEBRA_ROUTE_SYSTEM)
-#define OSPF6_PATH_TYPE_ZKERNEL  (OSPF6_PATH_TYPE_ZOFFSET + ZEBRA_ROUTE_KERNEL)
-#define OSPF6_PATH_TYPE_ZCONNECT (OSPF6_PATH_TYPE_ZOFFSET + ZEBRA_ROUTE_CONNECT)
-#define OSPF6_PATH_TYPE_ZSTATIC  (OSPF6_PATH_TYPE_ZOFFSET + ZEBRA_ROUTE_STATIC)
-#define OSPF6_PATH_TYPE_ZRIP     (OSPF6_PATH_TYPE_ZOFFSET + ZEBRA_ROUTE_RIP)
-#define OSPF6_PATH_TYPE_ZRIPNG   (OSPF6_PATH_TYPE_ZOFFSET + ZEBRA_ROUTE_RIPNG)
-#define OSPF6_PATH_TYPE_ZOSPF    (OSPF6_PATH_TYPE_ZOFFSET + ZEBRA_ROUTE_OSPF)
-#define OSPF6_PATH_TYPE_ZOSPF6   (OSPF6_PATH_TYPE_ZOFFSET + ZEBRA_ROUTE_OSPF6)
-#define OSPF6_PATH_TYPE_ZBGP     (OSPF6_PATH_TYPE_ZOFFSET + ZEBRA_ROUTE_BGP)
-#define OSPF6_PATH_TYPE_MAX      (OSPF6_PATH_TYPE_ZOFFSET + ZEBRA_ROUTE_MAX)
+#define OSPF6_ROUTE_CHANGE      0x01
+#define OSPF6_ROUTE_ADD         0x02
+#define OSPF6_ROUTE_REMOVE      0x04
+#define OSPF6_ROUTE_BEST        0x08
 
-#define OSPF6_ROUTE_FLAG_ROUTE_CHANGE      0x01
-#define OSPF6_ROUTE_FLAG_PATH_CHANGE       0x02
-#define OSPF6_ROUTE_FLAG_ADD               0x04
-#define OSPF6_ROUTE_FLAG_REMOVE            0x08
-#define OSPF6_ROUTE_FLAG_CHANGE            0x10
+struct ospf6_route_table
+{
+  /* patricia tree */
+  struct route_table *table;
 
-int ospf6_route_lookup (struct ospf6_route_req *request,
-                        struct prefix *prefix,
-                        struct ospf6_route_table *table);
-void ospf6_route_head  (struct ospf6_route_req *request,
-                        struct ospf6_route_table *table);
-int  ospf6_route_end   (struct ospf6_route_req *request);
-void ospf6_route_next  (struct ospf6_route_req *request);
+  u_int32_t count;
 
-void ospf6_route_add (struct ospf6_route_req *, struct ospf6_route_table *);
-void ospf6_route_remove (struct ospf6_route_req *, struct ospf6_route_table *);
+  /* hooks */
+  void (*hook_add) (struct ospf6_route *);
+  void (*hook_change) (struct ospf6_route *);
+  void (*hook_remove) (struct ospf6_route *);
+};
+
+extern char *ospf6_dest_type_str[OSPF6_DEST_TYPE_MAX];
+extern char *ospf6_dest_type_substr[OSPF6_DEST_TYPE_MAX];
+#define OSPF6_DEST_TYPE_NAME(x)                       \
+  (0 < (x) && (x) < OSPF6_DEST_TYPE_MAX ?             \
+   ospf6_dest_type_str[(x)] : ospf6_dest_type_str[0])
+#define OSPF6_DEST_TYPE_SUBSTR(x)                           \
+  (0 < (x) && (x) < OSPF6_DEST_TYPE_MAX ?                   \
+   ospf6_dest_type_substr[(x)] : ospf6_dest_type_substr[0])
+
+extern char *ospf6_path_type_str[OSPF6_PATH_TYPE_MAX];
+extern char *ospf6_path_type_substr[OSPF6_PATH_TYPE_MAX];
+#define OSPF6_PATH_TYPE_NAME(x)                       \
+  (0 < (x) && (x) < OSPF6_PATH_TYPE_MAX ?             \
+   ospf6_path_type_str[(x)] : ospf6_path_type_str[0])
+#define OSPF6_PATH_TYPE_SUBSTR(x)                           \
+  (0 < (x) && (x) < OSPF6_PATH_TYPE_MAX ?                   \
+   ospf6_path_type_substr[(x)] : ospf6_path_type_substr[0])
+
+#define OSPF6_ROUTE_ADDRESS_STR "Display the route bestmatches the address\n"
+#define OSPF6_ROUTE_PREFIX_STR  "Display the route\n"
+#define OSPF6_ROUTE_MATCH_STR   "Display the route matches the prefix\n"
+
+#define ospf6_route_is_prefix(p, r) \
+  (memcmp (p, &(r)->prefix, sizeof (struct prefix)) == 0)
+#define ospf6_route_is_same(ra, rb) \
+  (prefix_same (&(ra)->prefix, &(rb)->prefix))
+#define ospf6_route_is_same_origin(ra, rb) \
+  ((ra)->path.area_id == (rb)->path.area_id && \
+   memcmp (&(ra)->path.origin, &(rb)->path.origin, \
+           sizeof (struct ospf6_ls_origin)) == 0)
+#define ospf6_route_is_identical(ra, rb) \
+  ((ra)->type == (rb)->type && \
+   memcmp (&(ra)->prefix, &(rb)->prefix, sizeof (struct prefix)) == 0 && \
+   memcmp (&(ra)->path, &(rb)->path, sizeof (struct ospf6_path)) == 0 && \
+   memcmp (&(ra)->nexthop, &(rb)->nexthop,                               \
+           sizeof (struct ospf6_nexthop) * OSPF6_MULTI_PATH_LIMIT) == 0)
+#define ospf6_route_is_best(r) (CHECK_FLAG ((r)->flag, OSPF6_ROUTE_BEST))
+
+#define ospf6_linkstate_prefix_adv_router(x) \
+  (*(u_int32_t *)(&(x)->u.prefix6.s6_addr[0]))
+#define ospf6_linkstate_prefix_id(x) \
+  (*(u_int32_t *)(&(x)->u.prefix6.s6_addr[4]))
+
+/* Function prototype */
+void ospf6_linkstate_prefix (u_int32_t adv_router, u_int32_t id,
+                             struct prefix *prefix);
+void ospf6_linkstate_prefix2str (struct prefix *prefix, char *buf, int size);
+
+struct ospf6_route *ospf6_route_create ();
+void ospf6_route_delete (struct ospf6_route *);
+struct ospf6_route *ospf6_route_copy (struct ospf6_route *route);
+
+void ospf6_route_lock (struct ospf6_route *route);
+void ospf6_route_unlock (struct ospf6_route *route);
+
+struct ospf6_route *
+ospf6_route_lookup (struct prefix *prefix,
+                    struct ospf6_route_table *table);
+struct ospf6_route *
+ospf6_route_lookup_identical (struct ospf6_route *route,
+                              struct ospf6_route_table *table);
+struct ospf6_route *
+ospf6_route_lookup_bestmatch (struct prefix *prefix,
+                              struct ospf6_route_table *table);
+
+struct ospf6_route *
+ospf6_route_add (struct ospf6_route *route, struct ospf6_route_table *table);
+void
+ospf6_route_remove (struct ospf6_route *route, struct ospf6_route_table *table);
+
+struct ospf6_route *ospf6_route_head (struct ospf6_route_table *table);
+struct ospf6_route *ospf6_route_next (struct ospf6_route *route);
+struct ospf6_route *ospf6_route_best_next (struct ospf6_route *route);
+
+struct ospf6_route *ospf6_route_match_head (struct prefix *prefix,
+                                            struct ospf6_route_table *table);
+struct ospf6_route *ospf6_route_match_next (struct prefix *prefix,
+                                            struct ospf6_route *route);
+
 void ospf6_route_remove_all (struct ospf6_route_table *);
-
 struct ospf6_route_table *ospf6_route_table_create ();
 void ospf6_route_table_delete (struct ospf6_route_table *);
-
-void ospf6_route_table_freeze (struct ospf6_route_table *);
-void ospf6_route_table_thaw (struct ospf6_route_table *);
-
-void ospf6_route_log_request (char *what, char *where,
-                              struct ospf6_route_req *request);
-
-void
-ospf6_route_hook_register (void (*add)    (struct ospf6_route_req *),
-                           void (*change) (struct ospf6_route_req *),
-                           void (*remove) (struct ospf6_route_req *),
-                           struct ospf6_route_table *table);
-void
-ospf6_route_hook_unregister (void (*add)    (struct ospf6_route_req *),
-                             void (*change) (struct ospf6_route_req *),
-                             void (*remove) (struct ospf6_route_req *),
-                             struct ospf6_route_table *table);
-
-void ospf6_route_init ();
+void ospf6_route_dump (struct ospf6_route_table *table);
 
 int ospf6_route_table_show (struct vty *, int, char **,
                             struct ospf6_route_table *);
+int ospf6_lsentry_table_show (struct vty *, int, char **,
+                              struct ospf6_route_table *);
+
+int config_write_ospf6_debug_route (struct vty *vty);
+void install_element_ospf6_debug_route ();
+void ospf6_route_init ();
 
 #endif /* OSPF6_ROUTE_H */