From: Debabrata Purohit Date: Mon, 29 Apr 2019 18:15:57 +0000 (+0100) Subject: [NEUS7920-218] [9610] wlbt: prioritise important frames X-Git-Url: https://git.stricted.de/?a=commitdiff_plain;h=df74a143de6d029d679b6ca890284ab671b359a5;p=GitHub%2FLineageOS%2Fandroid_kernel_motorola_exynos9610.git [NEUS7920-218] [9610] wlbt: prioritise important frames To work around "Internet NOT connected" issue, prioritise frames such as DNS, TCP SYN and Multicast DNS (MDNS) packets and send them over Voice access category so that they are sent ahead of other queued packets. Change-Id: I5983819827cb95391a1fa765a0b8e094da61b6f7 SCSC-Bug-Id: SSB-52164 Signed-off-by: Debabrata Purohit --- diff --git a/drivers/net/wireless/scsc/Kconfig b/drivers/net/wireless/scsc/Kconfig index f76ddc647ff3..64357e5bf902 100755 --- a/drivers/net/wireless/scsc/Kconfig +++ b/drivers/net/wireless/scsc/Kconfig @@ -209,6 +209,14 @@ config SCSC_ENHANCED_PACKET_STATS ---help--- This option tells whether enhanced packet stats collection is enabled or not. + +config SCSC_WLAN_PRIORITISE_IMP_FRAMES + bool "Change priority of important frames such as DNS, MDNS, TCP SYN" + default y + ---help--- + The option enables the driver to prioritise important frames + (such as DNS, MDNS, TCP SYN) so that they are sent ahead of others. + config SCSC_WIFI_NAN_ENABLE bool "Enable WiFi NAN" default n diff --git a/drivers/net/wireless/scsc/mgt.c b/drivers/net/wireless/scsc/mgt.c index 4540ca997c3e..cd361aa7127c 100755 --- a/drivers/net/wireless/scsc/mgt.c +++ b/drivers/net/wireless/scsc/mgt.c @@ -4199,6 +4199,28 @@ int slsi_is_dhcp_packet(u8 *data) return ret; } +#ifdef CONFIG_SCSC_WLAN_PRIORITISE_IMP_FRAMES +int slsi_is_tcp_sync_packet(struct net_device *dev, struct sk_buff *skb) +{ + struct netdev_vif *ndev_vif = netdev_priv(dev); + + /* for AP type (AP or P2P Go) check if the packet is local or intra BSS. If intra BSS then + * the IP header and TCP header are not set; so return 0 + */ + if ((ndev_vif->vif_type == FAPI_VIFTYPE_AP) && (compare_ether_addr(eth_hdr(skb)->h_source, dev->dev_addr) != 0)) + return 0; + if (be16_to_cpu(eth_hdr(skb)->h_proto) != ETH_P_IP) + return 0; + if (ip_hdr(skb)->protocol != IPPROTO_TCP) + return 0; + if (!skb_transport_header_was_set(skb)) + return 0; + if (tcp_hdr(skb)->syn) + return 1; + + return 0; +} + int slsi_is_dns_packet(u8 *data) { u8 *p; @@ -4217,6 +4239,24 @@ int slsi_is_dns_packet(u8 *data) return 0; } +int slsi_is_mdns_packet(u8 *data) +{ + u8 *p; + + p = data + SLSI_IP_TYPE_OFFSET; + + if (*p == SLSI_IP_TYPE_UDP) { + u16 dest_port; + + p = data + SLSI_IP_DEST_PORT_OFFSET; + dest_port = p[0] << 8 | p[1]; + if (dest_port == SLSI_MDNS_DEST_PORT) + return 1; + } + return 0; +} +#endif + int slsi_ap_prepare_add_info_ies(struct netdev_vif *ndev_vif, const u8 *ies, size_t ies_len) { const u8 *wps_p2p_ies = NULL; diff --git a/drivers/net/wireless/scsc/mgt.h b/drivers/net/wireless/scsc/mgt.h index 3a9ac0e92c9e..d1d2257ae855 100755 --- a/drivers/net/wireless/scsc/mgt.h +++ b/drivers/net/wireless/scsc/mgt.h @@ -174,6 +174,7 @@ #define SLSI_DHCP_SERVER_PORT 67 #define SLSI_DHCP_CLIENT_PORT 68 #define SLSI_DNS_DEST_PORT 53 +#define SLSI_MDNS_DEST_PORT 5353 #define SLSI_DHCP_MSG_MAGIC_OFFSET 278 #define SLSI_DHCP_OPTION 53 @@ -461,7 +462,13 @@ u8 slsi_p2p_get_exp_peer_frame_subtype(u8 subtype); int slsi_send_txq_params(struct slsi_dev *sdev, struct net_device *ndev); void slsi_abort_sta_scan(struct slsi_dev *sdev); int slsi_is_dhcp_packet(u8 *data); + +#ifdef CONFIG_SCSC_WLAN_PRIORITISE_IMP_FRAMES int slsi_is_dns_packet(u8 *data); +int slsi_is_mdns_packet(u8 *data); +int slsi_is_tcp_sync_packet(struct net_device *dev, struct sk_buff *skb); +#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/drivers/net/wireless/scsc/netif.c b/drivers/net/wireless/scsc/netif.c index 3c833eb23466..608719f4b4df 100755 --- a/drivers/net/wireless/scsc/netif.c +++ b/drivers/net/wireless/scsc/netif.c @@ -549,9 +549,14 @@ static u16 slsi_net_select_queue(struct net_device *dev, struct sk_buff *skb) } else #endif { - if (proto == ETH_P_IP && slsi_is_dns_packet(skb->data)) { +#ifdef CONFIG_SCSC_WLAN_PRIORITISE_IMP_FRAMES + if ((proto == ETH_P_IP && slsi_is_dns_packet(skb->data)) || + (proto == ETH_P_IP && slsi_is_mdns_packet(skb->data)) || + (proto == ETH_P_IP && slsi_is_tcp_sync_packet(dev, skb))) { skb->priority = FAPI_PRIORITY_QOS_UP7; - } else { + } else +#endif + { #ifdef CONFIG_SCSC_USE_WMM_TOS skb->priority = slsi_get_priority_from_tos(skb->data + ETH_HLEN, proto); #else diff --git a/drivers/net/wireless/scsc/procfs.c b/drivers/net/wireless/scsc/procfs.c index 3e29ac500f2e..20e5db53b0ac 100755 --- a/drivers/net/wireless/scsc/procfs.c +++ b/drivers/net/wireless/scsc/procfs.c @@ -374,7 +374,11 @@ static int slsi_procfs_build_show(struct seq_file *m, void *v) #else seq_puts(m, "CONFIG_SCSC_WLAN_KEY_MGMT_OFFLOAD : n\n"); #endif - +#ifdef CONFIG_SCSC_WLAN_PRIORITISE_IMP_FRAMES + seq_puts(m, "CONFIG_SCSC_WLAN_PRIORITISE_IMP_FRAMES : y\n"); +#else + seq_puts(m, "CONFIG_SCSC_WLAN_PRIORITISE_IMP_FRAMES : n\n"); +#endif seq_puts(m, "-------------------------------------------------\n"); #ifdef CONFIG_SCSC_WLAN_DEBUG seq_puts(m, "CONFIG_SCSC_WLAN_DEBUG : y\n");