From: dean <dlug...@gmail.com> This last patch updates the function in OSPF that handles routing table update notifications to use source information. Similar changes are applied to the function that synchronizes OSPF routing tables with nest's routing tables.
Finally, some work of area border routers (like deciding whether to flush or originate summary LSAs) is also changed to support SADR entries if SADR is enabled. --- proto/ospf/rt.c | 30 ++++++++++++++++++++---------- proto/ospf/topology.c | 6 ++++-- 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/proto/ospf/rt.c b/proto/ospf/rt.c index ac21f6e..39de770 100644 --- a/proto/ospf/rt.c +++ b/proto/ospf/rt.c @@ -1054,8 +1054,9 @@ decide_sum_lsa(struct ospf_area *oa, ort *nf, int dest) if ((nf->n.oa == oa->po->backbone) && oa->trcap) return 1; + addr_data addr = addr_data_fn_init(&nf->fn); struct area_net *anet = (struct area_net *) - fib_route(&nf->n.oa->net_fib, nf->fn.prefix, nf->fn.pxlen); + fib_route2(&nf->n.oa->net_fib, addr); /* Condensed area network found */ if (anet) @@ -1080,7 +1081,8 @@ check_sum_net_lsa(struct ospf_proto *p, ort *nf) /* Find that area network */ WALK_LIST(anet_oa, p->area_list) { - anet = (struct area_net *) fib_find(&anet_oa->net_fib, &nf->fn.prefix, nf->fn.pxlen); + addr_data addr = addr_data_fn_init(&nf->fn); + anet = (struct area_net *) fib_find2(&anet_oa->net_fib, addr); if (anet) break; } @@ -1115,7 +1117,8 @@ decide_nssa_lsa(struct ospf_proto *p, ort *nf, struct ospf_lsa_ext_local *rt) return 0; /* Condensed area network found */ - if (fib_route(&oa->enet_fib, nf->fn.prefix, nf->fn.pxlen)) + addr_data addr = addr_data_fn_init(&nf->fn); + if (fib_route2(&oa->enet_fib, addr)) return 0; if (!en || (en->lsa_type != LSA_T_NSSA)) @@ -1150,7 +1153,8 @@ check_nssa_lsa(struct ospf_proto *p, ort *nf) /* Find that area network */ WALK_LIST(oa, p->area_list) { - anet = (struct area_net *) fib_find(&oa->enet_fib, &nf->fn.prefix, nf->fn.pxlen); + addr_data addr = addr_data_fn_init(&nf->fn); + anet = (struct area_net *) fib_find2(&oa->enet_fib, addr); if (anet) break; } @@ -1246,7 +1250,8 @@ ospf_rt_abr1(struct ospf_proto *p) /* Compute condensed area networks */ if (nf->n.type == RTS_OSPF) { - anet = (struct area_net *) fib_route(&nf->n.oa->net_fib, nf->fn.prefix, nf->fn.pxlen); + addr_data addr = addr_data_fn_init(&nf->fn); + anet = (struct area_net *) fib_route2(&nf->n.oa->net_fib, addr); if (anet) { if (!anet->active) @@ -1254,7 +1259,8 @@ ospf_rt_abr1(struct ospf_proto *p) anet->active = 1; /* Get a RT entry and mark it to know that it is an area network */ - ort *nfi = (ort *) fib_get(&p->rtf, &anet->fn.prefix, anet->fn.pxlen); + addr_data addr2 = addr_data_fn_init(&anet->fn); + ort *nfi = (ort *) fib_get2(&p->rtf, addr2); nfi->area_net = 1; /* 16.2. (3) */ @@ -1402,8 +1408,9 @@ ospf_rt_abr2(struct ospf_proto *p) nf = (ort *) nftmp; if (rt_is_nssa(nf) && (nf->n.options & ORTA_PROP)) { + addr_data addr = addr_data_fn_init(&nf->fn); struct area_net *anet = (struct area_net *) - fib_route(&nf->n.oa->enet_fib, nf->fn.prefix, nf->fn.pxlen); + fib_route2(&nf->n.oa->enet_fib, addr); if (anet) { @@ -1412,7 +1419,8 @@ ospf_rt_abr2(struct ospf_proto *p) anet->active = 1; /* Get a RT entry and mark it to know that it is an area network */ - nf2 = (ort *) fib_get(&p->rtf, &anet->fn.prefix, anet->fn.pxlen); + addr_data addr2 = addr_data_fn_init(&anet->fn); + nf2 = (ort *) fib_get2(&p->rtf, addr2); nf2->area_net = 1; } @@ -2019,7 +2027,8 @@ again1: if (reload || ort_changed(nf, &a0)) { - net *ne = net_get(p->p.table, nf->fn.prefix, nf->fn.pxlen); + addr_data addr = addr_data_fn_init(&nf->fn); + net *ne = net_get2(p->p.table, addr); rta *a = rta_lookup(&a0); rte *e = rte_get_temp(a); @@ -2044,7 +2053,8 @@ again1: rta_free(nf->old_rta); nf->old_rta = NULL; - net *ne = net_get(p->p.table, nf->fn.prefix, nf->fn.pxlen); + addr_data addr = addr_data_fn_init(&nf->fn); + net *ne = net_get2(p->p.table, addr); rte_update(&p->p, ne, NULL); } diff --git a/proto/ospf/topology.c b/proto/ospf/topology.c index 55910bc..4bcf3ce 100644 --- a/proto/ospf/topology.c +++ b/proto/ospf/topology.c @@ -1271,7 +1271,8 @@ ospf_rt_notify(struct proto *P, rtable *tbl UNUSED, net *n, rte *new, rte *old U if (!new) { - nf = (ort *) fib_find(&p->rtf, &n->n.prefix, n->n.pxlen); + addr_data addr = addr_data_fn_init(&n->n); + nf = (ort *) fib_find2(&p->rtf, addr); if (!nf || !nf->external_rte) return; @@ -1314,7 +1315,8 @@ ospf_rt_notify(struct proto *P, rtable *tbl UNUSED, net *n, rte *new, rte *old U } } - nf = (ort *) fib_get(&p->rtf, &n->n.prefix, n->n.pxlen); + addr_data addr = addr_data_fn_init(&n->n); + nf = (ort *) fib_get2(&p->rtf, addr); ospf_originate_ext_lsa(p, oa, nf, LSA_M_EXPORT, metric, ebit, fwd, tag, 1); nf->external_rte = 1; } -- 2.7.4