1 | /* SPDX-License-Identifier: GPL-2.0 */ |
2 | /* |
3 | * Copyright (C) 2002 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com) |
4 | */ |
5 | |
6 | #ifndef __UM_VECTOR_KERN_H |
7 | #define __UM_VECTOR_KERN_H |
8 | |
9 | #include <linux/netdevice.h> |
10 | #include <linux/platform_device.h> |
11 | #include <linux/skbuff.h> |
12 | #include <linux/socket.h> |
13 | #include <linux/list.h> |
14 | #include <linux/ctype.h> |
15 | #include <linux/workqueue.h> |
16 | #include <linux/interrupt.h> |
17 | |
18 | #include "vector_user.h" |
19 | |
20 | /* Queue structure specially adapted for multiple enqueue/dequeue |
21 | * in a mmsgrecv/mmsgsend context |
22 | */ |
23 | |
24 | /* Dequeue method */ |
25 | |
26 | #define QUEUE_SENDMSG 0 |
27 | #define QUEUE_SENDMMSG 1 |
28 | |
29 | #define VECTOR_RX 1 |
30 | #define VECTOR_TX (1 << 1) |
31 | #define VECTOR_BPF (1 << 2) |
32 | #define VECTOR_QDISC_BYPASS (1 << 3) |
33 | #define VECTOR_BPF_FLASH (1 << 4) |
34 | |
35 | #define ETH_MAX_PACKET 1500 |
36 | #define 32 /* just in case someone decides to go mad on QnQ */ |
37 | |
38 | #define MAX_FILTER_PROG (2 << 16) |
39 | |
40 | struct vector_queue { |
41 | struct mmsghdr *mmsg_vector; |
42 | void **skbuff_vector; |
43 | /* backlink to device which owns us */ |
44 | struct net_device *dev; |
45 | spinlock_t head_lock; |
46 | spinlock_t tail_lock; |
47 | int queue_depth, head, tail, max_depth, max_iov_frags; |
48 | short options; |
49 | }; |
50 | |
51 | struct vector_estats { |
52 | uint64_t rx_queue_max; |
53 | uint64_t rx_queue_running_average; |
54 | uint64_t tx_queue_max; |
55 | uint64_t tx_queue_running_average; |
56 | uint64_t rx_encaps_errors; |
57 | uint64_t tx_timeout_count; |
58 | uint64_t tx_restart_queue; |
59 | uint64_t tx_kicks; |
60 | uint64_t tx_flow_control_xon; |
61 | uint64_t tx_flow_control_xoff; |
62 | uint64_t rx_csum_offload_good; |
63 | uint64_t rx_csum_offload_errors; |
64 | uint64_t sg_ok; |
65 | uint64_t sg_linearized; |
66 | }; |
67 | |
68 | #define -1 |
69 | #define 0 |
70 | #define VERIFY_CSUM_OK 1 |
71 | |
72 | struct vector_private { |
73 | struct list_head list; |
74 | spinlock_t lock; |
75 | struct net_device *dev; |
76 | struct napi_struct napi ____cacheline_aligned; |
77 | |
78 | int unit; |
79 | |
80 | /* Timeout timer in TX */ |
81 | |
82 | struct timer_list tl; |
83 | |
84 | /* Scheduled "remove device" work */ |
85 | struct work_struct reset_tx; |
86 | struct vector_fds *fds; |
87 | |
88 | struct vector_queue *rx_queue; |
89 | struct vector_queue *tx_queue; |
90 | |
91 | int rx_irq; |
92 | int tx_irq; |
93 | |
94 | struct arglist *parsed; |
95 | |
96 | void *transport_data; /* transport specific params if needed */ |
97 | |
98 | int max_packet; |
99 | int req_size; /* different from max packet - used for TSO */ |
100 | int headroom; |
101 | |
102 | int options; |
103 | |
104 | /* remote address if any - some transports will leave this as null */ |
105 | |
106 | int ; |
107 | int ; |
108 | int coalesce; |
109 | |
110 | void *; |
111 | void *; |
112 | |
113 | int (*)(uint8_t *, |
114 | struct sk_buff *skb, struct vector_private *vp); |
115 | int (*)(uint8_t *, |
116 | struct sk_buff *skb, struct vector_private *vp); |
117 | |
118 | spinlock_t stats_lock; |
119 | |
120 | bool rexmit_scheduled; |
121 | bool opened; |
122 | bool in_write_poll; |
123 | bool in_error; |
124 | |
125 | /* guest allowed to use ethtool flash to load bpf */ |
126 | bool bpf_via_flash; |
127 | |
128 | /* ethtool stats */ |
129 | |
130 | struct vector_estats estats; |
131 | struct sock_fprog *bpf; |
132 | |
133 | char user[]; |
134 | }; |
135 | |
136 | extern int build_transport_data(struct vector_private *vp); |
137 | |
138 | #endif |
139 | |