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.he...@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.he...@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.he...@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

Reply via email to