MODULE_PARM_DESC(raw_before_defrag, "Enable raw table before defrag");
 module_param(raw_before_defrag, bool, 0000);
 
-static struct xt_table packet_raw = {
+static const struct xt_table packet_raw = {
        .name = "raw",
        .valid_hooks =  RAW_VALID_HOOKS,
        .me = THIS_MODULE,
        .table_init = iptable_raw_table_init,
 };
 
+static const struct xt_table packet_raw_before_defrag = {
+       .name = "raw",
+       .valid_hooks =  RAW_VALID_HOOKS,
+       .me = THIS_MODULE,
+       .af = NFPROTO_IPV4,
+       .priority = NF_IP_PRI_RAW_BEFORE_DEFRAG,
+       .table_init = iptable_raw_table_init,
+};
+
 /* The work comes in here from netfilter.c. */
 static unsigned int
 iptable_raw_hook(void *priv, struct sk_buff *skb,
 static int __net_init iptable_raw_table_init(struct net *net)
 {
        struct ipt_replace *repl;
+       const struct xt_table *table = &packet_raw;
        int ret;
 
+       if (raw_before_defrag)
+               table = &packet_raw_before_defrag;
+
        if (net->ipv4.iptable_raw)
                return 0;
 
-       repl = ipt_alloc_initial_table(&packet_raw);
+       repl = ipt_alloc_initial_table(table);
        if (repl == NULL)
                return -ENOMEM;
-       ret = ipt_register_table(net, &packet_raw, repl, rawtable_ops,
+       ret = ipt_register_table(net, table, repl, rawtable_ops,
                                 &net->ipv4.iptable_raw);
        kfree(repl);
        return ret;
 static int __init iptable_raw_init(void)
 {
        int ret;
+       const struct xt_table *table = &packet_raw;
 
        if (raw_before_defrag) {
-               packet_raw.priority = NF_IP_PRI_RAW_BEFORE_DEFRAG;
+               table = &packet_raw_before_defrag;
 
                pr_info("Enabling raw table before defrag\n");
        }
 
-       rawtable_ops = xt_hook_ops_alloc(&packet_raw, iptable_raw_hook);
+       rawtable_ops = xt_hook_ops_alloc(table, iptable_raw_hook);
        if (IS_ERR(rawtable_ops))
                return PTR_ERR(rawtable_ops);
 
 
 MODULE_PARM_DESC(raw_before_defrag, "Enable raw table before defrag");
 module_param(raw_before_defrag, bool, 0000);
 
-static struct xt_table packet_raw = {
+static const struct xt_table packet_raw = {
        .name = "raw",
        .valid_hooks = RAW_VALID_HOOKS,
        .me = THIS_MODULE,
        .table_init = ip6table_raw_table_init,
 };
 
+static const struct xt_table packet_raw_before_defrag = {
+       .name = "raw",
+       .valid_hooks = RAW_VALID_HOOKS,
+       .me = THIS_MODULE,
+       .af = NFPROTO_IPV6,
+       .priority = NF_IP6_PRI_RAW_BEFORE_DEFRAG,
+       .table_init = ip6table_raw_table_init,
+};
+
 /* The work comes in here from netfilter.c. */
 static unsigned int
 ip6table_raw_hook(void *priv, struct sk_buff *skb,
 static int __net_init ip6table_raw_table_init(struct net *net)
 {
        struct ip6t_replace *repl;
+       const struct xt_table *table = &packet_raw;
        int ret;
 
+       if (raw_before_defrag)
+               table = &packet_raw_before_defrag;
+
        if (net->ipv6.ip6table_raw)
                return 0;
 
-       repl = ip6t_alloc_initial_table(&packet_raw);
+       repl = ip6t_alloc_initial_table(table);
        if (repl == NULL)
                return -ENOMEM;
-       ret = ip6t_register_table(net, &packet_raw, repl, rawtable_ops,
+       ret = ip6t_register_table(net, table, repl, rawtable_ops,
                                  &net->ipv6.ip6table_raw);
        kfree(repl);
        return ret;
 static int __init ip6table_raw_init(void)
 {
        int ret;
+       const struct xt_table *table = &packet_raw;
 
        if (raw_before_defrag) {
-               packet_raw.priority = NF_IP6_PRI_RAW_BEFORE_DEFRAG;
+               table = &packet_raw_before_defrag;
 
                pr_info("Enabling raw table before defrag\n");
        }
 
        /* Register hooks */
-       rawtable_ops = xt_hook_ops_alloc(&packet_raw, ip6table_raw_hook);
+       rawtable_ops = xt_hook_ops_alloc(table, ip6table_raw_hook);
        if (IS_ERR(rawtable_ops))
                return PTR_ERR(rawtable_ops);