From 5bf15132170921a406cff2dec6b252c64be6bc00 Mon Sep 17 00:00:00 2001 From: Manjunathappa Prakash Date: Fri, 31 Jul 2020 16:03:15 -0700 Subject: [PATCH] qcacld-3.0: Override EAPOL BC Tx frame with AP mac addr Take care to update the EAPOL Tx frame DA with AP mac addr if DA is broadcast address as EAPOL BC doesnot make sense. Change-Id: Id58b7b7971f5a7c11de0b46c6189a6e6ad1917ab CRs-Fixed: 2745826 --- Kbuild | 2 ++ configs/default_defconfig | 2 ++ core/hdd/src/wlan_hdd_tx_rx.c | 37 +++++++++++++++++++++++++++++++++++ 3 files changed, 41 insertions(+) diff --git a/Kbuild b/Kbuild index cc08c944b125..77f559bc891a 100644 --- a/Kbuild +++ b/Kbuild @@ -3564,6 +3564,8 @@ cppflags-$(CONFIG_RX_FISA) += -DWLAN_SUPPORT_RX_FISA cppflags-$(CONFIG_RX_DEFRAG_DO_NOT_REINJECT) += -DRX_DEFRAG_DO_NOT_REINJECT +cppflags-$(CONFIG_HANDLE_BC_EAP_TX_FRM) += -DHANDLE_BROADCAST_EAPOL_TX_FRAME + cppflags-$(CONFIG_MORE_TX_DESC) += -DTX_TO_NPEERS_INC_TX_DESCS ccflags-$(CONFIG_HASTINGS_BT_WAR) += -DHASTINGS_BT_WAR diff --git a/configs/default_defconfig b/configs/default_defconfig index 159471cb69ea..6d37d6dcbcb7 100644 --- a/configs/default_defconfig +++ b/configs/default_defconfig @@ -1118,6 +1118,8 @@ CONFIG_MORE_TX_DESC := y endif +CONFIG_HANDLE_BC_EAP_TX_FRM := y + ifeq ($(CONFIG_BAND_6GHZ), y) CONFIG_6G_SCAN_CHAN_SORT_ALGO := y diff --git a/core/hdd/src/wlan_hdd_tx_rx.c b/core/hdd/src/wlan_hdd_tx_rx.c index 1215f0dabd2d..adab904200c8 100644 --- a/core/hdd/src/wlan_hdd_tx_rx.c +++ b/core/hdd/src/wlan_hdd_tx_rx.c @@ -923,6 +923,41 @@ void hdd_get_transmit_mac_addr(struct hdd_adapter *adapter, struct sk_buff *skb, } } +#ifdef HANDLE_BROADCAST_EAPOL_TX_FRAME +/** + * wlan_hdd_fix_broadcast_eapol() - Fix broadcast eapol + * @adapter: pointer to adapter + * @skb: pointer to OS packet (sk_buff) + * + * Override DA of broadcast eapol with bssid addr. + * + * Return: None + */ +static void wlan_hdd_fix_broadcast_eapol(struct hdd_adapter *adapter, + struct sk_buff *skb) +{ + struct ethhdr *eh = (struct ethhdr *)skb->data; + unsigned char *ap_mac_addr = + &adapter->session.station.conn_info.bssid.bytes[0]; + + if (qdf_unlikely((QDF_NBUF_CB_GET_PACKET_TYPE(skb) == + QDF_NBUF_CB_PACKET_TYPE_EAPOL) && + QDF_NBUF_CB_GET_IS_BCAST(skb))) { + hdd_debug("SA: "QDF_MAC_ADDR_STR " override DA: "QDF_MAC_ADDR_STR " with AP mac address "QDF_MAC_ADDR_STR, + QDF_MAC_ADDR_ARRAY(&eh->h_source[0]), + QDF_MAC_ADDR_ARRAY(&eh->h_dest[0]), + QDF_MAC_ADDR_ARRAY(ap_mac_addr)); + + qdf_mem_copy(&eh->h_dest, ap_mac_addr, QDF_MAC_ADDR_SIZE); + } +} +#else +static void wlan_hdd_fix_broadcast_eapol(struct hdd_adapter *adapter, + struct sk_buff *skb) +{ +} +#endif /* HANDLE_BROADCAST_EAPOL_TX_FRAME */ + /** * __hdd_hard_start_xmit() - Transmit a frame * @skb: pointer to OS packet (sk_buff) @@ -1181,6 +1216,8 @@ static void __hdd_hard_start_xmit(struct sk_buff *skb, goto drop_pkt_and_release_skb; } + wlan_hdd_fix_broadcast_eapol(adapter, skb); + if (adapter->tx_fn(soc, adapter->vdev_id, (qdf_nbuf_t)skb)) { QDF_TRACE(QDF_MODULE_ID_HDD_DATA, QDF_TRACE_LEVEL_INFO_HIGH, "%s: Failed to send packet to txrx for sta_id: "