linux下修改网卡地址
ifconfig自然是简单。不过这里受嵌入式环境的限制,需要通过代码实现。
记录几条有用的命令。
查看manpages
$ man ioctl_list |grep IFHWADDR
参考ifconfig代码
$ equery b ifconfig
$ ebuild /usr/portage/sys-apps/net-tools/net-tools-1.60_p20090728014017-r1.ebuild unpack
or
$ lzma -cd /usr/portage/distfiles/net-tools-1.xxxxx.tar.lzma | tar xf -
发现查看这些已有代码,找到想要的部分,不困难。应该是得益于"small" & "do one thing"吧。
if ((skfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
exit(1);
ifconfig eth0 down
{
struct ifreq ifr;
strncpy(ifr.ifr_name, "eth0", IFNAMSIZ);
if (ioctl(fd, SIOCGIFFLAGS, &ifr) < 0) {
fprintf(stderr, "%s: ERROR while getting interface flags: %s\n",
"eth0", strerror(errno));
exit(-1);
}
strncpy(ifr.ifr_name, "eth0", IFNAMSIZ);
ifr.ifr_flags &= ~IFF_UP;
if (ioctl(fd, SIOCSIFFLAGS, &ifr) < 0) {
perror("SIOCSIFFLAGS");
exit(-1);
}
}
ifconfig eth0 hw ether xxx
{
struct ifreq ifr;
struct sockaddr *sa = &(ifr.ifr_hwaddr);
unsigned char* a = sa->sa_data;
sa->sa_family = AF_LOCAL;
sscanf(argv[2], "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx", a+0,a+1,a+2,a+3,a+4,a+5);
strncpy(ifr.ifr_name, "eth0", IFNAMSIZ);
res = ioctl(skfd, SIOCSIFHWADDR, &ifr);
if (res < 0) {
int saved_errno = errno;
printf("Master '%s': Error: SIOCSIFHWADDR failed: %s\n",
"eth0", strerror(saved_errno));
exit(saved_errno);
}
}
记录几条有用的命令。
查看manpages
$ man ioctl_list |grep IFHWADDR
参考ifconfig代码
$ equery b ifconfig
$ ebuild /usr/portage/sys-apps/net-tools/net-tools-1.60_p20090728014017-r1.ebuild unpack
or
$ lzma -cd /usr/portage/distfiles/net-tools-1.xxxxx.tar.lzma | tar xf -
发现查看这些已有代码,找到想要的部分,不困难。应该是得益于"small" & "do one thing"吧。
if ((skfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
exit(1);
ifconfig eth0 down
{
struct ifreq ifr;
strncpy(ifr.ifr_name, "eth0", IFNAMSIZ);
if (ioctl(fd, SIOCGIFFLAGS, &ifr) < 0) {
fprintf(stderr, "%s: ERROR while getting interface flags: %s\n",
"eth0", strerror(errno));
exit(-1);
}
strncpy(ifr.ifr_name, "eth0", IFNAMSIZ);
ifr.ifr_flags &= ~IFF_UP;
if (ioctl(fd, SIOCSIFFLAGS, &ifr) < 0) {
perror("SIOCSIFFLAGS");
exit(-1);
}
}
ifconfig eth0 hw ether xxx
{
struct ifreq ifr;
struct sockaddr *sa = &(ifr.ifr_hwaddr);
unsigned char* a = sa->sa_data;
sa->sa_family = AF_LOCAL;
sscanf(argv[2], "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx", a+0,a+1,a+2,a+3,a+4,a+5);
strncpy(ifr.ifr_name, "eth0", IFNAMSIZ);
res = ioctl(skfd, SIOCSIFHWADDR, &ifr);
if (res < 0) {
int saved_errno = errno;
printf("Master '%s': Error: SIOCSIFHWADDR failed: %s\n",
"eth0", strerror(saved_errno));
exit(saved_errno);
}
}
还没人赞这篇日记