Hi,

Thank you for pointing out!

I searched Ryu BGP source code, currently, Ryu seems to support only type 0 RT.
  
https://github.com/osrg/ryu/blob/master/ryu/services/protocols/bgp/info_base/vrf.py#L269-L282

For a short fix, how about the following?
(Not enough tested, though...)


$ git diff
diff --git a/ryu/services/protocols/bgp/info_base/vrf.py 
b/ryu/services/protocols/bgp/info_base/vrf.py
index c4e41ef..4de5b4e 100644
--- a/ryu/services/protocols/bgp/info_base/vrf.py
+++ b/ryu/services/protocols/bgp/info_base/vrf.py
@@ -21,6 +21,8 @@ import abc
 import logging
 import six
 
+import netaddr
+
 from ryu.lib.packet.bgp import BGP_ATTR_TYPE_ORIGIN
 from ryu.lib.packet.bgp import BGP_ATTR_TYPE_AS_PATH
 from ryu.lib.packet.bgp import BGP_ATTR_TYPE_EXTENDED_COMMUNITIES
@@ -31,6 +33,8 @@ from ryu.lib.packet.bgp import BGPPathAttributeAsPath
 from ryu.lib.packet.bgp import EvpnEthernetSegmentNLRI
 from ryu.lib.packet.bgp import BGPPathAttributeExtendedCommunities
 from ryu.lib.packet.bgp import BGPTwoOctetAsSpecificExtendedCommunity
+from ryu.lib.packet.bgp import BGPIPv4AddressSpecificExtendedCommunity
+from ryu.lib.packet.bgp import BGPFourOctetAsSpecificExtendedCommunity
 from ryu.lib.packet.bgp import BGPPathAttributeMultiExitDisc
 from ryu.lib.packet.bgp import BGPEncapsulationExtendedCommunity
 from ryu.lib.packet.bgp import BGPEvpnEsiLabelExtendedCommunity
@@ -266,20 +270,34 @@ class VrfTable(Table):
                                    subtype=subtype,
                                    es_import=es_import))
 
+            def _create_rt_ext_com(route_target, subtype):
+                global_admin, local_admin = route_target.split(':')
+                if netaddr.valid_ipv4(global_admin):
+                    com = BGPIPv4AddressSpecificExtendedCommunity(
+                        subtype=subtype,
+                        ipv4_address=global_admin,
+                        local_administrator=int(local_admin))
+                elif (global_admin.isdigit()
+                      and 0 <= int(global_admin) <= 0xffff):
+                    com = BGPTwoOctetAsSpecificExtendedCommunity(
+                        subtype=subtype,
+                        as_number=int(global_admin),
+                        local_administrator=int(local_admin))
+                elif (global_admin.isdigit()
+                      and 0xffff < int(global_admin) <= 0xffffffff):
+                    com = BGPFourOctetAsSpecificExtendedCommunity(
+                        subtype=subtype,
+                        as_number=int(global_admin),
+                        local_administrator=int(local_admin))
+                else:
+                    raise ValueError(
+                        'Invalid route target: %s' % route_target)
+                return com
+
             for rt in vrf_conf.export_rts:
-                as_num, local_admin = rt.split(':')
-                subtype = 2
-                communities.append(BGPTwoOctetAsSpecificExtendedCommunity(
-                                   as_number=int(as_num),
-                                   local_administrator=int(local_admin),
-                                   subtype=subtype))
+                communities.append(_create_rt_ext_com(rt, 2))
             for soo in vrf_conf.soo_list:
-                as_num, local_admin = soo.split(':')
-                subtype = 3
-                communities.append(BGPTwoOctetAsSpecificExtendedCommunity(
-                                   as_number=int(as_num),
-                                   local_administrator=int(local_admin),
-                                   subtype=subtype))
+                communities.append(_create_rt_ext_com(soo, 3))
 
             # Set Tunnel Encapsulation Attribute
             tunnel_type = kwargs.get('tunnel_type', None)


Thanks,
Iwase


