Change the method for calculating the interface metric for linux systems
On linux systems running >=linux-3.2, the /proc/net/dev file cannot be relied on to show the order network interfaces were added to the system. Also, there is currently a bug in the implementation of the seek call for this file which can cause a system to go into an infinite loop. This commit changes the _ifindex function to retreive the value of /sys/class/net/${IFACE}/ifindex and use that value instead of attempting to calculate one from the interface's position in /proc/net/dev. reported-by: John Keeping <john.keeping@lineone.net> X-Gentoo-Bug: 410127 X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=410127
This commit is contained in:
parent
0571a7e05b
commit
9127684553
@ -24,19 +24,19 @@ _exists()
|
||||
|
||||
_ifindex()
|
||||
{
|
||||
local line= i=-2
|
||||
while read line; do
|
||||
: $(( i += 1 ))
|
||||
[ ${i} -lt 1 ] && continue
|
||||
case "${line}" in
|
||||
"${IFACE}:"*) echo "${i}"; return 0;;
|
||||
esac
|
||||
done < /proc/net/dev
|
||||
|
||||
# Return the next available index
|
||||
: $(( i += 1 ))
|
||||
echo "${i}"
|
||||
return 1
|
||||
local index=-1
|
||||
local f v
|
||||
if [ -e /sys/class/net/"${IFACE}"/ifindex ]; then
|
||||
index=$(cat /sys/class/net/"${IFACE}"/ifindex)
|
||||
else
|
||||
for f in /sys/class/net/*/ifindex ; do
|
||||
v=$(cat $f)
|
||||
[ $v -gt $index ] && index=$v
|
||||
done
|
||||
: $(( index += 1 ))
|
||||
fi
|
||||
echo "${index}"
|
||||
return 0
|
||||
}
|
||||
|
||||
_is_wireless()
|
||||
|
@ -25,19 +25,19 @@ _exists()
|
||||
|
||||
_ifindex()
|
||||
{
|
||||
local line= i=-2
|
||||
while read line; do
|
||||
: $(( i += 1 ))
|
||||
[ ${i} -lt 1 ] && continue
|
||||
case "${line}" in
|
||||
"${IFACE}:"*) echo "${i}"; return 0;;
|
||||
esac
|
||||
done < /proc/net/dev
|
||||
|
||||
# Return the next available index
|
||||
: $(( i += 1 ))
|
||||
echo "${i}"
|
||||
return 1
|
||||
local index=-1
|
||||
local f v
|
||||
if [ -e /sys/class/net/"${IFACE}"/ifindex ]; then
|
||||
index=$(cat /sys/class/net/"${IFACE}"/ifindex)
|
||||
else
|
||||
for f in /sys/class/net/*/ifindex ; do
|
||||
v=$(cat $f)
|
||||
[ $v -gt $index ] && index=$v
|
||||
done
|
||||
: $(( index += 1 ))
|
||||
fi
|
||||
echo "${index}"
|
||||
return 0
|
||||
}
|
||||
|
||||
_is_wireless()
|
||||
|
Loading…
Reference in New Issue
Block a user