Commit df56e581 authored by Ting-Ying Li's avatar Ting-Ying Li Committed by Johannes Berg
Browse files

wifi: brcmfmac: don't allow arp/nd offload to be enabled if ap mode exists



Add a check to determine whether arp/nd offload enabling
request is allowed. If there is any interface acts as ap
mode and is operating, reject the request of arp offload
enabling from cfg80211.

Signed-off-by: default avatarTing-Ying Li <tingying.li@cypress.com>
Signed-off-by: default avatarIan Lin <ian.lin@infineon.com>
Acked-by: default avatarArend van Spriel <arend.vanspriel@broadcom.com>
Link: https://patch.msgid.link/20250606093444.15753-1-ian.lin@infineon.com


Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent 12651687
Loading
Loading
Loading
Loading
+16 −1
Original line number Diff line number Diff line
@@ -1043,6 +1043,21 @@ void brcmf_set_mpc(struct brcmf_if *ifp, int mpc)
	}
}

bool brcmf_is_apmode_operating(struct wiphy *wiphy)
{
	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
	struct brcmf_cfg80211_vif *vif;
	bool ret = false;

	list_for_each_entry(vif, &cfg->vif_list, list) {
		if (brcmf_is_apmode(vif) &&
		    test_bit(BRCMF_VIF_STATUS_AP_CREATED, &vif->sme_state))
			ret = true;
	}

	return ret;
}

static void brcmf_scan_params_v2_to_v1(struct brcmf_scan_params_v2_le *params_v2_le,
				       struct brcmf_scan_params_le *params_le)
{
@@ -5416,8 +5431,8 @@ static int brcmf_cfg80211_stop_ap(struct wiphy *wiphy, struct net_device *ndev,
			bphy_err(drvr, "bss_enable config failed %d\n", err);
	}
	brcmf_set_mpc(ifp, 1);
	brcmf_configure_arp_nd_offload(ifp, true);
	clear_bit(BRCMF_VIF_STATUS_AP_CREATED, &ifp->vif->sme_state);
	brcmf_configure_arp_nd_offload(ifp, true);
	brcmf_net_setcarrier(ifp, false);

	return err;
+1 −0
Original line number Diff line number Diff line
@@ -487,6 +487,7 @@ s32 brcmf_notify_escan_complete(struct brcmf_cfg80211_info *cfg,
				struct brcmf_if *ifp, bool aborted,
				bool fw_abort);
void brcmf_set_mpc(struct brcmf_if *ndev, int mpc);
bool brcmf_is_apmode_operating(struct wiphy *wiphy);
void brcmf_abort_scanning(struct brcmf_cfg80211_info *cfg);
void brcmf_cfg80211_free_netdev(struct net_device *ndev);

+5 −0
Original line number Diff line number Diff line
@@ -98,6 +98,11 @@ void brcmf_configure_arp_nd_offload(struct brcmf_if *ifp, bool enable)
	s32 err;
	u32 mode;

	if (enable && brcmf_is_apmode_operating(ifp->drvr->wiphy)) {
		brcmf_dbg(TRACE, "Skip ARP/ND offload enable when soft AP is running\n");
		return;
	}

	if (enable)
		mode = BRCMF_ARP_OL_AGENT | BRCMF_ARP_OL_PEER_AUTO_REPLY;
	else