On Fri, 18 Jul 2014 15:09:12 +0900
Hiroshi Yokoi <[email protected]> wrote:

> I changed codes to check ENHANCED_ROUTE_REFRESH capability for simplicity.
> 
> Signed-off-by: Hiroshi Yokoi <[email protected]>
> ---
>  ryu/services/protocols/bgp/speaker.py | 29 ++++++++++++++---------------
>  1 file changed, 14 insertions(+), 15 deletions(-)
> 
> diff --git a/ryu/services/protocols/bgp/speaker.py 
> b/ryu/services/protocols/bgp/speaker.py
> index d079d6f..faaf8e4 100644
> --- a/ryu/services/protocols/bgp/speaker.py
> +++ b/ryu/services/protocols/bgp/speaker.py
> @@ -173,16 +173,12 @@ class BgpProtocol(Protocol, Activity):
>          if not self.recv_open_msg:
>              raise ValueError('Did not yet receive peers open message.')
>  
> -        err_cap_enabled = False
> -        local_cap = self.sent_open_msg.caps
> -        peer_cap = self.recv_open_msg.caps
> -        # Both local and peer should advertise ERR capability for it to be
> -        # enabled.
> -        if (local_cap.get(BGP_CAP_ENHANCED_ROUTE_REFRESH) and
> -                peer_cap.get(BGP_CAP_ENHANCED_ROUTE_REFRESH)):
> -            err_cap_enabled = True

Let's avoid a virtual long line.

> +        for cap in set(self.sent_open_msg.opt_param) \
> +                & set(self.recv_open_msg.opt_param):
> +            if cap.cap_code == BGP_CAP_ENHANCED_ROUTE_REFRESH:
> +                return True
>  
> -        return err_cap_enabled
> +        return False
>  
>      def _check_route_fmly_adv(self, open_msg, route_family):
>          match_found = False
> @@ -218,19 +214,22 @@ class BgpProtocol(Protocol, Activity):
>  
>      @property
>      def negotiated_afs(self):
> -        local_caps = self.sent_open_msg.caps
> -        remote_caps = self.recv_open_msg.caps
> +        local_caps = self.sent_open_msg.opt_param
> +        remote_caps = self.recv_open_msg.opt_param
> +
> +        local_mbgp_cap = [cap for cap in local_caps
> +                          if cap.cap_code == BGP_CAP_MULTIPROTOCOL]
> +        remote_mbgp_cap = [cap for cap in remote_caps
> +                           if cap.cap_code == BGP_CAP_MULTIPROTOCOL]

Could we do like the above?

> -        local_mbgp_cap = local_caps.get(BGP_CAP_MULTIPROTOCOL)
> -        remote_mbgp_cap = remote_caps.get(BGP_CAP_MULTIPROTOCOL)
>          # Check MP_BGP capabilities were advertised.
>          if local_mbgp_cap and remote_mbgp_cap:
>              local_families = {
> -                (peer_cap.route_family.afi, peer_cap.route_family.safi)
> +                (peer_cap.afi, peer_cap.safi)
>                  for peer_cap in local_mbgp_cap
>              }
>              remote_families = {
> -                (peer_cap.route_family.afi, peer_cap.route_family.safi)
> +                (peer_cap.afi, peer_cap.safi)
>                  for peer_cap in remote_mbgp_cap
>              }
>              afi_safi = local_families.intersection(remote_families)
> -- 

How about this?

diff --git a/ryu/services/protocols/bgp/speaker.py 
b/ryu/services/protocols/bgp/speaker.py
index d079d6f..4471909 100644
--- a/ryu/services/protocols/bgp/speaker.py
+++ b/ryu/services/protocols/bgp/speaker.py
@@ -173,16 +173,12 @@ class BgpProtocol(Protocol, Activity):
         if not self.recv_open_msg:
             raise ValueError('Did not yet receive peers open message.')
 
-        err_cap_enabled = False
-        local_cap = self.sent_open_msg.caps
-        peer_cap = self.recv_open_msg.caps
-        # Both local and peer should advertise ERR capability for it to be
-        # enabled.
-        if (local_cap.get(BGP_CAP_ENHANCED_ROUTE_REFRESH) and
-                peer_cap.get(BGP_CAP_ENHANCED_ROUTE_REFRESH)):
-            err_cap_enabled = True
-
-        return err_cap_enabled
+        local_caps = self.sent_open_msg.caps
+        remote_caps = self.recv_open_msg.caps
+        for cap in set(local_caps) & set(remote_caps):
+            if cap.cap_code == BGP_CAP_ENHANCED_ROUTE_REFRESH:
+                return True
+        return False
 
     def _check_route_fmly_adv(self, open_msg, route_family):
         match_found = False
@@ -218,19 +214,20 @@ class BgpProtocol(Protocol, Activity):
 
     @property
     def negotiated_afs(self):
-        local_caps = self.sent_open_msg.caps
-        remote_caps = self.recv_open_msg.caps
+        local_caps = self.sent_open_msg.opt_param
+        remote_caps = self.recv_open_msg.opt_param
+
+        mbgp_cap = [cap for cap in set(local_caps) & set(remote_caps)
+                    if cap.cap_code == BGP_CAP_MULTIPROTOCOL]
 
-        local_mbgp_cap = local_caps.get(BGP_CAP_MULTIPROTOCOL)
-        remote_mbgp_cap = remote_caps.get(BGP_CAP_MULTIPROTOCOL)
         # Check MP_BGP capabilities were advertised.
-        if local_mbgp_cap and remote_mbgp_cap:
+        if mbgp_cap:
             local_families = {
-                (peer_cap.route_family.afi, peer_cap.route_family.safi)
+                (peer_cap.afi, peer_cap.safi)
                 for peer_cap in local_mbgp_cap
             }
             remote_families = {
-                (peer_cap.route_family.afi, peer_cap.route_family.safi)
+                (peer_cap.afi, peer_cap.safi)
                 for peer_cap in remote_mbgp_cap
             }
             afi_safi = local_families.intersection(remote_families)

------------------------------------------------------------------------------
Want fast and easy access to all the code in your enterprise? Index and
search up to 200,000 lines of code with a free copy of Black Duck
Code Sight - the same software that powers the world's largest code
search on Ohloh, the Black Duck Open Hub! Try it now.
http://p.sf.net/sfu/bds
_______________________________________________
Ryu-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ryu-devel

Reply via email to