2003-10-15 Paul Jakma <paul@dishone.st>

* 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.
This commit is contained in:
paul 2003-10-15 21:14:20 +00:00
parent cccf8af896
commit 20916fba5c

View 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;