summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorA. Wilcox <AWilcox@Wilcox-Tech.com>2020-11-24 16:14:54 -0600
committerA. Wilcox <AWilcox@Wilcox-Tech.com>2020-11-24 16:14:54 -0600
commit5cdaf24f9368f49f32547a6852b46dd2bfec4c21 (patch)
tree1d1a2a3644bba37503420b54e5a8fed25cf92957
parent20f621542be67d825aaabf0b6deff8d3e6006440 (diff)
downloadnetconfapk-5cdaf24f9368f49f32547a6852b46dd2bfec4c21.tar.gz
netconfapk-5cdaf24f9368f49f32547a6852b46dd2bfec4c21.tar.bz2
netconfapk-5cdaf24f9368f49f32547a6852b46dd2bfec4c21.tar.xz
netconfapk-5cdaf24f9368f49f32547a6852b46dd2bfec4c21.zip
ifupdown-ng NMSA: Add *UNTESTED* SLAAC logic
-rw-r--r--ncserver/module/nms_ifupdownng.py94
1 files changed, 94 insertions, 0 deletions
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,