From 080738163e532af3097d1be83dc6788016d3af89 Mon Sep 17 00:00:00 2001
From: Hinrikus Wolf <hinrikus@fsmpi.rwth-aachen.de>
Date: Sun, 3 Nov 2024 16:30:26 +0100
Subject: [PATCH] networkd: make VLANs more versatile

---
 networkd/tasks/vlan.yml                       | 4 ++--
 networkd/templates/20-wired-routed.network.j2 | 6 +++++-
 networkd/templates/20-wired-vlan.network.j2   | 6 ++++++
 networkd/templates/vlan.network.j2            | 7 +++++--
 4 files changed, 18 insertions(+), 5 deletions(-)

diff --git a/networkd/tasks/vlan.yml b/networkd/tasks/vlan.yml
index b8f6d15..093acbf 100644
--- a/networkd/tasks/vlan.yml
+++ b/networkd/tasks/vlan.yml
@@ -34,7 +34,7 @@
     group: root
     mode: '0644'
   with_items: "{{ vlan.vlans }}"
-  when: item.bridge
+  when: item.bridge | default(False)
   notify:
     - restart networkd
 - name: ensure bridge networks are configured
@@ -45,6 +45,6 @@
     group: root
     mode: '0644'
   with_items: "{{ vlan.vlans }}"
-  when: item.bridge
+  when: item.bridge | default(False)
   notify:
     - restart networkd
diff --git a/networkd/templates/20-wired-routed.network.j2 b/networkd/templates/20-wired-routed.network.j2
index 6161bd2..cb4257f 100644
--- a/networkd/templates/20-wired-routed.network.j2
+++ b/networkd/templates/20-wired-routed.network.j2
@@ -1,6 +1,7 @@
 {% if not network is defined %}
 {% set network = item.1 %}
 {% endif %}
+
 [Match]
 Name={{ network.interfaces|default([network.interface])|join(' ') }}
 
@@ -16,12 +17,15 @@ LinkLocalAddressing={{ network.link_local_addressing }}
 {% for server in network.nameservers|default(nameservers) %}
 DNS={{ server }}
 {% endfor %}
-{% if networkd_ipfwd %}
+{% if networkd_ipfwd or network.networkd_ipfwd|default(false) %}
 IPForward=yes
 {% endif %}
 {% for key, value in (network.settings|default({})).items() %}
 {{ key }}={{ value }}
 {% endfor %}
+{% for vlan in network.vlans|default([]) %}
+VLAN=vl-{{ vlan.name }}
+{% endfor %}
 
 {% for route in network.routes|default([{'gateway': network.gateway}]) %}
 [Route]
diff --git a/networkd/templates/20-wired-vlan.network.j2 b/networkd/templates/20-wired-vlan.network.j2
index 4b70521..fea42ca 100644
--- a/networkd/templates/20-wired-vlan.network.j2
+++ b/networkd/templates/20-wired-vlan.network.j2
@@ -1,3 +1,8 @@
+{% if item.1.addresses | default(False) %}
+{% set network = item.1 %}
+{% include "20-wired-routed.network.j2" %}
+{% else %}
+
 [Match]
 Name={{ item.1.interface }}
 
@@ -9,3 +14,4 @@ BindCarrier={{ item.1.interface }}
 {% if networkd_ipfwd %}
 IPForward=yes
 {% endif %}
+{% endif %}
diff --git a/networkd/templates/vlan.network.j2 b/networkd/templates/vlan.network.j2
index 6b7c90f..bcb92b6 100644
--- a/networkd/templates/vlan.network.j2
+++ b/networkd/templates/vlan.network.j2
@@ -1,4 +1,4 @@
-{% if item.bridge %}
+{% if item.bridge | default(False) %}
 [Match]
 Name=vl-{{ item.name }}
 
@@ -9,8 +9,11 @@ Bridge=vmbr-{{ item.name }}
 	'interface': 'vl-' + item.name,
 	'addresses': item.addresses|default([item.address] if item.address is defined else []),
 	'nameservers': item.nameservers|default([]),
+	'networkd_ipfwd': item.networkd_ipfwd|default(false),
 	'routes': item.routes|default([{'gateway': item.gateway}] if item.gateway is defined else []),
-	'link_local_addressing': item.link_local_addressing|default(None)
+	'link_local_addressing': item.link_local_addressing|default(None),
+	'settings': item.settings|default({}),
+	'custom': item.custom|default([])
 	} %}
 {% include "20-wired-routed.network.j2" %}
 {% endif %}
-- 
GitLab