linux-headers (unknown)

(root)/
include/
linux/
if_packet.h
       1  /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
       2  #ifndef __LINUX_IF_PACKET_H
       3  #define __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 atleast you know the
     234  	 *			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 tpacket_bd_header_u {
     243  	struct tpacket_hdr_v1 bh1;
     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) alignes to TPACKET_ALIGNMENT=16
     269     - Start+tp_mac: [ Optional MAC header ]
     270     - Start+tp_net: Packet data, aligned to TPACKET_ALIGNMENT=16.
     271     - Pad to align to TPACKET_ALIGNMENT=16
     272   */
     273  
     274  struct tpacket_req {
     275  	unsigned int	tp_block_size;	/* Minimal size of contiguous block */
     276  	unsigned int	tp_block_nr;	/* Number of blocks */
     277  	unsigned int	tp_frame_size;	/* Size of frame */
     278  	unsigned int	tp_frame_nr;	/* Total number of frames */
     279  };
     280  
     281  struct tpacket_req3 {
     282  	unsigned int	tp_block_size;	/* Minimal size of contiguous block */
     283  	unsigned int	tp_block_nr;	/* Number of blocks */
     284  	unsigned int	tp_frame_size;	/* Size of frame */
     285  	unsigned int	tp_frame_nr;	/* Total number of frames */
     286  	unsigned int	tp_retire_blk_tov; /* timeout in msecs */
     287  	unsigned int	tp_sizeof_priv; /* offset to private data area */
     288  	unsigned int	tp_feature_req_word;
     289  };
     290  
     291  union tpacket_req_u {
     292  	struct tpacket_req	req;
     293  	struct tpacket_req3	req3;
     294  };
     295  
     296  struct packet_mreq {
     297  	int		mr_ifindex;
     298  	unsigned short	mr_type;
     299  	unsigned short	mr_alen;
     300  	unsigned char	mr_address[8];
     301  };
     302  
     303  struct fanout_args {
     304  #if defined(__LITTLE_ENDIAN_BITFIELD)
     305  	__u16		id;
     306  	__u16		type_flags;
     307  #else
     308  	__u16		type_flags;
     309  	__u16		id;
     310  #endif
     311  	__u32		max_num_members;
     312  };
     313  
     314  #define PACKET_MR_MULTICAST	0
     315  #define PACKET_MR_PROMISC	1
     316  #define PACKET_MR_ALLMULTI	2
     317  #define PACKET_MR_UNICAST	3
     318  
     319  #endif