1 #ifndef __NET_PKT_CLS_H
2 #define __NET_PKT_CLS_H
5 #include <linux/pkt_cls.h>
10 /* Basic packet classifier frontend definitions. */
20 /* Fast access part */
21 struct tcf_proto
*next
;
23 int (*classify
)(struct sk_buff
*, struct tcf_proto
*, struct tcf_result
*);
31 struct tcf_proto_ops
*ops
;
39 int (*fn
)(struct tcf_proto
*, unsigned long node
, struct tcf_walker
*);
46 struct tcf_proto_ops
*next
;
49 int (*classify
)(struct sk_buff
*, struct tcf_proto
*, struct tcf_result
*);
50 int (*init
)(struct tcf_proto
*);
51 void (*destroy
)(struct tcf_proto
*);
53 unsigned long (*get
)(struct tcf_proto
*, u32 handle
);
54 void (*put
)(struct tcf_proto
*, unsigned long);
55 int (*change
)(struct tcf_proto
*, unsigned long, u32 handle
, struct rtattr
**, unsigned long *);
56 int (*delete)(struct tcf_proto
*, unsigned long);
57 void (*walk
)(struct tcf_proto
*, struct tcf_walker
*arg
);
59 /* rtnetlink specific */
60 int (*dump
)(struct tcf_proto
*, unsigned long, struct sk_buff
*skb
, struct tcmsg
*);
65 /* Main classifier routine: scans classifier chain attached
66 to this qdisc, (optionally) tests for protocol and asks
70 static inline int tc_classify(struct sk_buff
*skb
, struct tcf_proto
*tp
, struct tcf_result
*res
)
73 u32 protocol
= skb
->protocol
;
74 #ifdef CONFIG_NET_CLS_ACT
75 struct tcf_proto
*otp
= tp
;
78 protocol
= skb
->protocol
;
80 for ( ; tp
; tp
= tp
->next
) {
81 if ((tp
->protocol
== protocol
||
82 tp
->protocol
== __constant_htons(ETH_P_ALL
)) &&
83 (err
= tp
->classify(skb
, tp
, res
)) >= 0) {
84 #ifdef CONFIG_NET_CLS_ACT
85 if ( TC_ACT_RECLASSIFY
== err
) {
86 __u32 verd
= (__u32
) G_TC_VERD(skb
->tc_verd
);
89 if (MAX_REC_LOOP
< verd
++) {
90 printk("rule prio %d protocol %02x reclassify is buggy packet dropped\n",tp
->prio
&0xffff, ntohs(tp
->protocol
));
93 skb
->tc_verd
= SET_TC_VERD(skb
->tc_verd
,verd
);
97 skb
->tc_verd
= SET_TC_VERD(skb
->tc_verd
,0);
110 static inline void tcf_destroy(struct tcf_proto
*tp
)
112 tp
->ops
->destroy(tp
);
113 module_put(tp
->ops
->owner
);
117 extern int register_tcf_proto_ops(struct tcf_proto_ops
*ops
);
118 extern int unregister_tcf_proto_ops(struct tcf_proto_ops
*ops
);
119 extern int ing_filter(struct sk_buff
*skb
);