Home | History | Annotate | Download | only in linux
      1 #ifndef __LINUX_IF_PACKET_H
      2 #define __LINUX_IF_PACKET_H
      3 
      4 #include <linux/types.h>
      5 
      6 struct sockaddr_pkt {
      7 	unsigned short spkt_family;
      8 	unsigned char spkt_device[14];
      9 	__be16 spkt_protocol;
     10 };
     11 
     12 struct sockaddr_ll {
     13 	unsigned short	sll_family;
     14 	__be16		sll_protocol;
     15 	int		sll_ifindex;
     16 	unsigned short	sll_hatype;
     17 	unsigned char	sll_pkttype;
     18 	unsigned char	sll_halen;
     19 	unsigned char	sll_addr[8];
     20 };
     21 
     22 /* Packet types */
     23 
     24 #define PACKET_HOST		0		/* To us		*/
     25 #define PACKET_BROADCAST	1		/* To all		*/
     26 #define PACKET_MULTICAST	2		/* To group		*/
     27 #define PACKET_OTHERHOST	3		/* To someone else 	*/
     28 #define PACKET_OUTGOING		4		/* Outgoing of any type */
     29 /* These ones are invisible by user level */
     30 #define PACKET_LOOPBACK		5		/* MC/BRD frame looped back */
     31 #define PACKET_FASTROUTE	6		/* Fastrouted frame	*/
     32 
     33 /* Packet socket options */
     34 
     35 #define PACKET_ADD_MEMBERSHIP		1
     36 #define PACKET_DROP_MEMBERSHIP		2
     37 #define PACKET_RECV_OUTPUT		3
     38 /* Value 4 is still used by obsolete turbo-packet. */
     39 #define PACKET_RX_RING			5
     40 #define PACKET_STATISTICS		6
     41 #define PACKET_COPY_THRESH		7
     42 #define PACKET_AUXDATA			8
     43 #define PACKET_ORIGDEV			9
     44 #define PACKET_VERSION			10
     45 #define PACKET_HDRLEN			11
     46 #define PACKET_RESERVE			12
     47 #define PACKET_TX_RING			13
     48 #define PACKET_LOSS			14
     49 #define PACKET_VNET_HDR			15
     50 #define PACKET_TX_TIMESTAMP		16
     51 #define PACKET_TIMESTAMP		17
     52 #define PACKET_FANOUT			18
     53 
     54 #define PACKET_FANOUT_HASH		0
     55 #define PACKET_FANOUT_LB		1
     56 #define PACKET_FANOUT_CPU		2
     57 #define PACKET_FANOUT_FLAG_DEFRAG	0x8000
     58 
     59 struct tpacket_stats {
     60 	unsigned int	tp_packets;
     61 	unsigned int	tp_drops;
     62 };
     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 
     75 struct tpacket_auxdata {
     76 	__u32		tp_status;
     77 	__u32		tp_len;
     78 	__u32		tp_snaplen;
     79 	__u16		tp_mac;
     80 	__u16		tp_net;
     81 	__u16		tp_vlan_tci;
     82 	__u16		tp_padding;
     83 };
     84 
     85 /* Rx ring - header status */
     86 #define TP_STATUS_KERNEL	0x0
     87 #define TP_STATUS_USER		0x1
     88 #define TP_STATUS_COPY		0x2
     89 #define TP_STATUS_LOSING	0x4
     90 #define TP_STATUS_CSUMNOTREADY	0x8
     91 #define TP_STATUS_VLAN_VALID   0x10 /* auxdata has valid tp_vlan_tci */
     92 #define TP_STATUS_BLK_TMO	0x20
     93 
     94 /* Tx ring - header status */
     95 #define TP_STATUS_AVAILABLE	0x0
     96 #define TP_STATUS_SEND_REQUEST	0x1
     97 #define TP_STATUS_SENDING	0x2
     98 #define TP_STATUS_WRONG_FORMAT	0x4
     99 
    100 /* Rx ring - feature request bits */
    101 #define TP_FT_REQ_FILL_RXHASH	0x1
    102 
    103 struct tpacket_hdr {
    104 	unsigned long	tp_status;
    105 	unsigned int	tp_len;
    106 	unsigned int	tp_snaplen;
    107 	unsigned short	tp_mac;
    108 	unsigned short	tp_net;
    109 	unsigned int	tp_sec;
    110 	unsigned int	tp_usec;
    111 };
    112 
    113 #define TPACKET_ALIGNMENT	16
    114 #define TPACKET_ALIGN(x)	(((x)+TPACKET_ALIGNMENT-1)&~(TPACKET_ALIGNMENT-1))
    115 #define TPACKET_HDRLEN		(TPACKET_ALIGN(sizeof(struct tpacket_hdr)) + sizeof(struct sockaddr_ll))
    116 
    117 struct tpacket2_hdr {
    118 	__u32		tp_status;
    119 	__u32		tp_len;
    120 	__u32		tp_snaplen;
    121 	__u16		tp_mac;
    122 	__u16		tp_net;
    123 	__u32		tp_sec;
    124 	__u32		tp_nsec;
    125 	__u16		tp_vlan_tci;
    126 	__u16		tp_padding;
    127 };
    128 
    129 struct tpacket_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 tpacket_hdr_variant1 hv1;
    146 	};
    147 };
    148 
    149 struct tpacket_bd_ts {
    150 	unsigned int ts_sec;
    151 	union {
    152 		unsigned int ts_usec;
    153 		unsigned int ts_nsec;
    154 	};
    155 };
    156 
    157 struct tpacket_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 tpacket_bd_ts	ts_first_pkt, ts_last_pkt;
    204 };
    205 
    206 union tpacket_bd_header_u {
    207 	struct tpacket_hdr_v1 bh1;
    208 };
    209 
    210 struct tpacket_block_desc {
    211 	__u32 version;
    212 	__u32 offset_to_priv;
    213 	union tpacket_bd_header_u hdr;
    214 };
    215 
    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))
    218 
    219 enum tpacket_versions {
    220 	TPACKET_V1,
    221 	TPACKET_V2,
    222 	TPACKET_V3
    223 };
    224 
    225 /*
    226    Frame structure:
    227 
    228    - Start. Frame must be aligned to TPACKET_ALIGNMENT=16
    229    - struct tpacket_hdr
    230    - pad to TPACKET_ALIGNMENT=16
    231    - struct sockaddr_ll
    232    - Gap, chosen so that packet data (Start+tp_net) alignes to TPACKET_ALIGNMENT=16
    233    - Start+tp_mac: [ Optional MAC header ]
    234    - Start+tp_net: Packet data, aligned to TPACKET_ALIGNMENT=16.
    235    - Pad to align to TPACKET_ALIGNMENT=16
    236  */
    237 
    238 struct tpacket_req {
    239 	unsigned int	tp_block_size;	/* Minimal size of contiguous block */
    240 	unsigned int	tp_block_nr;	/* Number of blocks */
    241 	unsigned int	tp_frame_size;	/* Size of frame */
    242 	unsigned int	tp_frame_nr;	/* Total number of frames */
    243 };
    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 
    260 struct packet_mreq {
    261 	int		mr_ifindex;
    262 	unsigned short	mr_type;
    263 	unsigned short	mr_alen;
    264 	unsigned char	mr_address[8];
    265 };
    266 
    267 #define PACKET_MR_MULTICAST	0
    268 #define PACKET_MR_PROMISC	1
    269 #define PACKET_MR_ALLMULTI	2
    270 #define PACKET_MR_UNICAST	3
    271 
    272 #endif
    273