]> git.puffer.fish Git - matthieu/frr.git/commitdiff
BGP ORF fails to filter prefixes correctly
authorDaniel Walton <dwalton@cumulusnetworks.com>
Wed, 4 Nov 2015 16:31:33 +0000 (16:31 +0000)
committerDaniel Walton <dwalton@cumulusnetworks.com>
Wed, 4 Nov 2015 16:31:33 +0000 (16:31 +0000)
Signed-off-by: Daniel Walton <dwalton@cumulusnetworks.com>
Reviewed-by: Donald Sharp <sharpd@cumulusnetworks.com>
Ticket: CM-7145

bgpd/bgp_fsm.c
bgpd/bgp_packet.c
bgpd/bgp_route.c
bgpd/bgp_updgrp.c

index 02dddadf99f3bb479e213b6e506293c6f671970b..5586be710fba94ee72eaebdbc3c14d8e30b1ee58 100644 (file)
@@ -174,6 +174,7 @@ peer_xfer_conn(struct peer *from_peer)
        peer->afc_nego[afi][safi] = from_peer->afc_nego[afi][safi];
        peer->afc_adv[afi][safi] = from_peer->afc_adv[afi][safi];
        peer->afc_recv[afi][safi] = from_peer->afc_recv[afi][safi];
+       peer->orf_plist[afi][safi] = from_peer->orf_plist[afi][safi];
       }
 
   if (bgp_getsockname(peer) < 0)
index efac3bbbbef00417c17ab13a8d8273641d5c997d..f7336ea2f18002a79bd6d055b6839739c9558a8c 100644 (file)
@@ -1780,6 +1780,8 @@ bgp_route_refresh_receive (struct peer *peer, bgp_size_t size)
   safi_t safi;
   struct stream *s;
   struct peer_af *paf;
+  struct update_group *updgrp;
+  struct peer *updgrp_peer;
 
   /* If peer does not have the capability, send notification. */
   if (! CHECK_FLAG (peer->cap, PEER_CAP_REFRESH_ADV))
@@ -1956,8 +1958,8 @@ bgp_route_refresh_receive (struct peer *peer, bgp_size_t size)
                      break;
                    }
                }
-             peer->orf_plist[afi][safi] =
-               prefix_list_lookup (afi, name);
+
+             peer->orf_plist[afi][safi] = prefix_bgp_orf_lookup (afi, name);
            }
          stream_forward_getp (s, orf_len);
        }
@@ -1972,14 +1974,23 @@ bgp_route_refresh_receive (struct peer *peer, bgp_size_t size)
   if (CHECK_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_ORF_WAIT_REFRESH))
     UNSET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_ORF_WAIT_REFRESH);
 
-  /* If the peer is configured for default-originate clear the
-   * SUBGRP_STATUS_DEFAULT_ORIGINATE flag so that we will re-advertise the
-   * default
-   */
   paf = peer_af_find (peer, afi, safi);
-  if (paf && paf->subgroup &&
-      CHECK_FLAG (paf->subgroup->sflags, SUBGRP_STATUS_DEFAULT_ORIGINATE))
-    UNSET_FLAG (paf->subgroup->sflags, SUBGRP_STATUS_DEFAULT_ORIGINATE);
+  if (paf && paf->subgroup)
+    {
+      if (peer->orf_plist[afi][safi])
+        {
+          updgrp = PAF_UPDGRP(paf);
+          updgrp_peer = UPDGRP_PEER(updgrp);
+          updgrp_peer->orf_plist[afi][safi] = peer->orf_plist[afi][safi];
+        }
+
+      /* If the peer is configured for default-originate clear the
+       * SUBGRP_STATUS_DEFAULT_ORIGINATE flag so that we will re-advertise the
+       * default
+       */
+      if (CHECK_FLAG (paf->subgroup->sflags, SUBGRP_STATUS_DEFAULT_ORIGINATE))
+        UNSET_FLAG (paf->subgroup->sflags, SUBGRP_STATUS_DEFAULT_ORIGINATE);
+    }
 
   /* Perform route refreshment to the peer */
   bgp_announce_route (peer, afi, safi);
index 59dd04a9338c891091f56950105837faa4688e9a..820c3cfd9a9daef64cc72cce492d9edf899a6f19 100644 (file)
@@ -1296,6 +1296,11 @@ subgroup_announce_check (struct bgp_info *ri, struct update_subgroup *subgrp,
       {
        if (prefix_list_apply (peer->orf_plist[afi][safi], p) == PREFIX_DENY)
          {
+            if (bgp_debug_update(NULL, p, subgrp->update_group, 0))
+              zlog_debug ("%s [Update:SEND] %s/%d is filtered via ORF",
+                          peer->host,
+                          inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
+                          p->prefixlen);
            return 0;
          }
       }
index a280b55c114364d885d6125e52d99306d263aaca..c39c687823e735635cdc3b7b0bc974f6344887b5 100644 (file)
@@ -151,6 +151,7 @@ conf_copy (struct peer *dst, struct peer *src, afi_t afi, safi_t safi)
   dst->cap = src->cap;
   dst->af_cap[afi][safi] = src->af_cap[afi][safi];
   dst->afc_nego[afi][safi] = src->afc_nego[afi][safi];
+  dst->orf_plist[afi][safi] = src->orf_plist[afi][safi];
   dst->local_as = src->local_as;
   dst->change_local_as = src->change_local_as;
   dst->shared_network = src->shared_network;
@@ -372,12 +373,14 @@ updgrp_hash_key_make (void *p)
                     key);
 
   /*
-   * Every peer configured to be a lonesoul gets its own update group.
-   *
-   * Every route server client gets its own update group as well. Optimize
-   * later.
+   * There are certain peers that must get their own update-group:
+   * - lonesoul peers
+   * - route server clients
+   * - peers that negotiated ORF
    */
   if (CHECK_FLAG (peer->flags, PEER_FLAG_LONESOUL) ||
+      CHECK_FLAG (peer->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_RCV) ||
+      CHECK_FLAG (peer->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_OLD_RCV) ||
       CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT))
     key = jhash_1word (jhash (peer->host, strlen (peer->host), SEED2), key);
 
@@ -488,6 +491,8 @@ updgrp_hash_cmp (const void *p1, const void *p2)
     return 0;
 
   if ((CHECK_FLAG (pe1->flags, PEER_FLAG_LONESOUL) ||
+       CHECK_FLAG (pe1->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_RCV) ||
+       CHECK_FLAG (pe1->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_OLD_RCV) ||
        CHECK_FLAG (pe1->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT)) &&
       !sockunion_same (&pe1->su, &pe2->su))
     return 0;