xref: /linux-6.15/include/linux/if_tun.h (revision bd8a8d5e)
1c942fddfSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */
21da177e4SLinus Torvalds /*
31da177e4SLinus Torvalds  *  Universal TUN/TAP device driver.
41da177e4SLinus Torvalds  *  Copyright (C) 1999-2000 Maxim Krasnyansky <[email protected]>
51da177e4SLinus Torvalds  */
61da177e4SLinus Torvalds #ifndef __IF_TUN_H
71da177e4SLinus Torvalds #define __IF_TUN_H
81da177e4SLinus Torvalds 
9607ca46eSDavid Howells #include <uapi/linux/if_tun.h>
10fe8dd45bSJason Wang #include <uapi/linux/virtio_net.h>
11a3edb083SAl Viro 
12fc72d1d5SJason Wang #define TUN_XDP_FLAG 0x1UL
13fc72d1d5SJason Wang 
14fe8dd45bSJason Wang #define TUN_MSG_UBUF 1
15fe8dd45bSJason Wang #define TUN_MSG_PTR  2
16fe8dd45bSJason Wang struct tun_msg_ctl {
17fe8dd45bSJason Wang 	unsigned short type;
18fe8dd45bSJason Wang 	unsigned short num;
19fe8dd45bSJason Wang 	void *ptr;
20fe8dd45bSJason Wang };
21fe8dd45bSJason Wang 
22fe8dd45bSJason Wang struct tun_xdp_hdr {
23fe8dd45bSJason Wang 	int buflen;
24fe8dd45bSJason Wang 	struct virtio_net_hdr gso;
25fe8dd45bSJason Wang };
26fe8dd45bSJason Wang 
2705c2828cSMichael S. Tsirkin #if defined(CONFIG_TUN) || defined(CONFIG_TUN_MODULE)
2805c2828cSMichael S. Tsirkin struct socket *tun_get_socket(struct file *);
295990a305SJason Wang struct ptr_ring *tun_get_tx_ring(struct file *file);
30*bd8a8d5eSYunjian Wang 
tun_is_xdp_frame(void * ptr)31596b5ef4SMaciej Żenczykowski static inline bool tun_is_xdp_frame(void *ptr)
32596b5ef4SMaciej Żenczykowski {
33596b5ef4SMaciej Żenczykowski 	return (unsigned long)ptr & TUN_XDP_FLAG;
34596b5ef4SMaciej Żenczykowski }
35*bd8a8d5eSYunjian Wang 
tun_xdp_to_ptr(struct xdp_frame * xdp)36596b5ef4SMaciej Żenczykowski static inline void *tun_xdp_to_ptr(struct xdp_frame *xdp)
37596b5ef4SMaciej Żenczykowski {
38596b5ef4SMaciej Żenczykowski 	return (void *)((unsigned long)xdp | TUN_XDP_FLAG);
39596b5ef4SMaciej Żenczykowski }
40*bd8a8d5eSYunjian Wang 
tun_ptr_to_xdp(void * ptr)41596b5ef4SMaciej Żenczykowski static inline struct xdp_frame *tun_ptr_to_xdp(void *ptr)
42596b5ef4SMaciej Żenczykowski {
43596b5ef4SMaciej Żenczykowski 	return (void *)((unsigned long)ptr & ~TUN_XDP_FLAG);
44596b5ef4SMaciej Żenczykowski }
45*bd8a8d5eSYunjian Wang 
463a403076SJason Wang void tun_ptr_free(void *ptr);
4705c2828cSMichael S. Tsirkin #else
4805c2828cSMichael S. Tsirkin #include <linux/err.h>
4905c2828cSMichael S. Tsirkin #include <linux/errno.h>
5005c2828cSMichael S. Tsirkin struct file;
5105c2828cSMichael S. Tsirkin struct socket;
52*bd8a8d5eSYunjian Wang 
tun_get_socket(struct file * f)5305c2828cSMichael S. Tsirkin static inline struct socket *tun_get_socket(struct file *f)
5405c2828cSMichael S. Tsirkin {
5505c2828cSMichael S. Tsirkin 	return ERR_PTR(-EINVAL);
5605c2828cSMichael S. Tsirkin }
57*bd8a8d5eSYunjian Wang 
tun_get_tx_ring(struct file * f)585990a305SJason Wang static inline struct ptr_ring *tun_get_tx_ring(struct file *f)
5983339c6bSJason Wang {
6083339c6bSJason Wang 	return ERR_PTR(-EINVAL);
6183339c6bSJason Wang }
62*bd8a8d5eSYunjian Wang 
tun_is_xdp_frame(void * ptr)631ffcbc85SJesper Dangaard Brouer static inline bool tun_is_xdp_frame(void *ptr)
64fc72d1d5SJason Wang {
65fc72d1d5SJason Wang 	return false;
66fc72d1d5SJason Wang }
67*bd8a8d5eSYunjian Wang 
tun_xdp_to_ptr(struct xdp_frame * xdp)68b558b6c2SMaciej Żenczykowski static inline void *tun_xdp_to_ptr(struct xdp_frame *xdp)
69fc72d1d5SJason Wang {
70fc72d1d5SJason Wang 	return NULL;
71fc72d1d5SJason Wang }
72*bd8a8d5eSYunjian Wang 
tun_ptr_to_xdp(void * ptr)73b558b6c2SMaciej Żenczykowski static inline struct xdp_frame *tun_ptr_to_xdp(void *ptr)
74fc72d1d5SJason Wang {
75fc72d1d5SJason Wang 	return NULL;
76fc72d1d5SJason Wang }
77*bd8a8d5eSYunjian Wang 
tun_ptr_free(void * ptr)783a403076SJason Wang static inline void tun_ptr_free(void *ptr)
793a403076SJason Wang {
803a403076SJason Wang }
8105c2828cSMichael S. Tsirkin #endif /* CONFIG_TUN */
821da177e4SLinus Torvalds #endif /* __IF_TUN_H */
83