From 6a624b354adca1174d8a6703d43f4fd67cccae0a Mon Sep 17 00:00:00 2001
From: Thomas Schneider <thomas@fsmpi.rwth-aachen.de>
Date: Fri, 12 May 2023 12:37:40 +0200
Subject: [PATCH] networkd: Configure Network.LinkLocalAddressing

---
 networkd/defaults/main.yml                    | 3 +++
 networkd/templates/20-wired-dhcp.network.j2   | 3 +++
 networkd/templates/20-wired-routed.network.j2 | 3 +++
 networkd/templates/20-wired-static.network.j2 | 1 +
 networkd/templates/bond.network.j2            | 1 +
 networkd/templates/bridge.network.j2          | 3 ++-
 networkd/templates/vlan.network.j2            | 3 ++-
 7 files changed, 15 insertions(+), 2 deletions(-)

diff --git a/networkd/defaults/main.yml b/networkd/defaults/main.yml
index 38d6196..6c23bf2 100644
--- a/networkd/defaults/main.yml
+++ b/networkd/defaults/main.yml
@@ -10,11 +10,13 @@
 
 # networkd:
 #   - type: 'dhcp'
+#     link_local_addressing: "no"
 #   - type: 'static'
 #     address: '10.10.10.10/24'
 #     gateway: '10.10.10.1'
 #   - type: 'routed'
 #     identifier: 'file-name'
+#     link_local_addressing: "ipv4"
 #     interfaces:
 #       - 'eth0'
 #     addresses:
@@ -76,6 +78,7 @@ networkd_bond_vlans:
     name: storage
     bridge: false
     address: 10.10.10.10/24
+    link_local_addressing: "no"
   - id: 42
     name: public
     bridge: true
diff --git a/networkd/templates/20-wired-dhcp.network.j2 b/networkd/templates/20-wired-dhcp.network.j2
index 3737690..b806811 100644
--- a/networkd/templates/20-wired-dhcp.network.j2
+++ b/networkd/templates/20-wired-dhcp.network.j2
@@ -6,6 +6,9 @@ DHCP=ipv4
 {% if networkd_ipfwd %}
 IPForward=yes
 {% endif %}
+{% if network.link_local_addressing is defined %}
+LinkLocalAddressing={{ network.link_local_addressing }}
+{% endif %}
 {% for custom in network.custom|default([]) %}
 
 [{{ custom.category }}]
diff --git a/networkd/templates/20-wired-routed.network.j2 b/networkd/templates/20-wired-routed.network.j2
index 9a7673c..6161bd2 100644
--- a/networkd/templates/20-wired-routed.network.j2
+++ b/networkd/templates/20-wired-routed.network.j2
@@ -10,6 +10,9 @@ Name={{ network.interfaces|default([network.interface])|join(' ') }}
 Address={{ addr }}
 {% endfor %}
 {% endif %}
+{% if (network.link_local_addressing|default(none)) is not none %}
+LinkLocalAddressing={{ network.link_local_addressing }}
+{% endif %}
 {% for server in network.nameservers|default(nameservers) %}
 DNS={{ server }}
 {% endfor %}
diff --git a/networkd/templates/20-wired-static.network.j2 b/networkd/templates/20-wired-static.network.j2
index 024d387..5824c6a 100644
--- a/networkd/templates/20-wired-static.network.j2
+++ b/networkd/templates/20-wired-static.network.j2
@@ -2,5 +2,6 @@
 	'interface': item.1.interface|default(networkd_interface|default(ansible_default_ipv4.interface)),
 	'addresses': item.1.addresses|default([item.1.adress|default(networkd_address)]),
 	'gateway': item.1.gateway|default(networkd_gateway),
+	'link_local_addressing': item.1.link_local_addressing|default(None)
 	} %}
 {% include "20-wired-routed.network.j2" %}
diff --git a/networkd/templates/bond.network.j2 b/networkd/templates/bond.network.j2
index fa6b046..bd9a66a 100644
--- a/networkd/templates/bond.network.j2
+++ b/networkd/templates/bond.network.j2
@@ -6,3 +6,4 @@ Name={{ bond.bond|default(networkd_bond) }}
 VLAN=vl-{{ vlan.name }}
 {% endfor %}
 BindCarrier={{ bond.interfaces|default(networkd_bond_devices)|join(' ') }}
+LinkLocalAddressing=no
diff --git a/networkd/templates/bridge.network.j2 b/networkd/templates/bridge.network.j2
index 2fbc73c..491c6b7 100644
--- a/networkd/templates/bridge.network.j2
+++ b/networkd/templates/bridge.network.j2
@@ -2,6 +2,7 @@
 	'interface': 'vmbr-' + item.name,
 	'addresses': [item.address] if item.address is defined else [],
 	'nameservers': [],
-	'routes': [{'gateway': item.gateway}] if item.gateway is defined else []
+	'routes': [{'gateway': item.gateway}] if item.gateway is defined else [],
+	'link_local_addressing': item.link_local_addressing|default(None)
 	} %}
 {% include "20-wired-routed.network.j2" %}
diff --git a/networkd/templates/vlan.network.j2 b/networkd/templates/vlan.network.j2
index fda8a92..6b7c90f 100644
--- a/networkd/templates/vlan.network.j2
+++ b/networkd/templates/vlan.network.j2
@@ -9,7 +9,8 @@ Bridge=vmbr-{{ item.name }}
 	'interface': 'vl-' + item.name,
 	'addresses': item.addresses|default([item.address] if item.address is defined else []),
 	'nameservers': item.nameservers|default([]),
-	'routes': item.routes|default([{'gateway': item.gateway}] if item.gateway is defined else [])
+	'routes': item.routes|default([{'gateway': item.gateway}] if item.gateway is defined else []),
+	'link_local_addressing': item.link_local_addressing|default(None)
 	} %}
 {% include "20-wired-routed.network.j2" %}
 {% endif %}
-- 
GitLab