Currently, BGPSpeaker will listen the incoming connection with the
unspecified IP addresses ('0.0.0.0' and '::').

This patch enables to specify the local listen address list for starting
BGPSpeaker instance.

Signed-off-by: IWASE Yusuke <iwase.yusu...@gmail.com>
---
 ryu/services/protocols/bgp/base.py            |  2 +-
 ryu/services/protocols/bgp/bgp_sample_conf.py |  3 +++
 ryu/services/protocols/bgp/bgpspeaker.py      |  6 ++++++
 ryu/services/protocols/bgp/core.py            | 16 ++++++++--------
 ryu/services/protocols/bgp/rtconf/common.py   | 25 +++++++++++++++++++++++--
 5 files changed, 41 insertions(+), 11 deletions(-)

diff --git a/ryu/services/protocols/bgp/base.py 
b/ryu/services/protocols/bgp/base.py
index 6295ed9..d5975dd 100644
--- a/ryu/services/protocols/bgp/base.py
+++ b/ryu/services/protocols/bgp/base.py
@@ -363,7 +363,7 @@ class Activity(object):
 
         For each connection `server_factory` starts a new protocol.
         """
-        info = socket.getaddrinfo(None, loc_addr[1], socket.AF_UNSPEC,
+        info = socket.getaddrinfo(loc_addr[0], loc_addr[1], socket.AF_UNSPEC,
                                   socket.SOCK_STREAM, 0, socket.AI_PASSIVE)
         listen_sockets = {}
         for res in info:
diff --git a/ryu/services/protocols/bgp/bgp_sample_conf.py 
b/ryu/services/protocols/bgp/bgp_sample_conf.py
index efdee69..e3f686c 100644
--- a/ryu/services/protocols/bgp/bgp_sample_conf.py
+++ b/ryu/services/protocols/bgp/bgp_sample_conf.py
@@ -48,6 +48,9 @@ BGP = {
     # Default local preference
     'local_pref': 100,
 
+    # List of TCP listen host addresses.
+    'bgp_server_hosts': ['0.0.0.0', '::'],
+
     # List of BGP neighbors.
     # The parameters for each neighbor are the same as the arguments of
     # BGPSpeaker.neighbor_add() method.
diff --git a/ryu/services/protocols/bgp/bgpspeaker.py 
b/ryu/services/protocols/bgp/bgpspeaker.py
index c93eacb..4ffcd82 100644
--- a/ryu/services/protocols/bgp/bgpspeaker.py
+++ b/ryu/services/protocols/bgp/bgpspeaker.py
@@ -70,7 +70,9 @@ from ryu.services.protocols.bgp.api.prefix import (
 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 CLUSTER_ID
+from ryu.services.protocols.bgp.rtconf.common import BGP_SERVER_HOSTS
 from ryu.services.protocols.bgp.rtconf.common import BGP_SERVER_PORT
+from ryu.services.protocols.bgp.rtconf.common import DEFAULT_BGP_SERVER_HOSTS
 from ryu.services.protocols.bgp.rtconf.common import DEFAULT_BGP_SERVER_PORT
 from ryu.services.protocols.bgp.rtconf.common import (
     DEFAULT_REFRESH_MAX_EOR_TIME, DEFAULT_REFRESH_STALEPATH_TIME)
@@ -218,6 +220,7 @@ class EventPrefix(object):
 
 class BGPSpeaker(object):
     def __init__(self, as_number, router_id,
+                 bgp_server_hosts=DEFAULT_BGP_SERVER_HOSTS,
                  bgp_server_port=DEFAULT_BGP_SERVER_PORT,
                  refresh_stalepath_time=DEFAULT_REFRESH_STALEPATH_TIME,
                  refresh_max_eor_time=DEFAULT_REFRESH_MAX_EOR_TIME,
@@ -239,6 +242,8 @@ class BGPSpeaker(object):
         ``router_id`` specifies BGP router identifier. It must be the
         string representation of an IPv4 address (e.g. 10.0.0.1).
 
+        ``bgp_server_host`` specifies a list of TCP listen host addresses.
+
         ``bgp_server_port`` specifies TCP listen port number. 179 is
         used if not specified.
 
@@ -297,6 +302,7 @@ class BGPSpeaker(object):
         settings = {
             LOCAL_AS: as_number,
             ROUTER_ID: router_id,
+            BGP_SERVER_HOSTS: bgp_server_hosts,
             BGP_SERVER_PORT: bgp_server_port,
             REFRESH_STALEPATH_TIME: refresh_stalepath_time,
             REFRESH_MAX_EOR_TIME: refresh_max_eor_time,
diff --git a/ryu/services/protocols/bgp/core.py 
b/ryu/services/protocols/bgp/core.py
index 74f2341..cfb296e 100644
--- a/ryu/services/protocols/bgp/core.py
+++ b/ryu/services/protocols/bgp/core.py
@@ -224,17 +224,17 @@ class CoreService(Factory, Activity):
             self._spawn_activity(peer, self.start_protocol)
 
         # Reactively establish bgp-session with peer by listening on
-        # server port for connection requests.
-        server_addr = (CORE_IP, self._common_config.bgp_server_port)
+        # the given server hosts and port for connection requests.
         waiter = kwargs.pop('waiter')
         waiter.set()
+        self.listen_sockets = {}
         if self._common_config.bgp_server_port != 0:
-            server_thread, sockets = self._listen_tcp(server_addr,
-                                                      self.start_protocol)
-            self.listen_sockets = sockets
-            server_thread.wait()
-        else:
-            self.listen_sockets = {}
+            for host in self._common_config.bgp_server_hosts:
+                server_thread, sockets = self._listen_tcp(
+                    (host, self._common_config.bgp_server_port),
+                    self.start_protocol)
+                self.listen_sockets.update(sockets)
+                server_thread.wait()
         processor_thread.wait()
 
     # ========================================================================
diff --git a/ryu/services/protocols/bgp/rtconf/common.py 
b/ryu/services/protocols/bgp/rtconf/common.py
index f8427ca..b5bdef0 100644
--- a/ryu/services/protocols/bgp/rtconf/common.py
+++ b/ryu/services/protocols/bgp/rtconf/common.py
@@ -19,6 +19,8 @@
 import logging
 import numbers
 
+import netaddr
+
 from ryu.services.protocols.bgp.utils.validation import is_valid_ipv4
 from ryu.services.protocols.bgp.utils.validation import is_valid_asn
 
@@ -72,6 +74,7 @@ REFRESH_STALEPATH_TIME = 'refresh_stalepath_time'
 REFRESH_MAX_EOR_TIME = 'refresh_max_eor_time'
 
 BGP_CONN_RETRY_TIME = 'bgp_conn_retry_time'
+BGP_SERVER_HOSTS = 'bgp_server_hosts'
 BGP_SERVER_PORT = 'bgp_server_port'
 TCP_CONN_TIMEOUT = 'tcp_conn_timeout'
 MAX_PATH_EXT_RTFILTER_ALL = 'maximum_paths_external_rtfilter_all'
@@ -81,6 +84,7 @@ MAX_PATH_EXT_RTFILTER_ALL = 
'maximum_paths_external_rtfilter_all'
 DEFAULT_LABEL_RANGE = (100, 100000)
 DEFAULT_REFRESH_STALEPATH_TIME = 0
 DEFAULT_REFRESH_MAX_EOR_TIME = 0
+DEFAULT_BGP_SERVER_HOSTS = ('0.0.0.0', '::')
 DEFAULT_BGP_SERVER_PORT = 179
 DEFAULT_TCP_CONN_TIMEOUT = 30
 DEFAULT_BGP_CONN_RETRY_TIME = 30
@@ -170,6 +174,17 @@ def validate_label_range(label_range):
     return label_range
 
 
+@validate(name=BGP_SERVER_HOSTS)
+def validate_bgp_server_hosts(hosts):
+    for host in hosts:
+        if (not netaddr.valid_ipv4(host) and
+                not netaddr.valid_ipv6(host)):
+            raise ConfigTypeError(desc=('Invalid bgp sever hosts '
+                                        'configuration value %s' % hosts))
+
+    return hosts
+
+
 @validate(name=BGP_SERVER_PORT)
 def validate_bgp_server_port(server_port):
     if not isinstance(server_port, numbers.Integral):
@@ -243,8 +258,8 @@ class CommonConf(BaseConf):
     REQUIRED_SETTINGS = frozenset([ROUTER_ID, LOCAL_AS])
 
     OPTIONAL_SETTINGS = frozenset([REFRESH_STALEPATH_TIME,
-                                   REFRESH_MAX_EOR_TIME,
-                                   LABEL_RANGE, BGP_SERVER_PORT,
+                                   REFRESH_MAX_EOR_TIME, LABEL_RANGE,
+                                   BGP_SERVER_HOSTS, BGP_SERVER_PORT,
                                    TCP_CONN_TIMEOUT,
                                    BGP_CONN_RETRY_TIME,
                                    MAX_PATH_EXT_RTFILTER_ALL,
@@ -265,6 +280,8 @@ class CommonConf(BaseConf):
             REFRESH_STALEPATH_TIME, DEFAULT_REFRESH_STALEPATH_TIME, **kwargs)
         self._settings[REFRESH_MAX_EOR_TIME] = compute_optional_conf(
             REFRESH_MAX_EOR_TIME, DEFAULT_REFRESH_MAX_EOR_TIME, **kwargs)
+        self._settings[BGP_SERVER_HOSTS] = compute_optional_conf(
+            BGP_SERVER_HOSTS, DEFAULT_BGP_SERVER_HOSTS, **kwargs)
         self._settings[BGP_SERVER_PORT] = compute_optional_conf(
             BGP_SERVER_PORT, DEFAULT_BGP_SERVER_PORT, **kwargs)
         self._settings[TCP_CONN_TIMEOUT] = compute_optional_conf(
@@ -323,6 +340,10 @@ class CommonConf(BaseConf):
         return self._settings[LABEL_RANGE]
 
     @property
+    def bgp_server_hosts(self):
+        return self._settings[BGP_SERVER_HOSTS]
+
+    @property
     def bgp_server_port(self):
         return self._settings[BGP_SERVER_PORT]
 
-- 
2.7.4


------------------------------------------------------------------------------
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
Ryu-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ryu-devel

Reply via email to