Make advertisement intervals for radvd configurable

Currently a global setting that is applied for all managed radvd
processes. Per-process setting could be done in the future.

For large clouds, it may be useful to increase the intervals, to reduce
multicast storms.

Co-Authored-By: Brian Haley <brian.haley@hpe.com>

DocImpact Router advertisement intervals for radvd are now configurable
Related-Bug: #1532338

Change-Id: I6cc313599f0ee12f7d51d073a22321221fca263f
This commit is contained in:
Sean M. Collins 2016-01-08 13:32:14 -08:00
parent d6d43b32ca
commit d9e4d20da8
3 changed files with 34 additions and 3 deletions

View File

@ -38,13 +38,19 @@ OPTS = [
cfg.StrOpt('ra_confs', cfg.StrOpt('ra_confs',
default='$state_path/ra', default='$state_path/ra',
help=_('Location to store IPv6 RA config files')), help=_('Location to store IPv6 RA config files')),
cfg.IntOpt('min_rtr_adv_interval',
default=3,
help=_('MinRtrAdvInterval setting for radvd.conf')),
cfg.IntOpt('max_rtr_adv_interval',
default=10,
help=_('MaxRtrAdvInterval setting for radvd.conf')),
] ]
CONFIG_TEMPLATE = jinja2.Template("""interface {{ interface_name }} CONFIG_TEMPLATE = jinja2.Template("""interface {{ interface_name }}
{ {
AdvSendAdvert on; AdvSendAdvert on;
MinRtrAdvInterval 3; MinRtrAdvInterval {{ min_rtr_adv_interval }};
MaxRtrAdvInterval 10; MaxRtrAdvInterval {{ max_rtr_adv_interval }};
{% if constants.DHCPV6_STATELESS in ra_modes %} {% if constants.DHCPV6_STATELESS in ra_modes %}
AdvOtherConfigFlag on; AdvOtherConfigFlag on;
@ -106,7 +112,9 @@ class DaemonMonitor(object):
interface_name=interface_name, interface_name=interface_name,
prefixes=auto_config_prefixes, prefixes=auto_config_prefixes,
dns_servers=dns_servers[0:MAX_RDNSS_ENTRIES], dns_servers=dns_servers[0:MAX_RDNSS_ENTRIES],
constants=constants)) constants=constants,
min_rtr_adv_interval=self._agent_conf.min_rtr_adv_interval,
max_rtr_adv_interval=self._agent_conf.max_rtr_adv_interval))
common_utils.replace_file(radvd_conf, buf.getvalue()) common_utils.replace_file(radvd_conf, buf.getvalue())
return radvd_conf return radvd_conf

View File

@ -2246,6 +2246,20 @@ class TestBasicRouterOperations(BasicRouterOperationsFramework):
assertFlag(managed_flag)('AdvManagedFlag on;', assertFlag(managed_flag)('AdvManagedFlag on;',
self.utils_replace_file.call_args[0][1]) self.utils_replace_file.call_args[0][1])
def test_generate_radvd_intervals(self):
self.conf.set_override('min_rtr_adv_interval', 22)
self.conf.set_override('max_rtr_adv_interval', 66)
router = l3_test_common.prepare_router_data()
ipv6_subnet_modes = [{'ra_mode': l3_constants.IPV6_SLAAC,
'address_mode': l3_constants.IPV6_SLAAC}]
ri = self._process_router_ipv6_subnet_added(router,
ipv6_subnet_modes)
ri.radvd._generate_radvd_conf(router[l3_constants.INTERFACE_KEY])
self.assertIn("MinRtrAdvInterval 22",
self.utils_replace_file.call_args[0][1])
self.assertIn("MaxRtrAdvInterval 66",
self.utils_replace_file.call_args[0][1])
def test_generate_radvd_rdnss_conf(self): def test_generate_radvd_rdnss_conf(self):
router = l3_test_common.prepare_router_data() router = l3_test_common.prepare_router_data()
ipv6_subnet_modes = [{'ra_mode': l3_constants.IPV6_SLAAC, ipv6_subnet_modes = [{'ra_mode': l3_constants.IPV6_SLAAC,

View File

@ -0,0 +1,9 @@
---
fixes:
- Prior to Mitaka, the settings that control the frequency of
router advertisements transmitted by the radvd daemon were
not able to be adjusted. Larger deployments may wish to decrease
the frequency in which radvd sends multicast traffic. The 'min_rtr_adv_interval'
and 'max_rtr_adv_interval' settings in the L3 agent configuration file
map directly to the 'MinRtrAdvInterval' and 'MaxRtrAdvInterval' in the generated
radvd.conf file. Consult the manpage for radvd.conf for more detailed information.