summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorSatoshi Fujimoto <satoshi.fujimoto7@gmail.com>2017-04-04 14:44:52 +0900
committerFUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>2017-05-09 10:20:16 +0900
commit09fa78182f144a7219a3cdc285dcd72af929d99a (patch)
treeb6b10c70b8ca13d86a692ee9866ee684939dfa0f
parent2354bd7df38b67992408bb6bb357a31a934d844d (diff)
bgp: Enable to configure default local preference
This patch enables to configure the default local preference. If not specified, the value will be 100 as a default. Signed-off-by: Satoshi Fujimoto <satoshi.fujimoto7@gmail.com> Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
-rw-r--r--ryu/services/protocols/bgp/application.py4
-rw-r--r--ryu/services/protocols/bgp/bgp_sample_conf.py3
-rw-r--r--ryu/services/protocols/bgp/bgpspeaker.py9
-rw-r--r--ryu/services/protocols/bgp/peer.py6
-rw-r--r--ryu/services/protocols/bgp/rtconf/common.py20
5 files changed, 38 insertions, 4 deletions
diff --git a/ryu/services/protocols/bgp/application.py b/ryu/services/protocols/bgp/application.py
index 4663ddb8..d3236f61 100644
--- a/ryu/services/protocols/bgp/application.py
+++ b/ryu/services/protocols/bgp/application.py
@@ -43,6 +43,8 @@ from ryu.services.protocols.bgp.rtconf.common import LOCAL_AS
from ryu.services.protocols.bgp.rtconf.common import REFRESH_MAX_EOR_TIME
from ryu.services.protocols.bgp.rtconf.common import REFRESH_STALEPATH_TIME
from ryu.services.protocols.bgp.rtconf.common import ROUTER_ID
+from ryu.services.protocols.bgp.rtconf.common import LOCAL_PREF
+from ryu.services.protocols.bgp.rtconf.common import DEFAULT_LOCAL_PREF
from ryu.services.protocols.bgp.utils.validation import is_valid_ipv4
from ryu.services.protocols.bgp.utils.validation import is_valid_ipv6
@@ -262,6 +264,8 @@ class RyuBGPSpeaker(RyuApp):
LABEL_RANGE, DEFAULT_LABEL_RANGE)
bgp_settings['allow_local_as_in_count'] = settings.get(
'allow_local_as_in_count', 0)
+ bgp_settings[LOCAL_PREF] = settings.get(
+ LOCAL_PREF, DEFAULT_LOCAL_PREF)
# Create BGPSpeaker instance.
LOG.debug('Starting BGPSpeaker...')
diff --git a/ryu/services/protocols/bgp/bgp_sample_conf.py b/ryu/services/protocols/bgp/bgp_sample_conf.py
index e77ec578..01afd489 100644
--- a/ryu/services/protocols/bgp/bgp_sample_conf.py
+++ b/ryu/services/protocols/bgp/bgp_sample_conf.py
@@ -30,6 +30,9 @@ BGP = {
# BGP Router ID.
'router_id': '172.17.0.1',
+ # Default local preference
+ 'local_pref': 100,
+
# 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 d943082a..cfb0c8e4 100644
--- a/ryu/services/protocols/bgp/bgpspeaker.py
+++ b/ryu/services/protocols/bgp/bgpspeaker.py
@@ -72,6 +72,8 @@ from ryu.services.protocols.bgp.rtconf.common import REFRESH_MAX_EOR_TIME
from ryu.services.protocols.bgp.rtconf.common import REFRESH_STALEPATH_TIME
from ryu.services.protocols.bgp.rtconf.common import LABEL_RANGE
from ryu.services.protocols.bgp.rtconf.common import ALLOW_LOCAL_AS_IN_COUNT
+from ryu.services.protocols.bgp.rtconf.common import LOCAL_PREF
+from ryu.services.protocols.bgp.rtconf.common import DEFAULT_LOCAL_PREF
from ryu.services.protocols.bgp.rtconf import neighbors
from ryu.services.protocols.bgp.rtconf import vrfs
from ryu.services.protocols.bgp.rtconf.base import CAP_MBGP_IPV4
@@ -198,7 +200,8 @@ class BGPSpeaker(object):
ssh_port=None, ssh_host=None, ssh_host_key=None,
label_range=DEFAULT_LABEL_RANGE,
allow_local_as_in_count=0,
- cluster_id=None):
+ cluster_id=None,
+ local_pref=DEFAULT_LOCAL_PREF):
"""Create a new BGPSpeaker object with as_number and router_id to
listen on bgp_server_port.
@@ -256,6 +259,9 @@ class BGPSpeaker(object):
``cluster_id`` specifies the cluster identifier for Route Reflector.
It must be the string representation of an IPv4 address.
If omitted, "router_id" is used for this field.
+
+ ``local_pref`` specifies the default local preference. It must be an
+ integer.
"""
super(BGPSpeaker, self).__init__()
@@ -269,6 +275,7 @@ class BGPSpeaker(object):
LABEL_RANGE: label_range,
ALLOW_LOCAL_AS_IN_COUNT: allow_local_as_in_count,
CLUSTER_ID: cluster_id,
+ LOCAL_PREF: local_pref,
}
self._core_start(settings)
self._init_signal_listeners()
diff --git a/ryu/services/protocols/bgp/peer.py b/ryu/services/protocols/bgp/peer.py
index c1398557..70b486c0 100644
--- a/ryu/services/protocols/bgp/peer.py
+++ b/ryu/services/protocols/bgp/peer.py
@@ -1162,8 +1162,10 @@ class Peer(Source, Sink, NeighborConfListener, Activity):
# For iBGP peers we are required to send local-pref attribute
# for connected or local prefixes. We check if the path matches
# attribute_maps and set local-pref value.
- # If the path doesn't match, we set default local-pref 100.
- localpref_attr = BGPPathAttributeLocalPref(100)
+ # If the path doesn't match, we set default local-pref given
+ # from the user. The default value is 100.
+ localpref_attr = BGPPathAttributeLocalPref(
+ self._common_conf.local_pref)
key = const.ATTR_MAPS_LABEL_DEFAULT
if isinstance(path, (Vpnv4Path, Vpnv6Path)):
diff --git a/ryu/services/protocols/bgp/rtconf/common.py b/ryu/services/protocols/bgp/rtconf/common.py
index 06cee45a..f8427caa 100644
--- a/ryu/services/protocols/bgp/rtconf/common.py
+++ b/ryu/services/protocols/bgp/rtconf/common.py
@@ -41,6 +41,7 @@ CLUSTER_ID = 'cluster_id'
LABEL_RANGE = 'label_range'
LABEL_RANGE_MAX = 'max'
LABEL_RANGE_MIN = 'min'
+LOCAL_PREF = 'local_pref'
# Similar to Cisco command 'allowas-in'. Allows the local ASN in the path.
# Facilitates auto rd, auto rt import/export
@@ -85,6 +86,7 @@ DEFAULT_TCP_CONN_TIMEOUT = 30
DEFAULT_BGP_CONN_RETRY_TIME = 30
DEFAULT_MED = 0
DEFAULT_MAX_PATH_EXT_RTFILTER_ALL = True
+DEFAULT_LOCAL_PREF = 100
@validate(name=ALLOW_LOCAL_AS_IN_COUNT)
@@ -219,6 +221,15 @@ def validate_max_path_ext_rtfilter_all(max_path_ext_rtfilter_all):
return max_path_ext_rtfilter_all
+@validate(name=LOCAL_PREF)
+def validate_local_pref(local_pref):
+ if not isinstance(local_pref, numbers.Integral):
+ raise ConfigTypeError(desc=('Invalid local_pref'
+ ' configuration value %s' %
+ local_pref))
+ return local_pref
+
+
class CommonConf(BaseConf):
"""Encapsulates configurations applicable to all peer sessions.
@@ -238,7 +249,8 @@ class CommonConf(BaseConf):
BGP_CONN_RETRY_TIME,
MAX_PATH_EXT_RTFILTER_ALL,
ALLOW_LOCAL_AS_IN_COUNT,
- CLUSTER_ID])
+ CLUSTER_ID,
+ LOCAL_PREF])
def __init__(self, **kwargs):
super(CommonConf, self).__init__(**kwargs)
@@ -264,6 +276,8 @@ class CommonConf(BaseConf):
**kwargs)
self._settings[CLUSTER_ID] = compute_optional_conf(
CLUSTER_ID, kwargs[ROUTER_ID], **kwargs)
+ self._settings[LOCAL_PREF] = compute_optional_conf(
+ LOCAL_PREF, DEFAULT_LOCAL_PREF, **kwargs)
# =========================================================================
# Required attributes
@@ -316,6 +330,10 @@ class CommonConf(BaseConf):
def max_path_ext_rtfilter_all(self):
return self._settings[MAX_PATH_EXT_RTFILTER_ALL]
+ @property
+ def local_pref(self):
+ return self._settings[LOCAL_PREF]
+
@classmethod
def get_opt_settings(self):
self_confs = super(CommonConf, self).get_opt_settings()