qcacld-3.0: Fix implicit tdls connection issue

Fix implicit tdls connection issue. Correct usage of qdf_mem_set.
DUT could receive multicast frames after tdls connection tear down,
add check condition of frames with multicast dest address in
tdls_update_rx_pkt_cnt.

Change-Id: Ia1d7bbf2c129e9aebc98f7fcdea263b745c221ec
CRs-Fixed: 2375043
This commit is contained in:
hangtian 2019-01-07 16:35:49 +08:00 committed by nshrivas
parent 025ee99f58
commit a7938f8849
5 changed files with 25 additions and 14 deletions

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2017-2018 The Linux Foundation. All rights reserved.
* Copyright (c) 2017-2019 The Linux Foundation. All rights reserved.
*
* Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the
@ -229,8 +229,8 @@ static void tdls_ct_sampling_tx_rx(struct tdls_vdev_priv_obj *tdls_vdev,
qdf_mem_copy(mac_table, tdls_vdev->ct_peer_table,
(sizeof(struct tdls_conn_tracker_mac_table)) * mac_entries);
qdf_mem_set(tdls_vdev->ct_peer_table, 0,
(sizeof(struct tdls_conn_tracker_mac_table)) * mac_entries);
qdf_mem_set(tdls_vdev->ct_peer_table,
(sizeof(struct tdls_conn_tracker_mac_table)) * mac_entries, 0);
tdls_vdev->valid_mac_entries = 0;
@ -250,7 +250,8 @@ static void tdls_ct_sampling_tx_rx(struct tdls_vdev_priv_obj *tdls_vdev,
}
void tdls_update_rx_pkt_cnt(struct wlan_objmgr_vdev *vdev,
struct qdf_mac_addr *mac_addr)
struct qdf_mac_addr *mac_addr,
struct qdf_mac_addr *dest_mac_addr)
{
struct tdls_vdev_priv_obj *tdls_vdev_obj;
struct tdls_soc_priv_obj *tdls_soc_obj;
@ -268,6 +269,9 @@ void tdls_update_rx_pkt_cnt(struct wlan_objmgr_vdev *vdev,
if (qdf_is_macaddr_group(mac_addr))
return;
if (qdf_is_macaddr_group(dest_mac_addr))
return;
if (qdf_mem_cmp(vdev->vdev_mlme.macaddr, mac_addr,
QDF_MAC_ADDR_SIZE) == 0)
return;

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2017-2018 The Linux Foundation. All rights reserved.
* Copyright (c) 2017-2019 The Linux Foundation. All rights reserved.
*
* Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the
@ -58,6 +58,7 @@ void tdls_implicit_enable(struct tdls_vdev_priv_obj *tdls_vdev);
* tdls_update_rx_pkt_cnt() - Update rx packet count
* @vdev: vdev object manager
* @mac_addr: mac address of the data
* @dest_mac_addr: dest mac address of the data
*
* Increase the rx packet count, if the sender is not bssid and the packet is
* not broadcast and multicast packet
@ -70,7 +71,8 @@ void tdls_implicit_enable(struct tdls_vdev_priv_obj *tdls_vdev);
* Return: None
*/
void tdls_update_rx_pkt_cnt(struct wlan_objmgr_vdev *vdev,
struct qdf_mac_addr *mac_addr);
struct qdf_mac_addr *mac_addr,
struct qdf_mac_addr *dest_mac_addr);
/**
* tdls_update_tx_pkt_cnt() - update tx packet

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2017-2018 The Linux Foundation. All rights reserved.
* Copyright (c) 2017-2019 The Linux Foundation. All rights reserved.
*
* Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the
@ -196,11 +196,13 @@ QDF_STATUS ucfg_tdls_set_operating_mode(
* ucfg_tdls_update_rx_pkt_cnt() - update rx pkt count
* @vdev: tdls vdev object
* @mac_addr: peer mac address
* @dest_mac_addr: dest mac address
*
* Return: None
*/
void ucfg_tdls_update_rx_pkt_cnt(struct wlan_objmgr_vdev *vdev,
struct qdf_mac_addr *mac_addr);
struct qdf_mac_addr *mac_addr,
struct qdf_mac_addr *dest_mac_addr);
/**
* ucfg_tdls_update_tx_pkt_cnt() - update tx pkt count

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2017-2018 The Linux Foundation. All rights reserved.
* Copyright (c) 2017-2019 The Linux Foundation. All rights reserved.
*
* Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the
@ -937,13 +937,14 @@ QDF_STATUS ucfg_tdls_set_operating_mode(
}
void ucfg_tdls_update_rx_pkt_cnt(struct wlan_objmgr_vdev *vdev,
struct qdf_mac_addr *mac_addr)
struct qdf_mac_addr *mac_addr,
struct qdf_mac_addr *dest_mac_addr)
{
QDF_STATUS status;
status = wlan_objmgr_vdev_try_get_ref(vdev, WLAN_TDLS_NB_ID);
if (status != QDF_STATUS_SUCCESS)
return;
tdls_update_rx_pkt_cnt(vdev, mac_addr);
tdls_update_rx_pkt_cnt(vdev, mac_addr, dest_mac_addr);
wlan_objmgr_vdev_release_ref(vdev, WLAN_TDLS_NB_ID);
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2012-2018 The Linux Foundation. All rights reserved.
* Copyright (c) 2012-2019 The Linux Foundation. All rights reserved.
*
* Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the
@ -1992,7 +1992,7 @@ QDF_STATUS hdd_rx_packet_cbk(void *adapter_context,
struct sk_buff *next = NULL;
struct hdd_station_ctx *sta_ctx = NULL;
unsigned int cpu_index;
struct qdf_mac_addr *mac_addr;
struct qdf_mac_addr *mac_addr, *dest_mac_addr;
bool wake_lock = false;
uint8_t pkt_type = 0;
bool track_arp = false;
@ -2081,9 +2081,11 @@ QDF_STATUS hdd_rx_packet_cbk(void *adapter_context,
QDF_DP_TRACE_RX_PACKET_RECORD,
0, QDF_RX));
dest_mac_addr = (struct qdf_mac_addr *)(skb->data);
mac_addr = (struct qdf_mac_addr *)(skb->data+QDF_MAC_ADDR_SIZE);
ucfg_tdls_update_rx_pkt_cnt(adapter->vdev, mac_addr);
ucfg_tdls_update_rx_pkt_cnt(adapter->vdev, mac_addr,
dest_mac_addr);
skb->dev = adapter->dev;
skb->protocol = eth_type_trans(skb, skb->dev);