From 9127684553ea7b0f9285bc3fbe6c554f4519016c Mon Sep 17 00:00:00 2001 From: William Hubbs Date: Sun, 1 Apr 2012 22:59:00 -0500 Subject: 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 X-Gentoo-Bug: 410127 X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=410127 --- net/ifconfig.sh.Linux.in | 26 +++++++++++++------------- net/iproute2.sh | 26 +++++++++++++------------- 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/net/ifconfig.sh.Linux.in b/net/ifconfig.sh.Linux.in index 411401d..8abc998 100644 --- a/net/ifconfig.sh.Linux.in +++ b/net/ifconfig.sh.Linux.in @@ -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() diff --git a/net/iproute2.sh b/net/iproute2.sh index e06152f..b420e41 100644 --- a/net/iproute2.sh +++ b/net/iproute2.sh @@ -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() -- cgit v1.2.3