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 Żenczykowskistatic 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 Żenczykowskistatic 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 Żenczykowskistatic 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. Tsirkinstatic 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 Wangstatic 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 Brouerstatic 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 Żenczykowskistatic 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 Żenczykowskistatic 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 Wangstatic inline void tun_ptr_free(void *ptr) 793a403076SJason Wang { 803a403076SJason Wang } 8105c2828cSMichael S. Tsirkin #endif /* CONFIG_TUN */ 821da177e4SLinus Torvalds #endif /* __IF_TUN_H */ 83