Message ID | 20200901063237.15549-5-wright.feng@cypress.com (mailing list archive) |
---|---|
State | Changes Requested |
Delegated to: | Kalle Valo |
Headers | show |
Series | brcmfmac: Add few features in AP mode | expand |
Wright Feng <wright.feng@cypress.com> writes: > From: Ting-Ying Li <tingying.li@cypress.com> > > When the "ap_isolate" function is not set by the host, > host-based packet forwarding will be enabled if the packet > forwarding mechanism is not offloaded to the lower layer. > > Signed-off-by: Ting-Ying Li <tingying.li@cypress.com> > Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com> [...] > + /* Get ap_isolate value from firmware to detemine whether fmac */ > + /* driver supports packet forwarding. */ > + if (brcmf_fil_iovar_int_get(ifp, "ap_isolate", &val) == 0) { > + ifp->fmac_pkt_fwd_en = > + ((params->ap_isolate == 0) && (val == 1)) ? > + true : false; > + } else { > + brcmf_err("get ap_isolate iovar failed: ret=%d\n", ret); > + ifp->fmac_pkt_fwd_en = false; > + } This is hard to read, you can simplify it to: if (brcmf_fil_iovar_int_get(ifp, "ap_isolate", &val) == 0 && params->ap_isolate == 0 && val == 1) { ifp->fmac_pkt_fwd_en = true; } else { brcmf_err("get ap_isolate iovar failed: ret=%d\n", ret); ifp->fmac_pkt_fwd_en = false; }
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c index 8c7941f85715..ac0095989e43 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c @@ -5447,7 +5447,7 @@ brcmf_cfg80211_change_bss(struct wiphy *wiphy, struct net_device *dev, { struct brcmf_if *ifp; int ret = 0; - u32 ap_isolate; + u32 ap_isolate, val; brcmf_dbg(TRACE, "Enter\n"); ifp = netdev_priv(dev); @@ -5458,6 +5458,17 @@ brcmf_cfg80211_change_bss(struct wiphy *wiphy, struct net_device *dev, brcmf_err("ap_isolate iovar failed: ret=%d\n", ret); } + /* Get ap_isolate value from firmware to detemine whether fmac */ + /* driver supports packet forwarding. */ + if (brcmf_fil_iovar_int_get(ifp, "ap_isolate", &val) == 0) { + ifp->fmac_pkt_fwd_en = + ((params->ap_isolate == 0) && (val == 1)) ? + true : false; + } else { + brcmf_err("get ap_isolate iovar failed: ret=%d\n", ret); + ifp->fmac_pkt_fwd_en = false; + } + return ret; } diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h index 3cf0b8c8d7b1..d5745f48e003 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h @@ -196,6 +196,7 @@ struct brcmf_if { bool fwil_fwerr; struct list_head sta_list; /* sll of associated stations */ spinlock_t sta_list_lock; + bool fmac_pkt_fwd_en; }; struct ether_addr { diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c index c53c3cf96f92..1c109257aefc 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c @@ -1190,8 +1190,8 @@ brcmf_msgbuf_process_rx_complete(struct brcmf_msgbuf *msgbuf, void *buf) return; } - eh = (struct ethhdr *)(skb->data); - if (ifp->isap) { + if (ifp->isap && ifp->fmac_pkt_fwd_en) { + eh = (struct ethhdr *)(skb->data); skb_set_network_header(skb, sizeof(struct ethhdr)); skb->protocol = eh->h_proto; skb->priority = cfg80211_classify8021d(skb, NULL);