public inbox for pve-devel@lists.proxmox.com
 help / color / mirror / Atom feed
From: Christoph Heiss <c.heiss@proxmox.com>
To: pve-devel@lists.proxmox.com
Subject: [pve-devel] [PATCH ifupdown2 1/5] d/patches: altname support: add translation in some more places
Date: Fri, 22 Aug 2025 14:27:48 +0200	[thread overview]
Message-ID: <20250822122754.842281-2-c.heiss@proxmox.com> (raw)
In-Reply-To: <20250822122754.842281-1-c.heiss@proxmox.com>

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


  reply	other threads:[~2025-08-22 12:28 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
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 [this message]
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

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20250822122754.842281-2-c.heiss@proxmox.com \
    --to=c.heiss@proxmox.com \
    --cc=pve-devel@lists.proxmox.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal