[RAMEN9610-20413][lv] host update 10.6.1.1 for lenovo only
authorYoungsoo <youngss.kim@samsung.com>
Thu, 26 Sep 2019 06:30:45 +0000 (15:30 +0900)
committerCosmin Tanislav <demonsingur@gmail.com>
Mon, 22 Apr 2024 17:23:36 +0000 (20:23 +0300)
add ipv4 multicast packet filter again.
add prevent issue fix : 310263

Change-Id: I3895000b184dd6c8731b7ead4343056deb9d80cc
Signed-off-by: Youngsoo <youngss.kim@samsung.com>
drivers/misc/samsung/scsc/mxman.c
drivers/net/wireless/scsc/Kconfig
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
include/scsc/scsc_release.h

index f95ee139eff648013bf6a4541ec39f3faf175c71..dcd3567e8f193e9ccb6b403b5966f3fc3340a70b 100755 (executable)
@@ -1546,7 +1546,7 @@ static void process_panic_record(struct mxman *mxman)
 #ifdef CONFIG_SCSC_MX450_GDB_SUPPORT
                } else if (mxman->fwhdr.m4_1_panic_record_offset) {
                        m4_1_panic_record = (u32 *)(mxman->fw + mxman->fwhdr.m4_1_panic_record_offset);
-                       m4_1_panic_record_ok = fw_parse_m4_panic_record(m4_panic_record, &m4_1_panic_record_length);
+                       m4_1_panic_record_ok = fw_parse_m4_panic_record(m4_1_panic_record, &m4_1_panic_record_length);
 #endif
                } else {
                        SCSC_TAG_INFO(MXMAN, "M4 panic record doesn't exist in the firmware header\n");
index b0cdcf0f4efbbb65d7e01883362b7cebf456f0ac..5d480b1484ce10c8bc079c67f21b9116ed74576e 100755 (executable)
@@ -268,3 +268,9 @@ config SCSC_WLAN_SILENT_RECOVERY
        default y
        ---help---
        This option tells if silent recovery is enabled or not.
+
+config SCSC_WLAN_ABNORMAL_MULTICAST_PKT_FILTER
+        bool "Enable abnormal multicast packet filtering in suspend"
+        default n
+        ---help---
+          This option tells if abnormal multicast packet filtering in suspend is supported or not.
index caf3d7b3b888859bd1a585d31fd8ac3f7d72c1be..e2d27cc779474b36a4d52188d57439c698b4f4af 100755 (executable)
@@ -391,6 +391,9 @@ struct slsi_dev *slsi_dev_attach(struct device *dev, struct scsc_mx *core, struc
 #endif
 #ifdef CONFIG_SCSC_WLAN_ENHANCED_PKT_FILTER
        sdev->enhanced_pkt_filter_enabled = true;
+#endif
+#ifdef CONFIG_SCSC_WLAN_ABNORMAL_MULTICAST_PKT_FILTER
+       sdev->abnormal_multicast_pkt_filter_enabled = true;
 #endif
        sdev->device_state = SLSI_DEVICE_STATE_STOPPED;
        sdev->current_tspec_id = -1;
index ad787a5b2e9c2bf9887d0cd16b094f709d175845..25c391149c82f1d3d1e2ca8f26cd4ab1da7f6ff3 100755 (executable)
@@ -464,38 +464,42 @@ struct slsi_wmm_parameter_element {
 #ifdef CONFIG_SCSC_WLAN_BLOCK_IPV6
 
 enum slsi_filter_id {
-       SLSI_LOCAL_ARP_FILTER_ID = SLSI_MIN_FILTER_ID,  /* 0x80 */
-       SLSI_ALL_BC_MC_FILTER_ID,                                               /* 0x81 */
-       SLSI_PROXY_ARP_FILTER_ID,                                               /* 0x82 */
-       SLSI_ALL_IPV6_PKTS_FILTER_ID,                                   /* 0x83 */
+       SLSI_ALL_ARP_FILTER_ID = SLSI_MIN_FILTER_ID,    /* 0x80 */
+       SLSI_LOCAL_ARP_FILTER_ID,                                               /* 0x81 */
+       SLSI_ALL_BC_MC_FILTER_ID,                                               /* 0x82 */
+       SLSI_PROXY_ARP_FILTER_ID,                                               /* 0x83 */
+       SLSI_ALL_IPV6_PKTS_FILTER_ID,                                   /* 0x84 */
 #ifndef CONFIG_SCSC_WLAN_DISABLE_NAT_KA
-       SLSI_NAT_IPSEC_FILTER_ID,                                               /* 0x84 */
+       SLSI_NAT_IPSEC_FILTER_ID,                                               /* 0x85 */
 #endif
 #ifdef CONFIG_SCSC_WLAN_ENHANCED_PKT_FILTER
-       SLSI_OPT_OUT_ALL_FILTER_ID,                                             /* 0x85 */
-       SLSI_OPT_IN_TCP4_FILTER_ID,                                             /* 0x86 */
-       SLSI_OPT_IN_TCP6_FILTER_ID,                                             /* 0x87 */
+       SLSI_OPT_OUT_ALL_FILTER_ID,                                             /* 0x86 */
+       SLSI_OPT_IN_TCP4_FILTER_ID,                                             /* 0x87 */
+       SLSI_OPT_IN_TCP6_FILTER_ID,                                             /* 0x88 */
 #endif
-       SLSI_REGD_MC_FILTER_ID,                                                 /* 0x88 */
+       SLSI_OPT_OUT_ABNORMAL_MULTICAST_ID,                             /* 0x89 */
+       SLSI_REGD_MC_FILTER_ID,                                                 /* 0x8A */
 };
 #else
 
 /* for STA */
 enum slsi_filter_id {
-       SLSI_LOCAL_ARP_FILTER_ID = SLSI_MIN_FILTER_ID,  /* 0x80 */
-       SLSI_ALL_BC_MC_FILTER_ID,                                               /* 0x81 */
-       SLSI_PROXY_ARP_FILTER_ID,                                               /* 0x82 */
-       SLSI_LOCAL_NS_FILTER_ID,                                                /* 0x83 */
-       SLSI_PROXY_ARP_NA_FILTER_ID,                                    /* 0x84 */
+       SLSI_ALL_ARP_FILTER_ID = SLSI_MIN_FILTER_ID,    /* 0x80 */
+       SLSI_LOCAL_ARP_FILTER_ID,                                               /* 0x81 */
+       SLSI_ALL_BC_MC_FILTER_ID,                                               /* 0x82 */
+       SLSI_PROXY_ARP_FILTER_ID,                                               /* 0x83 */
+       SLSI_LOCAL_NS_FILTER_ID,                                                /* 0x84 */
+       SLSI_PROXY_ARP_NA_FILTER_ID,                                    /* 0x85 */
 #ifndef CONFIG_SCSC_WLAN_DISABLE_NAT_KA
-       SLSI_NAT_IPSEC_FILTER_ID,                                               /* 0x85 */
+       SLSI_NAT_IPSEC_FILTER_ID,                                               /* 0x86 */
 #endif
 #ifdef CONFIG_SCSC_WLAN_ENHANCED_PKT_FILTER
-       SLSI_OPT_OUT_ALL_FILTER_ID,                                             /* 0x86 */
-       SLSI_OPT_IN_TCP4_FILTER_ID,                                             /* 0x87 */
-       SLSI_OPT_IN_TCP6_FILTER_ID,                                             /* 0x88 */
+       SLSI_OPT_OUT_ALL_FILTER_ID,                                             /* 0x87 */
+       SLSI_OPT_IN_TCP4_FILTER_ID,                                             /* 0x88 */
+       SLSI_OPT_IN_TCP6_FILTER_ID,                                             /* 0x89 */
 #endif
-       SLSI_REGD_MC_FILTER_ID,                                                 /* 0x89 */
+       SLSI_OPT_OUT_ABNORMAL_MULTICAST_ID,                             /* 0x8a */
+       SLSI_REGD_MC_FILTER_ID,                                                 /* 0x8b */
 };
 
 #endif
@@ -1175,6 +1179,9 @@ struct slsi_dev {
 #ifdef CONFIG_SCSC_WLAN_ENHANCED_PKT_FILTER
        bool                       enhanced_pkt_filter_enabled;
 #endif
+#ifdef CONFIG_SCSC_WLAN_ABNORMAL_MULTICAST_PKT_FILTER
+       bool                       abnormal_multicast_pkt_filter_enabled;
+#endif
 };
 
 /* Compact representation of channels a ESS has been seen on
index 3d95f57a3917bebd87817cdf6b61ed49542dea8c..972a2d243ccd58b9c67ccbf3fdf41f22038341ef 100755 (executable)
 #ifdef CONFIG_SCSC_WLAN_ENHANCED_PKT_FILTER
 #define CMD_ENHANCED_PKT_FILTER "ENHANCED_PKT_FILTER"
 #endif
+#ifdef SCSC_WLAN_ABNORMAL_MULTICAST_PKT_FILTER
+#define CMD_ABNORMAL_MULTICAST_PKT_FILTER "ABNORMAL_MULTICAST_PKT_FILTER"
+#endif
 #define CMD_GET_MAX_LINK_SPEED "GET_MAX_LINK_SPEED"
 
 #ifdef CONFIG_SCSC_WLAN_SET_NUM_ANTENNAS
@@ -2747,6 +2750,12 @@ int slsi_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
 
                ret = slsi_set_enhanced_pkt_filter(dev, enable);
 #endif
+#ifdef SCSC_WLAN_ABNORMAL_MULTICAST_PKT_FILTER
+       } else if ((strncasecmp(command, CMD_ABNORMAL_MULTICAST_PKT_FILTER, strlen(CMD_ABNORMAL_MULTICAST_PKT_FILTER)) == 0)) {
+               const u8 enable = *(command + strlen(CMD_ABNORMAL_MULTICAST_PKT_FILTER) + 1) - '0';
+
+               ret = slsi_set_abnormal_multicast_pkt_filter(dev, enable);
+#endif
 #ifdef CONFIG_SCSC_WLAN_SET_NUM_ANTENNAS
        } else if (strncasecmp(command, CMD_SET_NUM_ANTENNAS, strlen(CMD_SET_NUM_ANTENNAS)) == 0) {
                struct netdev_vif *ndev_vif = netdev_priv(dev);
index ec74cac156d63ab9366dc91e43772fd78a770664..fe1de7f1abe9d6bd7a1ebafbefd9e49f68ba235d 100755 (executable)
@@ -3244,7 +3244,7 @@ int  slsi_set_arp_packet_filter(struct slsi_dev *sdev, struct net_device *dev)
        struct slsi_mlme_pattern_desc pattern_desc[SLSI_MAX_PATTERN_DESC];
        int num_pattern_desc = 0;
        u8 pkt_filters_len = 0, num_filters = 0;
-       struct slsi_mlme_pkt_filter_elem pkt_filter_elem[2];
+       struct slsi_mlme_pkt_filter_elem pkt_filter_elem[3];
        int ret;
        struct netdev_vif *ndev_vif = netdev_priv(dev);
        struct slsi_peer *peer = slsi_get_peer_from_qs(sdev, dev, SLSI_STA_PEER_QUEUESET);
@@ -3266,15 +3266,31 @@ int  slsi_set_arp_packet_filter(struct slsi_dev *sdev, struct net_device *dev)
 
        SLSI_NET_DBG2(dev, SLSI_MLME, "Set ARP filter\n");
 
-       /*Opt in the broadcast ARP packets for Local IP address*/
+       /* Opt out all ARP requests*/
        num_pattern_desc = 0;
-       pattern_desc[num_pattern_desc].offset = 0; /*filtering on MAC destination Address*/
-       pattern_desc[num_pattern_desc].mask_length = ETH_ALEN;
-       SLSI_ETHER_COPY(pattern_desc[num_pattern_desc].mask, addr_mask);
-       SLSI_ETHER_COPY(pattern_desc[num_pattern_desc].pattern, addr_mask);
+       SET_ETHERTYPE_PATTERN_DESC(pattern_desc[num_pattern_desc], ETH_P_ARP);
        num_pattern_desc++;
 
-       /*filter on ethertype ARP*/
+       /* ARP - Request */
+       pattern_desc[num_pattern_desc].offset = 0x14; /*sizeof(struct ethhdr) + offsetof(ar_op)*/
+       pattern_desc[num_pattern_desc].mask_length = 2;
+       pattern_desc[num_pattern_desc].mask[0] = 0xff;
+       pattern_desc[num_pattern_desc].mask[1] = 0xff;
+       pattern_desc[num_pattern_desc].pattern[0] = 0x00;
+       pattern_desc[num_pattern_desc].pattern[1] = 0x01;
+       num_pattern_desc++;
+
+       slsi_create_packet_filter_element(SLSI_ALL_ARP_FILTER_ID,
+                                         FAPI_PACKETFILTERMODE_OPT_OUT | FAPI_PACKETFILTERMODE_OPT_OUT_SLEEP,
+                                         num_pattern_desc, pattern_desc, &pkt_filter_elem[num_filters], &pkt_filters_len);
+       num_filters++;
+
+       ret = slsi_mlme_set_packet_filter(sdev, dev, pkt_filters_len, num_filters, pkt_filter_elem);
+       if (ret)
+               return ret;
+
+       /*Opt-in arp pakcet for device IP address*/
+       num_pattern_desc = 0;
        SET_ETHERTYPE_PATTERN_DESC(pattern_desc[num_pattern_desc], ETH_P_ARP);
        num_pattern_desc++;
 
@@ -3284,7 +3300,8 @@ int  slsi_set_arp_packet_filter(struct slsi_dev *sdev, struct net_device *dev)
        memcpy(pattern_desc[num_pattern_desc].pattern, &ndev_vif->ipaddress, pattern_desc[num_pattern_desc].mask_length);
        num_pattern_desc++;
 
-       slsi_create_packet_filter_element(SLSI_LOCAL_ARP_FILTER_ID, FAPI_PACKETFILTERMODE_OPT_IN,
+       slsi_create_packet_filter_element(SLSI_LOCAL_ARP_FILTER_ID,
+                                         FAPI_PACKETFILTERMODE_OPT_IN | FAPI_PACKETFILTERMODE_OPT_IN_SLEEP,
                                          num_pattern_desc, pattern_desc, &pkt_filter_elem[num_filters], &pkt_filters_len);
        num_filters++;
 
@@ -3444,6 +3461,64 @@ static int  slsi_set_opt_in_tcp6_packet_filter(struct slsi_dev *sdev, struct net
 }
 #endif
 
+#ifdef CONFIG_SCSC_WLAN_ABNORMAL_MULTICAST_PKT_FILTER
+int slsi_set_abnormal_multicast_pkt_filter(struct net_device *dev, u8 enabled)
+{
+       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->abnormal_multicast_pkt_filter_enabled = enabled;
+       SLSI_INFO(sdev, "Abnormal multicast packet filter is %s", (enabled ? "enabled" : "disabled"));
+       return ret;
+}
+
+static int slsi_set_opt_out_abnormal_multicast_packet_filter(struct slsi_dev *sdev, struct net_device *dev)
+{
+       struct slsi_mlme_pattern_desc pattern_desc[3];
+       u8 pkt_filters_len = 0;
+       int ret = 0;
+       struct slsi_mlme_pkt_filter_elem pkt_filter_elem;
+
+       /* IPv4 packet */
+       pattern_desc[0].offset = 0; /* destination mac address*/
+       pattern_desc[0].mask_length = ETH_ALEN;
+       memset(pattern_desc[0].mask, 0xff, ETH_ALEN);
+       memcpy(pattern_desc[0].pattern, sdev->hw_addr, ETH_ALEN);
+
+       pattern_desc[1].offset = ETH_ALEN + ETH_ALEN; /* ethhdr->h_proto == IPv4 */
+       pattern_desc[1].mask_length = 2;
+       pattern_desc[1].mask[0] = 0xff; /* Big endian 0xffff */
+       pattern_desc[1].mask[1] = 0xff;
+       pattern_desc[1].pattern[0] = 0x08; /* Big endian 0x0800 */
+       pattern_desc[1].pattern[1] = 0x00;
+
+       pattern_desc[2].offset = sizeof(struct ethhdr) + offsetof(struct iphdr, daddr); /* iphdr->daddr starts with 1110 */
+       pattern_desc[2].mask_length = 1;
+       pattern_desc[2].mask[0] = 0xf0;
+       pattern_desc[2].pattern[0] = 0xe0; /* 224 */
+
+       slsi_create_packet_filter_element(SLSI_OPT_OUT_ABNORMAL_MULTICAST_ID,
+                                         FAPI_PACKETFILTERMODE_OPT_OUT_SLEEP,
+                                         3, pattern_desc,
+                                         &pkt_filter_elem, &pkt_filters_len);
+
+       ret = slsi_mlme_set_packet_filter(sdev, dev, pkt_filters_len, 1, &pkt_filter_elem);
+
+       return ret;
+}
+#endif
+
 static int  slsi_set_multicast_packet_filters(struct slsi_dev *sdev, struct net_device *dev)
 {
        struct slsi_mlme_pattern_desc pattern_desc;
@@ -3520,6 +3595,7 @@ int  slsi_clear_packet_filters(struct slsi_dev *sdev, struct net_device *dev)
        num_filters = ndev_vif->sta.regd_mc_addr_count + SLSI_SCREEN_OFF_FILTERS_COUNT;
        if ((slsi_is_proxy_arp_supported_on_ap(peer->assoc_resp_ie)) == false) {
                num_filters++;
+               num_filters++;
 #ifndef CONFIG_SCSC_WLAN_BLOCK_IPV6
                num_filters++;
 #endif
@@ -3532,7 +3608,10 @@ int  slsi_clear_packet_filters(struct slsi_dev *sdev, struct net_device *dev)
                num_filters++; /*TCP IPv6 OPT IN*/
        }
 #endif
-
+#ifdef CONFIG_SCSC_WLAN_ABNORMAL_MULTICAST_PKT_FILTER
+       if (sdev->abnormal_multicast_pkt_filter_enabled)
+               num_filters++;/* clear abnormal multicast packet */
+#endif
        pkt_filter_elem = kmalloc((num_filters * sizeof(struct slsi_mlme_pkt_filter_elem)), GFP_KERNEL);
        if (!pkt_filter_elem) {
                SLSI_NET_ERR(dev, "ERROR Memory allocation failure");
@@ -3548,6 +3627,8 @@ int  slsi_clear_packet_filters(struct slsi_dev *sdev, struct net_device *dev)
        if ((slsi_is_proxy_arp_supported_on_ap(peer->assoc_resp_ie)) == false) {
                slsi_create_packet_filter_element(SLSI_LOCAL_ARP_FILTER_ID, 0, 0, NULL, &pkt_filter_elem[num_filters], &pkt_filters_len);
                num_filters++;
+               slsi_create_packet_filter_element(SLSI_ALL_ARP_FILTER_ID, 0, 0, NULL, &pkt_filter_elem[num_filters], &pkt_filters_len);
+               num_filters++;
 #ifndef CONFIG_SCSC_WLAN_BLOCK_IPV6
                slsi_create_packet_filter_element(SLSI_LOCAL_NS_FILTER_ID, 0, 0, NULL, &pkt_filter_elem[num_filters], &pkt_filters_len);
                num_filters++;
@@ -3569,6 +3650,13 @@ int  slsi_clear_packet_filters(struct slsi_dev *sdev, struct net_device *dev)
                                                  &pkt_filter_elem[num_filters], &pkt_filters_len);
                num_filters++;
        }
+#endif
+#ifdef CONFIG_SCSC_WLAN_ABNORMAL_MULTICAST_PKT_FILTER
+       if (sdev->abnormal_multicast_pkt_filter_enabled) {
+               slsi_create_packet_filter_element(SLSI_OPT_OUT_ABNORMAL_MULTICAST_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);
@@ -3604,6 +3692,14 @@ int  slsi_update_packet_filters(struct slsi_dev *sdev, struct net_device *dev)
                if (ret)
                        return ret;
        }
+#endif
+       /* install abnormal multicast packet filter */
+#ifdef CONFIG_SCSC_WLAN_ABNORMAL_MULTICAST_PKT_FILTER
+       if (sdev->abnormal_multicast_pkt_filter_enabled) {
+               ret = slsi_set_opt_out_abnormal_multicast_packet_filter(sdev, dev);
+               if (ret)
+                       return ret;
+       }
 #endif
        return slsi_set_common_packet_filters(sdev, dev);
 }
@@ -3664,60 +3760,57 @@ void slsi_set_packet_filters(struct slsi_dev *sdev, struct net_device *dev)
        if (ie) {
                SLSI_NET_DBG1(dev, SLSI_CFG80211, "Connected to HS2 AP ");
 
-               if (slsi_is_proxy_arp_supported_on_ap(peer->assoc_resp_ie)) {
-                       SLSI_NET_DBG1(dev, SLSI_CFG80211, "Proxy ARP service supported on HS2 AP ");
+       if (slsi_is_proxy_arp_supported_on_ap(peer->assoc_resp_ie)) {
+               SLSI_NET_DBG1(dev, SLSI_CFG80211, "Proxy ARP service supported on HS2 AP ");
 
-                       /* Opt out Gratuitous ARP packets (ARP Announcement) in active and suspended mode.
-                        * For suspended mode, gratituous ARP is dropped by "opt out all broadcast" that will be
-                        * set  in slsi_set_common_packet_filters on screen off
-                        */
-                       num_pattern_desc = 0;
-                       pattern_desc[num_pattern_desc].offset = 0; /*filtering on MAC destination Address*/
-                       pattern_desc[num_pattern_desc].mask_length = ETH_ALEN;
-                       SLSI_ETHER_COPY(pattern_desc[num_pattern_desc].mask, addr_mask);
-                       SLSI_ETHER_COPY(pattern_desc[num_pattern_desc].pattern, addr_mask);
-                       num_pattern_desc++;
+               /* Opt out Gratuitous ARP packets (ARP Announcement) in active and suspended mode.
+                * For suspended mode, gratituous ARP is dropped by "opt out all broadcast" that will be
+                * set  in slsi_set_common_packet_filters on screen off
+                */
+               num_pattern_desc = 0;
+               pattern_desc[num_pattern_desc].offset = 0; /*filtering on MAC destination Address*/
+               pattern_desc[num_pattern_desc].mask_length = ETH_ALEN;
+               SLSI_ETHER_COPY(pattern_desc[num_pattern_desc].mask, addr_mask);
+               SLSI_ETHER_COPY(pattern_desc[num_pattern_desc].pattern, addr_mask);
+               num_pattern_desc++;
 
-                       SET_ETHERTYPE_PATTERN_DESC(pattern_desc[num_pattern_desc], ETH_P_ARP);
-                       num_pattern_desc++;
+               SET_ETHERTYPE_PATTERN_DESC(pattern_desc[num_pattern_desc], ETH_P_ARP);
+               num_pattern_desc++;
 
-                       slsi_create_packet_filter_element(SLSI_PROXY_ARP_FILTER_ID, FAPI_PACKETFILTERMODE_OPT_OUT,
-                                                         num_pattern_desc, pattern_desc, &pkt_filter_elem[num_filters],
-                                                         &pkt_filters_len);
-                       num_filters++;
+               slsi_create_packet_filter_element(SLSI_PROXY_ARP_FILTER_ID, FAPI_PACKETFILTERMODE_OPT_OUT,
+                                                 num_pattern_desc, pattern_desc, &pkt_filter_elem[num_filters], &pkt_filters_len);
+               num_filters++;
 
 #ifndef CONFIG_SCSC_WLAN_BLOCK_IPV6
-                       /* Opt out unsolicited Neighbor Advertisement packets .For suspended mode, NA is dropped by
-                        * "opt out all IPv6 multicast" already set in slsi_create_common_packet_filters
-                        */
+               /* Opt out unsolicited Neighbor Advertisement packets .For suspended mode, NA is dropped by
+                * "opt out all IPv6 multicast" already set in slsi_create_common_packet_filters
+                */
+               num_pattern_desc = 0;
+               
+               pattern_desc[num_pattern_desc].offset = 0; /*filtering on MAC destination Address*/
+               pattern_desc[num_pattern_desc].mask_length = ETH_ALEN;
+               SLSI_ETHER_COPY(pattern_desc[num_pattern_desc].mask, addr_mask);
+               SLSI_ETHER_COPY(pattern_desc[num_pattern_desc].pattern, solicited_node_addr_mask);
+               num_pattern_desc++;
+
+               SET_ETHERTYPE_PATTERN_DESC(pattern_desc[num_pattern_desc], 0x86DD);
+               num_pattern_desc++;
+
+               pattern_desc[num_pattern_desc].offset = 0x14; /*filtering on next header*/
+               pattern_desc[num_pattern_desc].mask_length = 1;
+               pattern_desc[num_pattern_desc].mask[0] = 0xff;
+               pattern_desc[num_pattern_desc].pattern[0] = 0x3a;
+               num_pattern_desc++;
+
+               pattern_desc[num_pattern_desc].offset = 0x36; /*filtering on ICMP6 packet type*/
+               pattern_desc[num_pattern_desc].mask_length = 1;
+               pattern_desc[num_pattern_desc].mask[0] = 0xff;
+               pattern_desc[num_pattern_desc].pattern[0] = 0x88; /* Neighbor Advertisement type in ICMPv6 */
+               num_pattern_desc++;
 
-                       num_pattern_desc = 0;
-
-                       pattern_desc[num_pattern_desc].offset = 0; /*filtering on MAC destination Address*/
-                       pattern_desc[num_pattern_desc].mask_length = ETH_ALEN;
-                       SLSI_ETHER_COPY(pattern_desc[num_pattern_desc].mask, addr_mask);
-                       SLSI_ETHER_COPY(pattern_desc[num_pattern_desc].pattern, solicited_node_addr_mask);
-                       num_pattern_desc++;
-
-                       SET_ETHERTYPE_PATTERN_DESC(pattern_desc[num_pattern_desc], 0x86DD);
-                       num_pattern_desc++;
-
-                       pattern_desc[num_pattern_desc].offset = 0x14; /*filtering on next header*/
-                       pattern_desc[num_pattern_desc].mask_length = 1;
-                       pattern_desc[num_pattern_desc].mask[0] = 0xff;
-                       pattern_desc[num_pattern_desc].pattern[0] = 0x3a;
-                       num_pattern_desc++;
-
-                       pattern_desc[num_pattern_desc].offset = 0x36; /*filtering on ICMP6 packet type*/
-                       pattern_desc[num_pattern_desc].mask_length = 1;
-                       pattern_desc[num_pattern_desc].mask[0] = 0xff;
-                       pattern_desc[num_pattern_desc].pattern[0] = 0x88; /* Neighbor Advertisement type in ICMPv6 */
-                       num_pattern_desc++;
-
-                       slsi_create_packet_filter_element(SLSI_PROXY_ARP_NA_FILTER_ID, FAPI_PACKETFILTERMODE_OPT_OUT,
-                                                         num_pattern_desc, pattern_desc, &pkt_filter_elem[num_filters],
-                                                         &pkt_filters_len);
-                       num_filters++;
+               slsi_create_packet_filter_element(SLSI_PROXY_ARP_NA_FILTER_ID, FAPI_PACKETFILTERMODE_OPT_OUT,
+                                                 num_pattern_desc, pattern_desc, &pkt_filter_elem[num_filters], &pkt_filters_len);
+               num_filters++;
 #endif
                }
        }
index adbf146dbbf3d83e9584f512a7d2819245529525..0023c6c8dd2db18790136f95d691a02f87983dfb 100755 (executable)
@@ -486,6 +486,9 @@ int slsi_is_tcp_sync_packet(struct net_device *dev, struct sk_buff *skb);
 #ifdef CONFIG_SCSC_WLAN_ENHANCED_PKT_FILTER
 int slsi_set_enhanced_pkt_filter(struct net_device *dev, u8 pkt_filter_enable);
 #endif
+#ifdef CONFIG_SCSC_WLAN_ABNORMAL_MULTICAST_PKT_FILTER
+int slsi_set_abnormal_multicast_pkt_filter(struct net_device *dev, u8 enabled);
+#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);
index 8b11dd97abaaa7d08de70afab9cf81bde177e5e3..b217dc747f821ad43d50f772232e70e76a655963 100644 (file)
@@ -23,7 +23,7 @@
 #define SCSC_RELEASE_ITERATION 6
 #define SCSC_RELEASE_CANDIDATE 1
 
-#define SCSC_RELEASE_POINT 0
+#define SCSC_RELEASE_POINT 1
 
 #endif