xref: /openbmc/linux/include/linux/if_tap.h (revision 5f10376b)
1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
2635b8c8eSSainath Grandhi #ifndef _LINUX_IF_TAP_H_
3635b8c8eSSainath Grandhi #define _LINUX_IF_TAP_H_
4635b8c8eSSainath Grandhi 
5*5f10376bSJakub Kicinski #include <net/sock.h>
6*5f10376bSJakub Kicinski #include <linux/skb_array.h>
7*5f10376bSJakub Kicinski 
8*5f10376bSJakub Kicinski struct file;
9*5f10376bSJakub Kicinski struct socket;
10*5f10376bSJakub Kicinski 
119a393b5dSSainath Grandhi #if IS_ENABLED(CONFIG_TAP)
12635b8c8eSSainath Grandhi struct socket *tap_get_socket(struct file *);
135990a305SJason Wang struct ptr_ring *tap_get_ptr_ring(struct file *file);
14635b8c8eSSainath Grandhi #else
15635b8c8eSSainath Grandhi #include <linux/err.h>
16635b8c8eSSainath Grandhi #include <linux/errno.h>
tap_get_socket(struct file * f)17635b8c8eSSainath Grandhi static inline struct socket *tap_get_socket(struct file *f)
18635b8c8eSSainath Grandhi {
19635b8c8eSSainath Grandhi 	return ERR_PTR(-EINVAL);
20635b8c8eSSainath Grandhi }
tap_get_ptr_ring(struct file * f)215990a305SJason Wang static inline struct ptr_ring *tap_get_ptr_ring(struct file *f)
2249f96fd0SJason Wang {
2349f96fd0SJason Wang 	return ERR_PTR(-EINVAL);
2449f96fd0SJason Wang }
259a393b5dSSainath Grandhi #endif /* CONFIG_TAP */
26635b8c8eSSainath Grandhi 
2788ca59d1SGirish Moodalbail /*
2888ca59d1SGirish Moodalbail  * Maximum times a tap device can be opened. This can be used to
2988ca59d1SGirish Moodalbail  * configure the number of receive queue, e.g. for multiqueue virtio.
3088ca59d1SGirish Moodalbail  */
316fe3faf8SSainath Grandhi #define MAX_TAP_QUEUES 256
326fe3faf8SSainath Grandhi 
336fe3faf8SSainath Grandhi struct tap_queue;
346fe3faf8SSainath Grandhi 
356fe3faf8SSainath Grandhi struct tap_dev {
366fe3faf8SSainath Grandhi 	struct net_device	*dev;
376fe3faf8SSainath Grandhi 	u16			flags;
386fe3faf8SSainath Grandhi 	/* This array tracks active taps. */
396fe3faf8SSainath Grandhi 	struct tap_queue    __rcu *taps[MAX_TAP_QUEUES];
406fe3faf8SSainath Grandhi 	/* This list tracks all taps (both enabled and disabled) */
416fe3faf8SSainath Grandhi 	struct list_head	queue_list;
426fe3faf8SSainath Grandhi 	int			numvtaps;
436fe3faf8SSainath Grandhi 	int			numqueues;
446fe3faf8SSainath Grandhi 	netdev_features_t	tap_features;
456fe3faf8SSainath Grandhi 	int			minor;
466fe3faf8SSainath Grandhi 
476fe3faf8SSainath Grandhi 	void (*update_features)(struct tap_dev *tap, netdev_features_t features);
486fe3faf8SSainath Grandhi 	void (*count_tx_dropped)(struct tap_dev *tap);
496fe3faf8SSainath Grandhi 	void (*count_rx_dropped)(struct tap_dev *tap);
506fe3faf8SSainath Grandhi };
516fe3faf8SSainath Grandhi 
526fe3faf8SSainath Grandhi /*
536fe3faf8SSainath Grandhi  * A tap queue is the central object of tap module, it connects
546fe3faf8SSainath Grandhi  * an open character device to virtual interface. There can be
556fe3faf8SSainath Grandhi  * multiple queues on one interface, which map back to queues
566fe3faf8SSainath Grandhi  * implemented in hardware on the underlying device.
576fe3faf8SSainath Grandhi  *
586fe3faf8SSainath Grandhi  * tap_proto is used to allocate queues through the sock allocation
596fe3faf8SSainath Grandhi  * mechanism.
606fe3faf8SSainath Grandhi  *
616fe3faf8SSainath Grandhi  */
626fe3faf8SSainath Grandhi 
636fe3faf8SSainath Grandhi struct tap_queue {
646fe3faf8SSainath Grandhi 	struct sock sk;
656fe3faf8SSainath Grandhi 	struct socket sock;
666fe3faf8SSainath Grandhi 	int vnet_hdr_sz;
676fe3faf8SSainath Grandhi 	struct tap_dev __rcu *tap;
686fe3faf8SSainath Grandhi 	struct file *file;
696fe3faf8SSainath Grandhi 	unsigned int flags;
706fe3faf8SSainath Grandhi 	u16 queue_index;
716fe3faf8SSainath Grandhi 	bool enabled;
726fe3faf8SSainath Grandhi 	struct list_head next;
735990a305SJason Wang 	struct ptr_ring ring;
746fe3faf8SSainath Grandhi };
756fe3faf8SSainath Grandhi 
76635b8c8eSSainath Grandhi rx_handler_result_t tap_handle_frame(struct sk_buff **pskb);
776fe3faf8SSainath Grandhi void tap_del_queues(struct tap_dev *tap);
78d9f1f61cSSainath Grandhi int tap_get_minor(dev_t major, struct tap_dev *tap);
79d9f1f61cSSainath Grandhi void tap_free_minor(dev_t major, struct tap_dev *tap);
806fe3faf8SSainath Grandhi int tap_queue_resize(struct tap_dev *tap);
81dea6e19fSGirish Moodalbail int tap_create_cdev(struct cdev *tap_cdev, dev_t *tap_major,
82dea6e19fSGirish Moodalbail 		    const char *device_name, struct module *module);
83ebc05ba7SSainath Grandhi void tap_destroy_cdev(dev_t major, struct cdev *tap_cdev);
84635b8c8eSSainath Grandhi 
85635b8c8eSSainath Grandhi #endif /*_LINUX_IF_TAP_H_*/
86