Hello,

while I was running some tests on BIRD 2.0.0 I've noticed that the
handling of RFC8097 extended communities is different from 1.6.3.

Scenario:
- AS10 announces a route to the route server;
- the route server adds the (0x4300, 0, 1) ext community (RFC8097);
- AS20 receives the route;
- clients are always both on 1.6.3.

This is the filter I'm using:

filter from_client {
        bgp_ext_community.add((unknown 0x4300, 0, 1));
        accept;
}

The results I get follow:

- when 1.6.3 is used on the route server, BIRD treats the community
  strictly according to RFC4360:

   If a route has a non-transitivity extended community, then before
   advertising the route across the Autonomous System boundary the
   community SHOULD be removed from the route.

- when 2.0.0 is used, the community is treated accordingly to
  draft-ietf-sidrops-route-server-rpki-light-02 and is propagated to the
  client.

Since I didn't find any reference to RFC8097/rpki-light on the web site,
I was wondering if I missed something or if this is the expected
behaviour.

Configs and 'show route' output attached.

Bests,

--
Pier Carlo Chiodi
https://pierky.com
router id 192.0.2.10;

log "/var/log/bird.log" all;
log syslog all;
debug protocols all;

protocol device { }

protocol static own_prefixes {
        route 1.0.1.0/24 reject;
}
protocol bgp the_rs {
        local as 10;
        neighbor 192.0.2.2 as 999;
        import all;
        export all;
        connect delay time 1;
        connect retry time 1;
}
router id 192.0.2.20;

log "/var/log/bird.log" all;
log syslog all;
debug protocols all;

protocol device { }

protocol bgp the_rs {
        local as 20;
        neighbor 192.0.2.2 as 999;
        import all;
        export all;
        connect delay time 1;
        connect retry time 1;
}
With BIRD 2.0.0 on the route server:

rs$ birdcl show route all
BIRD 2.0.0 ready.
Table master4:
1.0.1.0/24           unicast [AS10 17:33:32.159] * (100) [AS10i]
        via 192.0.2.10 on eth0
        Type: BGP univ
        BGP.origin: IGP
        BGP.as_path: 10
        BGP.next_hop: 192.0.2.10
        BGP.local_pref: 100
        BGP.ext_community: (generic, 0x43000000, 0x1)
rs$ birdcl show route all export AS20
BIRD 2.0.0 ready.
Table master4:
1.0.1.0/24           unicast [AS10 17:33:32.159] * (100) [AS10i]
        via 192.0.2.10 on eth0
        Type: BGP univ
        BGP.origin: IGP
        BGP.as_path: 10
        BGP.next_hop: 192.0.2.10
        BGP.local_pref: 100
        BGP.ext_community: (generic, 0x43000000, 0x1)

from the receiving client:

receiver$ birdcl show route all
BIRD 1.6.3 ready.
1.0.1.0/24         via 192.0.2.10 on eth0 [the_rs 17:33:32 from 192.0.2.2] * 
(100) [AS10i]
        Type: BGP unicast univ
        BGP.origin: IGP
        BGP.as_path: 10
        BGP.next_hop: 192.0.2.10
        BGP.local_pref: 100
        BGP.ext_community: (generic, 0x43000000, 0x1)




With BIRD 1.6.3 on the route server:

rs$ birdcl show route all
BIRD 1.6.3 ready.
1.0.1.0/24         via 192.0.2.10 on eth0 [AS10 17:36:56] * (100) [AS10i]
        Type: BGP unicast univ
        BGP.origin: IGP
        BGP.as_path: 10
        BGP.next_hop: 192.0.2.10
        BGP.local_pref: 100
        BGP.ext_community: (generic, 0x43000000, 0x1)
rs$ birdcl show route all export AS20
BIRD 1.6.3 ready.
1.0.1.0/24         via 192.0.2.10 on eth0 [AS10 17:36:56] * (100) [AS10i]
        Type: BGP unicast univ
        BGP.origin: IGP
        BGP.as_path: 10
        BGP.next_hop: 192.0.2.10
        BGP.local_pref: 100
        BGP.ext_community: (generic, 0x43000000, 0x1)

from the receiving client:

receiver$ birdcl show route all
BIRD 1.6.3 ready.
1.0.1.0/24         via 192.0.2.10 on eth0 [the_rs 17:36:56 from 192.0.2.2] * 
(100) [AS10i]
        Type: BGP unicast univ
        BGP.origin: IGP
        BGP.as_path: 10
        BGP.next_hop: 192.0.2.10
        BGP.local_pref: 100
router id 192.0.2.2;
define rs_as = 999;

log "/var/log/bird.log" all;
log syslog all;
debug protocols { states, routes, filters, interfaces, events };

protocol device {};

table master sorted;

filter from_client {
        bgp_ext_community.add((unknown 0x4300, 0, 1));
        accept;
}

protocol bgp AS10 {
        description "AS10";

        local as 999;
        neighbor 192.0.2.10 as 10;
        rs client;

        passive on;
        ttl security off;
        interpret communities off;

        secondary;
        import keep filtered on;
        import filter from_client;
        export all;
}

protocol bgp AS20 {
        description "AS20";

        local as 999;
        neighbor 192.0.2.20 as 20;
        rs client;

        passive on;
        ttl security off;
        interpret communities off;

        secondary;
        import keep filtered on;
        import filter from_client;
        export all;
}
router id 192.0.2.2;
define rs_as = 999;

log "/var/log/bird.log" all;
log syslog all;
debug protocols { states, routes, filters, interfaces, events };

protocol device {};

ipv4 table master4 sorted;
ipv6 table master6 sorted;

filter from_client {
        bgp_ext_community.add((unknown 0x4300, 0, 1));
        accept;
}

protocol bgp AS10 {
        description "AS10";

        local as 999;
        neighbor 192.0.2.10 as 10;
        rs client;

        passive on;
        ttl security off;
        interpret communities off;

        ipv4 {
                secondary;
                import keep filtered on;
                import filter from_client;
                export all;
        };
}

protocol bgp AS20 {
        description "AS20";

        local as 999;
        neighbor 192.0.2.20 as 20;
        rs client;

        passive on;
        ttl security off;
        interpret communities off;

        ipv4 {
                secondary;
                import keep filtered on;
                import filter from_client;
                export all;
        };
}

Reply via email to