mac80211: fix MAC address allocations when local bit set on base addr
authorPaul Fertser <fercerpav@gmail.com>
Fri, 16 Oct 2020 20:24:19 +0000 (23:24 +0300)
committerPetr Štetiar <ynezz@true.cz>
Tue, 22 Dec 2020 17:59:10 +0000 (18:59 +0100)
Testing with hwsim reveals two problems:

1. phyX/addresses has two addresses and mac80211_get_addr keeps
returning the last one when asked for more;

2. The base address has the local bit set and the operation unsets it.

Fix both.

Fixes: 866790fd827cb0187353cdf484eb46a9b38fb6ba
Reported-by: Zero_Chaos
Signed-off-by: Paul Fertser <fercerpav@gmail.com>
package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh

index 6ca12084cf5041844ffa39c547d8ee422948fe94..e12a804271e5e6f41e1c5c5b123cadbb2ce701c4 100644 (file)
@@ -409,7 +409,7 @@ mac80211_generate_mac() {
        [ "$mask" = "00:00:00:00:00:00" ] && {
                mask="ff:ff:ff:ff:ff:ff";
 
-               [ "$(wc -l < /sys/class/ieee80211/${phy}/addresses)" -gt 1 ] && {
+               [ "$(wc -l < /sys/class/ieee80211/${phy}/addresses)" -gt $id ] && {
                        addr="$(mac80211_get_addr "$phy" "$id")"
                        [ -n "$addr" ] && {
                                echo "$addr"
@@ -429,7 +429,7 @@ mac80211_generate_mac() {
        [ "$((0x$mask1))" -gt 0 ] && {
                b1="0x$1"
                [ "$id" -gt 0 ] && \
-                       b1=$(($b1 ^ ((($id - !($b1 & 2)) << 2) | 0x2)))
+                       b1=$(($b1 ^ ((($id - !($b1 & 2)) << 2)) | 0x2))
                printf "%02x:%s:%s:%s:%s:%s" $b1 $2 $3 $4 $5 $6
                return
        }