mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-09 14:43:16 +00:00
netkit: Add tstats per-CPU traffic counters
Add dev->tstats traffic accounting to netkit. The latter contains per-CPU RX and TX counters. The dev's TX counters are bumped upon pass/unspec as well as redirect verdicts, in other words, on everything except for drops. The dev's RX counters are bumped upon successful __netif_rx(), as well as from skb_do_redirect() (not part of this commit here). Using dev->lstats with having just a single packets/bytes counter and inferring one another's RX counters from the peer dev's lstats is not possible given skb_do_redirect() can also bump the device's stats. Signed-off-by: Daniel Borkmann <daniel@iogearbox.net> Acked-by: Nikolay Aleksandrov <razor@blackwall.org> Link: https://lore.kernel.org/r/20231114004220.6495-4-daniel@iogearbox.net Signed-off-by: Martin KaFai Lau <martin.lau@kernel.org>
This commit is contained in:
parent
34d21de99c
commit
ae1658272c
@ -68,6 +68,7 @@ static netdev_tx_t netkit_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
netdev_tx_t ret_dev = NET_XMIT_SUCCESS;
|
||||
const struct bpf_mprog_entry *entry;
|
||||
struct net_device *peer;
|
||||
int len = skb->len;
|
||||
|
||||
rcu_read_lock();
|
||||
peer = rcu_dereference(nk->peer);
|
||||
@ -85,15 +86,22 @@ static netdev_tx_t netkit_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
case NETKIT_PASS:
|
||||
skb->protocol = eth_type_trans(skb, skb->dev);
|
||||
skb_postpull_rcsum(skb, eth_hdr(skb), ETH_HLEN);
|
||||
__netif_rx(skb);
|
||||
if (likely(__netif_rx(skb) == NET_RX_SUCCESS)) {
|
||||
dev_sw_netstats_tx_add(dev, 1, len);
|
||||
dev_sw_netstats_rx_add(peer, len);
|
||||
} else {
|
||||
goto drop_stats;
|
||||
}
|
||||
break;
|
||||
case NETKIT_REDIRECT:
|
||||
dev_sw_netstats_tx_add(dev, 1, len);
|
||||
skb_do_redirect(skb);
|
||||
break;
|
||||
case NETKIT_DROP:
|
||||
default:
|
||||
drop:
|
||||
kfree_skb(skb);
|
||||
drop_stats:
|
||||
dev_core_stats_tx_dropped_inc(dev);
|
||||
ret_dev = NET_XMIT_DROP;
|
||||
break;
|
||||
@ -174,6 +182,13 @@ static struct net_device *netkit_peer_dev(struct net_device *dev)
|
||||
return rcu_dereference(netkit_priv(dev)->peer);
|
||||
}
|
||||
|
||||
static void netkit_get_stats(struct net_device *dev,
|
||||
struct rtnl_link_stats64 *stats)
|
||||
{
|
||||
dev_fetch_sw_netstats(stats, dev->tstats);
|
||||
stats->tx_dropped = DEV_STATS_READ(dev, tx_dropped);
|
||||
}
|
||||
|
||||
static void netkit_uninit(struct net_device *dev);
|
||||
|
||||
static const struct net_device_ops netkit_netdev_ops = {
|
||||
@ -184,6 +199,7 @@ static const struct net_device_ops netkit_netdev_ops = {
|
||||
.ndo_set_rx_headroom = netkit_set_headroom,
|
||||
.ndo_get_iflink = netkit_get_iflink,
|
||||
.ndo_get_peer_dev = netkit_peer_dev,
|
||||
.ndo_get_stats64 = netkit_get_stats,
|
||||
.ndo_uninit = netkit_uninit,
|
||||
.ndo_features_check = passthru_features_check,
|
||||
};
|
||||
@ -218,6 +234,7 @@ static void netkit_setup(struct net_device *dev)
|
||||
|
||||
ether_setup(dev);
|
||||
dev->max_mtu = ETH_MAX_MTU;
|
||||
dev->pcpu_stat_type = NETDEV_PCPU_STAT_TSTATS;
|
||||
|
||||
dev->flags |= IFF_NOARP;
|
||||
dev->priv_flags &= ~IFF_TX_SKB_SHARING;
|
||||
|
Loading…
x
Reference in New Issue
Block a user