Re: brcmfmac: multi-BSS fails with arbitrary per-BSS MAC addresses

Stephen C Goodman <[email protected]> Thu, 6 Aug 2026 11:33:32 +0000
Newsgroups org.kernel.vger.linux-wireless,dev.linux.lists.brcm80211
Message-ID <GVYP280MB10568E8371572689D15B728C9DD22@GVYP280MB1056.SWEP280.PROD.OUTLOOK.COM>
Hi,

I have obtained additional reproducible results concerning brcmfmac
MAC-address handling with multiple AP interfaces.


## Summary

Runtime MAC reassignment using "ip link" succeeds only on phy1-ap0,
which appears to be the primary firmware BSS.

The identical operation fails on every secondary AP interface:
phy1-ap1, phy1-ap2, and phy1-ap3.

The failure is not caused by unrelated randomized addresses or by an
invalid address pattern. I tested four valid locally administered
unicast addresses which:

* have the same first five octets;
* differ only in the final octet; and
* follow the same sequential pattern with which the four APs can
  otherwise operate concurrently.

## Test

The requested address set was:

phy1-ap0  aa:bb:cc:dd:ee:01
phy1-ap1  aa:bb:cc:dd:ee:02
phy1-ap2  aa:bb:cc:dd:ee:03
phy1-ap3  aa:bb:cc:dd:ee:04

The first octet, 0xaa, identifies a valid locally administered unicast
address.

I performed the following operations:

ip link set dev phy1-ap0 down
ip link set dev phy1-ap0 address aa:bb:cc:dd:ee:01
ip link set dev phy1-ap0 up

ip link set dev phy1-ap1 down
ip link set dev phy1-ap1 address aa:bb:cc:dd:ee:02
ip link set dev phy1-ap1 up

ip link set dev phy1-ap2 down
ip link set dev phy1-ap2 address aa:bb:cc:dd:ee:03
ip link set dev phy1-ap2 up

ip link set dev phy1-ap3 down
ip link set dev phy1-ap3 address aa:bb:cc:dd:ee:04
ip link set dev phy1-ap3 up

The phy1-ap0 address operation succeeds.

The address operation on each secondary AP fails with:

ip: SIOCSIFHWADDR: No error information

The interfaces were explicitly brought back up after each failed
address operation.

## Kernel log

The corresponding kernel error is:

ieee80211 phy1: brcmf_c_set_cur_etheraddr:
Setting cur_etheraddr failed, -52

Example log excerpt:

brcmfmac 0001:01:00.0 phy1-ap2: left promiscuous mode
br-lan: port 8(phy1-ap2) entered disabled state
ieee80211 phy1: brcmf_c_set_cur_etheraddr:
Setting cur_etheraddr failed, -52
br-lan: port 8(phy1-ap2) entered blocking state
br-lan: port 8(phy1-ap2) entered disabled state
brcmfmac 0001:01:00.0 phy1-ap2: entered allmulticast mode
brcmfmac 0001:01:00.0 phy1-ap2: entered promiscuous mode

brcmfmac 0001:01:00.0 phy1-ap3: left allmulticast mode
brcmfmac 0001:01:00.0 phy1-ap3: left promiscuous mode
br-lan: port 9(phy1-ap3) entered disabled state
ieee80211 phy1: brcmf_c_set_cur_etheraddr:
Setting cur_etheraddr failed, -52
brcmfmac 0001:01:00.0 phy1-ap3: entered allmulticast mode
brcmfmac 0001:01:00.0 phy1-ap3: entered promiscuous mode
br-lan: port 9(phy1-ap3) entered forwarding state

phy1-ap1 produces the same brcmf_c_set_cur_etheraddr failure; its line
was immediately above the displayed tail of the log.

The bridge state transitions are expected because I explicitly brought
each interface down and up. This test did not produce the previous
brcmf_cfg80211_add_iface error or an interface-creation retry loop.

## Interpretation

All AP netdevices expose the same ndo_set_mac_address operation.

brcmf_netdev_set_mac_address() calls:

brcmf_c_set_cur_etheraddr(ifp, address)

which sends the ordinary "cur_etheraddr" IOVAR using:

brcmf_fil_iovar_data_set(ifp, "cur_etheraddr", ...)

The same operation succeeds on the primary AP but returns -52 on every
secondary AP. The failure therefore correlates with the interface being
a secondary BSSCFG, rather than with the requested address format.

This does not by itself establish whether:

1. the firmware does not permit changing a secondary BSSID after
   creation; or

2. brcmfmac needs to use a BSSCFG-indexed "cur_etheraddr" operation for
   secondary AP interfaces.

There may also be a relevant creation-path issue. In
brcmf_apsta_add_vif(), params->macaddr is supplied when requesting a
station interface, but the AP path calls brcmf_cfg80211_request_ap_if()
without passing the requested AP address.

If a secondary AP address can only be assigned during firmware
interface/BSS creation, the current AP creation path does not appear to
provide userspace's requested address.

## Expected behavior

A valid MAC address supplied for an AP interface should either:

1. be applied to the correct firmware BSSCFG; or

2. be rejected with an explicit unsupported-operation error if the
   firmware does not permit changing that interface's address.

The driver should not expose apparently identical runtime MAC-change
support on all AP netdevices while the operation succeeds only on the
primary AP.

## Questions

1. Is the ordinary "cur_etheraddr" IOVAR expected to operate on
   secondary AP interfaces?

2. Should brcmf_netdev_set_mac_address() use
   brcmf_fil_bsscfg_data_set() for an interface whose bsscfgidx is not
   the primary BSS?

3. If secondary AP addresses are immutable after creation, should
   brcmf_cfg80211_request_ap_if() accept and pass params->macaddr when
   creating the firmware interface?

4. If the firmware imposes a BSSID address mask or address pool, should
   brcmfmac advertise that restriction through wiphy->addr_mask or
   reject incompatible requests before disrupting an active interface?


Best regards,