brcmfmac: disable packet filtering in promiscuous mode
Disable arp and nd offload to allow all packets sending to host. Reported-by: Phil Elwell <phil@raspberrypi.org> Tested-by: Phil Elwell <phil@raspberrypi.org> Reviewed-by: Arend Van Spriel <arend.vanspriel@broadcom.com> Signed-off-by: Franky Lin <franky.lin@broadcom.com> Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
This commit is contained in:
parent
2fd3877b5b
commit
6c219b0088
drivers/net/wireless/broadcom/brcm80211/brcmfmac
|
@ -472,47 +472,6 @@ send_key_to_dongle(struct brcmf_if *ifp, 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)
|
||||
{
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -203,6 +203,7 @@ int brcmf_netdev_wait_pend8021x(struct brcmf_if *ifp);
|
|||
/* 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);
|
||||
|
|
Loading…
Reference in New Issue