From 5cdaf24f9368f49f32547a6852b46dd2bfec4c21 Mon Sep 17 00:00:00 2001 From: "A. Wilcox" Date: Tue, 24 Nov 2020 16:14:54 -0600 Subject: ifupdown-ng NMSA: Add *UNTESTED* SLAAC logic --- ncserver/module/nms_ifupdownng.py | 94 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) diff --git a/ncserver/module/nms_ifupdownng.py b/ncserver/module/nms_ifupdownng.py index 268a1fa..ab6a4c3 100644 --- a/ncserver/module/nms_ifupdownng.py +++ b/ncserver/module/nms_ifupdownng.py @@ -230,6 +230,8 @@ _SYSCTL_MAPPING = { 'ipv6_forwarding': 'net.ipv6.conf.{_if}.forwarding', 'ipv6_mtu': 'net.ipv6.conf.{_if}.mtu', 'ipv6_dad_xmit': 'net.ipv6.conf.{_if}.dad_transmits', + 'ipv6_slaac_enabled': 'net.ipv6.conf.{_if}.autoconf', + 'ipv6_slaac_type': 'net.ipv6.conf.{_if}.use_tempaddr', 'ipv6_slaac_validlft': 'net.ipv6.conf.{_if}.temp_valid_lft', 'ipv6_slaac_preflft': 'net.ipv6.conf.{_if}.temp_prefered_lft' } @@ -273,6 +275,18 @@ def get_ipv6en(iface: str, parameter: str): return not get_sysctl_bool(iface, parameter) +def get_slaac(iface: str, parameter: str): + """Retrieve SLAAC configuration for the specified interface.""" + enabled = get_sysctl_bool(iface, 'ipv6_slaac_enabled') + if not enabled: + return False + + value = get_sysctl_int(iface, 'ipv6_slaac_type') + if parameter == 'ipv6_slaac_globaladdr': + return value in ('0', '1') + return value in ('1', '2') + + def live_sysctl(iface: str, parameter: str): """Retrieve the live value of a parameter from /proc/sys.""" key = _SYSCTL_MAPPING[parameter].format(_if=iface) @@ -332,6 +346,18 @@ def live_ipv4_mtu(iface: str, _): return 1500 +def live_slaac(iface: str, parameter: str): + """Determine live SLAAC configuration for the specified interface.""" + enabled = live_sysctl_bool(iface, 'ipv6_slaac_enabled') + if not enabled: + return False + + value = live_sysctl_int(iface, 'ipv6_slaac_type') + if parameter == 'ipv6_slaac_globaladdr': + return value in ('0', '1') + return value in ('1', '2') + + # # # # Setters # # # # def set_sysctl(iface: str, parameter: str, value): @@ -375,6 +401,48 @@ def set_ipv4_mtu(iface: str, _, value: int): _replace_one(iface, 'mtu', str(value)) +def set_slaac(iface: str, parameter: str, value: bool): + """Set SLAAC parameters for the specified interface.""" + curr_global = get_slaac(iface, 'ipv6_slaac_globaladdr') + curr_temp = get_slaac(iface, 'ipv6_slaac_tempaddr') + + if parameter == 'ipv6_slaac_globaladdr': + if not value and not curr_temp: + set_sysctl_bool(iface, 'ipv6_slaac_enabled', False) + set_sysctl_int(iface, 'ipv6_slaac_type', '0') + return + # all further types enable SLAAC in some way. + set_sysctl_bool(iface, 'ipv6_slaac_enabled', True) + if not value and curr_temp: + set_sysctl_int(iface, 'ipv6_slaac_type', '2') + return + if value and not curr_temp: + set_sysctl_int(iface, 'ipv6_slaac_type', '0') + return + if value and curr_temp: + set_sysctl_int(iface, 'ipv6_slaac_type', '1') + return + + if parameter == 'ipv6_slaac_tempaddr': + if not value and not curr_global: + set_sysctl_bool(iface, 'ipv6_slaac_enabled', False) + set_sysctl_int(iface, 'ipv6_slaac_type', '0') + return + # all further types enable SLAAC in some way. + set_sysctl_bool(iface, 'ipv6_slaac_enabled', True) + if not value and curr_global: + set_sysctl_int(iface, 'ipv6_slaac_type', '0') + return + if value and not curr_global: + set_sysctl_int(iface, 'ipv6_slaac_type', '2') + return + if value and curr_global: + set_sysctl_int(iface, 'ipv6_slaac_type', '1') + return + + LOGGER.error(_("unknown SLAAC parameter %s"), parameter) + + # # # # Unsetters # # # # def unset_one_eni(iface: str, parameter: str): @@ -389,6 +457,30 @@ def unset_sysctl(iface: str, parameter: str): _sysctl_save() +def unset_slaac(iface: str, parameter: str): + """Set SLAAC parameters for the specified interface.""" + curr_global = get_slaac(iface, 'ipv6_slaac_globaladdr') + curr_temp = get_slaac(iface, 'ipv6_slaac_tempaddr') + + if parameter == 'ipv6_slaac_globaladdr': + # unset => default true + set_sysctl_bool(iface, 'ipv6_slaac_enabled', True) + if curr_temp: + set_sysctl_int(iface, 'ipv6_slaac_type', '1') + else: + set_sysctl_int(iface, 'ipv6_slaac_type', '0') + return + + if parameter == 'ipv6_slaac_tempaddr': + # unset => default false + set_sysctl_int(iface, 'ipv6_slaac_type', '0') + if not curr_global: + set_sysctl_bool(iface, 'ipv6_slaac_enabled', False) + return + + LOGGER.error(_("unknown SLAAC parameter %s"), parameter) + + _PARAMETERS = { # "name": (getter, live getter, setter, unsetter) 'description': (get_one_eni, get_one_eni, set_desc, unset_one_eni), @@ -406,6 +498,8 @@ _PARAMETERS = { set_sysctl_int, unset_sysctl), 'ipv6_dad_xmit': (get_sysctl_int, live_sysctl_int, set_sysctl_int, unset_sysctl), + 'ipv6_slaac_globaladdr': (get_slaac, live_slaac, set_slaac, unset_slaac), + 'ipv6_slaac_tempaddr': (get_slaac, live_slaac, set_slaac, unset_slaac), 'ipv6_slaac_validlft': (get_sysctl_int, live_sysctl_int, set_sysctl_int, unset_sysctl), 'ipv6_slaac_preflft': (get_sysctl_int, live_sysctl_int, -- cgit v1.2.3-70-g09d2