2012-10-13 17:46:48 +08:00
|
|
|
/*
|
|
|
|
* Universal TUN/TAP device driver.
|
|
|
|
* Copyright (C) 1999-2000 Maxim Krasnyansky <max_mk@yahoo.com>
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
|
|
* (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef _UAPI__IF_TUN_H
|
|
|
|
#define _UAPI__IF_TUN_H
|
|
|
|
|
|
|
|
#include <linux/types.h>
|
|
|
|
#include <linux/if_ether.h>
|
|
|
|
#include <linux/filter.h>
|
|
|
|
|
|
|
|
/* Read queue size */
|
|
|
|
#define TUN_READQ_SIZE 500
|
2014-11-19 20:44:40 +08:00
|
|
|
/* TUN device type flags: deprecated. Use IFF_TUN/IFF_TAP instead. */
|
|
|
|
#define TUN_TUN_DEV IFF_TUN
|
|
|
|
#define TUN_TAP_DEV IFF_TAP
|
2012-10-13 17:46:48 +08:00
|
|
|
#define TUN_TYPE_MASK 0x000f
|
|
|
|
|
|
|
|
/* Ioctl defines */
|
|
|
|
#define TUNSETNOCSUM _IOW('T', 200, int)
|
|
|
|
#define TUNSETDEBUG _IOW('T', 201, int)
|
|
|
|
#define TUNSETIFF _IOW('T', 202, int)
|
|
|
|
#define TUNSETPERSIST _IOW('T', 203, int)
|
|
|
|
#define TUNSETOWNER _IOW('T', 204, int)
|
|
|
|
#define TUNSETLINK _IOW('T', 205, int)
|
|
|
|
#define TUNSETGROUP _IOW('T', 206, int)
|
|
|
|
#define TUNGETFEATURES _IOR('T', 207, unsigned int)
|
|
|
|
#define TUNSETOFFLOAD _IOW('T', 208, unsigned int)
|
|
|
|
#define TUNSETTXFILTER _IOW('T', 209, unsigned int)
|
|
|
|
#define TUNGETIFF _IOR('T', 210, unsigned int)
|
|
|
|
#define TUNGETSNDBUF _IOR('T', 211, int)
|
|
|
|
#define TUNSETSNDBUF _IOW('T', 212, int)
|
|
|
|
#define TUNATTACHFILTER _IOW('T', 213, struct sock_fprog)
|
|
|
|
#define TUNDETACHFILTER _IOW('T', 214, struct sock_fprog)
|
|
|
|
#define TUNGETVNETHDRSZ _IOR('T', 215, int)
|
|
|
|
#define TUNSETVNETHDRSZ _IOW('T', 216, int)
|
2012-11-01 03:46:01 +08:00
|
|
|
#define TUNSETQUEUE _IOW('T', 217, int)
|
tun: Add ability to create tun device with given index
Tun devices cannot be created with ifidex user wants, but it's
required by checkpoint-restore project.
Long time ago such ability was implemented for rtnl_ops-based
interface for creating links (9c7dafbf net: Allow to create links
with given ifindex), but the only API for creating and managing
tuntap devices is ioctl-based and is evolving with adding new ones
(cde8b15f tuntap: add ioctl to attach or detach a file form tuntap
device).
Following that trend, here's how a new ioctl that sets the ifindex
for device, that _will_ be created by TUNSETIFF ioctl looks like.
So those who want a tuntap device with the ifindex N, should open
the tun device, call ioctl(fd, TUNSETIFINDEX, &N), then call TUNSETIFF.
If the index N is busy, then the register_netdev will find this out
and the ioctl would be failed with -EBUSY.
If setifindex is not called, then it will be generated as before.
Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
2013-08-21 18:31:38 +08:00
|
|
|
#define TUNSETIFINDEX _IOW('T', 218, unsigned int)
|
2013-08-21 18:32:39 +08:00
|
|
|
#define TUNGETFILTER _IOR('T', 219, struct sock_fprog)
|
2014-12-16 21:05:01 +08:00
|
|
|
#define TUNSETVNETLE _IOW('T', 220, int)
|
|
|
|
#define TUNGETVNETLE _IOR('T', 221, int)
|
2015-04-24 20:50:36 +08:00
|
|
|
/* The TUNSETVNETBE and TUNGETVNETBE ioctls are for cross-endian support on
|
|
|
|
* little-endian hosts. Not all kernel configurations support them, but all
|
|
|
|
* configurations that support SET also support GET.
|
|
|
|
*/
|
|
|
|
#define TUNSETVNETBE _IOW('T', 222, int)
|
|
|
|
#define TUNGETVNETBE _IOR('T', 223, int)
|
2012-10-13 17:46:48 +08:00
|
|
|
|
|
|
|
/* TUNSETIFF ifr flags */
|
|
|
|
#define IFF_TUN 0x0001
|
|
|
|
#define IFF_TAP 0x0002
|
|
|
|
#define IFF_NO_PI 0x1000
|
2012-12-03 18:07:14 +08:00
|
|
|
/* This flag has no real effect */
|
2012-10-13 17:46:48 +08:00
|
|
|
#define IFF_ONE_QUEUE 0x2000
|
|
|
|
#define IFF_VNET_HDR 0x4000
|
|
|
|
#define IFF_TUN_EXCL 0x8000
|
2012-11-01 03:45:59 +08:00
|
|
|
#define IFF_MULTI_QUEUE 0x0100
|
2012-11-01 03:46:01 +08:00
|
|
|
#define IFF_ATTACH_QUEUE 0x0200
|
|
|
|
#define IFF_DETACH_QUEUE 0x0400
|
2013-06-11 18:41:24 +08:00
|
|
|
/* read-only flag */
|
|
|
|
#define IFF_PERSIST 0x0800
|
tun: Allow to skip filter on attach
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: Pavel Emelyanov <xemul@parallels.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
2013-08-21 18:32:21 +08:00
|
|
|
#define IFF_NOFILTER 0x1000
|
2012-10-13 17:46:48 +08:00
|
|
|
|
2013-07-20 01:40:10 +08:00
|
|
|
/* Socket options */
|
|
|
|
#define TUN_TX_TIMESTAMP 1
|
|
|
|
|
2012-10-13 17:46:48 +08:00
|
|
|
/* Features for GSO (TUNSETOFFLOAD). */
|
|
|
|
#define TUN_F_CSUM 0x01 /* You can hand me unchecksummed packets. */
|
|
|
|
#define TUN_F_TSO4 0x02 /* I can handle TSO for IPv4 packets */
|
|
|
|
#define TUN_F_TSO6 0x04 /* I can handle TSO for IPv6 packets */
|
|
|
|
#define TUN_F_TSO_ECN 0x08 /* I can handle TSO with ECN bits. */
|
|
|
|
#define TUN_F_UFO 0x10 /* I can handle UFO packets */
|
|
|
|
|
|
|
|
/* Protocol info prepended to the packets (when IFF_NO_PI is not set) */
|
|
|
|
#define TUN_PKT_STRIP 0x0001
|
|
|
|
struct tun_pi {
|
|
|
|
__u16 flags;
|
|
|
|
__be16 proto;
|
|
|
|
};
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Filter spec (used for SETXXFILTER ioctls)
|
|
|
|
* This stuff is applicable only to the TAP (Ethernet) devices.
|
|
|
|
* If the count is zero the filter is disabled and the driver accepts
|
|
|
|
* all packets (promisc mode).
|
|
|
|
* If the filter is enabled in order to accept broadcast packets
|
|
|
|
* broadcast addr must be explicitly included in the addr list.
|
|
|
|
*/
|
|
|
|
#define TUN_FLT_ALLMULTI 0x0001 /* Accept all multicast packets */
|
|
|
|
struct tun_filter {
|
|
|
|
__u16 flags; /* TUN_FLT_ flags see above */
|
|
|
|
__u16 count; /* Number of addresses */
|
|
|
|
__u8 addr[0][ETH_ALEN];
|
|
|
|
};
|
|
|
|
|
|
|
|
#endif /* _UAPI__IF_TUN_H */
|