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;
75 for ( ; tp; tp = tp->next) {
76 if ((tp->protocol == protocol ||
77 tp->protocol == __constant_htons(ETH_P_ALL)) &&
78 (err = tp->classify(skb, tp, res)) >= 0)
84 static inline void tcf_destroy(struct tcf_proto *tp)
87 module_put(tp->ops->owner);
91 extern int register_tcf_proto_ops(struct tcf_proto_ops *ops);
92 extern int unregister_tcf_proto_ops(struct tcf_proto_ops *ops);