]> git.puffer.fish Git - matthieu/frr.git/commitdiff
2003-10-15 Paul Jakma <paul@dishone.st>
authorpaul <paul>
Wed, 15 Oct 2003 21:14:20 +0000 (21:14 +0000)
committerpaul <paul>
Wed, 15 Oct 2003 21:14:20 +0000 (21:14 +0000)
        * ospfd/ospf_interface: (ospf_if_lookup_table) new function to
          lookup oi for a given prefix in a given interfaces table of oi's.
          (ospf_if_new) use ospf_if_lookup_table to deal with zebra
          reporting new interface multiple times.
          NB: This patch is a complete plaster-band of a hack. First, why is
          zebra reporting interface events multiple times? Second, why does
          ospfd maintain so many damn lists and tables relating to oi's -
          these should be reconciled into one or two tables.

ospfd/ospf_interface.c

index 067d551debf00f7322cb829f84fab0f6d6cd04e9..4be81995d4c11189290a513e87d688bd45e1c5cd 100644 (file)
@@ -125,6 +125,21 @@ ospf_if_reset_variables (struct ospf_interface *oi)
   oi->v_ls_ack = 1;  
 }
 
+/* lookup oi for specified prefix/ifp */
+struct ospf_interface *
+ospf_if_table_lookup (struct interface *ifp, struct prefix *prefix)
+{
+  struct prefix p;
+  struct route_node rn;
+  
+  p = *prefix;
+
+  rn = route_node_get (IF_OIFS (ifp), &p));
+  /* route_node_get implicitely locks */
+  route_node_unlock (rn);
+  return (struct ospf_interface *) rn->info;
+}
+
 void
 ospf_add_to_if (struct interface *ifp, struct ospf_interface *oi)
 {
@@ -138,7 +153,7 @@ ospf_add_to_if (struct interface *ifp, struct ospf_interface *oi)
   /* rn->info should either be NULL or equal to this oi
    * as route_node_get may return an existing node
    */
-  assert (! rn->info || rn->info == oi);
+  assert (!rn->info || rn->info == oi);
   rn->info = oi;
 }
 
@@ -164,9 +179,14 @@ ospf_if_new (struct ospf *ospf, struct interface *ifp, struct prefix *p)
 {
   struct ospf_interface *oi;
 
-  oi = XCALLOC (MTYPE_OSPF_IF, sizeof (struct ospf_interface));
-  memset (oi, 0, sizeof (struct ospf_interface));
-
+  if ((oi = ospf_if_table_lookup (ifp, p)) == NULL)
+    {
+      oi = XCALLOC (MTYPE_OSPF_IF, sizeof (struct ospf_interface));
+      memset (oi, 0, sizeof (struct ospf_interface));
+    }
+  else
+    return oi;
+    
   /* Set zebra interface pointer. */
   oi->ifp = ifp;
   oi->address = p;