Hi all,

 

I found a bit strange behavior of handling AGGREGATOR attributes in BIRD v2.0.7 route server.

When BIRD receives a route containing AGGREGATOR attribute from 4byte-AS capable peer,

it sends the route with strange AGGREGATOR to 4byte-AS incapable peer.

On the other hand, BIRD can sends AS4_AGGREGATOR attribute correctly.

 

Here is a scenario what I did.

In the following simple topology, Peer1 and BIRD RS are 4byte-AS capable and Peer2 is 2byte-AS support only.

 

Peer1 --(r1)--> BIRD RS --(r1’)--> Peer2

 

Peer1 advertise a route r1 which contains AGGREGATOR attribute. (omitting ATOMIC_AGGREGATE here)

------

r1:

AGGREGATOR:

- Aggregator AS: 650001 (in 4byte)

- Aggregator Origin: x.x.x.x

------

 

Then, the expected route r1’ advertised from RS to Peer2 should be like:

------

r1’:

AGGREGATOR:

- Aggregator AS: 23456 (AS_TRANS, in 2byte)

- Aggregator Origin: x.x.x.x

AS4_AGGREGATOR:

- Aggregator AS: 650001 (in 4byte)

- Aggregator Origin: x.x.x.x

------

 

But as far as I see, BIRD sends the route including AGGREGATOR like:

------

r1’:

AGGREGATOR:

- Aggregator AS: 0 (in 2byte)    #here

- Aggregator Origin: y.y.y.y    #and here, not match to original origin x.x.x.x

AS4_AGGREGATOR:

- Aggregator AS: 650001 (in 4byte)

- Aggregator Origin: x.x.x.x

------

 

This may not confirm to the section 4.2.2 in https://tools.ietf.org/html/rfc6793.

And also, when the AS number in original AGGREGATOR is a “mappable” 4byte-AS number, I see that the AS number in AGGREGATOR advertised from BIRD is set as 65535 (0xFFFF).

 

Then I tried a small patch, this fixed my problem.

But I’m not sure if it’s appropriate.

 

------------------------------------------

diff --git a/nest/attrs.h b/nest/attrs.h

index 6fb0a8fa..e0399708 100644

--- a/nest/attrs.h

+++ b/nest/attrs.h

@@ -111,7 +111,7 @@ static inline struct adata *

aggregator_to_old(struct linpool *pool, const struct adata *a)

{

   struct adata *d = lp_alloc_adata(pool, 8);

-  put_u32(d->data, 0xFFFF);

+  put_u32(d->data, AS_TRANS);

   memcpy(d->data + 4, a->data + 4, 4);

   return d;

}

diff --git a/proto/bgp/attrs.c b/proto/bgp/attrs.c

index b8921363..f2a4d5b2 100644

--- a/proto/bgp/attrs.c

+++ b/proto/bgp/attrs.c

@@ -562,6 +562,7 @@ bgp_encode_aggregator(struct bgp_write_state *s, eattr *a, byte *buf, uint size)

     /* Prepare 16-bit AGGREGATOR (from 32-bit one) in a temporary buffer */

     byte *dst = alloca(6);

     len = aggregator_32to16(dst, data);

+    data = dst;

   }

 

   return bgp_put_attr(buf, size, BA_AGGREGATOR, a->flags, data, len);

------------------------------------------

 

If further information is needed I will be happy to provide it.

 

 

Best regards,

 

-----

Nasato Goto

JPNAP / INTERNET MULTIFEED CO.

goto@mfeed.ad.jp

-----