net_sched: move tc_action into tcf_common
[cascardo/linux.git] / include / net / act_api.h
index 0bb2106..8b19909 100644 (file)
 #include <net/net_namespace.h>
 #include <net/netns/generic.h>
 
+
+struct tcf_hashinfo {
+       struct hlist_head       *htab;
+       unsigned int            hmask;
+       spinlock_t              lock;
+       u32                     index;
+};
+
+struct tc_action_ops;
+
+struct tc_action {
+       const struct tc_action_ops      *ops;
+       __u32                   type; /* for backward compat(TCA_OLD_COMPAT) */
+       __u32                   order;
+       struct list_head        list;
+       struct tcf_hashinfo     *hinfo;
+};
+
 struct tcf_common {
+       struct tc_action                tcfc_act;
        struct hlist_node               tcfc_head;
        u32                             tcfc_index;
        int                             tcfc_refcnt;
@@ -26,6 +45,7 @@ struct tcf_common {
        struct gnet_stats_basic_cpu __percpu *cpu_bstats;
        struct gnet_stats_queue __percpu *cpu_qstats;
 };
+#define tcf_act                common.tcfc_act
 #define tcf_head       common.tcfc_head
 #define tcf_index      common.tcfc_index
 #define tcf_refcnt     common.tcfc_refcnt
@@ -39,13 +59,6 @@ struct tcf_common {
 #define tcf_lock       common.tcfc_lock
 #define tcf_rcu                common.tcfc_rcu
 
-struct tcf_hashinfo {
-       struct hlist_head       *htab;
-       unsigned int            hmask;
-       spinlock_t              lock;
-       u32                     index;
-};
-
 static inline unsigned int tcf_hash(u32 index, unsigned int hmask)
 {
        return index & hmask;
@@ -88,15 +101,6 @@ static inline void tcf_tm_dump(struct tcf_t *dtm, const struct tcf_t *stm)
        dtm->expires = jiffies_to_clock_t(stm->expires);
 }
 
-struct tc_action {
-       void                    *priv;
-       const struct tc_action_ops      *ops;
-       __u32                   type; /* for backward compat(TCA_OLD_COMPAT) */
-       __u32                   order;
-       struct list_head        list;
-       struct tcf_hashinfo     *hinfo;
-};
-
 #ifdef CONFIG_NET_CLS_ACT
 
 #define ACT_P_CREATED 1
@@ -106,17 +110,18 @@ struct tc_action_ops {
        struct list_head head;
        char    kind[IFNAMSIZ];
        __u32   type; /* TBD to match kind */
+       size_t  size;
        struct module           *owner;
        int     (*act)(struct sk_buff *, const struct tc_action *,
                       struct tcf_result *);
        int     (*dump)(struct sk_buff *, struct tc_action *, int, int);
        void    (*cleanup)(struct tc_action *, int bind);
-       int     (*lookup)(struct net *, struct tc_action *, u32);
+       int     (*lookup)(struct net *, struct tc_action **, u32);
        int     (*init)(struct net *net, struct nlattr *nla,
-                       struct nlattr *est, struct tc_action *act, int ovr,
+                       struct nlattr *est, struct tc_action **act, int ovr,
                        int bind);
        int     (*walk)(struct net *, struct sk_buff *,
-                       struct netlink_callback *, int, struct tc_action *);
+                       struct netlink_callback *, int, const struct tc_action_ops *);
        void    (*stats_update)(struct tc_action *, u64, u32, u64);
 };
 
@@ -152,13 +157,14 @@ static inline void tc_action_net_exit(struct tc_action_net *tn)
 
 int tcf_generic_walker(struct tc_action_net *tn, struct sk_buff *skb,
                       struct netlink_callback *cb, int type,
-                      struct tc_action *a);
-int tcf_hash_search(struct tc_action_net *tn, struct tc_action *a, u32 index);
+                      const struct tc_action_ops *ops);
+int tcf_hash_search(struct tc_action_net *tn, struct tc_action **a, u32 index);
 u32 tcf_hash_new_index(struct tc_action_net *tn);
-bool tcf_hash_check(struct tc_action_net *tn, u32 index, struct tc_action *a,
+bool tcf_hash_check(struct tc_action_net *tn, u32 index, struct tc_action **a,
                    int bind);
 int tcf_hash_create(struct tc_action_net *tn, u32 index, struct nlattr *est,
-                   struct tc_action *a, int size, int bind, bool cpustats);
+                   struct tc_action **a, const struct tc_action_ops *ops, int bind,
+                   bool cpustats);
 void tcf_hash_cleanup(struct tc_action *a, struct nlattr *est);
 void tcf_hash_insert(struct tc_action_net *tn, struct tc_action *a);