From 8e779f618bc3b80e917e6214ed477f1de30fee9a Mon Sep 17 00:00:00 2001 From: Youngsoo Date: Thu, 26 Sep 2019 15:30:45 +0900 Subject: [PATCH] [RAMEN9610-20413][lv] host update 10.6.1.1 for lenovo only add ipv4 multicast packet filter again. add prevent issue fix : 310263 Change-Id: I3895000b184dd6c8731b7ead4343056deb9d80cc Signed-off-by: Youngsoo --- drivers/misc/samsung/scsc/mxman.c | 2 +- drivers/net/wireless/scsc/Kconfig | 6 + drivers/net/wireless/scsc/dev.c | 3 + drivers/net/wireless/scsc/dev.h | 45 ++++--- drivers/net/wireless/scsc/ioctl.c | 9 ++ drivers/net/wireless/scsc/mgt.c | 207 ++++++++++++++++++++++-------- drivers/net/wireless/scsc/mgt.h | 3 + include/scsc/scsc_release.h | 2 +- 8 files changed, 199 insertions(+), 78 deletions(-) diff --git a/drivers/misc/samsung/scsc/mxman.c b/drivers/misc/samsung/scsc/mxman.c index f95ee139eff6..dcd3567e8f19 100755 --- a/drivers/misc/samsung/scsc/mxman.c +++ b/drivers/misc/samsung/scsc/mxman.c @@ -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"); diff --git a/drivers/net/wireless/scsc/Kconfig b/drivers/net/wireless/scsc/Kconfig index b0cdcf0f4efb..5d480b1484ce 100755 --- a/drivers/net/wireless/scsc/Kconfig +++ b/drivers/net/wireless/scsc/Kconfig @@ -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. diff --git a/drivers/net/wireless/scsc/dev.c b/drivers/net/wireless/scsc/dev.c index caf3d7b3b888..e2d27cc77947 100755 --- a/drivers/net/wireless/scsc/dev.c +++ b/drivers/net/wireless/scsc/dev.c @@ -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; diff --git a/drivers/net/wireless/scsc/dev.h b/drivers/net/wireless/scsc/dev.h index ad787a5b2e9c..25c391149c82 100755 --- a/drivers/net/wireless/scsc/dev.h +++ b/drivers/net/wireless/scsc/dev.h @@ -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 diff --git a/drivers/net/wireless/scsc/ioctl.c b/drivers/net/wireless/scsc/ioctl.c index 3d95f57a3917..972a2d243ccd 100755 --- a/drivers/net/wireless/scsc/ioctl.c +++ b/drivers/net/wireless/scsc/ioctl.c @@ -130,6 +130,9 @@ #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); diff --git a/drivers/net/wireless/scsc/mgt.c b/drivers/net/wireless/scsc/mgt.c index ec74cac156d6..fe1de7f1abe9 100755 --- a/drivers/net/wireless/scsc/mgt.c +++ b/drivers/net/wireless/scsc/mgt.c @@ -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 } } diff --git a/drivers/net/wireless/scsc/mgt.h b/drivers/net/wireless/scsc/mgt.h index adbf146dbbf3..0023c6c8dd2d 100755 --- a/drivers/net/wireless/scsc/mgt.h +++ b/drivers/net/wireless/scsc/mgt.h @@ -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); diff --git a/include/scsc/scsc_release.h b/include/scsc/scsc_release.h index 8b11dd97abaa..b217dc747f82 100644 --- a/include/scsc/scsc_release.h +++ b/include/scsc/scsc_release.h @@ -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 -- 2.20.1