Skip to content

Commit 0d4691c

Browse files
chetan lokedavem330
authored andcommitted
af-packet: Added TPACKET_V3 headers.
Added TPACKET_V3 definitions. Signed-off-by: Chetan Loke <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 44331fe commit 0d4691c

File tree

1 file changed

+119
-0
lines changed

1 file changed

+119
-0
lines changed

include/linux/if_packet.h

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
6475
struct 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+
88103
struct 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

116219
enum 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+
141260
struct packet_mreq {
142261
int mr_ifindex;
143262
unsigned short mr_type;

0 commit comments

Comments
 (0)