base-files: add ucidef_set_network_device_path_port function
authorTil Kaiser <mail@tk154.de>
Sun, 29 Sep 2024 14:55:57 +0000 (16:55 +0200)
committerHauke Mehrtens <hauke@hauke-m.de>
Sat, 19 Oct 2024 17:10:56 +0000 (19:10 +0200)
The already existing uci function ucidef_set_network_device_path
can be used to specify a unique PCI address to name a network interface.
However, I noticed that some NIC ports share the same PCI address
but are still distinguishable by the dev_port value of the network
interface's sysfs entry.

This commit adds a new uci function ucidef_set_network_device_path_port,
which is similar to ucidef_set_network_device_path but takes an
additional argument where the user can specify the dev_port value.
The internal function preinit_config_port loops through
all network interfaces at the given PCI address and chooses the one
where the dev_port value matches.

This was tested on an x86_64 device using a Mellanox ConnectX-3 card.

Signed-off-by: Til Kaiser <mail@tk154.de>
Link: https://github.com/openwrt/openwrt/pull/16560
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
package/base-files/files/lib/functions/uci-defaults.sh
package/base-files/files/lib/preinit/10_indicate_preinit

index 8355099c35548302076ca3a9a85f696ac0455fad..5293ce12c0e08f2d211999e4f00fcbac6639a774 100644 (file)
@@ -122,6 +122,11 @@ ucidef_set_network_device_path() {
        _ucidef_set_network_device_common $1 path $2
 }
 
+ucidef_set_network_device_path_port() {
+       _ucidef_set_network_device_common $1 path $2
+       _ucidef_set_network_device_common $1 port $3
+}
+
 ucidef_set_network_device_gro() {
        _ucidef_set_network_device_common $1 gro $2
 }
index a8f7758c841fe59d84e74ab4289e685046d0f4ec..12f8fc2e21044fc949565b34c690b57131f8c3f7 100644 (file)
@@ -65,12 +65,27 @@ preinit_config_switch() {
 
 preinit_config_port() {
        local original
+       local dev_port
 
        local netdev="$1"
        local path="$2"
+       local port="$3"
 
        [ -d "/sys/devices/$path/net" ] || return
-       original="$(ls "/sys/devices/$path/net" | head -1)"
+
+       if [ -z "$port" ]; then
+               original="$(ls "/sys/devices/$path/net" | head -1)"
+       else
+               for device in /sys/devices/$path/net/*; do
+                       dev_port="$(cat "$device/dev_port")"
+                       if [ "$dev_port" = "$port" ]; then
+                               original="${device##*/}"
+                               break
+                       fi
+               done
+
+               [ -z "$original" ] && return
+       fi
 
        [ "$netdev" = "$original" ] && return
 
@@ -109,7 +124,8 @@ preinit_config_board() {
                json_select "network_device"
                        json_select "$netdev"
                                json_get_vars path path
-                               [ -n "$path" ] && preinit_config_port "$netdev" "$path"
+                               json_get_vars port port
+                               [ -n "$path" ] && preinit_config_port "$netdev" "$path" "$port"
                        json_select ..
                json_select ..
        done