* [pve-devel] [PATCH ifupdown2 0/5] d/patches: improve altname support
@ 2025-08-22 12:27 Christoph Heiss
2025-08-22 12:27 ` [pve-devel] [PATCH ifupdown2 1/5] d/patches: altname support: add translation in some more places Christoph Heiss
` (5 more replies)
0 siblings, 6 replies; 7+ messages in thread
From: Christoph Heiss @ 2025-08-22 12:27 UTC (permalink / raw)
To: pve-devel
Another round of some fixups and improvements to altname support.
First off, amend the initial support patch to add translation to some
more places, especially around sysfs access - as that always requires
the primary interface name.
Next, replace quite a few sysfs usages with netlink, making it more
robust and adding support for altnames directly, as netlink does it also
transparently under the hood.
Failing to set the MTU with altnames was originally reported on the
community forum [0], which in turn also led me to the ifalias change.
[0] https://forum.proxmox.com/threads/wrong-mtu-after-upgrade-to-9.169887/
Testing
=======
These two changes can be easily tested by adding e.g.
mtu 9000
alias foobar
to a stanza for an interface under its altname, afterwards checking with
`ip link show <name>`
for the MTU and alias.
Diffstat
========
Christoph Heiss (5):
d/patches: altname support: add translation in some more places
d/patches: set interface mtu through netlink instead of sysfs
d/patches: set interface alias through netlink instead of sysfs
d/patches: ipv6 slaac: properly decode IPv6 devconf attributes
d/patches: read ipv6 devconf `disable_ipv6` attribute through netlink
...-add-transparent-support-interface-a.patch | 246 +++++++++++++-
...et-interface-mtu-through-netlink-ins.patch | 318 ++++++++++++++++++
...et-interface-alias-through-netlink-i.patch | 130 +++++++
...pv6-devconf-disable_ipv6-attribute-t.patch | 102 ++++++
debian/patches/series | 5 +-
...ac-support-inet6-auto-and-accept_ra.patch} | 140 ++++++--
6 files changed, 899 insertions(+), 42 deletions(-)
create mode 100644 debian/patches/pve/0012-addons-nlcache-set-interface-mtu-through-netlink-ins.patch
create mode 100644 debian/patches/pve/0013-addons-nlcache-set-interface-alias-through-netlink-i.patch
create mode 100644 debian/patches/pve/0014-nlmanager-read-ipv6-devconf-disable_ipv6-attribute-t.patch
rename debian/patches/upstream/{0001-add-ipv6-slaac-support-inet6-auto-accept_ra.patch => 0001-add-ipv6-slaac-support-inet6-auto-and-accept_ra.patch} (82%)
--
2.50.1
_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
^ permalink raw reply [flat|nested] 7+ messages in thread
* [pve-devel] [PATCH ifupdown2 1/5] d/patches: altname support: add translation in some more places
2025-08-22 12:27 [pve-devel] [PATCH ifupdown2 0/5] d/patches: improve altname support Christoph Heiss
@ 2025-08-22 12:27 ` Christoph Heiss
2025-08-22 12:27 ` [pve-devel] [PATCH ifupdown2 2/5] d/patches: set interface mtu through netlink instead of sysfs Christoph Heiss
` (4 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Christoph Heiss @ 2025-08-22 12:27 UTC (permalink / raw)
To: pve-devel
This especially takes care of all places where the sysfs is used, which
only works with primary interface names.
Signed-off-by: Christoph Heiss <c.heiss@proxmox.com>
---
...-add-transparent-support-interface-a.patch | 246 +++++++++++++++++-
1 file changed, 239 insertions(+), 7 deletions(-)
diff --git a/debian/patches/pve/0011-nlmanager-addons-add-transparent-support-interface-a.patch b/debian/patches/pve/0011-nlmanager-addons-add-transparent-support-interface-a.patch
index fe2b197..27f0d79 100644
--- a/debian/patches/pve/0011-nlmanager-addons-add-transparent-support-interface-a.patch
+++ b/debian/patches/pve/0011-nlmanager-addons-add-transparent-support-interface-a.patch
@@ -1,4 +1,4 @@
-From ca818a46bc5519adde981df317ac635e064eae45 Mon Sep 17 00:00:00 2001
+From f1084be759217d35a624664de23fecf8ec0c7f44 Mon Sep 17 00:00:00 2001
From: Christoph Heiss <c.heiss@proxmox.com>
Date: Fri, 11 Jul 2025 17:45:47 +0200
Subject: [PATCH] nlmanager, addons: add transparent support interface altnames
@@ -18,21 +18,27 @@ name(s) and add the appropriate translation there too.
Signed-off-by: Christoph Heiss <c.heiss@proxmox.com>
---
- ifupdown2/addons/address.py | 27 +++----
- ifupdown2/addons/bond.py | 9 ++-
+ ifupdown2/addons/address.py | 31 ++++----
+ ifupdown2/addons/addressvirtual.py | 18 +++--
+ ifupdown2/addons/bond.py | 25 +++++--
ifupdown2/addons/bridge.py | 14 ----
+ ifupdown2/addons/bridgevlan.py | 5 ++
+ ifupdown2/addons/mstpctl.py | 9 ++-
ifupdown2/addons/openvswitch.py | 1 +
ifupdown2/addons/openvswitch_port.py | 31 +++++---
ifupdown2/addons/vlan.py | 15 +++-
+ ifupdown2/addons/vrf.py | 4 ++
+ ifupdown2/addons/vxlan.py | 3 +-
ifupdown2/ifupdown/ifupdownmain.py | 23 ++++--
ifupdown2/lib/addon.py | 9 +--
+ ifupdown2/lib/iproute2.py | 2 +
ifupdown2/lib/nlcache.py | 102 +++++++++++++++++++++++++++
ifupdown2/nlmanager/nlmanager.py | 15 ++++
ifupdown2/nlmanager/nlpacket.py | 63 +++++++++++++++++
- 11 files changed, 260 insertions(+), 49 deletions(-)
+ 17 files changed, 304 insertions(+), 66 deletions(-)
diff --git a/ifupdown2/addons/address.py b/ifupdown2/addons/address.py
-index 20f8866..c19b138 100644
+index 20f8866..d158c44 100644
--- a/ifupdown2/addons/address.py
+++ b/ifupdown2/addons/address.py
@@ -912,6 +912,7 @@ class address(AddonWithIpBlackList, moduleBase):
@@ -133,8 +139,83 @@ index 20f8866..c19b138 100644
def process_mtu(self, ifaceobj, ifaceobj_getfunc):
+@@ -1067,7 +1068,9 @@ class address(AddonWithIpBlackList, moduleBase):
+
+ def disable_ipv6(self, ifaceobj):
+ user_config = ifaceobj.get_attr_value_first("disable-ipv6")
+- sysfs_path = f"/proc/sys/net/ipv6/conf/{ifaceobj.name}/disable_ipv6"
++
++ ifacename = self.cache.link_translate_altname(ifaceobj.name)
++ sysfs_path = f"/proc/sys/net/ipv6/conf/{ifacename}/disable_ipv6"
+
+ if not user_config:
+ # check if disable-ipv6 was removed from the stanza
+diff --git a/ifupdown2/addons/addressvirtual.py b/ifupdown2/addons/addressvirtual.py
+index d52115e..587f39f 100644
+--- a/ifupdown2/addons/addressvirtual.py
++++ b/ifupdown2/addons/addressvirtual.py
+@@ -347,6 +347,10 @@ class addressvirtual(AddonWithIpBlackList, moduleBase):
+ interfaces are brought up, the expectation is that
+ the normal path will fix up a vrf device or its slaves"""
+
++ # anything calling into self.sysfs must use the translated name to
++ # properly handle altnames
++ ifacename = self.cache.link_translate_altname(ifaceobj.name)
++
+ if not ifaceobj_getfunc:
+ return
+ if ((ifaceobj.link_kind & ifaceLinkKind.VRF) and
+@@ -355,7 +359,7 @@ class addressvirtual(AddonWithIpBlackList, moduleBase):
+ # that have address virtual config,
+ # enslave the slaves 'address virtual
+ # interfaces (macvlans)' to myself:
+- running_slaves = self.sysfs.link_get_lowers(ifaceobj.name)
++ running_slaves = self.sysfs.link_get_lowers(ifacename)
+ if running_slaves:
+ # pick up any existing slaves of a vrf device and
+ # look for their upperdevices and enslave them to the
+@@ -364,8 +368,10 @@ class addressvirtual(AddonWithIpBlackList, moduleBase):
+ sobjs = ifaceobj_getfunc(s)
+ if (sobjs and
+ (sobjs[0].link_privflags & ifaceLinkPrivFlags.ADDRESS_VIRTUAL_SLAVE)):
+- # enslave all its upper devices to
+- # the vrf device
++ # enslave all its upper devices to the vrf device
++ #
++ # names retrieved from sysfs will be primary interface names,
++ # so no need to translate here
+ upperdevs = self.sysfs.link_get_uppers(sobjs[0].name)
+ if not upperdevs:
+ continue
+@@ -373,7 +379,7 @@ class addressvirtual(AddonWithIpBlackList, moduleBase):
+ # skip vrf device which
+ # will also show up in the
+ # upper device list
+- if u == ifaceobj.name:
++ if u == ifacename:
+ continue
+ self.netlink.link_set_master(u, ifaceobj.name)
+ self.netlink.link_up(u)
+@@ -386,7 +392,7 @@ class addressvirtual(AddonWithIpBlackList, moduleBase):
+ vrfname = ifaceobj.get_attr_value_first('vrf')
+ if not vrfname or not self.cache.link_exists(vrfname):
+ return
+- running_uppers = self.sysfs.link_get_uppers(ifaceobj.name)
++ running_uppers = self.sysfs.link_get_uppers(ifacename)
+ if not running_uppers:
+ return
+ macvlan_prefix = self._get_macvlan_prefix(ifaceobj)
+@@ -426,7 +432,7 @@ class addressvirtual(AddonWithIpBlackList, moduleBase):
+
+ user_configured_ipv6_addrgenmode, ipv6_addrgen_user_value = self.get_addressvirtual_ipv6_addrgen_user_conf(ifaceobj)
+ purge_existing = False if ifupdownflags.flags.PERFMODE else True
+- ifname = ifaceobj.name
++ ifname = self.cache.link_translate_altname(ifaceobj.name)
+
+ update_mtu = lower_iface_mtu = lower_iface_mtu_str = None
+ if ifupdownconfig.config.get("adjust_logical_dev_mtu", "1") != "0" and ifaceobj.lowerifaces and intf_config_list:
diff --git a/ifupdown2/addons/bond.py b/ifupdown2/addons/bond.py
-index 2af5cf6..d5a7f3d 100644
+index 2af5cf6..4d178b8 100644
--- a/ifupdown2/addons/bond.py
+++ b/ifupdown2/addons/bond.py
@@ -277,6 +277,7 @@ class bond(Addon, moduleBase):
@@ -161,6 +242,38 @@ index 2af5cf6..d5a7f3d 100644
def _is_bond(self, ifaceobj):
# at first link_kind is not set but once ifupdownmain
+@@ -497,7 +504,7 @@ class bond(Addon, moduleBase):
+ self.iproute2.link_set_protodown_reason_clag_off(s)
+ self.netlink.link_set_protodown_off(s)
+ if s not in slaves:
+- self.sysfs.bond_remove_slave(ifaceobj.name, s)
++ self.sysfs.bond_remove_slave(self.cache.link_translate_altname(ifaceobj.name), s)
+ removed_slave.append(s)
+ if clag_bond:
+ try:
+@@ -876,13 +883,17 @@ class bond(Addon, moduleBase):
+ return link_exists, bond_slaves
+
+ def create_or_set_bond_config_sysfs(self, ifaceobj, ifla_info_data):
+- if len(ifaceobj.name) > 15:
+- self.log_error("%s: cannot create bond: interface name exceeds max length of 15" % ifaceobj.name, ifaceobj)
++ # anything calling into self.sysfs must use the translated name to
++ # properly handle altnames
++ ifacename = self.cache.link_translate_altname(ifaceobj.name)
++
++ if len(ifacename) > 15:
++ self.log_error("%s: cannot create bond: interface name exceeds max length of 15" % ifacename, ifaceobj)
+ return
+
+- if not self.cache.link_exists(ifaceobj.name):
+- self.sysfs.bond_create(ifaceobj.name)
+- self.sysfs.bond_set_attrs_nl(ifaceobj.name, ifla_info_data)
++ if not self.cache.link_exists(ifacename):
++ self.sysfs.bond_create(ifacename)
++ self.sysfs.bond_set_attrs_nl(ifacename, ifla_info_data)
+
+ def _up(self, ifaceobj, ifaceobj_getfunc=None):
+ try:
diff --git a/ifupdown2/addons/bridge.py b/ifupdown2/addons/bridge.py
index e0e7375..0215309 100644
--- a/ifupdown2/addons/bridge.py
@@ -186,6 +299,69 @@ index e0e7375..0215309 100644
def _get_bridge_port_list_user_ordered(self, ifaceobj):
# When enslaving bridge-ports we need to return the exact user
# configured bridge ports list (bridge will inherit the mac of the
+diff --git a/ifupdown2/addons/bridgevlan.py b/ifupdown2/addons/bridgevlan.py
+index 6b75dc3..76bbfec 100644
+--- a/ifupdown2/addons/bridgevlan.py
++++ b/ifupdown2/addons/bridgevlan.py
+@@ -77,6 +77,9 @@ class bridgevlan(Addon, moduleBase):
+ "to format (eg. br0.100)" % ifaceobj.name, ifaceobj)
+ raise
+
++ # used below with sysfs
++ bridgename = self.cache.link_translate_altname(bridgename)
++
+ if not self.cache.link_exists(bridgename):
+ #self.logger.warning('%s: bridge %s does not exist' %(ifaceobj.name,
+ # bridgename))
+@@ -120,6 +123,8 @@ class bridgevlan(Addon, moduleBase):
+
+ def _query_running_bridge_igmp_querier_src(self, ifaceobj):
+ (bridgename, vlanid) = ifaceobj.name.split('.')
++
++ bridgename = self.cache.link_translate_altname(bridgename)
+ running_mcqv4src = self.sysfs.bridge_get_mcqv4src(bridgename)
+ if running_mcqv4src:
+ return running_mcqv4src.get(vlanid)
+diff --git a/ifupdown2/addons/mstpctl.py b/ifupdown2/addons/mstpctl.py
+index ff44eab..3eddf36 100644
+--- a/ifupdown2/addons/mstpctl.py
++++ b/ifupdown2/addons/mstpctl.py
+@@ -376,6 +376,7 @@ class mstpctl(Addon, moduleBase):
+
+ def _ports_enable_disable_ipv6(self, ports, enable='1'):
+ for p in ports:
++ p = self.cache.link_translate_altname(p)
+ try:
+ self.write_file('/proc/sys/net/ipv6/conf/%s' %p +
+ '/disable_ipv6', enable)
+@@ -924,7 +925,7 @@ class mstpctl(Addon, moduleBase):
+ # contain more than one valid values
+ stp_on_vals = ['on', 'yes']
+ stp_off_vals = ['off']
+- rv = self.sysfs.bridge_get_stp(ifaceobj.name)
++ rv = self.sysfs.bridge_get_stp(self.cache.link_translate_altname(ifaceobj.name))
+ if ((v in stp_on_vals and rv in stp_on_vals) or
+ (v in stp_off_vals and rv in stp_off_vals)):
+ ifaceobjcurr.update_config_with_status('mstpctl-stp', v, 0)
+@@ -1151,14 +1152,16 @@ class mstpctl(Addon, moduleBase):
+ # portconfig['mstpctl-treeportcost'] += ' %s=%s' %(p, v)
+
+ def _query_running_bridge(self, ifaceobjrunning):
+- if self.sysfs.bridge_get_stp(ifaceobjrunning.name) == 'no':
++ bridgename = self.cache.get_master(ifaceobjrunning.name)
++
++ if self.sysfs.bridge_get_stp(bridgename) == 'no':
+ # This bridge does not run stp, return
+ return
+ # if userspace stp not set, return
+ if self.systcl_get_net_bridge_stp_user_space() != '1':
+ return
+ # Check if mstp really knows about this bridge
+- if not self.mstpctlcmd.mstpbridge_exists(ifaceobjrunning.name):
++ if not self.mstpctlcmd.mstpbridge_exists(bridgename):
+ return
+ bridge_vlan_aware = False
+ if ifaceobjrunning.get_attr_value_first('bridge-vlan-aware') == 'yes':
diff --git a/ifupdown2/addons/openvswitch.py b/ifupdown2/addons/openvswitch.py
index 40fc36a..24483aa 100644
--- a/ifupdown2/addons/openvswitch.py
@@ -321,6 +497,49 @@ index 4380dd8..a53b2f9 100644
)
#
+diff --git a/ifupdown2/addons/vrf.py b/ifupdown2/addons/vrf.py
+index f0ee503..2c92a12 100644
+--- a/ifupdown2/addons/vrf.py
++++ b/ifupdown2/addons/vrf.py
+@@ -452,6 +452,7 @@ class vrf(Addon, moduleBase):
+ try:
+ for ifaceobj in statemanager.get_ifaceobjs(ifname) or []:
+ if ifaceobj.link_privflags & ifaceLinkPrivFlags.BRIDGE_PORT:
++ ifname = self.cache.link_translate_altname(ifname)
+ self.write_file("/proc/sys/net/ipv6/conf/%s/disable_ipv6" % ifname, "0")
+ return
+ except Exception as e:
+@@ -481,6 +482,8 @@ class vrf(Addon, moduleBase):
+
+ def _up_vrf_slave(self, ifacename, vrfname, ifaceobj=None,
+ ifaceobj_getfunc=None, vrf_exists=False):
++ ifacename = self.cache.link_translate_altname(ifacename)
++
+ try:
+ master_exists = True
+ if vrf_exists or self.cache.link_exists(vrfname):
+@@ -655,6 +658,7 @@ class vrf(Addon, moduleBase):
+ # - check if it is also a macvlan device of the
+ # format <vrf_slave>-v<int> created by the
+ # address virtual module
++ vrfslave = self.cache.link_translate_altname(vrfslave)
+ vrfslave_lowers = self.sysfs.link_get_lowers(vrfslave)
+ if vrfslave_lowers:
+ if vrfslave_lowers[0] in config_vrfslaves:
+diff --git a/ifupdown2/addons/vxlan.py b/ifupdown2/addons/vxlan.py
+index cc8d3b3..2a4857d 100644
+--- a/ifupdown2/addons/vxlan.py
++++ b/ifupdown2/addons/vxlan.py
+@@ -965,7 +965,8 @@ class vxlan(Vxlan, moduleBase):
+ vxlan_physdev_ifindex = self.cache.get_ifindex(vxlan_physdev)
+ except NetlinkCacheIfnameNotFoundError:
+ try:
+- vxlan_physdev_ifindex = int(self.sysfs.read_file_oneline("/sys/class/net/%s/ifindex" % vxlan_physdev))
++ ifname = self.cache.link_translate_altname(vxlan_physdev) or vxlan_physdev
++ vxlan_physdev_ifindex = int(self.sysfs.read_file_oneline("/sys/class/net/%s/ifindex" % ifname))
+ except Exception:
+ self.logger.error("%s: physdev %s doesn't exists" % (ifaceobj.name, vxlan_physdev))
+ return
diff --git a/ifupdown2/ifupdown/ifupdownmain.py b/ifupdown2/ifupdown/ifupdownmain.py
index 92e3393..904062d 100644
--- a/ifupdown2/ifupdown/ifupdownmain.py
@@ -441,6 +660,19 @@ index 47e42c7..77056b2 100644
class AddonWithIpBlackList(Addon):
try:
ip_blacklist = [ipnetwork.IPNetwork(ip).ip for ip in policymanager.policymanager_api.get_module_globals(
+diff --git a/ifupdown2/lib/iproute2.py b/ifupdown2/lib/iproute2.py
+index 543082e..e22b34c 100644
+--- a/ifupdown2/lib/iproute2.py
++++ b/ifupdown2/lib/iproute2.py
+@@ -505,6 +505,8 @@ class IPRoute2(Cache, Requirements):
+ :param link_created:
+ :return:
+ """
++ ifname = self.cache.link_translate_altname(ifname)
++
+ cached_ipv6_addr_gen_mode = self.cache.get_link_ipv6_addrgen_mode(ifname)
+
+ if cached_ipv6_addr_gen_mode == addrgen:
diff --git a/ifupdown2/lib/nlcache.py b/ifupdown2/lib/nlcache.py
index bbd2a8b..891524e 100644
--- a/ifupdown2/lib/nlcache.py
@@ -735,5 +967,5 @@ index ed463c2..efc4c4e 100644
# Link flags
--
-2.49.0
+2.50.1
--
2.50.1
_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
^ permalink raw reply [flat|nested] 7+ messages in thread
* [pve-devel] [PATCH ifupdown2 2/5] d/patches: set interface mtu through netlink instead of sysfs
2025-08-22 12:27 [pve-devel] [PATCH ifupdown2 0/5] d/patches: improve altname support Christoph Heiss
2025-08-22 12:27 ` [pve-devel] [PATCH ifupdown2 1/5] d/patches: altname support: add translation in some more places Christoph Heiss
@ 2025-08-22 12:27 ` Christoph Heiss
2025-08-22 12:27 ` [pve-devel] [PATCH ifupdown2 3/5] d/patches: set interface alias " Christoph Heiss
` (3 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Christoph Heiss @ 2025-08-22 12:27 UTC (permalink / raw)
To: pve-devel
Originally reported in the community forum [0].
The sysfs-based methods do not handle altnames at all. Instead, get/set
interface MTUs through netlink directly, which also has transparent
altname support, and is a more robust way in general.
At the same time, this simplifies some things as it means that the MTU
will always be present in the Netlink cache.
[0] https://forum.proxmox.com/threads/wrong-mtu-after-upgrade-to-9.169887/
Signed-off-by: Christoph Heiss <c.heiss@proxmox.com>
---
...et-interface-mtu-through-netlink-ins.patch | 318 ++++++++++++++++++
debian/patches/series | 1 +
2 files changed, 319 insertions(+)
create mode 100644 debian/patches/pve/0012-addons-nlcache-set-interface-mtu-through-netlink-ins.patch
diff --git a/debian/patches/pve/0012-addons-nlcache-set-interface-mtu-through-netlink-ins.patch b/debian/patches/pve/0012-addons-nlcache-set-interface-mtu-through-netlink-ins.patch
new file mode 100644
index 0000000..e40e666
--- /dev/null
+++ b/debian/patches/pve/0012-addons-nlcache-set-interface-mtu-through-netlink-ins.patch
@@ -0,0 +1,318 @@
+From f7d6aa4769a86980ce0e93cc55f2ef0c6b4682a9 Mon Sep 17 00:00:00 2001
+From: Christoph Heiss <c.heiss@proxmox.com>
+Date: Wed, 20 Aug 2025 14:02:22 +0200
+Subject: [PATCH] addons, nlcache: set interface mtu through netlink instead of
+ sysfs
+
+The sysfs-based methods do not handle altnames at all. Instead, get/set
+interface MTUs through netlink directly, which also has transparent
+altname support, and is a more robust way in general.
+
+At the same time, this simplifies some things as it means that the MTU
+will always be present in the netlink cache.
+
+Along the way also clean up some weird mtu_{int,str}, where the MTU is
+passed around in the `address` as both string and integer.
+
+Signed-off-by: Christoph Heiss <c.heiss@proxmox.com>
+---
+ ifupdown2/addons/address.py | 65 +++++++++++++++++++-----------
+ ifupdown2/addons/addressvirtual.py | 2 +-
+ ifupdown2/addons/bridge.py | 2 +-
+ ifupdown2/lib/iproute2.py | 5 +--
+ ifupdown2/lib/nlcache.py | 33 +++++++++++++++
+ ifupdown2/lib/sysfs.py | 16 --------
+ 6 files changed, 78 insertions(+), 45 deletions(-)
+
+diff --git a/ifupdown2/addons/address.py b/ifupdown2/addons/address.py
+index 3196a5e..25270c3 100644
+--- a/ifupdown2/addons/address.py
++++ b/ifupdown2/addons/address.py
+@@ -430,7 +430,7 @@ class address(AddonWithIpBlackList, moduleBase):
+ except ValueError as e:
+ self.logger.warning("%s: invalid mtu %s: %s" % (ifaceobj.name, mtu_str, str(e)))
+ return False
+- return self._check_mtu_config(ifaceobj, mtu_str, mtu_int, ifaceobj_getfunc, syntaxcheck=True)
++ return self._check_mtu_config(ifaceobj, mtu_int, ifaceobj_getfunc, syntaxcheck=True)
+ return True
+
+ def syntax_check_addr_allowed_on(self, ifaceobj, syntax_check=False):
+@@ -792,7 +792,14 @@ class address(AddonWithIpBlackList, moduleBase):
+ return ipv
+ return prev_gateways
+
+- def _check_mtu_config(self, ifaceobj, mtu_str, mtu_int, ifaceobj_getfunc, syntaxcheck=False):
++ def _check_mtu_config(self, ifaceobj, mtu, ifaceobj_getfunc, syntaxcheck=False):
++ """
++ :param ifaceobj:
++ :param mtu: integer
++ :param ifaceobj_getfunc:
++ :param syntaxcheck: boolean
++ """
++
+ retval = True
+ if (ifaceobj.link_kind & ifaceLinkKind.BRIDGE):
+ if syntaxcheck:
+@@ -806,10 +813,10 @@ class address(AddonWithIpBlackList, moduleBase):
+ masterobj = ifaceobj_getfunc(ifaceobj.upperifaces[0])
+ if masterobj:
+ master_mtu = masterobj[0].get_attr_value_first('mtu')
+- if master_mtu and master_mtu != mtu_str:
++ if master_mtu and master_mtu != str(mtu):
+ log_msg = ("%s: bond slave mtu %s is different from bond master %s mtu %s. "
+ "There is no need to configure mtu on a bond slave." %
+- (ifaceobj.name, mtu_str, masterobj[0].name, master_mtu))
++ (ifaceobj.name, mtu, masterobj[0].name, master_mtu))
+ if syntaxcheck:
+ self.logger.warning(log_msg)
+ retval = False
+@@ -823,24 +830,30 @@ class address(AddonWithIpBlackList, moduleBase):
+ lowerdev_mtu = int(lowerobj[0].get_attr_value_first('mtu') or 0)
+ else:
+ lowerdev_mtu = self.cache.get_link_mtu(lowerobj[0].name) # return type: int
+- if lowerdev_mtu and mtu_int > lowerdev_mtu:
++ if lowerdev_mtu and mtu > lowerdev_mtu:
+ self.logger.warning('%s: vlan dev mtu %s is greater than lower realdev %s mtu %s'
+- %(ifaceobj.name, mtu_str, lowerobj[0].name, lowerdev_mtu))
++ %(ifaceobj.name, mtu, lowerobj[0].name, lowerdev_mtu))
+ retval = False
+ elif (not lowerobj[0].link_kind and
+ not (lowerobj[0].link_privflags & ifaceLinkPrivFlags.LOOPBACK) and
+- not lowerdev_mtu and self.default_mtu and (mtu_int > self.default_mtu_int)):
++ not lowerdev_mtu and self.default_mtu and (mtu > self.default_mtu_int)):
+ # only check default mtu on lower device which is a physical interface
+ self.logger.warning('%s: vlan dev mtu %s is greater than lower realdev %s mtu %s'
+- %(ifaceobj.name, mtu_str, lowerobj[0].name, self.default_mtu))
++ %(ifaceobj.name, mtu, lowerobj[0].name, self.default_mtu))
+ retval = False
+- if self.max_mtu and mtu_int > self.max_mtu:
++ if self.max_mtu and mtu > self.max_mtu:
+ self.logger.warning('%s: specified mtu %s is greater than max mtu %s'
+- %(ifaceobj.name, mtu_str, self.max_mtu))
++ %(ifaceobj.name, mtu, self.max_mtu))
+ retval = False
+ return retval
+
+- def _propagate_mtu_to_upper_devs(self, ifaceobj, mtu_str, mtu_int, ifaceobj_getfunc):
++ def _propagate_mtu_to_upper_devs(self, ifaceobj, mtu, ifaceobj_getfunc):
++ """
++ :param ifaceobj:
++ :param mtu: integer
++ :param ifaceobj_getfunc:
++ """
++
+ if (not ifaceobj.upperifaces or
+ (ifaceobj.link_privflags & ifaceLinkPrivFlags.BOND_SLAVE) or
+ (ifaceobj.link_privflags & ifaceLinkPrivFlags.VRF_SLAVE) or
+@@ -855,15 +868,21 @@ class address(AddonWithIpBlackList, moduleBase):
+ umtu = upperobjs[0].get_attr_value_first('mtu')
+ if not umtu:
+ running_mtu = self.cache.get_link_mtu(upperobjs[0].name)
+- if not running_mtu or running_mtu != mtu_int:
+- self.sysfs.link_set_mtu(u, mtu_str=mtu_str, mtu_int=mtu_int)
++ if not running_mtu or running_mtu != mtu:
++ self.netlink.link_set_mtu(u, mtu)
+
+- def _process_mtu_config_mtu_valid(self, ifaceobj, ifaceobj_getfunc, mtu_str, mtu_int):
+- if not self._check_mtu_config(ifaceobj, mtu_str, mtu_int, ifaceobj_getfunc):
++ def _process_mtu_config_mtu_valid(self, ifaceobj, ifaceobj_getfunc, mtu):
++ """
++ :param ifaceobj:
++ :param ifaceobj_getfunc:
++ :param mtu: integer
++ """
++
++ if not self._check_mtu_config(ifaceobj, mtu, ifaceobj_getfunc):
+ return
+
+- if mtu_int != self.cache.get_link_mtu(ifaceobj.name):
+- self.sysfs.link_set_mtu(ifaceobj.name, mtu_str=mtu_str, mtu_int=mtu_int)
++ if mtu != self.cache.get_link_mtu(ifaceobj.name):
++ self.netlink.link_set_mtu(ifaceobj.name, mtu)
+
+ if (not ifupdownflags.flags.ALL and
+ not ifaceobj.link_kind and
+@@ -871,7 +890,7 @@ class address(AddonWithIpBlackList, moduleBase):
+ # This is additional cost to us, so do it only when
+ # ifupdown2 is called on a particular interface and
+ # it is a physical interface
+- self._propagate_mtu_to_upper_devs(ifaceobj, mtu_str, mtu_int, ifaceobj_getfunc)
++ self._propagate_mtu_to_upper_devs(ifaceobj, mtu, ifaceobj_getfunc)
+ return
+
+ def _process_mtu_config_mtu_none(self, ifaceobj):
+@@ -889,7 +908,7 @@ class address(AddonWithIpBlackList, moduleBase):
+ or ifaceobj.link_kind & ifaceLinkKind.BRIDGE \
+ or ifaceobj.link_kind & ifaceLinkKind.OTHER:
+ if cached_link_mtu != self.default_mtu_int:
+- self.sysfs.link_set_mtu(ifaceobj.name, mtu_str=self.default_mtu, mtu_int=self.default_mtu_int)
++ self.netlink.link_set_mtu(ifaceobj.name, self.default_mtu_int)
+ return
+
+ # set vlan interface mtu to lower device mtu
+@@ -902,7 +921,7 @@ class address(AddonWithIpBlackList, moduleBase):
+ lower_iface_mtu_int = self.cache.get_link_mtu(lower_iface)
+
+ if lower_iface_mtu_int != cached_link_mtu:
+- self.sysfs.link_set_mtu(ifaceobj.name, mtu_str=str(lower_iface_mtu_int), mtu_int=lower_iface_mtu_int)
++ self.netlink.link_set_mtu(ifaceobj.name, lower_iface_mtu_int)
+
+ elif (
+ ifaceobj.name != 'lo'
+@@ -919,7 +938,7 @@ class address(AddonWithIpBlackList, moduleBase):
+ # config by the kernel in play, we try to be cautious here
+ # on which devices we want to reset mtu to default.
+ # essentially only physical interfaces which are not bond slaves
+- self.sysfs.link_set_mtu(ifaceobj.name, mtu_str=self.default_mtu, mtu_int=self.default_mtu_int)
++ self.netlink.link_set_mtu(ifaceobj.name, self.default_mtu_int)
+
+ def _set_bridge_forwarding(self, ifaceobj):
+ """ set ip forwarding to 0 if bridge interface does not have a
+@@ -1105,7 +1124,7 @@ class address(AddonWithIpBlackList, moduleBase):
+ self.logger.warning("%s: invalid MTU value: %s" % (ifaceobj.name, str(e)))
+ return
+
+- self._process_mtu_config_mtu_valid(ifaceobj, ifaceobj_getfunc, mtu_str, mtu_int)
++ self._process_mtu_config_mtu_valid(ifaceobj, ifaceobj_getfunc, mtu_int)
+ else:
+ self._process_mtu_config_mtu_none(ifaceobj)
+
+@@ -1373,7 +1392,7 @@ class address(AddonWithIpBlackList, moduleBase):
+ # ifupdown2. If this MTU is different from our default mtu,
+ # if so we need to reset it back to default.
+ if not ifaceobj.link_kind and self.default_mtu and ifaceobj.get_attr_value_first('mtu') and self.cache.get_link_mtu(ifaceobj.name) != self.default_mtu_int:
+- self.sysfs.link_set_mtu(ifaceobj.name, mtu_str=self.default_mtu, mtu_int=self.default_mtu_int)
++ self.netlink.link_set_mtu(ifaceobj.name, self.default_mtu_int)
+
+ #
+ # alias
+diff --git a/ifupdown2/addons/addressvirtual.py b/ifupdown2/addons/addressvirtual.py
+index 587f39f..80cd820 100644
+--- a/ifupdown2/addons/addressvirtual.py
++++ b/ifupdown2/addons/addressvirtual.py
+@@ -540,7 +540,7 @@ class addressvirtual(AddonWithIpBlackList, moduleBase):
+ update_mtu = False
+
+ try:
+- self.sysfs.link_set_mtu(macvlan_ifname, mtu_str=lower_iface_mtu_str, mtu_int=lower_iface_mtu)
++ self.netlink.link_set_mtu(macvlan_ifname, lower_iface_mtu)
+ except Exception as e:
+ self.logger.info('%s: failed to set mtu %s: %s' % (macvlan_ifname, lower_iface_mtu, e))
+
+diff --git a/ifupdown2/addons/bridge.py b/ifupdown2/addons/bridge.py
+index 1da8de7..dee6f7b 100644
+--- a/ifupdown2/addons/bridge.py
++++ b/ifupdown2/addons/bridge.py
+@@ -2765,7 +2765,7 @@ class bridge(Bridge, moduleBase):
+
+ bridge_mtu = self.get_bridge_mtu(ifaceobj)
+ if bridge_mtu:
+- self.sysfs.link_set_mtu(ifname, bridge_mtu, int(bridge_mtu))
++ self.netlink.link_set_mtu(ifname, int(bridge_mtu))
+ else:
+ link_just_created = False
+ self.logger.info('%s: bridge already exists' % ifname)
+diff --git a/ifupdown2/lib/iproute2.py b/ifupdown2/lib/iproute2.py
+index 7e7366c..3760963 100644
+--- a/ifupdown2/lib/iproute2.py
++++ b/ifupdown2/lib/iproute2.py
+@@ -518,10 +518,7 @@ class IPRoute2(Cache, Requirements):
+ self.logger.info("%s: cannot set addrgen: ipv6 is disabled on this device" % ifname)
+ return False
+
+- if link_created:
+- link_mtu = self.sysfs.link_get_mtu(ifname)
+- else:
+- link_mtu = self.cache.get_link_mtu(ifname)
++ link_mtu = self.cache.get_link_mtu(ifname)
+
+ if link_mtu < 1280:
+ self.logger.info("%s: ipv6 addrgen is disabled on device with MTU "
+diff --git a/ifupdown2/lib/nlcache.py b/ifupdown2/lib/nlcache.py
+index e5a42ef..a36e610 100644
+--- a/ifupdown2/lib/nlcache.py
++++ b/ifupdown2/lib/nlcache.py
+@@ -60,6 +60,7 @@ try:
+ NLM_F_REQUEST, \
+ NLM_F_CREATE, \
+ NLM_F_ACK, \
++ NLM_F_REPLACE, \
+ RT_SCOPES, \
+ INFINITY_LIFE_TIME
+
+@@ -91,6 +92,7 @@ except (ImportError, ModuleNotFoundError):
+ NLM_F_REQUEST, \
+ NLM_F_CREATE, \
+ NLM_F_ACK, \
++ NLM_F_REPLACE, \
+ RT_SCOPES, \
+ INFINITY_LIFE_TIME
+
+@@ -3302,6 +3304,37 @@ class NetlinkListenerWithCache(nllistener.NetlinkManagerWithListener, BaseObject
+ def link_translate_altnames(self, ifnames):
+ return self.cache.link_translate_altnames(ifnames)
+
++ ###
++
++ """
++ Sets the MTU of the given link, updating the cache on success.
++
++ :param ifname: str - Name of the interface to update
++ :param mtu: int - New MTU to set for the interface.
++ :return: True if the operation was successful
++ """
++ def link_set_mtu(self, ifname, mtu):
++ if self.cache.get_link_mtu(ifname) == mtu:
++ # no need to update
++ return
++
++ self.logger.info(f'{ifname}: netlink: ip link set dev {ifname} mtu {mtu}')
++
++ debug = RTM_SETLINK in self.debug
++ try:
++ link = Link(RTM_SETLINK, debug, use_color=self.use_color)
++ link.flags = NLM_F_REPLACE | NLM_F_REQUEST | NLM_F_ACK
++ link.body = struct.pack('Bxxxiii', socket.AF_UNSPEC, 0, 0, 0)
++ link.add_attribute(Link.IFLA_IFNAME, ifname)
++ link.add_attribute(Link.IFLA_MTU, mtu)
++ link.build_message(next(self.sequence), self.pid)
++ result = self.tx_nlpacket_get_response_with_error(link)
++ self.cache.override_link_mtu(ifname, mtu)
++
++ return result
++ except Exception as e:
++ raise Exception(f'{ifname}: netlink: failed to set mtu to {mtu}: {str(e)}')
++
+ ############################################################################
+ # ADDRESS
+ ############################################################################
+diff --git a/ifupdown2/lib/sysfs.py b/ifupdown2/lib/sysfs.py
+index dd9f361..3ac678d 100644
+--- a/ifupdown2/lib/sysfs.py
++++ b/ifupdown2/lib/sysfs.py
+@@ -106,22 +106,6 @@ class __Sysfs(IO, Requirements):
+ """
+ return self.read_file_oneline("/sys/class/net/%s/address" % ifname)
+
+- #
+- # MTU
+- #
+-
+- def link_get_mtu(self, ifname):
+- return int(self.read_file_oneline("/sys/class/net/%s/mtu" % ifname) or 0)
+-
+- def link_set_mtu(self, ifname, mtu_str, mtu_int):
+- if self.cache.get_link_mtu(ifname) != mtu_int:
+- if self.write_to_file('/sys/class/net/%s/mtu' % ifname, mtu_str):
+- self.cache.override_link_mtu(ifname, mtu_int)
+-
+- def link_set_mtu_dry_run(self, ifname, mtu_str, mtu_int):
+- # we can remove the cache check in DRYRUN mode
+- self.write_to_file('/sys/class/net/%s/mtu' % ifname, mtu_str)
+-
+ #
+ # ALIAS
+ #
+--
+2.50.1
+
diff --git a/debian/patches/series b/debian/patches/series
index 6955322..e8aa870 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -9,5 +9,6 @@ pve/0008-lacp-bond-remove-bond-min-links-0-warning.patch
pve/0009-gvgeb-fix-python-interpreter-shebang.patch
pve/0010-main-ignore-dpkg-files-when-running-hook-scripts.patch
pve/0011-nlmanager-addons-add-transparent-support-interface-a.patch
+pve/0012-addons-nlcache-set-interface-mtu-through-netlink-ins.patch
upstream/0001-add-ipv6-slaac-support-inet6-auto-accept_ra.patch
upstream/0001-use-raw-strings-for-regex-to-fix-backslash-interpret.patch
--
2.50.1
_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
^ permalink raw reply [flat|nested] 7+ messages in thread
* [pve-devel] [PATCH ifupdown2 3/5] d/patches: set interface alias through netlink instead of sysfs
2025-08-22 12:27 [pve-devel] [PATCH ifupdown2 0/5] d/patches: improve altname support Christoph Heiss
2025-08-22 12:27 ` [pve-devel] [PATCH ifupdown2 1/5] d/patches: altname support: add translation in some more places Christoph Heiss
2025-08-22 12:27 ` [pve-devel] [PATCH ifupdown2 2/5] d/patches: set interface mtu through netlink instead of sysfs Christoph Heiss
@ 2025-08-22 12:27 ` Christoph Heiss
2025-08-22 12:27 ` [pve-devel] [PATCH ifupdown2 4/5] d/patches: ipv6 slaac: properly decode IPv6 devconf attributes Christoph Heiss
` (2 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Christoph Heiss @ 2025-08-22 12:27 UTC (permalink / raw)
To: pve-devel
The sysfs-based methods do not handle altnames at all. Instead, get/set
ifalias through netlink directly, which also has transparent altname
support, and is a more robust way in general.
Signed-off-by: Christoph Heiss <c.heiss@proxmox.com>
---
...et-interface-alias-through-netlink-i.patch | 130 ++++++++++++++++++
debian/patches/series | 1 +
2 files changed, 131 insertions(+)
create mode 100644 debian/patches/pve/0013-addons-nlcache-set-interface-alias-through-netlink-i.patch
diff --git a/debian/patches/pve/0013-addons-nlcache-set-interface-alias-through-netlink-i.patch b/debian/patches/pve/0013-addons-nlcache-set-interface-alias-through-netlink-i.patch
new file mode 100644
index 0000000..6b06963
--- /dev/null
+++ b/debian/patches/pve/0013-addons-nlcache-set-interface-alias-through-netlink-i.patch
@@ -0,0 +1,130 @@
+From 5451c4052a350ee941af4f8237a16334240a3a45 Mon Sep 17 00:00:00 2001
+From: Christoph Heiss <c.heiss@proxmox.com>
+Date: Wed, 20 Aug 2025 14:03:30 +0200
+Subject: [PATCH] addons, nlcache: set interface alias through netlink instead
+ of sysfs
+
+Signed-off-by: Christoph Heiss <c.heiss@proxmox.com>
+---
+ ifupdown2/addons/address.py | 4 ++--
+ ifupdown2/lib/nlcache.py | 41 +++++++++++++++++++++++++++++++++++++
+ ifupdown2/lib/sysfs.py | 22 --------------------
+ 3 files changed, 43 insertions(+), 24 deletions(-)
+
+diff --git a/ifupdown2/addons/address.py b/ifupdown2/addons/address.py
+index 25270c3..377b419 100644
+--- a/ifupdown2/addons/address.py
++++ b/ifupdown2/addons/address.py
+@@ -1196,7 +1196,7 @@ class address(AddonWithIpBlackList, moduleBase):
+ #
+ # alias
+ #
+- self.sysfs.link_set_alias(ifaceobj.name, ifaceobj.get_attr_value_first("alias"))
++ self.netlink.link_set_alias(ifaceobj.name, ifaceobj.get_attr_value_first("alias"))
+
+ self._sysctl_config(ifaceobj)
+
+@@ -1400,7 +1400,7 @@ class address(AddonWithIpBlackList, moduleBase):
+ if not ifaceobj.link_kind:
+ alias = ifaceobj.get_attr_value_first("alias")
+ if alias:
+- self.sysfs.link_set_alias(ifaceobj.name, None) # None to reset alias.
++ self.netlink.link_set_alias(ifaceobj.name, None) # None to reset alias.
+
+ # XXX hwaddress reset cannot happen because we dont know last
+ # address.
+diff --git a/ifupdown2/lib/nlcache.py b/ifupdown2/lib/nlcache.py
+index a36e610..3f79f71 100644
+--- a/ifupdown2/lib/nlcache.py
++++ b/ifupdown2/lib/nlcache.py
+@@ -409,6 +409,18 @@ class _NetlinkCache:
+ except Exception:
+ pass
+
++ def override_link_alias(self, ifname, alias):
++ """
++ Manually override link alias in the cache and ignore any failures
++ :param ifname: Name of the interface to update
++ :param alias: New interface alias
++ """
++ try:
++ with self._cache_lock:
++ self._link_cache[ifname].attributes[Link.IFLA_IFALIAS].value = alias
++ except Exception:
++ pass
++
+ def override_cache_unslave_link(self, slave, master):
+ """
+ Manually update the cache unslaving SLAVE from MASTER
+@@ -3335,6 +3347,35 @@ class NetlinkListenerWithCache(nllistener.NetlinkManagerWithListener, BaseObject
+ except Exception as e:
+ raise Exception(f'{ifname}: netlink: failed to set mtu to {mtu}: {str(e)}')
+
++ """
++ Sets the alias of the given link, updating the cache on success.
++
++ :param ifname: Name of the interface to update
++ :param alias: New alias to set for the interface.
++ :return: True if the operation was successful
++ """
++ def link_set_alias(self, ifname, alias):
++ if self.cache.get_link_alias(ifname) == alias:
++ # no need to update
++ return
++
++ self.logger.info(f'{ifname}: netlink: ip link set dev {ifname} alias {alias}')
++
++ debug = RTM_SETLINK in self.debug
++ try:
++ link = Link(RTM_SETLINK, debug, use_color=self.use_color)
++ link.flags = NLM_F_REPLACE | NLM_F_REQUEST | NLM_F_ACK
++ link.body = struct.pack('Bxxxiii', socket.AF_UNSPEC, 0, 0, 0)
++ link.add_attribute(Link.IFLA_IFNAME, ifname)
++ link.add_attribute(Link.IFLA_IFALIAS, alias or '') # empty string removes alias
++ link.build_message(next(self.sequence), self.pid)
++ result = self.tx_nlpacket_get_response_with_error(link)
++ self.cache.override_link_alias(ifname, alias)
++
++ return result
++ except Exception as e:
++ raise Exception(f'{ifname}: netlink: failed to set alias to {alias}: {str(e)}')
++
+ ############################################################################
+ # ADDRESS
+ ############################################################################
+diff --git a/ifupdown2/lib/sysfs.py b/ifupdown2/lib/sysfs.py
+index 3ac678d..fb1e405 100644
+--- a/ifupdown2/lib/sysfs.py
++++ b/ifupdown2/lib/sysfs.py
+@@ -106,28 +106,6 @@ class __Sysfs(IO, Requirements):
+ """
+ return self.read_file_oneline("/sys/class/net/%s/address" % ifname)
+
+- #
+- # ALIAS
+- #
+-
+- def link_set_alias(self, ifname, alias):
+- cached_alias = self.cache.get_link_alias(ifname)
+-
+- if cached_alias == alias:
+- return
+-
+- if not alias:
+- alias = "\n"
+-
+- if self.write_to_file("/sys/class/net/%s/ifalias" % ifname, alias):
+- pass # self.cache.override_link_mtu(ifname, mtu_int)
+-
+- def link_set_alias_dry_run(self, ifname, alias):
+- # we can remove the cache check in DRYRUN mode
+- if not alias:
+- alias = ""
+- self.write_to_file("/sys/class/net/%s/ifalias" % ifname, alias)
+-
+ ############################################################################
+ # BRIDGE
+ ############################################################################
+--
+2.50.1
+
diff --git a/debian/patches/series b/debian/patches/series
index e8aa870..1945ba9 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -10,5 +10,6 @@ pve/0009-gvgeb-fix-python-interpreter-shebang.patch
pve/0010-main-ignore-dpkg-files-when-running-hook-scripts.patch
pve/0011-nlmanager-addons-add-transparent-support-interface-a.patch
pve/0012-addons-nlcache-set-interface-mtu-through-netlink-ins.patch
+pve/0013-addons-nlcache-set-interface-alias-through-netlink-i.patch
upstream/0001-add-ipv6-slaac-support-inet6-auto-accept_ra.patch
upstream/0001-use-raw-strings-for-regex-to-fix-backslash-interpret.patch
--
2.50.1
_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
^ permalink raw reply [flat|nested] 7+ messages in thread
* [pve-devel] [PATCH ifupdown2 4/5] d/patches: ipv6 slaac: properly decode IPv6 devconf attributes
2025-08-22 12:27 [pve-devel] [PATCH ifupdown2 0/5] d/patches: improve altname support Christoph Heiss
` (2 preceding siblings ...)
2025-08-22 12:27 ` [pve-devel] [PATCH ifupdown2 3/5] d/patches: set interface alias " Christoph Heiss
@ 2025-08-22 12:27 ` Christoph Heiss
2025-08-22 12:27 ` [pve-devel] [PATCH ifupdown2 5/5] d/patches: read ipv6 devconf `disable_ipv6` attribute through netlink Christoph Heiss
2025-08-26 22:33 ` [pve-devel] applied-series: [PATCH ifupdown2 0/5] d/patches: improve altname support Thomas Lamprecht
5 siblings, 0 replies; 7+ messages in thread
From: Christoph Heiss @ 2025-08-22 12:27 UTC (permalink / raw)
To: pve-devel
Properly decode the IFLA_INET6_CONF array in IFLA_AF_SPEC by matching up
the array indices as defined in the Linux UAPI. This makes decoding a
lot more robust by not silently relying on a "magic" sequence of
attributes.
Also enables easily decoding additional attributes in the future as
needed.
Signed-off-by: Christoph Heiss <c.heiss@proxmox.com>
---
debian/patches/series | 2 +-
...ac-support-inet6-auto-and-accept_ra.patch} | 140 +++++++++++++-----
2 files changed, 107 insertions(+), 35 deletions(-)
rename debian/patches/upstream/{0001-add-ipv6-slaac-support-inet6-auto-accept_ra.patch => 0001-add-ipv6-slaac-support-inet6-auto-and-accept_ra.patch} (82%)
diff --git a/debian/patches/series b/debian/patches/series
index 1945ba9..743e05e 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -11,5 +11,5 @@ pve/0010-main-ignore-dpkg-files-when-running-hook-scripts.patch
pve/0011-nlmanager-addons-add-transparent-support-interface-a.patch
pve/0012-addons-nlcache-set-interface-mtu-through-netlink-ins.patch
pve/0013-addons-nlcache-set-interface-alias-through-netlink-i.patch
-upstream/0001-add-ipv6-slaac-support-inet6-auto-accept_ra.patch
+upstream/0001-add-ipv6-slaac-support-inet6-auto-and-accept_ra.patch
upstream/0001-use-raw-strings-for-regex-to-fix-backslash-interpret.patch
diff --git a/debian/patches/upstream/0001-add-ipv6-slaac-support-inet6-auto-accept_ra.patch b/debian/patches/upstream/0001-add-ipv6-slaac-support-inet6-auto-and-accept_ra.patch
similarity index 82%
rename from debian/patches/upstream/0001-add-ipv6-slaac-support-inet6-auto-accept_ra.patch
rename to debian/patches/upstream/0001-add-ipv6-slaac-support-inet6-auto-and-accept_ra.patch
index 4d5dbff..5a78d46 100644
--- a/debian/patches/upstream/0001-add-ipv6-slaac-support-inet6-auto-accept_ra.patch
+++ b/debian/patches/upstream/0001-add-ipv6-slaac-support-inet6-auto-and-accept_ra.patch
@@ -1,17 +1,17 @@
-From 38dadc7048726671b8e1bf6c63a3313720afeaf9 Mon Sep 17 00:00:00 2001
+From fbaf352df432f66429fd3d3144733b22e8317356 Mon Sep 17 00:00:00 2001
From: Alexandre Derumier <aderumier@odiso.com>
Date: Tue, 9 May 2023 17:48:14 +0200
-Subject: [PATCH] add ipv6 slaac support (inet6 auto && accept_ra)
+Subject: [PATCH] add ipv6 slaac support (inet6 auto and accept_ra)
+
+First, properly decode the IFLA_INET6_CONF array in IFLA_AF_SPEC by
+matching up the array indices as defined in the Linux UAPI.
This should fix a lot of users request in the forum,
and also fix upgrade from ifupdown1 to ifupdown2 if user have "inet6 auto" in configuration.
(default on stock debian install, this break pbs install on top of stock debian)
-upstream pull request:
-
-https://github.com/CumulusNetworks/ifupdown2/pull/259
-Signed-off-by: Alexandre Derumier <aderumier@odiso.com>
-Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
+Upstream-PR: https://github.com/CumulusNetworks/ifupdown2/pull/325
+Co-Authored-By: Alexandre Derumier <aderumier@odiso.com>
Signed-off-by: Christoph Heiss <c.heiss@proxmox.com>
---
etc/network/ifupdown2/addons.conf | 2 +
@@ -22,8 +22,8 @@ Signed-off-by: Christoph Heiss <c.heiss@proxmox.com>
ifupdown2/ifupdown/networkinterfaces.py | 2 +-
ifupdown2/lib/nlcache.py | 63 ++++++++-
ifupdown2/man/interfaces.5.rst | 9 ++
- ifupdown2/nlmanager/nlpacket.py | 24 +++-
- 9 files changed, 372 insertions(+), 26 deletions(-)
+ ifupdown2/nlmanager/nlpacket.py | 89 ++++++++++++-
+ 9 files changed, 437 insertions(+), 26 deletions(-)
create mode 100644 ifupdown2/addons/auto.py
diff --git a/etc/network/ifupdown2/addons.conf b/etc/network/ifupdown2/addons.conf
@@ -47,7 +47,7 @@ index a8f2317..5a3964d 100644
down,address
down,usercmds
diff --git a/ifupdown2/addons/address.py b/ifupdown2/addons/address.py
-index c19b138..3ab8309 100644
+index d158c44..3196a5e 100644
--- a/ifupdown2/addons/address.py
+++ b/ifupdown2/addons/address.py
@@ -193,6 +193,18 @@ class address(AddonWithIpBlackList, moduleBase):
@@ -197,7 +197,7 @@ index c19b138..3ab8309 100644
return
if not user_configured_ipv6_addrgen:
-@@ -1269,7 +1343,7 @@ class address(AddonWithIpBlackList, moduleBase):
+@@ -1271,7 +1345,7 @@ class address(AddonWithIpBlackList, moduleBase):
if not self.cache.link_exists(ifaceobj.name):
return
addr_method = ifaceobj.addr_method
@@ -206,7 +206,7 @@ index c19b138..3ab8309 100644
if ifaceobj.get_attr_value_first('address-purge')=='no':
addrlist = ifaceobj.get_attr_value('address')
for addr in addrlist or []:
-@@ -1382,6 +1456,22 @@ class address(AddonWithIpBlackList, moduleBase):
+@@ -1384,6 +1458,22 @@ class address(AddonWithIpBlackList, moduleBase):
ifaceobjcurr.update_config_with_status('mpls-enable',
running_mpls_enable,
mpls_enable != running_mpls_enable)
@@ -229,7 +229,7 @@ index c19b138..3ab8309 100644
return
def query_check_ipv6_addrgen(self, ifaceobj, ifaceobjcurr):
-@@ -1452,7 +1542,7 @@ class address(AddonWithIpBlackList, moduleBase):
+@@ -1454,7 +1544,7 @@ class address(AddonWithIpBlackList, moduleBase):
def _query_check_address(self, ifaceobj, ifaceobjcurr, ifaceobj_getfunc):
""" ifquery-check: attribute: "address" """
@@ -592,41 +592,113 @@ index 262d726..ca461ea 100644
source /etc/network/interfaces.d/*
diff --git a/ifupdown2/nlmanager/nlpacket.py b/ifupdown2/nlmanager/nlpacket.py
-index efc4c4e..95d59dc 100644
+index efc4c4e..6a0fef2 100644
--- a/ifupdown2/nlmanager/nlpacket.py
+++ b/ifupdown2/nlmanager/nlpacket.py
-@@ -1818,6 +1818,15 @@ class AttributeIFLA_AF_SPEC(Attribute):
+@@ -1691,6 +1691,71 @@ class AttributeIFLA_AF_SPEC(Attribute):
+ Link.IFLA_BRIDGE_VLAN_INFO: (vflags, vlanid)
+ }
+ """
++
++ # from /usr/include/linux/ipv6.h
++ # index values for entries in Link.IFLA_INET6_CONF values
++ IPV6_DEVCONF_FORWARDING = 0
++ IPV6_DEVCONF_HOPLIMIT = 1
++ IPV6_DEVCONF_MTU6 = 2
++ IPV6_DEVCONF_ACCEPT_RA = 3
++ IPV6_DEVCONF_ACCEPT_REDIRECTS = 4
++ IPV6_DEVCONF_AUTOCONF = 5
++ IPV6_DEVCONF_DAD_TRANSMITS = 6
++ IPV6_DEVCONF_RTR_SOLICITS = 7
++ IPV6_DEVCONF_RTR_SOLICIT_INTERVAL = 8
++ IPV6_DEVCONF_RTR_SOLICIT_DELAY = 9
++ IPV6_DEVCONF_USE_TEMPADDR = 10
++ IPV6_DEVCONF_TEMP_VALID_LFT = 11
++ IPV6_DEVCONF_TEMP_PREFERED_LFT = 12
++ IPV6_DEVCONF_REGEN_MAX_RETRY = 13
++ IPV6_DEVCONF_MAX_DESYNC_FACTOR = 14
++ IPV6_DEVCONF_MAX_ADDRESSES = 15
++ IPV6_DEVCONF_FORCE_MLD_VERSION = 16
++ IPV6_DEVCONF_ACCEPT_RA_DEFRTR = 17
++ IPV6_DEVCONF_ACCEPT_RA_PINFO = 18
++ IPV6_DEVCONF_ACCEPT_RA_RTR_PREF = 19
++ IPV6_DEVCONF_RTR_PROBE_INTERVAL = 20
++ IPV6_DEVCONF_ACCEPT_RA_RT_INFO_MAX_PLEN = 21
++ IPV6_DEVCONF_PROXY_NDP = 22
++ IPV6_DEVCONF_OPTIMISTIC_DAD = 23
++ IPV6_DEVCONF_ACCEPT_SOURCE_ROUTE = 24
++ IPV6_DEVCONF_MC_FORWARDING = 25
++ IPV6_DEVCONF_DISABLE_IPV6 = 26
++ IPV6_DEVCONF_ACCEPT_DAD = 27
++ IPV6_DEVCONF_FORCE_TLLAO = 28
++ IPV6_DEVCONF_NDISC_NOTIFY = 29
++ IPV6_DEVCONF_MLDV1_UNSOLICITED_REPORT_INTERVAL = 30
++ IPV6_DEVCONF_MLDV2_UNSOLICITED_REPORT_INTERVAL = 31
++ IPV6_DEVCONF_SUPPRESS_FRAG_NDISC = 32
++ IPV6_DEVCONF_ACCEPT_RA_FROM_LOCAL = 33
++ IPV6_DEVCONF_USE_OPTIMISTIC = 34
++ IPV6_DEVCONF_ACCEPT_RA_MTU = 35
++ IPV6_DEVCONF_STABLE_SECRET = 36
++ IPV6_DEVCONF_USE_OIF_ADDRS_ONLY = 37
++ IPV6_DEVCONF_ACCEPT_RA_MIN_HOP_LIMIT = 38
++ IPV6_DEVCONF_IGNORE_ROUTES_WITH_LINKDOWN = 39
++ IPV6_DEVCONF_DROP_UNICAST_IN_L2_MULTICAST = 40
++ IPV6_DEVCONF_DROP_UNSOLICITED_NA = 41
++ IPV6_DEVCONF_KEEP_ADDR_ON_DOWN = 42
++ IPV6_DEVCONF_RTR_SOLICIT_MAX_INTERVAL = 43
++ IPV6_DEVCONF_SEG6_ENABLED = 44
++ IPV6_DEVCONF_SEG6_REQUIRE_HMAC = 45
++ IPV6_DEVCONF_ENHANCED_DAD = 46
++ IPV6_DEVCONF_ADDR_GEN_MODE = 47
++ IPV6_DEVCONF_DISABLE_POLICY = 48
++ IPV6_DEVCONF_ACCEPT_RA_RT_INFO_MIN_PLEN = 49
++ IPV6_DEVCONF_NDISC_TCLASS = 50
++ IPV6_DEVCONF_RPL_SEG_ENABLED = 51
++ IPV6_DEVCONF_RA_DEFRTR_METRIC = 52
++ IPV6_DEVCONF_IOAM6_ENABLED = 53
++ IPV6_DEVCONF_IOAM6_ID = 54
++ IPV6_DEVCONF_IOAM6_ID_WIDE = 55
++ IPV6_DEVCONF_NDISC_EVICT_NOCARRIER = 56
++ IPV6_DEVCONF_ACCEPT_UNTRACKED_NA = 57
++ IPV6_DEVCONF_ACCEPT_RA_MIN_LFT = 58
++ IPV6_DEVCONF_FORCE_FORWARDING = 59
++
++
+ def __init__(self, atype, string, family, logger):
+ Attribute.__init__(self, atype, string, logger)
+ self.family = family
+@@ -1818,6 +1883,17 @@ class AttributeIFLA_AF_SPEC(Attribute):
*/
"""
-+ #only first attributes used in any kernel.
-+ ipv6_devconf = ['forwarding',
-+ 'hop_limit',
-+ 'mtu6',
-+ 'accept_ra',
-+ 'accept_redirects',
-+ 'autoconf',
-+ ]
++
++ # maps IFLA_INET6_CONF index to key name in result
++ ipv6_devconf_map = {
++ self.IPV6_DEVCONF_FORWARDING: 'forwarding',
++ self.IPV6_DEVCONF_HOPLIMIT: 'hop_limit',
++ self.IPV6_DEVCONF_MTU6: 'mtu6',
++ self.IPV6_DEVCONF_ACCEPT_RA: 'accept_ra',
++ self.IPV6_DEVCONF_ACCEPT_REDIRECTS: 'accept_redirects',
++ self.IPV6_DEVCONF_AUTOCONF: 'autoconf',
++ }
+
self.decode_length_type(data)
self.value = {}
-@@ -1896,8 +1905,21 @@ class AttributeIFLA_AF_SPEC(Attribute):
+@@ -1896,8 +1972,19 @@ class AttributeIFLA_AF_SPEC(Attribute):
(inet6_attr_length, inet6_attr_type) = unpack('=HH', sub_attr_data[:4])
inet6_attr_end = padded_length(inet6_attr_length)
+ if inet6_attr_type == Link.IFLA_INET6_CONF:
+ inet6conf_data = sub_attr_data[4:inet6_attr_end]
-+ index = 0
+ result = {}
-+ while inet6conf_data:
-+ (value, undef) = unpack('=HH', inet6conf_data[:4])
-+ result[ipv6_devconf[index]] = value
-+ inet6conf_data = inet6conf_data[4:]
-+ index = index + 1
-+ if index >= len(ipv6_devconf):
-+ inet6_attr[inet6_attr_type] = result
-+ break
++
++ for index in ipv6_devconf_map:
++ offset = index * 4
++ (value, undef) = unpack('=HH', inet6conf_data[offset:offset + 4])
++ result[ipv6_devconf_map[index]] = value
++
++ inet6_attr[inet6_attr_type] = result
+
# 1 byte attr
- if inet6_attr_type == Link.IFLA_INET6_ADDR_GEN_MODE:
@@ -635,5 +707,5 @@ index efc4c4e..95d59dc 100644
# nlmanager doesn't support multiple kernel version
--
-2.49.0
+2.50.1
--
2.50.1
_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
^ permalink raw reply [flat|nested] 7+ messages in thread
* [pve-devel] [PATCH ifupdown2 5/5] d/patches: read ipv6 devconf `disable_ipv6` attribute through netlink
2025-08-22 12:27 [pve-devel] [PATCH ifupdown2 0/5] d/patches: improve altname support Christoph Heiss
` (3 preceding siblings ...)
2025-08-22 12:27 ` [pve-devel] [PATCH ifupdown2 4/5] d/patches: ipv6 slaac: properly decode IPv6 devconf attributes Christoph Heiss
@ 2025-08-22 12:27 ` Christoph Heiss
2025-08-26 22:33 ` [pve-devel] applied-series: [PATCH ifupdown2 0/5] d/patches: improve altname support Thomas Lamprecht
5 siblings, 0 replies; 7+ messages in thread
From: Christoph Heiss @ 2025-08-22 12:27 UTC (permalink / raw)
To: pve-devel
Instead of using sysfs, read it directly from netlink, making it more
robust and enabling caching of the value.
As this patch relies on changes from
upstream/0001-add-ipv6-slaac-support-inet6-auto-and-accept_ra.patch
it needs to be applied after that.
Signed-off-by: Christoph Heiss <c.heiss@proxmox.com>
---
...pv6-devconf-disable_ipv6-attribute-t.patch | 102 ++++++++++++++++++
debian/patches/series | 1 +
2 files changed, 103 insertions(+)
create mode 100644 debian/patches/pve/0014-nlmanager-read-ipv6-devconf-disable_ipv6-attribute-t.patch
diff --git a/debian/patches/pve/0014-nlmanager-read-ipv6-devconf-disable_ipv6-attribute-t.patch b/debian/patches/pve/0014-nlmanager-read-ipv6-devconf-disable_ipv6-attribute-t.patch
new file mode 100644
index 0000000..08ad68d
--- /dev/null
+++ b/debian/patches/pve/0014-nlmanager-read-ipv6-devconf-disable_ipv6-attribute-t.patch
@@ -0,0 +1,102 @@
+From 04874163c94a638361dd811e5c5a3f4060b45e21 Mon Sep 17 00:00:00 2001
+From: Christoph Heiss <c.heiss@proxmox.com>
+Date: Fri, 22 Aug 2025 11:59:21 +0200
+Subject: [PATCH] nlmanager: read ipv6 devconf `disable_ipv6` attribute through
+ netlink
+
+Instead of using sysfs, read it directly from netlink, making it more
+robust and enabling caching of the value.
+
+Signed-off-by: Christoph Heiss <c.heiss@proxmox.com>
+---
+ ifupdown2/addons/address.py | 3 +--
+ ifupdown2/lib/iproute2.py | 2 +-
+ ifupdown2/lib/nlcache.py | 10 ++++++++++
+ ifupdown2/lib/sysfs.py | 8 --------
+ ifupdown2/nlmanager/nlpacket.py | 1 +
+ 5 files changed, 13 insertions(+), 11 deletions(-)
+
+diff --git a/ifupdown2/addons/address.py b/ifupdown2/addons/address.py
+index 377b419..46226a9 100644
+--- a/ifupdown2/addons/address.py
++++ b/ifupdown2/addons/address.py
+@@ -1517,12 +1517,11 @@ class address(AddonWithIpBlackList, moduleBase):
+ return
+
+ user_config_bool = utils.get_boolean_from_string(user_config)
+- sysfs_path = f"/proc/sys/net/ipv6/conf/{ifaceobj.name}/disable_ipv6"
+
+ ifaceobjcurr.update_config_with_status(
+ "disable-ipv6",
+ user_config,
+- user_config_bool != utils.get_boolean_from_string(self.sysfs.read_file_oneline(sysfs_path))
++ user_config_bool != self.cache.get_link_inet6_disable(ifaceobj.name),
+ )
+
+ def _query_check(self, ifaceobj, ifaceobjcurr, ifaceobj_getfunc=None):
+diff --git a/ifupdown2/lib/iproute2.py b/ifupdown2/lib/iproute2.py
+index 3760963..8192d93 100644
+--- a/ifupdown2/lib/iproute2.py
++++ b/ifupdown2/lib/iproute2.py
+@@ -512,7 +512,7 @@ class IPRoute2(Cache, Requirements):
+ if cached_ipv6_addr_gen_mode == addrgen:
+ return True
+
+- disabled_ipv6 = self.sysfs.get_ipv6_conf_disable_ipv6(ifname)
++ disabled_ipv6 = self.cache.get_link_inet6_disable(ifname)
+
+ if disabled_ipv6:
+ self.logger.info("%s: cannot set addrgen: ipv6 is disabled on this device" % ifname)
+diff --git a/ifupdown2/lib/nlcache.py b/ifupdown2/lib/nlcache.py
+index 9c15b6b..855ec43 100644
+--- a/ifupdown2/lib/nlcache.py
++++ b/ifupdown2/lib/nlcache.py
+@@ -1275,6 +1275,16 @@ class _NetlinkCache:
+ except Exception:
+ pass
+
++ def get_link_inet6_disable(self, ifname):
++ """
++ Whether IPv6 is disabled on this link or not.
++ :param ifname: str - Interface name
++ :return: boolean
++ """
++ inet6conf = self.get_link_inet6_conf(ifname)
++ if inet6conf and 'disable_ipv6' in inet6conf:
++ return bool(inet6conf['disable_ipv6'])
++ return False
+
+ #####################################################
+ #####################################################
+diff --git a/ifupdown2/lib/sysfs.py b/ifupdown2/lib/sysfs.py
+index fb1e405..6aa4284 100644
+--- a/ifupdown2/lib/sysfs.py
++++ b/ifupdown2/lib/sysfs.py
+@@ -201,12 +201,4 @@ class __Sysfs(IO, Requirements):
+ except Exception as e:
+ self.logger.warning("%s: %s %s: %s" % (bond_name, bond_attr_name, value, str(e)))
+
+- ############################################################################
+- # /proc/sys/ipv6/conf
+- ############################################################################
+-
+- def get_ipv6_conf_disable_ipv6(self, ifname):
+- return int(self.read_file_oneline("/proc/sys/net/ipv6/conf/%s/disable_ipv6" % ifname) or 0)
+-
+-
+ Sysfs = __Sysfs()
+diff --git a/ifupdown2/nlmanager/nlpacket.py b/ifupdown2/nlmanager/nlpacket.py
+index 6a0fef2..c3b0b67 100644
+--- a/ifupdown2/nlmanager/nlpacket.py
++++ b/ifupdown2/nlmanager/nlpacket.py
+@@ -1892,6 +1892,7 @@ class AttributeIFLA_AF_SPEC(Attribute):
+ self.IPV6_DEVCONF_ACCEPT_RA: 'accept_ra',
+ self.IPV6_DEVCONF_ACCEPT_REDIRECTS: 'accept_redirects',
+ self.IPV6_DEVCONF_AUTOCONF: 'autoconf',
++ self.IPV6_DEVCONF_DISABLE_IPV6: 'disable_ipv6',
+ }
+
+ self.decode_length_type(data)
+--
+2.50.1
+
diff --git a/debian/patches/series b/debian/patches/series
index 743e05e..266f57d 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -13,3 +13,4 @@ pve/0012-addons-nlcache-set-interface-mtu-through-netlink-ins.patch
pve/0013-addons-nlcache-set-interface-alias-through-netlink-i.patch
upstream/0001-add-ipv6-slaac-support-inet6-auto-and-accept_ra.patch
upstream/0001-use-raw-strings-for-regex-to-fix-backslash-interpret.patch
+pve/0014-nlmanager-read-ipv6-devconf-disable_ipv6-attribute-t.patch
--
2.50.1
_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
^ permalink raw reply [flat|nested] 7+ messages in thread
* [pve-devel] applied-series: [PATCH ifupdown2 0/5] d/patches: improve altname support
2025-08-22 12:27 [pve-devel] [PATCH ifupdown2 0/5] d/patches: improve altname support Christoph Heiss
` (4 preceding siblings ...)
2025-08-22 12:27 ` [pve-devel] [PATCH ifupdown2 5/5] d/patches: read ipv6 devconf `disable_ipv6` attribute through netlink Christoph Heiss
@ 2025-08-26 22:33 ` Thomas Lamprecht
5 siblings, 0 replies; 7+ messages in thread
From: Thomas Lamprecht @ 2025-08-26 22:33 UTC (permalink / raw)
To: pve-devel, Christoph Heiss
On Fri, 22 Aug 2025 14:27:47 +0200, Christoph Heiss wrote:
> Another round of some fixups and improvements to altname support.
>
> First off, amend the initial support patch to add translation to some
> more places, especially around sysfs access - as that always requires
> the primary interface name.
>
> Next, replace quite a few sysfs usages with netlink, making it more
> robust and adding support for altnames directly, as netlink does it also
> transparently under the hood.
>
> [...]
Applied, thanks!
[1/5] d/patches: altname support: add translation in some more places
commit: cddc125e68817923e56880f350d91dfeee68c7f9
[2/5] d/patches: set interface mtu through netlink instead of sysfs
commit: 09b50613c4aaf500a319249700376629253c11f3
[3/5] d/patches: set interface alias through netlink instead of sysfs
commit: 6493b19a9a8c937d63042bc7b6d1bb93384cb231
[4/5] d/patches: ipv6 slaac: properly decode IPv6 devconf attributes
commit: 022434458f37c6cf7186baea13a9474110fd7061
[5/5] d/patches: read ipv6 devconf `disable_ipv6` attribute through netlink
commit: e921e28ba5bc4780320d266e1d67ee49dc64537e
_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2025-08-26 22:34 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-08-22 12:27 [pve-devel] [PATCH ifupdown2 0/5] d/patches: improve altname support Christoph Heiss
2025-08-22 12:27 ` [pve-devel] [PATCH ifupdown2 1/5] d/patches: altname support: add translation in some more places Christoph Heiss
2025-08-22 12:27 ` [pve-devel] [PATCH ifupdown2 2/5] d/patches: set interface mtu through netlink instead of sysfs Christoph Heiss
2025-08-22 12:27 ` [pve-devel] [PATCH ifupdown2 3/5] d/patches: set interface alias " Christoph Heiss
2025-08-22 12:27 ` [pve-devel] [PATCH ifupdown2 4/5] d/patches: ipv6 slaac: properly decode IPv6 devconf attributes Christoph Heiss
2025-08-22 12:27 ` [pve-devel] [PATCH ifupdown2 5/5] d/patches: read ipv6 devconf `disable_ipv6` attribute through netlink Christoph Heiss
2025-08-26 22:33 ` [pve-devel] applied-series: [PATCH ifupdown2 0/5] d/patches: improve altname support Thomas Lamprecht
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox