[NEUS7920-477] [9610] wlbt: enable/disable enhanced packet filtering function as...
authornara218.lee <nara218.lee@samsung.com>
Wed, 17 Apr 2019 09:14:36 +0000 (18:14 +0900)
committerKim Gunho <gunho.kim@samsung.com>
Fri, 28 Jun 2019 14:46:24 +0000 (23:46 +0900)
Enabling or disabling enahnced packet filtering in runtime.

Change-Id: Ia7cd5b365dde3c75a76258a19cc1f1f21c664520
SCSC-Bug-Id: SSB-52480
Signed-off-by: nara218.lee <nara218.lee@samsung.com>
drivers/net/wireless/scsc/dev.c
drivers/net/wireless/scsc/dev.h
drivers/net/wireless/scsc/ioctl.c
drivers/net/wireless/scsc/mgt.c
drivers/net/wireless/scsc/mgt.h

index be8837c7f6568a4bb93fda6d52bd96d12ee2ca62..fdfe303ac0977ddb9d08cafd100dc66698ce95b7 100755 (executable)
@@ -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;
index bb3ff8363e017e0328089ee67ae3d128171ec59b..2b7e7bd5b0bc09b45cfb294525df0641c01032eb 100755 (executable)
@@ -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
index f90c8dc204793373cd3ac93cef18c3c8a8eb5d48..a6ab3a5387ff2f0380f95cf97a821883a4099003 100755 (executable)
 #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;
index 0134c6df57dc298935dd2d0fe62d4ab07fd62b40..98ec199180af6b205c33d60c467f840c9c6076cf 100755 (executable)
@@ -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);
 }
index 90f442465991bf497f5b5c6de161d3531713066c..3920930abbaabba8fb99b6269a3eb636a4c6abf0 100755 (executable)
@@ -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);