On 2017年01月27日 21:52, Albert Siersema wrote:
> Hi all,
> 
> Is anyone working on BGP auto RD support, which in turn needs support  
> for the "IP address" RD notation:
>    <IP address>:<ID e.g. VNI>
> instead of <ASN-2>:<ID>
> Or have I overlooked something in the code which already enables these  
> features ?
> If not I'll have a go at implementing this.
> 
> I tried the following:
> 
> vni = 655370
> loopback_IP = "10.1.1.1"
> evpn_route_dist='{}:{}'.format(loopback_IP, vni)
> speaker.vrf_add(
>      route_dist=evpn_route_dist,
>      route_family=RF_L2_EVPN,
>      import_rts=[evpn_route_dist],
>      export_rts=[evpn_route_dist]
> )
> 
> Traceback (most recent call last):
>    File  
> "/usr/local/lib/python2.7/dist-packages/ryu/services/protocols/bgp/api/base.py",
>  line 205, in  
> call
>      return call(**kwargs)
>    File  
> "/usr/local/lib/python2.7/dist-packages/ryu/services/protocols/bgp/api/base.py",
>  line 173, in  
> wrapped_fun
>      return func(*req_values, **opt_items)
>    File  
> "/usr/local/lib/python2.7/dist-packages/ryu/services/protocols/bgp/api/prefix.py",
>  line 308, in  
> add_evpn_local
>      route_type=route_type, **kwargs)
>    File  
> "/usr/local/lib/python2.7/dist-packages/ryu/services/protocols/bgp/core_managers/table_manager.py",
>  line 576, in  
> update_vrf_table
>      pmsi_tunnel_type=pmsi_tunnel_type)
>    File  
> "/usr/local/lib/python2.7/dist-packages/ryu/services/protocols/bgp/info_base/vrf.py",
>  line 274, in  
> insert_vrf_path
>      as_number=int(as_num),
> ValueError: invalid literal for int() with base 10: '10.1.1.1'
> 
> Traceback (most recent call last):
>    File "./bgp-ryu.py", line 198, in <module>
>      bgp_speaker = myBGP()
>    File "./bgp-ryu.py", line 51, in __init__
>      self.start_BGP()
>    File "./bgp-ryu.py", line 164, in start_BGP
>      next_hop=loopback_IPv4,
>    File  
> "/usr/local/lib/python2.7/dist-packages/ryu/services/protocols/bgp/bgpspeaker.py",
>  line 671, in  
> evpn_prefix_add
>      call(func_name, **kwargs)
>    File  
> "/usr/local/lib/python2.7/dist-packages/ryu/services/protocols/bgp/api/base.py",
>  line 211, in  
> call
>      raise ApiException(desc=str(e))
> ryu.services.protocols.bgp.api.base.ApiException: 500.1 - invalid  
> literal for int() with base 10: '10.1.1.1'
> 
> 
> Or converting the IP address to int (like an 4-byte ASN):
> 
> vni = 655370
> loopback_IP = "10.1.1.1"
> IPv4_as_int = int(ipaddress.IPv4Address(unicode(loopback_IP)))
> evpn_route_dist='{}:{}'.format(IPv4_as_int, vni)
> speaker.vrf_add(
>      route_dist=evpn_route_dist,
>      route_family=RF_L2_EVPN,
>      import_rts=[evpn_route_dist],
>      export_rts=[evpn_route_dist]
> )
> 
> File "/usr/local/lib/python2.7/dist-packages/ryu/lib/packet/bgp.py",  
> line 193, in serialize_value
>      return struct.pack(self._VALUE_PACK_STR, *args)
> error: 'H' format requires 0 <= number <= 65535
> 
> 
> https://tools.ietf.org/html/draft-ietf-l2vpn-evpn-11#section-7.9
> "It is RECOMMENDED to use the Type 1 RD [RFC4364].  The value field
>   comprises an IP address of the PE (typically, the loopback address)
>   followed by a number unique to the PE.  This number may be generated by the
>   PE.  Or in the Unique VLAN EVPN case, the low order 12 bits may be the 12
>   bit VLAN ID, with the remaining high order 4 bits set to 0"
> Also: https://tools.ietf.org/html/rfc4364#section-4.2
> 
> Although the RFC's mention "Type 1 RD" limited to 12 bit VLAN ID's,  
> RD's can actually be composed of 2-byte ASN, 4-byte ASN plus VXLAN  
> VNI's.
> 
> Working support for auto generated RD/RT is implemented by various  
> vendors, e.g. :
> 
> Cumulus "Enable EVPN with Automatic RDs and RTs":
>    router bgp 65000
>      address-family evpn
>      neighbor swp1 activate
>      advertise-vni
> 
> Juniper
>    vrf-target {
>      community;
>      auto
>      import community-name;
>      export community-name;
>    }
> 
> Cisco (NX-OS):
>    evpn
>      vni <VNI> l2
>        rd auto
>        route-target import auto
>        route-target export auto
> 
> 
> Regards,
> Albert
> 
> 
> ------------------------------------------------------------------------------
> Check out the vibrant tech community on one of the world's most
> engaging tech sites, SlashDot.org! http://sdm.link/slashdot
> _______________________________________________
> Ryu-devel mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/ryu-devel
> 

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, SlashDot.org! http://sdm.link/slashdot
_______________________________________________
Ryu-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ryu-devel

Reply via email to