That is almost the same methodology I used in other engines(RPL and XPL).
But, after having some issues on performance of control plane, I needed to
change a bit...
Splitting the IFs of v4 and v6, and then inside that IF testing for the
Prefix-list.
Doing that recursion on IFs, reduced a bit the impact on CPU of
route-filtering job.

I'm curious if Bind has some method to optimize logic and sequence of those
combined tests in some how.


Em ter., 23 de jan. de 2024 às 10:44, Luiz Amaral <em...@luiz.eng.br>
escreveu:

> Hello Nico,
>
> I make separate defines per family (like you did) and then in my filters
> I just use:
>      if (net.type = NET_IP4 && ! (net ~ ASxxx_IPV4)) then reject;
>      if (net.type = NET_IP6 && ! (net ~ ASxxx_IPV6)) then reject;
>
> Best,
> Luiz
>
> On 23/01/2024 14:13, Nico Schottelius via Bird-users wrote:
> > Hello bird users,
> >
> > I am wondering how you handle matching both IPv6 and IPv4 prefixes
> > efficiently.
> >
> > We have tons of blocks in our config like these:
> >
> > define net_genauso_v6 = [
> >         2a0a:5480::/29+
> > ];
> >
> > define net_genauso_v4 = [
> >         185.203.113.0/24,
> >         185.116.114.0/24
> > ];
> >
> > And then later we have a function that combines them like this:
> >
> > function is_genauso() -> bool
> > {
> >    if ((net ~ net_genauso_v6) ||
> >        (net ~ net_genauso_v4)) then {
> >        return true;
> >    }
> >
> >    return false;
> > }
> >
> > And then much later, we have various filters utilising the function, the
> > most simple one being:
> >
> > filter genauso {
> >    if(is_genauso()) then accept;
> >    reject;
> > }
> >
> > Which is then used in both IPv4 & IPv6 channels:
> >
> > protocol bgp incoming_r2ge {
> >      ...
> >
> >      ipv6 {
> >        import filter genauso;
> >        export none;
> >      };
> >
> >      ipv4 {
> >        import filter genauso;
> >        export none;
> >        extended next hop on;
> >      };
> > }
> >
> >
> > Instead of writing a wrapper function for each peer/constellation, it
> > would be great if we could do something like that:
> >
> > define net_genauso = [
> >         2a0a:5480::/29+,
> >         185.203.113.0/24,
> >         185.116.114.0/24
> >         ];
> >
> > ...
> > filter genauso {
> >    if(net ~ net_genauso) then accept;
> >    reject;
> > }
> > ...
> >
> > However as of bird 2.14, this results in the following error:
> >
> > bridge:~nico# bird -f -c ./bird.conf
> > bird: ./bird.conf:208:23 Mixed IPv4/IPv6 prefixes in prefix set.
> >
> > So my question is, how do you usually match on the two families? Do you
> > also write a wrapper function like above? Or do you have a smarter way?
> >
> > BR,
> >
> > Nico
> >
> > --
> > Sustainable and modern Infrastructures by ungleich.ch
>
>

-- 
Douglas Fernando Fischer
Engº de Controle e Automação

Reply via email to