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 Żenczykowskistatic 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 Żenczykowskistatic 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 Żenczykowskistatic 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. Tsirkinstatic 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 Wangstatic 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 Brouerstatic 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 Żenczykowskistatic 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 Żenczykowskistatic inline struct xdp_frame *tun_ptr_to_xdp(void *ptr) 65fc72d1d5SJason Wang { 66fc72d1d5SJason Wang return NULL; 67fc72d1d5SJason Wang } tun_ptr_free(void * ptr)683a403076SJason Wangstatic inline void tun_ptr_free(void *ptr) 693a403076SJason Wang { 703a403076SJason Wang } 7105c2828cSMichael S. Tsirkin #endif /* CONFIG_TUN */ 721da177e4SLinus Torvalds #endif /* __IF_TUN_H */ 73