Hello again!

On 29/01/2026 11:49, Ondřej Caletka wrote:
I wonder whether there is a way how to see a ASPA table entry for particular customer AS number. Something like:

bird> show route table aspas all for 2121
syntax error, unexpected NUM, expecting IP4 or IP6 or VPN_RD or CF_SYM_KNOWN


Found it!

bird> show route all aspa 2121
Table aspas:
2121                  [rpki_validator 2026-01-29] * (100)
        preference: 100
        source: RPKI
        aspa_providers: 3333
        Internal route handling values: 0L 16G 1S id 10



Regarding the validation itself, a random trivial example where aspa_check_downstream fails and I don't know why is this:

80.254.230.0/24
         bgp_path: 3333 12859 42695

(My ASN is 2121 and there is an ASPA stating that 3333 is provider for 2121)

There is no ASPA for 3333
There is ASPA for 12859 not stating 42695 as provider
There is ASPA for 42695 not stating 12859 as provider

So the up ramp should be 42695
and the down ramp should be 2121 3333 12859

I don't see any valleys here yet it is rejected.

Am I doing it wrong?

I believe there is a logic error not covered by the tests in the validation logic around here

https://gitlab.nic.cz/labs/bird/-/blob/master/nest/rt-table.c?ref_type=heads#L428

I did some pen-and-paper tracing of this algorithm:

First ASN: 3333
ap = 0, found = up = down = false;
set max_down = 1, min_up = 0;

So far so good, no ASPA so the min_down ramp ends here, the max_down goes further. If there is no ASPA everywhere, min_up can end here too.

Second ASN: 12859
ap = 1, found = true, up = down = false;
set min_up = max_up = 1;
set force_upstream = true;

There is ASPA but neither on the left or on the right is a provider. We don't touch the down ramp (it pointed here from the previous step) and we clamp the up ramp for this position. However, we also force upstream validation from now on. I believe this is wrong because if this is the apex of the down ramp, the upstream validation should start from the next ASN.

Third ASN: 42695
ap = 2, found = true, up = down = false, force_upstream = true;
Bacause ap>0 and the ASN on the left is not provider, this ends up with ASPA_INVALID, because in previous iteration, the algorithm was switched to the upstream one.

Should we not switched to upstream validation at this point this would end up with min_up = max_up = 2.

I believe that this is expected result for the algorithm: both minimum and maximum up ramps end on AS with index 2, minimum down ramp is 0 since the leftmost ASN does not have ASPA, but maximum down ramp is 1.

Thus having max_up = 2 and max_down = 1 says that the up and down ramps are meeting on adjacent peers. This should be allowed.

However the logic in the code requires max_up <= max_down for Unknown result. This means it requires up and down ramps to be touching or overlapping.

I don't think this is what the draft-ietf-sidrops-aspa-verification-24 is prescribing. It operates with ramp lengths in place of positions so for this particular case: max_up_ramp = 1, min_up_ramp =1, max_down_ramp = 2, min_down_ramp = 1, N = 3.

The draft says that:
 the sum of max_up_ramp and max_down_ramp is less than N, the AS_PATH is 
Invalid.

Here 1 + 2 = 3 so this is not invalid.

Else, if the sum of min_up_ramp and min_down_ramp is less than N, enough 
information is not available to perform full AS_PATH verification, and the 
outcome is set to Unknown.

Here 1 + 1 < 3 so this should be unknown.


Am I still doing it wrong? :)

--
Best regards,

Ondřej Caletka

Reply via email to