base-files: add functions to set or clear bit in MAC address
authorSungbo Eo <mans0n@gorani.run>
Sat, 25 Jan 2020 14:06:07 +0000 (23:06 +0900)
committerPetr Štetiar <ynezz@true.cz>
Wed, 8 Jul 2020 21:22:30 +0000 (23:22 +0200)
Some devices (e.g. Arduino Yun) need bitwise operations during MAC address
setup. This commit adds generalized versions of macaddr_setbit_la(), which
are helpful when manipulating a single bit in a MAC address.

Signed-off-by: Sungbo Eo <mans0n@gorani.run>
package/base-files/files/lib/functions/system.sh

index c7aa7bf75c2d7f8faed2a5626edd3c4c73816f9e..f3c901ff7982f32c1033ecca7fb3cc38a13895ef 100644 (file)
@@ -152,10 +152,26 @@ macaddr_geteui() {
        echo ${mac:9:2}$sep${mac:12:2}$sep${mac:15:2}
 }
 
-macaddr_setbit_la() {
+macaddr_setbit() {
+       local mac=$1
+       local bit=${2:-0}
+
+       [ $bit -gt 0 -a $bit -le 48 ] || return
+
+       printf "%012x" $(( 0x${mac//:/} | 2**(48-bit) )) | sed -e 's/\(.\{2\}\)/\1:/g' -e 's/:$//'
+}
+
+macaddr_unsetbit() {
        local mac=$1
+       local bit=${2:-0}
+
+       [ $bit -gt 0 -a $bit -le 48 ] || return
 
-       printf "%02x:%s" $((0x${mac%%:*} | 0x02)) ${mac#*:}
+       printf "%012x" $(( 0x${mac//:/} & ~(2**(48-bit)) )) | sed -e 's/\(.\{2\}\)/\1:/g' -e 's/:$//'
+}
+
+macaddr_setbit_la() {
+       macaddr_setbit $1 7
 }
 
 macaddr_2bin() {