Commit d471d5fc authored by Maria Matejka's avatar Maria Matejka
Browse files

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.
parent 5cff1d5f
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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 */
};
+4 −32
Original line number Diff line number Diff line
@@ -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;
}

+7 −0
Original line number Diff line number Diff line
@@ -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;
}
+7 −0
Original line number Diff line number Diff line
@@ -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
+1 −0
Original line number Diff line number Diff line
@@ -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);
Loading