summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOndrej Filip <feela@network.cz>2000-06-05 03:46:19 +0000
committerOndrej Filip <feela@network.cz>2000-06-05 03:46:19 +0000
commit88048fb3c970842a16c65b1566ba817871a04eb5 (patch)
tree4fb39a2ba90bfe2c4e166b43ee52f46cf84887af
parent273fd2c16475d3d1275a4fe17443c3ba2b93fbc4 (diff)
Small patch to better hash type=2 LSAs.
-rw-r--r--proto/ospf/rt.c2
-rw-r--r--proto/ospf/topology.c17
2 files changed, 18 insertions, 1 deletions
diff --git a/proto/ospf/rt.c b/proto/ospf/rt.c
index 8a7f17cb..d5b4626f 100644
--- a/proto/ospf/rt.c
+++ b/proto/ospf/rt.c
@@ -126,7 +126,7 @@ ospf_rt_spfa(struct ospf_area *oa)
continue;
break;
case LSART_NET:
- tmp=ospf_hash_find(oa->gr,rtl->data,rtl->id,LSA_T_NET);
+ tmp=ospf_hash_find(oa->gr,rtl->id,rtl->id,LSA_T_NET);
if(tmp==NULL) DBG("Fuck!\n");
else DBG("Found. :-)\n");
break;
diff --git a/proto/ospf/topology.c b/proto/ospf/topology.c
index 6f89a911..22ebc5e8 100644
--- a/proto/ospf/topology.c
+++ b/proto/ospf/topology.c
@@ -439,7 +439,11 @@ ospf_top_hash_u32(u32 a)
static inline unsigned
ospf_top_hash(struct top_graph *f, u32 lsaid, u32 rtrid, u32 type)
{
+#if 1 /* Dirty patch to make rt table calculation work. */
+return (ospf_top_hash_u32(lsaid) + ospf_top_hash_u32((type==LSA_T_NET) ? lsaid : rtrid) + type) & f->hash_mask;
+#else
return (ospf_top_hash_u32(lsaid) + ospf_top_hash_u32(rtrid) + type) & f->hash_mask;
+#endif
}
struct top_graph *
@@ -510,8 +514,21 @@ ospf_hash_find(struct top_graph *f, u32 lsa, u32 rtr, u32 type)
{
struct top_hash_entry *e = f->hash_table[ospf_top_hash(f, lsa, rtr, type)];
+#if 1 /* Dirty patch to make rt table calculation work. */
+ if(type==LSA_T_NET)
+ {
+ while (e && (e->lsa.id != lsa || e->lsa.type != LSA_T_NET ))
+ e = e->next;
+ }
+ else
+ {
+ while (e && (e->lsa.id != lsa || e->lsa.type != type || e->lsa.rt != rtr))
+ e = e->next;
+ }
+#else
while (e && (e->lsa.id != lsa || e->lsa.rt != rtr || e->lsa.type != type))
e = e->next;
+#endif
return e;
}