Commit 4963d234 authored by Guillaume Nault's avatar Guillaume Nault Committed by Jakub Kicinski
Browse files

bareudp: Fix device stats updates.



Bareudp devices update their stats concurrently.
Therefore they need proper atomic increments.

Fixes: 571912c6 ("net: UDP tunnel encapsulation module for tunnelling different protocols like MPLS, IP, NSH etc.")
Signed-off-by: default avatarGuillaume Nault <gnault@redhat.com>
Reviewed-by: default avatarWillem de Bruijn <willemb@google.com>
Link: https://patch.msgid.link/04b7b9d0b480158eb3ab4366ec80aa2ab7e41fcb.1725031794.git.gnault@redhat.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent b6ecc662
Loading
Loading
Loading
Loading
+11 −11
Original line number Diff line number Diff line
@@ -83,7 +83,7 @@ static int bareudp_udp_encap_recv(struct sock *sk, struct sk_buff *skb)

		if (skb_copy_bits(skb, BAREUDP_BASE_HLEN, &ipversion,
				  sizeof(ipversion))) {
			bareudp->dev->stats.rx_dropped++;
			DEV_STATS_INC(bareudp->dev, rx_dropped);
			goto drop;
		}
		ipversion >>= 4;
@@ -93,7 +93,7 @@ static int bareudp_udp_encap_recv(struct sock *sk, struct sk_buff *skb)
		} else if (ipversion == 6 && bareudp->multi_proto_mode) {
			proto = htons(ETH_P_IPV6);
		} else {
			bareudp->dev->stats.rx_dropped++;
			DEV_STATS_INC(bareudp->dev, rx_dropped);
			goto drop;
		}
	} else if (bareudp->ethertype == htons(ETH_P_MPLS_UC)) {
@@ -107,7 +107,7 @@ static int bareudp_udp_encap_recv(struct sock *sk, struct sk_buff *skb)
				   ipv4_is_multicast(tunnel_hdr->daddr)) {
				proto = htons(ETH_P_MPLS_MC);
			} else {
				bareudp->dev->stats.rx_dropped++;
				DEV_STATS_INC(bareudp->dev, rx_dropped);
				goto drop;
			}
		} else {
@@ -123,7 +123,7 @@ static int bareudp_udp_encap_recv(struct sock *sk, struct sk_buff *skb)
				   (addr_type & IPV6_ADDR_MULTICAST)) {
				proto = htons(ETH_P_MPLS_MC);
			} else {
				bareudp->dev->stats.rx_dropped++;
				DEV_STATS_INC(bareudp->dev, rx_dropped);
				goto drop;
			}
		}
@@ -135,7 +135,7 @@ static int bareudp_udp_encap_recv(struct sock *sk, struct sk_buff *skb)
				 proto,
				 !net_eq(bareudp->net,
				 dev_net(bareudp->dev)))) {
		bareudp->dev->stats.rx_dropped++;
		DEV_STATS_INC(bareudp->dev, rx_dropped);
		goto drop;
	}

@@ -143,7 +143,7 @@ static int bareudp_udp_encap_recv(struct sock *sk, struct sk_buff *skb)

	tun_dst = udp_tun_rx_dst(skb, family, key, 0, 0);
	if (!tun_dst) {
		bareudp->dev->stats.rx_dropped++;
		DEV_STATS_INC(bareudp->dev, rx_dropped);
		goto drop;
	}
	skb_dst_set(skb, &tun_dst->dst);
@@ -169,8 +169,8 @@ static int bareudp_udp_encap_recv(struct sock *sk, struct sk_buff *skb)
						     &((struct ipv6hdr *)oiph)->saddr);
		}
		if (err > 1) {
			++bareudp->dev->stats.rx_frame_errors;
			++bareudp->dev->stats.rx_errors;
			DEV_STATS_INC(bareudp->dev, rx_frame_errors);
			DEV_STATS_INC(bareudp->dev, rx_errors);
			goto drop;
		}
	}
@@ -467,11 +467,11 @@ static netdev_tx_t bareudp_xmit(struct sk_buff *skb, struct net_device *dev)
	dev_kfree_skb(skb);

	if (err == -ELOOP)
		dev->stats.collisions++;
		DEV_STATS_INC(dev, collisions);
	else if (err == -ENETUNREACH)
		dev->stats.tx_carrier_errors++;
		DEV_STATS_INC(dev, tx_carrier_errors);

	dev->stats.tx_errors++;
	DEV_STATS_INC(dev, tx_errors);
	return NETDEV_TX_OK;
}