#include <linux/ipv6.h>
 #include <linux/netlink.h>
 #include <linux/netfilter.h>
+#include <linux/netfilter/x_tables.h>
 #include <linux/vmalloc.h>
 #include <net/netlink.h>
 
         *                      zero for no match/success to add/delete
         *                      positive for matching element */
        int (*kadt)(struct ip_set *set, const struct sk_buff * skb,
+                   const struct xt_action_param *par,
                    enum ipset_adt adt, const struct ip_set_adt_opt *opt);
 
        /* Userspace: test/add/del entries
 /* API for iptables set match, and SET target */
 
 extern int ip_set_add(ip_set_id_t id, const struct sk_buff *skb,
+                     const struct xt_action_param *par,
                      const struct ip_set_adt_opt *opt);
 extern int ip_set_del(ip_set_id_t id, const struct sk_buff *skb,
+                     const struct xt_action_param *par,
                      const struct ip_set_adt_opt *opt);
 extern int ip_set_test(ip_set_id_t id, const struct sk_buff *skb,
+                      const struct xt_action_param *par,
                       const struct ip_set_adt_opt *opt);
 
 /* Utility functions */
 
 
 static int
 type_pf_kadt(struct ip_set *set, const struct sk_buff * skb,
+            const struct xt_action_param *par,
             enum ipset_adt adt, const struct ip_set_adt_opt *opt);
 static int
 type_pf_uadt(struct ip_set *set, struct nlattr *tb[],
 
 
 static int
 bitmap_ip_kadt(struct ip_set *set, const struct sk_buff *skb,
+              const struct xt_action_param *par,
               enum ipset_adt adt, const struct ip_set_adt_opt *opt)
 {
        struct bitmap_ip *map = set->data;
 
 
 static int
 bitmap_ipmac_kadt(struct ip_set *set, const struct sk_buff *skb,
+                 const struct xt_action_param *par,
                  enum ipset_adt adt, const struct ip_set_adt_opt *opt)
 {
        struct bitmap_ipmac *map = set->data;
 
 
 static int
 bitmap_port_kadt(struct ip_set *set, const struct sk_buff *skb,
+                const struct xt_action_param *par,
                 enum ipset_adt adt, const struct ip_set_adt_opt *opt)
 {
        struct bitmap_port *map = set->data;
 
 #include <net/netlink.h>
 
 #include <linux/netfilter.h>
+#include <linux/netfilter/x_tables.h>
 #include <linux/netfilter/nfnetlink.h>
 #include <linux/netfilter/ipset/ip_set.h>
 
 
 int
 ip_set_test(ip_set_id_t index, const struct sk_buff *skb,
+           const struct xt_action_param *par,
            const struct ip_set_adt_opt *opt)
 {
        struct ip_set *set = ip_set_list[index];
                return 0;
 
        read_lock_bh(&set->lock);
-       ret = set->variant->kadt(set, skb, IPSET_TEST, opt);
+       ret = set->variant->kadt(set, skb, par, IPSET_TEST, opt);
        read_unlock_bh(&set->lock);
 
        if (ret == -EAGAIN) {
                /* Type requests element to be completed */
                pr_debug("element must be competed, ADD is triggered\n");
                write_lock_bh(&set->lock);
-               set->variant->kadt(set, skb, IPSET_ADD, opt);
+               set->variant->kadt(set, skb, par, IPSET_ADD, opt);
                write_unlock_bh(&set->lock);
                ret = 1;
        }
 
 int
 ip_set_add(ip_set_id_t index, const struct sk_buff *skb,
+          const struct xt_action_param *par,
           const struct ip_set_adt_opt *opt)
 {
        struct ip_set *set = ip_set_list[index];
                return 0;
 
        write_lock_bh(&set->lock);
-       ret = set->variant->kadt(set, skb, IPSET_ADD, opt);
+       ret = set->variant->kadt(set, skb, par, IPSET_ADD, opt);
        write_unlock_bh(&set->lock);
 
        return ret;
 
 int
 ip_set_del(ip_set_id_t index, const struct sk_buff *skb,
+          const struct xt_action_param *par,
           const struct ip_set_adt_opt *opt)
 {
        struct ip_set *set = ip_set_list[index];
                return 0;
 
        write_lock_bh(&set->lock);
-       ret = set->variant->kadt(set, skb, IPSET_DEL, opt);
+       ret = set->variant->kadt(set, skb, par, IPSET_DEL, opt);
        write_unlock_bh(&set->lock);
 
        return ret;
 
 
 static int
 hash_ip4_kadt(struct ip_set *set, const struct sk_buff *skb,
+             const struct xt_action_param *par,
              enum ipset_adt adt, const struct ip_set_adt_opt *opt)
 {
        const struct ip_set_hash *h = set->data;
 
 static int
 hash_ip6_kadt(struct ip_set *set, const struct sk_buff *skb,
+             const struct xt_action_param *par,
              enum ipset_adt adt, const struct ip_set_adt_opt *opt)
 {
        const struct ip_set_hash *h = set->data;
 
 
 static int
 hash_ipport4_kadt(struct ip_set *set, const struct sk_buff *skb,
+                 const struct xt_action_param *par,
                  enum ipset_adt adt, const struct ip_set_adt_opt *opt)
 {
        const struct ip_set_hash *h = set->data;
 
 static int
 hash_ipport6_kadt(struct ip_set *set, const struct sk_buff *skb,
+                 const struct xt_action_param *par,
                  enum ipset_adt adt, const struct ip_set_adt_opt *opt)
 {
        const struct ip_set_hash *h = set->data;
 
 
 static int
 hash_ipportip4_kadt(struct ip_set *set, const struct sk_buff *skb,
+                   const struct xt_action_param *par,
                    enum ipset_adt adt, const struct ip_set_adt_opt *opt)
 {
        const struct ip_set_hash *h = set->data;
 
 static int
 hash_ipportip6_kadt(struct ip_set *set, const struct sk_buff *skb,
+                   const struct xt_action_param *par,
                    enum ipset_adt adt, const struct ip_set_adt_opt *opt)
 {
        const struct ip_set_hash *h = set->data;
 
 
 static int
 hash_ipportnet4_kadt(struct ip_set *set, const struct sk_buff *skb,
+                    const struct xt_action_param *par,
                     enum ipset_adt adt, const struct ip_set_adt_opt *opt)
 {
        const struct ip_set_hash *h = set->data;
 
 static int
 hash_ipportnet6_kadt(struct ip_set *set, const struct sk_buff *skb,
+                    const struct xt_action_param *par,
                     enum ipset_adt adt, const struct ip_set_adt_opt *opt)
 {
        const struct ip_set_hash *h = set->data;
 
 
 static int
 hash_net4_kadt(struct ip_set *set, const struct sk_buff *skb,
+              const struct xt_action_param *par,
               enum ipset_adt adt, const struct ip_set_adt_opt *opt)
 {
        const struct ip_set_hash *h = set->data;
 
 static int
 hash_net6_kadt(struct ip_set *set, const struct sk_buff *skb,
+              const struct xt_action_param *par,
               enum ipset_adt adt, const struct ip_set_adt_opt *opt)
 {
        const struct ip_set_hash *h = set->data;
 
 
 static int
 hash_netport4_kadt(struct ip_set *set, const struct sk_buff *skb,
+                  const struct xt_action_param *par,
                   enum ipset_adt adt, const struct ip_set_adt_opt *opt)
 {
        const struct ip_set_hash *h = set->data;
 
 static int
 hash_netport6_kadt(struct ip_set *set, const struct sk_buff *skb,
+                  const struct xt_action_param *par,
                   enum ipset_adt adt, const struct ip_set_adt_opt *opt)
 {
        const struct ip_set_hash *h = set->data;
 
 
 static int
 list_set_kadt(struct ip_set *set, const struct sk_buff *skb,
+             const struct xt_action_param *par,
              enum ipset_adt adt, const struct ip_set_adt_opt *opt)
 {
        struct list_set *map = set->data;
                        continue;
                switch (adt) {
                case IPSET_TEST:
-                       ret = ip_set_test(elem->id, skb, opt);
+                       ret = ip_set_test(elem->id, skb, par, opt);
                        if (ret > 0)
                                return ret;
                        break;
                case IPSET_ADD:
-                       ret = ip_set_add(elem->id, skb, opt);
+                       ret = ip_set_add(elem->id, skb, par, opt);
                        if (ret == 0)
                                return ret;
                        break;
                case IPSET_DEL:
-                       ret = ip_set_del(elem->id, skb, opt);
+                       ret = ip_set_del(elem->id, skb, par, opt);
                        if (ret == 0)
                                return ret;
                        break;
 
 
 static inline int
 match_set(ip_set_id_t index, const struct sk_buff *skb,
+         const struct xt_action_param *par,
          const struct ip_set_adt_opt *opt, int inv)
 {
-       if (ip_set_test(index, skb, opt))
+       if (ip_set_test(index, skb, par, opt))
                inv = !inv;
        return inv;
 }
        ADT_OPT(opt, par->family, info->match_set.u.compat.dim,
                info->match_set.u.compat.flags, 0, UINT_MAX);
 
-       return match_set(info->match_set.index, skb, &opt,
+       return match_set(info->match_set.index, skb, par, &opt,
                         info->match_set.u.compat.flags & IPSET_INV_MATCH);
 }
 
                info->del_set.u.compat.flags, 0, UINT_MAX);
 
        if (info->add_set.index != IPSET_INVALID_ID)
-               ip_set_add(info->add_set.index, skb, &add_opt);
+               ip_set_add(info->add_set.index, skb, par, &add_opt);
        if (info->del_set.index != IPSET_INVALID_ID)
-               ip_set_del(info->del_set.index, skb, &del_opt);
+               ip_set_del(info->del_set.index, skb, par, &del_opt);
 
        return XT_CONTINUE;
 }
        ADT_OPT(opt, par->family, info->match_set.dim,
                info->match_set.flags, 0, UINT_MAX);
 
-       return match_set(info->match_set.index, skb, &opt,
+       return match_set(info->match_set.index, skb, par, &opt,
                         info->match_set.flags & IPSET_INV_MATCH);
 }
 
                info->del_set.flags, 0, UINT_MAX);
 
        if (info->add_set.index != IPSET_INVALID_ID)
-               ip_set_add(info->add_set.index, skb, &add_opt);
+               ip_set_add(info->add_set.index, skb, par, &add_opt);
        if (info->del_set.index != IPSET_INVALID_ID)
-               ip_set_del(info->del_set.index, skb, &del_opt);
+               ip_set_del(info->del_set.index, skb, par, &del_opt);
 
        return XT_CONTINUE;
 }
                info->del_set.flags, 0, UINT_MAX);
 
        if (info->add_set.index != IPSET_INVALID_ID)
-               ip_set_add(info->add_set.index, skb, &add_opt);
+               ip_set_add(info->add_set.index, skb, par, &add_opt);
        if (info->del_set.index != IPSET_INVALID_ID)
-               ip_set_del(info->del_set.index, skb, &del_opt);
+               ip_set_del(info->del_set.index, skb, par, &del_opt);
 
        return XT_CONTINUE;
 }