summaryrefslogtreecommitdiff
path: root/meta-bytedance/meta-g220a/recipes-network/network/static-mac-addr/mac-check
blob: 25800076203d62a5695f64f3cfb92f513fc07810 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#!/bin/sh
# Copyright 2018 Intel Corporation
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#	http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

SOFS_MNT=/var/sofs
SOFS_MACDIR=${SOFS_MNT}/factory-settings/network/mac

read_hw_mac() {
	local iface="$1"
	cat /sys/class/net/"$iface"/address 2>/dev/null
}

set_hw_mac() {
	local iface="$1"
	local mac="$2"
	ip link show dev "$iface" | grep -q "${iface}:.*\<UP\>" 2>/dev/null
	local up=$?
	[[ $up -eq 0 ]] && ip link set dev "$iface" down
	ip link set dev "$iface" address "$mac"
	[[ $up -eq 0 ]] && ip link set dev "$iface" up
}

read_sofs_mac() {
	local iface="$1"
	cat "${SOFS_MACDIR}/${iface}" 2>/dev/null
}

read_fw_env_mac() {
	local envname="$1"
	fw_printenv "$envname" 2>/dev/null | sed "s/^$envname=//"
}

set_fw_env_mac() {
	local envname="$1"
	local mac="$2"
	fw_setenv "$envname" "$mac"
}
read_eeprom_mac() {
	local iface="$1"
	a=0
	if [ $iface = "eth1" ];then
		a=8
	fi
	for  ((i=a;i <= ((7+a));i++));do
		i2cset -y 1 0x50 0x00 $i
		tmp=`i2cget -y 1 0x50`
		local mac[$i]=${tmp:2}
		local mac_str=$mac_str:${mac[$i]}
	done
	mac_str=${mac_str:1:17}
	echo $mac_str 2>/dev/null
}

create_macdir() {
if [ -a ${SOFS_MACDIR} ]; then
	if [ ! -d ${SOFS_MACDIR} ]; then
		rm -rf ${SOFS_MACDIR}
		mkdir -p ${SOFS_MACDIR}
	fi
else
	mkdir -p ${SOFS_MACDIR}
fi
return 0
}

mac_check() {
	local iface="$1"
	local envname="$2"

	# Read the MAC address in use by the NIC
	local hw_mac=$(read_hw_mac "$iface")

	# Read the MAC address stored in the non-volatile file provisioned in
	# manufacturing.
	local sofs_mac=$(read_sofs_mac "$iface")

	local eeprom_mac=$(read_eeprom_mac "$iface")
	if [ -n "$eeprom_mac" ] && [ -z "$sofs_mac"]; then
		set_hw_mac "$iface" "$eeprom_mac"
		set_fw_env_mac "$envname" "$eeprom_mac"
		return $?
	elif [ -n "$sofs_mac" ] && [ "$hw_mac" != "$sofs_mac" ]; then
		# A factory assigned address was found, and it is newly assigned.
		# Update the active interface and save the new value to the u-boot
		# environment.
		set_hw_mac "$iface" "$sofs_mac"
		set_fw_env_mac "$envname" "$sofs_mac"
		return $?
	elif [ -n "$hw_mac" ]; then
		# Read the MAC address stored by U-Boot
		local fw_env_mac=$(read_fw_env_mac "$envname")
		if [ -z "$fw_env_mac" ] || [ "$fw_env_mac" != "$hw_mac" ]; then
			set_fw_env_mac "$envname" "$hw_mac"
			return $?
		fi
	else
	    # Could not identify a MAC address
	    return 255
	fi

	return 0
}

create_macdir

error=0
first_error_seen=0

while read IFACE UBDEV; do
	mac_check "$IFACE" "$UBDEV"
	error=$?
	if [ $error -ne 0 ] && [ $first_error_seen -eq 0 ]; then
		first_error_seen=$error
	fi
done <<-END_CONF
	eth0 eth1addr
	eth1 ethaddr
END_CONF
exit $first_error_seen