Le Thu, Jan 14, 2021 at 02:20:26PM +0100, Claudio Jeker a écrit :
> The aspath_neighbor function returns the first AS of a path. Now if the
> first element is an AS_SET then this does not really make sense.
> RFC4271 has this bit in section 9.1.2.2
> 
>          Similarly, neighborAS(n) is a function that returns the
>          neighbor AS from which the route was received.  If the route is
>          learned via IBGP, and the other IBGP speaker didn't originate
>          the route, it is the neighbor AS from which the other IBGP
>          speaker learned the route.  If the route is learned via IBGP,
>          and the other IBGP speaker either (a) originated the route, or
>          (b) created the route by aggregation and the AS_PATH attribute
>          of the aggregate route is either empty or begins with an
>          AS_SET, it is the local AS.
> 
> bgpd uses aspath_neighbor() in a few spots:
> - in the decision process to decide if MED should be compared or not
> - in filters using 'peer-as'
> - in the enforce neighbor-as check
> 
> I think the above mentioned behaviour is valid for all these cases and so
> here is a diff that adjust aspath_neighbor().
> 

OK denis@

> -- 
> :wq Claudio
> 
> Index: rde_attr.c
> ===================================================================
> RCS file: /cvs/src/usr.sbin/bgpd/rde_attr.c,v
> retrieving revision 1.123
> diff -u -p -r1.123 rde_attr.c
> --- rde_attr.c        24 Jun 2019 06:39:49 -0000      1.123
> +++ rde_attr.c        14 Jan 2021 13:13:15 -0000
> @@ -673,8 +673,13 @@ aspath_length(struct aspath *aspath)
>  u_int32_t
>  aspath_neighbor(struct aspath *aspath)
>  {
> -     /* Empty aspath is OK -- internal AS route. */
> -     if (aspath->len == 0)
> +     /*
> +      * Empty aspath is OK -- internal AS route.
> +      * Additionally the RFC specifies that if the path starts with an
> +      * AS_SET the neighbor AS is also the local AS.
> +      */
> +     if (aspath->len == 0 ||
> +         aspath->data[0] != AS_SEQUENCE)
>               return (rde_local_as());
>       return (aspath_extract(aspath->data, 0));
>  }
> 

Reply via email to