Commit 9e7d3a78 authored by Ondrej Zajicek (work)'s avatar Ondrej Zajicek (work)
Browse files

OSPF: Fix net-summary origination combined with stubnet option

Stubnet nodes in OSPF FIB were removed during rt_sync(), but the pointer
remained in top_hash_entry.nf, so net-summary LSA origination was
confused, reported 'LSA ID collision' and net-summary LSAs were not
originated properly.

Thanks to Naveen Chowdary Yerramneni for bugreport and analysis.
parent ed1a908e
Loading
Loading
Loading
Loading
+10 −7
Original line number Diff line number Diff line
@@ -429,10 +429,9 @@ add_network(struct ospf_area *oa, ip_addr px, int pxlen, int metric, struct top_
  if (en == oa->rt)
  {
    /*
     * Local stub networks does not have proper iface in en->nhi
     * (because they all have common top_hash_entry en).
     * We have to find iface responsible for that stub network.
     * Configured stubnets does not have any iface. They will
     * Local stub networks do not have proper iface in en->nhi (because they all
     * have common top_hash_entry en). We have to find iface responsible for
     * that stub network. Configured stubnets do not have any iface. They will
     * be removed in rt_sync().
     */

@@ -1560,6 +1559,7 @@ ospf_rt_reset(struct ospf_proto *p)
  {
    ri = (ort *) nftmp;
    ri->area_net = 0;
    ri->keep = 0;
    reset_ri(ri);
  }
  FIB_WALK_END;
@@ -1929,9 +1929,12 @@ again1:
	}
    }

    /* Remove configured stubnets */
    if (!nf->n.nhs)
    /* Remove configured stubnets but keep the entries */
    if (nf->n.type && !nf->n.nhs)
    {
      reset_ri(nf);
      nf->keep = 1;
    }

    if (nf->n.type) /* Add the route */
    {
@@ -1991,7 +1994,7 @@ again1:
    }

    /* Remove unused rt entry, some special entries are persistent */
    if (!nf->n.type && !nf->external_rte && !nf->area_net)
    if (!nf->n.type && !nf->external_rte && !nf->area_net && !nf->keep)
    {
      FIB_ITERATE_PUT(&fit, nftmp);
      fib_delete(fib, nftmp);
+1 −0
Original line number Diff line number Diff line
@@ -84,6 +84,7 @@ typedef struct ort
  rta *old_rta;
  u8 external_rte;
  u8 area_net;
  u8 keep;
}
ort;