2017-09-07 8 views
0

Récemment, je suis intéressé par la façon d'accéder et de définir les interfaces réseau dans Linux en utilisant une approche de bas niveau. J'ai donc trouvé, en cherchant sur le net le rappel ioctl et j'ai appris à l'utiliser. J'ai commencé à écrire quelque chose mais aujourd'hui j'ai un problème pour changer l'adresse mac d'une interface.Impossible de changer l'adresse MAC en utilisant ioctl

Le code que j'utilise est:

int change_mac(int handler){ 
    srand(times(NULL)); 

    get_hwaddr(handler,&req); 
    for(int i=0;i<6;i++){ 
    req.ifr_hwaddr.sa_data[i]=(char)rand(); 
    } 
    char err=ioctl(sock,SIOCSIFHWADDR,&req); 
    if(err<0){ 
    printf("Problem to change the mac address with a random one\n %i",err); 
    exit(0); 
    } 
} 

int get_hwaddr(int handler,struct ifreq* req_a){ 
    if(handler>=current){ 
    return -1; 
    } 
    strncpy(req_a->ifr_name,interfaces[handler],strlen(interfaces[handler])); 

    if(ioctl(sock,SIOCGIFHWADDR,req_a)<0){ 
    return -2; 
    } 
} 

Pour mieux comprendre mon code la variable « interfaces » est un char ** où je stocke le nom d'interfaces quand j'initializate une nouvelle interface, et dans cette fonction après avoir stocké le nom dans cette variable, je retourne un int en tant que gestionnaire.

Avant de changer l'adresse MAC, à partir du code, j'ai mis l'interface vers le bas.

Maintenant quand j'appelle ioctl pour changer l'adresse mac avec le SIOCSIFHWADDR ioctl return -1.

Quelqu'un peut-il m'aider? Désolé pour les anglais

+0

Modifier l'adresse MAC? N'est-ce pas un matériel, en lecture seule, un identifiant? –

+0

vérifiez 'errno' pour plus de détails sur ce qu'est réellement l'erreur. Cela pourrait vous aider –

+0

strerror (errno) retourner toujours "-1" –

Répondre

0

Jetez un oeil à netdevice(7) man page:

SIOCGIFHWADDR, SIOCSIFHWADDR

ou définit l'adresse matérielle d'un appareil à l'aide ifr_hwaddr. L'adresse matérielle est spécifiée dans une struct sockaddr. sa_family contient le type de périphérique ARPHRD_ *, sa_data l'adresse matérielle L2 à partir de l'octet 0. La définition de l'adresse matérielle est une opération privilégiée.

Alors, vous avez besoin quelques petites choses à changer le MAC: (rempli get_hwaddr())

  1. ifr_name (doit être une chaîne terminée par un NUL)
  2. sa_family contient le type de dispositif ARPHRD_ *
  3. sa_data l'adresse matérielle L2 à partir de l'octet 0 (fait)
  4. réglage de l'adresse matérielle est une opération privilégiée (sudo)

Depuis que vous avez confirmé dans les commentaires que vous exécutez avec sudo sur un hôte, s'il vous plaît assurez-vous que votre nom d'interface est correcte et NUL terminé, soit la ligne de changement:

strncpy(req_a->ifr_name,interfaces[handler],strlen(interfaces[handler])); 

à la ligne:

strncpy(req_a->ifr_name,interfaces[handler],strlen(interfaces[handler]) + 1); 

Voici un exemple de code pour modifier un MAC: https://gist.github.com/mad4j/8864135