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