Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit af4c6641 authored by Eric W. Biederman's avatar Eric W. Biederman
Browse files

net sched: Pass the skb into change so it can access NETLINK_CB



cls_flow.c plays with uids and gids.  Unless I misread that
code it is possible for classifiers to depend on the specific uid and
gid values.  Therefore I need to know the user namespace of the
netlink socket that is installing the packet classifiers.  Pass
in the rtnetlink skb so I can access the NETLINK_CB of the passed
packet.  In particular I want access to sk_user_ns(NETLINK_CB(in_skb).ssk).

Pass in not the user namespace but the incomming rtnetlink skb into
the the classifier change routines as that is generally the more useful
parameter.

Cc: Jamal Hadi Salim <jhs@mojatatu.com>
Acked-by: default avatarDavid S. Miller <davem@davemloft.net>
Acked-by: default avatarSerge Hallyn <serge.hallyn@canonical.com>
Signed-off-by: default avatarEric W. Biederman <ebiederm@xmission.com>
parent 9eea9515
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -188,7 +188,8 @@ struct tcf_proto_ops {

	unsigned long		(*get)(struct tcf_proto*, u32 handle);
	void			(*put)(struct tcf_proto*, unsigned long);
	int			(*change)(struct tcf_proto*, unsigned long,
	int			(*change)(struct sk_buff *,
					struct tcf_proto*, unsigned long,
					u32 handle, struct nlattr **,
					unsigned long *);
	int			(*delete)(struct tcf_proto*, unsigned long);
+1 −1
Original line number Diff line number Diff line
@@ -319,7 +319,7 @@ static int tc_ctl_tfilter(struct sk_buff *skb, struct nlmsghdr *n, void *arg)
		}
	}

	err = tp->ops->change(tp, cl, t->tcm_handle, tca, &fh);
	err = tp->ops->change(skb, tp, cl, t->tcm_handle, tca, &fh);
	if (err == 0) {
		if (tp_created) {
			spin_lock_bh(root_lock);
+2 −1
Original line number Diff line number Diff line
@@ -162,7 +162,8 @@ static int basic_set_parms(struct tcf_proto *tp, struct basic_filter *f,
	return err;
}

static int basic_change(struct tcf_proto *tp, unsigned long base, u32 handle,
static int basic_change(struct sk_buff *in_skb,
			struct tcf_proto *tp, unsigned long base, u32 handle,
			struct nlattr **tca, unsigned long *arg)
{
	int err;
+2 −1
Original line number Diff line number Diff line
@@ -151,7 +151,8 @@ static const struct nla_policy cgroup_policy[TCA_CGROUP_MAX + 1] = {
	[TCA_CGROUP_EMATCHES]	= { .type = NLA_NESTED },
};

static int cls_cgroup_change(struct tcf_proto *tp, unsigned long base,
static int cls_cgroup_change(struct sk_buff *in_skb,
			     struct tcf_proto *tp, unsigned long base,
			     u32 handle, struct nlattr **tca,
			     unsigned long *arg)
{
+2 −1
Original line number Diff line number Diff line
@@ -347,7 +347,8 @@ static const struct nla_policy flow_policy[TCA_FLOW_MAX + 1] = {
	[TCA_FLOW_PERTURB]	= { .type = NLA_U32 },
};

static int flow_change(struct tcf_proto *tp, unsigned long base,
static int flow_change(struct sk_buff *in_skb, 
		       struct tcf_proto *tp, unsigned long base,
		       u32 handle, struct nlattr **tca,
		       unsigned long *arg)
{
Loading