diff options
-rw-r--r-- | ryu/services/protocols/bgp/info_base/base.py | 10 | ||||
-rw-r--r-- | ryu/services/protocols/bgp/info_base/ipv4.py | 6 | ||||
-rw-r--r-- | ryu/services/protocols/bgp/info_base/ipv6.py | 6 | ||||
-rw-r--r-- | ryu/services/protocols/bgp/peer.py | 9 |
4 files changed, 24 insertions, 7 deletions
diff --git a/ryu/services/protocols/bgp/info_base/base.py b/ryu/services/protocols/bgp/info_base/base.py index 16212705..79bba2cb 100644 --- a/ryu/services/protocols/bgp/info_base/base.py +++ b/ryu/services/protocols/bgp/info_base/base.py @@ -821,6 +821,8 @@ class Filter(object): """ __metaclass__ = ABCMeta + ROUTE_FAMILY = RF_IPv4_UC + POLICY_DENY = 0 POLICY_PERMIT = 1 @@ -978,7 +980,7 @@ class PrefixFilter(Filter): """ - return PrefixFilter(self.prefix, - policy=self._policy, - ge=self._ge, - le=self._le) + return self.__class__(self.prefix, + policy=self._policy, + ge=self._ge, + le=self._le) diff --git a/ryu/services/protocols/bgp/info_base/ipv4.py b/ryu/services/protocols/bgp/info_base/ipv4.py index cf18c237..07cc8665 100644 --- a/ryu/services/protocols/bgp/info_base/ipv4.py +++ b/ryu/services/protocols/bgp/info_base/ipv4.py @@ -25,6 +25,7 @@ from ryu.services.protocols.bgp.info_base.base import Path from ryu.services.protocols.bgp.info_base.base import Table from ryu.services.protocols.bgp.info_base.base import Destination from ryu.services.protocols.bgp.info_base.base import NonVrfPathProcessingMixin +from ryu.services.protocols.bgp.info_base.base import PrefixFilter LOG = logging.getLogger('bgpspeaker.info_base.ipv4') @@ -83,3 +84,8 @@ class Ipv4Path(Path): super(Ipv4Path, self).__init__(*args, **kwargs) from ryu.services.protocols.bgp.info_base.vrf4 import Vrf4Path self.VRF_PATH_CLASS = Vrf4Path + + +class Ipv4PrefixFilter(PrefixFilter): + """IPv4 Prefix Filter class""" + ROUTE_FAMILY = RF_IPv4_UC diff --git a/ryu/services/protocols/bgp/info_base/ipv6.py b/ryu/services/protocols/bgp/info_base/ipv6.py index 01d68bb4..5c1cc75b 100644 --- a/ryu/services/protocols/bgp/info_base/ipv6.py +++ b/ryu/services/protocols/bgp/info_base/ipv6.py @@ -25,6 +25,7 @@ from ryu.services.protocols.bgp.info_base.base import Path from ryu.services.protocols.bgp.info_base.base import Table from ryu.services.protocols.bgp.info_base.base import Destination from ryu.services.protocols.bgp.info_base.base import NonVrfPathProcessingMixin +from ryu.services.protocols.bgp.info_base.base import PrefixFilter LOG = logging.getLogger('bgpspeaker.info_base.ipv6') @@ -83,3 +84,8 @@ class Ipv6Path(Path): super(Ipv6Path, self).__init__(*args, **kwargs) from ryu.services.protocols.bgp.info_base.vrf6 import Vrf6Path self.VRF_PATH_CLASS = Vrf6Path + + +class Ipv6PrefixFilter(PrefixFilter): + """IPv6 Prefix Filter class""" + ROUTE_FAMILY = RF_IPv6_UC diff --git a/ryu/services/protocols/bgp/peer.py b/ryu/services/protocols/bgp/peer.py index 5b141991..b2b42175 100644 --- a/ryu/services/protocols/bgp/peer.py +++ b/ryu/services/protocols/bgp/peer.py @@ -487,6 +487,9 @@ class Peer(Source, Sink, NeighborConfListener, Activity): blocked_cause = None for filter_ in filters: + if filter_.ROUTE_FAMILY != path.ROUTE_FAMILY: + continue + policy, is_matched = filter_.evaluate(path) if policy == PrefixFilter.POLICY_PERMIT and is_matched: block = False @@ -1352,7 +1355,7 @@ class Peer(Source, Sink, NeighborConfListener, Activity): self._adj_rib_in[nlri_str] = received_route self._signal_bus.adj_rib_in_changed(self, received_route) - if block: + if not block: # Update appropriate table with withdraws. tm = self._core_service.table_manager tm.learn_path(w_path) @@ -1444,7 +1447,7 @@ class Peer(Source, Sink, NeighborConfListener, Activity): self._adj_rib_in[nlri_str] = received_route self._signal_bus.adj_rib_in_changed(self, received_route) - if block: + if not block: if msg_rf == RF_RTC_UC \ and self._init_rtc_nlri_path is not None: self._init_rtc_nlri_path.append(new_path) @@ -1508,7 +1511,7 @@ class Peer(Source, Sink, NeighborConfListener, Activity): self._adj_rib_in[nlri_str] = received_route self._signal_bus.adj_rib_in_changed(self, received_route) - if block: + if not block: # Update appropriate table with withdraws. tm = self._core_service.table_manager tm.learn_path(w_path) |