Line data Source code
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 1 :
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 1 :
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 :
50 : struct tpacket_stats {
51 : unsigned int tp_packets;
52 : unsigned int tp_drops;
53 : };
54 1 :
55 : struct tpacket_auxdata {
56 : __u32 tp_status;
57 : __u32 tp_len;
58 : __u32 tp_snaplen;
59 : __u16 tp_mac;
60 : __u16 tp_net;
61 : __u16 tp_vlan_tci;
62 : __u16 tp_padding;
63 : };
64 :
65 : /* Rx ring - header status */
66 : #define TP_STATUS_KERNEL 0x0
67 : #define TP_STATUS_USER 0x1
68 : #define TP_STATUS_COPY 0x2
69 : #define TP_STATUS_LOSING 0x4
70 : #define TP_STATUS_CSUMNOTREADY 0x8
71 :
72 : /* Tx ring - header status */
73 : #define TP_STATUS_AVAILABLE 0x0
74 : #define TP_STATUS_SEND_REQUEST 0x1
75 : #define TP_STATUS_SENDING 0x2
76 : #define TP_STATUS_WRONG_FORMAT 0x4
77 :
78 : struct tpacket_hdr {
79 : unsigned long tp_status;
80 : unsigned int tp_len;
81 : unsigned int tp_snaplen;
82 : unsigned short tp_mac;
83 : unsigned short tp_net;
84 : unsigned int tp_sec;
85 : unsigned int tp_usec;
86 : };
87 :
88 : #define TPACKET_ALIGNMENT 16
89 : #define TPACKET_ALIGN(x) (((x)+TPACKET_ALIGNMENT-1)&~(TPACKET_ALIGNMENT-1))
90 : #define TPACKET_HDRLEN (TPACKET_ALIGN(sizeof(struct tpacket_hdr)) + sizeof(struct sockaddr_ll))
91 :
92 : struct tpacket2_hdr {
93 : __u32 tp_status;
94 : __u32 tp_len;
95 : __u32 tp_snaplen;
96 : __u16 tp_mac;
97 : __u16 tp_net;
98 : __u32 tp_sec;
99 : __u32 tp_nsec;
100 : __u16 tp_vlan_tci;
101 : __u16 tp_padding;
102 : };
103 :
104 : #define TPACKET2_HDRLEN (TPACKET_ALIGN(sizeof(struct tpacket2_hdr)) + sizeof(struct sockaddr_ll))
105 :
106 : enum tpacket_versions {
107 : TPACKET_V1,
108 : TPACKET_V2,
109 : };
110 :
111 : /*
112 : Frame structure:
113 :
114 : - Start. Frame must be aligned to TPACKET_ALIGNMENT=16
115 : - struct tpacket_hdr
116 : - pad to TPACKET_ALIGNMENT=16
117 : - struct sockaddr_ll
118 : - Gap, chosen so that packet data (Start+tp_net) alignes to TPACKET_ALIGNMENT=16
119 : - Start+tp_mac: [ Optional MAC header ]
120 : - Start+tp_net: Packet data, aligned to TPACKET_ALIGNMENT=16.
121 : - Pad to align to TPACKET_ALIGNMENT=16
122 : */
123 :
124 : struct tpacket_req {
125 : unsigned int tp_block_size; /* Minimal size of contiguous block */
126 : unsigned int tp_block_nr; /* Number of blocks */
127 : unsigned int tp_frame_size; /* Size of frame */
128 : unsigned int tp_frame_nr; /* Total number of frames */
129 : };
130 :
131 : struct packet_mreq {
132 : int mr_ifindex;
133 : unsigned short mr_type;
134 : unsigned short mr_alen;
135 : unsigned char mr_address[8];
136 : };
137 :
138 : #define PACKET_MR_MULTICAST 0
139 : #define PACKET_MR_PROMISC 1
140 : #define PACKET_MR_ALLMULTI 2
141 : #define PACKET_MR_UNICAST 3
142 :
143 : #endif
|