Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 26 Jun 2004 13:51:16 +0100
From:      Doug Rabson <dfr@nlsystems.com>
To:        freebsd-hackers@freebsd.org
Cc:        Ivan Voras <ivoras@fer.hr>
Subject:   Re: Getting MAC address?
Message-ID:  <200406261351.16778.dfr@nlsystems.com>
In-Reply-To: <40DD3EC1.9000106@fer.hr>
References:  <40DCC57F.5090209@fer.hr> <20040626104947.T93253@woozle.rinet.ru> <40DD3EC1.9000106@fer.hr>

next in thread | previous in thread | raw e-mail | index | archive | help
On Saturday 26 June 2004 10:15, Ivan Voras wrote:
> Dmitry Morozovsky wrote:
> > On Sat, 26 Jun 2004, Ivan Voras wrote:
> >
> > IV> How to get the MAC address for an (ethernet) interface? The
> > linux code IV> does this:
> > IV> 	retval = ioctl(thisint->sockInt, SIOCGIFHWADDR, &ifr);
> > IV>
> > IV> After some searching, I found SIOCSIFLLADDR ioctl, but it
> > appears there IV> isn't a "GET" counterpart.
> > IV>
> > IV> (I've got interface name & index available...)
> >
> > Take a look at ifconfig(8) source.
> >
> > getifaddrs(3), case when sa_family == AF_LINK
>
> I was looking at it and came across getifaddrs(). This function does
> not depend on a open socket (yes, mine is AF_LINK, sockaddr_dl), and
> apparently returns a list of all interfaces. Is there really no other
> way than to traverse this list?

Its really not that hard:

static void
getNodeID(uint8_t node[6])
{
    struct ifaddrs *ifap;

    if (getifaddrs(&ifap) == 0) {
	struct ifaddrs *p;
	for (p = ifap; p; p = p->ifa_next) {
	    if (p->ifa_addr->sa_family == AF_LINK) {
		struct sockaddr_dl* sdp = (struct sockaddr_dl*) p->ifa_addr;
		memcpy(node, sdp->sdl_data + sdp->sdl_nlen, 6);
		freeifaddrs(ifap);
		return;
	    }
	}
	freeifaddrs(ifap);
    }
}



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200406261351.16778.dfr>