summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--ryu/services/protocols/bgp/api/base.py1
-rw-r--r--ryu/services/protocols/bgp/bgpspeaker.py33
-rw-r--r--ryu/services/protocols/bgp/core_managers/table_manager.py2
3 files changed, 32 insertions, 4 deletions
diff --git a/ryu/services/protocols/bgp/api/base.py b/ryu/services/protocols/bgp/api/base.py
index e43f0745..eee243bf 100644
--- a/ryu/services/protocols/bgp/api/base.py
+++ b/ryu/services/protocols/bgp/api/base.py
@@ -40,6 +40,7 @@ NEXT_HOP = 'next_hop'
VPN_LABEL = 'label'
API_SYM = 'name'
ORIGIN_RD = 'origin_rd'
+ROUTE_FAMILY = 'route_family'
# API call registry
_CALL_REGISTRY = {}
diff --git a/ryu/services/protocols/bgp/bgpspeaker.py b/ryu/services/protocols/bgp/bgpspeaker.py
index fdd38dd8..615bf756 100644
--- a/ryu/services/protocols/bgp/bgpspeaker.py
+++ b/ryu/services/protocols/bgp/bgpspeaker.py
@@ -27,6 +27,7 @@ from ryu.services.protocols.bgp.api.base import call
from ryu.services.protocols.bgp.api.base import PREFIX
from ryu.services.protocols.bgp.api.base import NEXT_HOP
from ryu.services.protocols.bgp.api.base import ROUTE_DISTINGUISHER
+from ryu.services.protocols.bgp.api.base import ROUTE_FAMILY
from ryu.services.protocols.bgp.rtconf.common import LOCAL_AS
from ryu.services.protocols.bgp.rtconf.common import ROUTER_ID
from ryu.services.protocols.bgp.rtconf.common import BGP_SERVER_PORT
@@ -286,8 +287,7 @@ class BGPSpeaker(object):
neighbors.CHANGES: attribute_param}
call(func_name, **param)
- def prefix_add(self, prefix, next_hop=None, route_dist=None,
- route_family=None):
+ def prefix_add(self, prefix, next_hop=None, route_dist=None):
""" This method adds a new prefix to be advertized.
``prefix`` must be the string representation of an IP network
@@ -310,9 +310,26 @@ class BGPSpeaker(object):
if route_dist:
func_name = 'prefix.add_local'
networks[ROUTE_DISTINGUISHER] = route_dist
+
+ # check if the prefix address is IPv6 address
+ ip, masklen = prefix.split('/')
+ if netaddr.valid_ipv6(ip):
+ networks[ROUTE_FAMILY] = vrfs.VRF_RF_IPV6
+ # convert the next_hop address to IPv4-Mapped IPv6 Address
+ # if it is IPv4 address
+ if netaddr.valid_ipv4(next_hop):
+ networks[NEXT_HOP] = \
+ str(netaddr.IPAddress(next_hop).ipv6())
+
+ # normalize IPv6 address expression
+ networks[PREFIX] = \
+ str(netaddr.IPAddress(ip)) + '/' + masklen
+ else:
+ networks[ROUTE_FAMILY] = vrfs.VRF_RF_IPV4
+
call(func_name, **networks)
- def prefix_del(self, prefix, route_dist=None, route_family=None):
+ def prefix_del(self, prefix, route_dist=None):
""" This method deletes a advertized prefix.
``prefix`` must be the string representation of an IP network
@@ -329,6 +346,16 @@ class BGPSpeaker(object):
if route_dist:
func_name = 'prefix.delete_local'
networks[ROUTE_DISTINGUISHER] = route_dist
+
+ ip, masklen = prefix.split('/')
+ if netaddr.valid_ipv6(ip):
+ networks[ROUTE_FAMILY] = vrfs.VRF_RF_IPV6
+ # normalize IPv6 address expression
+ networks[PREFIX] = \
+ str(netaddr.IPAddress(ip)) + '/' + masklen
+ else:
+ networks[ROUTE_FAMILY] = vrfs.VRF_RF_IPV4
+
call(func_name, **networks)
def vrf_add(self, route_dist, import_rts, export_rts, site_of_origins=None,
diff --git a/ryu/services/protocols/bgp/core_managers/table_manager.py b/ryu/services/protocols/bgp/core_managers/table_manager.py
index 213afecf..fc927250 100644
--- a/ryu/services/protocols/bgp/core_managers/table_manager.py
+++ b/ryu/services/protocols/bgp/core_managers/table_manager.py
@@ -560,7 +560,7 @@ class TableCoreManager(object):
raise BgpCoreError(desc='Vrf for route distinguisher %s does '
'not exist.' % route_dist)
ip6, masklen = prefix.split('/')
- prefix = IP6AddrPrefix(int(masklen), ip)
+ prefix = IP6AddrPrefix(int(masklen), ip6)
# We do not check if we have a path to given prefix, we issue
# withdrawal. Hence multiple withdrawals have not side effect.
return vrf_table.insert_vrf_path(prefix, is_withdraw=True)