From owner-freebsd-net@FreeBSD.ORG Mon Jul 21 22:23:37 2008 Return-Path: Delivered-To: freebsd-net@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 5966D1065678 for ; Mon, 21 Jul 2008 22:23:37 +0000 (UTC) (envelope-from brooks@lor.one-eyed-alien.net) Received: from lor.one-eyed-alien.net (cl-162.ewr-01.us.sixxs.net [IPv6:2001:4830:1200:a1::2]) by mx1.freebsd.org (Postfix) with ESMTP id CB9778FC16 for ; Mon, 21 Jul 2008 22:23:36 +0000 (UTC) (envelope-from brooks@lor.one-eyed-alien.net) Received: from lor.one-eyed-alien.net (localhost [127.0.0.1]) by lor.one-eyed-alien.net (8.14.2/8.14.2) with ESMTP id m6LMOGha005479; Mon, 21 Jul 2008 17:24:16 -0500 (CDT) (envelope-from brooks@lor.one-eyed-alien.net) Received: (from brooks@localhost) by lor.one-eyed-alien.net (8.14.2/8.14.2/Submit) id m6LMOGKQ005478; Mon, 21 Jul 2008 17:24:16 -0500 (CDT) (envelope-from brooks) Date: Mon, 21 Jul 2008 17:24:16 -0500 From: Brooks Davis To: Jens Rehsack Message-ID: <20080721222416.GG1699@lor.one-eyed-alien.net> References: <4884F401.4050103@web.de> <20080721204820.GE1699@lor.one-eyed-alien.net> <4884FFFF.9090908@web.de> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="Y+xroYBkGM9OatJL" Content-Disposition: inline In-Reply-To: <4884FFFF.9090908@web.de> User-Agent: Mutt/1.5.17 (2007-11-01) Cc: FreeBSD Net Subject: Re: lo0 not in ioctl( SIOCGIFCONF ) X-BeenThere: freebsd-net@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Networking and TCP/IP with FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 21 Jul 2008 22:23:37 -0000 --Y+xroYBkGM9OatJL Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Mon, Jul 21, 2008 at 09:30:39PM +0000, Jens Rehsack wrote: > Brooks Davis wrote: >>> Hi, >>>=20 >>> maybe this question is better asked in this list ... >>>=20 >>> I was searching why ports/net/p5-Net-Interface was not working as >>> expected and found some reasons. Most of them I can answer by implement= ing >>> some test code as attached, but now I'm wondering why em0 is shown twice >>> and lo0 is not included. >>> The same situation on another machine .. >>=20 >> The attachment didn't make it through. >>=20 >> -- Brooks >=20 > Copy&Paste starts here ... > #include > #include > #include > #include > #include > #include > #include > #include >=20 > #ifndef _SIZEOF_ADDR_IFREQ > #define _SIZEOF_ADDR_IFREQ(ifr) \ > ((ifr).ifr_addr.sa_len > sizeof(struct sockaddr) ? \ > (sizeof(struct ifreq) - sizeof(struct sockaddr) + \ > (ifr).ifr_addr.sa_len) : sizeof(struct ifreq)) > #endif >=20 > int > main() > { > struct ifconf ifc; > struct ifreq *ifr, *lifr; > int fd; > unsigned int n; >=20 > fd =3D socket( AF_INET, SOCK_STREAM, 0 ); > bzero(&ifc, sizeof(ifc)); > n =3D 3; > ifr =3D calloc( ifc.ifc_len, sizeof(*ifr) ); > do > { > n *=3D 2; > ifr =3D realloc( ifr, sizeof(*ifr) * n ); > bzero( ifr, sizeof(*ifr) * n ); > ifc.ifc_req =3D ifr; > ifc.ifc_len =3D n * sizeof(*ifr); > } while( ( ioctl( fd, SIOCGIFCONF, &ifc ) =3D=3D -1 ) || ( ifc.if= c_len=20 > =3D=3D n * sizeof(*ifr)) ); There are several problems with this loop. First, icoctl won't return an error in the overflow case because that's not how SIOCGIFCONF works. SIOCGIFCONF is badly designed in a number of ways, but that's how it is. Second, checking that the array is completely full isn't at all reliable because what is returned is actually ifreq structures which might or might not vary in length as they contain addresses. Thus you need <=3D. Third, you should start by allocating a significant amount of space. Yes, your algorithm is O(sqrt(n)), but allocating a larger value has effectively no cost so you might as well save some system calls on average. > lifr =3D (struct ifreq *)&ifc.ifc_buf[ifc.ifc_len]; > > while (ifr < lifr) > { > printf( "%s\n", ifr->ifr_name ); > ifr =3D (struct ifreq *)(((char *)ifr) + _SIZEOF_ADDR_IFREQ(*ifr)= ); > } This loop has two problems. First, the ifr's are variable length so you immediately go off into the weeds. Second, there is at least one per interface and one per address so you to keep track of the last interface name and not repeat them. -- Brooks >=20 > return 0; > } > _______________________________________________ > freebsd-net@freebsd.org mailing list > http://lists.freebsd.org/mailman/listinfo/freebsd-net > To unsubscribe, send any mail to "freebsd-net-unsubscribe@freebsd.org" >=20 --Y+xroYBkGM9OatJL Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.8 (FreeBSD) iD8DBQFIhQyQXY6L6fI4GtQRAoifAJ46MILVTny+Nd4S8sUcQ8CcJjrw0gCfRnQV F1kAkRd2NHvWg6uLiVfSNpg= =91SQ -----END PGP SIGNATURE----- --Y+xroYBkGM9OatJL--