]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Merge commit '0f2be469' into thread-next
authorMaria Matejka <mq@ucw.cz>
Mon, 7 Nov 2022 08:51:21 +0000 (09:51 +0100)
committerMaria Matejka <mq@ucw.cz>
Mon, 7 Nov 2022 08:51:21 +0000 (09:51 +0100)
1  2 
sysdep/unix/krt.c

index b0033a657ea3c81af4a5c3342f757096fbf7aece,cb0f1d4fc5cf9be77bf9acad0c2e421438bf88d3..3b6c91cc9a4a3393225ef51b90b2a90b1894c014
@@@ -302,19 -303,141 +302,25 @@@ krt_uptodate(rte *a, rte *b
    return (a->attrs == b->attrs);
  }
  
 -static void
 -krt_learn_announce_update(struct krt_proto *p, rte *e)
 -{
 -  net *n = e->net;
 -  rta *aa = rta_clone(e->attrs);
 -  rte *ee = rte_get_temp(aa, p->p.main_source);
 -  rte_update(&p->p, n->n.addr, ee);
 -}
 -
 -static void
 -krt_learn_announce_delete(struct krt_proto *p, net *n)
 -{
 -  rte_update(&p->p, n->n.addr, NULL);
 -}
 -
+ static void
+ krt_learn_alien_attr(struct channel *c, rte *e)
+ {
 -  ASSERT(!e->attrs->cached);
 -  e->attrs->pref = c->preference;
 -
 -  e->attrs = rta_lookup(e->attrs);
++  ea_set_attr_u32(&e->attrs, &ea_gen_preference, 0, c->preference);
+ }
  /* Called when alien route is discovered during scan */
  static void
  krt_learn_scan(struct krt_proto *p, rte *e)
  {
 -  net *n0 = e->net;
 -  net *n = net_get(p->krt_table, n0->n.addr);
 -  rte *m, **mm;
 +  rte e0 = {
 +    .attrs = e->attrs,
 +    .src = rt_get_source(&p->p, krt_metric(e)),
 +  };
  
-   ea_set_attr_u32(&e0.attrs, &ea_gen_preference, 0, p->p.main_channel->preference);
 -  krt_learn_alien_attr(p->p.main_channel, e);
++  krt_learn_alien_attr(p->p.main_channel, &e0);
  
 -  for(mm=&n->routes; m = *mm; mm=&m->next)
 -    if (krt_same_key(m, e))
 -      break;
 -  if (m)
 -    {
 -      if (krt_uptodate(m, e))
 -      {
 -        krt_trace_in_rl(&rl_alien, p, e, "[alien] seen");
 -        rte_free(e);
 -        m->pflags |= KRT_REF_SEEN;
 -      }
 -      else
 -      {
 -        krt_trace_in(p, e, "[alien] updated");
 -        *mm = m->next;
 -        rte_free(m);
 -        m = NULL;
 -      }
 -    }
 -  else
 -    krt_trace_in(p, e, "[alien] created");
 -  if (!m)
 -    {
 -      e->next = n->routes;
 -      n->routes = e;
 -      e->pflags |= KRT_REF_SEEN;
 -    }
 -}
 -
 -static void
 -krt_learn_prune(struct krt_proto *p)
 -{
 -  struct fib *fib = &p->krt_table->fib;
 -  struct fib_iterator fit;
 -
 -  KRT_TRACE(p, D_EVENTS, "Pruning inherited routes");
 -
 -  FIB_ITERATE_INIT(&fit, fib);
 -again:
 -  FIB_ITERATE_START(fib, &fit, net, n)
 -    {
 -      rte *e, **ee, *best, **pbest, *old_best;
 -
 -      /*
 -       * Note that old_best may be NULL even if there was an old best route in
 -       * the previous step, because it might be replaced in krt_learn_scan().
 -       * But in that case there is a new valid best route.
 -       */
 -
 -      old_best = NULL;
 -      best = NULL;
 -      pbest = NULL;
 -      ee = &n->routes;
 -      while (e = *ee)
 -      {
 -        if (e->pflags & KRT_REF_BEST)
 -          old_best = e;
 -
 -        if (!(e->pflags & KRT_REF_SEEN))
 -          {
 -            *ee = e->next;
 -            rte_free(e);
 -            continue;
 -          }
 -
 -        if (!best || krt_metric(best) > krt_metric(e))
 -          {
 -            best = e;
 -            pbest = ee;
 -          }
 -
 -        e->pflags &= ~(KRT_REF_SEEN | KRT_REF_BEST);
 -        ee = &e->next;
 -      }
 -      if (!n->routes)
 -      {
 -        DBG("%I/%d: deleting\n", n->n.prefix, n->n.pxlen);
 -        if (old_best)
 -          krt_learn_announce_delete(p, n);
 -
 -        FIB_ITERATE_PUT(&fit);
 -        fib_delete(fib, n);
 -        goto again;
 -      }
 -
 -      best->pflags |= KRT_REF_BEST;
 -      *pbest = best->next;
 -      best->next = n->routes;
 -      n->routes = best;
 -
 -      if ((best != old_best) || p->reload)
 -      {
 -        DBG("%I/%d: announcing (metric=%d)\n", n->n.prefix, n->n.pxlen, krt_metric(best));
 -        krt_learn_announce_update(p, best);
 -      }
 -      else
 -      DBG("%I/%d: uptodate (metric=%d)\n", n->n.prefix, n->n.pxlen, krt_metric(best));
 -    }
 -  FIB_ITERATE_END;
 -
 -  p->reload = 0;
 +  rte_update(p->p.main_channel, e->net, &e0, e0.src);
 +  rt_unlock_source(e0.src);
  }
  
  static void