Trouver adresse MAC d'origine du Matériel lui-même

Os:REDHAT LINUX, Linux gérer: 2.6.18.8-1 #

Est-ce possible de lire l'adresse MAC de forme NIC directement ? J'ai ci-dessous de code, mais il vient de lire à partir de ci-dessus de la couche, mais pas la carte elle-même !!!

J'essaie de comprendre comment trouver l'adresse MAC d'origine d'un ethernet NIC sur mon linux. Je comprends comment trouver l'adresse MAC actuelle à l'aide de la commande ifconfig, mais si l'adresse a été modifiée, par exemple à l'aide de
'ifconfig eth0 hw ether uu:vv:ww:yy:xx:zz',ou j'ai mis "permanent" à l'aide de vi /etc/sysconfig/network-scripts/ifcfg-eth0.ce fichier...je peux réussir à UP dans REBOOT aussi. comment puis-je trouver l'original? Il doit y avoir moyen de le trouver, parce qu'il est encore gravé de façon permanente dans la carte, mais je ne peux pas trouver un outil pour lire le brûlé dans l'adresse.
est-il un utilitaire ou de commande pour elle?
Je suppose que d'écrire du code C pour elle. mais vous ne savez pas comment faire dans le cas ci-dessus.

** code ci-dessous donne mon actuel MAC mais pas d'origine MAC

#include <stdio.h>              /* Standard I/O */
#include <stdlib.h>             /* Standard Library */
#include <errno.h>              /* Error number and related */


#define ENUMS
#include <sys/socket.h>
#include <net/route.h>
#include <net/if.h>
#include <features.h>           /* for the glibc version number */
#if __GLIBC__ >= 2 && __GLIBC_MINOR >= 1
#include <netpacket/packet.h>
#include <net/ethernet.h>       /* the L2 protocols */
#else
#include <asm/types.h>
#include <linux/if_packet.h>
#include <linux/if_ether.h>     /* The L2 protocols */
#endif
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/un.h>
#include <sys/ioctl.h>
#include <netdb.h>


int main( int argc, char * argv[] ){

unsigned char  mac[IFHWADDRLEN];
int i;
    get_local_hwaddr( argv[1], mac );
    for( i = 0; i < IFHWADDRLEN; i++ ){
        printf( "%02X:", (unsigned int)(mac[i]) );
    }

}


int get_local_hwaddr(const char *ifname, unsigned char *mac)
{
    struct ifreq ifr;
    int fd;
    int rv;                     //return value - error value from df or ioctl call

    /* determine the local MAC address */
    strcpy(ifr.ifr_name, ifname);
    fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);
    if (fd < 0)
        rv = fd;
    else {
        rv = ioctl(fd, SIOCGIFHWADDR, &ifr);
        if (rv >= 0)            /* worked okay */
            memcpy(mac, ifr.ifr_hwaddr.sa_data, IFHWADDRLEN);
    }

    return rv;
}
  • Juste parce qu'il est brûlé, ne signifie pas qu'il doit être disponible. Je ne sais pas comment linux et les cartes de travail, mais il serait tout à fait plausible si le MAC a été restaurée sur un cycle d'alimentation lorsque les cartes du firmware ne l'initialisation.
  • Je veux juste ma machine avec l'USURPATION de MAC et je peux le faire avec succès . mais lors que je veux que mon MAC d'origine pour mon application. c'est mon problème.
  • Je pense que @AmigableClarkKant est ce qui suggère qu'un cycle d'alimentation peut faire la carte initialiser à partir du firmware. Ne vous contentez pas de redémarrage; la fermeture, d'attendre, de l'alimentation sur. Que peut redémarrer la carte à son adresse MAC d'origine. Ensuite, vous pouvez récupérer et stocker l'adresse MAC d'origine avant de le modifier au moment de l'exécution.
  • ohh.... Je n'ai aucune Idée de Comment faire cela de manière Pragmatique.. Il n'y a pas d'autre moyen que je peux l'obtenir à chaque fois que je veux dans ma demande... à l'aide de code C (sans le stocker quelque part)
  • C'est une question de "comment faire passer l'information", en supposant qu'il est disponible. Tous les pilotes pour les cartes réseau permettra de savoir comment le faire, mais comme je l'ai décris ci-dessous, l'information est lue puis stockées, et si c'est remplacée plus tard, alors qu'il disparu. Vous pouvez ajouter un peu de code pour chaque pilote, mais ce serait beaucoup de travail, et presque certain de ne pas entrer dans le noyau de Linux, de sorte que vous ne jamais porter un patch pour chaque pilote de réseau disponibles - ce qui serait plutôt beaucoup d'effort pour maintenir...