From: Franky Lin <franky....@broadcom.com>

Disable arp and nd offload to allow all packets sending to host.

Reported-by: Phil Elwell <p...@raspberrypi.org>
Tested-by: Phil Elwell <p...@raspberrypi.org>
Reviewed-by: Arend Van Spriel <arend.vanspr...@broadcom.com>
Signed-off-by: Franky Lin <franky....@broadcom.com>
---
 .../broadcom/brcm80211/brcmfmac/cfg80211.c         | 41 ----------------------
 .../wireless/broadcom/brcm80211/brcmfmac/core.c    | 38 ++++++++++++++++++++
 .../wireless/broadcom/brcm80211/brcmfmac/core.h    |  1 +
 3 files changed, 39 insertions(+), 41 deletions(-)

diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c 
b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
index aaed4ab..b249083 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
@@ -472,47 +472,6 @@ static void convert_key_from_CPU(struct brcmf_wsec_key 
*key,
        return err;
 }
 
-static s32
-brcmf_configure_arp_nd_offload(struct brcmf_if *ifp, bool enable)
-{
-       s32 err;
-       u32 mode;
-
-       if (enable)
-               mode = BRCMF_ARP_OL_AGENT | BRCMF_ARP_OL_PEER_AUTO_REPLY;
-       else
-               mode = 0;
-
-       /* Try to set and enable ARP offload feature, this may fail, then it  */
-       /* is simply not supported and err 0 will be returned                 */
-       err = brcmf_fil_iovar_int_set(ifp, "arp_ol", mode);
-       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);
-                       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) {
-               brcmf_dbg(TRACE, "failed to configure (%d) ND offload err = 
%d\n",
-                         enable, err);
-               err = 0;
-       } else
-               brcmf_dbg(TRACE, "successfully configured (%d) ND offload to 
0x%x\n",
-                         enable, mode);
-
-       return err;
-}
-
 static void
 brcmf_cfg80211_update_proto_addr_mode(struct wireless_dev *wdev)
 {
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c 
b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
index 5cc3a07..9c7536d 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
@@ -71,6 +71,43 @@ struct brcmf_if *brcmf_get_ifp(struct brcmf_pub *drvr, int 
ifidx)
        return ifp;
 }
 
+void brcmf_configure_arp_nd_offload(struct brcmf_if *ifp, bool enable)
+{
+       s32 err;
+       u32 mode;
+
+       if (enable)
+               mode = BRCMF_ARP_OL_AGENT | BRCMF_ARP_OL_PEER_AUTO_REPLY;
+       else
+               mode = 0;
+
+       /* Try to set and enable ARP offload feature, this may fail, then it  */
+       /* is simply not supported and err 0 will be returned                 */
+       err = brcmf_fil_iovar_int_set(ifp, "arp_ol", mode);
+       if (err) {
+               brcmf_dbg(TRACE, "failed to set ARP offload mode to 0x%x, err = 
%d\n",
+                         mode, err);
+       } 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 {
+                       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) {
+               brcmf_dbg(TRACE, "failed to configure (%d) ND offload err = 
%d\n",
+                         enable, err);
+       } 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)
 {
        struct brcmf_if *ifp;
@@ -134,6 +171,7 @@ static void _brcmf_set_multicast_list(struct work_struct 
*work)
        if (err < 0)
                brcmf_err("Setting BRCMF_C_SET_PROMISC failed, %d\n",
                          err);
+       brcmf_configure_arp_nd_offload(ifp, !cmd_value);
 }
 
 #if IS_ENABLED(CONFIG_IPV6)
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h 
b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
index a4dd313..1708571 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
@@ -203,6 +203,7 @@ struct brcmf_if {
 /* Return pointer to interface name */
 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);
 struct brcmf_if *brcmf_add_if(struct brcmf_pub *drvr, s32 bsscfgidx, s32 ifidx,
                              bool is_p2pdev, const char *name, u8 *mac_addr);
-- 
1.9.1

Reply via email to