• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #ifndef __LINUX_IF_PACKET_H
2 #define __LINUX_IF_PACKET_H
3 
4 #include <linux/types.h>
5 
6 struct sockaddr_pkt
7 {
8 	unsigned short spkt_family;
9 	unsigned char spkt_device[14];
10 	__be16 spkt_protocol;
11 };
12 
13 struct sockaddr_ll
14 {
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 /* These ones are invisible by user level */
32 #define PACKET_LOOPBACK		5		/* MC/BRD frame looped back */
33 #define PACKET_FASTROUTE	6		/* Fastrouted frame	*/
34 
35 /* Packet socket options */
36 
37 #define PACKET_ADD_MEMBERSHIP		1
38 #define PACKET_DROP_MEMBERSHIP		2
39 #define PACKET_RECV_OUTPUT		3
40 /* Value 4 is still used by obsolete turbo-packet. */
41 #define PACKET_RX_RING			5
42 #define PACKET_STATISTICS		6
43 #define PACKET_COPY_THRESH		7
44 #define PACKET_AUXDATA			8
45 #define PACKET_ORIGDEV			9
46 #define PACKET_VERSION			10
47 #define PACKET_HDRLEN			11
48 #define PACKET_RESERVE			12
49 
50 struct tpacket_stats
51 {
52 	unsigned int	tp_packets;
53 	unsigned int	tp_drops;
54 };
55 
56 struct tpacket_auxdata
57 {
58 	__u32		tp_status;
59 	__u32		tp_len;
60 	__u32		tp_snaplen;
61 	__u16		tp_mac;
62 	__u16		tp_net;
63 	__u16		tp_vlan_tci;
64 };
65 
66 struct tpacket_hdr
67 {
68 	unsigned long	tp_status;
69 #define TP_STATUS_KERNEL	0
70 #define TP_STATUS_USER		1
71 #define TP_STATUS_COPY		2
72 #define TP_STATUS_LOSING	4
73 #define TP_STATUS_CSUMNOTREADY	8
74 	unsigned int	tp_len;
75 	unsigned int	tp_snaplen;
76 	unsigned short	tp_mac;
77 	unsigned short	tp_net;
78 	unsigned int	tp_sec;
79 	unsigned int	tp_usec;
80 };
81 
82 #define TPACKET_ALIGNMENT	16
83 #define TPACKET_ALIGN(x)	(((x)+TPACKET_ALIGNMENT-1)&~(TPACKET_ALIGNMENT-1))
84 #define TPACKET_HDRLEN		(TPACKET_ALIGN(sizeof(struct tpacket_hdr)) + sizeof(struct sockaddr_ll))
85 
86 struct tpacket2_hdr
87 {
88 	__u32		tp_status;
89 	__u32		tp_len;
90 	__u32		tp_snaplen;
91 	__u16		tp_mac;
92 	__u16		tp_net;
93 	__u32		tp_sec;
94 	__u32		tp_nsec;
95 	__u16		tp_vlan_tci;
96 };
97 
98 #define TPACKET2_HDRLEN		(TPACKET_ALIGN(sizeof(struct tpacket2_hdr)) + sizeof(struct sockaddr_ll))
99 
100 enum tpacket_versions
101 {
102 	TPACKET_V1,
103 	TPACKET_V2,
104 };
105 
106 /*
107    Frame structure:
108 
109    - Start. Frame must be aligned to TPACKET_ALIGNMENT=16
110    - struct tpacket_hdr
111    - pad to TPACKET_ALIGNMENT=16
112    - struct sockaddr_ll
113    - Gap, chosen so that packet data (Start+tp_net) alignes to TPACKET_ALIGNMENT=16
114    - Start+tp_mac: [ Optional MAC header ]
115    - Start+tp_net: Packet data, aligned to TPACKET_ALIGNMENT=16.
116    - Pad to align to TPACKET_ALIGNMENT=16
117  */
118 
119 struct tpacket_req
120 {
121 	unsigned int	tp_block_size;	/* Minimal size of contiguous block */
122 	unsigned int	tp_block_nr;	/* Number of blocks */
123 	unsigned int	tp_frame_size;	/* Size of frame */
124 	unsigned int	tp_frame_nr;	/* Total number of frames */
125 };
126 
127 struct packet_mreq
128 {
129 	int		mr_ifindex;
130 	unsigned short	mr_type;
131 	unsigned short	mr_alen;
132 	unsigned char	mr_address[8];
133 };
134 
135 #define PACKET_MR_MULTICAST	0
136 #define PACKET_MR_PROMISC	1
137 #define PACKET_MR_ALLMULTI	2
138 
139 #endif
140