1#ifndef __NET_PKT_CLS_H 2#define __NET_PKT_CLS_H 3 4 5#include <linux/pkt_cls.h> 6 7struct rtattr; 8struct tcmsg; 9 10/* Basic packet classifier frontend definitions. */ 11 12struct tcf_result 13{ 14 unsigned long class; 15 u32 classid; 16}; 17 18struct tcf_proto 19{ 20 /* Fast access part */ 21 struct tcf_proto *next; 22 void *root; 23 int (*classify)(struct sk_buff*, struct tcf_proto*, struct tcf_result *); 24 u32 protocol; 25 26 /* All the rest */ 27 u32 prio; 28 u32 classid; 29 struct Qdisc *q; 30 void *data; 31 struct tcf_proto_ops *ops; 32}; 33 34struct tcf_walker 35{ 36 int stop; 37 int skip; 38 int count; 39 int (*fn)(struct tcf_proto *, unsigned long node, struct tcf_walker *); 40}; 41 42struct tcf_proto_ops 43{ 44 struct tcf_proto_ops *next; 45 char kind[IFNAMSIZ]; 46 47 int (*classify)(struct sk_buff*, struct tcf_proto*, struct tcf_result *); 48 int (*init)(struct tcf_proto*); 49 void (*destroy)(struct tcf_proto*); 50 51 unsigned long (*get)(struct tcf_proto*, u32 handle); 52 void (*put)(struct tcf_proto*, unsigned long); 53 int (*change)(struct tcf_proto*, unsigned long, u32 handle, struct rtattr **, unsigned long *); 54 int (*delete)(struct tcf_proto*, unsigned long); 55 void (*walk)(struct tcf_proto*, struct tcf_walker *arg); 56 57 /* rtnetlink specific */ 58 int (*dump)(struct tcf_proto*, unsigned long, struct sk_buff *skb, struct tcmsg*); 59}; 60 61/* Main classifier routine: scans classifier chain attached 62 to this qdisc, (optionally) tests for protocol and asks 63 specific classifiers. 64 */ 65 66static inline int tc_classify(struct sk_buff *skb, struct tcf_proto *tp, struct tcf_result *res) 67{ 68 int err = 0; 69 u32 protocol = skb->protocol; 70 71 for ( ; tp; tp = tp->next) { 72 if ((tp->protocol == protocol || 73 tp->protocol == __constant_htons(ETH_P_ALL)) && 74 (err = tp->classify(skb, tp, res)) >= 0) 75 return err; 76 } 77 return -1; 78} 79 80 81 82extern int register_tcf_proto_ops(struct tcf_proto_ops *ops); 83extern int unregister_tcf_proto_ops(struct tcf_proto_ops *ops); 84 85 86 87#endif 88