mirror of
https://gitlab.nic.cz/labs/bird.git
synced 2024-11-09 12:48:43 +00:00
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:
parent
5cff1d5f02
commit
d471d5fc7c
@ -241,6 +241,7 @@ struct proto {
|
||||
struct rte * (*rte_modify)(struct rte *, struct linpool *);
|
||||
void (*rte_insert)(struct network *, struct rte *);
|
||||
void (*rte_remove)(struct network *, struct rte *);
|
||||
u32 (*rte_igp_metric)(struct rte *);
|
||||
|
||||
/* Hic sunt protocol-specific data */
|
||||
};
|
||||
|
@ -45,10 +45,6 @@
|
||||
#include "lib/string.h"
|
||||
#include "lib/alloca.h"
|
||||
|
||||
#ifdef CONFIG_BGP
|
||||
#include "proto/bgp/bgp.h"
|
||||
#endif
|
||||
|
||||
pool *rt_table_pool;
|
||||
|
||||
static slab *rte_slab;
|
||||
@ -3022,36 +3018,12 @@ rt_get_igp_metric(rte *rt)
|
||||
if (ea)
|
||||
return ea->u.data;
|
||||
|
||||
rta *a = rt->attrs;
|
||||
|
||||
#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)
|
||||
if (rt->attrs->source == RTS_DEVICE)
|
||||
return 0;
|
||||
|
||||
if (rt->src->proto->rte_igp_metric)
|
||||
return rt->src->proto->rte_igp_metric(rt);
|
||||
|
||||
return IGP_METRIC_UNKNOWN;
|
||||
}
|
||||
|
||||
|
@ -2332,6 +2332,12 @@ babel_rte_same(struct rte *new, struct rte *old)
|
||||
(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
|
||||
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->rte_better = babel_rte_better;
|
||||
P->rte_same = babel_rte_same;
|
||||
P->rte_igp_metric = babel_rte_igp_metric;
|
||||
|
||||
return P;
|
||||
}
|
||||
|
@ -371,6 +371,13 @@ bgp_init_aigp_metric(rte *e, u64 *metric, const struct adata **ad)
|
||||
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
|
||||
|
@ -1694,6 +1694,7 @@ bgp_init(struct proto_config *CF)
|
||||
P->rte_mergable = bgp_rte_mergable;
|
||||
P->rte_recalculate = cf->deterministic_med ? bgp_rte_recalculate : NULL;
|
||||
P->rte_modify = bgp_rte_modify_stale;
|
||||
P->rte_igp_metric = bgp_rte_igp_metric;
|
||||
|
||||
p->cf = cf;
|
||||
p->is_internal = (cf->local_as == cf->remote_as);
|
||||
|
@ -582,6 +582,7 @@ int bgp_rte_better(struct rte *, struct rte *);
|
||||
int bgp_rte_mergable(rte *pri, rte *sec);
|
||||
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);
|
||||
u32 bgp_rte_igp_metric(struct rte *);
|
||||
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_get_attr(const struct eattr *e, byte *buf, int buflen);
|
||||
|
@ -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 int ospf_rte_better(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);
|
||||
|
||||
|
||||
@ -382,6 +383,7 @@ ospf_init(struct proto_config *CF)
|
||||
P->store_tmp_attrs = ospf_store_tmp_attrs;
|
||||
P->rte_better = ospf_rte_better;
|
||||
P->rte_same = ospf_rte_same;
|
||||
P->rte_igp_metric = ospf_rte_igp_metric;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
static u32
|
||||
ospf_rte_igp_metric(struct rte *rt)
|
||||
{
|
||||
return rt->u.ospf.metric1;
|
||||
}
|
||||
|
||||
void
|
||||
ospf_schedule_rtcalc(struct ospf_proto *p)
|
||||
|
@ -1098,6 +1098,11 @@ rip_rte_same(struct rte *new, struct rte *old)
|
||||
(new->u.rip.from == old->u.rip.from));
|
||||
}
|
||||
|
||||
static u32
|
||||
rip_rte_igp_metric(struct rte *rt)
|
||||
{
|
||||
return rt->u.rip.metric;
|
||||
}
|
||||
|
||||
static void
|
||||
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->rte_better = rip_rte_better;
|
||||
P->rte_same = rip_rte_same;
|
||||
P->rte_igp_metric = rip_rte_igp_metric;
|
||||
|
||||
return P;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user