]> git.proxmox.com Git - mirror_frr.git/blobdiff - bgpd/bgp_open.c
Merge pull request #5717 from pguibert6WIND/flowspec_issue_redistribute
[mirror_frr.git] / bgpd / bgp_open.c
index e743fdda8f2c9ed9300346e7c1f3658a069e4a8e..70ae7d87068cea4c50157af1f4e18d4d023b6691 100644 (file)
@@ -658,7 +658,7 @@ static int bgp_capability_enhe(struct peer *peer, struct capability_header *hdr)
                nh_afi = afi_iana2int(pkt_nh_afi);
 
                if (afi != AFI_IP || nh_afi != AFI_IP6
-                   || !(safi == SAFI_UNICAST
+                   || !(safi == SAFI_UNICAST || safi == SAFI_MPLS_VPN
                         || safi == SAFI_LABELED_UNICAST)) {
                        flog_warn(
                                EC_BGP_CAPABILITY_INVALID_DATA,
@@ -1320,82 +1320,72 @@ static void bgp_peer_send_gr_capability(struct stream *s, struct peer *peer,
        unsigned long capp = 0;
        unsigned long rcapp = 0;
 
-       if ((CHECK_FLAG(peer->flags,
-                       PEER_FLAG_GRACEFUL_RESTART)) ||
-               (CHECK_FLAG(peer->flags,
-                       PEER_FLAG_GRACEFUL_RESTART_HELPER))) {
+       if (!CHECK_FLAG(peer->flags, PEER_FLAG_GRACEFUL_RESTART)
+           && !CHECK_FLAG(peer->flags, PEER_FLAG_GRACEFUL_RESTART_HELPER))
+               return;
+
+       if (BGP_DEBUG(graceful_restart, GRACEFUL_RESTART))
+               zlog_debug("[BGP_GR] Sending helper Capability for Peer :%s :",
+                          peer->host);
+
+       SET_FLAG(peer->cap, PEER_CAP_RESTART_ADV);
+       stream_putc(s, BGP_OPEN_OPT_CAP);
+       capp = stream_get_endp(s); /* Set Capability Len Pointer */
+       stream_putc(s, 0);       /* Capability Length */
+       stream_putc(s, CAPABILITY_CODE_RESTART);
+       /* Set Restart Capability Len Pointer */
+       rcapp = stream_get_endp(s);
+       stream_putc(s, 0);
+       restart_time = peer->bgp->restart_time;
+       if (peer->bgp->t_startup) {
+               SET_FLAG(restart_time, RESTART_R_BIT);
+               SET_FLAG(peer->cap, PEER_CAP_RESTART_BIT_ADV);
 
                if (BGP_DEBUG(graceful_restart, GRACEFUL_RESTART))
-                       zlog_debug(
-                               "[BGP_GR] Sending helper Capability for Peer :%s :",
-                               peer->host);
+                       zlog_debug("[BGP_GR] Sending R-Bit for Peer :%s :",
+                                  peer->host);
+       }
 
-               SET_FLAG(peer->cap, PEER_CAP_RESTART_ADV);
-               stream_putc(s, BGP_OPEN_OPT_CAP);
-               capp = stream_get_endp(s); /* Set Capability Len Pointer */
-               stream_putc(s, 0);       /* Capability Length */
-               stream_putc(s, CAPABILITY_CODE_RESTART);
-               /* Set Restart Capability Len Pointer */
-               rcapp = stream_get_endp(s);
-               stream_putc(s, 0);
-               restart_time = peer->bgp->restart_time;
-               if (peer->bgp->t_startup) {
-                       SET_FLAG(restart_time, RESTART_R_BIT);
-                       SET_FLAG(peer->cap, PEER_CAP_RESTART_BIT_ADV);
+       stream_putw(s, restart_time);
+
+       /* Send address-family specific graceful-restart capability
+        * only when GR config is present
+        */
+       if (CHECK_FLAG(peer->flags, PEER_FLAG_GRACEFUL_RESTART)) {
+               if (bgp_flag_check(peer->bgp, BGP_FLAG_GR_PRESERVE_FWD)
+                   && BGP_DEBUG(graceful_restart, GRACEFUL_RESTART))
+                       zlog_debug("[BGP_GR] F bit Set");
+
+               FOREACH_AFI_SAFI (afi, safi) {
+                       if (!peer->afc[afi][safi])
+                               continue;
 
                        if (BGP_DEBUG(graceful_restart, GRACEFUL_RESTART))
                                zlog_debug(
-                                       "[BGP_GR] Sending R-Bit for Peer :%s :",
-                                       peer->host);
-               }
+                                       "[BGP_GR] Sending GR Capability for AFI :%d :, SAFI :%d:",
+                                       afi, safi);
 
-               stream_putw(s, restart_time);
-
-               /* Send address-family specific graceful-restart capability
-                * only when GR config is present
-                */
-               if (CHECK_FLAG(peer->flags, PEER_FLAG_GRACEFUL_RESTART)) {
-
-                       if (bgp_flag_check(peer->bgp,
-                                       BGP_FLAG_GR_PRESERVE_FWD) &&
-                                       BGP_DEBUG(graceful_restart,
-                                       GRACEFUL_RESTART))
-                               zlog_debug("[BGP_GR] F bit Set");
-
-                       FOREACH_AFI_SAFI (afi, safi) {
-                               if (peer->afc[afi][safi]) {
-                                       if (BGP_DEBUG(graceful_restart,
-                                                       GRACEFUL_RESTART))
-                                               zlog_debug(
-                                               "[BGP_GR] Sending GR Capability for AFI :%d :, SAFI :%d:",
-                                               afi, safi);
-
-                                       /* Convert AFI, SAFI to values for
-                                        * packet.
-                                        */
-                                       bgp_map_afi_safi_int2iana(afi,
-                                                       safi, &pkt_afi,
-                                                         &pkt_safi);
-                                       stream_putw(s, pkt_afi);
-                                       stream_putc(s, pkt_safi);
-                                       if (bgp_flag_check(peer->bgp,
-                                          BGP_FLAG_GR_PRESERVE_FWD)) {
-                                               stream_putc(s, RESTART_F_BIT);
-
-                                       } else {
-                                               stream_putc(s, 0);
-                                       }
-                               }
-                       }
+                       /* Convert AFI, SAFI to values for
+                        * packet.
+                        */
+                       bgp_map_afi_safi_int2iana(afi, safi, &pkt_afi,
+                                                 &pkt_safi);
+                       stream_putw(s, pkt_afi);
+                       stream_putc(s, pkt_safi);
+                       if (bgp_flag_check(peer->bgp, BGP_FLAG_GR_PRESERVE_FWD))
+                               stream_putc(s, RESTART_F_BIT);
+                       else
+                               stream_putc(s, 0);
                }
-               /* Total Graceful restart capability Len. */
-               len = stream_get_endp(s) - rcapp - 1;
-               stream_putc_at(s, rcapp, len);
-
-               /* Total Capability Len. */
-               len = stream_get_endp(s) - capp - 1;
-               stream_putc_at(s, capp, len);
        }
+
+       /* Total Graceful restart capability Len. */
+       len = stream_get_endp(s) - rcapp - 1;
+       stream_putc_at(s, rcapp, len);
+
+       /* Total Capability Len. */
+       len = stream_get_endp(s) - capp - 1;
+       stream_putc_at(s, capp, len);
 }
 
 /* Fill in capability open option to the packet. */
@@ -1445,7 +1435,7 @@ void bgp_open_capability(struct stream *s, struct peer *peer)
                        if (CHECK_FLAG(peer->flags, PEER_FLAG_CAPABILITY_ENHE)
                            && peer->su.sa.sa_family == AF_INET6
                            && afi == AFI_IP
-                           && (safi == SAFI_UNICAST
+                           && (safi == SAFI_UNICAST || safi == SAFI_MPLS_VPN
                                || safi == SAFI_LABELED_UNICAST)) {
                                /* RFC 5549 Extended Next Hop Encoding
                                 */