inet: Move VRF table lookup to inlined function
[deliverable/linux.git] / drivers / net / ethernet / mellanox / mlx5 / core / en_rx.c
index 9a9374131f5b45e7c740f80e2ef8b0e9ba175fa9..caea0621ab730b0b4e3f9b21754efe098b7c6594 100644 (file)
@@ -111,10 +111,12 @@ static void mlx5e_lro_update_hdr(struct sk_buff *skb, struct mlx5_cqe64 *cqe)
                tcp = (struct tcphdr *)(skb->data + ETH_HLEN +
                                        sizeof(struct iphdr));
                ipv6 = NULL;
+               skb_shinfo(skb)->gso_type = SKB_GSO_TCPV4;
        } else {
                tcp = (struct tcphdr *)(skb->data + ETH_HLEN +
                                        sizeof(struct ipv6hdr));
                ipv4 = NULL;
+               skb_shinfo(skb)->gso_type = SKB_GSO_TCPV6;
        }
 
        if (get_cqe_lro_tcppsh(cqe))
@@ -149,6 +151,38 @@ static inline void mlx5e_skb_set_hash(struct mlx5_cqe64 *cqe,
        skb_set_hash(skb, be32_to_cpu(cqe->rss_hash_result), ht);
 }
 
+static inline bool is_first_ethertype_ip(struct sk_buff *skb)
+{
+       __be16 ethertype = ((struct ethhdr *)skb->data)->h_proto;
+
+       return (ethertype == htons(ETH_P_IP) || ethertype == htons(ETH_P_IPV6));
+}
+
+static inline void mlx5e_handle_csum(struct net_device *netdev,
+                                    struct mlx5_cqe64 *cqe,
+                                    struct mlx5e_rq *rq,
+                                    struct sk_buff *skb)
+{
+       if (unlikely(!(netdev->features & NETIF_F_RXCSUM)))
+               goto csum_none;
+
+       if (likely(cqe->hds_ip_ext & CQE_L4_OK)) {
+               skb->ip_summed = CHECKSUM_UNNECESSARY;
+       } else if (is_first_ethertype_ip(skb)) {
+               skb->ip_summed = CHECKSUM_COMPLETE;
+               skb->csum = csum_unfold(cqe->check_sum);
+               rq->stats.csum_sw++;
+       } else {
+               goto csum_none;
+       }
+
+       return;
+
+csum_none:
+       skb->ip_summed = CHECKSUM_NONE;
+       rq->stats.csum_none++;
+}
+
 static inline void mlx5e_build_rx_skb(struct mlx5_cqe64 *cqe,
                                      struct mlx5e_rq *rq,
                                      struct sk_buff *skb)
@@ -162,20 +196,12 @@ static inline void mlx5e_build_rx_skb(struct mlx5_cqe64 *cqe,
        lro_num_seg = be32_to_cpu(cqe->srqn) >> 24;
        if (lro_num_seg > 1) {
                mlx5e_lro_update_hdr(skb, cqe);
-               skb_shinfo(skb)->gso_size = MLX5E_PARAMS_DEFAULT_LRO_WQE_SZ;
+               skb_shinfo(skb)->gso_size = DIV_ROUND_UP(cqe_bcnt, lro_num_seg);
                rq->stats.lro_packets++;
                rq->stats.lro_bytes += cqe_bcnt;
        }
 
-       if (likely(netdev->features & NETIF_F_RXCSUM) &&
-           (cqe->hds_ip_ext & CQE_L2_OK) &&
-           (cqe->hds_ip_ext & CQE_L3_OK) &&
-           (cqe->hds_ip_ext & CQE_L4_OK)) {
-               skb->ip_summed = CHECKSUM_UNNECESSARY;
-       } else {
-               skb->ip_summed = CHECKSUM_NONE;
-               rq->stats.csum_none++;
-       }
+       mlx5e_handle_csum(netdev, cqe, rq, skb);
 
        skb->protocol = eth_type_trans(skb, netdev);
 
This page took 0.04086 seconds and 5 git commands to generate.