diff options
Diffstat (limited to 'include/net/inet_sock.h')
| -rw-r--r-- | include/net/inet_sock.h | 121 | 
1 files changed, 74 insertions, 47 deletions
diff --git a/include/net/inet_sock.h b/include/net/inet_sock.h index 8945f9fb192..b1edf17bec0 100644 --- a/include/net/inet_sock.h +++ b/include/net/inet_sock.h @@ -31,7 +31,7 @@  /** struct ip_options - IP Options   *   * @faddr - Saved first hop address - * @is_data - Options in __data, rather than skb + * @nexthop - Saved nexthop address in LSRR and SSRR   * @is_strictroute - Strict source route   * @srr_is_hit - Packet destination addr was our one   * @is_changed - IP checksum more not valid @@ -41,6 +41,7 @@   */  struct ip_options {  	__be32		faddr; +	__be32		nexthop;  	unsigned char	optlen;  	unsigned char	srr;  	unsigned char	rr; @@ -57,17 +58,26 @@ struct ip_options {  	unsigned char	__data[0];  }; -#define optlength(opt) (sizeof(struct ip_options) + opt->optlen) +struct ip_options_rcu { +	struct rcu_head rcu; +	struct ip_options opt; +}; + +struct ip_options_data { +	struct ip_options_rcu	opt; +	char			data[40]; +};  struct inet_request_sock {  	struct request_sock	req; -#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) -	u16			inet6_rsk_offset; -#endif -	__be16			loc_port; -	__be32			loc_addr; -	__be32			rmt_addr; -	__be16			rmt_port; +#define ir_loc_addr		req.__req_common.skc_rcv_saddr +#define ir_rmt_addr		req.__req_common.skc_daddr +#define ir_num			req.__req_common.skc_num +#define ir_rmt_port		req.__req_common.skc_dport +#define ir_v6_rmt_addr		req.__req_common.skc_v6_daddr +#define ir_v6_loc_addr		req.__req_common.skc_v6_rcv_saddr +#define ir_iif			req.__req_common.skc_bound_dev_if +  	kmemcheck_bitfield_begin(flags);  	u16			snd_wscale : 4,  				rcv_wscale : 4, @@ -78,7 +88,9 @@ struct inet_request_sock {  				acked	   : 1,  				no_srccheck: 1;  	kmemcheck_bitfield_end(flags); -	struct ip_options	*opt; +	struct ip_options_rcu	*opt; +	struct sk_buff		*pktopts; +	u32                     ir_mark;  };  static inline struct inet_request_sock *inet_rsk(const struct request_sock *sk) @@ -86,6 +98,33 @@ static inline struct inet_request_sock *inet_rsk(const struct request_sock *sk)  	return (struct inet_request_sock *)sk;  } +static inline u32 inet_request_mark(struct sock *sk, struct sk_buff *skb) +{ +	if (!sk->sk_mark && sock_net(sk)->ipv4.sysctl_tcp_fwmark_accept) { +		return skb->mark; +	} else { +		return sk->sk_mark; +	} +} + +struct inet_cork { +	unsigned int		flags; +	__be32			addr; +	struct ip_options	*opt; +	unsigned int		fragsize; +	int			length; /* Total length of all frames */ +	struct dst_entry	*dst; +	u8			tx_flags; +	__u8			ttl; +	__s16			tos; +	char			priority; +}; + +struct inet_cork_full { +	struct inet_cork	base; +	struct flowi		fl; +}; +  struct ip_mc_socklist;  struct ipv6_pinfo;  struct rtable; @@ -105,6 +144,7 @@ struct rtable;   * @tos - TOS   * @mc_ttl - Multicasting TTL   * @is_icsk - is this an inet_connection_sock? + * @uc_index - Unicast outgoing device index   * @mc_index - Multicast device index   * @mc_list - Group array   * @cork - info to build ip hdr on each ip frag while socket is corked @@ -112,21 +152,23 @@ struct rtable;  struct inet_sock {  	/* sk and pinet6 has to be the first two members of inet_sock */  	struct sock		sk; -#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) +#if IS_ENABLED(CONFIG_IPV6)  	struct ipv6_pinfo	*pinet6;  #endif  	/* Socket demultiplex comparisons on incoming packets. */ -	__be32			inet_daddr; -	__be32			inet_rcv_saddr; -	__be16			inet_dport; -	__u16			inet_num; +#define inet_daddr		sk.__sk_common.skc_daddr +#define inet_rcv_saddr		sk.__sk_common.skc_rcv_saddr +#define inet_dport		sk.__sk_common.skc_dport +#define inet_num		sk.__sk_common.skc_num +  	__be32			inet_saddr;  	__s16			uc_ttl;  	__u16			cmsg_flags;  	__be16			inet_sport;  	__u16			inet_id; -	struct ip_options	*opt; +	struct ip_options_rcu __rcu	*inet_opt; +	int			rx_dst_ifindex;  	__u8			tos;  	__u8			min_ttl;  	__u8			mc_ttl; @@ -139,18 +181,12 @@ struct inet_sock {  				transparent:1,  				mc_all:1,  				nodefrag:1; +	__u8			rcv_tos; +	int			uc_index;  	int			mc_index;  	__be32			mc_addr;  	struct ip_mc_socklist __rcu	*mc_list; -	struct { -		unsigned int		flags; -		unsigned int		fragsize; -		struct ip_options	*opt; -		struct dst_entry	*dst; -		int			length; /* Total length of all frames */ -		__be32			addr; -		struct flowi		fl; -	} cork; +	struct inet_cork_full	cork;  };  #define IPCORK_OPT	1	/* ip-options has been held in ipcork.opt */ @@ -168,7 +204,7 @@ static inline void __inet_sk_copy_descendant(struct sock *sk_to,  	memcpy(inet_sk(sk_to) + 1, inet_sk(sk_from) + 1,  	       sk_from->sk_prot->obj_size - ancestor_size);  } -#if !(defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)) +#if !(IS_ENABLED(CONFIG_IPV6))  static inline void inet_sk_copy_descendant(struct sock *sk_to,  					   const struct sock *sk_from)  { @@ -176,31 +212,18 @@ static inline void inet_sk_copy_descendant(struct sock *sk_to,  }  #endif -extern int inet_sk_rebuild_header(struct sock *sk); +int inet_sk_rebuild_header(struct sock *sk); -extern u32 inet_ehash_secret; -extern void build_ehash_secret(void); - -static inline unsigned int inet_ehashfn(struct net *net, -					const __be32 laddr, const __u16 lport, -					const __be32 faddr, const __be16 fport) +static inline unsigned int __inet_ehashfn(const __be32 laddr, +					  const __u16 lport, +					  const __be32 faddr, +					  const __be16 fport, +					  u32 initval)  {  	return jhash_3words((__force __u32) laddr,  			    (__force __u32) faddr,  			    ((__u32) lport) << 16 | (__force __u32)fport, -			    inet_ehash_secret + net_hash_mix(net)); -} - -static inline int inet_sk_ehashfn(const struct sock *sk) -{ -	const struct inet_sock *inet = inet_sk(sk); -	const __be32 laddr = inet->inet_rcv_saddr; -	const __u16 lport = inet->inet_num; -	const __be32 faddr = inet->inet_daddr; -	const __be16 fport = inet->inet_dport; -	struct net *net = sock_net(sk); - -	return inet_ehashfn(net, laddr, lport, faddr, fport); +			    initval);  }  static inline struct request_sock *inet_reqsk_alloc(struct request_sock_ops *ops) @@ -218,7 +241,11 @@ static inline struct request_sock *inet_reqsk_alloc(struct request_sock_ops *ops  static inline __u8 inet_sk_flowi_flags(const struct sock *sk)  { -	return inet_sk(sk)->transparent ? FLOWI_FLAG_ANYSRC : 0; +	__u8 flags = 0; + +	if (inet_sk(sk)->transparent || inet_sk(sk)->hdrincl) +		flags |= FLOWI_FLAG_ANYSRC; +	return flags;  }  #endif	/* _INET_SOCK_H */  | 
