]> git.puffer.fish Git - mirror/frr.git/commitdiff
bgpd: Include capabilities when sending NOTIFICATION(7) 15792/head
authorDonatas Abraitis <donatas@opensourcerouting.org>
Thu, 18 Apr 2024 14:37:51 +0000 (17:37 +0300)
committerDonatas Abraitis <donatas@opensourcerouting.org>
Thu, 18 Apr 2024 14:44:51 +0000 (17:44 +0300)
RFC5492 says:

This document defines a new Error Subcode, Unsupported Capability.
   The value of this Subcode is 7.  The Data field in the NOTIFICATION
   message MUST list the set of capabilities that causes the speaker to
   send the message.  Each such capability is encoded in the same way as
   it would be encoded in the OPEN message.

Signed-off-by: Donatas Abraitis <donatas@opensourcerouting.org>
bgpd/bgp_open.c

index 4037fd8aefcb23762a2c53161d15e939ff18ffcb..1c3bb6e7755fd0cb8c3a3f5d165a14d29a6b09e9 100644 (file)
@@ -1452,8 +1452,10 @@ int bgp_open_option_parse(struct peer *peer, uint16_t length,
        /* All OPEN option is parsed.  Check capability when strict compare
           flag is enabled.*/
        if (CHECK_FLAG(peer->flags, PEER_FLAG_STRICT_CAP_MATCH)) {
-               /* If Unsupported Capability exists. */
-               if (error != error_data) {
+               /* If Unsupported Capability exists or local capability does
+                * not negotiated with remote peer
+                */
+               if (error != error_data || !strict_capability_same(peer)) {
                        bgp_notify_send_with_data(peer->connection,
                                                  BGP_NOTIFY_OPEN_ERR,
                                                  BGP_NOTIFY_OPEN_UNSUP_CAPBL,
@@ -1461,14 +1463,6 @@ int bgp_open_option_parse(struct peer *peer, uint16_t length,
                                                  error - error_data);
                        return -1;
                }
-
-               /* Check local capability does not negotiated with remote
-                  peer. */
-               if (!strict_capability_same(peer)) {
-                       bgp_notify_send(peer->connection, BGP_NOTIFY_OPEN_ERR,
-                                       BGP_NOTIFY_OPEN_UNSUP_CAPBL);
-                       return -1;
-               }
        }
 
        /* Extended Message Support */
@@ -1503,17 +1497,11 @@ int bgp_open_option_parse(struct peer *peer, uint16_t length,
                                 "%s [Error] Configured AFI/SAFIs do not overlap with received MP capabilities",
                                 peer->host);
 
-                       if (error != error_data)
-                               bgp_notify_send_with_data(peer->connection,
-                                                         BGP_NOTIFY_OPEN_ERR,
-                                                         BGP_NOTIFY_OPEN_UNSUP_CAPBL,
-                                                         error_data,
-                                                         error - error_data);
-                       else
-                               bgp_notify_send(peer->connection,
-                                               BGP_NOTIFY_OPEN_ERR,
-                                               BGP_NOTIFY_OPEN_UNSUP_CAPBL);
-                       return -1;
+                       bgp_notify_send_with_data(peer->connection,
+                                                 BGP_NOTIFY_OPEN_ERR,
+                                                 BGP_NOTIFY_OPEN_UNSUP_CAPBL,
+                                                 error_data,
+                                                 error - error_data);
                }
        }
        return 0;