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 */
>       }
> 

Reply via email to