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