From 13c0be19d3d2acc9c1636bbab9222aabdf27d7ac Mon Sep 17 00:00:00 2001 From: Jan Maria Matejka Date: Tue, 29 May 2018 12:08:12 +0200 Subject: Nest: Removing separate tmpa from route propagation This is a fundamental change of an original (1999) concept of route processing inside BIRD. During import/export, there was a temporary ea_list created which was to be used instead of the another one inside the route itself. This led to some confusion, quirks, and strange filter code that handled extended route attributes. Dropping it now. The protocol interface has changed in an uniform way -- the `struct ea_list *attrs` argument has been removed from store_tmp_attrs(), import_control(), rt_notify() and get_route_info(). --- sysdep/unix/krt.c | 37 ++++++++++++++++--------------------- 1 file changed, 16 insertions(+), 21 deletions(-) (limited to 'sysdep/unix/krt.c') diff --git a/sysdep/unix/krt.c b/sysdep/unix/krt.c index ae51927e..a79df54e 100644 --- a/sysdep/unix/krt.c +++ b/sysdep/unix/krt.c @@ -551,7 +551,7 @@ krt_flush_routes(struct krt_proto *p) if (rte_is_valid(e) && (n->n.flags & KRF_INSTALLED)) { /* FIXME: this does not work if gw is changed in export filter */ - krt_replace_rte(p, e->net, NULL, e, NULL); + krt_replace_rte(p, e->net, NULL, e); n->n.flags &= ~KRF_INSTALLED; } } @@ -559,14 +559,14 @@ krt_flush_routes(struct krt_proto *p) } static struct rte * -krt_export_net(struct krt_proto *p, net *net, rte **rt_free, ea_list **tmpa) +krt_export_net(struct krt_proto *p, net *net, rte **rt_free) { struct channel *c = p->p.main_channel; struct filter *filter = c->out_filter; rte *rt; if (c->ra_mode == RA_MERGED) - return rt_export_merged(c, net, rt_free, tmpa, krt_filter_lp, 1); + return rt_export_merged(c, net, rt_free, krt_filter_lp, 1); rt = net->routes; *rt_free = NULL; @@ -577,15 +577,14 @@ krt_export_net(struct krt_proto *p, net *net, rte **rt_free, ea_list **tmpa) if (filter == FILTER_REJECT) return NULL; - struct proto *src = rt->attrs->src->proto; - *tmpa = src->make_tmp_attrs ? src->make_tmp_attrs(rt, krt_filter_lp) : NULL; + rte_make_tmp_attrs(&rt, krt_filter_lp); /* We could run krt_import_control() here, but it is already handled by KRF_INSTALLED */ if (filter == FILTER_ACCEPT) goto accept; - if (f_run(filter, &rt, tmpa, krt_filter_lp, FF_FORCE_TMPATTR | FF_SILENT) > F_ACCEPT) + if (f_run(filter, &rt, krt_filter_lp, FF_SILENT) > F_ACCEPT) goto reject; @@ -667,9 +666,8 @@ krt_got_route(struct krt_proto *p, rte *e) if (net->n.flags & KRF_INSTALLED) { rte *new, *rt_free; - ea_list *tmpa; - new = krt_export_net(p, net, &rt_free, &tmpa); + new = krt_export_net(p, net, &rt_free); /* TODO: There also may be changes in route eattrs, we ignore that for now. */ @@ -714,7 +712,6 @@ krt_prune(struct krt_proto *p) { int verdict = n->n.flags & KRF_VERDICT_MASK; rte *new, *old, *rt_free = NULL; - ea_list *tmpa = NULL; if (verdict == KRF_UPDATE || verdict == KRF_DELETE) { @@ -728,12 +725,10 @@ krt_prune(struct krt_proto *p) if (verdict == KRF_CREATE || verdict == KRF_UPDATE) { /* We have to run export filter to get proper 'new' route */ - new = krt_export_net(p, n, &rt_free, &tmpa); + new = krt_export_net(p, n, &rt_free); if (!new) verdict = (verdict == KRF_CREATE) ? KRF_IGNORE : KRF_DELETE; - else - tmpa = ea_append(tmpa, new->attrs->eattrs); } else new = NULL; @@ -744,7 +739,7 @@ krt_prune(struct krt_proto *p) if (new && (n->n.flags & KRF_INSTALLED)) { krt_trace_in(p, new, "reinstalling"); - krt_replace_rte(p, n, new, NULL, tmpa); + krt_replace_rte(p, n, new, NULL); } break; case KRF_SEEN: @@ -753,11 +748,11 @@ krt_prune(struct krt_proto *p) break; case KRF_UPDATE: krt_trace_in(p, new, "updating"); - krt_replace_rte(p, n, new, old, tmpa); + krt_replace_rte(p, n, new, old); break; case KRF_DELETE: krt_trace_in(p, old, "deleting"); - krt_replace_rte(p, n, NULL, old, NULL); + krt_replace_rte(p, n, NULL, old); break; default: bug("krt_prune: invalid route status"); @@ -795,7 +790,7 @@ krt_got_route_async(struct krt_proto *p, rte *e, int new) if (new) { krt_trace_in(p, e, "[redirect] deleting"); - krt_replace_rte(p, net, NULL, e, NULL); + krt_replace_rte(p, net, NULL, e); } /* If !new, it is probably echo of our deletion */ break; @@ -937,14 +932,14 @@ krt_make_tmp_attrs(rte *rt, struct linpool *pool) } static void -krt_store_tmp_attrs(rte *rt, struct ea_list *attrs) +krt_store_tmp_attrs(rte *rt) { /* EA_KRT_SOURCE is read-only */ - rt->u.krt.metric = ea_get_int(attrs, EA_KRT_METRIC, 0); + rt->u.krt.metric = ea_get_int(rt->attrs->eattrs, EA_KRT_METRIC, 0); } static int -krt_import_control(struct proto *P, rte **new, ea_list **attrs UNUSED, struct linpool *pool UNUSED) +krt_import_control(struct proto *P, rte **new, struct linpool *pool UNUSED) { // struct krt_proto *p = (struct krt_proto *) P; rte *e = *new; @@ -975,7 +970,7 @@ krt_import_control(struct proto *P, rte **new, ea_list **attrs UNUSED, struct li static void krt_rt_notify(struct proto *P, struct channel *ch UNUSED, net *net, - rte *new, rte *old, struct ea_list *eattrs) + rte *new, rte *old) { struct krt_proto *p = (struct krt_proto *) P; @@ -988,7 +983,7 @@ krt_rt_notify(struct proto *P, struct channel *ch UNUSED, net *net, else net->n.flags &= ~KRF_INSTALLED; if (p->initialized) /* Before first scan we don't touch the routes */ - krt_replace_rte(p, net, new, old, eattrs); + krt_replace_rte(p, net, new, old); } static void -- cgit v1.2.3