struct iphdr *iphdr;
        struct ipv6hdr *ipv6hdr;
        struct sk_buff *skb;
-       int skb_tmp_len;
        __be16 protocol;
        u8 bn_pid = 0;
        u8 rrcfv = 0;
                                hnae_set_bit(rrcfv, HNSV2_TXD_L4CS_B, 1);
 
                                /* check for tcp/udp header */
-                               if (iphdr->protocol == IPPROTO_TCP) {
+                               if (iphdr->protocol == IPPROTO_TCP &&
+                                   skb_is_gso(skb)) {
                                        hnae_set_bit(tvsvsn,
                                                     HNSV2_TXD_TSE_B, 1);
-                                       skb_tmp_len = SKB_TMP_LEN(skb);
                                        l4_len = tcp_hdrlen(skb);
-                                       mss = mtu - skb_tmp_len - ETH_FCS_LEN;
-                                       paylen = skb->len - skb_tmp_len;
+                                       mss = skb_shinfo(skb)->gso_size;
+                                       paylen = skb->len - SKB_TMP_LEN(skb);
                                }
                        } else if (skb->protocol == htons(ETH_P_IPV6)) {
                                hnae_set_bit(tvsvsn, HNSV2_TXD_IPV6_B, 1);
                                hnae_set_bit(rrcfv, HNSV2_TXD_L4CS_B, 1);
 
                                /* check for tcp/udp header */
-                               if (ipv6hdr->nexthdr == IPPROTO_TCP) {
+                               if (ipv6hdr->nexthdr == IPPROTO_TCP &&
+                                   skb_is_gso(skb) && skb_is_gso_v6(skb)) {
                                        hnae_set_bit(tvsvsn,
                                                     HNSV2_TXD_TSE_B, 1);
-                                       skb_tmp_len = SKB_TMP_LEN(skb);
                                        l4_len = tcp_hdrlen(skb);
-                                       mss = mtu - skb_tmp_len - ETH_FCS_LEN;
-                                       paylen = skb->len - skb_tmp_len;
+                                       mss = skb_shinfo(skb)->gso_size;
+                                       paylen = skb->len - SKB_TMP_LEN(skb);
                                }
                        }
                        desc->tx.ip_offset = ip_offset;