2012-07-23 74 views
3

我以下http://backreference.org/2010/03/26/tuntap-interface-tutorial/TUN程序不生成裝置節點

以下代碼成功獲取一個FD(通常爲3)當我運行它作爲根,但它不創建的/ dev/tun77設備。

應該嗎?

既不:

#include <stdio.h> 
#include <stdlib.h> 
#include <net/if.h> 
#include <fcntl.h> 
#include <sys/stat.h> 
#include <string.h> 
#include <linux/if_tun.h> 
#include <linux/ioctl.h> 

#define IFNAMSIZ 16 

int tun_alloc(char *dev, int flags) { 

    struct ifreq ifr; 
    int fd, err; 
    char *clonedev = "/dev/net/tun"; 

    /* Arguments taken by the function: 
    * 
    * char *dev: the name of an interface (or '\0'). MUST have enough 
    * space to hold the interface name if '\0' is passed 
    * int flags: interface flags (eg, IFF_TUN etc.) 
    */ 

    /* open the clone device */ 
    if((fd = open(clonedev, O_RDWR)) < 0) { 
    return fd; 
    } 

    /* preparation of the struct ifr, of type "struct ifreq" */ 
    memset(&ifr, 0, sizeof(ifr)); 

    ifr.ifr_flags = flags; /* IFF_TUN or IFF_TAP, plus maybe IFF_NO_PI */ 

    if (*dev) { 
    /* if a device name was specified, put it in the structure; otherwise, 
     * the kernel will try to allocate the "next" device of the 
     * specified type */ 
    strncpy(ifr.ifr_name, dev, IFNAMSIZ); 
    } 

    /* try to create the device */ 
    if((err = ioctl(fd, TUNSETIFF, (void *) &ifr)) < 0) { 
    close(fd); 
    return err; 
    } 

    /* if the operation was successful, write back the name of the 
    * interface to the variable "dev", so the caller can know 
    * it. Note that the caller MUST reserve space in *dev (see calling 
    * code below) */ 
    strcpy(dev, ifr.ifr_name); 

    /* this is the special file descriptor that the caller will use to talk 
    * with the virtual interface */ 
    return fd; 
} 

int main(void) { 
    char tun_name[IFNAMSIZ]; 
    int nread, tun_fd; 
    char buffer[2048]; 
    /* Connect to the device */ 
    strcpy(tun_name, "tun77"); 
    tun_fd = tun_alloc(tun_name, IFF_TUN | IFF_NO_PI); /* tun interface */ 

    if (tun_fd < 0){ 
    perror("Allocating interface"); 
    exit(1); 
    } else { 
    printf("connected to %s on fd: %i\n", tun_name, tun_fd); 
    } 

    /* Now read data coming from the kernel */ 
    while (1) { 
    /* Note that "buffer" should be at least the MTU size of the interface, eg 1500 bytes */ 
    nread = read(tun_fd, buffer, sizeof(buffer)); 
    if (nread < 0) { 
     perror("Reading from interface"); 
     close(tun_fd); 
     exit(1); 
    } 

    /* Do whatever with the data */ 
    printf("Read %d bytes from device %s\n", nread, tun_name); 
    } 
    return EXIT_SUCCESS; 
} 

回答

2

瓦爾德納與回答了這個上http://backreference.org/2010/03/26/tuntap-interface-tutorial/。 Linux中的網絡接口不出現在/ dev下;你將會看到的唯一東西是/ dev/net/tun,它是作爲創建tun/tap界面的第一步應該打開的設備。

如果您運行示例代碼,您將能夠在程序運行時使用「ip link」查看和配置您創建的接口;當程序終止時,界面消失。

或者,接口可以被製作爲持久性的,如所解釋的那樣,並且在那種情況下它可以在程序終止之後存活。

在任何情況下,在/ dev下都不會創建設備(除了已經提到的/ dev/net/tun)之外。