Patchwork [OpenWrt-Devel] mac80211 MAC address generation

login
register
Submitter Bruno Randolf
Date 2012-07-31 15:14:53
Message ID <5017F66D.8090405@einfach.org>
Download mbox | patch
Permalink /patch/2466/
State New
Headers show

Comments

Bruno Randolf - 2012-07-31 15:14:53
Hello!

With changeset 28298 for 
trunk/package/mac80211/files/lib/wifi/mac80211.sh (09/25/11 by jow) you 
introduced a change to the MAC address generation for virtual interfaces 
which I think is not optimal:

    "[package] mac80211: rework mac address generation for virtual
     interfaces; set locally administered bit on generated macs and
     change the last two bytes isntead of the first one"

Now, If you have two wirless LAN cards which have sequentially numbered 
MAC addresses (e.g. AA:BB:CC:DD:EE:01 and AA:BB:CC:DD:EE:02, either on 
the same board or two devices close to each other) and you want to use 
virtual interfaces on both this easily leads to clashes: 2 VAP using the 
same MAC address.

I believe the old method was more robust and thus propose the following 
change (patch below).

Best greetings,
Bruno

---

commit 297256680b3870b498a737498ef2d2fdd424f783
Author: Bruno Randolf <br1@thinktube.com>
Date:   Thu Jul 26 20:21:22 2012 +0100

     mac80211: generate MAC adresses in the upper byte

     This way it's easier to avoid duplicate MAC adresses.

Patch

diff --git a/package/mac80211/files/lib/wifi/mac80211.sh 
b/package/mac80211/files/lib/wifi/mac
index 1a4d7c1..cc7c9bb 100644
--- a/package/mac80211/files/lib/wifi/mac80211.sh
+++ b/package/mac80211/files/lib/wifi/mac80211.sh
@@ -273,17 +273,17 @@  get_freq() {
  }

  mac80211_generate_mac() {
-       local off="$1"
-       local mac="$2"
-       local oIFS="$IFS"; IFS=":"; set -- $mac; IFS="$oIFS"
+       local macidx="$1"
+       local mac_1="${2%%:*}"
+       local mac_2="${2#*:}"

-       local b2mask=0x00
-       [ $off -gt 0 ] && b2mask=0x02
+       if [ "$macidx" -gt 0 ]; then
+               offset="$(( 2 + $macidx * 4 ))"
+       else
+               offset="0"
+       fi

-       printf "%02x:%s:%s:%s:%02x:%02x" \
-               $(( 0x$1 | $b2mask )) $2 $3 $4 \
-               $(( (0x$5 + ($off / 0x100)) % 0x100 )) \
-               $(( (0x$6 + $off) % 0x100 ))
+        printf "%02x:$mac_2" $((0x$mac_1 + $offset))
  }

  enable_mac80211() {