• Pavel Emelyanov's avatar
    tun: Allow to skip filter on attach · 849c9b6f
    Pavel Emelyanov authored
    There's a small problem with sk-filters on tun devices. Consider
    an application doing this sequence of steps:
    
    fd = open("/dev/net/tun");
    ioctl(fd, TUNSETIFF, { .ifr_name = "tun0" });
    ioctl(fd, TUNATTACHFILTER, &my_filter);
    ioctl(fd, TUNSETPERSIST, 1);
    close(fd);
    
    At that point the tun0 will remain in the system and will keep in
    mind that there should be a socket filter at address '&my_filter'.
    
    If after that we do
    
    fd = open("/dev/net/tun");
    ioctl(fd, TUNSETIFF, { .ifr_name = "tun0" });
    
    we most likely receive the -EFAULT error, since tun_attach() would
    try to connect the filter back. But (!) if we provide a filter at
    address &my_filter, then tun0 will be created and the "new" filter
    would be attached, but application may not know about that.
    
    This may create certain problems to anyone using tun-s, but it's
    critical problem for c/r -- if we meet a persistent tun device
    with a filter in mind, we will not be able to attach to it to dump
    its state (flags, owner, address, vnethdr size, etc.).
    
    The proposal is to allow to attach to tun device (with TUNSETIFF)
    w/o attaching the filter to the tun-file's socket. After this
    attach app may e.g clean the device by dropping the filter, it
    doesn't want to have one, or (in case of c/r) get information
    about the device with tun ioctls.
    Signed-off-by: default avatarPavel Emelyanov <xemul@parallels.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    849c9b6f
tun.c 53.8 KB