Merge branch 'compat-ioctl-merge' of git://git.kernel.org/pub/scm/linux/kernel/git...
[safe/jmp/linux-2.6] / include / net / pkt_cls.h
index 02647fe..dd3031a 100644 (file)
@@ -7,8 +7,7 @@
 
 /* Basic packet classifier frontend definitions. */
 
-struct tcf_walker
-{
+struct tcf_walker {
        int     stop;
        int     skip;
        int     count;
@@ -61,20 +60,16 @@ tcf_unbind_filter(struct tcf_proto *tp, struct tcf_result *r)
                tp->q->ops->cl_ops->unbind_tcf(tp->q, cl);
 }
 
-struct tcf_exts
-{
+struct tcf_exts {
 #ifdef CONFIG_NET_CLS_ACT
        struct tc_action *action;
-#elif defined CONFIG_NET_CLS_POLICE
-       struct tcf_police *police;
 #endif
 };
 
 /* Map to export classifier specific extension TLV types to the
  * generic extensions API. Unsupported extensions must be set to 0.
  */
-struct tcf_ext_map
-{
+struct tcf_ext_map {
        int action;
        int police;
 };
@@ -91,8 +86,6 @@ tcf_exts_is_predicative(struct tcf_exts *exts)
 {
 #ifdef CONFIG_NET_CLS_ACT
        return !!exts->action;
-#elif defined CONFIG_NET_CLS_POLICE
-       return !!exts->police;
 #else
        return 0;
 #endif
@@ -129,30 +122,25 @@ tcf_exts_exec(struct sk_buff *skb, struct tcf_exts *exts,
 #ifdef CONFIG_NET_CLS_ACT
        if (exts->action)
                return tcf_action_exec(skb, exts->action, res);
-#elif defined CONFIG_NET_CLS_POLICE
-       if (exts->police)
-               return tcf_police(skb, exts->police);
 #endif
-
        return 0;
 }
 
-extern int tcf_exts_validate(struct tcf_proto *tp, struct rtattr **tb,
-                            struct rtattr *rate_tlv, struct tcf_exts *exts,
-                            struct tcf_ext_map *map);
+extern int tcf_exts_validate(struct tcf_proto *tp, struct nlattr **tb,
+                            struct nlattr *rate_tlv, struct tcf_exts *exts,
+                            const struct tcf_ext_map *map);
 extern void tcf_exts_destroy(struct tcf_proto *tp, struct tcf_exts *exts);
 extern void tcf_exts_change(struct tcf_proto *tp, struct tcf_exts *dst,
                             struct tcf_exts *src);
 extern int tcf_exts_dump(struct sk_buff *skb, struct tcf_exts *exts,
-                        struct tcf_ext_map *map);
+                        const struct tcf_ext_map *map);
 extern int tcf_exts_dump_stats(struct sk_buff *skb, struct tcf_exts *exts,
-                              struct tcf_ext_map *map);
+                              const struct tcf_ext_map *map);
 
 /**
  * struct tcf_pkt_info - packet information
  */
-struct tcf_pkt_info
-{
+struct tcf_pkt_info {
        unsigned char *         ptr;
        int                     nexthdr;
 };
@@ -170,8 +158,7 @@ struct tcf_ematch_ops;
  * @datalen: length of the ematch specific configuration data
  * @data: ematch specific data
  */
-struct tcf_ematch
-{
+struct tcf_ematch {
        struct tcf_ematch_ops * ops;
        unsigned long           data;
        unsigned int            datalen;
@@ -219,8 +206,7 @@ static inline int tcf_em_early_end(struct tcf_ematch *em, int result)
  * @hdr: ematch tree header supplied by userspace
  * @matches: array of ematches
  */
-struct tcf_ematch_tree
-{
+struct tcf_ematch_tree {
        struct tcf_ematch_tree_hdr hdr;
        struct tcf_ematch *     matches;
        
@@ -238,8 +224,7 @@ struct tcf_ematch_tree
  * @owner: owner, must be set to THIS_MODULE
  * @link: link to previous/next ematch module (internal use)
  */
-struct tcf_ematch_ops
-{
+struct tcf_ematch_ops {
        int                     kind;
        int                     datalen;
        int                     (*change)(struct tcf_proto *, void *,
@@ -254,8 +239,8 @@ struct tcf_ematch_ops
 };
 
 extern int tcf_em_register(struct tcf_ematch_ops *);
-extern int tcf_em_unregister(struct tcf_ematch_ops *);
-extern int tcf_em_tree_validate(struct tcf_proto *, struct rtattr *,
+extern void tcf_em_unregister(struct tcf_ematch_ops *);
+extern int tcf_em_tree_validate(struct tcf_proto *, struct nlattr *,
                                struct tcf_ematch_tree *);
 extern void tcf_em_tree_destroy(struct tcf_proto *, struct tcf_ematch_tree *);
 extern int tcf_em_tree_dump(struct sk_buff *, struct tcf_ematch_tree *, int);
@@ -306,10 +291,11 @@ static inline int tcf_em_tree_match(struct sk_buff *skb,
                return 1;
 }
 
+#define MODULE_ALIAS_TCF_EMATCH(kind)  MODULE_ALIAS("ematch-kind-" __stringify(kind))
+
 #else /* CONFIG_NET_EMATCH */
 
-struct tcf_ematch_tree
-{
+struct tcf_ematch_tree {
 };
 
 #define tcf_em_tree_validate(tp, tb, t) ((void)(t), 0)
@@ -326,25 +312,27 @@ static inline unsigned char * tcf_get_base_ptr(struct sk_buff *skb, int layer)
                case TCF_LAYER_LINK:
                        return skb->data;
                case TCF_LAYER_NETWORK:
-                       return skb->nh.raw;
+                       return skb_network_header(skb);
                case TCF_LAYER_TRANSPORT:
-                       return skb->h.raw;
+                       return skb_transport_header(skb);
        }
 
        return NULL;
 }
 
-static inline int tcf_valid_offset(struct sk_buff *skb, unsigned char *ptr,
-                                  int len)
+static inline int tcf_valid_offset(const struct sk_buff *skb,
+                                  const unsigned char *ptr, const int len)
 {
-       return unlikely((ptr + len) < skb->tail && ptr > skb->head);
+       return unlikely((ptr + len) < skb_tail_pointer(skb) && ptr > skb->head);
 }
 
 #ifdef CONFIG_NET_CLS_IND
+#include <net/net_namespace.h>
+
 static inline int
-tcf_change_indev(struct tcf_proto *tp, char *indev, struct rtattr *indev_tlv)
+tcf_change_indev(struct tcf_proto *tp, char *indev, struct nlattr *indev_tlv)
 {
-       if (rtattr_strlcpy(indev, indev_tlv, IFNAMSIZ) >= IFNAMSIZ)
+       if (nla_strlcpy(indev, indev_tlv, IFNAMSIZ) >= IFNAMSIZ)
                return -EINVAL;
        return 0;
 }
@@ -355,9 +343,9 @@ tcf_match_indev(struct sk_buff *skb, char *indev)
        struct net_device *dev;
 
        if (indev[0]) {
-               if  (!skb->iif)
+               if  (!skb->skb_iif)
                        return 0;
-               dev = __dev_get_by_index(skb->iif);
+               dev = __dev_get_by_index(dev_net(skb->dev), skb->skb_iif);
                if (!dev || strcmp(indev, dev->name))
                        return 0;
        }