@@ -61,6 +61,17 @@ struct tpacket_stats {
6161 unsigned int tp_drops ;
6262};
6363
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+
6475struct tpacket_auxdata {
6576 __u32 tp_status ;
6677 __u32 tp_len ;
@@ -78,13 +89,17 @@ struct tpacket_auxdata {
7889#define TP_STATUS_LOSING 0x4
7990#define TP_STATUS_CSUMNOTREADY 0x8
8091#define TP_STATUS_VLAN_VALID 0x10 /* auxdata has valid tp_vlan_tci */
92+ #define TP_STATUS_BLK_TMO 0x20
8193
8294/* Tx ring - header status */
8395#define TP_STATUS_AVAILABLE 0x0
8496#define TP_STATUS_SEND_REQUEST 0x1
8597#define TP_STATUS_SENDING 0x2
8698#define TP_STATUS_WRONG_FORMAT 0x4
8799
100+ /* Rx ring - feature request bits */
101+ #define TP_FT_REQ_FILL_RXHASH 0x1
102+
88103struct tpacket_hdr {
89104 unsigned long tp_status ;
90105 unsigned int tp_len ;
@@ -111,11 +126,100 @@ struct tpacket2_hdr {
111126 __u16 tp_padding ;
112127};
113128
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+
114216#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))
115218
116219enum tpacket_versions {
117220 TPACKET_V1 ,
118221 TPACKET_V2 ,
222+ TPACKET_V3
119223};
120224
121225/*
@@ -138,6 +242,21 @@ struct tpacket_req {
138242 unsigned int tp_frame_nr ; /* Total number of frames */
139243};
140244
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+
141260struct packet_mreq {
142261 int mr_ifindex ;
143262 unsigned short mr_type ;
0 commit comments