View Full Version : Get the permanent mac address of a network card
I want get the permanent mac address of a network card,
programmatically, in C language, for example with a ioctl o similar.
But the mac address is updateable via software with ifconfig or other
commands. In this case I want get the real mac address set in the
eprom of a network card by the factory, not the modified mac address.
Is this possible ?
If it is possible, have you a sample code for get this information in
c lang ?
Thanks in advance.
Floyd Davidson
07-24-2004, 09:02 PM
cragazzon@tiscali.it (cris) wrote:
>I want get the permanent mac address of a network card,
>programmatically, in C language, for example with a ioctl o similar.
>
>But the mac address is updateable via software with ifconfig or other
>commands. In this case I want get the real mac address set in the
>eprom of a network card by the factory, not the modified mac address.
>
>Is this possible ?
>If it is possible, have you a sample code for get this information in
>c lang ?
>
>Thanks in advance.
I don't know if you can get at the hardwired MAC address or not.
The following program demonstrates how to get the address that the
interface is actually using.
#define _BSD_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <net/if.h>
#include <arpa/inet.h>
int main(void)
{
int sfd;
unsigned char *u;
struct ifreq ifr;
struct sockaddr_in *sin = (struct sockaddr_in *) &ifr.ifr_addr;
memset(&ifr, 0, sizeof ifr);
if (0 > (sfd = socket(AF_INET, SOCK_STREAM, 0))) {
perror("socket()");
exit(EXIT_FAILURE);
}
strcpy(ifr.ifr_name, "eth0");
sin->sin_family = AF_INET;
if (0 == ioctl(sfd, SIOCGIFADDR, &ifr)) {
printf("%s: %s\n", ifr.ifr_name, inet_ntoa(sin->sin_addr));
}
if (0 > ioctl(sfd, SIOCGIFHWADDR, &ifr)) {
return EXIT_FAILURE;
}
u = (unsigned char *) &ifr.ifr_addr.sa_data;
if (u[0] + u[1] + u[2] + u[3] + u[4] + u[5]) {
printf("HW Address: %2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x\n",
u[0], u[1], u[2], u[3], u[4], u[5]);
}
return EXIT_SUCCESS;
}
--
Floyd L. Davidson <http://web.newsguy.com/floyd_davidson>
Ukpeagvik (Barrow, Alaska) floyd@barrow.com
Thank you very much, Floyd.
I have tried your code. But if i change the mac address via ifconfig I
get the running mac address and not the real mac address of the
network card.
Anyone know how get the real mac address of the network card ?
Thanks again, Floyd.
Floyd Davidson <floyd@barrow.com> wrote in message news:<87lltdwhdf.fld@barrow.com>...
> cragazzon@tiscali.it (cris) wrote:
> >I want get the permanent mac address of a network card,
> >programmatically, in C language, for example with a ioctl o similar.
> >
> >But the mac address is updateable via software with ifconfig or other
> >commands. In this case I want get the real mac address set in the
> >eprom of a network card by the factory, not the modified mac address.
> >
> >Is this possible ?
> >If it is possible, have you a sample code for get this information in
> >c lang ?
> >
> >Thanks in advance.
>
> I don't know if you can get at the hardwired MAC address or not.
> The following program demonstrates how to get the address that the
> interface is actually using.
>
> #define _BSD_SOURCE
> #include <stdio.h>
> #include <stdlib.h>
> #include <string.h>
> #include <sys/ioctl.h>
> #include <sys/socket.h>
> #include <sys/types.h>
> #include <net/if.h>
> #include <arpa/inet.h>
>
> int main(void)
> {
> int sfd;
> unsigned char *u;
> struct ifreq ifr;
> struct sockaddr_in *sin = (struct sockaddr_in *) &ifr.ifr_addr;
>
> memset(&ifr, 0, sizeof ifr);
>
> if (0 > (sfd = socket(AF_INET, SOCK_STREAM, 0))) {
> perror("socket()");
> exit(EXIT_FAILURE);
> }
>
> strcpy(ifr.ifr_name, "eth0");
> sin->sin_family = AF_INET;
>
> if (0 == ioctl(sfd, SIOCGIFADDR, &ifr)) {
> printf("%s: %s\n", ifr.ifr_name, inet_ntoa(sin->sin_addr));
> }
>
> if (0 > ioctl(sfd, SIOCGIFHWADDR, &ifr)) {
> return EXIT_FAILURE;
> }
>
> u = (unsigned char *) &ifr.ifr_addr.sa_data;
>
> if (u[0] + u[1] + u[2] + u[3] + u[4] + u[5]) {
> printf("HW Address: %2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x\n",
> u[0], u[1], u[2], u[3], u[4], u[5]);
> }
>
> return EXIT_SUCCESS;
> }
Anyone does know how to verify, programmatically via c lang, if a mac
address in a redhat linux systen is a 'software' mac adddres (changed
in the system via ifconfig or similar) ?
Thanks in advance.
Peter T. Breuer
07-24-2004, 09:08 PM
cris <cragazzon@tiscali.it> wrote:
> Anyone does know how to verify, programmatically via c lang, if a mac
Another person uses "programmatically"! I swear that is not an english
word! I haveonly ever seen french people use it. And now an italian.
> address in a redhat linux systen is a 'software' mac adddres (changed
> in the system via ifconfig or similar) ?
The mac address is always for real. You can ask the card what it is
(see all that rtnetlink stuff in the kernel and read source of
ifconfig). I don't know if you can find out what the default was.
Peter
Tauno Voipio
07-24-2004, 09:08 PM
"cris" <cragazzon@tiscali.it> wrote in message
news:461f1955.0309021342.5483b2ac@posting.google.com...
> Thank you very much, Floyd.
>
> I have tried your code. But if i change the mac address via ifconfig I
> get the running mac address and not the real mac address of the
> network card.
The thing you are requesting is different for each type of interface chip
and NIC. On most cards, the on-card MAC address is stored on a small serial
non-volatile memory connected to the network interface chip. The actual
protocol needed to access the memory is heavily dependent on the interface
chip. For an example, get the data sheet of SMSC LAN91C96 from the company
website.
There is no universal ioctl() implemented on the NIC drivers to read the
on-board stored MAC.
What would you need the stored MAC for?
(Please note that the open-source community is quite sensitive to
host-identifier or copy-protection issues).
HTH
Tauno Voipio
tauno voipio @ iki fi
vBulletin v3.0.3, Copyright ©2000-2009, Jelsoft Enterprises Ltd.