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); | ||||
| 	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); | ||||
|  | ||||
| @ -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 (tp_created) { | ||||
| 			spin_lock_bh(root_lock); | ||||
|  | ||||
| @ -162,7 +162,8 @@ errout: | ||||
| 	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; | ||||
|  | ||||
| @ -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) | ||||
| { | ||||
|  | ||||
| @ -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) | ||||
| { | ||||
|  | ||||
| @ -233,7 +233,8 @@ errout: | ||||
| 	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, | ||||
| 		     struct nlattr **tca, | ||||
| 		     unsigned long *arg) | ||||
|  | ||||
| @ -427,7 +427,8 @@ errout: | ||||
| 	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, | ||||
| 		       struct nlattr **tca, | ||||
| 		       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) }, | ||||
| }; | ||||
| 
 | ||||
| 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, | ||||
| 		       struct nlattr **tca, | ||||
| 		       unsigned long *arg) | ||||
|  | ||||
| @ -332,7 +332,8 @@ errout: | ||||
| } | ||||
| 
 | ||||
| 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 *opt = tca[TCA_OPTIONS]; | ||||
|  | ||||
| @ -544,7 +544,8 @@ errout: | ||||
| 	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, | ||||
| 		      unsigned long *arg) | ||||
| { | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user