12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- From 455f3e76cfc0d893585a5f358b9ddbe9c1e1e53b Mon Sep 17 00:00:00 2001
- From: Arend Van Spriel <[email protected]>
- Date: Wed, 28 Feb 2018 21:15:20 +0100
- Subject: [PATCH] brcmfmac: fix P2P_DEVICE ethernet address generation
- The firmware has a requirement that the P2P_DEVICE address should
- be different from the address of the primary interface. When not
- specified by user-space, the driver generates the MAC address for
- the P2P_DEVICE interface using the MAC address of the primary
- interface and setting the locally administered bit. However, the MAC
- address of the primary interface may already have that bit set causing
- the creation of the P2P_DEVICE interface to fail with -EBUSY. Fix this
- by using a random address instead to determine the P2P_DEVICE address.
- Cc: [email protected] # 3.10.y
- Reported-by: Hans de Goede <[email protected]>
- Reviewed-by: Hante Meuleman <[email protected]>
- Reviewed-by: Pieter-Paul Giesberts <[email protected]>
- Reviewed-by: Franky Lin <[email protected]>
- Signed-off-by: Arend van Spriel <[email protected]>
- Signed-off-by: Kalle Valo <[email protected]>
- ---
- .../net/wireless/broadcom/brcm80211/brcmfmac/p2p.c | 24 ++++++++++------------
- 1 file changed, 11 insertions(+), 13 deletions(-)
- --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
- +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
- @@ -462,25 +462,23 @@ static int brcmf_p2p_set_firmware(struct
- * @dev_addr: optional device address.
- *
- * P2P needs mac addresses for P2P device and interface. If no device
- - * address it specified, these are derived from the primary net device, ie.
- - * the permanent ethernet address of the device.
- + * address it specified, these are derived from a random ethernet
- + * address.
- */
- static void brcmf_p2p_generate_bss_mac(struct brcmf_p2p_info *p2p, u8 *dev_addr)
- {
- - struct brcmf_if *pri_ifp = p2p->bss_idx[P2PAPI_BSSCFG_PRIMARY].vif->ifp;
- - bool local_admin = false;
- + bool random_addr = false;
-
- - if (!dev_addr || is_zero_ether_addr(dev_addr)) {
- - dev_addr = pri_ifp->mac_addr;
- - local_admin = true;
- - }
- + if (!dev_addr || is_zero_ether_addr(dev_addr))
- + random_addr = true;
-
- - /* Generate the P2P Device Address. This consists of the device's
- - * primary MAC address with the locally administered bit set.
- + /* Generate the P2P Device Address obtaining a random ethernet
- + * address with the locally administered bit set.
- */
- - memcpy(p2p->dev_addr, dev_addr, ETH_ALEN);
- - if (local_admin)
- - p2p->dev_addr[0] |= 0x02;
- + if (random_addr)
- + eth_random_addr(p2p->dev_addr);
- + else
- + memcpy(p2p->dev_addr, dev_addr, ETH_ALEN);
-
- /* Generate the P2P Interface Address. If the discovery and connection
- * BSSCFGs need to simultaneously co-exist, then this address must be
|