summaryrefslogtreecommitdiff
path: root/cloudinit/net/sysconfig.py
diff options
context:
space:
mode:
authorHarald <hjensas@redhat.com>2019-11-20 18:55:27 +0100
committerRyan Harper <ryan.harper@canonical.com>2019-11-20 11:55:26 -0600
commit62bbc262c3c7f633eac1d09ec78c055eef05166a (patch)
tree4b372f78ee1ed1dbd7ede5ff09836e7ce396d457 /cloudinit/net/sysconfig.py
parent87bb30c7a282a2006f64205b570da25258f221f1 (diff)
downloadvyos-cloud-init-62bbc262c3c7f633eac1d09ec78c055eef05166a.tar.gz
vyos-cloud-init-62bbc262c3c7f633eac1d09ec78c055eef05166a.zip
net: IPv6, accept_ra, slaac, stateless (#51)
Router advertisements are required for the default route to be set up, thus accept_ra should be enabled for dhcpv6-stateful. sysconf: IPV6_FORCE_ACCEPT_RA controls accept_ra sysctl. eni: mode static and mode dhcp 'accept_ra' controls sysctl. Add 'accept-ra: true|false' parameter to config v1 and v2. When True: accept_ra is set to '1'. When False: accept_ra is set to '0'. When not defined in config the value is left to the operating system default. This change also extend the IPv6 support to distinguish between slaac and dhcpv6-stateless. SLAAC is autoconfig without any options from DHCP, while stateless auto-configures the address and the uses DHCP for other options. LP: #1806014 LP: #1808647
Diffstat (limited to 'cloudinit/net/sysconfig.py')
-rw-r--r--cloudinit/net/sysconfig.py34
1 files changed, 31 insertions, 3 deletions
diff --git a/cloudinit/net/sysconfig.py b/cloudinit/net/sysconfig.py
index fe0c67ca..310cdf01 100644
--- a/cloudinit/net/sysconfig.py
+++ b/cloudinit/net/sysconfig.py
@@ -14,7 +14,7 @@ from configobj import ConfigObj
from . import renderer
from .network_state import (
- is_ipv6_addr, net_prefix_to_ipv4_mask, subnet_is_ipv6)
+ is_ipv6_addr, net_prefix_to_ipv4_mask, subnet_is_ipv6, IPV6_DYNAMIC_TYPES)
LOG = logging.getLogger(__name__)
NM_CFG_FILE = "/etc/NetworkManager/NetworkManager.conf"
@@ -335,6 +335,9 @@ class Renderer(renderer.Renderer):
continue
iface_cfg[new_key] = old_value
+ if iface['accept-ra'] is not None:
+ iface_cfg['IPV6_FORCE_ACCEPT_RA'] = iface['accept-ra']
+
@classmethod
def _render_subnets(cls, iface_cfg, subnets, has_default_route):
# setting base values
@@ -351,6 +354,15 @@ class Renderer(renderer.Renderer):
iface_cfg['DHCPV6C'] = True
elif subnet_type == 'ipv6_dhcpv6-stateless':
iface_cfg['IPV6INIT'] = True
+ # Configure network settings using SLAAC from RAs and optional
+ # info from dhcp server using DHCPv6
+ iface_cfg['IPV6_AUTOCONF'] = True
+ iface_cfg['DHCPV6C'] = True
+ # Use Information-request to get only stateless configuration
+ # parameters (i.e., without address).
+ iface_cfg['DHCPV6C_OPTIONS'] = '-S'
+ elif subnet_type == 'ipv6_slaac':
+ iface_cfg['IPV6INIT'] = True
# Configure network settings using SLAAC from RAs
iface_cfg['IPV6_AUTOCONF'] = True
elif subnet_type in ['dhcp4', 'dhcp']:
@@ -398,10 +410,15 @@ class Renderer(renderer.Renderer):
# metric may apply to both dhcp and static config
if 'metric' in subnet:
iface_cfg['METRIC'] = subnet['metric']
+ # TODO(hjensas): Including dhcp6 here is likely incorrect. DHCPv6
+ # does not ever provide a default gateway, the default gateway
+ # come from RA's. (https://github.com/openSUSE/wicked/issues/570)
if subnet_type in ['dhcp', 'dhcp4', 'dhcp6']:
if has_default_route and iface_cfg['BOOTPROTO'] != 'none':
iface_cfg['DHCLIENT_SET_DEFAULT_ROUTE'] = False
continue
+ elif subnet_type in IPV6_DYNAMIC_TYPES:
+ continue
elif subnet_type == 'static':
if subnet_is_ipv6(subnet):
ipv6_index = ipv6_index + 1
@@ -444,10 +461,14 @@ class Renderer(renderer.Renderer):
@classmethod
def _render_subnet_routes(cls, iface_cfg, route_cfg, subnets):
for _, subnet in enumerate(subnets, start=len(iface_cfg.children)):
+ subnet_type = subnet.get('type')
for route in subnet.get('routes', []):
is_ipv6 = subnet.get('ipv6') or is_ipv6_addr(route['gateway'])
- if _is_default_route(route):
+ # Any dynamic configuration method, slaac, dhcpv6-stateful/
+ # stateless should get router information from router RA's.
+ if (_is_default_route(route) and subnet_type not in
+ IPV6_DYNAMIC_TYPES):
if (
(subnet.get('ipv4') and
route_cfg.has_set_default_ipv4) or
@@ -466,10 +487,17 @@ class Renderer(renderer.Renderer):
# TODO(harlowja): add validation that no other iface has
# also provided the default route?
iface_cfg['DEFROUTE'] = True
+ # TODO(hjensas): Including dhcp6 here is likely incorrect.
+ # DHCPv6 does not ever provide a default gateway, the
+ # default gateway come from RA's.
+ # (https://github.com/openSUSE/wicked/issues/570)
if iface_cfg['BOOTPROTO'] in ('dhcp', 'dhcp4', 'dhcp6'):
+ # NOTE(hjensas): DHCLIENT_SET_DEFAULT_ROUTE is SuSE
+ # only. RHEL, CentOS, Fedora does not implement this
+ # option.
iface_cfg['DHCLIENT_SET_DEFAULT_ROUTE'] = True
if 'gateway' in route:
- if is_ipv6 or is_ipv6_addr(route['gateway']):
+ if is_ipv6:
iface_cfg['IPV6_DEFAULTGW'] = route['gateway']
route_cfg.has_set_default_ipv6 = True
else: