From: Steven Whitehouse <steve@chygwyn.com>
To: Eric Dumazet <eric.dumazet@gmail.com>
Cc: Jeffrey Merkey <jeffmerkey@gmail.com>,
linux-kernel <linux-kernel@vger.kernel.org>
Subject: Re: Question about SIOCGIFCONF
Date: Fri, 28 May 2010 10:22:19 +0100 [thread overview]
Message-ID: <1275038539.2364.20.camel@localhost> (raw)
In-Reply-To: <1275022651.2446.35.camel@edumazet-laptop>
Hi,
On Fri, 2010-05-28 at 06:57 +0200, Eric Dumazet wrote:
> Le jeudi 27 mai 2010 à 21:02 -0600, Jeffrey Merkey a écrit :
> > Why is SIOGICONF only instrumented to return a single interface lo for
> > example. I noticed that ifconfig always uses /proc/net/dev but the
> > older SIOCGIFCONF ioctl seems to be busted. Anyone have an
> > explanation or is this just how the shit is these days or is the
> > fucking thing broken (seems to be). ?
>
> Shit comes from you eyes maybe ?
>
> Correction : Shit comes from your eyes, definitely.
>
> Proof :
>
> # strace -o /tmp/STRACE ifconfig -a
> # grep SIOCGIFCONF /tmp/STRACE
> ioctl(4, SIOCGIFCONF, {120, {{"lo", {AF_INET, inet_addr("127.0.0.1")}},
> {"wlan0", {AF_INET, inet_addr("192.168.1.21")}}, {"ppp0", {AF_INET,
> inet_addr("10.150.51.210")}}}}) = 0
>
>
> Part of ifconfig :
>
> ifc.ifc_buf = NULL;
> for (;;) {
> ifc.ifc_len = sizeof(struct ifreq) * numreqs;
> ifc.ifc_buf = xrealloc(ifc.ifc_buf, ifc.ifc_len);
>
> if (ioctl(skfd, SIOCGIFCONF, &ifc) < 0) {
> perror("SIOCGIFCONF");
> goto out;
> }
> if (ifc.ifc_len == sizeof(struct ifreq) * numreqs) {
> /* assume it overflowed and try again */
> numreqs += 10;
> continue;
> }
> break;
> }
>
> maybe numreqs should be firt initialized to 64, then doubled each
> round...
>
Yes, except that this will fail if you add a protocol that is not known
about by ifconfig and it has a struct sockaddr which is larger than the
16 bytes allowed for in the ifreq. There used to be a DECnet
implementation of this ioctl() but we had to get rid of it because it
broke every single SIOCGFICONF using program (including ifconfig) on the
system for that reason.
This is partly historical. Some systems have a struct sockaddr which
includes a length parameter which means that you can always parse the
returned values, even if they are larger than 16 bytes and the protocol
is unknown. Linux does not have this length field, so you have to know
in advance a full list of all protocols which have sockaddr's greater
than 16 bytes in length in order to parse the results.
The upshot of all that is that it is much better to use rtnetlink, as
per iproute2 instead of this ioctl which is obsolete for most purposes.
A quick grep through the code suggests that ipv4 is the only protocol
which implements this ioctl currently,
Steve.
next prev parent reply other threads:[~2010-05-28 10:13 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-05-28 3:02 Question about SIOCGIFCONF Jeffrey Merkey
2010-05-28 4:57 ` Eric Dumazet
2010-05-28 9:22 ` Steven Whitehouse [this message]
2010-05-28 18:31 ` Jeffrey Merkey
2010-05-28 19:02 ` Jeffrey Merkey
2010-05-28 19:05 ` Jeffrey Merkey
2010-05-28 20:06 ` Eric Dumazet
[not found] ` <AANLkTimg3iNFVcV7AWSc0MPoW7UwunwSdH4NNIxl_w-P@mail.gmail.com>
2010-05-28 22:00 ` Fwd: " Jeffrey Merkey
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1275038539.2364.20.camel@localhost \
--to=steve@chygwyn.com \
--cc=eric.dumazet@gmail.com \
--cc=jeffmerkey@gmail.com \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox