bgpd: Ignore validating the attribute flags if path-attribute is configured

E.g. Cisco sends AIGP attribute as transitive, but it's wrong. Hence, the session
is teared down, because of this bgp_attr_flag_invalid() test.

Relax this check if we have `neighbor X path-attribute <discard|treat-as-withdraw>`
configured.

Signed-off-by: Donatas Abraitis <donatas@opensourcerouting.org>
(cherry picked from commit 714e5be9a0)
This commit is contained in:
Donatas Abraitis 2024-05-01 16:01:38 +03:00 committed by Mergify
parent 325a061690
commit 408cf3786e

View File

@ -1517,6 +1517,7 @@ static bool bgp_attr_flag_invalid(struct bgp_attr_parser_args *args)
uint8_t mask = BGP_ATTR_FLAG_EXTLEN;
const uint8_t flags = args->flags;
const uint8_t attr_code = args->type;
struct peer *peer = args->peer;
/* there may be attributes we don't know about */
if (attr_code > attr_flags_values_max)
@ -1524,6 +1525,14 @@ static bool bgp_attr_flag_invalid(struct bgp_attr_parser_args *args)
if (attr_flags_values[attr_code] == 0)
return false;
/* If `neighbor X path-attribute <discard|treat-as-withdraw>` is
* configured, then ignore checking optional, trasitive flags.
* The attribute/route will be discarded/withdrawned later instead
* of dropping the session.
*/
if (peer->discard_attrs[attr_code] || peer->withdraw_attrs[attr_code])
return false;
/* RFC4271, "For well-known attributes, the Transitive bit MUST be set
* to
* 1."