diff options
Diffstat (limited to 'include/net/sock.h')
| -rw-r--r-- | include/net/sock.h | 56 | 
1 files changed, 47 insertions, 9 deletions
diff --git a/include/net/sock.h b/include/net/sock.h index 1621935aad5..3f1a4804bb3 100644 --- a/include/net/sock.h +++ b/include/net/sock.h @@ -105,14 +105,17 @@ struct net;  /**   *	struct sock_common - minimal network layer representation of sockets   *	@skc_node: main hash linkage for various protocol lookup tables - *	@skc_nulls_node: main hash linkage for UDP/UDP-Lite protocol + *	@skc_nulls_node: main hash linkage for TCP/UDP/UDP-Lite protocol   *	@skc_refcnt: reference count + *	@skc_tx_queue_mapping: tx queue number for this connection   *	@skc_hash: hash value used with various protocol lookup tables + *	@skc_u16hashes: two u16 hash values used by UDP lookup tables   *	@skc_family: network address family   *	@skc_state: Connection state   *	@skc_reuse: %SO_REUSEADDR setting   *	@skc_bound_dev_if: bound device index if != 0   *	@skc_bind_node: bind hash linkage for various protocol lookup tables + *	@skc_portaddr_node: second hash linkage for UDP/UDP-Lite protocol   *	@skc_prot: protocol handlers inside a network family   *	@skc_net: reference to the network namespace of this socket   * @@ -128,13 +131,20 @@ struct sock_common {  		struct hlist_nulls_node skc_nulls_node;  	};  	atomic_t		skc_refcnt; +	int			skc_tx_queue_mapping; -	unsigned int		skc_hash; +	union  { +		unsigned int	skc_hash; +		__u16		skc_u16hashes[2]; +	};  	unsigned short		skc_family;  	volatile unsigned char	skc_state;  	unsigned char		skc_reuse;  	int			skc_bound_dev_if; -	struct hlist_node	skc_bind_node; +	union { +		struct hlist_node	skc_bind_node; +		struct hlist_nulls_node skc_portaddr_node; +	};  	struct proto		*skc_prot;  #ifdef CONFIG_NET_NS  	struct net	 	*skc_net; @@ -215,6 +225,7 @@ struct sock {  #define sk_node			__sk_common.skc_node  #define sk_nulls_node		__sk_common.skc_nulls_node  #define sk_refcnt		__sk_common.skc_refcnt +#define sk_tx_queue_mapping	__sk_common.skc_tx_queue_mapping  #define sk_copy_start		__sk_common.skc_hash  #define sk_hash			__sk_common.skc_hash @@ -226,12 +237,12 @@ struct sock {  #define sk_prot			__sk_common.skc_prot  #define sk_net			__sk_common.skc_net  	kmemcheck_bitfield_begin(flags); -	unsigned char		sk_shutdown : 2, -				sk_no_check : 2, -				sk_userlocks : 4; +	unsigned int		sk_shutdown  : 2, +				sk_no_check  : 2, +				sk_userlocks : 4, +				sk_protocol  : 8, +				sk_type      : 16;  	kmemcheck_bitfield_end(flags); -	unsigned char		sk_protocol; -	unsigned short		sk_type;  	int			sk_rcvbuf;  	socket_lock_t		sk_lock;  	/* @@ -504,6 +515,8 @@ enum sock_flags {  	SOCK_TIMESTAMPING_SOFTWARE,     /* %SOF_TIMESTAMPING_SOFTWARE */  	SOCK_TIMESTAMPING_RAW_HARDWARE, /* %SOF_TIMESTAMPING_RAW_HARDWARE */  	SOCK_TIMESTAMPING_SYS_HARDWARE, /* %SOF_TIMESTAMPING_SYS_HARDWARE */ +	SOCK_FASYNC, /* fasync() active */ +	SOCK_RXQ_OVFL,  };  static inline void sock_copy_flags(struct sock *nsk, struct sock *osk) @@ -1092,8 +1105,29 @@ static inline void sock_put(struct sock *sk)  extern int sk_receive_skb(struct sock *sk, struct sk_buff *skb,  			  const int nested); +static inline void sk_tx_queue_set(struct sock *sk, int tx_queue) +{ +	sk->sk_tx_queue_mapping = tx_queue; +} + +static inline void sk_tx_queue_clear(struct sock *sk) +{ +	sk->sk_tx_queue_mapping = -1; +} + +static inline int sk_tx_queue_get(const struct sock *sk) +{ +	return sk->sk_tx_queue_mapping; +} + +static inline bool sk_tx_queue_recorded(const struct sock *sk) +{ +	return (sk && sk->sk_tx_queue_mapping >= 0); +} +  static inline void sk_set_socket(struct sock *sk, struct socket *sock)  { +	sk_tx_queue_clear(sk);  	sk->sk_socket = sock;  } @@ -1150,6 +1184,7 @@ __sk_dst_set(struct sock *sk, struct dst_entry *dst)  {  	struct dst_entry *old_dst; +	sk_tx_queue_clear(sk);  	old_dst = sk->sk_dst_cache;  	sk->sk_dst_cache = dst;  	dst_release(old_dst); @@ -1168,6 +1203,7 @@ __sk_dst_reset(struct sock *sk)  {  	struct dst_entry *old_dst; +	sk_tx_queue_clear(sk);  	old_dst = sk->sk_dst_cache;  	sk->sk_dst_cache = NULL;  	dst_release(old_dst); @@ -1396,7 +1432,7 @@ static inline unsigned long sock_wspace(struct sock *sk)  static inline void sk_wake_async(struct sock *sk, int how, int band)  { -	if (sk->sk_socket && sk->sk_socket->fasync_list) +	if (sock_flag(sk, SOCK_FASYNC))  		sock_wake_async(sk->sk_socket, how, band);  } @@ -1492,6 +1528,8 @@ sock_recv_timestamp(struct msghdr *msg, struct sock *sk, struct sk_buff *skb)  		sk->sk_stamp = kt;  } +extern void sock_recv_ts_and_drops(struct msghdr *msg, struct sock *sk, struct sk_buff *skb); +  /**   * sock_tx_timestamp - checks whether the outgoing packet is to be time stamped   * @msg:	outgoing packet  |