summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--ryu/services/protocols/bgp/bgpspeaker.py25
-rw-r--r--ryu/services/protocols/bgp/peer.py14
-rw-r--r--ryu/services/protocols/bgp/rtconf/neighbors.py25
3 files changed, 43 insertions, 21 deletions
diff --git a/ryu/services/protocols/bgp/bgpspeaker.py b/ryu/services/protocols/bgp/bgpspeaker.py
index 25fb65fd..ce3eaedf 100644
--- a/ryu/services/protocols/bgp/bgpspeaker.py
+++ b/ryu/services/protocols/bgp/bgpspeaker.py
@@ -240,7 +240,8 @@ class BGPSpeaker(object):
next_hop=None, password=None, multi_exit_disc=None,
site_of_origins=None, is_route_server_client=False,
is_next_hop_self=False, local_address=None,
- local_port=None, connect_mode=DEFAULT_CONNECT_MODE):
+ local_port=None, local_as=None,
+ connect_mode=DEFAULT_CONNECT_MODE):
""" This method registers a new neighbor. The BGP speaker tries to
establish a bgp session with the peer (accepts a connection
from the peer and also tries to connect to it).
@@ -261,11 +262,14 @@ class BGPSpeaker(object):
``enable_vpnv6`` enables VPNv6 address family for this
neighbor. The default is False.
+ ``enable_enhanced_refresh`` enable Enhanced Route Refresh for this
+ neighbor. The default is False.
+
``next_hop`` specifies the next hop IP address. If not
specified, host's ip address to access to a peer is used.
``password`` is used for the MD5 authentication if it's
- specified. By default, the MD5 authenticaiton is disabled.
+ specified. By default, the MD5 authentication is disabled.
``multi_exit_disc`` specifies multi exit discriminator (MED) value.
The default is None and if not specified, MED value is
@@ -280,17 +284,19 @@ class BGPSpeaker(object):
``is_next_hop_self`` specifies whether the BGP speaker announces
its own ip address to iBGP neighbor or not as path's next_hop address.
- ``connect_mode`` specifies how to connect to this neighbor.
- CONNECT_MODE_ACTIVE tries to connect from us.
- CONNECT_MODE_PASSIVE just listens and wait for the connection.
- CONNECT_MODE_BOTH use both methods.
- The default is CONNECT_MODE_BOTH
-
``local_address`` specifies Loopback interface address for
iBGP peering.
``local_port`` specifies source TCP port for iBGP peering.
+ ``local_as`` specifies local AS number per-peer.
+ The default is the AS number of BGPSpeaker instance.
+
+ ``connect_mode`` specifies how to connect to this neighbor.
+ CONNECT_MODE_ACTIVE tries to connect from us.
+ CONNECT_MODE_PASSIVE just listens and wait for the connection.
+ CONNECT_MODE_BOTH use both methods.
+ The default is CONNECT_MODE_BOTH.
"""
bgp_neighbor = {}
bgp_neighbor[neighbors.IP_ADDRESS] = address
@@ -328,6 +334,9 @@ class BGPSpeaker(object):
if local_port:
bgp_neighbor[LOCAL_PORT] = local_port
+ if local_as:
+ bgp_neighbor[LOCAL_AS] = local_as
+
call('neighbor.create', **bgp_neighbor)
def neighbor_del(self, address):
diff --git a/ryu/services/protocols/bgp/peer.py b/ryu/services/protocols/bgp/peer.py
index 5c148066..53582b3a 100644
--- a/ryu/services/protocols/bgp/peer.py
+++ b/ryu/services/protocols/bgp/peer.py
@@ -390,6 +390,10 @@ class Peer(Source, Sink, NeighborConfListener, Activity):
return self._neigh_conf.multi_exit_disc
@property
+ def local_as(self):
+ return self._neigh_conf.local_as
+
+ @property
def in_filters(self):
return self._in_filters
@@ -918,9 +922,9 @@ class Peer(Source, Sink, NeighborConfListener, Activity):
if (len(path_seg_list) > 0 and
isinstance(path_seg_list[0], list) and
len(path_seg_list[0]) < 255):
- path_seg_list[0].insert(0, self._core_service.asn)
+ path_seg_list[0].insert(0, self.local_as)
else:
- path_seg_list.insert(0, [self._core_service.asn])
+ path_seg_list.insert(0, [self.local_as])
aspath_attr = BGPPathAttributeAsPath(path_seg_list)
# MULTI_EXIT_DISC Attribute.
@@ -1186,7 +1190,7 @@ class Peer(Source, Sink, NeighborConfListener, Activity):
Current setting include capabilities, timers and ids.
"""
- asnum = self._common_conf.local_as
+ asnum = self.local_as
bgpid = self._common_conf.router_id
holdtime = self._neigh_conf.hold_time
@@ -1369,7 +1373,7 @@ class Peer(Source, Sink, NeighborConfListener, Activity):
aspath = umsg_pattrs.get(BGP_ATTR_TYPE_AS_PATH)
# Check if AS_PATH has loops.
- if aspath.has_local_as(self._common_conf.local_as):
+ if aspath.has_local_as(self.local_as):
LOG.error('Update message AS_PATH has loops. Ignoring this'
' UPDATE. %s', update_msg)
return
@@ -1497,7 +1501,7 @@ class Peer(Source, Sink, NeighborConfListener, Activity):
aspath = umsg_pattrs.get(BGP_ATTR_TYPE_AS_PATH)
# Check if AS_PATH has loops.
- if aspath.has_local_as(self._common_conf.local_as):
+ if aspath.has_local_as(self.local_as):
LOG.error('Update message AS_PATH has loops. Ignoring this'
' UPDATE. %s', update_msg)
return
diff --git a/ryu/services/protocols/bgp/rtconf/neighbors.py b/ryu/services/protocols/bgp/rtconf/neighbors.py
index 4ab0d576..a12af816 100644
--- a/ryu/services/protocols/bgp/rtconf/neighbors.py
+++ b/ryu/services/protocols/bgp/rtconf/neighbors.py
@@ -74,6 +74,7 @@ ENABLED = 'enabled'
CHANGES = 'changes'
LOCAL_ADDRESS = 'local_address'
LOCAL_PORT = 'local_port'
+LOCAL_AS = 'local_as'
PEER_NEXT_HOP = 'peer_next_hop'
PASSWORD = 'password'
IN_FILTER = 'in_filter'
@@ -299,7 +300,7 @@ class NeighborConf(ConfWithId, ConfWithStats):
CAP_RTC, RTC_AS, HOLD_TIME,
ENABLED, MULTI_EXIT_DISC, MAX_PREFIXES,
ADVERTISE_PEER_AS, SITE_OF_ORIGINS,
- LOCAL_ADDRESS, LOCAL_PORT,
+ LOCAL_ADDRESS, LOCAL_PORT, LOCAL_AS,
PEER_NEXT_HOP, PASSWORD,
IN_FILTER, OUT_FILTER,
IS_ROUTE_SERVER_CLIENT, CHECK_FIRST_AS,
@@ -366,6 +367,13 @@ class NeighborConf(ConfWithId, ConfWithStats):
self._settings[LOCAL_PORT] = compute_optional_conf(
LOCAL_PORT, None, **kwargs)
+ # We use the global defined local (router) AS as the default
+ # local AS.
+ from ryu.services.protocols.bgp.core_manager import CORE_MANAGER
+ g_local_as = CORE_MANAGER.common_conf.local_as
+ self._settings[LOCAL_AS] = compute_optional_conf(
+ LOCAL_AS, g_local_as, **kwargs)
+
self._settings[PEER_NEXT_HOP] = compute_optional_conf(
PEER_NEXT_HOP, None, **kwargs)
@@ -373,14 +381,11 @@ class NeighborConf(ConfWithId, ConfWithStats):
PASSWORD, None, **kwargs)
# RTC configurations.
- self._settings[CAP_RTC] = \
- compute_optional_conf(CAP_RTC, DEFAULT_CAP_RTC, **kwargs)
+ self._settings[CAP_RTC] = compute_optional_conf(
+ CAP_RTC, DEFAULT_CAP_RTC, **kwargs)
# Default RTC_AS is local (router) AS.
- from ryu.services.protocols.bgp.core_manager import \
- CORE_MANAGER
- default_rt_as = CORE_MANAGER.common_conf.local_as
- self._settings[RTC_AS] = \
- compute_optional_conf(RTC_AS, default_rt_as, **kwargs)
+ self._settings[RTC_AS] = compute_optional_conf(
+ RTC_AS, g_local_as, **kwargs)
# Since ConfWithId' default values use str(self) and repr(self), we
# call super method after we have initialized other settings.
@@ -437,6 +442,10 @@ class NeighborConf(ConfWithId, ConfWithStats):
# =========================================================================
@property
+ def local_as(self):
+ return self._settings[LOCAL_AS]
+
+ @property
def hold_time(self):
return self._settings[HOLD_TIME]