Commit | Line | Data |
---|---|---|
b2441318 | 1 | /* SPDX-License-Identifier: GPL-2.0 */ |
635b8c8e SG |
2 | #ifndef _LINUX_IF_TAP_H_ |
3 | #define _LINUX_IF_TAP_H_ | |
4 | ||
9a393b5d | 5 | #if IS_ENABLED(CONFIG_TAP) |
635b8c8e | 6 | struct socket *tap_get_socket(struct file *); |
5990a305 | 7 | struct ptr_ring *tap_get_ptr_ring(struct file *file); |
635b8c8e SG |
8 | #else |
9 | #include <linux/err.h> | |
10 | #include <linux/errno.h> | |
11 | struct file; | |
12 | struct socket; | |
13 | static inline struct socket *tap_get_socket(struct file *f) | |
14 | { | |
15 | return ERR_PTR(-EINVAL); | |
16 | } | |
5990a305 | 17 | static inline struct ptr_ring *tap_get_ptr_ring(struct file *f) |
49f96fd0 JW |
18 | { |
19 | return ERR_PTR(-EINVAL); | |
20 | } | |
9a393b5d | 21 | #endif /* CONFIG_TAP */ |
635b8c8e | 22 | |
6fe3faf8 SG |
23 | #include <net/sock.h> |
24 | #include <linux/skb_array.h> | |
25 | ||
88ca59d1 GM |
26 | /* |
27 | * Maximum times a tap device can be opened. This can be used to | |
28 | * configure the number of receive queue, e.g. for multiqueue virtio. | |
29 | */ | |
6fe3faf8 SG |
30 | #define MAX_TAP_QUEUES 256 |
31 | ||
32 | struct tap_queue; | |
33 | ||
34 | struct tap_dev { | |
35 | struct net_device *dev; | |
36 | u16 flags; | |
37 | /* This array tracks active taps. */ | |
38 | struct tap_queue __rcu *taps[MAX_TAP_QUEUES]; | |
39 | /* This list tracks all taps (both enabled and disabled) */ | |
40 | struct list_head queue_list; | |
41 | int numvtaps; | |
42 | int numqueues; | |
43 | netdev_features_t tap_features; | |
44 | int minor; | |
45 | ||
46 | void (*update_features)(struct tap_dev *tap, netdev_features_t features); | |
47 | void (*count_tx_dropped)(struct tap_dev *tap); | |
48 | void (*count_rx_dropped)(struct tap_dev *tap); | |
49 | }; | |
50 | ||
51 | /* | |
52 | * A tap queue is the central object of tap module, it connects | |
53 | * an open character device to virtual interface. There can be | |
54 | * multiple queues on one interface, which map back to queues | |
55 | * implemented in hardware on the underlying device. | |
56 | * | |
57 | * tap_proto is used to allocate queues through the sock allocation | |
58 | * mechanism. | |
59 | * | |
60 | */ | |
61 | ||
62 | struct tap_queue { | |
63 | struct sock sk; | |
64 | struct socket sock; | |
6fe3faf8 SG |
65 | int vnet_hdr_sz; |
66 | struct tap_dev __rcu *tap; | |
67 | struct file *file; | |
68 | unsigned int flags; | |
69 | u16 queue_index; | |
70 | bool enabled; | |
71 | struct list_head next; | |
5990a305 | 72 | struct ptr_ring ring; |
6fe3faf8 SG |
73 | }; |
74 | ||
635b8c8e | 75 | rx_handler_result_t tap_handle_frame(struct sk_buff **pskb); |
6fe3faf8 | 76 | void tap_del_queues(struct tap_dev *tap); |
d9f1f61c SG |
77 | int tap_get_minor(dev_t major, struct tap_dev *tap); |
78 | void tap_free_minor(dev_t major, struct tap_dev *tap); | |
6fe3faf8 | 79 | int tap_queue_resize(struct tap_dev *tap); |
dea6e19f GM |
80 | int tap_create_cdev(struct cdev *tap_cdev, dev_t *tap_major, |
81 | const char *device_name, struct module *module); | |
ebc05ba7 | 82 | void tap_destroy_cdev(dev_t major, struct cdev *tap_cdev); |
635b8c8e SG |
83 | |
84 | #endif /*_LINUX_IF_TAP_H_*/ |