Revert "net: procfs: add seq_puts() statement for dev_mcast"
This reverts commitec18e84554
. It turns out that there are user space programs which got broken by that change. One example is the "ifstat" program shipped by Debian: https://packages.debian.org/source/bullseye/ifstat which, confusingly enough, seems to not have anything in common with the much more familiar (at least to me) ifstat program from iproute2: https://git.kernel.org/pub/scm/network/iproute2/iproute2.git/tree/misc/ifstat.c root@debian:~# ifstat ifstat: /proc/net/dev: unsupported format. This change modified the header (first two lines of text) in /proc/net/dev so that it looks like this: 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 whereas before it looked like this: 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 The reason why the ifstat shipped by Debian (v1.1, with a Debian patch upgrading it to 1.1-8.1 at the time of writing) is broken is because its "proc" driver/backend parses the header very literally: main/drivers.c#L825 if (!data->checked && strncmp(buf, "Inter-|", 7)) goto badproc; and there's no way in which the header can be changed such that programs parsing like that would not get broken. Even if we fix this ancient and very "lightly" maintained program to parse the text output of /proc/net/dev in a more sensible way, this story seems bound to repeat again with other programs, and modifying them all could cause more trouble than it's worth. On the other hand, the reverted patch had no other reason than an aesthetic one, so reverting it is the simplest way out. I don't know what other distributions would be affected; the fact that Debian doesn't ship the iproute2 version of the program (a different code base altogether, which uses netlink and not /proc/net/dev) is surprising in itself. Fixes:ec18e84554
("net: procfs: add seq_puts() statement for dev_mcast") Link: https://lore.kernel.org/netdev/20211009163511.vayjvtn3rrteglsu@skbuf/ Cc: Yajun Deng <yajun.deng@linux.dev> Cc: Matthieu Baerts <matthieu.baerts@tessares.net> Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com> Link: https://lore.kernel.org/r/20211013001909.3164185-1-vladimir.oltean@nxp.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
f03dca0c9e
commit
1f922d9e37
|
@ -77,8 +77,8 @@ static void dev_seq_printf_stats(struct seq_file *seq, struct net_device *dev)
|
||||||
struct rtnl_link_stats64 temp;
|
struct rtnl_link_stats64 temp;
|
||||||
const struct rtnl_link_stats64 *stats = dev_get_stats(dev, &temp);
|
const struct rtnl_link_stats64 *stats = dev_get_stats(dev, &temp);
|
||||||
|
|
||||||
seq_printf(seq, "%9s: %16llu %12llu %4llu %6llu %4llu %5llu %10llu %9llu "
|
seq_printf(seq, "%6s: %7llu %7llu %4llu %4llu %4llu %5llu %10llu %9llu "
|
||||||
"%16llu %12llu %4llu %6llu %4llu %5llu %7llu %10llu\n",
|
"%8llu %7llu %4llu %4llu %4llu %5llu %7llu %10llu\n",
|
||||||
dev->name, stats->rx_bytes, stats->rx_packets,
|
dev->name, stats->rx_bytes, stats->rx_packets,
|
||||||
stats->rx_errors,
|
stats->rx_errors,
|
||||||
stats->rx_dropped + stats->rx_missed_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)
|
static int dev_seq_show(struct seq_file *seq, void *v)
|
||||||
{
|
{
|
||||||
if (v == SEQ_START_TOKEN)
|
if (v == SEQ_START_TOKEN)
|
||||||
seq_puts(seq, "Interface| Receive "
|
seq_puts(seq, "Inter-| Receive "
|
||||||
" | Transmit\n"
|
" | Transmit\n"
|
||||||
" | bytes packets errs drop fifo frame "
|
" face |bytes packets errs drop fifo frame "
|
||||||
"compressed multicast| bytes packets errs "
|
"compressed multicast|bytes packets errs "
|
||||||
" drop fifo colls carrier compressed\n");
|
"drop fifo colls carrier compressed\n");
|
||||||
else
|
else
|
||||||
dev_seq_printf_stats(seq, v);
|
dev_seq_printf_stats(seq, v);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -259,14 +259,14 @@ static int ptype_seq_show(struct seq_file *seq, void *v)
|
||||||
struct packet_type *pt = v;
|
struct packet_type *pt = v;
|
||||||
|
|
||||||
if (v == SEQ_START_TOKEN)
|
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)) {
|
else if (pt->dev == NULL || dev_net(pt->dev) == seq_file_net(seq)) {
|
||||||
if (pt->type == htons(ETH_P_ALL))
|
if (pt->type == htons(ETH_P_ALL))
|
||||||
seq_puts(seq, "ALL ");
|
seq_puts(seq, "ALL ");
|
||||||
else
|
else
|
||||||
seq_printf(seq, "%04x", ntohs(pt->type));
|
seq_printf(seq, "%04x", ntohs(pt->type));
|
||||||
|
|
||||||
seq_printf(seq, " %-9s %ps\n",
|
seq_printf(seq, " %-8s %ps\n",
|
||||||
pt->dev ? pt->dev->name : "", pt->func);
|
pt->dev ? pt->dev->name : "", pt->func);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -327,14 +327,12 @@ static int dev_mc_seq_show(struct seq_file *seq, void *v)
|
||||||
struct netdev_hw_addr *ha;
|
struct netdev_hw_addr *ha;
|
||||||
struct net_device *dev = v;
|
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;
|
return 0;
|
||||||
}
|
|
||||||
|
|
||||||
netif_addr_lock_bh(dev);
|
netif_addr_lock_bh(dev);
|
||||||
netdev_for_each_mc_addr(ha, dev) {
|
netdev_for_each_mc_addr(ha, dev) {
|
||||||
seq_printf(seq, "%-7d %-9s %-8d %-10d %*phN\n",
|
seq_printf(seq, "%-4d %-15s %-5d %-5d %*phN\n",
|
||||||
dev->ifindex, dev->name,
|
dev->ifindex, dev->name,
|
||||||
ha->refcount, ha->global_use,
|
ha->refcount, ha->global_use,
|
||||||
(int)dev->addr_len, ha->addr);
|
(int)dev->addr_len, ha->addr);
|
||||||
|
|
Loading…
Reference in New Issue