]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blobdiff - include/linux/netfilter/x_tables.h
netfilter: x_tables: pass xt_counters struct to counter allocator
[mirror_ubuntu-artful-kernel.git] / include / linux / netfilter / x_tables.h
index 2ad1a2b289b5a57d25a3835e97302dd0db774f90..05a94bd32c55859af17b8ad1578a39219815f9aa 100644 (file)
@@ -4,6 +4,7 @@
 
 #include <linux/netdevice.h>
 #include <linux/static_key.h>
+#include <linux/netfilter.h>
 #include <uapi/linux/netfilter/x_tables.h>
 
 /* Test a struct->invflags and a boolean for inequality */
  * @target:    the target extension
  * @matchinfo: per-match data
  * @targetinfo:        per-target data
- * @net                network namespace through which the action was invoked
- * @in:                input netdevice
- * @out:       output netdevice
+ * @state:     pointer to hook state this packet came from
  * @fragoff:   packet is a fragment, this is the data offset
  * @thoff:     position of transport header relative to skb->data
- * @hook:      hook number given packet came from
- * @family:    Actual NFPROTO_* through which the function is invoked
- *             (helpful when match->family == NFPROTO_UNSPEC)
  *
  * Fields written to by extensions:
  *
@@ -38,15 +34,47 @@ struct xt_action_param {
        union {
                const void *matchinfo, *targinfo;
        };
-       struct net *net;
-       const struct net_device *in, *out;
+       const struct nf_hook_state *state;
        int fragoff;
        unsigned int thoff;
-       unsigned int hooknum;
-       u_int8_t family;
        bool hotdrop;
 };
 
+static inline struct net *xt_net(const struct xt_action_param *par)
+{
+       return par->state->net;
+}
+
+static inline struct net_device *xt_in(const struct xt_action_param *par)
+{
+       return par->state->in;
+}
+
+static inline const char *xt_inname(const struct xt_action_param *par)
+{
+       return par->state->in->name;
+}
+
+static inline struct net_device *xt_out(const struct xt_action_param *par)
+{
+       return par->state->out;
+}
+
+static inline const char *xt_outname(const struct xt_action_param *par)
+{
+       return par->state->out->name;
+}
+
+static inline unsigned int xt_hooknum(const struct xt_action_param *par)
+{
+       return par->state->hook;
+}
+
+static inline u_int8_t xt_family(const struct xt_action_param *par)
+{
+       return par->state->pf;
+}
+
 /**
  * struct xt_mtchk_param - parameters for match extensions'
  * checkentry functions
@@ -376,37 +404,8 @@ static inline unsigned long ifname_compare_aligned(const char *_a,
 }
 
 
-/* On SMP, ip(6)t_entry->counters.pcnt holds address of the
- * real (percpu) counter.  On !SMP, its just the packet count,
- * so nothing needs to be done there.
- *
- * xt_percpu_counter_alloc returns the address of the percpu
- * counter, or 0 on !SMP. We force an alignment of 16 bytes
- * so that bytes/packets share a common cache line.
- *
- * Hence caller must use IS_ERR_VALUE to check for error, this
- * allows us to return 0 for single core systems without forcing
- * callers to deal with SMP vs. NONSMP issues.
- */
-static inline unsigned long xt_percpu_counter_alloc(void)
-{
-       if (nr_cpu_ids > 1) {
-               void __percpu *res = __alloc_percpu(sizeof(struct xt_counters),
-                                                   sizeof(struct xt_counters));
-
-               if (res == NULL)
-                       return -ENOMEM;
-
-               return (__force unsigned long) res;
-       }
-
-       return 0;
-}
-static inline void xt_percpu_counter_free(u64 pcnt)
-{
-       if (nr_cpu_ids > 1)
-               free_percpu((void __percpu *) (unsigned long) pcnt);
-}
+bool xt_percpu_counter_alloc(struct xt_counters *counters);
+void xt_percpu_counter_free(struct xt_counters *cnt);
 
 static inline struct xt_counters *
 xt_get_this_cpu_counter(struct xt_counters *cnt)