Skip to content

Commit bf592f6

Browse files
authored
[systemd/systemd-sonic-generator]: Systemd midplane network service of Smart Switch (#18178)
Why I did it Add systemd network service of Smart Switch for configuring the midplane network. How I did it Add related systemd services and networkd configuration According to paltform.json, the systemd-sonic-generator will install required services. The changes are based on the HLD: sonic-net/SONiC#1534 and sonic-net/SONiC#1586 How to verify it Check Azp that no failure to the existing testcases Check NPU scenario: 2.1 Start a KVM and add the NPU platform.json as following echo '{"DPUS":{"dpu0":{}, "dpu1":{}}}' | sudo tee /usr/share/sonic/device/x86_64-kvm_x86_64-r0/platform.json 2.2 You should get two specific database containers for DPU admin@vlab-01:~$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4455f7ab611c docker-database:latest "/usr/local/bin/dock…" 5 minutes ago Up 5 minutes databasedpu0 8e983b5beb27 docker-database:latest "/usr/local/bin/dock…" 5 minutes ago Up 5 minutes databasedpu1 2.3 Check the expected service midplane-network-npu.service is enabled but the midplane-network-dpu.service is disabled admin@vlab-01:~$ sudo systemctl list-unit-files '*midplane*' UNIT FILE STATE PRESET midplane-network-dpu.service disabled enabled midplane-network-npu.service enabled-runtime enabled 2.4 Check the bridge-midplane has been created. admin@vlab-01:~$ sudo brctl show bridge name bridge id STP enabled interfaces ... bridge-midplane 8000.76c5a51a18f6 no dummy-midplane 2.5 If we create two mock dpu interfaces, they should be added into the bridge-midplane automatically admin@vlab-01:~$ sudo ip link add dpu0 type veth peer dpu1 admin@vlab-01:~$ sudo brctl show bridge name bridge id STP enabled interfaces ... bridge-midplane 8000.76c5a51a18f6 no dpu0 dpu1 dummy-midplane Check DPU scenario: 3.1 Start a KVM and add the DPU platform.json as following echo '{"DPU":{}}' | sudo tee /usr/share/sonic/device/x86_64-kvm_x86_64-r0/platform.json 3.2 Check the expected service midplane-network-dpu.service is enabled but the midplane-network-npu.service is disabled admin@vlab-01:~$ sudo systemctl list-unit-files '*midplane*' UNIT FILE STATE PRESET midplane-network-dpu.service disabled enabled midplane-network-npu.service enabled-runtime enabled 3.3 The database service should be started after(waiting for) midplane-network-dpu.service with a 10mins delay admin@vlab-01:~$ uptime 16:08:21 up 29 min, 1 user, load average: 0.01, 0.08, 0.12 admin@vlab-01:~$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ... ae5195283cd6 docker-database:latest "/usr/local/bin/dock…" 35 minutes ago Up 18 minutes database 29min-18min≈10mins (Because in the KVM, we don't have an exact eth0-midplane interface and its DHCP provider) Signed-off-by: Ze Gan <[email protected]>
1 parent cd09284 commit bf592f6

23 files changed

+943
-66
lines changed

files/build_templates/sonic_debian_extension.j2

+29
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ DOCKER_CTL_SCRIPT="$DOCKER_CTL_DIR/docker.sh"
4747
FILESYSTEM_ROOT_USR="$FILESYSTEM_ROOT/usr"
4848
FILESYSTEM_ROOT_USR_LIB="$FILESYSTEM_ROOT/usr/lib/"
4949
FILESYSTEM_ROOT_USR_LIB_SYSTEMD_SYSTEM="$FILESYSTEM_ROOT_USR_LIB/systemd/system"
50+
FILESYSTEM_ROOT_USR_LIB_SYSTEMD_NETWORK="$FILESYSTEM_ROOT_USR_LIB/systemd/network"
5051
FILESYSTEM_ROOT_USR_SHARE="$FILESYSTEM_ROOT_USR/share"
5152
FILESYSTEM_ROOT_USR_SHARE_SONIC="$FILESYSTEM_ROOT_USR_SHARE/sonic"
5253
FILESYSTEM_ROOT_USR_SHARE_SONIC_SCRIPTS="$FILESYSTEM_ROOT_USR_SHARE_SONIC/scripts"
@@ -637,6 +638,34 @@ sudo cp $IMAGE_CONFIGS/config-chassisdb/config-chassisdb $FILESYSTEM_ROOT/usr/bi
637638
echo "config-chassisdb.service" | sudo tee -a $GENERATED_SERVICE_FILE
638639
sudo LANG=C chroot $FILESYSTEM_ROOT systemctl enable config-chassisdb.service
639640

641+
# Copy midplane network service file for smart switch
642+
sudo cp $IMAGE_CONFIGS/midplane-network/bridge-midplane.netdev $FILESYSTEM_ROOT_USR_LIB_SYSTEMD_NETWORK/bridge-midplane.netdev
643+
sudo cp $IMAGE_CONFIGS/midplane-network/bridge-midplane.network $FILESYSTEM_ROOT_USR_LIB_SYSTEMD_NETWORK/bridge-midplane.network
644+
sudo cp $IMAGE_CONFIGS/midplane-network/dummy-midplane.netdev $FILESYSTEM_ROOT_USR_LIB_SYSTEMD_NETWORK/dummy-midplane.netdev
645+
sudo cp $IMAGE_CONFIGS/midplane-network/dummy-midplane.network $FILESYSTEM_ROOT_USR_LIB_SYSTEMD_NETWORK/dummy-midplane.network
646+
sudo cp $IMAGE_CONFIGS/midplane-network/midplane-network-npu.network $FILESYSTEM_ROOT_USR_LIB_SYSTEMD_NETWORK/midplane-network-npu.network
647+
sudo cp $IMAGE_CONFIGS/midplane-network/midplane-network-dpu.network $FILESYSTEM_ROOT_USR_LIB_SYSTEMD_NETWORK/midplane-network-dpu.network
648+
sudo cp $IMAGE_CONFIGS/midplane-network/midplane-network-npu.service $FILESYSTEM_ROOT_USR_LIB_SYSTEMD_SYSTEM/midplane-network-npu.service
649+
sudo cp $IMAGE_CONFIGS/midplane-network/midplane-network-dpu.service $FILESYSTEM_ROOT_USR_LIB_SYSTEMD_SYSTEM/midplane-network-dpu.service
650+
651+
# Disable smart switch unit by default, these units will be controlled by systemd-sonic-generator
652+
sudo ln -s /dev/null $FILESYSTEM_ROOT/etc/systemd/network/bridge-midplane.netdev
653+
sudo ln -s /dev/null $FILESYSTEM_ROOT/etc/systemd/network/bridge-midplane.network
654+
sudo ln -s /dev/null $FILESYSTEM_ROOT/etc/systemd/network/dummy-midplane.netdev
655+
sudo ln -s /dev/null $FILESYSTEM_ROOT/etc/systemd/network/dummy-midplane.network
656+
sudo ln -s /dev/null $FILESYSTEM_ROOT/etc/systemd/network/midplane-network-npu.network
657+
sudo ln -s /dev/null $FILESYSTEM_ROOT/etc/systemd/network/midplane-network-dpu.network
658+
echo "midplane-network-npu.service" | sudo tee -a $GENERATED_SERVICE_FILE
659+
sudo LANG=C chroot $FILESYSTEM_ROOT systemctl disable midplane-network-npu.service
660+
echo "midplane-network-dpu.service" | sudo tee -a $GENERATED_SERVICE_FILE
661+
sudo LANG=C chroot $FILESYSTEM_ROOT systemctl disable midplane-network-dpu.service
662+
663+
# According to the issue: https://github.com/systemd/systemd/issues/19106, To disable ManageForeignRoutingPolicyRules to avoid the ip rules being deleted by systemd-networkd
664+
sudo sed -i 's/#ManageForeignRoutingPolicyRules=yes/ManageForeignRoutingPolicyRules=no/g' $FILESYSTEM_ROOT/etc/systemd/networkd.conf
665+
666+
sudo LANG=C chroot $FILESYSTEM_ROOT systemctl enable systemd-networkd
667+
sudo LANG=C chroot $FILESYSTEM_ROOT systemctl disable systemd-networkd-wait-online.service
668+
640669
# Copy backend-acl script and service file
641670
sudo cp $IMAGE_CONFIGS/backend_acl/backend-acl.service $FILESYSTEM_ROOT_USR_LIB_SYSTEMD_SYSTEM/backend-acl.service
642671
sudo cp $IMAGE_CONFIGS/backend_acl/backend_acl.py $FILESYSTEM_ROOT/usr/bin/backend_acl.py
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
# Bridge interface for midplane network
2+
3+
[NetDev]
4+
Name=bridge-midplane
5+
Kind=bridge
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
# Network configuration for bridge midplane
2+
3+
[Match]
4+
Name=bridge-midplane
5+
6+
[Network]
7+
Address=169.254.200.254/24
8+
LinkLocalAddressing=no
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
# Dummy interface for midplane network
2+
3+
[NetDev]
4+
Name=dummy-midplane
5+
Kind=dummy
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# The systemd-networkd requires that the bridge interface(bridge-midplane) has at least one member interface, otherwise the IP address will not be configured.
2+
# This dummy interface will be added into the bridge-midplane as a member to guarantee the IP address configuration correctly.
3+
# Refer: https://github.com/systemd/systemd/issues/9252#issuecomment-771540028
4+
5+
[Match]
6+
Name=dummy-midplane
7+
8+
[Network]
9+
Bridge=bridge-midplane
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
[Match]
2+
Name=eth0-midplane
3+
4+
[Network]
5+
DHCP=yes
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
# Oneshot midplane network service
2+
3+
[Unit]
4+
Description=Midplane network service
5+
Requires=systemd-networkd.service
6+
After=systemd-networkd.service
7+
Before=database.service
8+
9+
[Service]
10+
Type=oneshot
11+
User=root
12+
ExecStart=/usr/lib/systemd/systemd-networkd-wait-online -i eth0-midplane --timeout=600
13+
14+
[Install]
15+
WantedBy=multi-user.target
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
[Match]
2+
Name=dpu*
3+
4+
[Network]
5+
Bridge=bridge-midplane
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
# Oneshot midplane network service
2+
3+
[Unit]
4+
Description=Midplane network service
5+
Requires=systemd-networkd.service
6+
After=systemd-networkd.service
7+
8+
[Service]
9+
Type=oneshot
10+
User=root
11+
ExecStart=/usr/lib/systemd/systemd-networkd-wait-online -i bridge-midplane
12+
13+
[Install]
14+
WantedBy=multi-user.target

src/systemd-sonic-generator/Makefile

+2-2
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@ CFLAGS += -std=gnu99 -D_GNU_SOURCE
33

44
CXX=g++
55
CXXFLAGS += -std=c++11 -D_GNU_SOURCE
6-
LDFLAGS += -lpthread -lboost_filesystem -lboost_system -lgtest
6+
LDFLAGS += -lpthread -lboost_filesystem -lboost_system -lgtest -ljson-c
77

88
BINARY = systemd-sonic-generator
99

1010
$(BINARY): systemd-sonic-generator.c
1111
rm -f ./systemd-sonic-generator
1212

13-
$(CC) $(CFLAGS) -o $@ $^
13+
$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)
1414

1515
install: $(BINARY)
1616
mkdir -p $(DESTDIR)

0 commit comments

Comments
 (0)