On Wed, Jan 25, 2023 at 12:20:29PM +0100, Claudio Jeker wrote: > This diff is a result of a longer discussion with Sriram from NIST about > ASPA validation behaviour on route-servers and especially non-transparent RS. > > Handling transparent route-servers (which is the default) requires no > special handling in the validation logic. The route-server AS will never > show up in the AS_PATH and so this can be handled like any other lateral > peering. > > Now non-transparent route-servers work in most cases but there is one > special case where a valid path is mislabeled as unknown -- at least in > the opinion of the ASPA draft authors. The authors want that paths > validated via non-transparent route-servers behave like paths via > transparentroute-servers. > > So the problematic scenario is: > > AS3 (RS transp/non-transp) > / \ > AS2 - - - - - AS4 (RS-client / validating AS) > / AS2 and AS4 are > AS1 lateral peers > > With this record: > customer-as 1 provider-as { 2 } > Especially AS2 has no ASPA record. > > On a transparent RS the path to validate on AS4 is AS1 AS2 and since AS1 > has a ASPA record including AS2 it is valid. > On a non-tranparent RS the path to validate is AS1 AS2 AS3. Using the > same upstream algorithm we get (AS1 -> AS2 = valid) (AS2 -> AS3 = unknown) > final result unknown. The result should be valid but is not because of the > extra AS3. > > There are a few ways to solve this. The draft suggests to chop of AS3 on > the path and do the validation on this modified path. Now this is more > complex than it sounds and there is an alternative which is easier (for > us). Instead of using the upstream algorithm, switch to the down-up > algorithm. Now since AS3 is a "transit" for AS4 the path becomes valid > since AS2 - AS3 is now considered a lateral peering. > > So this is what this diff does (which is much shorter than the > explantion).
Your diff makes sense and I see why you chose to go this way. Sorry, I do not really have anything to add to your detailed discussion... ok tb > -- > :wq Claudio > > PS: the problem with all of this is that while this works in the above > case (and therefor follows the draft to the letter) it fails for AS4's > customer AS5. For AS5 the result of the validation alters between > transparent/non-transparent RS no matter what (validating path AS4 AS2 AS1 > vs AS4 AS3 AS2 AS1, first is valid 2nd is unknown). So maybe this > special case for non-transparent RS is is just putting lipstick on a pig. It feels a bit like it, yes. > > Index: rde.c > =================================================================== > RCS file: /cvs/src/usr.sbin/bgpd/rde.c,v > retrieving revision 1.591 > diff -u -p -r1.591 rde.c > --- rde.c 24 Jan 2023 14:13:12 -0000 1.591 > +++ rde.c 25 Jan 2023 09:43:19 -0000 > @@ -2509,15 +2509,19 @@ rde_aspa_validity(struct rde_peer *peer, > > switch (aid) { > case AID_INET: > - if (peer->role != ROLE_CUSTOMER) > - return asp->aspa_state.onlyup_v4; > - else > + if (peer->role == ROLE_CUSTOMER || > + (peer->role == ROLE_RS_CLIENT && > + peer->conf.enforce_as == ENFORCE_AS_ON)) > return asp->aspa_state.downup_v4; > - case AID_INET6: > - if (peer->role != ROLE_CUSTOMER) > - return asp->aspa_state.onlyup_v6; > else > + return asp->aspa_state.onlyup_v4; > + case AID_INET6: > + if (peer->role == ROLE_CUSTOMER || > + (peer->role == ROLE_RS_CLIENT && > + peer->conf.enforce_as == ENFORCE_AS_ON)) > return asp->aspa_state.downup_v6; > + else > + return asp->aspa_state.onlyup_v6; > default: > return ASPA_NEVER_KNOWN; /* not reachable */ > } >