]> git.puffer.fish Git - mirror/frr.git/commitdiff
bgpd: Ignore validating the attribute flags if path-attribute is configured
authorDonatas Abraitis <donatas@opensourcerouting.org>
Wed, 1 May 2024 13:01:38 +0000 (16:01 +0300)
committerMergify <37929162+mergify[bot]@users.noreply.github.com>
Tue, 7 May 2024 14:46:12 +0000 (14:46 +0000)
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 714e5be9a0804c0da2c9429bead274bbaefc9939)

bgpd/bgp_attr.c

index 53420b492e37384c1c5928ecdae563e779bbb39f..40e074d058653c3ba2fd8a151eca20905769cc51 100644 (file)
@@ -1518,6 +1518,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)
@@ -1525,6 +1526,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."