@@ -61,6 +61,17 @@ struct tpacket_stats {
61
61
unsigned int tp_drops ;
62
62
};
63
63
64
+ struct tpacket_stats_v3 {
65
+ unsigned int tp_packets ;
66
+ unsigned int tp_drops ;
67
+ unsigned int tp_freeze_q_cnt ;
68
+ };
69
+
70
+ union tpacket_stats_u {
71
+ struct tpacket_stats stats1 ;
72
+ struct tpacket_stats_v3 stats3 ;
73
+ };
74
+
64
75
struct tpacket_auxdata {
65
76
__u32 tp_status ;
66
77
__u32 tp_len ;
@@ -78,13 +89,17 @@ struct tpacket_auxdata {
78
89
#define TP_STATUS_LOSING 0x4
79
90
#define TP_STATUS_CSUMNOTREADY 0x8
80
91
#define TP_STATUS_VLAN_VALID 0x10 /* auxdata has valid tp_vlan_tci */
92
+ #define TP_STATUS_BLK_TMO 0x20
81
93
82
94
/* Tx ring - header status */
83
95
#define TP_STATUS_AVAILABLE 0x0
84
96
#define TP_STATUS_SEND_REQUEST 0x1
85
97
#define TP_STATUS_SENDING 0x2
86
98
#define TP_STATUS_WRONG_FORMAT 0x4
87
99
100
+ /* Rx ring - feature request bits */
101
+ #define TP_FT_REQ_FILL_RXHASH 0x1
102
+
88
103
struct tpacket_hdr {
89
104
unsigned long tp_status ;
90
105
unsigned int tp_len ;
@@ -111,11 +126,100 @@ struct tpacket2_hdr {
111
126
__u16 tp_padding ;
112
127
};
113
128
129
+ struct hdr_variant1 {
130
+ __u32 tp_rxhash ;
131
+ __u32 tp_vlan_tci ;
132
+ };
133
+
134
+ struct tpacket3_hdr {
135
+ __u32 tp_next_offset ;
136
+ __u32 tp_sec ;
137
+ __u32 tp_nsec ;
138
+ __u32 tp_snaplen ;
139
+ __u32 tp_len ;
140
+ __u32 tp_status ;
141
+ __u16 tp_mac ;
142
+ __u16 tp_net ;
143
+ /* pkt_hdr variants */
144
+ union {
145
+ struct hdr_variant1 hv1 ;
146
+ };
147
+ };
148
+
149
+ struct bd_ts {
150
+ unsigned int ts_sec ;
151
+ union {
152
+ unsigned int ts_usec ;
153
+ unsigned int ts_nsec ;
154
+ };
155
+ };
156
+
157
+ struct hdr_v1 {
158
+ __u32 block_status ;
159
+ __u32 num_pkts ;
160
+ __u32 offset_to_first_pkt ;
161
+
162
+ /* Number of valid bytes (including padding)
163
+ * blk_len <= tp_block_size
164
+ */
165
+ __u32 blk_len ;
166
+
167
+ /*
168
+ * Quite a few uses of sequence number:
169
+ * 1. Make sure cache flush etc worked.
170
+ * Well, one can argue - why not use the increasing ts below?
171
+ * But look at 2. below first.
172
+ * 2. When you pass around blocks to other user space decoders,
173
+ * you can see which blk[s] is[are] outstanding etc.
174
+ * 3. Validate kernel code.
175
+ */
176
+ aligned_u64 seq_num ;
177
+
178
+ /*
179
+ * ts_last_pkt:
180
+ *
181
+ * Case 1. Block has 'N'(N >=1) packets and TMO'd(timed out)
182
+ * ts_last_pkt == 'time-stamp of last packet' and NOT the
183
+ * time when the timer fired and the block was closed.
184
+ * By providing the ts of the last packet we can absolutely
185
+ * guarantee that time-stamp wise, the first packet in the
186
+ * next block will never precede the last packet of the
187
+ * previous block.
188
+ * Case 2. Block has zero packets and TMO'd
189
+ * ts_last_pkt = time when the timer fired and the block
190
+ * was closed.
191
+ * Case 3. Block has 'N' packets and NO TMO.
192
+ * ts_last_pkt = time-stamp of the last pkt in the block.
193
+ *
194
+ * ts_first_pkt:
195
+ * Is always the time-stamp when the block was opened.
196
+ * Case a) ZERO packets
197
+ * No packets to deal with but atleast you know the
198
+ * time-interval of this block.
199
+ * Case b) Non-zero packets
200
+ * Use the ts of the first packet in the block.
201
+ *
202
+ */
203
+ struct bd_ts ts_first_pkt , ts_last_pkt ;
204
+ };
205
+
206
+ union bd_header_u {
207
+ struct hdr_v1 bh1 ;
208
+ };
209
+
210
+ struct block_desc {
211
+ __u32 version ;
212
+ __u32 offset_to_priv ;
213
+ union bd_header_u hdr ;
214
+ };
215
+
114
216
#define TPACKET2_HDRLEN (TPACKET_ALIGN(sizeof(struct tpacket2_hdr)) + sizeof(struct sockaddr_ll))
217
+ #define TPACKET3_HDRLEN (TPACKET_ALIGN(sizeof(struct tpacket3_hdr)) + sizeof(struct sockaddr_ll))
115
218
116
219
enum tpacket_versions {
117
220
TPACKET_V1 ,
118
221
TPACKET_V2 ,
222
+ TPACKET_V3
119
223
};
120
224
121
225
/*
@@ -138,6 +242,21 @@ struct tpacket_req {
138
242
unsigned int tp_frame_nr ; /* Total number of frames */
139
243
};
140
244
245
+ struct tpacket_req3 {
246
+ unsigned int tp_block_size ; /* Minimal size of contiguous block */
247
+ unsigned int tp_block_nr ; /* Number of blocks */
248
+ unsigned int tp_frame_size ; /* Size of frame */
249
+ unsigned int tp_frame_nr ; /* Total number of frames */
250
+ unsigned int tp_retire_blk_tov ; /* timeout in msecs */
251
+ unsigned int tp_sizeof_priv ; /* offset to private data area */
252
+ unsigned int tp_feature_req_word ;
253
+ };
254
+
255
+ union tpacket_req_u {
256
+ struct tpacket_req req ;
257
+ struct tpacket_req3 req3 ;
258
+ };
259
+
141
260
struct packet_mreq {
142
261
int mr_ifindex ;
143
262
unsigned short mr_type ;
0 commit comments