summaryrefslogtreecommitdiff
path: root/cloudinit/net
diff options
context:
space:
mode:
authoreinsibjarni <einar@isnic.is>2022-11-26 00:26:37 +0000
committerGitHub <noreply@github.com>2022-11-25 18:26:37 -0600
commit871edd50fb9da441e4ef2fbebc435dfb8baa4127 (patch)
tree3e12877ad7f2584f04e14f4aa21a7270be0d3ca4 /cloudinit/net
parent893df0d61179a6722c44267f57c57284543c2f12 (diff)
downloadcloud-init-git-871edd50fb9da441e4ef2fbebc435dfb8baa4127.tar.gz
Add support for static IPv6 addresses for FreeBSD (#1839)
Currently, FreeBSD ignores IPv6 addresses. This PR adds support for static IPv6 addresses
Diffstat (limited to 'cloudinit/net')
-rw-r--r--cloudinit/net/bsd.py66
-rw-r--r--cloudinit/net/freebsd.py23
2 files changed, 74 insertions, 15 deletions
diff --git a/cloudinit/net/bsd.py b/cloudinit/net/bsd.py
index e8778d27..b23279e5 100644
--- a/cloudinit/net/bsd.py
+++ b/cloudinit/net/bsd.py
@@ -30,6 +30,7 @@ class BSDRenderer(renderer.Renderer):
config = {}
self.target = None
self.interface_configurations = {}
+ self.interface_configurations_ipv6 = {}
self._postcmds = config.get("postcmds", True)
def _ifconfig_entries(self, settings):
@@ -62,8 +63,6 @@ class BSDRenderer(renderer.Renderer):
LOG.info("Configuring interface %s", device_name)
- self.interface_configurations[device_name] = "DHCP"
-
for subnet in interface.get("subnets", []):
if subnet.get("type") == "static":
if not subnet.get("netmask"):
@@ -85,29 +84,70 @@ class BSDRenderer(renderer.Renderer):
"mtu": subnet.get("mtu") or interface.get("mtu"),
}
+ elif subnet.get("type") == "static6":
+ if not subnet.get("prefix"):
+ LOG.debug(
+ "Skipping IP %s, because there is no prefix",
+ subnet.get("address"),
+ )
+ continue
+ LOG.debug(
+ "Configuring dev %s with %s / %s",
+ device_name,
+ subnet.get("address"),
+ subnet.get("prefix"),
+ )
+
+ self.interface_configurations_ipv6[device_name] = {
+ "address": subnet.get("address"),
+ "prefix": subnet.get("prefix"),
+ "mtu": subnet.get("mtu") or interface.get("mtu"),
+ }
+ elif (
+ subnet.get("type") == "dhcp"
+ or subnet.get("type") == "dhcp4"
+ ):
+ self.interface_configurations[device_name] = "DHCP"
+
def _route_entries(self, settings):
routes = list(settings.iter_routes())
for interface in settings.iter_interfaces():
subnets = interface.get("subnets", [])
for subnet in subnets:
- if subnet.get("type") != "static":
+ if subnet.get("type") == "static":
+ gateway = subnet.get("gateway")
+ if gateway and len(gateway.split(".")) == 4:
+ routes.append(
+ {
+ "network": "0.0.0.0",
+ "netmask": "0.0.0.0",
+ "gateway": gateway,
+ }
+ )
+ elif subnet.get("type") == "static6":
+ gateway = subnet.get("gateway")
+ if gateway and len(gateway.split(":")) > 1:
+ routes.append(
+ {
+ "network": "::",
+ "prefix": "0",
+ "gateway": gateway,
+ }
+ )
+ else:
continue
- gateway = subnet.get("gateway")
- if gateway and len(gateway.split(".")) == 4:
- routes.append(
- {
- "network": "0.0.0.0",
- "netmask": "0.0.0.0",
- "gateway": gateway,
- }
- )
routes += subnet.get("routes", [])
+
for route in routes:
network = route.get("network")
if not network:
LOG.debug("Skipping a bad route entry")
continue
- netmask = route.get("netmask")
+ netmask = (
+ route.get("netmask")
+ if route.get("netmask")
+ else route.get("prefix")
+ )
gateway = route.get("gateway")
self.set_route(network, netmask, gateway)
diff --git a/cloudinit/net/freebsd.py b/cloudinit/net/freebsd.py
index ec42b60c..415f4a5a 100644
--- a/cloudinit/net/freebsd.py
+++ b/cloudinit/net/freebsd.py
@@ -17,14 +17,31 @@ class Renderer(cloudinit.net.bsd.BSDRenderer):
def write_config(self):
for device_name, v in self.interface_configurations.items():
- net_config = "DHCP"
if isinstance(v, dict):
- net_config = v.get("address") + " netmask " + v.get("netmask")
+ net_config = "inet %s netmask %s" % (
+ v.get("address"),
+ v.get("netmask"),
+ )
mtu = v.get("mtu")
if mtu:
net_config += " mtu %d" % mtu
+ elif v == "DHCP":
+ net_config = "DHCP"
self.set_rc_config_value("ifconfig_" + device_name, net_config)
+ for device_name, v in self.interface_configurations_ipv6.items():
+ if isinstance(v, dict):
+ net_config = "inet6 %s/%d" % (
+ v.get("address"),
+ v.get("prefix"),
+ )
+ mtu = v.get("mtu")
+ if mtu:
+ net_config += " mtu %d" % mtu
+ self.set_rc_config_value(
+ "ifconfig_%s_ipv6" % device_name, net_config
+ )
+
def start_services(self, run=False):
if not run:
LOG.debug("freebsd generate postcmd disabled")
@@ -58,6 +75,8 @@ class Renderer(cloudinit.net.bsd.BSDRenderer):
def set_route(self, network, netmask, gateway):
if network == "0.0.0.0":
self.set_rc_config_value("defaultrouter", gateway)
+ elif network == "::":
+ self.set_rc_config_value("ipv6_defaultrouter", gateway)
else:
route_name = "route_net%d" % self._route_cpt
route_cmd = "-route %s/%s %s" % (network, netmask, gateway)