pkt_cls.h revision 6f0ba88be018dee5feb08e7b125b10b633bb000c
1#ifndef __LINUX_PKT_CLS_H
2#define __LINUX_PKT_CLS_H
3
4/* I think i could have done better macros ; for now this is stolen from
5 * some arch/mips code - jhs
6*/
7#define _TC_MAKE32(x) ((x))
8
9#define _TC_MAKEMASK1(n) (_TC_MAKE32(1) << _TC_MAKE32(n))
10#define _TC_MAKEMASK(v,n) (_TC_MAKE32((_TC_MAKE32(1)<<(v))-1) << _TC_MAKE32(n))
11#define _TC_MAKEVALUE(v,n) (_TC_MAKE32(v) << _TC_MAKE32(n))
12#define _TC_GETVALUE(v,n,m) ((_TC_MAKE32(v) & _TC_MAKE32(m)) >> _TC_MAKE32(n))
13
14/* verdict bit breakdown
15 *
16bit 0: when set -> this packet has been munged already
17
18bit 1: when set -> It is ok to munge this packet
19
20bit 2,3,4,5: Reclassify counter - sort of reverse TTL - if exceeded
21assume loop
22
23bit 6,7: Where this packet was last seen
240: Above the transmit example at the socket level
251: on the Ingress
262: on the Egress
27
28bit 8: when set --> Request not to classify on ingress.
29
30bits 9,10,11: redirect counter -  redirect TTL. Loop avoidance
31
32 *
33 * */
34
35#define TC_MUNGED          _TC_MAKEMASK1(0)
36#define SET_TC_MUNGED(v)   ( TC_MUNGED | (v & ~TC_MUNGED))
37#define CLR_TC_MUNGED(v)   ( v & ~TC_MUNGED)
38
39#define TC_OK2MUNGE        _TC_MAKEMASK1(1)
40#define SET_TC_OK2MUNGE(v)   ( TC_OK2MUNGE | (v & ~TC_OK2MUNGE))
41#define CLR_TC_OK2MUNGE(v)   ( v & ~TC_OK2MUNGE)
42
43#define S_TC_VERD          _TC_MAKE32(2)
44#define M_TC_VERD          _TC_MAKEMASK(4,S_TC_VERD)
45#define G_TC_VERD(x)       _TC_GETVALUE(x,S_TC_VERD,M_TC_VERD)
46#define V_TC_VERD(x)       _TC_MAKEVALUE(x,S_TC_VERD)
47#define SET_TC_VERD(v,n)   ((V_TC_VERD(n)) | (v & ~M_TC_VERD))
48
49#define S_TC_FROM          _TC_MAKE32(6)
50#define M_TC_FROM          _TC_MAKEMASK(2,S_TC_FROM)
51#define G_TC_FROM(x)       _TC_GETVALUE(x,S_TC_FROM,M_TC_FROM)
52#define V_TC_FROM(x)       _TC_MAKEVALUE(x,S_TC_FROM)
53#define SET_TC_FROM(v,n)   ((V_TC_FROM(n)) | (v & ~M_TC_FROM))
54#define AT_STACK	0x0
55#define AT_INGRESS	0x1
56#define AT_EGRESS	0x2
57
58#define TC_NCLS          _TC_MAKEMASK1(8)
59#define SET_TC_NCLS(v)   ( TC_NCLS | (v & ~TC_NCLS))
60#define CLR_TC_NCLS(v)   ( v & ~TC_NCLS)
61
62#define S_TC_RTTL          _TC_MAKE32(9)
63#define M_TC_RTTL          _TC_MAKEMASK(3,S_TC_RTTL)
64#define G_TC_RTTL(x)       _TC_GETVALUE(x,S_TC_RTTL,M_TC_RTTL)
65#define V_TC_RTTL(x)       _TC_MAKEVALUE(x,S_TC_RTTL)
66#define SET_TC_RTTL(v,n)   ((V_TC_RTTL(n)) | (v & ~M_TC_RTTL))
67
68#define S_TC_AT          _TC_MAKE32(12)
69#define M_TC_AT          _TC_MAKEMASK(2,S_TC_AT)
70#define G_TC_AT(x)       _TC_GETVALUE(x,S_TC_AT,M_TC_AT)
71#define V_TC_AT(x)       _TC_MAKEVALUE(x,S_TC_AT)
72#define SET_TC_AT(v,n)   ((V_TC_AT(n)) | (v & ~M_TC_AT))
73
74/* Action attributes */
75enum
76{
77	TCA_ACT_UNSPEC,
78	TCA_ACT_KIND,
79	TCA_ACT_OPTIONS,
80	TCA_ACT_INDEX,
81	__TCA_ACT_MAX
82};
83
84#define TCA_ACT_MAX __TCA_ACT_MAX
85#define TCA_OLD_COMPAT (TCA_ACT_MAX+1)
86#define TCA_ACT_MAX_PRIO 32
87#define TCA_ACT_BIND	1
88#define TCA_ACT_NOBIND	0
89#define TCA_ACT_UNBIND	1
90#define TCA_ACT_NOUNBIND	0
91#define TCA_ACT_REPLACE		1
92#define TCA_ACT_NOREPLACE	0
93#define MAX_REC_LOOP 4
94#define MAX_RED_LOOP 4
95
96#define TC_ACT_UNSPEC	(-1)
97#define TC_ACT_OK		0
98#define TC_ACT_RECLASSIFY	1
99#define TC_ACT_SHOT		2
100#define TC_ACT_PIPE		3
101#define TC_ACT_STOLEN		4
102#define TC_ACT_QUEUED		5
103#define TC_ACT_REPEAT		6
104#define TC_ACT_JUMP		0x10000000
105
106/* Action type identifiers*/
107enum
108{
109	TCA_ID_UNSPEC=0,
110	TCA_ID_POLICE=1,
111	/* other actions go here */
112	__TCA_ID_MAX=255
113};
114
115#define TCA_ID_MAX __TCA_ID_MAX
116
117struct tc_police
118{
119	__u32			index;
120	int			action;
121#define TC_POLICE_UNSPEC	TC_ACT_UNSPEC
122#define TC_POLICE_OK		TC_ACT_OK
123#define TC_POLICE_RECLASSIFY	TC_ACT_RECLASSIFY
124#define TC_POLICE_SHOT		TC_ACT_SHOT
125#define TC_POLICE_PIPE		TC_ACT_PIPE
126
127	__u32			limit;
128	__u32			burst;
129	__u32			mtu;
130	struct tc_ratespec	rate;
131	struct tc_ratespec	peakrate;
132	int 			refcnt;
133	int 			bindcnt;
134	__u32			capab;
135};
136
137struct tcf_t
138{
139	__u32   install;
140	__u32   lastuse;
141	__u32   expires;
142};
143
144struct tc_cnt
145{
146	int                   refcnt;
147	int                   bindcnt;
148};
149
150#define tc_gen \
151	__u32                 index; \
152	__u32                 capab; \
153	int                   action; \
154	int                   refcnt; \
155	int                   bindcnt
156
157enum
158{
159	TCA_POLICE_UNSPEC,
160	TCA_POLICE_TBF,
161	TCA_POLICE_RATE,
162	TCA_POLICE_PEAKRATE,
163	TCA_POLICE_AVRATE,
164	TCA_POLICE_RESULT,
165	__TCA_POLICE_MAX
166#define TCA_POLICE_RESULT TCA_POLICE_RESULT
167};
168
169#define TCA_POLICE_MAX (__TCA_POLICE_MAX - 1)
170
171/* U32 filters */
172
173#define TC_U32_HTID(h) ((h)&0xFFF00000)
174#define TC_U32_USERHTID(h) (TC_U32_HTID(h)>>20)
175#define TC_U32_HASH(h) (((h)>>12)&0xFF)
176#define TC_U32_NODE(h) ((h)&0xFFF)
177#define TC_U32_KEY(h) ((h)&0xFFFFF)
178#define TC_U32_UNSPEC	0
179#define TC_U32_ROOT	(0xFFF00000)
180
181enum
182{
183	TCA_U32_UNSPEC,
184	TCA_U32_CLASSID,
185	TCA_U32_HASH,
186	TCA_U32_LINK,
187	TCA_U32_DIVISOR,
188	TCA_U32_SEL,
189	TCA_U32_POLICE,
190	TCA_U32_ACT,
191	TCA_U32_INDEV,
192	TCA_U32_PCNT,
193	TCA_U32_MARK,
194	__TCA_U32_MAX
195};
196
197#define TCA_U32_MAX (__TCA_U32_MAX - 1)
198
199struct tc_u32_key
200{
201	__u32		mask;
202	__u32		val;
203	int		off;
204	int		offmask;
205};
206
207struct tc_u32_sel
208{
209	unsigned char		flags;
210	unsigned char		offshift;
211	unsigned char		nkeys;
212
213	__u16			offmask;
214	__u16			off;
215	short			offoff;
216
217	short			hoff;
218	__u32			hmask;
219	struct tc_u32_key	keys[0];
220};
221
222struct tc_u32_pcnt
223{
224	__u64 rcnt;
225	__u64 rhit;
226	__u64 kcnts[0];
227};
228
229struct tc_u32_mark
230{
231	__u32	val;
232	__u32	mask;
233	__u32	success;
234};
235
236/* Flags */
237
238#define TC_U32_TERMINAL		1
239#define TC_U32_OFFSET		2
240#define TC_U32_VAROFFSET	4
241#define TC_U32_EAT		8
242
243#define TC_U32_MAXDEPTH 8
244
245
246/* RSVP filter */
247
248enum
249{
250	TCA_RSVP_UNSPEC,
251	TCA_RSVP_CLASSID,
252	TCA_RSVP_DST,
253	TCA_RSVP_SRC,
254	TCA_RSVP_PINFO,
255	TCA_RSVP_POLICE,
256	__TCA_RSVP_MAX
257};
258
259#define TCA_RSVP_MAX (__TCA_RSVP_MAX - 1 )
260
261struct tc_rsvp_gpi
262{
263	__u32	key;
264	__u32	mask;
265	int	offset;
266};
267
268struct tc_rsvp_pinfo
269{
270	struct tc_rsvp_gpi dpi;
271	struct tc_rsvp_gpi spi;
272	__u8	protocol;
273	__u8	tunnelid;
274	__u8	tunnelhdr;
275};
276
277/* ROUTE filter */
278
279enum
280{
281	TCA_ROUTE4_UNSPEC,
282	TCA_ROUTE4_CLASSID,
283	TCA_ROUTE4_TO,
284	TCA_ROUTE4_FROM,
285	TCA_ROUTE4_IIF,
286	TCA_ROUTE4_POLICE,
287	__TCA_ROUTE4_MAX
288};
289
290#define TCA_ROUTE4_MAX (__TCA_ROUTE4_MAX - 1)
291
292
293/* FW filter */
294
295enum
296{
297	TCA_FW_UNSPEC,
298	TCA_FW_CLASSID,
299	TCA_FW_POLICE,
300	TCA_FW_INDEV, /*  used by CONFIG_NET_CLS_IND */
301	TCA_FW_ACT, /* used by CONFIG_NET_CLS_ACT */
302	__TCA_FW_MAX
303};
304
305#define TCA_FW_MAX (__TCA_FW_MAX - 1)
306
307/* TC index filter */
308
309enum
310{
311	TCA_TCINDEX_UNSPEC,
312	TCA_TCINDEX_HASH,
313	TCA_TCINDEX_MASK,
314	TCA_TCINDEX_SHIFT,
315	TCA_TCINDEX_FALL_THROUGH,
316	TCA_TCINDEX_CLASSID,
317	TCA_TCINDEX_POLICE,
318	__TCA_TCINDEX_MAX
319};
320
321#define TCA_TCINDEX_MAX     (__TCA_TCINDEX_MAX - 1)
322
323#endif
324