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: David S. Miller <davem@davemloft.net> Acked-by: Serge Hallyn <serge.hallyn@canonical.com> Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
This commit is contained in:
parent
9eea9515cb
commit
af4c6641f5
|
@ -188,7 +188,8 @@ struct tcf_proto_ops {
|
||||||
|
|
||||||
unsigned long (*get)(struct tcf_proto*, u32 handle);
|
unsigned long (*get)(struct tcf_proto*, u32 handle);
|
||||||
void (*put)(struct tcf_proto*, unsigned long);
|
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 **,
|
u32 handle, struct nlattr **,
|
||||||
unsigned long *);
|
unsigned long *);
|
||||||
int (*delete)(struct tcf_proto*, unsigned long);
|
int (*delete)(struct tcf_proto*, unsigned long);
|
||||||
|
|
|
@ -319,7 +319,7 @@ replay:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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 (err == 0) {
|
||||||
if (tp_created) {
|
if (tp_created) {
|
||||||
spin_lock_bh(root_lock);
|
spin_lock_bh(root_lock);
|
||||||
|
|
|
@ -162,7 +162,8 @@ errout:
|
||||||
return err;
|
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)
|
struct nlattr **tca, unsigned long *arg)
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
|
|
|
@ -151,7 +151,8 @@ static const struct nla_policy cgroup_policy[TCA_CGROUP_MAX + 1] = {
|
||||||
[TCA_CGROUP_EMATCHES] = { .type = NLA_NESTED },
|
[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,
|
u32 handle, struct nlattr **tca,
|
||||||
unsigned long *arg)
|
unsigned long *arg)
|
||||||
{
|
{
|
||||||
|
|
|
@ -347,7 +347,8 @@ static const struct nla_policy flow_policy[TCA_FLOW_MAX + 1] = {
|
||||||
[TCA_FLOW_PERTURB] = { .type = NLA_U32 },
|
[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,
|
u32 handle, struct nlattr **tca,
|
||||||
unsigned long *arg)
|
unsigned long *arg)
|
||||||
{
|
{
|
||||||
|
|
|
@ -233,7 +233,8 @@ errout:
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int fw_change(struct tcf_proto *tp, unsigned long base,
|
static int fw_change(struct sk_buff *in_skb,
|
||||||
|
struct tcf_proto *tp, unsigned long base,
|
||||||
u32 handle,
|
u32 handle,
|
||||||
struct nlattr **tca,
|
struct nlattr **tca,
|
||||||
unsigned long *arg)
|
unsigned long *arg)
|
||||||
|
|
|
@ -427,7 +427,8 @@ errout:
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int route4_change(struct tcf_proto *tp, unsigned long base,
|
static int route4_change(struct sk_buff *in_skb,
|
||||||
|
struct tcf_proto *tp, unsigned long base,
|
||||||
u32 handle,
|
u32 handle,
|
||||||
struct nlattr **tca,
|
struct nlattr **tca,
|
||||||
unsigned long *arg)
|
unsigned long *arg)
|
||||||
|
|
|
@ -416,7 +416,8 @@ static const struct nla_policy rsvp_policy[TCA_RSVP_MAX + 1] = {
|
||||||
[TCA_RSVP_PINFO] = { .len = sizeof(struct tc_rsvp_pinfo) },
|
[TCA_RSVP_PINFO] = { .len = sizeof(struct tc_rsvp_pinfo) },
|
||||||
};
|
};
|
||||||
|
|
||||||
static int rsvp_change(struct tcf_proto *tp, unsigned long base,
|
static int rsvp_change(struct sk_buff *in_skb,
|
||||||
|
struct tcf_proto *tp, unsigned long base,
|
||||||
u32 handle,
|
u32 handle,
|
||||||
struct nlattr **tca,
|
struct nlattr **tca,
|
||||||
unsigned long *arg)
|
unsigned long *arg)
|
||||||
|
|
|
@ -332,7 +332,8 @@ errout:
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
tcindex_change(struct tcf_proto *tp, unsigned long base, u32 handle,
|
tcindex_change(struct sk_buff *in_skb,
|
||||||
|
struct tcf_proto *tp, unsigned long base, u32 handle,
|
||||||
struct nlattr **tca, unsigned long *arg)
|
struct nlattr **tca, unsigned long *arg)
|
||||||
{
|
{
|
||||||
struct nlattr *opt = tca[TCA_OPTIONS];
|
struct nlattr *opt = tca[TCA_OPTIONS];
|
||||||
|
|
|
@ -544,7 +544,8 @@ errout:
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int u32_change(struct tcf_proto *tp, unsigned long base, u32 handle,
|
static int u32_change(struct sk_buff *in_skb,
|
||||||
|
struct tcf_proto *tp, unsigned long base, u32 handle,
|
||||||
struct nlattr **tca,
|
struct nlattr **tca,
|
||||||
unsigned long *arg)
|
unsigned long *arg)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue