Re: [PATCH net-next] net: procfs: add seq_puts() statement for dev_mcast

From: Vladimir Oltean
Date: Sat Oct 09 2021 - 12:35:18 EST


On Mon, Aug 16, 2021 at 04:57:57PM +0800, Yajun Deng wrote:
> Add seq_puts() statement for dev_mcast, make it more readable.
> As also, keep vertical alignment for {dev, ptype, dev_mcast} that
> under /proc/net.
>
> Signed-off-by: Yajun Deng <yajun.deng@xxxxxxxxx>
> ---

FYI, this program got broken by this commit (reverting it restores
functionality):

root@debian:~# ifstat
ifstat: /proc/net/dev: unsupported format.

Confusingly enough, the "ifstat" provided by Debian is not from iproute2:
https://git.kernel.org/pub/scm/network/iproute2/iproute2.git/tree/misc/ifstat.c
but rather a similarly named program:
https://packages.debian.org/source/bullseye/ifstat
https://github.com/matttbe/ifstat

I haven't studied how this program parses /proc/net/dev, but here's how
the kernel's output changed:

Doesn't work:

root@debian:~# cat /proc/net/dev
Interface| Receive | Transmit
| bytes packets errs drop fifo frame compressed multicast| bytes packets errs drop fifo colls carrier compressed
lo: 97400 1204 0 0 0 0 0 0 97400 1204 0 0 0 0 0 0
bond0: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
sit0: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
eno2: 5002206 6651 0 0 0 0 0 0 105518642 1465023 0 0 0 0 0 0
swp0: 134531 2448 0 0 0 0 0 0 99599598 1464381 0 0 0 0 0 0
swp1: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
swp2: 4867675 4203 0 0 0 0 0 0 58134 631 0 0 0 0 0 0
sw0p0: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
sw0p1: 124739 2448 0 1422 0 0 0 0 93741184 1464369 0 0 0 0 0 0
sw0p2: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
sw2p0: 4850863 4203 0 0 0 0 0 0 54722 619 0 0 0 0 0 0
sw2p1: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
sw2p2: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
sw2p3: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
br0: 10508 212 0 212 0 0 0 212 61369558 958857 0 0 0 0 0 0

Works:

root@debian:~# cat /proc/net/dev
Inter-| Receive | Transmit
face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed
lo: 13160 164 0 0 0 0 0 0 13160 164 0 0 0 0 0 0
bond0: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
sit0: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
eno2: 30824 268 0 0 0 0 0 0 3332 37 0 0 0 0 0 0
swp0: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
swp1: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
swp2: 30824 268 0 0 0 0 0 0 2428 27 0 0 0 0 0 0
sw0p0: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
sw0p1: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
sw0p2: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
sw2p0: 29752 268 0 0 0 0 0 0 1564 17 0 0 0 0 0 0
sw2p1: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
sw2p2: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
sw2p3: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

> net/core/net-procfs.c | 24 +++++++++++++-----------
> 1 file changed, 13 insertions(+), 11 deletions(-)
>
> diff --git a/net/core/net-procfs.c b/net/core/net-procfs.c
> index d8b9dbabd4a4..eab5fc88a002 100644
> --- a/net/core/net-procfs.c
> +++ b/net/core/net-procfs.c
> @@ -77,8 +77,8 @@ static void dev_seq_printf_stats(struct seq_file *seq, struct net_device *dev)
> struct rtnl_link_stats64 temp;
> const struct rtnl_link_stats64 *stats = dev_get_stats(dev, &temp);
>
> - seq_printf(seq, "%6s: %7llu %7llu %4llu %4llu %4llu %5llu %10llu %9llu "
> - "%8llu %7llu %4llu %4llu %4llu %5llu %7llu %10llu\n",
> + seq_printf(seq, "%9s: %16llu %12llu %4llu %6llu %4llu %5llu %10llu %9llu "
> + "%16llu %12llu %4llu %6llu %4llu %5llu %7llu %10llu\n",
> dev->name, stats->rx_bytes, stats->rx_packets,
> stats->rx_errors,
> stats->rx_dropped + stats->rx_missed_errors,
> @@ -103,11 +103,11 @@ static void dev_seq_printf_stats(struct seq_file *seq, struct net_device *dev)
> static int dev_seq_show(struct seq_file *seq, void *v)
> {
> if (v == SEQ_START_TOKEN)
> - seq_puts(seq, "Inter-| Receive "
> - " | Transmit\n"
> - " face |bytes packets errs drop fifo frame "
> - "compressed multicast|bytes packets errs "
> - "drop fifo colls carrier compressed\n");
> + seq_puts(seq, "Interface| Receive "
> + " | Transmit\n"
> + " | bytes packets errs drop fifo frame "
> + "compressed multicast| bytes packets errs "
> + " drop fifo colls carrier compressed\n");
> else
> dev_seq_printf_stats(seq, v);
> return 0;
> @@ -259,14 +259,14 @@ static int ptype_seq_show(struct seq_file *seq, void *v)
> struct packet_type *pt = v;
>
> if (v == SEQ_START_TOKEN)
> - seq_puts(seq, "Type Device Function\n");
> + seq_puts(seq, "Type Device Function\n");
> else if (pt->dev == NULL || dev_net(pt->dev) == seq_file_net(seq)) {
> if (pt->type == htons(ETH_P_ALL))
> seq_puts(seq, "ALL ");
> else
> seq_printf(seq, "%04x", ntohs(pt->type));
>
> - seq_printf(seq, " %-8s %ps\n",
> + seq_printf(seq, " %-9s %ps\n",
> pt->dev ? pt->dev->name : "", pt->func);
> }
>
> @@ -327,12 +327,14 @@ static int dev_mc_seq_show(struct seq_file *seq, void *v)
> struct netdev_hw_addr *ha;
> struct net_device *dev = v;
>
> - if (v == SEQ_START_TOKEN)
> + if (v == SEQ_START_TOKEN) {
> + seq_puts(seq, "Ifindex Interface Refcount Global_use Address\n");
> return 0;
> + }
>
> netif_addr_lock_bh(dev);
> netdev_for_each_mc_addr(ha, dev) {
> - seq_printf(seq, "%-4d %-15s %-5d %-5d %*phN\n",
> + seq_printf(seq, "%-7d %-9s %-8d %-10d %*phN\n",
> dev->ifindex, dev->name,
> ha->refcount, ha->global_use,
> (int)dev->addr_len, ha->addr);
> --
> 2.32.0
>