base-files: add macaddr_canonicalize helper function
authorGabor Juhos <juhosg@openwrt.org>
Thu, 14 Nov 2013 17:44:42 +0000 (17:44 +0000)
committerGabor Juhos <juhosg@openwrt.org>
Thu, 14 Nov 2013 17:44:42 +0000 (17:44 +0000)
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>
SVN-Revision: 38803

package/base-files/Makefile
package/base-files/files/lib/functions.sh

index 31c6e984bc8f3e0d344751dba619ee858fd8723f..0160e41f88c3bba97c17084100d1d482a001fe01 100644 (file)
@@ -11,7 +11,7 @@ include $(INCLUDE_DIR)/kernel.mk
 include $(INCLUDE_DIR)/version.mk
 
 PKG_NAME:=base-files
-PKG_RELEASE:=148
+PKG_RELEASE:=149
 
 PKG_FILE_DEPENDS:=$(PLATFORM_DIR)/ $(GENERIC_PLATFORM_DIR)/base-files/
 PKG_BUILD_DEPENDS:=opkg/host
index 6cb6df92fd66954cf8b5d5a02ce87784d67eee12..85ebc2aeb16143826ca07c82579d4a4970e1bd70 100755 (executable)
@@ -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"