From: Petr Písař Date: Wed, 3 Oct 2012 14:42:41 +0000 (+0200) Subject: iproute2: List interfaces without net address by default X-Git-Tag: v3.7.0~25^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7f747fd9377b8538adeba7332d25905ba08ac156;p=thirdparty%2Fiproute2.git iproute2: List interfaces without net address by default This fixes regression in iproute2-3.5.1 when `ip addr show' skipped interfaces without network layer address. Wrong output: 1: lo: mtu 16436 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:50:54:00:0f:03 brd ff:ff:ff:ff:ff:ff inet 10.34.25.198/23 brd 10.34.25.255 scope global eth0 inet6 2620:52:0:2219:250:54ff:fe00:f03/64 scope global dynamic valid_lft 2591919sec preferred_lft 604719sec inet6 fe80::250:54ff:fe00:f03/64 scope link valid_lft forever preferred_lft forever Expected output: 1: lo: mtu 16436 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:50:54:00:0f:03 brd ff:ff:ff:ff:ff:ff inet 10.34.25.198/23 brd 10.34.25.255 scope global eth0 inet6 2620:52:0:2219:250:54ff:fe00:f03/64 scope global dynamic valid_lft 2591896sec preferred_lft 604696sec inet6 fe80::250:54ff:fe00:f03/64 scope link valid_lft forever preferred_lft forever 5: veth1: mtu 1500 qdisc noop state DOWN qlen 1000 link/ether 8a:ec:35:34:1f:a8 brd ff:ff:ff:ff:ff:ff 6: veth0: mtu 1500 qdisc noop state DOWN qlen 1000 link/ether 2e:97:ef:77:40:82 brd ff:ff:ff:ff:ff:ff Signed-off-by: Petr Písař --- diff --git a/ip/ipaddress.c b/ip/ipaddress.c index 6c11ce410..5498f4688 100644 --- a/ip/ipaddress.c +++ b/ip/ipaddress.c @@ -884,6 +884,7 @@ static void ipaddr_filter(struct nlmsg_chain *linfo, struct nlmsg_chain *ainfo) lp = &linfo->head; while ( (l = *lp) != NULL) { int ok = 0; + int missing_net_address = 1; struct ifinfomsg *ifi = NLMSG_DATA(&l->h); struct nlmsg_list *a; @@ -891,8 +892,10 @@ static void ipaddr_filter(struct nlmsg_chain *linfo, struct nlmsg_chain *ainfo) struct nlmsghdr *n = &a->h; struct ifaddrmsg *ifa = NLMSG_DATA(n); - if (ifa->ifa_index != ifi->ifi_index || - (filter.family && filter.family != ifa->ifa_family)) + if (ifa->ifa_index != ifi->ifi_index) + continue; + missing_net_address = 0; + if (filter.family && filter.family != ifa->ifa_family) continue; if ((filter.scope^ifa->ifa_scope)&filter.scopemask) continue; @@ -927,6 +930,9 @@ static void ipaddr_filter(struct nlmsg_chain *linfo, struct nlmsg_chain *ainfo) ok = 1; break; } + if (missing_net_address && + (filter.family == AF_UNSPEC || filter.family == AF_PACKET)) + ok = 1; if (!ok) { *lp = l->next; free(l);