diff options
Diffstat (limited to 'include')
| -rw-r--r-- | include/net/fib_rules.h | 6 | ||||
| -rw-r--r-- | include/net/flow.h | 9 | ||||
| -rw-r--r-- | include/net/ip.h | 1 | ||||
| -rw-r--r-- | include/net/ip6_route.h | 2 | ||||
| -rw-r--r-- | include/net/route.h | 5 | ||||
| -rw-r--r-- | include/uapi/linux/fib_rules.h | 2 | ||||
| -rw-r--r-- | include/uapi/linux/rtnetlink.h | 1 | 
7 files changed, 21 insertions, 5 deletions
diff --git a/include/net/fib_rules.h b/include/net/fib_rules.h index e361f488242..4ac12e14c6d 100644 --- a/include/net/fib_rules.h +++ b/include/net/fib_rules.h @@ -23,6 +23,8 @@ struct fib_rule {  	struct fib_rule __rcu	*ctarget;  	char			iifname[IFNAMSIZ];  	char			oifname[IFNAMSIZ]; +	kuid_t			uid_start; +	kuid_t			uid_end;  	struct rcu_head		rcu;  	struct net *		fr_net;  }; @@ -80,7 +82,9 @@ struct fib_rules_ops {  	[FRA_FWMARK]	= { .type = NLA_U32 }, \  	[FRA_FWMASK]	= { .type = NLA_U32 }, \  	[FRA_TABLE]     = { .type = NLA_U32 }, \ -	[FRA_GOTO]	= { .type = NLA_U32 } +	[FRA_GOTO]	= { .type = NLA_U32 }, \ +	[FRA_UID_START]	= { .type = NLA_U32 }, \ +	[FRA_UID_END]	= { .type = NLA_U32 }  static inline void fib_rule_get(struct fib_rule *rule)  { diff --git a/include/net/flow.h b/include/net/flow.h index 628e11b98c5..c91e2aae3fb 100644 --- a/include/net/flow.h +++ b/include/net/flow.h @@ -10,6 +10,7 @@  #include <linux/socket.h>  #include <linux/in6.h>  #include <linux/atomic.h> +#include <linux/uidgid.h>  struct flowi_common {  	int	flowic_oif; @@ -23,6 +24,7 @@ struct flowi_common {  #define FLOWI_FLAG_CAN_SLEEP		0x02  #define FLOWI_FLAG_KNOWN_NH		0x04  	__u32	flowic_secid; +	kuid_t	flowic_uid;  };  union flowi_uli { @@ -59,6 +61,7 @@ struct flowi4 {  #define flowi4_proto		__fl_common.flowic_proto  #define flowi4_flags		__fl_common.flowic_flags  #define flowi4_secid		__fl_common.flowic_secid +#define flowi4_uid		__fl_common.flowic_uid  	/* (saddr,daddr) must be grouped, same order as in IP header */  	__be32			saddr; @@ -78,7 +81,8 @@ static inline void flowi4_init_output(struct flowi4 *fl4, int oif,  				      __u32 mark, __u8 tos, __u8 scope,  				      __u8 proto, __u8 flags,  				      __be32 daddr, __be32 saddr, -				      __be16 dport, __be16 sport) +				      __be16 dport, __be16 sport, +				      kuid_t uid)  {  	fl4->flowi4_oif = oif;  	fl4->flowi4_iif = 0; @@ -88,6 +92,7 @@ static inline void flowi4_init_output(struct flowi4 *fl4, int oif,  	fl4->flowi4_proto = proto;  	fl4->flowi4_flags = flags;  	fl4->flowi4_secid = 0; +	fl4->flowi4_uid = uid;  	fl4->daddr = daddr;  	fl4->saddr = saddr;  	fl4->fl4_dport = dport; @@ -115,6 +120,7 @@ struct flowi6 {  #define flowi6_proto		__fl_common.flowic_proto  #define flowi6_flags		__fl_common.flowic_flags  #define flowi6_secid		__fl_common.flowic_secid +#define flowi6_uid		__fl_common.flowic_uid  	struct in6_addr		daddr;  	struct in6_addr		saddr;  	__be32			flowlabel; @@ -158,6 +164,7 @@ struct flowi {  #define flowi_proto	u.__fl_common.flowic_proto  #define flowi_flags	u.__fl_common.flowic_flags  #define flowi_secid	u.__fl_common.flowic_secid +#define flowi_uid	u.__fl_common.flowic_uid  } __attribute__((__aligned__(BITS_PER_LONG/8)));  static inline struct flowi *flowi4_to_flowi(struct flowi4 *fl4) diff --git a/include/net/ip.h b/include/net/ip.h index 509b8807927..02fc145ecc4 100644 --- a/include/net/ip.h +++ b/include/net/ip.h @@ -153,6 +153,7 @@ struct ip_reply_arg {  				/* -1 if not needed */   	int	    bound_dev_if;  	u8  	    tos; +	kuid_t	    uid;  };   #define IP_REPLY_ARG_NOSRCCHECK 1 diff --git a/include/net/ip6_route.h b/include/net/ip6_route.h index 260f83f16bc..25b4500f28c 100644 --- a/include/net/ip6_route.h +++ b/include/net/ip6_route.h @@ -131,7 +131,7 @@ extern int			rt6_route_rcv(struct net_device *dev,  					      const struct in6_addr *gwaddr);  extern void ip6_update_pmtu(struct sk_buff *skb, struct net *net, __be32 mtu, -			    int oif, u32 mark); +			    int oif, u32 mark, kuid_t uid);  extern void ip6_sk_update_pmtu(struct sk_buff *skb, struct sock *sk,  			       __be32 mtu);  extern void ip6_redirect(struct sk_buff *skb, struct net *net, int oif, u32 mark); diff --git a/include/net/route.h b/include/net/route.h index 2ea40c1b5e0..b5b44875543 100644 --- a/include/net/route.h +++ b/include/net/route.h @@ -142,7 +142,7 @@ static inline struct rtable *ip_route_output_ports(struct net *net, struct flowi  	flowi4_init_output(fl4, oif, sk ? sk->sk_mark : 0, tos,  			   RT_SCOPE_UNIVERSE, proto,  			   sk ? inet_sk_flowi_flags(sk) : 0, -			   daddr, saddr, dport, sport); +			   daddr, saddr, dport, sport, sock_i_uid(sk));  	if (sk)  		security_sk_classify_flow(sk, flowi4_to_flowi(fl4));  	return ip_route_output_flow(net, fl4, sk); @@ -253,7 +253,8 @@ static inline void ip_route_connect_init(struct flowi4 *fl4, __be32 dst, __be32  		flow_flags |= FLOWI_FLAG_CAN_SLEEP;  	flowi4_init_output(fl4, oif, sk->sk_mark, tos, RT_SCOPE_UNIVERSE, -			   protocol, flow_flags, dst, src, dport, sport); +			   protocol, flow_flags, dst, src, dport, sport, +			   sock_i_uid(sk));  }  static inline struct rtable *ip_route_connect(struct flowi4 *fl4, diff --git a/include/uapi/linux/fib_rules.h b/include/uapi/linux/fib_rules.h index 51da65b68b8..9dcdb6251cb 100644 --- a/include/uapi/linux/fib_rules.h +++ b/include/uapi/linux/fib_rules.h @@ -49,6 +49,8 @@ enum {  	FRA_TABLE,	/* Extended table id */  	FRA_FWMASK,	/* mask for netfilter mark */  	FRA_OIFNAME, +	FRA_UID_START,	/* UID range */ +	FRA_UID_END,  	__FRA_MAX  }; diff --git a/include/uapi/linux/rtnetlink.h b/include/uapi/linux/rtnetlink.h index 7a2144e1afa..07c1146c1f5 100644 --- a/include/uapi/linux/rtnetlink.h +++ b/include/uapi/linux/rtnetlink.h @@ -297,6 +297,7 @@ enum rtattr_type_t {  	RTA_TABLE,  	RTA_MARK,  	RTA_MFC_STATS, +	RTA_UID,  	__RTA_MAX  };  |