Changeset 36353


Ignore:
Timestamp:
2013-04-17T17:36:57+02:00 (5 years ago)
Author:
nbd
Message:

mac80211: rework mac address allocation

If the first byte is available in the address mask, use only that one -
set the local bit and xor it with the id << 2. This ensures that there
are no hardware BSSID & BSSID-mask conflicts with devices that have
almost the same MAC address with just a small offset. The MAC address
conflict has been observed in a deployment with some devices from the
same batch when running with multiple interfaces.

If only some bits of the last byte are available, xor the id onto the
last MAC address byte (relevant mostly for Ralink devices).

In other cases (should not happen at this point), use the previous MAC
address offset calculation but without the local bit.

Signed-off-by: Felix Fietkau <nbd@…>

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/package/mac80211/files/lib/wifi/mac80211.sh

    r35986 r36353  
    271271 
    272272mac80211_generate_mac() { 
    273         local off="$1" 
    274         local mac="$2" 
     273        local id="$1" 
     274        local ref="$2" 
    275275        local mask="$3" 
    276         local oIFS="$IFS"; IFS=":"; set -- $mac; IFS="$oIFS" 
    277  
    278         local b2mask=0x00 
    279         [ $off -gt 0 ] && 
    280                 [ "$mask" = "00:00:00:00:00:00" -o $(( 0x${mask%%:*} & 0x2 )) -gt 0 ] && b2mask=0x02 
    281  
    282         printf "%02x:%s:%s:%s:%02x:%02x" \ 
    283                 $(( 0x$1 | $b2mask )) $2 $3 $4 \ 
    284                 $(( (0x$5 + ($off / 0x100)) % 0x100 )) \ 
    285                 $(( (0x$6 + $off) % 0x100 )) 
     276 
     277        [ "$mask" = "00:00:00:00:00:00" ] && mask="ff:ff:ff:ff:ff:ff"; 
     278        local oIFS="$IFS"; IFS=":"; set -- $mask; IFS="$oIFS" 
     279 
     280        local mask1=$1 
     281        local mask6=$6 
     282 
     283        local oIFS="$IFS"; IFS=":"; set -- $ref; IFS="$oIFS" 
     284        [ "$((0x$mask1))" -gt 0 ] && { 
     285                b1=$(((0x$1 | 0x2) ^ ($id << 2))) 
     286                printf "%02x:%s:%s:%s:%s:%s" $b1 $2 $3 $4 $5 $6 
     287                return 
     288        } 
     289 
     290        [ "$((0x$mask6))" -lt 255 ] && { 
     291                printf "%s:%s:%s:%s:%s:%02x" $1 $2 $3 $4 $5 $(( 0x$6 ^ $id )) 
     292                return 
     293        } 
     294 
     295        off2=$(( (0x$6 + $id) / 0x100 )) 
     296        printf "%s:%s:%s:%s:%02x:%02x" \ 
     297                $1 $2 $3 $4 \ 
     298                $(( (0x$5 + $off2) % 0x100 )) \ 
     299                $(( (0x$6 + $id) % 0x100 )) 
    286300} 
    287301 
Note: See TracChangeset for help on using the changeset viewer.