xref: /openbmc/linux/include/linux/if_tun.h (revision 596b5ef4)
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 <max_mk@yahoo.com>
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);
tun_is_xdp_frame(void * ptr)30596b5ef4SMaciej Żenczykowski static inline bool tun_is_xdp_frame(void *ptr)
31596b5ef4SMaciej Żenczykowski {
32596b5ef4SMaciej Żenczykowski        return (unsigned long)ptr & TUN_XDP_FLAG;
33596b5ef4SMaciej Żenczykowski }
tun_xdp_to_ptr(struct xdp_frame * xdp)34596b5ef4SMaciej Żenczykowski static inline void *tun_xdp_to_ptr(struct xdp_frame *xdp)
35596b5ef4SMaciej Żenczykowski {
36596b5ef4SMaciej Żenczykowski        return (void *)((unsigned long)xdp | TUN_XDP_FLAG);
37596b5ef4SMaciej Żenczykowski }
tun_ptr_to_xdp(void * ptr)38596b5ef4SMaciej Żenczykowski static inline struct xdp_frame *tun_ptr_to_xdp(void *ptr)
39596b5ef4SMaciej Żenczykowski {
40596b5ef4SMaciej Żenczykowski        return (void *)((unsigned long)ptr & ~TUN_XDP_FLAG);
41596b5ef4SMaciej Żenczykowski }
423a403076SJason Wang void tun_ptr_free(void *ptr);
4305c2828cSMichael S. Tsirkin #else
4405c2828cSMichael S. Tsirkin #include <linux/err.h>
4505c2828cSMichael S. Tsirkin #include <linux/errno.h>
4605c2828cSMichael S. Tsirkin struct file;
4705c2828cSMichael S. Tsirkin struct socket;
tun_get_socket(struct file * f)4805c2828cSMichael S. Tsirkin static inline struct socket *tun_get_socket(struct file *f)
4905c2828cSMichael S. Tsirkin {
5005c2828cSMichael S. Tsirkin 	return ERR_PTR(-EINVAL);
5105c2828cSMichael S. Tsirkin }
tun_get_tx_ring(struct file * f)525990a305SJason Wang static inline struct ptr_ring *tun_get_tx_ring(struct file *f)
5383339c6bSJason Wang {
5483339c6bSJason Wang 	return ERR_PTR(-EINVAL);
5583339c6bSJason Wang }
tun_is_xdp_frame(void * ptr)561ffcbc85SJesper Dangaard Brouer static inline bool tun_is_xdp_frame(void *ptr)
57fc72d1d5SJason Wang {
58fc72d1d5SJason Wang 	return false;
59fc72d1d5SJason Wang }
tun_xdp_to_ptr(struct xdp_frame * xdp)60b558b6c2SMaciej Żenczykowski static inline void *tun_xdp_to_ptr(struct xdp_frame *xdp)
61fc72d1d5SJason Wang {
62fc72d1d5SJason Wang 	return NULL;
63fc72d1d5SJason Wang }
tun_ptr_to_xdp(void * ptr)64b558b6c2SMaciej Żenczykowski static inline struct xdp_frame *tun_ptr_to_xdp(void *ptr)
65fc72d1d5SJason Wang {
66fc72d1d5SJason Wang 	return NULL;
67fc72d1d5SJason Wang }
tun_ptr_free(void * ptr)683a403076SJason Wang static inline void tun_ptr_free(void *ptr)
693a403076SJason Wang {
703a403076SJason Wang }
7105c2828cSMichael S. Tsirkin #endif /* CONFIG_TUN */
721da177e4SLinus Torvalds #endif /* __IF_TUN_H */
73