[NEUS7920-218] [9610] wlbt: prioritise important frames
authorDebabrata Purohit <d.purohit@samsung.com>
Mon, 29 Apr 2019 18:15:57 +0000 (19:15 +0100)
committerKim Gunho <gunho.kim@samsung.com>
Fri, 28 Jun 2019 14:45:14 +0000 (23:45 +0900)
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 <d.purohit@samsung.com>
drivers/net/wireless/scsc/Kconfig
drivers/net/wireless/scsc/mgt.c
drivers/net/wireless/scsc/mgt.h
drivers/net/wireless/scsc/netif.c
drivers/net/wireless/scsc/procfs.c

index f76ddc647ff3b38a3d6ba90424baf233069cd07f..64357e5bf90279213a926ee1c3dd1f21d29decb7 100755 (executable)
@@ -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
index 4540ca997c3e85e00ebb2d88638af1ece3b7529e..cd361aa7127c678e09077010c8af84a5e2ebed9d 100755 (executable)
@@ -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;
index 3a9ac0e92c9e6a4a993dc4425b5848e5804e343b..d1d2257ae855e502f4eb3c33eda0ae20d84693a2 100755 (executable)
 #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);
index 3c833eb234660b3f16f59e976f77d4a294a31411..608719f4b4dfdb15e16c4329432216347c9a1d64 100755 (executable)
@@ -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
index 3e29ac500f2e8876bc2a5db33e966b329c59c424..20e5db53b0ac22295d6ea5ede8ce7d47aea404da 100755 (executable)
@@ -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");