Get the permanent mac address of a network card

Discussion in 'Linux Networking' started by cris, Aug 28, 2003.

  1. cris

    cris Guest

    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.
     
    cris, Aug 28, 2003
    #1
    1. Advertisements

  2. 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 Davidson, Aug 28, 2003
    #2
    1. Advertisements

  3. cris

    cris Guest

    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.


     
    cris, Sep 2, 2003
    #3
  4. cris

    cris Guest

    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.
     
    cris, Sep 2, 2003
    #4
  5. Another person uses "programmatically"! I swear that is not an english
    word! I haveonly ever seen french people use it. And now an italian.
    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
     
    Peter T. Breuer, Sep 3, 2003
    #5
  6. cris

    Tauno Voipio Guest

    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
     
    Tauno Voipio, Sep 3, 2003
    #6
    1. Advertisements

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments (here). After that, you can post your question and our members will help you out.