int     (*dump)(struct sk_buff *, struct tc_action *, int, int);
        int     (*cleanup)(struct tc_action *, int bind);
        int     (*lookup)(struct tc_action *, u32);
-       int     (*init)(struct nlattr *, struct nlattr *, struct tc_action *, int , int);
+       int     (*init)(struct net *net, struct nlattr *nla,
+                       struct nlattr *est, struct tc_action *act, int ovr,
+                       int bind);
        int     (*walk)(struct sk_buff *, struct netlink_callback *, int, struct tc_action *);
 };
 
 extern int tcf_unregister_action(struct tc_action_ops *a);
 extern void tcf_action_destroy(struct tc_action *a, int bind);
 extern int tcf_action_exec(struct sk_buff *skb, const struct tc_action *a, struct tcf_result *res);
-extern struct tc_action *tcf_action_init(struct nlattr *nla, struct nlattr *est, char *n, int ovr, int bind);
-extern struct tc_action *tcf_action_init_1(struct nlattr *nla, struct nlattr *est, char *n, int ovr, int bind);
+extern struct tc_action *tcf_action_init(struct net *net, struct nlattr *nla,
+                                        struct nlattr *est, char *n, int ovr,
+                                        int bind);
+extern struct tc_action *tcf_action_init_1(struct net *net, struct nlattr *nla,
+                                          struct nlattr *est, char *n, int ovr,
+                                          int bind);
 extern int tcf_action_dump(struct sk_buff *skb, struct tc_action *a, int, int);
 extern int tcf_action_dump_old(struct sk_buff *skb, struct tc_action *a, int, int);
 extern int tcf_action_dump_1(struct sk_buff *skb, struct tc_action *a, int, int);
 
        return 0;
 }
 
-extern int tcf_exts_validate(struct tcf_proto *tp, struct nlattr **tb,
-                            struct nlattr *rate_tlv, struct tcf_exts *exts,
-                            const struct tcf_ext_map *map);
+extern int tcf_exts_validate(struct net *net, struct tcf_proto *tp,
+                            struct nlattr **tb, struct nlattr *rate_tlv,
+                            struct tcf_exts *exts,
+                            const struct tcf_ext_map *map);
 extern void tcf_exts_destroy(struct tcf_proto *tp, struct tcf_exts *exts);
 extern void tcf_exts_change(struct tcf_proto *tp, struct tcf_exts *dst,
                             struct tcf_exts *src);
 
 
        unsigned long           (*get)(struct tcf_proto*, u32 handle);
        void                    (*put)(struct tcf_proto*, unsigned long);
-       int                     (*change)(struct sk_buff *,
+       int                     (*change)(struct net *net, struct sk_buff *,
                                        struct tcf_proto*, unsigned long,
                                        u32 handle, struct nlattr **,
                                        unsigned long *);
 
        return err;
 }
 
-struct tc_action *tcf_action_init_1(struct nlattr *nla, struct nlattr *est,
-                                   char *name, int ovr, int bind)
+struct tc_action *tcf_action_init_1(struct net *net, struct nlattr *nla,
+                                   struct nlattr *est, char *name, int ovr,
+                                   int bind)
 {
        struct tc_action *a;
        struct tc_action_ops *a_o;
 
        /* backward compatibility for policer */
        if (name == NULL)
-               err = a_o->init(tb[TCA_ACT_OPTIONS], est, a, ovr, bind);
+               err = a_o->init(net, tb[TCA_ACT_OPTIONS], est, a, ovr, bind);
        else
-               err = a_o->init(nla, est, a, ovr, bind);
+               err = a_o->init(net, nla, est, a, ovr, bind);
        if (err < 0)
                goto err_free;
 
        return ERR_PTR(err);
 }
 
