Commit 7dc4827c authored by Martin Mares's avatar Martin Mares
Browse files

Added everything protocols need to know about multiple routing tables,

i.e. struct proto now contains field 'table' pointing to routing table
the protocol is attached to. Use this instead of &master_table.

Modified all protocols except the kernel syncer to use this field.
parent 7e5f5ffd
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -86,6 +86,7 @@ proto_new(struct proto_config *c, unsigned size)
  p->preference = c->preference;
  p->disabled = c->disabled;
  p->proto = pr;
  p->table = &master_table;
  p->in_filter = c->in_filter;
  p->out_filter = c->out_filter;
  return p;
+1 −2
Original line number Diff line number Diff line
@@ -99,11 +99,10 @@ struct proto {
  void (*rte_insert)(struct network *, struct rte *);
  void (*rte_remove)(struct network *, struct rte *);

  struct rtable *table;			/* Routing table we're connected to */
  struct filter *in_filter;		/* Input filter */
  struct filter *out_filter;		/* Output filter */

  /* Connection to routing tables? */

  /* Hic sunt protocol-specific data */
};

+3 −3
Original line number Diff line number Diff line
@@ -31,7 +31,7 @@ dev_if_notify(struct proto *p, unsigned c, struct iface *new, struct iface *old)
      net *n;

      debug("dev_if_notify: %s going down\n", old->name);
      n = net_find(&master_table, 0, old->prefix, old->pxlen);
      n = net_find(p->table, 0, old->prefix, old->pxlen);
      if (!n)
	{
	  debug("dev_if_notify: device shutdown: prefix not found\n");
@@ -56,9 +56,9 @@ dev_if_notify(struct proto *p, unsigned c, struct iface *new, struct iface *old)
      A.attrs = NULL;
      a = rta_lookup(&A);
      if (new->flags & IF_UNNUMBERED)
	n = net_get(&master_table, 0, new->opposite, new->pxlen);
	n = net_get(p->table, 0, new->opposite, new->pxlen);
      else
	n = net_get(&master_table, 0, new->prefix, new->pxlen);
	n = net_get(p->table, 0, new->prefix, new->pxlen);
      e = rte_get_temp(a);
      e->net = n;
      e->pflags = 0;
+1 −1
Original line number Diff line number Diff line
@@ -226,7 +226,7 @@ advertise_entry( struct proto *p, struct rip_block *b, ip_addr whotoldme )
    log( L_ERR "%I asked me to route %I/%I, but that is not valid netmask.", A.from, b->network, b->netmask );
    return;
  }
  n = net_get( &master_table, 0, b->network, ipa_mklen( b->netmask ));
  n = net_get( p->table, 0, b->network, ipa_mklen( b->netmask ));
  r = rte_get_temp(a);
  r->u.rip.metric = ntohl(b->metric) + rif->metric;
  if (r->u.rip.metric > P_CF->infinity) r->u.rip.metric = P_CF->infinity;
+2 −2
Original line number Diff line number Diff line
@@ -37,7 +37,7 @@ static_install(struct proto *p, struct static_route *r, struct iface *ifa)
  a.iface = ifa;
  aa = rta_lookup(&a);

  n = net_get(&master_table, a.tos, r->net, r->masklen);
  n = net_get(p->table, a.tos, r->net, r->masklen);
  e = rte_get_temp(aa);
  e->net = n;
  e->pflags = 0;
@@ -50,7 +50,7 @@ static_remove(struct proto *p, struct static_route *r)
  net *n;

  DBG("Removing static route %I/%d\n", r->net, r->masklen);
  n = net_find(&master_table, 0, r->net, r->masklen);
  n = net_find(p->table, 0, r->net, r->masklen);
  if (n)
    rte_update(n, p, NULL);
}