| 1 | /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ | 
|---|
| 2 | #ifndef _UAPI__LINUX_IF_PACKET_H | 
|---|
| 3 | #define _UAPI__LINUX_IF_PACKET_H | 
|---|
| 4 |  | 
|---|
| 5 | #include <asm/byteorder.h> | 
|---|
| 6 | #include <linux/types.h> | 
|---|
| 7 |  | 
|---|
| 8 | struct sockaddr_pkt { | 
|---|
| 9 | unsigned short spkt_family; | 
|---|
| 10 | unsigned char spkt_device[14]; | 
|---|
| 11 | __be16 spkt_protocol; | 
|---|
| 12 | }; | 
|---|
| 13 |  | 
|---|
| 14 | struct sockaddr_ll { | 
|---|
| 15 | unsigned short	sll_family; | 
|---|
| 16 | __be16		sll_protocol; | 
|---|
| 17 | int		sll_ifindex; | 
|---|
| 18 | unsigned short	sll_hatype; | 
|---|
| 19 | unsigned char	sll_pkttype; | 
|---|
| 20 | unsigned char	sll_halen; | 
|---|
| 21 | unsigned char	sll_addr[8]; | 
|---|
| 22 | }; | 
|---|
| 23 |  | 
|---|
| 24 | /* Packet types */ | 
|---|
| 25 |  | 
|---|
| 26 | #define PACKET_HOST		0		/* To us		*/ | 
|---|
| 27 | #define PACKET_BROADCAST	1		/* To all		*/ | 
|---|
| 28 | #define PACKET_MULTICAST	2		/* To group		*/ | 
|---|
| 29 | #define PACKET_OTHERHOST	3		/* To someone else 	*/ | 
|---|
| 30 | #define PACKET_OUTGOING		4		/* Outgoing of any type */ | 
|---|
| 31 | #define PACKET_LOOPBACK		5		/* MC/BRD frame looped back */ | 
|---|
| 32 | #define PACKET_USER		6		/* To user space	*/ | 
|---|
| 33 | #define PACKET_KERNEL		7		/* To kernel space	*/ | 
|---|
| 34 | /* Unused, PACKET_FASTROUTE and PACKET_LOOPBACK are invisible to user space */ | 
|---|
| 35 | #define PACKET_FASTROUTE	6		/* Fastrouted frame	*/ | 
|---|
| 36 |  | 
|---|
| 37 | /* Packet socket options */ | 
|---|
| 38 |  | 
|---|
| 39 | #define PACKET_ADD_MEMBERSHIP		1 | 
|---|
| 40 | #define PACKET_DROP_MEMBERSHIP		2 | 
|---|
| 41 | #define PACKET_RECV_OUTPUT		3 | 
|---|
| 42 | /* Value 4 is still used by obsolete turbo-packet. */ | 
|---|
| 43 | #define PACKET_RX_RING			5 | 
|---|
| 44 | #define PACKET_STATISTICS		6 | 
|---|
| 45 | #define PACKET_COPY_THRESH		7 | 
|---|
| 46 | #define PACKET_AUXDATA			8 | 
|---|
| 47 | #define PACKET_ORIGDEV			9 | 
|---|
| 48 | #define PACKET_VERSION			10 | 
|---|
| 49 | #define PACKET_HDRLEN			11 | 
|---|
| 50 | #define PACKET_RESERVE			12 | 
|---|
| 51 | #define PACKET_TX_RING			13 | 
|---|
| 52 | #define PACKET_LOSS			14 | 
|---|
| 53 | #define PACKET_VNET_HDR			15 | 
|---|
| 54 | #define PACKET_TX_TIMESTAMP		16 | 
|---|
| 55 | #define PACKET_TIMESTAMP		17 | 
|---|
| 56 | #define PACKET_FANOUT			18 | 
|---|
| 57 | #define PACKET_TX_HAS_OFF		19 | 
|---|
| 58 | #define PACKET_QDISC_BYPASS		20 | 
|---|
| 59 | #define PACKET_ROLLOVER_STATS		21 | 
|---|
| 60 | #define PACKET_FANOUT_DATA		22 | 
|---|
| 61 | #define PACKET_IGNORE_OUTGOING		23 | 
|---|
| 62 | #define PACKET_VNET_HDR_SZ		24 | 
|---|
| 63 |  | 
|---|
| 64 | #define PACKET_FANOUT_HASH		0 | 
|---|
| 65 | #define PACKET_FANOUT_LB		1 | 
|---|
| 66 | #define PACKET_FANOUT_CPU		2 | 
|---|
| 67 | #define PACKET_FANOUT_ROLLOVER		3 | 
|---|
| 68 | #define PACKET_FANOUT_RND		4 | 
|---|
| 69 | #define PACKET_FANOUT_QM		5 | 
|---|
| 70 | #define PACKET_FANOUT_CBPF		6 | 
|---|
| 71 | #define PACKET_FANOUT_EBPF		7 | 
|---|
| 72 | #define PACKET_FANOUT_FLAG_ROLLOVER	0x1000 | 
|---|
| 73 | #define PACKET_FANOUT_FLAG_UNIQUEID	0x2000 | 
|---|
| 74 | #define PACKET_FANOUT_FLAG_IGNORE_OUTGOING     0x4000 | 
|---|
| 75 | #define PACKET_FANOUT_FLAG_DEFRAG	0x8000 | 
|---|
| 76 |  | 
|---|
| 77 | struct tpacket_stats { | 
|---|
| 78 | unsigned int	tp_packets; | 
|---|
| 79 | unsigned int	tp_drops; | 
|---|
| 80 | }; | 
|---|
| 81 |  | 
|---|
| 82 | struct tpacket_stats_v3 { | 
|---|
| 83 | unsigned int	tp_packets; | 
|---|
| 84 | unsigned int	tp_drops; | 
|---|
| 85 | unsigned int	tp_freeze_q_cnt; | 
|---|
| 86 | }; | 
|---|
| 87 |  | 
|---|
| 88 | struct tpacket_rollover_stats { | 
|---|
| 89 | __aligned_u64	tp_all; | 
|---|
| 90 | __aligned_u64	tp_huge; | 
|---|
| 91 | __aligned_u64	tp_failed; | 
|---|
| 92 | }; | 
|---|
| 93 |  | 
|---|
| 94 | union tpacket_stats_u { | 
|---|
| 95 | struct tpacket_stats stats1; | 
|---|
| 96 | struct tpacket_stats_v3 stats3; | 
|---|
| 97 | }; | 
|---|
| 98 |  | 
|---|
| 99 | struct tpacket_auxdata { | 
|---|
| 100 | __u32		tp_status; | 
|---|
| 101 | __u32		tp_len; | 
|---|
| 102 | __u32		tp_snaplen; | 
|---|
| 103 | __u16		tp_mac; | 
|---|
| 104 | __u16		tp_net; | 
|---|
| 105 | __u16		tp_vlan_tci; | 
|---|
| 106 | __u16		tp_vlan_tpid; | 
|---|
| 107 | }; | 
|---|
| 108 |  | 
|---|
| 109 | /* Rx ring - header status */ | 
|---|
| 110 | #define TP_STATUS_KERNEL		      0 | 
|---|
| 111 | #define TP_STATUS_USER			(1 << 0) | 
|---|
| 112 | #define TP_STATUS_COPY			(1 << 1) | 
|---|
| 113 | #define TP_STATUS_LOSING		(1 << 2) | 
|---|
| 114 | #define TP_STATUS_CSUMNOTREADY		(1 << 3) | 
|---|
| 115 | #define TP_STATUS_VLAN_VALID		(1 << 4) /* auxdata has valid tp_vlan_tci */ | 
|---|
| 116 | #define TP_STATUS_BLK_TMO		(1 << 5) | 
|---|
| 117 | #define TP_STATUS_VLAN_TPID_VALID	(1 << 6) /* auxdata has valid tp_vlan_tpid */ | 
|---|
| 118 | #define TP_STATUS_CSUM_VALID		(1 << 7) | 
|---|
| 119 | #define TP_STATUS_GSO_TCP		(1 << 8) | 
|---|
| 120 |  | 
|---|
| 121 | /* Tx ring - header status */ | 
|---|
| 122 | #define TP_STATUS_AVAILABLE	      0 | 
|---|
| 123 | #define TP_STATUS_SEND_REQUEST	(1 << 0) | 
|---|
| 124 | #define TP_STATUS_SENDING	(1 << 1) | 
|---|
| 125 | #define TP_STATUS_WRONG_FORMAT	(1 << 2) | 
|---|
| 126 |  | 
|---|
| 127 | /* Rx and Tx ring - header status */ | 
|---|
| 128 | #define TP_STATUS_TS_SOFTWARE		(1 << 29) | 
|---|
| 129 | #define TP_STATUS_TS_SYS_HARDWARE	(1 << 30) /* deprecated, never set */ | 
|---|
| 130 | #define TP_STATUS_TS_RAW_HARDWARE	(1U << 31) | 
|---|
| 131 |  | 
|---|
| 132 | /* Rx ring - feature request bits */ | 
|---|
| 133 | #define TP_FT_REQ_FILL_RXHASH	0x1 | 
|---|
| 134 |  | 
|---|
| 135 | struct tpacket_hdr { | 
|---|
| 136 | unsigned long	tp_status; | 
|---|
| 137 | unsigned int	tp_len; | 
|---|
| 138 | unsigned int	tp_snaplen; | 
|---|
| 139 | unsigned short	tp_mac; | 
|---|
| 140 | unsigned short	tp_net; | 
|---|
| 141 | unsigned int	tp_sec; | 
|---|
| 142 | unsigned int	tp_usec; | 
|---|
| 143 | }; | 
|---|
| 144 |  | 
|---|
| 145 | #define TPACKET_ALIGNMENT	16 | 
|---|
| 146 | #define TPACKET_ALIGN(x)	(((x)+TPACKET_ALIGNMENT-1)&~(TPACKET_ALIGNMENT-1)) | 
|---|
| 147 | #define TPACKET_HDRLEN		(TPACKET_ALIGN(sizeof(struct tpacket_hdr)) + sizeof(struct sockaddr_ll)) | 
|---|
| 148 |  | 
|---|
| 149 | struct tpacket2_hdr { | 
|---|
| 150 | __u32		tp_status; | 
|---|
| 151 | __u32		tp_len; | 
|---|
| 152 | __u32		tp_snaplen; | 
|---|
| 153 | __u16		tp_mac; | 
|---|
| 154 | __u16		tp_net; | 
|---|
| 155 | __u32		tp_sec; | 
|---|
| 156 | __u32		tp_nsec; | 
|---|
| 157 | __u16		tp_vlan_tci; | 
|---|
| 158 | __u16		tp_vlan_tpid; | 
|---|
| 159 | __u8		tp_padding[4]; | 
|---|
| 160 | }; | 
|---|
| 161 |  | 
|---|
| 162 | struct tpacket_hdr_variant1 { | 
|---|
| 163 | __u32	tp_rxhash; | 
|---|
| 164 | __u32	tp_vlan_tci; | 
|---|
| 165 | __u16	tp_vlan_tpid; | 
|---|
| 166 | __u16	tp_padding; | 
|---|
| 167 | }; | 
|---|
| 168 |  | 
|---|
| 169 | struct tpacket3_hdr { | 
|---|
| 170 | __u32		tp_next_offset; | 
|---|
| 171 | __u32		tp_sec; | 
|---|
| 172 | __u32		tp_nsec; | 
|---|
| 173 | __u32		tp_snaplen; | 
|---|
| 174 | __u32		tp_len; | 
|---|
| 175 | __u32		tp_status; | 
|---|
| 176 | __u16		tp_mac; | 
|---|
| 177 | __u16		tp_net; | 
|---|
| 178 | /* pkt_hdr variants */ | 
|---|
| 179 | union { | 
|---|
| 180 | struct tpacket_hdr_variant1 hv1; | 
|---|
| 181 | }; | 
|---|
| 182 | __u8		tp_padding[8]; | 
|---|
| 183 | }; | 
|---|
| 184 |  | 
|---|
| 185 | struct tpacket_bd_ts { | 
|---|
| 186 | unsigned int ts_sec; | 
|---|
| 187 | union { | 
|---|
| 188 | unsigned int ts_usec; | 
|---|
| 189 | unsigned int ts_nsec; | 
|---|
| 190 | }; | 
|---|
| 191 | }; | 
|---|
| 192 |  | 
|---|
| 193 | struct tpacket_hdr_v1 { | 
|---|
| 194 | __u32	block_status; | 
|---|
| 195 | __u32	num_pkts; | 
|---|
| 196 | __u32	offset_to_first_pkt; | 
|---|
| 197 |  | 
|---|
| 198 | /* Number of valid bytes (including padding) | 
|---|
| 199 | * blk_len <= tp_block_size | 
|---|
| 200 | */ | 
|---|
| 201 | __u32	blk_len; | 
|---|
| 202 |  | 
|---|
| 203 | /* | 
|---|
| 204 | * Quite a few uses of sequence number: | 
|---|
| 205 | * 1. Make sure cache flush etc worked. | 
|---|
| 206 | *    Well, one can argue - why not use the increasing ts below? | 
|---|
| 207 | *    But look at 2. below first. | 
|---|
| 208 | * 2. When you pass around blocks to other user space decoders, | 
|---|
| 209 | *    you can see which blk[s] is[are] outstanding etc. | 
|---|
| 210 | * 3. Validate kernel code. | 
|---|
| 211 | */ | 
|---|
| 212 | __aligned_u64	seq_num; | 
|---|
| 213 |  | 
|---|
| 214 | /* | 
|---|
| 215 | * ts_last_pkt: | 
|---|
| 216 | * | 
|---|
| 217 | * Case 1.	Block has 'N'(N >=1) packets and TMO'd(timed out) | 
|---|
| 218 | *		ts_last_pkt == 'time-stamp of last packet' and NOT the | 
|---|
| 219 | *		time when the timer fired and the block was closed. | 
|---|
| 220 | *		By providing the ts of the last packet we can absolutely | 
|---|
| 221 | *		guarantee that time-stamp wise, the first packet in the | 
|---|
| 222 | *		next block will never precede the last packet of the | 
|---|
| 223 | *		previous block. | 
|---|
| 224 | * Case 2.	Block has zero packets and TMO'd | 
|---|
| 225 | *		ts_last_pkt = time when the timer fired and the block | 
|---|
| 226 | *		was closed. | 
|---|
| 227 | * Case 3.	Block has 'N' packets and NO TMO. | 
|---|
| 228 | *		ts_last_pkt = time-stamp of the last pkt in the block. | 
|---|
| 229 | * | 
|---|
| 230 | * ts_first_pkt: | 
|---|
| 231 | *		Is always the time-stamp when the block was opened. | 
|---|
| 232 | *		Case a)	ZERO packets | 
|---|
| 233 | *			No packets to deal with but at least you know | 
|---|
| 234 | *			the time-interval of this block. | 
|---|
| 235 | *		Case b) Non-zero packets | 
|---|
| 236 | *			Use the ts of the first packet in the block. | 
|---|
| 237 | * | 
|---|
| 238 | */ | 
|---|
| 239 | struct tpacket_bd_ts	ts_first_pkt, ts_last_pkt; | 
|---|
| 240 | }; | 
|---|
| 241 |  | 
|---|
| 242 | union  { | 
|---|
| 243 | struct tpacket_hdr_v1 ; | 
|---|
| 244 | }; | 
|---|
| 245 |  | 
|---|
| 246 | struct tpacket_block_desc { | 
|---|
| 247 | __u32 version; | 
|---|
| 248 | __u32 offset_to_priv; | 
|---|
| 249 | union tpacket_bd_header_u hdr; | 
|---|
| 250 | }; | 
|---|
| 251 |  | 
|---|
| 252 | #define TPACKET2_HDRLEN		(TPACKET_ALIGN(sizeof(struct tpacket2_hdr)) + sizeof(struct sockaddr_ll)) | 
|---|
| 253 | #define TPACKET3_HDRLEN		(TPACKET_ALIGN(sizeof(struct tpacket3_hdr)) + sizeof(struct sockaddr_ll)) | 
|---|
| 254 |  | 
|---|
| 255 | enum tpacket_versions { | 
|---|
| 256 | TPACKET_V1, | 
|---|
| 257 | TPACKET_V2, | 
|---|
| 258 | TPACKET_V3 | 
|---|
| 259 | }; | 
|---|
| 260 |  | 
|---|
| 261 | /* | 
|---|
| 262 | Frame structure: | 
|---|
| 263 |  | 
|---|
| 264 | - Start. Frame must be aligned to TPACKET_ALIGNMENT=16 | 
|---|
| 265 | - struct tpacket_hdr | 
|---|
| 266 | - pad to TPACKET_ALIGNMENT=16 | 
|---|
| 267 | - struct sockaddr_ll | 
|---|
| 268 | - Gap, chosen so that packet data (Start+tp_net) aligns to | 
|---|
| 269 | TPACKET_ALIGNMENT=16 | 
|---|
| 270 | - Start+tp_mac: [ Optional MAC header ] | 
|---|
| 271 | - Start+tp_net: Packet data, aligned to TPACKET_ALIGNMENT=16. | 
|---|
| 272 | - Pad to align to TPACKET_ALIGNMENT=16 | 
|---|
| 273 | */ | 
|---|
| 274 |  | 
|---|
| 275 | struct tpacket_req { | 
|---|
| 276 | unsigned int	tp_block_size;	/* Minimal size of contiguous block */ | 
|---|
| 277 | unsigned int	tp_block_nr;	/* Number of blocks */ | 
|---|
| 278 | unsigned int	tp_frame_size;	/* Size of frame */ | 
|---|
| 279 | unsigned int	tp_frame_nr;	/* Total number of frames */ | 
|---|
| 280 | }; | 
|---|
| 281 |  | 
|---|
| 282 | struct tpacket_req3 { | 
|---|
| 283 | unsigned int	tp_block_size;	/* Minimal size of contiguous block */ | 
|---|
| 284 | unsigned int	tp_block_nr;	/* Number of blocks */ | 
|---|
| 285 | unsigned int	tp_frame_size;	/* Size of frame */ | 
|---|
| 286 | unsigned int	tp_frame_nr;	/* Total number of frames */ | 
|---|
| 287 | unsigned int	tp_retire_blk_tov; /* timeout in msecs */ | 
|---|
| 288 | unsigned int	tp_sizeof_priv; /* offset to private data area */ | 
|---|
| 289 | unsigned int	tp_feature_req_word; | 
|---|
| 290 | }; | 
|---|
| 291 |  | 
|---|
| 292 | union tpacket_req_u { | 
|---|
| 293 | struct tpacket_req	req; | 
|---|
| 294 | struct tpacket_req3	req3; | 
|---|
| 295 | }; | 
|---|
| 296 |  | 
|---|
| 297 | struct packet_mreq { | 
|---|
| 298 | int		mr_ifindex; | 
|---|
| 299 | unsigned short	mr_type; | 
|---|
| 300 | unsigned short	mr_alen; | 
|---|
| 301 | unsigned char	mr_address[8]; | 
|---|
| 302 | }; | 
|---|
| 303 |  | 
|---|
| 304 | struct fanout_args { | 
|---|
| 305 | #if defined(__LITTLE_ENDIAN_BITFIELD) | 
|---|
| 306 | __u16		id; | 
|---|
| 307 | __u16		type_flags; | 
|---|
| 308 | #else | 
|---|
| 309 | __u16		type_flags; | 
|---|
| 310 | __u16		id; | 
|---|
| 311 | #endif | 
|---|
| 312 | __u32		max_num_members; | 
|---|
| 313 | }; | 
|---|
| 314 |  | 
|---|
| 315 | #define PACKET_MR_MULTICAST	0 | 
|---|
| 316 | #define PACKET_MR_PROMISC	1 | 
|---|
| 317 | #define PACKET_MR_ALLMULTI	2 | 
|---|
| 318 | #define PACKET_MR_UNICAST	3 | 
|---|
| 319 |  | 
|---|
| 320 | #endif | 
|---|
| 321 |  | 
|---|