IGP metric getter refactoring to protocol callback

Direct protocol hooks for IGP metric inside nest/rt-table.c make the
protocol API unnecessarily complex. Instead, we use a proper callback.
This commit is contained in:
Maria Matejka 2021-03-20 23:18:34 +01:00
parent 5cff1d5f02
commit d471d5fc7c
8 changed files with 34 additions and 32 deletions

View file

@ -241,6 +241,7 @@ struct proto {
struct rte * (*rte_modify)(struct rte *, struct linpool *); struct rte * (*rte_modify)(struct rte *, struct linpool *);
void (*rte_insert)(struct network *, struct rte *); void (*rte_insert)(struct network *, struct rte *);
void (*rte_remove)(struct network *, struct rte *); void (*rte_remove)(struct network *, struct rte *);
u32 (*rte_igp_metric)(struct rte *);
/* Hic sunt protocol-specific data */ /* Hic sunt protocol-specific data */
}; };

View file

@ -45,10 +45,6 @@
#include "lib/string.h" #include "lib/string.h"
#include "lib/alloca.h" #include "lib/alloca.h"
#ifdef CONFIG_BGP
#include "proto/bgp/bgp.h"
#endif
pool *rt_table_pool; pool *rt_table_pool;
static slab *rte_slab; static slab *rte_slab;
@ -3022,36 +3018,12 @@ rt_get_igp_metric(rte *rt)
if (ea) if (ea)
return ea->u.data; return ea->u.data;
rta *a = rt->attrs; if (rt->attrs->source == RTS_DEVICE)
#ifdef CONFIG_OSPF
if ((a->source == RTS_OSPF) ||
(a->source == RTS_OSPF_IA) ||
(a->source == RTS_OSPF_EXT1))
return rt->u.ospf.metric1;
#endif
#ifdef CONFIG_RIP
if (a->source == RTS_RIP)
return rt->u.rip.metric;
#endif
#ifdef CONFIG_BGP
if (a->source == RTS_BGP)
{
u64 metric = bgp_total_aigp_metric(rt);
return (u32) MIN(metric, (u64) IGP_METRIC_UNKNOWN);
}
#endif
#ifdef CONFIG_BABEL
if (a->source == RTS_BABEL)
return rt->u.babel.metric;
#endif
if (a->source == RTS_DEVICE)
return 0; return 0;
if (rt->src->proto->rte_igp_metric)
return rt->src->proto->rte_igp_metric(rt);
return IGP_METRIC_UNKNOWN; return IGP_METRIC_UNKNOWN;
} }

View file

@ -2332,6 +2332,12 @@ babel_rte_same(struct rte *new, struct rte *old)
(new->u.babel.router_id == old->u.babel.router_id)); (new->u.babel.router_id == old->u.babel.router_id));
} }
static u32
babel_rte_igp_metric(struct rte *rt)
{
return rt->u.babel.metric;
}
static void static void
babel_postconfig(struct proto_config *CF) babel_postconfig(struct proto_config *CF)
@ -2367,6 +2373,7 @@ babel_init(struct proto_config *CF)
P->store_tmp_attrs = babel_store_tmp_attrs; P->store_tmp_attrs = babel_store_tmp_attrs;
P->rte_better = babel_rte_better; P->rte_better = babel_rte_better;
P->rte_same = babel_rte_same; P->rte_same = babel_rte_same;
P->rte_igp_metric = babel_rte_igp_metric;
return P; return P;
} }

View file

