[英]Linux programmatically up/down an interface kernel
What is the programmatic way of enabling or disabling an interface in kernel space?在 kernel 空间中启用或禁用接口的编程方式是什么? What should be done?应该做什么?
...by using IOCTL's... ...通过使用 IOCTL 的...
ioctl(skfd, SIOCSIFFLAGS, &ifr);
... with the IFF_UP bit set or unset depending on whether you want bring the interface up or down accordingly, ie: ...设置或取消设置 IFF_UP 位取决于您是否要相应地启动或关闭接口,即:
static int set_if_up(char *ifname, short flags)
{
return set_if_flags(ifname, flags | IFF_UP);
}
static int set_if_down(char *ifname, short flags)
{
return set_if_flags(ifname, flags & ~IFF_UP);
}
Code copy-pasted from Linux networking documentation .代码复制粘贴自Linux 网络文档。
Code to bring eth0 up:启动 eth0 的代码:
int sockfd;
struct ifreq ifr;
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd < 0)
return;
memset(&ifr, 0, sizeof ifr);
strncpy(ifr.ifr_name, "eth0", IFNAMSIZ);
ifr.ifr_flags |= IFF_UP;
ioctl(sockfd, SIOCSIFFLAGS, &ifr);
int skfd = -1; /* AF_INET socket for ioctl() calls.*/
int set_if_flags(char *ifname, short flags)
{
struct ifreq ifr;
int res = 0;
ifr.ifr_flags = flags;
strncpy(ifr.ifr_name, ifname, IFNAMSIZ);
if ((skfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
printf("socket error %s\n", strerror(errno));
res = 1;
goto out;
}
res = ioctl(skfd, SIOCSIFFLAGS, &ifr);
if (res < 0) {
printf("Interface '%s': Error: SIOCSIFFLAGS failed: %s\n",
ifname, strerror(errno));
} else {
printf("Interface '%s': flags set to %04X.\n", ifname, flags);
}
out:
return res;
}
int set_if_up(char *ifname, short flags)
{
return set_if_flags(ifname, flags | IFF_UP);
}
usage:用法:
set_if_up("eth0", 1);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.