On Sat, Jul 16, 2022 at 01:51:58PM +0200, Theo Buehler wrote:
> On Sat, Jul 16, 2022 at 12:41:07PM +0200, Claudio Jeker wrote:
> > I deployed bgpd on one of more core routers and triggered the fatal
> > "bad dmetric in decision process" from time to time.
> > 
> > I realized after a longer debugging session that one reason this happens
> > is when nexthops become valid. The state change affects all prefixes at
> > once but then they are reevaluated one by one (see prefix_evaluate_all()
> > which is called by nexthop_runner()).
> > 
> > I currently have no good solution for this issue. I think the problem is
> > that invalid prefixes are not sorted when added. There may be a similar
> > issue when flipping a rib from no-evaluate to evaluate in the reload code.
> > 
> > For now neuter the fatalx and convert it to a log_debug() until I figured
> > out a proper fix.
> 
> ok.
> 
> Now that the scope_id is part of struct bgpd_addr, the XXX in
> pt_getaddr() can go.

Not yet. The code in rde_prefix.c itself is not ready to handle scope_id.
It is not really needed there since it makes no sense to put link-local
prefixes into BGP. I need to look what the the next step is on the
scope_id quest.
 
> > -- 
> > :wq Claudio
> > 
> > Index: rde_decide.c
> > ===================================================================
> > RCS file: /cvs/src/usr.sbin/bgpd/rde_decide.c,v
> > retrieving revision 1.95
> > diff -u -p -r1.95 rde_decide.c
> > --- rde_decide.c    11 Jul 2022 16:46:41 -0000      1.95
> > +++ rde_decide.c    16 Jul 2022 10:28:19 -0000
> > @@ -331,8 +331,12 @@ prefix_set_dmetric(struct prefix *pp, st
> >                         PREFIX_DMETRIC_BEST : PREFIX_DMETRIC_INVALID;
> >             else
> >                     np->dmetric = prefix_cmp(pp, np, &testall);
> > -           if (np->dmetric < 0)
> > -                   fatalx("bad dmetric in decision process");
> > +           if (np->dmetric < 0) {
> > +                   struct bgpd_addr addr;
> > +                   pt_getaddr(np->pt, &addr);
> > +                   log_debug("bad dmetric in decision process: %s/%u",
> > +                       log_addr(&addr), np->pt->prefixlen);
> > +           }
> >     }
> >  }
> >  
> > 
> 

-- 
:wq Claudio

Reply via email to