if_packet.h 3.3 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3
#ifndef __LINUX_IF_PACKET_H
#define __LINUX_IF_PACKET_H

A
Al Viro 已提交
4 5
#include <linux/types.h>

E
Eric Dumazet 已提交
6
struct sockaddr_pkt {
L
Linus Torvalds 已提交
7 8
	unsigned short spkt_family;
	unsigned char spkt_device[14];
A
Al Viro 已提交
9
	__be16 spkt_protocol;
L
Linus Torvalds 已提交
10 11
};

E
Eric Dumazet 已提交
12
struct sockaddr_ll {
L
Linus Torvalds 已提交
13
	unsigned short	sll_family;
A
Al Viro 已提交
14
	__be16		sll_protocol;
L
Linus Torvalds 已提交
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
	int		sll_ifindex;
	unsigned short	sll_hatype;
	unsigned char	sll_pkttype;
	unsigned char	sll_halen;
	unsigned char	sll_addr[8];
};

/* Packet types */

#define PACKET_HOST		0		/* To us		*/
#define PACKET_BROADCAST	1		/* To all		*/
#define PACKET_MULTICAST	2		/* To group		*/
#define PACKET_OTHERHOST	3		/* To someone else 	*/
#define PACKET_OUTGOING		4		/* Outgoing of any type */
/* These ones are invisible by user level */
#define PACKET_LOOPBACK		5		/* MC/BRD frame looped back */
#define PACKET_FASTROUTE	6		/* Fastrouted frame	*/

/* Packet socket options */

#define PACKET_ADD_MEMBERSHIP		1
#define PACKET_DROP_MEMBERSHIP		2
#define PACKET_RECV_OUTPUT		3
/* Value 4 is still used by obsolete turbo-packet. */
#define PACKET_RX_RING			5
#define PACKET_STATISTICS		6
#define PACKET_COPY_THRESH		7
42
#define PACKET_AUXDATA			8
43
#define PACKET_ORIGDEV			9
44 45
#define PACKET_VERSION			10
#define PACKET_HDRLEN			11
46
#define PACKET_RESERVE			12
J
Johann Baudy 已提交
47 48
#define PACKET_TX_RING			13
#define PACKET_LOSS			14
L
Linus Torvalds 已提交
49

E
Eric Dumazet 已提交
50
struct tpacket_stats {
L
Linus Torvalds 已提交
51 52 53 54
	unsigned int	tp_packets;
	unsigned int	tp_drops;
};

E
Eric Dumazet 已提交
55
struct tpacket_auxdata {
56 57 58 59 60
	__u32		tp_status;
	__u32		tp_len;
	__u32		tp_snaplen;
	__u16		tp_mac;
	__u16		tp_net;
61
	__u16		tp_vlan_tci;
62 63
};

J
Johann Baudy 已提交
64 65 66 67 68 69 70 71 72 73 74 75 76
/* Rx ring - header status */
#define TP_STATUS_KERNEL	0x0
#define TP_STATUS_USER		0x1
#define TP_STATUS_COPY		0x2
#define TP_STATUS_LOSING	0x4
#define TP_STATUS_CSUMNOTREADY	0x8

/* Tx ring - header status */
#define TP_STATUS_AVAILABLE	0x0
#define TP_STATUS_SEND_REQUEST	0x1
#define TP_STATUS_SENDING	0x2
#define TP_STATUS_WRONG_FORMAT	0x4

E
Eric Dumazet 已提交
77
struct tpacket_hdr {
L
Linus Torvalds 已提交
78 79 80 81 82 83 84 85 86 87 88 89 90
	unsigned long	tp_status;
	unsigned int	tp_len;
	unsigned int	tp_snaplen;
	unsigned short	tp_mac;
	unsigned short	tp_net;
	unsigned int	tp_sec;
	unsigned int	tp_usec;
};

#define TPACKET_ALIGNMENT	16
#define TPACKET_ALIGN(x)	(((x)+TPACKET_ALIGNMENT-1)&~(TPACKET_ALIGNMENT-1))
#define TPACKET_HDRLEN		(TPACKET_ALIGN(sizeof(struct tpacket_hdr)) + sizeof(struct sockaddr_ll))

E
Eric Dumazet 已提交
91
struct tpacket2_hdr {
92 93 94 95 96 97 98
	__u32		tp_status;
	__u32		tp_len;
	__u32		tp_snaplen;
	__u16		tp_mac;
	__u16		tp_net;
	__u32		tp_sec;
	__u32		tp_nsec;
99
	__u16		tp_vlan_tci;
100 101 102 103
};

#define TPACKET2_HDRLEN		(TPACKET_ALIGN(sizeof(struct tpacket2_hdr)) + sizeof(struct sockaddr_ll))

E
Eric Dumazet 已提交
104
enum tpacket_versions {
105 106 107 108
	TPACKET_V1,
	TPACKET_V2,
};

L
Linus Torvalds 已提交
109 110 111 112 113 114 115 116 117 118 119 120 121
/*
   Frame structure:

   - Start. Frame must be aligned to TPACKET_ALIGNMENT=16
   - struct tpacket_hdr
   - pad to TPACKET_ALIGNMENT=16
   - struct sockaddr_ll
   - Gap, chosen so that packet data (Start+tp_net) alignes to TPACKET_ALIGNMENT=16
   - Start+tp_mac: [ Optional MAC header ]
   - Start+tp_net: Packet data, aligned to TPACKET_ALIGNMENT=16.
   - Pad to align to TPACKET_ALIGNMENT=16
 */

E
Eric Dumazet 已提交
122
struct tpacket_req {
L
Linus Torvalds 已提交
123 124 125 126 127 128
	unsigned int	tp_block_size;	/* Minimal size of contiguous block */
	unsigned int	tp_block_nr;	/* Number of blocks */
	unsigned int	tp_frame_size;	/* Size of frame */
	unsigned int	tp_frame_nr;	/* Total number of frames */
};

E
Eric Dumazet 已提交
129
struct packet_mreq {
L
Linus Torvalds 已提交
130 131 132 133 134 135 136 137 138
	int		mr_ifindex;
	unsigned short	mr_type;
	unsigned short	mr_alen;
	unsigned char	mr_address[8];
};

#define PACKET_MR_MULTICAST	0
#define PACKET_MR_PROMISC	1
#define PACKET_MR_ALLMULTI	2
139
#define PACKET_MR_UNICAST	3
L
Linus Torvalds 已提交
140 141

#endif