无法使用ioctl更改mac地址

时间:2017-09-07 10:15:45

标签: c linux network-programming ioctl

最近我对如何使用低级别aproach访问和设置linux中的网络接口感兴趣。所以我发现,在网上搜索ioctl回调,我学会了如何使用它。我开始写下一些东西,但今天我在更改界面的mac地址方面遇到了问题。

我使用的代码是:

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;
  }
}

为了更好地理解我的代码&#34;接口&#34;变量是一个char **,其中我在初始化一个新接口时存储接口的名称,并且在该函数中将该名称存储在该变量中之后,我将一个int作为处理程序返回。

在更改mac地址之前,从代码中我将接口放下。

现在,当我调用ioctl来更改带有SIOCSIFHWADDR ioctl的mac地址时返回-1。

任何人都可以帮助我吗?对不起英文

1 个答案:

答案 0 :(得分:0)

查看netdevice(7) man page

  

SIOCGIFHWADDR,SIOCSIFHWADDR

     

使用ifr_hwaddr获取或设置设备的硬件地址。   硬件地址在struct sockaddr中指定。   sa_family包含ARPHRD_ *设备类型,sa_data包含L2   硬件地址从字节0开始。设置硬件   地址是特权操作。

所以,你需要很少的东西来改变MAC:

  1. ifr_name(必须是以空字符结尾的字符串)
  2. sa_family包含ARPHRD_ *设备类型(填入get_hwaddr()?)
  3. sa_data从字节0(完成)
  4. 开始的L2硬件地址
  5. 设置硬件地址是特权操作(sudo)
  6. 由于您在评论中确认您在主机上使用sudo运行它,请确保您的接口名称正确且未终止,即更改行:

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

    到行:

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

    以下是更改MAC的代码示例: https://gist.github.com/mad4j/8864135