aboutsummaryrefslogtreecommitdiffstats
path: root/package/base-files/files/lib/functions.sh
diff options
context:
space:
mode:
authorGabor Juhos <juhosg@openwrt.org>2013-11-14 17:44:42 +0000
committerGabor Juhos <juhosg@openwrt.org>2013-11-14 17:44:42 +0000
commit3e44099b61d1c1d0e420cd5e079f9092a03d3ec3 (patch)
tree660c3296656a54d334b05670774930e992c71ec0 /package/base-files/files/lib/functions.sh
parent6bb46d75aaac5a9776011c3569527249fe06c386 (diff)
downloadupstream-3e44099b61d1c1d0e420cd5e079f9092a03d3ec3.tar.gz
upstream-3e44099b61d1c1d0e420cd5e079f9092a03d3ec3.tar.bz2
upstream-3e44099b61d1c1d0e420cd5e079f9092a03d3ec3.zip
base-files: add macaddr_canonicalize helper function
In commit r38690, the MAC address canonicalization has been converted to use 'tr' instead of 'printf'. This only works if with MAC addresses which uses the 'xx:xx:xx:xx:xx:xx' format. However on some boards, the MAC addresses are stored in different format in the mtd partition. Some vendors are using hyphens or dots as separators instead of colons. Also the leading zeroes may be missing from the individual octets or those are replaced with spaces. Add a new function which can be used to convert these into the 'xx:xx:xx:xx:xx:xx' format. Also update the 'mtd_get_mac_ascii' function to use the new helper. The helper function is based on this code: http://isquared.nl/blog/2010/08/11/Bash-function-to-canonicalize-MAC-addresses/ Signed-off-by: Gabor Juhos <juhosg@openwrt.org> git-svn-id: svn://svn.openwrt.org/openwrt/trunk@38803 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'package/base-files/files/lib/functions.sh')
-rwxr-xr-xpackage/base-files/files/lib/functions.sh35
1 files changed, 34 insertions, 1 deletions
diff --git a/package/base-files/files/lib/functions.sh b/package/base-files/files/lib/functions.sh
index 6cb6df92fd..85ebc2aeb1 100755
--- a/package/base-files/files/lib/functions.sh
+++ b/package/base-files/files/lib/functions.sh
@@ -257,7 +257,7 @@ mtd_get_mac_ascii()
mac_dirty=$(strings "$part" | sed -n 's/^'"$key"'=//p')
# "canonicalize" mac
- [ -n "$mac_dirty" ] && echo ${mac_dirty} | tr [A-F] [a-f]
+ [ -n "$mac_dirty" ] && macaddr_canonicalize "$mac_dirty"
}
mtd_get_mac_binary() {
@@ -310,6 +310,39 @@ macaddr_2bin()
echo -ne \\x${mac//:/\\x}
}
+macaddr_canonicalize()
+{
+ local mac="$1"
+ local canon=""
+
+ [ ${#mac} -gt 17 ] && return
+ [ -n "${mac//[a-fA-F0-9\.: -]/}" ] && return
+
+ for octet in ${mac//[\.:-]/ }; do
+ case "${#octet}" in
+ 1)
+ octet="0${octet}"
+ ;;
+ 2)
+ ;;
+ 4)
+ octet="${octet:0:2} ${octet:2:2}"
+ ;;
+ 12)
+ octet="${octet:0:2} ${octet:2:2} ${octet:4:2} ${octet:6:2} ${octet:8:2} ${octet:10:2}"
+ ;;
+ *)
+ return
+ ;;
+ esac
+ canon=${canon}${canon:+ }${octet}
+ done
+
+ [ ${#canon} -ne 17 ] && return
+
+ printf "%02x:%02x:%02x:%02x:%02x:%02x" 0x${canon// / 0x} 2>/dev/null
+}
+
strtok() { # <string> { <variable> [<separator>] ... }
local tmp
local val="$1"