From a5d297afa1432616d4f4767e17443480fc940451 Mon Sep 17 00:00:00 2001 From: "nara218.lee" Date: Wed, 17 Apr 2019 18:14:36 +0900 Subject: [PATCH] [NEUS7920-477] [9610] wlbt: enable/disable enhanced packet filtering function as CMD ioctl Enabling or disabling enahnced packet filtering in runtime. Change-Id: Ia7cd5b365dde3c75a76258a19cc1f1f21c664520 SCSC-Bug-Id: SSB-52480 Signed-off-by: nara218.lee --- drivers/net/wireless/scsc/dev.c | 4 +- drivers/net/wireless/scsc/dev.h | 4 ++ drivers/net/wireless/scsc/ioctl.c | 9 ++++ drivers/net/wireless/scsc/mgt.c | 90 ++++++++++++++++++++----------- drivers/net/wireless/scsc/mgt.h | 3 ++ 5 files changed, 78 insertions(+), 32 deletions(-) diff --git a/drivers/net/wireless/scsc/dev.c b/drivers/net/wireless/scsc/dev.c index be8837c7f656..fdfe303ac097 100755 --- a/drivers/net/wireless/scsc/dev.c +++ b/drivers/net/wireless/scsc/dev.c @@ -389,7 +389,9 @@ struct slsi_dev *slsi_dev_attach(struct device *dev, struct scsc_mx *core, struc if (wifi_kic_register(sdev) < 0) SLSI_ERR(sdev, "failed to register Wi-Fi KIC ops\n"); #endif - +#ifdef CONFIG_SCSC_WLAN_ENHANCED_PKT_FILTER + sdev->enhanced_pkt_filter_enabled = true; +#endif sdev->device_state = SLSI_DEVICE_STATE_STOPPED; sdev->current_tspec_id = -1; sdev->tspec_error_code = -1; diff --git a/drivers/net/wireless/scsc/dev.h b/drivers/net/wireless/scsc/dev.h index bb3ff8363e01..2b7e7bd5b0bc 100755 --- a/drivers/net/wireless/scsc/dev.h +++ b/drivers/net/wireless/scsc/dev.h @@ -1124,6 +1124,10 @@ struct slsi_dev { #ifdef CONFIG_SCSC_WLAN_ENABLE_MAC_RANDOMISATION bool fw_mac_randomization_enabled; #endif + +#ifdef CONFIG_SCSC_WLAN_ENHANCED_PKT_FILTER + bool enhanced_pkt_filter_enabled; +#endif }; /* Compact representation of channels a ESS has been seen on diff --git a/drivers/net/wireless/scsc/ioctl.c b/drivers/net/wireless/scsc/ioctl.c index f90c8dc20479..a6ab3a5387ff 100755 --- a/drivers/net/wireless/scsc/ioctl.c +++ b/drivers/net/wireless/scsc/ioctl.c @@ -119,6 +119,9 @@ #ifdef CONFIG_SCSC_WLAN_SET_NUM_ANTENNAS #define CMD_SET_NUM_ANTENNAS "SET_NUM_ANTENNAS" #endif +#ifdef CONFIG_SCSC_WLAN_ENHANCED_PKT_FILTER +#define CMD_ENHANCED_PKT_FILTER "ENHANCED_PKT_FILTER" +#endif #define ROAMOFFLAPLIST_MIN 1 #define ROAMOFFLAPLIST_MAX 100 @@ -2568,6 +2571,12 @@ int slsi_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) SLSI_MUTEX_LOCK(ndev_vif->vif_mutex); ret = slsi_set_num_antennas(dev, num_of_antennas); SLSI_MUTEX_UNLOCK(ndev_vif->vif_mutex); +#endif +#ifdef CONFIG_SCSC_WLAN_ENHANCED_PKT_FILTER + } else if ((strncasecmp(command, CMD_ENHANCED_PKT_FILTER, strlen(CMD_ENHANCED_PKT_FILTER)) == 0)) { + const u8 enable = *(command + strlen(CMD_ENHANCED_PKT_FILTER) + 1) - '0'; + + ret = slsi_set_enhanced_pkt_filter(dev, enable); #endif } else { ret = -ENOTSUPP; diff --git a/drivers/net/wireless/scsc/mgt.c b/drivers/net/wireless/scsc/mgt.c index 0134c6df57dc..98ec199180af 100755 --- a/drivers/net/wireless/scsc/mgt.c +++ b/drivers/net/wireless/scsc/mgt.c @@ -3029,6 +3029,27 @@ int slsi_set_arp_packet_filter(struct slsi_dev *sdev, struct net_device *dev) } #ifdef CONFIG_SCSC_WLAN_ENHANCED_PKT_FILTER +int slsi_set_enhanced_pkt_filter(struct net_device *dev, u8 pkt_filter_enable) +{ + struct netdev_vif *netdev_vif = netdev_priv(dev); + struct slsi_dev *sdev = netdev_vif->sdev; + int ret = 0; + int is_suspend = 0; + + SLSI_MUTEX_LOCK(sdev->device_config_mutex); + is_suspend = sdev->device_config.user_suspend_mode; + SLSI_MUTEX_UNLOCK(sdev->device_config_mutex); + + if (is_suspend) { + SLSI_ERR(sdev, "Host is in early suspend state.\n"); + return -EPERM; /* set_enhanced_pkt_filter should not be called after suspend */ + } + + sdev->enhanced_pkt_filter_enabled = pkt_filter_enable; + SLSI_INFO(sdev, "Enhanced packet filter is %s", (pkt_filter_enable ? "enabled" : "disabled")); + return ret; +} + static int slsi_set_opt_out_unicast_packet_filter(struct slsi_dev *sdev, struct net_device *dev) { struct slsi_mlme_pattern_desc pattern_desc; @@ -3148,14 +3169,18 @@ static int slsi_set_multicast_packet_filters(struct slsi_dev *sdev, struct net_ SLSI_ETHER_COPY(pattern_desc.pattern, ndev_vif->sta.regd_mc_addr[i]); mc_filter_id = SLSI_REGD_MC_FILTER_ID + i; #ifdef CONFIG_SCSC_WLAN_ENHANCED_PKT_FILTER - slsi_create_packet_filter_element(mc_filter_id, - FAPI_PACKETFILTERMODE_OPT_IN, - 1, &pattern_desc, &pkt_filter_elem[num_filters], &pkt_filters_len); -#else - slsi_create_packet_filter_element(mc_filter_id, - FAPI_PACKETFILTERMODE_OPT_IN | FAPI_PACKETFILTERMODE_OPT_IN_SLEEP, - 1, &pattern_desc, &pkt_filter_elem[num_filters], &pkt_filters_len); + if (sdev->enhanced_pkt_filter_enabled) + slsi_create_packet_filter_element(mc_filter_id, + FAPI_PACKETFILTERMODE_OPT_IN, + 1, &pattern_desc, + &pkt_filter_elem[num_filters], &pkt_filters_len); + else #endif + slsi_create_packet_filter_element(mc_filter_id, + FAPI_PACKETFILTERMODE_OPT_IN | + FAPI_PACKETFILTERMODE_OPT_IN_SLEEP, + 1, &pattern_desc, + &pkt_filter_elem[num_filters], &pkt_filters_len); num_filters++; } @@ -3196,9 +3221,11 @@ int slsi_clear_packet_filters(struct slsi_dev *sdev, struct net_device *dev) } #ifdef CONFIG_SCSC_WLAN_ENHANCED_PKT_FILTER - num_filters++; /*All OPT OUT*/ - num_filters++; /*TCP IPv4 OPT IN*/ - num_filters++; /*TCP IPv6 OPT IN*/ + if (sdev->enhanced_pkt_filter_enabled) { + num_filters++; /*All OPT OUT*/ + num_filters++; /*TCP IPv4 OPT IN*/ + num_filters++; /*TCP IPv6 OPT IN*/ + } #endif pkt_filter_elem = kmalloc((num_filters * sizeof(struct slsi_mlme_pkt_filter_elem)), GFP_KERNEL); @@ -3226,18 +3253,18 @@ int slsi_clear_packet_filters(struct slsi_dev *sdev, struct net_device *dev) num_filters++; #ifdef CONFIG_SCSC_WLAN_ENHANCED_PKT_FILTER - slsi_create_packet_filter_element(SLSI_OPT_OUT_ALL_FILTER_ID, 0, 0, NULL, - &pkt_filter_elem[num_filters], &pkt_filters_len); - num_filters++; - slsi_create_packet_filter_element(SLSI_OPT_IN_TCP4_FILTER_ID, 0, 0, NULL, - &pkt_filter_elem[num_filters], &pkt_filters_len); - num_filters++; - slsi_create_packet_filter_element(SLSI_OPT_IN_TCP6_FILTER_ID, 0, 0, NULL, - &pkt_filter_elem[num_filters], &pkt_filters_len); - num_filters++; - SLSI_INFO(sdev, "Enhanced packet filter is removed."); + if (sdev->enhanced_pkt_filter_enabled) { + slsi_create_packet_filter_element(SLSI_OPT_OUT_ALL_FILTER_ID, 0, 0, NULL, + &pkt_filter_elem[num_filters], &pkt_filters_len); + num_filters++; + slsi_create_packet_filter_element(SLSI_OPT_IN_TCP4_FILTER_ID, 0, 0, NULL, + &pkt_filter_elem[num_filters], &pkt_filters_len); + num_filters++; + slsi_create_packet_filter_element(SLSI_OPT_IN_TCP6_FILTER_ID, 0, 0, NULL, + &pkt_filter_elem[num_filters], &pkt_filters_len); + num_filters++; + } #endif - ret = slsi_mlme_set_packet_filter(sdev, dev, pkt_filters_len, num_filters, pkt_filter_elem); kfree(pkt_filter_elem); return ret; @@ -3261,16 +3288,17 @@ int slsi_update_packet_filters(struct slsi_dev *sdev, struct net_device *dev) return ret; #ifdef CONFIG_SCSC_WLAN_ENHANCED_PKT_FILTER - ret = slsi_set_opt_out_unicast_packet_filter(sdev, dev); - if (ret) - return ret; - ret = slsi_set_opt_in_tcp4_packet_filter(sdev, dev); - if (ret) - return ret; - ret = slsi_set_opt_in_tcp6_packet_filter(sdev, dev); - if (ret) - return ret; - SLSI_INFO(sdev, "Enhanced packet filter is installed."); + if (sdev->enhanced_pkt_filter_enabled) { + ret = slsi_set_opt_out_unicast_packet_filter(sdev, dev); + if (ret) + return ret; + ret = slsi_set_opt_in_tcp4_packet_filter(sdev, dev); + if (ret) + return ret; + ret = slsi_set_opt_in_tcp6_packet_filter(sdev, dev); + if (ret) + return ret; + } #endif return slsi_set_common_packet_filters(sdev, dev); } diff --git a/drivers/net/wireless/scsc/mgt.h b/drivers/net/wireless/scsc/mgt.h index 90f442465991..3920930abbaa 100755 --- a/drivers/net/wireless/scsc/mgt.h +++ b/drivers/net/wireless/scsc/mgt.h @@ -469,6 +469,9 @@ int slsi_is_mdns_packet(u8 *data); int slsi_is_tcp_sync_packet(struct net_device *dev, struct sk_buff *skb); #endif +#ifdef CONFIG_SCSC_WLAN_ENHANCED_PKT_FILTER +int slsi_set_enhanced_pkt_filter(struct net_device *dev, u8 pkt_filter_enable); +#endif void slsi_set_packet_filters(struct slsi_dev *sdev, struct net_device *dev); int slsi_update_packet_filters(struct slsi_dev *sdev, struct net_device *dev); int slsi_clear_packet_filters(struct slsi_dev *sdev, struct net_device *dev); -- 2.20.1