Hello Bird Team! My name is Ralph. I'm a network engineer and C programmer for Hurricane Electric. I am a long time fan of the Bird project! Keep up the great work!! Earlier this year I was tasked with implementing reactive ASPA in our network. My code was based off your older implementation of static ASPA tables here: https://gitlab.nic.cz/labs/bird/-/tree/aspa This older implementation is based off of customer-provider pairs: typedef struct net_addr_aspa { u8 type; u8 padding; u16 length; u32 customer_asn; u32 provider_asn; } net_addr_aspa; I've attached the patch as "bird-2.15.1-aspa-asn-pairs.patch". I took a look at 2.16 and ran into 2 problems. Respectfully, I would like to report two issues with the ASPA code in 2.16. Issue #1) There is no way to tell the difference between a transit entry and an "AS0" entry. $ cat bird-aspa.conf aspa table at; protocol static { aspa; route aspa 12345 transit; route aspa 970 provider 43, 56; route aspa 43970 provider 0; } --- $ ./sbin/birdc BIRD 2.16 ready. bird> show route table at all Table at: 43970 [static1 19:38:32.125] * (200) Type: static univ aspa_providers: 0 970 [static1 19:38:32.125] * (200) Type: static univ aspa_providers: 43 56 12345 [static1 19:38:32.125] * (200) Type: static univ aspa_providers: 0 bird> --- The treatment of AS0 providers is mentioned in section 5 of draft-ietf-sidrops-aspa-verification-19. It is a mechanism for people to announce that "no one should announce this AS". I've attached a snapshot of the global ASPA table as "bird-aspa-v2.16.conf". There is one AS0 announcement as of today. Issue #2) Changes in static ASPA tables are not reflected until entries are removed and re-added. $ cat bird-aspa.conf aspa table at; protocol static { aspa; route aspa 12345 transit; route aspa 970 provider 43, 56; route aspa 43970 provider 0; } bird> show route table at all Table at: 43970 [static1 19:38:32.125] * (200) Type: static univ aspa_providers: 0 970 [static1 19:38:32.125] * (200) Type: static univ aspa_providers: 43 56 12345 [static1 19:38:32.125] * (200) Type: static univ aspa_providers: 0 bird> $ cat bird-aspa.conf aspa table at; protocol static { aspa; route aspa 12345 transit; route aspa 970 provider 43, 56, 78; <---- added AS78 route aspa 43970 provider 0; } $ ./sbin/birdc BIRD 2.16 ready. bird> configure Reading configuration from /home/rpki/bird/etc/bird.conf Reconfigured bird> show route table at all Table at: 43970 [static1 19:38:32.125] * (200) Type: static univ aspa_providers: 0 970 [static1 19:38:32.125] * (200) Type: static univ aspa_providers: 43 56 <-------- changes not reflected *** 12345 [static1 19:38:32.125] * (200) Type: static univ aspa_providers: 0 bird> $ cat bird-aspa.conf aspa table at; protocol static { aspa; route aspa 12345 transit; #route aspa 970 provider 43, 56, 78; <----- remove entries altogether route aspa 43970 provider 0; } $ ./sbin/birdc BIRD 2.16 ready. bird> configure Reading configuration from /home/rpki/bird/etc/bird.conf Reconfigured bird> show route table at all Table at: 43970 [static1 19:38:32.125] * (200) Type: static univ aspa_providers: 0 12345 [static1 19:38:32.125] * (200) Type: static univ aspa_providers: 0 bird> $ cat bird-aspa.conf aspa table at; protocol static { aspa; route aspa 12345 transit; route aspa 970 provider 43, 56, 78; <------- add entry again route aspa 43970 provider 0; } $ ./sbin/birdc BIRD 2.16 ready. bird> configure Reading configuration from /home/rpki/bird/etc/bird.conf Reconfigured bird> show route table at all Table at: 43970 [static1 19:38:32.125] * (200) Type: static univ aspa_providers: 0 970 [static1 20:17:30.142] * (200) Type: static univ aspa_providers: 43 56 78 <--------- changes reflected correctly 12345 [static1 19:38:32.125] * (200) Type: static univ aspa_providers: 0 bird> --- This problem does not occur when the ASPA elements are customer-provider pairs. I believe this is an overall design issue, not a simple bug. I will be bringing this issue up with ietf-sidrops. Thanks! -- Ralph Covelli Hurricane Electric / AS6939 Network Engineer