Search Linux Wireless

Re: Strange performance issue when using two devices at once

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 2020-01-30 15:43, Marlon Smith wrote:
> So I did a few tests and got some pretty interesting results.
> 
> With the two devices connected to the access point and performing
> slowly, I changed the MAC address of one of the devices (Just from a B6
> to a BA). Immediately, both devices began working properly!
> 
> Back to the original MAC address, I looked at my sniffer, and I do not
> see any evidence of one device acking another device's frames. With one
> device sitting idle and the other transferring data, I see high numbers
> of retransmitted frames, and then an eventual ack from the correct
> device, but very little activity from the idle device. While this is
> happening, the device driver indicates that it is dropping lots of
> duplicate received packets.
Here's the cause and an approach for fixing it:

The MAC_BSSID_DW1 register configures the Multi-BSSID mode. It can be
configured for 1, 2, 4 or 8 BSSIDs. This controls what MAC addresses the
chip will respond to. The driver always sets it up for 8 BSSIDs.

The problem here is that the chip has a hardcoded pattern for how those
BSSIDs are allocated:
Depending on the number of BSSIDs, the lower 1, 2 or 3 bits are used to
encode the BSS index. This means that when 8 BSSIDs are enabled, the
lower 3 bits are effectively masked out on the MAC address filter that
decides which frames to ACK. Because your MAC addresses are so close
together, both devices try to ACK the same frames at the same time. This
will not be visible in a sniffer, since they will be transmitting at the
same time.

I'd say the first step in fixing this is to make the driver set
MAC_BSSID_DW1_BSS_ID_MASK based on the MAC addresses of configured
virtual interfaces. For older chips, this MAC address pattern cannot be
fixed.

However, on at least RT3883, RT3352 and RT5350 (and thus most likely
also RT5370), you can set BIT 21 in that register, which changes the
pattern. With that bit set, the second interface only sets the local bit
of the MAC address, and from the third interface on it adds (idx-1)<<2
to the first byte. That gets rid of the MAC address conflicts.

Hopefully someone familiar with the rt2x00 code will read this and write
some patches :)

- Felix



[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Wireless Personal Area Network]     [Linux Bluetooth]     [Wireless Regulations]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite Hiking]     [MIPS Linux]     [ARM Linux]     [Linux RAID]

  Powered by Linux