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>
_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
}
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
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