|  | /* SPDX-License-Identifier: GPL-2.0 */ | 
|  | #ifndef _LINUX_IF_TAP_H_ | 
|  | #define _LINUX_IF_TAP_H_ | 
|  |  | 
|  | #if IS_ENABLED(CONFIG_TAP) | 
|  | struct socket *tap_get_socket(struct file *); | 
|  | struct ptr_ring *tap_get_ptr_ring(struct file *file); | 
|  | #else | 
|  | #include <linux/err.h> | 
|  | #include <linux/errno.h> | 
|  | struct file; | 
|  | struct socket; | 
|  | static inline struct socket *tap_get_socket(struct file *f) | 
|  | { | 
|  | return ERR_PTR(-EINVAL); | 
|  | } | 
|  | static inline struct ptr_ring *tap_get_ptr_ring(struct file *f) | 
|  | { | 
|  | return ERR_PTR(-EINVAL); | 
|  | } | 
|  | #endif /* CONFIG_TAP */ | 
|  |  | 
|  | #include <net/sock.h> | 
|  | #include <linux/skb_array.h> | 
|  |  | 
|  | /* | 
|  | * Maximum times a tap device can be opened. This can be used to | 
|  | * configure the number of receive queue, e.g. for multiqueue virtio. | 
|  | */ | 
|  | #define MAX_TAP_QUEUES 256 | 
|  |  | 
|  | struct tap_queue; | 
|  |  | 
|  | struct tap_dev { | 
|  | struct net_device	*dev; | 
|  | u16			flags; | 
|  | /* This array tracks active taps. */ | 
|  | struct tap_queue    __rcu *taps[MAX_TAP_QUEUES]; | 
|  | /* This list tracks all taps (both enabled and disabled) */ | 
|  | struct list_head	queue_list; | 
|  | int			numvtaps; | 
|  | int			numqueues; | 
|  | netdev_features_t	tap_features; | 
|  | int			minor; | 
|  |  | 
|  | void (*update_features)(struct tap_dev *tap, netdev_features_t features); | 
|  | void (*count_tx_dropped)(struct tap_dev *tap); | 
|  | void (*count_rx_dropped)(struct tap_dev *tap); | 
|  | }; | 
|  |  | 
|  | /* | 
|  | * A tap queue is the central object of tap module, it connects | 
|  | * an open character device to virtual interface. There can be | 
|  | * multiple queues on one interface, which map back to queues | 
|  | * implemented in hardware on the underlying device. | 
|  | * | 
|  | * tap_proto is used to allocate queues through the sock allocation | 
|  | * mechanism. | 
|  | * | 
|  | */ | 
|  |  | 
|  | struct tap_queue { | 
|  | struct sock sk; | 
|  | struct socket sock; | 
|  | int vnet_hdr_sz; | 
|  | struct tap_dev __rcu *tap; | 
|  | struct file *file; | 
|  | unsigned int flags; | 
|  | u16 queue_index; | 
|  | bool enabled; | 
|  | struct list_head next; | 
|  | struct ptr_ring ring; | 
|  | }; | 
|  |  | 
|  | rx_handler_result_t tap_handle_frame(struct sk_buff **pskb); | 
|  | void tap_del_queues(struct tap_dev *tap); | 
|  | int tap_get_minor(dev_t major, struct tap_dev *tap); | 
|  | void tap_free_minor(dev_t major, struct tap_dev *tap); | 
|  | int tap_queue_resize(struct tap_dev *tap); | 
|  | int tap_create_cdev(struct cdev *tap_cdev, dev_t *tap_major, | 
|  | const char *device_name, struct module *module); | 
|  | void tap_destroy_cdev(dev_t major, struct cdev *tap_cdev); | 
|  |  | 
|  | #endif /*_LINUX_IF_TAP_H_*/ |