From 80cebfc3a14a2645e99baa0a72587e25961e178f Mon Sep 17 00:00:00 2001 From: Phil Elwell Date: Thu, 24 Aug 2017 16:16:16 +0100 Subject: [PATCH 151/703] brcmfmac: Disable ARP offloading when promiscuous This is a test patch for brcmfmac from Franky Lin at Broadcom to disable ARP offloading when in promiscuous mode, re-enabling the ability to sniff ARP packets over WiFi. See: https://github.com/raspberrypi/linux/issues/2171 Signed-off-by: Phil Elwell --- .../net/wireless/broadcom/brcm80211/brcmfmac/core.c | 11 ++++++----- .../net/wireless/broadcom/brcm80211/brcmfmac/core.h | 1 + 2 files changed, 7 insertions(+), 5 deletions(-) --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c @@ -88,25 +88,25 @@ void brcmf_configure_arp_nd_offload(stru if (err) { brcmf_dbg(TRACE, "failed to set ARP offload mode to 0x%x, err = %d\n", mode, err); + err = 0; } else { err = brcmf_fil_iovar_int_set(ifp, "arpoe", enable); if (err) { brcmf_dbg(TRACE, "failed to configure (%d) ARP offload err = %d\n", enable, err); - } else { + err = 0; + } else brcmf_dbg(TRACE, "successfully configured (%d) ARP offload to 0x%x\n", enable, mode); - } } err = brcmf_fil_iovar_int_set(ifp, "ndoe", enable); - if (err) { + if (err) brcmf_dbg(TRACE, "failed to configure (%d) ND offload err = %d\n", enable, err); - } else { + else brcmf_dbg(TRACE, "successfully configured (%d) ND offload to 0x%x\n", enable, mode); - } } static void _brcmf_set_multicast_list(struct work_struct *work) @@ -172,6 +172,7 @@ static void _brcmf_set_multicast_list(st if (err < 0) brcmf_err("Setting BRCMF_C_SET_PROMISC failed, %d\n", err); + brcmf_configure_arp_nd_offload(ifp, !cmd_value); } --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h @@ -210,6 +210,7 @@ char *brcmf_ifname(struct brcmf_if *ifp) struct brcmf_if *brcmf_get_ifp(struct brcmf_pub *drvr, int ifidx); void brcmf_configure_arp_nd_offload(struct brcmf_if *ifp, bool enable); int brcmf_net_attach(struct brcmf_if *ifp, bool rtnl_locked); +void brcmf_configure_arp_nd_offload(struct brcmf_if *ifp, bool enable); struct brcmf_if *brcmf_add_if(struct brcmf_pub *drvr, s32 bsscfgidx, s32 ifidx, bool is_p2pdev, const char *name, u8 *mac_addr); void brcmf_remove_interface(struct brcmf_if *ifp, bool rtnl_locked);