Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mszeredi...
[deliverable/linux.git] / net / sched / act_mirred.c
index 32fcdecdb9e2074bad6f3e3002738e9c289317c3..e8a760cf7775ea1e3c9522376c3e3111a54a2ba6 100644 (file)
@@ -50,10 +50,13 @@ static const struct nla_policy mirred_policy[TCA_MIRRED_MAX + 1] = {
        [TCA_MIRRED_PARMS]      = { .len = sizeof(struct tc_mirred) },
 };
 
+static int mirred_net_id;
+
 static int tcf_mirred_init(struct net *net, struct nlattr *nla,
                           struct nlattr *est, struct tc_action *a, int ovr,
                           int bind)
 {
+       struct tc_action_net *tn = net_generic(net, mirred_net_id);
        struct nlattr *tb[TCA_MIRRED_MAX + 1];
        struct tc_mirred *parm;
        struct tcf_mirred *m;
@@ -96,11 +99,11 @@ static int tcf_mirred_init(struct net *net, struct nlattr *nla,
                dev = NULL;
        }
 
-       if (!tcf_hash_check(parm->index, a, bind)) {
+       if (!tcf_hash_check(tn, parm->index, a, bind)) {
                if (dev == NULL)
                        return -EINVAL;
-               ret = tcf_hash_create(parm->index, est, a, sizeof(*m),
-                                     bind, true);
+               ret = tcf_hash_create(tn, parm->index, est, a,
+                                     sizeof(*m), bind, true);
                if (ret)
                        return ret;
                ret = ACT_P_CREATED;
@@ -130,7 +133,7 @@ static int tcf_mirred_init(struct net *net, struct nlattr *nla,
                spin_lock_bh(&mirred_list_lock);
                list_add(&m->tcfm_list, &mirred_list);
                spin_unlock_bh(&mirred_list_lock);
-               tcf_hash_insert(a);
+               tcf_hash_insert(tn, a);
        }
 
        return ret;
@@ -179,7 +182,6 @@ static int tcf_mirred(struct sk_buff *skb, const struct tc_action *a,
 
        skb2->skb_iif = skb->dev->ifindex;
        skb2->dev = dev;
-       skb_sender_cpu_clear(skb2);
        err = dev_queue_xmit(skb2);
 
        if (err) {
@@ -221,6 +223,22 @@ nla_put_failure:
        return -1;
 }
 
+static int tcf_mirred_walker(struct net *net, struct sk_buff *skb,
+                            struct netlink_callback *cb, int type,
+                            struct tc_action *a)
+{
+       struct tc_action_net *tn = net_generic(net, mirred_net_id);
+
+       return tcf_generic_walker(tn, skb, cb, type, a);
+}
+
+static int tcf_mirred_search(struct net *net, struct tc_action *a, u32 index)
+{
+       struct tc_action_net *tn = net_generic(net, mirred_net_id);
+
+       return tcf_hash_search(tn, a, index);
+}
+
 static int mirred_device_event(struct notifier_block *unused,
                               unsigned long event, void *ptr)
 {
@@ -257,6 +275,29 @@ static struct tc_action_ops act_mirred_ops = {
        .dump           =       tcf_mirred_dump,
        .cleanup        =       tcf_mirred_release,
        .init           =       tcf_mirred_init,
+       .walk           =       tcf_mirred_walker,
+       .lookup         =       tcf_mirred_search,
+};
+
+static __net_init int mirred_init_net(struct net *net)
+{
+       struct tc_action_net *tn = net_generic(net, mirred_net_id);
+
+       return tc_action_net_init(tn, &act_mirred_ops, MIRRED_TAB_MASK);
+}
+
+static void __net_exit mirred_exit_net(struct net *net)
+{
+       struct tc_action_net *tn = net_generic(net, mirred_net_id);
+
+       tc_action_net_exit(tn);
+}
+
+static struct pernet_operations mirred_net_ops = {
+       .init = mirred_init_net,
+       .exit = mirred_exit_net,
+       .id   = &mirred_net_id,
+       .size = sizeof(struct tc_action_net),
 };
 
 MODULE_AUTHOR("Jamal Hadi Salim(2002)");
@@ -270,12 +311,12 @@ static int __init mirred_init_module(void)
                return err;
 
        pr_info("Mirror/redirect action on\n");
-       return tcf_register_action(&act_mirred_ops, MIRRED_TAB_MASK);
+       return tcf_register_action(&act_mirred_ops, &mirred_net_ops);
 }
 
 static void __exit mirred_cleanup_module(void)
 {
-       tcf_unregister_action(&act_mirred_ops);
+       tcf_unregister_action(&act_mirred_ops, &mirred_net_ops);
        unregister_netdevice_notifier(&mirred_device_notifier);
 }
 
This page took 0.025658 seconds and 5 git commands to generate.