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));
> }
>