[ospfd] Minor enhancements to recent self-host-routes suppression patch

	* ospf_spf.c: (ospf_spf_process_stubs) Track whether
	  parent router vertex is the root, so that the host-route
	  suppression logic need only be activated for such vertices.
	  Move the actual logic to ospf_intra_add_stub.
	* ospf_route.c: (ospf_intra_add_stub) Main test of link moved
	  here, notionally more appropriate.
diff --git a/ospfd/ospf_spf.c b/ospfd/ospf_spf.c
index 15d27be..82f0fed 100644
--- a/ospfd/ospf_spf.c
+++ b/ospfd/ospf_spf.c
@@ -946,7 +946,8 @@
 /* Second stage of SPF calculation. */
 static void
 ospf_spf_process_stubs (struct ospf_area *area, struct vertex *v,
-                        struct route_table *rt)
+                        struct route_table *rt,
+                        int parent_is_root)
 {
   struct listnode *cnode, *cnnode;
   struct vertex *child;
@@ -981,21 +982,7 @@
                 (l->m[0].tos_count * ROUTER_LSA_TOS_SIZE));
 
           if (l->m[0].type == LSA_LINK_TYPE_STUB)
-	    {
-	      /* PtP links with /32 masks adds host routes to the remote host,
-		 see RFC 2328, 12.4.1.1, Option 1.
-		 Make sure that such routes are ignored */
-	      /* XXX: Change to breadth-first and avoid the lookup */
-	      if (l->link_data.s_addr == 0xffffffff &&
-		  ospf_if_lookup_by_local_addr (area->ospf, NULL, l->link_id))
-		{
-		  if (IS_DEBUG_OSPF_EVENT)
-		    zlog_debug ("ospf_spf_process_stubs(): ignoring host route "
-				"%s/32 to self.", inet_ntoa (l->link_id));
-		  continue;
-		}
-	      ospf_intra_add_stub (rt, l, v, area);
-	    }
+            ospf_intra_add_stub (rt, l, v, area, parent_is_root);
         }
     }
 
@@ -1005,8 +992,17 @@
     {
       if (CHECK_FLAG (child->flags, OSPF_VERTEX_PROCESSED))
         continue;
-
-      ospf_spf_process_stubs (area, child, rt);
+      
+      /* the first level of routers connected to the root
+       * should have 'parent_is_root' set, including those 
+       * connected via a network vertex.
+       */
+      if (area->spf == v)
+        parent_is_root = 1;
+      else if (v->type == OSPF_VERTEX_ROUTER)
+        parent_is_root = 0;
+        
+      ospf_spf_process_stubs (area, child, rt, parent_is_root);
 
       SET_FLAG (child->flags, OSPF_VERTEX_PROCESSED);
     }
@@ -1193,7 +1189,7 @@
     }
 
   /* Second stage of SPF calculation procedure's  */
-  ospf_spf_process_stubs (area, area->spf, new_table);
+  ospf_spf_process_stubs (area, area->spf, new_table, 0);
 
   /* Free candidate queue. */
   pqueue_delete (candidate);