ospfd: For an ABR, ensure the right LSID is MaxAge'd

PROBLEM:

Accurate garbage collection of maxage LSAs. The global OSPF structure has
a maxage_lsa tree - the key to the tree is <ls-id, adv-router> tuple. Suppose
the ABR has multiple areas and has originated some intra-area LSAs. The
key for all those LSAs is the same. The code then ends up in a state where
all but the first LSA do not get cleaned up from the areas' LSDB. A subsequent
event would readvertise those LSAs.

PATCH:

Since the LSA is going to stick around till it actually gets cleaned up by
the maxage_walker, make the LSA pointer as the key. Each distinct LSA that
gets maxage'd then gets added to the tree and will get cleaned up correctly.

Signed-off-by: Pradosh Mohapatra <pmohapat@cumulusnetworks.com>
[CF: Use CHAR_BIT; use uintptr_t; use sizeof(field) instead of sizeof(type)]
Signed-off-by: Christian Franke <chris@opensourcerouting.org>
[DL: this must remain a temporary fix! needs to be redone after 0.99.23]
Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
diff --git a/lib/prefix.h b/lib/prefix.h
index 9ef70ff..45889e0 100644
--- a/lib/prefix.h
+++ b/lib/prefix.h
@@ -52,6 +52,7 @@
       struct in_addr adv_router;
     } lp;
     u_char val[8];
+    uintptr_t ptr;
   } u __attribute__ ((aligned (8)));
 };
 
@@ -89,6 +90,14 @@
   u_char val[8] __attribute__ ((aligned (8)));
 };
 
+/* Prefix for a generic pointer */
+struct prefix_ptr
+{
+  u_char family;
+  u_char prefixlen;
+  uintptr_t prefix __attribute__ ((aligned (8)));
+};
+
 /* helper to get type safety/avoid casts on calls
  * (w/o this, functions accepting all prefix types need casts on the caller
  * side, which strips type safety since the cast will accept any pointer