[RAMEN9610-20095][lv] host update 10.5.1.1 for lenovo only
authorYoungsoo <youngss.kim@samsung.com>
Mon, 16 Sep 2019 05:16:39 +0000 (14:16 +0900)
committerKim Gunho <gunho.kim@samsung.com>
Wed, 25 Sep 2019 06:36:09 +0000 (15:36 +0900)
add ipv4 multicast packet filter again.

Change-Id: I6c801c86787e257cd3f04e898e2da269aca0289d
Signed-off-by: Youngsoo <youngss.kim@samsung.com>
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 05e3b2099d3f7342e149d9f7d669f3a7127e3304..bccc2711fbef55e8dbfe27bcd05be48f9abadb31 100755 (executable)
@@ -262,3 +262,9 @@ config SCSC_WLAN_STA_ENHANCED_ARP_DETECT
         ---help---
           This option tells whether enhanced arp detection
           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 72591471d5b754521d6c57aef6ec497dde930cbd..a4b5d04ef942295c618ecb5d335287359366f51e 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 5e02635dfde22e7bcda80b969d65bb11b4d75bde..e27645eb0f552e9917e8d9bc1139a6547b6bc372 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
@@ -1172,6 +1176,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 96184523b084e32b1aafcc69a7913cdba42fcf6b..ff67a866a4cf2d0f3a24a3faa186669c2cc9edcd 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
@@ -2743,6 +2746,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 c5c88152d1bbeaea519d4907c8c603bbb8bcb5e3..2b8d4f941a9635f2b364f1bd93a1237243da78c9 100755 (executable)
@@ -3241,7 +3241,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);
@@ -3263,15 +3263,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++;
 
@@ -3281,7 +3297,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++;
 
@@ -3441,6 +3458,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;
@@ -3517,6 +3592,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
@@ -3529,7 +3605,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");
@@ -3545,6 +3624,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++;
@@ -3566,6 +3647,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);
@@ -3601,6 +3689,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);
 }
@@ -3661,60 +3757,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 67069ec48212366998cc6255edcdb6997dff852e..b61a5c620896a67d61942e2d49ccc3caa1d7346a 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 6459d2fc574602d4e42c39e5a06c698772559c2a..bf200ef17a3e43d9bc8059bda846306a6e6e2e06 100644 (file)
@@ -23,7 +23,7 @@
 #define SCSC_RELEASE_ITERATION 5
 #define SCSC_RELEASE_CANDIDATE 1
 
-#define SCSC_RELEASE_POINT 0
+#define SCSC_RELEASE_POINT 1
 
 #endif