-struct tc_action *tcf_action_init(struct nlattr *nla, struct nlattr *est,
-                                 char *name, int ovr, int bind)
+struct tc_action *tcf_action_init(struct net *net, struct nlattr *nla,
+                                 struct nlattr *est, char *name, int ovr,
+                                 int bind)
 {
        struct nlattr *tb[TCA_ACT_MAX_PRIO + 1];
        struct tc_action *head = NULL, *act, *act_prev = NULL;
                return ERR_PTR(err);
 
        for (i = 1; i <= TCA_ACT_MAX_PRIO && tb[i]; i++) {
-               act = tcf_action_init_1(tb[i], est, name, ovr, bind);
+               act = tcf_action_init_1(net, tb[i], est, name, ovr, bind);
                if (IS_ERR(act))
                        goto err;
                act->order = i;
        struct tc_action *a;
        u32 seq = n->nlmsg_seq;
 
-       act = tcf_action_init(nla, NULL, NULL, ovr, 0);
+       act = tcf_action_init(net, nla, NULL, NULL, ovr, 0);
        if (act == NULL)
                goto done;
        if (IS_ERR(act)) {
 
        [TCA_CSUM_PARMS] = { .len = sizeof(struct tc_csum), },
 };
 
-static int tcf_csum_init(struct nlattr *nla, struct nlattr *est,
+static int tcf_csum_init(struct net *n, struct nlattr *nla, struct nlattr *est,
                         struct tc_action *a, int ovr, int bind)
 {
        struct nlattr *tb[TCA_CSUM_MAX + 1];
 
        [TCA_GACT_PROB]         = { .len = sizeof(struct tc_gact_p) },
 };
 
-static int tcf_gact_init(struct nlattr *nla, struct nlattr *est,
-                        struct tc_action *a, int ovr, int bind)
+static int tcf_gact_init(struct net *net, struct nlattr *nla,
+                        struct nlattr *est, struct tc_action *a,
+                        int ovr, int bind)
 {
        struct nlattr *tb[TCA_GACT_MAX + 1];
        struct tc_gact *parm;
 
        [TCA_IPT_TARG]  = { .len = sizeof(struct xt_entry_target) },
 };
 
-static int tcf_ipt_init(struct nlattr *nla, struct nlattr *est,
+static int tcf_ipt_init(struct net *net, struct nlattr *nla, struct nlattr *est,
                        struct tc_action *a, int ovr, int bind)
 {
        struct nlattr *tb[TCA_IPT_MAX + 1];
 
        [TCA_MIRRED_PARMS]      = { .len = sizeof(struct tc_mirred) },
 };
 
-static int tcf_mirred_init(struct nlattr *nla, struct nlattr *est,
-                          struct tc_action *a, int ovr, int bind)
+static int tcf_mirred_init(struct net *net, struct nlattr *nla,
+                          struct nlattr *est, struct tc_action *a, int ovr,
+                          int bind)
 {
        struct nlattr *tb[TCA_MIRRED_MAX + 1];
        struct tc_mirred *parm;
                return -EINVAL;
        }
        if (parm->ifindex) {
-               dev = __dev_get_by_index(&init_net, parm->ifindex);
+               dev = __dev_get_by_index(net, parm->ifindex);
                if (dev == NULL)
                        return -ENODEV;
                switch (dev->type) {
 
        [TCA_NAT_PARMS] = { .len = sizeof(struct tc_nat) },
 };
 
-static int tcf_nat_init(struct nlattr *nla, struct nlattr *est,
+static int tcf_nat_init(struct net *net, struct nlattr *nla, struct nlattr *est,
                        struct tc_action *a, int ovr, int bind)
 {
        struct nlattr *tb[TCA_NAT_MAX + 1];
 
        [TCA_PEDIT_PARMS]       = { .len = sizeof(struct tc_pedit) },
 };
 
-static int tcf_pedit_init(struct nlattr *nla, struct nlattr *est,
-                         struct tc_action *a, int ovr, int bind)
+static int tcf_pedit_init(struct net *net, struct nlattr *nla,
+                         struct nlattr *est, struct tc_action *a,
+                         int ovr, int bind)
 {
        struct nlattr *tb[TCA_PEDIT_MAX + 1];
        struct tc_pedit *parm;
 
        [TCA_POLICE_RESULT]     = { .type = NLA_U32 },
 };
 
-static int tcf_act_police_locate(struct nlattr *nla, struct nlattr *est,
-                                struct tc_action *a, int ovr, int bind)
+static int tcf_act_police_locate(struct net *net, struct nlattr *nla,
+                                struct nlattr *est, struct tc_action *a,
+                                int ovr, int bind)
 {
        unsigned int h;
        int ret = 0, err;
 
        [TCA_DEF_DATA]  = { .type = NLA_STRING, .len = SIMP_MAX_DATA },
 };
 
-static int tcf_simp_init(struct nlattr *nla, struct nlattr *est,
-                        struct tc_action *a, int ovr, int bind)
+static int tcf_simp_init(struct net *net, struct nlattr *nla,
+                        struct nlattr *est, struct tc_action *a,
+                        int ovr, int bind)
 {
        struct nlattr *tb[TCA_DEF_MAX + 1];
        struct tc_defact *parm;
 
        [TCA_SKBEDIT_MARK]              = { .len = sizeof(u32) },
 };
 
-static int tcf_skbedit_init(struct nlattr *nla, struct nlattr *est,
-                        struct tc_action *a, int ovr, int bind)
+static int tcf_skbedit_init(struct net *net, struct nlattr *nla,
+                           struct nlattr *est, struct tc_action *a,
+                           int ovr, int bind)
 {
        struct nlattr *tb[TCA_SKBEDIT_MAX + 1];
        struct tc_skbedit *parm;
 
                }
        }
 
-       err = tp->ops->change(skb, tp, cl, t->tcm_handle, tca, &fh);
+       err = tp->ops->change(net, skb, tp, cl, t->tcm_handle, tca, &fh);
        if (err == 0) {
                if (tp_created) {
                        spin_lock_bh(root_lock);
 }
 EXPORT_SYMBOL(tcf_exts_destroy);
 
-int tcf_exts_validate(struct tcf_proto *tp, struct nlattr **tb,
+int tcf_exts_validate(struct net *net, struct tcf_proto *tp, struct nlattr **tb,
                  struct nlattr *rate_tlv, struct tcf_exts *exts,
                  const struct tcf_ext_map *map)
 {
                struct tc_action *act;
 
                if (map->police && tb[map->police]) {
-                       act = tcf_action_init_1(tb[map->police], rate_tlv,
+                       act = tcf_action_init_1(net, tb[map->police], rate_tlv,
                                                "police", TCA_ACT_NOREPLACE,
                                                TCA_ACT_BIND);
                        if (IS_ERR(act))
                        act->type = TCA_OLD_COMPAT;
                        exts->action = act;
                } else if (map->action && tb[map->action]) {
-                       act = tcf_action_init(tb[map->action], rate_tlv, NULL,
-                                             TCA_ACT_NOREPLACE, TCA_ACT_BIND);
+                       act = tcf_action_init(net, tb[map->action], rate_tlv,
+                                             NULL, TCA_ACT_NOREPLACE,
+                                             TCA_ACT_BIND);
                        if (IS_ERR(act))
                                return PTR_ERR(act);
 
 
        [TCA_BASIC_EMATCHES]    = { .type = NLA_NESTED },
 };
 
-static int basic_set_parms(struct tcf_proto *tp, struct basic_filter *f,
-                          unsigned long base, struct nlattr **tb,
+static int basic_set_parms(struct net *net, struct tcf_proto *tp,
+                          struct basic_filter *f, unsigned long base,
+                          struct nlattr **tb,
                           struct nlattr *est)
 {
        int err = -EINVAL;
        struct tcf_exts e;
        struct tcf_ematch_tree t;
 
-       err = tcf_exts_validate(tp, tb, est, &e, &basic_ext_map);
+       err = tcf_exts_validate(net, tp, tb, est, &e, &basic_ext_map);
        if (err < 0)
                return err;
 
        return err;
 }
 
-static int basic_change(struct sk_buff *in_skb,
+static int basic_change(struct net *net, struct sk_buff *in_skb,
                        struct tcf_proto *tp, unsigned long base, u32 handle,
                        struct nlattr **tca, unsigned long *arg)
 {
        if (f != NULL) {
                if (handle && f->handle != handle)
                        return -EINVAL;
-               return basic_set_parms(tp, f, base, tb, tca[TCA_RATE]);
+               return basic_set_parms(net, tp, f, base, tb, tca[TCA_RATE]);
        }
 
        err = -ENOBUFS;
                f->handle = head->hgenerator;
        }
 
-       err = basic_set_parms(tp, f, base, tb, tca[TCA_RATE]);
+       err = basic_set_parms(net, tp, f, base, tb, tca[TCA_RATE]);
        if (err < 0)
                goto errout;
 
 
        [TCA_CGROUP_EMATCHES]   = { .type = NLA_NESTED },
 };
 
-static int cls_cgroup_change(struct sk_buff *in_skb,
+static int cls_cgroup_change(struct net *net, struct sk_buff *in_skb,
                             struct tcf_proto *tp, unsigned long base,
                             u32 handle, struct nlattr **tca,
                             unsigned long *arg)
        if (err < 0)
                return err;
 
-       err = tcf_exts_validate(tp, tb, tca[TCA_RATE], &e, &cgroup_ext_map);
+       err = tcf_exts_validate(net, tp, tb, tca[TCA_RATE], &e,
+                               &cgroup_ext_map);
        if (err < 0)
                return err;
 
 
        [TCA_FLOW_PERTURB]      = { .type = NLA_U32 },
 };
 
-static int flow_change(struct sk_buff *in_skb, 
+static int flow_change(struct net *net, struct sk_buff *in_skb,
                       struct tcf_proto *tp, unsigned long base,
                       u32 handle, struct nlattr **tca,
                       unsigned long *arg)
                        return -EOPNOTSUPP;
        }
 
-       err = tcf_exts_validate(tp, tb, tca[TCA_RATE], &e, &flow_ext_map);
+       err = tcf_exts_validate(net, tp, tb, tca[TCA_RATE], &e, &flow_ext_map);
        if (err < 0)
                return err;
 
 
 };
 
 static int
-fw_change_attrs(struct tcf_proto *tp, struct fw_filter *f,
+fw_change_attrs(struct net *net, struct tcf_proto *tp, struct fw_filter *f,
        struct nlattr **tb, struct nlattr **tca, unsigned long base)
 {
        struct fw_head *head = (struct fw_head *)tp->root;
        u32 mask;
        int err;
 
-       err = tcf_exts_validate(tp, tb, tca[TCA_RATE], &e, &fw_ext_map);
+       err = tcf_exts_validate(net, tp, tb, tca[TCA_RATE], &e, &fw_ext_map);
        if (err < 0)
                return err;
 
        return err;
 }
 
-static int fw_change(struct sk_buff *in_skb,
+static int fw_change(struct net *net, struct sk_buff *in_skb,
                     struct tcf_proto *tp, unsigned long base,
                     u32 handle,
                     struct nlattr **tca,
        if (f != NULL) {
                if (f->id != handle && handle)
                        return -EINVAL;
-               return fw_change_attrs(tp, f, tb, tca, base);
+               return fw_change_attrs(net, tp, f, tb, tca, base);
        }
 
        if (!handle)
 
        f->id = handle;
 
-       err = fw_change_attrs(tp, f, tb, tca, base);
+       err = fw_change_attrs(net, tp, f, tb, tca, base);
        if (err < 0)
                goto errout;
 
 
        [TCA_ROUTE4_IIF]        = { .type = NLA_U32 },
 };
 
-static int route4_set_parms(struct tcf_proto *tp, unsigned long base,
-       struct route4_filter *f, u32 handle, struct route4_head *head,
-       struct nlattr **tb, struct nlattr *est, int new)
+static int route4_set_parms(struct net *net, struct tcf_proto *tp,
+                           unsigned long base, struct route4_filter *f,
+                           u32 handle, struct route4_head *head,
+                           struct nlattr **tb, struct nlattr *est, int new)
 {
        int err;
        u32 id = 0, to = 0, nhandle = 0x8000;
        struct route4_bucket *b;
        struct tcf_exts e;
 
-       err = tcf_exts_validate(tp, tb, est, &e, &route_ext_map);
+       err = tcf_exts_validate(net, tp, tb, est, &e, &route_ext_map);
        if (err < 0)
                return err;
 
        return err;
 }
 
-static int route4_change(struct sk_buff *in_skb,
+static int route4_change(struct net *net, struct sk_buff *in_skb,
                       struct tcf_proto *tp, unsigned long base,
                       u32 handle,
                       struct nlattr **tca,
                if (f->bkt)
                        old_handle = f->handle;
 
-               err = route4_set_parms(tp, base, f, handle, head, tb,
+               err = route4_set_parms(net, tp, base, f, handle, head, tb,
                        tca[TCA_RATE], 0);
                if (err < 0)
                        return err;
        if (f == NULL)
                goto errout;
 
-       err = route4_set_parms(tp, base, f, handle, head, tb,
+       err = route4_set_parms(net, tp, base, f, handle, head, tb,
                tca[TCA_RATE], 1);
        if (err < 0)
                goto errout;
 
        [TCA_RSVP_PINFO]        = { .len = sizeof(struct tc_rsvp_pinfo) },
 };
 
-static int rsvp_change(struct sk_buff *in_skb,
+static int rsvp_change(struct net *net, struct sk_buff *in_skb,
                       struct tcf_proto *tp, unsigned long base,
                       u32 handle,
                       struct nlattr **tca,
        if (err < 0)
                return err;
 
-       err = tcf_exts_validate(tp, tb, tca[TCA_RATE], &e, &rsvp_ext_map);
+       err = tcf_exts_validate(net, tp, tb, tca[TCA_RATE], &e, &rsvp_ext_map);
        if (err < 0)
                return err;
 
 
 };
 
 static int
-tcindex_set_parms(struct tcf_proto *tp, unsigned long base, u32 handle,
-                 struct tcindex_data *p, struct tcindex_filter_result *r,
-                 struct nlattr **tb, struct nlattr *est)
+tcindex_set_parms(struct net *net, struct tcf_proto *tp, unsigned long base,
+                 u32 handle, struct tcindex_data *p,
+                 struct tcindex_filter_result *r, struct nlattr **tb,
+                struct nlattr *est)
 {
        int err, balloc = 0;
        struct tcindex_filter_result new_filter_result, *old_r = r;
        struct tcindex_filter *f = NULL; /* make gcc behave */
        struct tcf_exts e;
 
-       err = tcf_exts_validate(tp, tb, est, &e, &tcindex_ext_map);
+       err = tcf_exts_validate(net, tp, tb, est, &e, &tcindex_ext_map);
        if (err < 0)
                return err;
 
 }
 
 static int
-tcindex_change(struct sk_buff *in_skb,
+tcindex_change(struct net *net, struct sk_buff *in_skb,
               struct tcf_proto *tp, unsigned long base, u32 handle,
               struct nlattr **tca, unsigned long *arg)
 {
        if (err < 0)
                return err;
 
-       return tcindex_set_parms(tp, base, handle, p, r, tb, tca[TCA_RATE]);
+       return tcindex_set_parms(net, tp, base, handle, p, r, tb,
+                                tca[TCA_RATE]);
 }
 
 
 
        [TCA_U32_MARK]          = { .len = sizeof(struct tc_u32_mark) },
 };
 
-static int u32_set_parms(struct tcf_proto *tp, unsigned long base,
-                        struct tc_u_hnode *ht,
+static int u32_set_parms(struct net *net, struct tcf_proto *tp,
+                        unsigned long base, struct tc_u_hnode *ht,
                         struct tc_u_knode *n, struct nlattr **tb,
                         struct nlattr *est)
 {
        int err;
        struct tcf_exts e;
 
-       err = tcf_exts_validate(tp, tb, est, &e, &u32_ext_map);
+       err = tcf_exts_validate(net, tp, tb, est, &e, &u32_ext_map);
        if (err < 0)
                return err;
 
        return err;
 }
 
-static int u32_change(struct sk_buff *in_skb,
+static int u32_change(struct net *net, struct sk_buff *in_skb,
                      struct tcf_proto *tp, unsigned long base, u32 handle,
                      struct nlattr **tca,
                      unsigned long *arg)
                if (TC_U32_KEY(n->handle) == 0)
                        return -EINVAL;
 
-               return u32_set_parms(tp, base, n->ht_up, n, tb, tca[TCA_RATE]);
+               return u32_set_parms(net, tp, base, n->ht_up, n, tb,
+                                    tca[TCA_RATE]);
        }
 
        if (tb[TCA_U32_DIVISOR]) {
        }
 #endif
 
-       err = u32_set_parms(tp, base, ht, n, tb, tca[TCA_RATE]);
+       err = u32_set_parms(net, tp, base, ht, n, tb, tca[TCA_RATE]);
        if (err == 0) {
                struct tc_u_knode **ins;
                for (ins = &ht->ht[TC_U32_HASH(handle)]; *ins; ins = &(*ins)->next)