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
Modifier l'adresse MAC? N'est-ce pas un matériel, en lecture seule, un identifiant? –
vérifiez 'errno' pour plus de détails sur ce qu'est réellement l'erreur. Cela pourrait vous aider –
strerror (errno) retourner toujours "-1" –