From 5d2422d02bd3b6e028b1f42a8093da349417472d Mon Sep 17 00:00:00 2001 From: Carl Roth Date: Tue, 16 Feb 2021 21:33:42 +0000 Subject: [PATCH 1/4] Add switchdev-online service to hold off on network init The addresses a race condition between the switchdev driver, udev and ifupdown2. In some cases, ifupdown2 attempts to configure switchdev interfaces (1) before they are ready, or (2) before any udev rules have had a chance to rename them per udev configuration. When this happens, not all interfaces are configured correctly. The solution is to 1. create a dummy systemd service for each switchdev interface (platform specific) that depends on the well-known systemd device path for that netdev (currently 'sys-subsystem-net-devices-FOO.device'. 2. Make the system-wide network-pre.service depend on *all* switchdev devices coming online 3. make ifupdown2 (via networking.service) depend on network-pre.service See https://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/ Signed-off-by: Carl Roth --- .../switchdev-online.conf | 2 ++ .../systemd/system/switchdev-online@.service | 20 +++++++++++++++++++ .../arm64_accton_as4224_52p_r0/__init__.py | 5 +++++ .../arm64_accton_as4224_52t_r0/__init__.py | 5 +++++ .../arm64_accton_as5114_48x_r0/__init__.py | 4 ++++ .../python/arm64_delta_tn4810m_r0/__init__.py | 5 +++++ .../arm64_delta_tn48m_poe_r0/__init__.py | 5 +++++ .../python/arm64_delta_tn48m_r0/__init__.py | 5 +++++ .../python/arm64_delta_tn48m2_r0/__init__.py | 5 +++++ 9 files changed, 56 insertions(+) create mode 100644 builds/any/rootfs/stretch/common/overlay/etc/systemd/system/networking.service.d/switchdev-online.conf create mode 100644 builds/any/rootfs/stretch/common/overlay/etc/systemd/system/switchdev-online@.service diff --git a/builds/any/rootfs/stretch/common/overlay/etc/systemd/system/networking.service.d/switchdev-online.conf b/builds/any/rootfs/stretch/common/overlay/etc/systemd/system/networking.service.d/switchdev-online.conf new file mode 100644 index 000000000..7b0203994 --- /dev/null +++ b/builds/any/rootfs/stretch/common/overlay/etc/systemd/system/networking.service.d/switchdev-online.conf @@ -0,0 +1,2 @@ +[Unit] +After=network-pre.target \ No newline at end of file diff --git a/builds/any/rootfs/stretch/common/overlay/etc/systemd/system/switchdev-online@.service b/builds/any/rootfs/stretch/common/overlay/etc/systemd/system/switchdev-online@.service new file mode 100644 index 000000000..1b786ffe0 --- /dev/null +++ b/builds/any/rootfs/stretch/common/overlay/etc/systemd/system/switchdev-online@.service @@ -0,0 +1,20 @@ +[Unit] +Description=Online state for switchdev device %i + +# See e.g. +# https://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/ +Wants=network-pre.target +Before=network-pre.target + +# this is the naming scheme currently used for network devices +Wants=sys-subsystem-net-devices-%i.device +After=sys-subsystem-net-devices-%i.device + +[Service] +Type=simple +RemainAfterExit=yes +ExecStart=/bin/true +TimeoutStartSec=30 + +[Install] +WantedBy=network.target diff --git a/packages/platforms/accton/arm64/as4224/as4224-52p/platform-config/r0/src/python/arm64_accton_as4224_52p_r0/__init__.py b/packages/platforms/accton/arm64/as4224/as4224-52p/platform-config/r0/src/python/arm64_accton_as4224_52p_r0/__init__.py index 66e56f07c..ab4931840 100644 --- a/packages/platforms/accton/arm64/as4224/as4224-52p/platform-config/r0/src/python/arm64_accton_as4224_52p_r0/__init__.py +++ b/packages/platforms/accton/arm64/as4224/as4224-52p/platform-config/r0/src/python/arm64_accton_as4224_52p_r0/__init__.py @@ -52,4 +52,9 @@ def baseconfig(self): self.insmod("prestera_sw.ko") self.insmod("prestera_pci.ko") + # setup systemctl rules + for swp in range(1, 53): + cmd = "systemctl enable switchdev-online@swp%d" % swp + subprocess.check_call(cmd, shell=True) + return True diff --git a/packages/platforms/accton/arm64/as4224/as4224-52t/platform-config/r0/src/python/arm64_accton_as4224_52t_r0/__init__.py b/packages/platforms/accton/arm64/as4224/as4224-52t/platform-config/r0/src/python/arm64_accton_as4224_52t_r0/__init__.py index ac18b3cf7..e151d7743 100644 --- a/packages/platforms/accton/arm64/as4224/as4224-52t/platform-config/r0/src/python/arm64_accton_as4224_52t_r0/__init__.py +++ b/packages/platforms/accton/arm64/as4224/as4224-52t/platform-config/r0/src/python/arm64_accton_as4224_52t_r0/__init__.py @@ -52,4 +52,9 @@ def baseconfig(self): self.insmod("prestera_sw.ko") self.insmod("prestera_pci.ko") + # setup systemctl rules + for swp in range(1, 53): + cmd = "systemctl enable switchdev-online@swp%d" % swp + subprocess.check_call(cmd, shell=True) + return True diff --git a/packages/platforms/accton/arm64/as4224/as5114-48x/platform-config/r0/src/python/arm64_accton_as5114_48x_r0/__init__.py b/packages/platforms/accton/arm64/as4224/as5114-48x/platform-config/r0/src/python/arm64_accton_as5114_48x_r0/__init__.py index 86d03be73..07937b8ae 100644 --- a/packages/platforms/accton/arm64/as4224/as5114-48x/platform-config/r0/src/python/arm64_accton_as5114_48x_r0/__init__.py +++ b/packages/platforms/accton/arm64/as4224/as5114-48x/platform-config/r0/src/python/arm64_accton_as5114_48x_r0/__init__.py @@ -52,5 +52,9 @@ def baseconfig(self): self.insmod("prestera_sw.ko") self.insmod("prestera_pci.ko") + # setup systemctl rules + for swp in range(1, 49): + cmd = "systemctl enable switchdev-online@swp%d" % swp + subprocess.check_call(cmd, shell=True) return True diff --git a/packages/platforms/delta/arm64/tn48m/tn4810m/platform-config/r0/src/python/arm64_delta_tn4810m_r0/__init__.py b/packages/platforms/delta/arm64/tn48m/tn4810m/platform-config/r0/src/python/arm64_delta_tn4810m_r0/__init__.py index 72573130c..f159a13eb 100755 --- a/packages/platforms/delta/arm64/tn48m/tn4810m/platform-config/r0/src/python/arm64_delta_tn4810m_r0/__init__.py +++ b/packages/platforms/delta/arm64/tn48m/tn4810m/platform-config/r0/src/python/arm64_delta_tn4810m_r0/__init__.py @@ -45,4 +45,9 @@ def baseconfig(self): # Suggested by Taras Chornyi self.modprobe('prestera_pci') + # setup systemctl rules + for swp in range(1, 49): + cmd = "systemctl enable switchdev-online@swp%d" % swp + subprocess.check_call(cmd, shell=True) + return True diff --git a/packages/platforms/delta/arm64/tn48m/tn48m-poe/platform-config/r0/src/python/arm64_delta_tn48m_poe_r0/__init__.py b/packages/platforms/delta/arm64/tn48m/tn48m-poe/platform-config/r0/src/python/arm64_delta_tn48m_poe_r0/__init__.py index db5704d03..0b85eb3cf 100755 --- a/packages/platforms/delta/arm64/tn48m/tn48m-poe/platform-config/r0/src/python/arm64_delta_tn48m_poe_r0/__init__.py +++ b/packages/platforms/delta/arm64/tn48m/tn48m-poe/platform-config/r0/src/python/arm64_delta_tn48m_poe_r0/__init__.py @@ -39,4 +39,9 @@ def baseconfig(self): # Suggested by Taras Chornyi self.modprobe('prestera_pci') + # setup systemctl rules + for swp in range(1, 53): + cmd = "systemctl enable switchdev-online@swp%d" % swp + subprocess.check_call(cmd, shell=True) + return True diff --git a/packages/platforms/delta/arm64/tn48m/tn48m/platform-config/r0/src/python/arm64_delta_tn48m_r0/__init__.py b/packages/platforms/delta/arm64/tn48m/tn48m/platform-config/r0/src/python/arm64_delta_tn48m_r0/__init__.py index a52c4d619..4109ab556 100755 --- a/packages/platforms/delta/arm64/tn48m/tn48m/platform-config/r0/src/python/arm64_delta_tn48m_r0/__init__.py +++ b/packages/platforms/delta/arm64/tn48m/tn48m/platform-config/r0/src/python/arm64_delta_tn48m_r0/__init__.py @@ -30,5 +30,10 @@ def baseconfig(self): # Suggested by Taras Chornyi self.modprobe('prestera_pci') + # setup systemctl rules + for swp in range(1, 53): + cmd = "systemctl enable switchdev-online@swp%d" % swp + subprocess.check_call(cmd, shell=True) + return True diff --git a/packages/platforms/delta/arm64/tn48m/tn48m2/platform-config/r0/src/python/arm64_delta_tn48m2_r0/__init__.py b/packages/platforms/delta/arm64/tn48m/tn48m2/platform-config/r0/src/python/arm64_delta_tn48m2_r0/__init__.py index 332ad9660..566eef855 100755 --- a/packages/platforms/delta/arm64/tn48m/tn48m2/platform-config/r0/src/python/arm64_delta_tn48m2_r0/__init__.py +++ b/packages/platforms/delta/arm64/tn48m/tn48m2/platform-config/r0/src/python/arm64_delta_tn48m2_r0/__init__.py @@ -30,4 +30,9 @@ def baseconfig(self): # Suggested by Taras Chornyi self.modprobe('prestera_pci') + # setup systemctl rules + for swp in range(1, 53): + cmd = "systemctl enable switchdev-online@swp%d" % swp + subprocess.check_call(cmd, shell=True) + return True From 9163dff9815d722951c5c93bc3856684bc8f4c4c Mon Sep 17 00:00:00 2001 From: Carl Roth Date: Tue, 23 Feb 2021 16:37:33 +0000 Subject: [PATCH 2/4] update line ending per review Signed-off-by: Carl Roth --- .../systemd/system/networking.service.d/switchdev-online.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/builds/any/rootfs/stretch/common/overlay/etc/systemd/system/networking.service.d/switchdev-online.conf b/builds/any/rootfs/stretch/common/overlay/etc/systemd/system/networking.service.d/switchdev-online.conf index 7b0203994..4e9b7d40d 100644 --- a/builds/any/rootfs/stretch/common/overlay/etc/systemd/system/networking.service.d/switchdev-online.conf +++ b/builds/any/rootfs/stretch/common/overlay/etc/systemd/system/networking.service.d/switchdev-online.conf @@ -1,2 +1,2 @@ [Unit] -After=network-pre.target \ No newline at end of file +After=network-pre.target From e7371ee8cc80c4cb50071042073a63c184151255 Mon Sep 17 00:00:00 2001 From: Carl Roth Date: Tue, 23 Feb 2021 16:39:26 +0000 Subject: [PATCH 3/4] Add switchdev-online support for Delta tn48m-dn platforms - based on fixes for non-DN systems - please check my work, I don't have physical access to these systems to verify port count Signed-off-by: Carl Roth --- .../r0/src/python/arm64_delta_tn4810m_dn_r0/__init__.py | 5 +++++ .../r0/src/python/arm64_delta_tn48m_dn_r0/__init__.py | 5 +++++ .../r0/src/python/arm64_delta_tn48m_poe_dn_r0/__init__.py | 5 +++++ 3 files changed, 15 insertions(+) diff --git a/packages/platforms/delta/arm64/tn48m-dn/tn4810m-dn/platform-config/r0/src/python/arm64_delta_tn4810m_dn_r0/__init__.py b/packages/platforms/delta/arm64/tn48m-dn/tn4810m-dn/platform-config/r0/src/python/arm64_delta_tn4810m_dn_r0/__init__.py index 76438aaae..6d5999fd8 100755 --- a/packages/platforms/delta/arm64/tn48m-dn/tn4810m-dn/platform-config/r0/src/python/arm64_delta_tn4810m_dn_r0/__init__.py +++ b/packages/platforms/delta/arm64/tn48m-dn/tn4810m-dn/platform-config/r0/src/python/arm64_delta_tn4810m_dn_r0/__init__.py @@ -41,4 +41,9 @@ def baseconfig(self): # Suggested by Taras Chornyi self.modprobe('prestera_pci') + # set up systemctl rules + for swp in range(1, 49): + cmd = "systemctl enable switchdev-online@swp%d" % swp + subprocess.check_call(cmd, shell=True) + return True diff --git a/packages/platforms/delta/arm64/tn48m-dn/tn48m-dn/platform-config/r0/src/python/arm64_delta_tn48m_dn_r0/__init__.py b/packages/platforms/delta/arm64/tn48m-dn/tn48m-dn/platform-config/r0/src/python/arm64_delta_tn48m_dn_r0/__init__.py index 77fb9dbec..def6f2e10 100755 --- a/packages/platforms/delta/arm64/tn48m-dn/tn48m-dn/platform-config/r0/src/python/arm64_delta_tn48m_dn_r0/__init__.py +++ b/packages/platforms/delta/arm64/tn48m-dn/tn48m-dn/platform-config/r0/src/python/arm64_delta_tn48m_dn_r0/__init__.py @@ -30,5 +30,10 @@ def baseconfig(self): # Suggested by Taras Chornyi self.modprobe('prestera_pci') + # set up systemctl rules + for swp in range(1, 53): + cmd = "systemctl enable switchdev-online@swp%d" % swp + subprocess.check_call(cmd, shell=True) + return True diff --git a/packages/platforms/delta/arm64/tn48m-dn/tn48m-poe-dn/platform-config/r0/src/python/arm64_delta_tn48m_poe_dn_r0/__init__.py b/packages/platforms/delta/arm64/tn48m-dn/tn48m-poe-dn/platform-config/r0/src/python/arm64_delta_tn48m_poe_dn_r0/__init__.py index 7caff4327..dc4241265 100755 --- a/packages/platforms/delta/arm64/tn48m-dn/tn48m-poe-dn/platform-config/r0/src/python/arm64_delta_tn48m_poe_dn_r0/__init__.py +++ b/packages/platforms/delta/arm64/tn48m-dn/tn48m-poe-dn/platform-config/r0/src/python/arm64_delta_tn48m_poe_dn_r0/__init__.py @@ -39,4 +39,9 @@ def baseconfig(self): # Suggested by Taras Chornyi self.modprobe('prestera_pci') + # set up systemctl rules + for swp in range(1, 53): + cmd = "systemctl enable switchdev-online@swp%d" % swp + subprocess.check_call(cmd, shell=True) + return True From 2239971367369f9c6a9dd60672ad0336e703f7ce Mon Sep 17 00:00:00 2001 From: Carl Roth Date: Tue, 23 Feb 2021 16:40:12 +0000 Subject: [PATCH 4/4] spray for spelling, per review Signed-off-by: Carl Roth --- .../r0/src/python/arm64_accton_as4224_52p_r0/__init__.py | 2 +- .../r0/src/python/arm64_accton_as4224_52t_r0/__init__.py | 2 +- .../r0/src/python/arm64_accton_as5114_48x_r0/__init__.py | 2 +- .../r0/src/python/arm64_delta_tn4810m_r0/__init__.py | 2 +- .../r0/src/python/arm64_delta_tn48m_poe_r0/__init__.py | 2 +- .../r0/src/python/arm64_delta_tn48m_r0/__init__.py | 2 +- .../r0/src/python/arm64_delta_tn48m2_r0/__init__.py | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/platforms/accton/arm64/as4224/as4224-52p/platform-config/r0/src/python/arm64_accton_as4224_52p_r0/__init__.py b/packages/platforms/accton/arm64/as4224/as4224-52p/platform-config/r0/src/python/arm64_accton_as4224_52p_r0/__init__.py index ab4931840..edb1aaab9 100644 --- a/packages/platforms/accton/arm64/as4224/as4224-52p/platform-config/r0/src/python/arm64_accton_as4224_52p_r0/__init__.py +++ b/packages/platforms/accton/arm64/as4224/as4224-52p/platform-config/r0/src/python/arm64_accton_as4224_52p_r0/__init__.py @@ -52,7 +52,7 @@ def baseconfig(self): self.insmod("prestera_sw.ko") self.insmod("prestera_pci.ko") - # setup systemctl rules + # set up systemctl rules for swp in range(1, 53): cmd = "systemctl enable switchdev-online@swp%d" % swp subprocess.check_call(cmd, shell=True) diff --git a/packages/platforms/accton/arm64/as4224/as4224-52t/platform-config/r0/src/python/arm64_accton_as4224_52t_r0/__init__.py b/packages/platforms/accton/arm64/as4224/as4224-52t/platform-config/r0/src/python/arm64_accton_as4224_52t_r0/__init__.py index e151d7743..cb3a11317 100644 --- a/packages/platforms/accton/arm64/as4224/as4224-52t/platform-config/r0/src/python/arm64_accton_as4224_52t_r0/__init__.py +++ b/packages/platforms/accton/arm64/as4224/as4224-52t/platform-config/r0/src/python/arm64_accton_as4224_52t_r0/__init__.py @@ -52,7 +52,7 @@ def baseconfig(self): self.insmod("prestera_sw.ko") self.insmod("prestera_pci.ko") - # setup systemctl rules + # set up systemctl rules for swp in range(1, 53): cmd = "systemctl enable switchdev-online@swp%d" % swp subprocess.check_call(cmd, shell=True) diff --git a/packages/platforms/accton/arm64/as4224/as5114-48x/platform-config/r0/src/python/arm64_accton_as5114_48x_r0/__init__.py b/packages/platforms/accton/arm64/as4224/as5114-48x/platform-config/r0/src/python/arm64_accton_as5114_48x_r0/__init__.py index 07937b8ae..98767ff21 100644 --- a/packages/platforms/accton/arm64/as4224/as5114-48x/platform-config/r0/src/python/arm64_accton_as5114_48x_r0/__init__.py +++ b/packages/platforms/accton/arm64/as4224/as5114-48x/platform-config/r0/src/python/arm64_accton_as5114_48x_r0/__init__.py @@ -52,7 +52,7 @@ def baseconfig(self): self.insmod("prestera_sw.ko") self.insmod("prestera_pci.ko") - # setup systemctl rules + # set up systemctl rules for swp in range(1, 49): cmd = "systemctl enable switchdev-online@swp%d" % swp subprocess.check_call(cmd, shell=True) diff --git a/packages/platforms/delta/arm64/tn48m/tn4810m/platform-config/r0/src/python/arm64_delta_tn4810m_r0/__init__.py b/packages/platforms/delta/arm64/tn48m/tn4810m/platform-config/r0/src/python/arm64_delta_tn4810m_r0/__init__.py index f159a13eb..708a557ed 100755 --- a/packages/platforms/delta/arm64/tn48m/tn4810m/platform-config/r0/src/python/arm64_delta_tn4810m_r0/__init__.py +++ b/packages/platforms/delta/arm64/tn48m/tn4810m/platform-config/r0/src/python/arm64_delta_tn4810m_r0/__init__.py @@ -45,7 +45,7 @@ def baseconfig(self): # Suggested by Taras Chornyi self.modprobe('prestera_pci') - # setup systemctl rules + # set up systemctl rules for swp in range(1, 49): cmd = "systemctl enable switchdev-online@swp%d" % swp subprocess.check_call(cmd, shell=True) diff --git a/packages/platforms/delta/arm64/tn48m/tn48m-poe/platform-config/r0/src/python/arm64_delta_tn48m_poe_r0/__init__.py b/packages/platforms/delta/arm64/tn48m/tn48m-poe/platform-config/r0/src/python/arm64_delta_tn48m_poe_r0/__init__.py index 0b85eb3cf..4632d51e6 100755 --- a/packages/platforms/delta/arm64/tn48m/tn48m-poe/platform-config/r0/src/python/arm64_delta_tn48m_poe_r0/__init__.py +++ b/packages/platforms/delta/arm64/tn48m/tn48m-poe/platform-config/r0/src/python/arm64_delta_tn48m_poe_r0/__init__.py @@ -39,7 +39,7 @@ def baseconfig(self): # Suggested by Taras Chornyi self.modprobe('prestera_pci') - # setup systemctl rules + # set up systemctl rules for swp in range(1, 53): cmd = "systemctl enable switchdev-online@swp%d" % swp subprocess.check_call(cmd, shell=True) diff --git a/packages/platforms/delta/arm64/tn48m/tn48m/platform-config/r0/src/python/arm64_delta_tn48m_r0/__init__.py b/packages/platforms/delta/arm64/tn48m/tn48m/platform-config/r0/src/python/arm64_delta_tn48m_r0/__init__.py index 4109ab556..338272f4f 100755 --- a/packages/platforms/delta/arm64/tn48m/tn48m/platform-config/r0/src/python/arm64_delta_tn48m_r0/__init__.py +++ b/packages/platforms/delta/arm64/tn48m/tn48m/platform-config/r0/src/python/arm64_delta_tn48m_r0/__init__.py @@ -30,7 +30,7 @@ def baseconfig(self): # Suggested by Taras Chornyi self.modprobe('prestera_pci') - # setup systemctl rules + # set up systemctl rules for swp in range(1, 53): cmd = "systemctl enable switchdev-online@swp%d" % swp subprocess.check_call(cmd, shell=True) diff --git a/packages/platforms/delta/arm64/tn48m/tn48m2/platform-config/r0/src/python/arm64_delta_tn48m2_r0/__init__.py b/packages/platforms/delta/arm64/tn48m/tn48m2/platform-config/r0/src/python/arm64_delta_tn48m2_r0/__init__.py index 566eef855..20d829e6c 100755 --- a/packages/platforms/delta/arm64/tn48m/tn48m2/platform-config/r0/src/python/arm64_delta_tn48m2_r0/__init__.py +++ b/packages/platforms/delta/arm64/tn48m/tn48m2/platform-config/r0/src/python/arm64_delta_tn48m2_r0/__init__.py @@ -30,7 +30,7 @@ def baseconfig(self): # Suggested by Taras Chornyi self.modprobe('prestera_pci') - # setup systemctl rules + # set up systemctl rules for swp in range(1, 53): cmd = "systemctl enable switchdev-online@swp%d" % swp subprocess.check_call(cmd, shell=True)