distribution/packages/sysutils/ethmactool/scripts/ethmactool-config
2022-02-05 09:23:32 -05:00

73 lines
1.7 KiB
Bash
Executable file

#!/bin/sh
# SPDX-License-Identifier: GPL-2.0
# Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv)
COMPATIBLE=$(/usr/bin/dtsoc)
MAC_STEP=""
validate_mac() {
[ ${#MAC} -eq 12 -a "${MAC}" != "000000000000" ]
}
fixup_self_mac() {
# clear multicast bit and set local assignment bit (IEEE802)
MAC=$(printf '%012X' "$(( (0x$MAC & 0xFEFFFFFFFFFF) | 0x020000000000 ))")
}
from_cmdline() {
for arg in $(cat /proc/cmdline | tr -d ':'); do
case ${arg} in
mac=*)
MAC=${arg#*=}
;;
esac
done
}
aml_from_efuse_gxbb() {
if [ -e /sys/devices/platform/efuse/efuse0/nvmem ] ; then
MAC=$(od -x -A n -j 0x34 -N 6 /sys/bus/nvmem/devices/efuse0/nvmem | tr -d ' ')
MAC=${MAC:2:2}${MAC:0:2}${MAC:6:2}${MAC:4:2}${MAC:10:2}${MAC:8:2}
fi
}
aml_from_efuse_gxl() {
if [ -e /sys/devices/platform/efuse/efuse0/nvmem ] ; then
MAC=$(cat /sys/devices/platform/efuse/efuse0/nvmem)
fi
}
aml_from_cpu_sn() {
if [ -e /sys/bus/platform/devices/firmware\:secure-monitor/serial ] ; then
MAC=$(cat /sys/bus/platform/devices/firmware\:secure-monitor/serial 2>/dev/null | cut -b-12)
fixup_self_mac
fi
}
from_cpu_sn() {
MAC=$(cat /proc/cpuinfo 2>/dev/null | awk '/Serial/ {print substr($3,1,12)}')
fixup_self_mac
}
case $COMPATIBLE in
amlogic*)
MAC_STEPS="from_cmdline aml_from_efuse_gxbb aml_from_efuse_gxl aml_from_cpu_sn"
;;
*)
MAC_STEPS="from_cpu_sn"
;;
esac
for MAC_STEP in $MAC_STEPS ; do
$MAC_STEP
validate_mac && break
done
if validate_mac ; then
MAC=$(echo "$MAC" | sed 's/\(..\)/\1:/g' | cut -b-17)
echo "MAC=${MAC}" > /run/libreelec/ethmactool-$1
/usr/sbin/ip link set dev $1 down
/usr/sbin/ip link set dev $1 address $MAC
/usr/sbin/ip link set dev $1 up
fi