【问题标题】:Confusion on TUNSETIFF ioctl type对 TUNSETIFF ioctl 类型的困惑
【发布时间】:2016-12-19 22:15:19
【问题描述】:

我看到TUNSETIFF ioctl 的定义相互冲突。如果我在我的系统上查看linux/if_tun.h,我会看到这一行:

#define TUNSETIFF     _IOW('T', 202, int)

这表明 TUNSETIFF ioctl 采用指向 int 的指针。另外,如果我打印出 TUNSETIFF 的值,我会得到 1074025674,如果我屏蔽掉大小位,则表明这个 ioctl 获取大小为 4 字节的数据。

但是当我查看TUNSETIFF 周围的文档时,我看到了将指针传递给struct ifreq 的实例。例如在official documentation:

#include <linux/if.h>
#include <linux/if_tun.h>

int tun_alloc(char *dev)
{
    struct ifreq ifr;
    int fd, err;

    if( (fd = open("/dev/net/tun", O_RDWR)) < 0 )
       return tun_alloc_old(dev);

    memset(&ifr, 0, sizeof(ifr));

    /* Flags: IFF_TUN   - TUN device (no Ethernet headers) 
     *        IFF_TAP   - TAP device  
     *
     *        IFF_NO_PI - Do not provide packet information  
     */ 
    ifr.ifr_flags = IFF_TUN; 
    if( *dev )
       strncpy(ifr.ifr_name, dev, IFNAMSIZ);

    if( (err = ioctl(fd, TUNSETIFF, (void *) &ifr)) < 0 ){
       close(fd);
       return err;
    }
    strcpy(dev, ifr.ifr_name);
    return fd;
}

那么为什么会出现这种差异呢?只是头文件有错误吗?

【问题讨论】:

  • 你是如何打印TUNSETIFF的值的?

标签: c linux ioctl tun


【解决方案1】:

所有 ioctl 都有一个参数,其含义随 ioctl 不同而不同。在此代码的情况下,它是指向用户空间结构的指针。请注意,从内核的角度来看,这只是一个词,而不是指针。用户空间指针仅用于内核和用户空间之间的数据复制,不能直接解引用。

【讨论】:

    【解决方案2】:

    仅包含 "if.h""if_tun.h" 时出现同样的错误

    当我包含&lt;sys/ioctl.h&gt;时,它可以工作,一切似乎都很好

    希望这会有所帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-29
      • 2017-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-07
      • 2017-08-01
      相关资源
      最近更新 更多