繁体   English   中英

Linux 以编程方式向上/向下接口 kernel

[英]Linux programmatically up/down an interface kernel

在 kernel 空间中启用或禁用接口的编程方式是什么? 应该做什么?

...通过使用 IOCTL 的...

ioctl(skfd, SIOCSIFFLAGS, &ifr);

...设置或取消设置 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);
}

代码复制粘贴自Linux 网络文档

启动 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);
}

用法:

set_if_up("eth0", 1);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM