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
|