sonic-buildimage/files/initramfs-tools/arista-net
Samuel Angebault e4b507fa03
[Arista] rename management interface in initrd (#9856)
On some products the pci enumeration adds randomness into which nic gets
initialized first.
Because SONiC doesn't use deterministic interface naming but instead old
style interface naming, this leads to eth0 not always being the
management port.
To make sure eth0 is always the management port (SONiC expectation)
rename the interfaces in the initramfs for Arista products.
2022-03-21 17:55:23 +05:30

128 lines
3.0 KiB
Bash

#!/bin/sh
case $1 in
prereqs)
exit 0
;;
esac
set -e
# Extract kernel parameters
set -- $(cat /proc/cmdline)
items=""
for x in "$@"; do
case "$x" in
Aboot=*)
aboot_flag="${x#Aboot=}"
;;
net_*)
item="${x#net_}"
items="$items $item"
;;
platform=*)
platform_flag="${x#platform=}"
;;
esac
done
random() {
echo $(od -vAn -N1 -tu1 < /dev/urandom)
}
arista_net_devname() {
local pciaddr="$1"
local devname_prefix="$2"
for path in $(ls -d /sys/class/net/${devname_prefix}* 2>/dev/null); do
local devid="$(realpath "$path/device")"
if echo "$devid" | grep -q "$pciaddr"; then
echo "${path##*/}"
return
fi
done
}
arista_net_rename() {
local device_path="$1"
local new_name="$2"
local from_name="$3"
devname=$(arista_net_devname "$device_path" "$from_name")
[ -n "$devname" ] && ip link set "$devname" name "$new_name"
}
# Sets the MAC address to the value passed by Aboot through /proc/cmdline
tg3fixhwaddr()
{
local default_tg3_hwaddr="00:10:18:00:00:00"
local pciaddr="$1"
local hwaddr="$2"
devname=$(arista_net_devname "$pciaddr")
if [ -z "$devname" ]; then
return
fi
driver=$(basename $(readlink "/sys/class/net/$devname/device/driver"))
if [ "$driver" != "tg3" ]; then
return 0
fi
if [ "$hwaddr" = "$default_tg3_hwaddr" ]; then
hwaddr=$(cat /sys/class/net/$devname/address)
fi
if [ "$hwaddr" = "$default_tg3_hwaddr" ]; then
hwaddr=$(printf "%02x" "$(($(random) & 0xfe | 0x02))")
for i in 1 2 3 4 5; do
hwaddr=$(printf "$hwaddr:%02x" "$(($(random) & 0xfe | 0x02))")
done
fi
ip link set dev "$devname" addr "$hwaddr"
}
if [ -n "$aboot_flag" ]; then
for item in $items; do
key="${item%=*}"
value="${item#*=}"
hwaddr=$(eval echo \${hwaddr_${key}})
if [ -n "$hwaddr" ]; then
tg3fixhwaddr "$value" "$hwaddr"
fi
done
fi
# Iterate over all the net_maX items found in the cmdline two times.
# First time renaming the interfaces to maX.
# The second time renaming them to their final name ethX.
if [ -n "$aboot_flag" ]; then
if [ "$platform_flag" = 'rook' -o "$platform_flag" = 'lorikeet' ]; then
# Rename existing ethX interfaces to tmpX
for x in $(ls /sys/class/net/); do
case $x in
eth*)
value="${x#*eth}"
newname="tmp$value"
ip link set $x down
ip link set $x name "$newname"
;;
*)
esac
done
for item in $items; do
key="${item%=*}"
value="${item#*=}"
arista_net_rename "$value" "$key" tmp
done
for item in $items; do
key="${item%=*}"
value="${item#*=}"
index="${key#ma}"
index="$(( $index - 1 ))"
newKey="eth$index"
arista_net_rename "$value" "$newKey" ma
done
fi
fi