1/* SPDX-License-Identifier: GPL-2.0-or-later */
2/*
3 *  Universal TUN/TAP device driver.
4 *  Copyright (C) 1999-2000 Maxim Krasnyansky <max_mk@yahoo.com>
5 */
6#ifndef __IF_TUN_H
7#define __IF_TUN_H
8
9#include <uapi/linux/if_tun.h>
10#include <uapi/linux/virtio_net.h>
11
12#define TUN_XDP_FLAG 0x1UL
13
14#define TUN_MSG_UBUF 1
15#define TUN_MSG_PTR  2
16struct tun_msg_ctl {
17	unsigned short type;
18	unsigned short num;
19	void *ptr;
20};
21
22struct tun_xdp_hdr {
23	int buflen;
24	struct virtio_net_hdr gso;
25};
26
27#if defined(CONFIG_TUN) || defined(CONFIG_TUN_MODULE)
28struct socket *tun_get_socket(struct file *);
29struct ptr_ring *tun_get_tx_ring(struct file *file);
30
31static inline bool tun_is_xdp_frame(void *ptr)
32{
33	return (unsigned long)ptr & TUN_XDP_FLAG;
34}
35
36static inline void *tun_xdp_to_ptr(struct xdp_frame *xdp)
37{
38	return (void *)((unsigned long)xdp | TUN_XDP_FLAG);
39}
40
41static inline struct xdp_frame *tun_ptr_to_xdp(void *ptr)
42{
43	return (void *)((unsigned long)ptr & ~TUN_XDP_FLAG);
44}
45
46void tun_ptr_free(void *ptr);
47#else
48#include <linux/err.h>
49#include <linux/errno.h>
50struct file;
51struct socket;
52
53static inline struct socket *tun_get_socket(struct file *f)
54{
55	return ERR_PTR(-EINVAL);
56}
57
58static inline struct ptr_ring *tun_get_tx_ring(struct file *f)
59{
60	return ERR_PTR(-EINVAL);
61}
62
63static inline bool tun_is_xdp_frame(void *ptr)
64{
65	return false;
66}
67
68static inline void *tun_xdp_to_ptr(struct xdp_frame *xdp)
69{
70	return NULL;
71}
72
73static inline struct xdp_frame *tun_ptr_to_xdp(void *ptr)
74{
75	return NULL;
76}
77
78static inline void tun_ptr_free(void *ptr)
79{
80}
81#endif /* CONFIG_TUN */
82#endif /* __IF_TUN_H */
83