mirror of
https://git.openwrt.org/openwrt/openwrt.git
synced 2024-11-27 23:34:30 +00:00
503596b8ce
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>
224 lines
4.4 KiB
Plaintext
224 lines
4.4 KiB
Plaintext
# Copyright (C) 2006 OpenWrt.org
|
|
# Copyright (C) 2010 Vertical Communications
|
|
|
|
preinit_ip_config() {
|
|
local netdev vid
|
|
|
|
netdev=${1%\.*}
|
|
vid=${1#*\.}
|
|
|
|
if [ "$vid" = "$netdev" ]; then
|
|
vid=
|
|
fi
|
|
|
|
grep -q "$netdev" /proc/net/dev || return
|
|
|
|
if [ -n "$vid" ]; then
|
|
ip link add link $netdev name $1 type vlan id $vid
|
|
fi
|
|
|
|
ip link set dev $netdev up
|
|
if [ -n "$vid" ]; then
|
|
ip link set dev $1 up
|
|
fi
|
|
ip -4 address add $pi_ip/$pi_netmask broadcast $pi_broadcast dev $1
|
|
}
|
|
|
|
preinit_config_switch() {
|
|
local role roles ports device enable reset
|
|
|
|
local name=$1
|
|
local lan_if=$2
|
|
|
|
json_select switch
|
|
json_select $name
|
|
|
|
json_get_vars enable reset
|
|
|
|
if [ "$reset" -eq "1" ]; then
|
|
swconfig dev $name set reset
|
|
fi
|
|
swconfig dev $name set enable_vlan $enable
|
|
|
|
if json_is_a roles array; then
|
|
json_get_keys roles roles
|
|
json_select roles
|
|
|
|
for role in $roles; do
|
|
json_select "$role"
|
|
json_get_vars ports device
|
|
json_select ..
|
|
|
|
if [ "$device" = "$lan_if" ]; then
|
|
swconfig dev $name vlan $role set ports "$ports"
|
|
fi
|
|
done
|
|
|
|
json_select ..
|
|
fi
|
|
|
|
swconfig dev $name set apply
|
|
|
|
json_select ..
|
|
json_select ..
|
|
}
|
|
|
|
preinit_config_port() {
|
|
local original
|
|
local dev_port
|
|
|
|
local netdev="$1"
|
|
local path="$2"
|
|
local port="$3"
|
|
|
|
[ -d "/sys/devices/$path/net" ] || return
|
|
|
|
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
|
|
|
|
ip link set "$original" name "$netdev"
|
|
}
|
|
|
|
preinit_config_board() {
|
|
/bin/board_detect /tmp/board.json
|
|
|
|
[ -f "/tmp/board.json" ] || return
|
|
|
|
. /usr/share/libubox/jshn.sh
|
|
|
|
json_init
|
|
json_load "$(cat /tmp/board.json)"
|
|
|
|
# Find the current highest eth*
|
|
max_eth=$(grep -o '^ *eth[0-9]*:' /proc/net/dev | tr -dc '[0-9]\n' | sort -n | tail -1)
|
|
# Find and move netdevs using eth*s we are configuring
|
|
json_get_keys keys "network_device"
|
|
for netdev in $keys; do
|
|
json_select "network_device"
|
|
json_select "$netdev"
|
|
json_get_vars path path
|
|
if [ -n "$path" -a -h "/sys/class/net/$netdev" ]; then
|
|
ip link set "$netdev" down
|
|
ip link set "$netdev" name eth$((++max_eth))
|
|
fi
|
|
json_select ..
|
|
json_select ..
|
|
done
|
|
|
|
# Move interfaces by path to their netdev name
|
|
json_get_keys keys "network_device"
|
|
for netdev in $keys; do
|
|
json_select "network_device"
|
|
json_select "$netdev"
|
|
json_get_vars path path
|
|
json_get_vars port port
|
|
[ -n "$path" ] && preinit_config_port "$netdev" "$path" "$port"
|
|
json_select ..
|
|
json_select ..
|
|
done
|
|
|
|
json_select network
|
|
json_select "lan"
|
|
json_get_vars device
|
|
json_get_values ports ports
|
|
json_select ..
|
|
json_select ..
|
|
|
|
[ -n "$device" -o -n "$ports" ] || return
|
|
|
|
# swconfig uses $device and DSA uses ports
|
|
[ -z "$ports" ] && {
|
|
ports="$device"
|
|
}
|
|
|
|
# only use the first one
|
|
ifname=${ports%% *}
|
|
|
|
if [ -x /sbin/swconfig ]; then
|
|
# configure the switch, if present
|
|
|
|
json_get_keys keys switch
|
|
for key in $keys; do
|
|
preinit_config_switch $key $ifname
|
|
done
|
|
else
|
|
# trim any vlan ids
|
|
ifname=${ifname%\.*}
|
|
# trim any vlan modifiers like :t
|
|
ifname=${ifname%\:*}
|
|
fi
|
|
|
|
pi_ifname=$ifname
|
|
|
|
preinit_ip_config $pi_ifname
|
|
}
|
|
|
|
preinit_ip() {
|
|
[ "$pi_preinit_no_failsafe" = "y" ] && return
|
|
|
|
# if the preinit interface isn't specified and ifname is set in
|
|
# preinit.arch use that interface
|
|
if [ -z "$pi_ifname" ]; then
|
|
pi_ifname=$ifname
|
|
fi
|
|
|
|
if [ -n "$pi_ifname" ]; then
|
|
preinit_ip_config $pi_ifname
|
|
elif [ -d "/etc/board.d/" ]; then
|
|
preinit_config_board
|
|
fi
|
|
|
|
preinit_net_echo "Doing OpenWrt Preinit\n"
|
|
}
|
|
|
|
preinit_ip_deconfig() {
|
|
[ -n "$pi_ifname" ] && grep -q "$pi_ifname" /proc/net/dev && {
|
|
local netdev vid
|
|
|
|
netdev=${pi_ifname%\.*}
|
|
vid=${pi_ifname#*\.}
|
|
|
|
if [ "$vid" = "$netdev" ]; then
|
|
vid=
|
|
fi
|
|
|
|
ip -4 address flush dev $pi_ifname
|
|
ip link set dev $netdev down
|
|
|
|
if [ -n "$vid" ]; then
|
|
ip link delete $pi_ifname
|
|
fi
|
|
}
|
|
}
|
|
|
|
preinit_net_echo() {
|
|
[ -n "$pi_ifname" ] && grep -q "$pi_ifname" /proc/net/dev && {
|
|
{
|
|
[ "$pi_preinit_net_messages" = "y" ] || {
|
|
[ "$pi_failsafe_net_message" = "true" ] &&
|
|
[ "$pi_preinit_no_failsafe_netmsg" != "y" ]
|
|
}
|
|
} && netmsg $pi_broadcast "$1"
|
|
}
|
|
}
|
|
|
|
pi_indicate_preinit() {
|
|
set_state preinit
|
|
}
|
|
|
|
boot_hook_add preinit_main preinit_ip
|
|
boot_hook_add preinit_main pi_indicate_preinit
|