@ -371,6 +371,13 @@ bgp_init_aigp_metric(rte *e, u64 *metric, const struct adata **ad)
return *metric < IGP_METRIC_UNKNOWN; return *metric < IGP_METRIC_UNKNOWN;
} }
u32
bgp_rte_igp_metric(struct rte *rt)
{
u64 metric = bgp_total_aigp_metric(rt);
return (u32) MIN(metric, (u64) IGP_METRIC_UNKNOWN);
}
/* /*
* Attribute hooks * Attribute hooks

View file

@ -1694,6 +1694,7 @@ bgp_init(struct proto_config *CF)
P->rte_mergable = bgp_rte_mergable; P->rte_mergable = bgp_rte_mergable;
P->rte_recalculate = cf->deterministic_med ? bgp_rte_recalculate : NULL; P->rte_recalculate = cf->deterministic_med ? bgp_rte_recalculate : NULL;
P->rte_modify = bgp_rte_modify_stale; P->rte_modify = bgp_rte_modify_stale;
P->rte_igp_metric = bgp_rte_igp_metric;
p->cf = cf; p->cf = cf;
p->is_internal = (cf->local_as == cf->remote_as); p->is_internal = (cf->local_as == cf->remote_as);

View file

@ -582,6 +582,7 @@ int bgp_rte_better(struct rte *, struct rte *);
int bgp_rte_mergable(rte *pri, rte *sec); int bgp_rte_mergable(rte *pri, rte *sec);
int bgp_rte_recalculate(rtable *table, net *net, rte *new, rte *old, rte *old_best); int bgp_rte_recalculate(rtable *table, net *net, rte *new, rte *old, rte *old_best);
struct rte *bgp_rte_modify_stale(struct rte *r, struct linpool *pool); struct rte *bgp_rte_modify_stale(struct rte *r, struct linpool *pool);
u32 bgp_rte_igp_metric(struct rte *);
void bgp_rt_notify(struct proto *P, struct channel *C, net *n, rte *new, rte *old); void bgp_rt_notify(struct proto *P, struct channel *C, net *n, rte *new, rte *old);
int bgp_preexport(struct proto *, struct rte *); int bgp_preexport(struct proto *, struct rte *);
int bgp_get_attr(const struct eattr *e, byte *buf, int buflen); int bgp_get_attr(const struct eattr *e, byte *buf, int buflen);

View file

@ -113,6 +113,7 @@ static void ospf_store_tmp_attrs(struct rte *rt, struct linpool *pool);
static void ospf_reload_routes(struct channel *C); static void ospf_reload_routes(struct channel *C);
static int ospf_rte_better(struct rte *new, struct rte *old); static int ospf_rte_better(struct rte *new, struct rte *old);
static int ospf_rte_same(struct rte *new, struct rte *old); static int ospf_rte_same(struct rte *new, struct rte *old);
static u32 ospf_rte_igp_metric(struct rte *rt);
static void ospf_disp(timer *timer); static void ospf_disp(timer *timer);
@ -382,6 +383,7 @@ ospf_init(struct proto_config *CF)
P->store_tmp_attrs = ospf_store_tmp_attrs; P->store_tmp_attrs = ospf_store_tmp_attrs;
P->rte_better = ospf_rte_better; P->rte_better = ospf_rte_better;
P->rte_same = ospf_rte_same; P->rte_same = ospf_rte_same;
P->rte_igp_metric = ospf_rte_igp_metric;
return P; return P;
} }
@ -419,6 +421,11 @@ ospf_rte_same(struct rte *new, struct rte *old)
new->u.ospf.router_id == old->u.ospf.router_id; new->u.ospf.router_id == old->u.ospf.router_id;
} }
static u32
ospf_rte_igp_metric(struct rte *rt)
{
return rt->u.ospf.metric1;
}
void void
ospf_schedule_rtcalc(struct ospf_proto *p) ospf_schedule_rtcalc(struct ospf_proto *p)

View file

@ -1098,6 +1098,11 @@ rip_rte_same(struct rte *new, struct rte *old)
(new->u.rip.from == old->u.rip.from)); (new->u.rip.from == old->u.rip.from));
} }
static u32
rip_rte_igp_metric(struct rte *rt)
{
return rt->u.rip.metric;
}
static void static void
rip_postconfig(struct proto_config *CF) rip_postconfig(struct proto_config *CF)
@ -1124,6 +1129,7 @@ rip_init(struct proto_config *CF)
P->store_tmp_attrs = rip_store_tmp_attrs; P->store_tmp_attrs = rip_store_tmp_attrs;
P->rte_better = rip_rte_better; P->rte_better = rip_rte_better;
P->rte_same = rip_rte_same; P->rte_same = rip_rte_same;
P->rte_igp_metric = rip_rte_igp_metric;
return P; return P;
} }