net/mlx4_en: Fix wrong csum complete report when rxvlan offload is disabled
The check_csum() function relied on hwtstamp_rx_filter to know if rxvlan
offload is disabled. This is wrong since rxvlan offload can be switched
on/off regardless of hwtstamp_rx_filter.
Also moved check_csum to query CQE information to identify VLAN packets
and removed the check of IP packets, since it has been validated before.
Fixes: f8c6455bb0
('net/mlx4_en: Extend checksum offloading by CHECKSUM COMPLETE')
Signed-off-by: Ido Shamay <idos@mellanox.com>
Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
488a9b48e3
commit
79a258526c
|
@ -718,7 +718,7 @@ static int get_fixed_ipv6_csum(__wsum hw_checksum, struct sk_buff *skb,
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
static int check_csum(struct mlx4_cqe *cqe, struct sk_buff *skb, void *va,
|
static int check_csum(struct mlx4_cqe *cqe, struct sk_buff *skb, void *va,
|
||||||
int hwtstamp_rx_filter)
|
netdev_features_t dev_features)
|
||||||
{
|
{
|
||||||
__wsum hw_checksum = 0;
|
__wsum hw_checksum = 0;
|
||||||
|
|
||||||
|
@ -726,14 +726,8 @@ static int check_csum(struct mlx4_cqe *cqe, struct sk_buff *skb, void *va,
|
||||||
|
|
||||||
hw_checksum = csum_unfold((__force __sum16)cqe->checksum);
|
hw_checksum = csum_unfold((__force __sum16)cqe->checksum);
|
||||||
|
|
||||||
if (((struct ethhdr *)va)->h_proto == htons(ETH_P_8021Q) &&
|
if (cqe->vlan_my_qpn & cpu_to_be32(MLX4_CQE_VLAN_PRESENT_MASK) &&
|
||||||
hwtstamp_rx_filter != HWTSTAMP_FILTER_NONE) {
|
!(dev_features & NETIF_F_HW_VLAN_CTAG_RX)) {
|
||||||
/* next protocol non IPv4 or IPv6 */
|
|
||||||
if (((struct vlan_hdr *)hdr)->h_vlan_encapsulated_proto
|
|
||||||
!= htons(ETH_P_IP) &&
|
|
||||||
((struct vlan_hdr *)hdr)->h_vlan_encapsulated_proto
|
|
||||||
!= htons(ETH_P_IPV6))
|
|
||||||
return -1;
|
|
||||||
hw_checksum = get_fixed_vlan_csum(hw_checksum, hdr);
|
hw_checksum = get_fixed_vlan_csum(hw_checksum, hdr);
|
||||||
hdr += sizeof(struct vlan_hdr);
|
hdr += sizeof(struct vlan_hdr);
|
||||||
}
|
}
|
||||||
|
@ -896,7 +890,8 @@ int mlx4_en_process_rx_cq(struct net_device *dev, struct mlx4_en_cq *cq, int bud
|
||||||
|
|
||||||
if (ip_summed == CHECKSUM_COMPLETE) {
|
if (ip_summed == CHECKSUM_COMPLETE) {
|
||||||
void *va = skb_frag_address(skb_shinfo(gro_skb)->frags);
|
void *va = skb_frag_address(skb_shinfo(gro_skb)->frags);
|
||||||
if (check_csum(cqe, gro_skb, va, ring->hwtstamp_rx_filter)) {
|
if (check_csum(cqe, gro_skb, va,
|
||||||
|
dev->features)) {
|
||||||
ip_summed = CHECKSUM_NONE;
|
ip_summed = CHECKSUM_NONE;
|
||||||
ring->csum_none++;
|
ring->csum_none++;
|
||||||
ring->csum_complete--;
|
ring->csum_complete--;
|
||||||
|
@ -951,7 +946,7 @@ int mlx4_en_process_rx_cq(struct net_device *dev, struct mlx4_en_cq *cq, int bud
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ip_summed == CHECKSUM_COMPLETE) {
|
if (ip_summed == CHECKSUM_COMPLETE) {
|
||||||
if (check_csum(cqe, skb, skb->data, ring->hwtstamp_rx_filter)) {
|
if (check_csum(cqe, skb, skb->data, dev->features)) {
|
||||||
ip_summed = CHECKSUM_NONE;
|
ip_summed = CHECKSUM_NONE;
|
||||||
ring->csum_complete--;
|
ring->csum_complete--;
|
||||||
ring->csum_none++;
|
ring->csum_none++;
|
||||||
|
|
Loading…
Reference in New Issue