Linux 以编程方式上/下接口内核

发布于 2024-11-04 09:12:47 字数 35 浏览 3 评论 0原文

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

What is the programmatic way of enabling or disabling an interface in kernel space? What should be done?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

夜空下最亮的亮点 2024-11-11 09:12:47

...通过使用 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 网络文档

...by using IOCTL's...

ioctl(skfd, SIOCSIFFLAGS, &ifr);

... with the IFF_UP bit set or unset depending on whether you want bring the interface up or down accordingly, i.e.:

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.

睫毛上残留的泪 2024-11-11 09:12:47

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

Code to bring eth0 up:

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);
流绪微梦 2024-11-11 09:12:47
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);
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);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文