diff options
Diffstat (limited to 'include/net/inet_hashtables.h')
| -rw-r--r-- | include/net/inet_hashtables.h | 25 | 
1 files changed, 18 insertions, 7 deletions
diff --git a/include/net/inet_hashtables.h b/include/net/inet_hashtables.h index 9141e95529e7..babb14136705 100644 --- a/include/net/inet_hashtables.h +++ b/include/net/inet_hashtables.h @@ -79,6 +79,7 @@ struct inet_ehash_bucket {  struct inet_bind_bucket {  	possible_net_t		ib_net; +	int			l3mdev;  	unsigned short		port;  	signed char		fastreuse;  	signed char		fastreuseport; @@ -188,10 +189,21 @@ static inline void inet_ehash_locks_free(struct inet_hashinfo *hashinfo)  	hashinfo->ehash_locks = NULL;  } +static inline bool inet_sk_bound_dev_eq(struct net *net, int bound_dev_if, +					int dif, int sdif) +{ +#if IS_ENABLED(CONFIG_NET_L3_MASTER_DEV) +	return inet_bound_dev_eq(!!net->ipv4.sysctl_tcp_l3mdev_accept, +				 bound_dev_if, dif, sdif); +#else +	return inet_bound_dev_eq(true, bound_dev_if, dif, sdif); +#endif +} +  struct inet_bind_bucket *  inet_bind_bucket_create(struct kmem_cache *cachep, struct net *net,  			struct inet_bind_hashbucket *head, -			const unsigned short snum); +			const unsigned short snum, int l3mdev);  void inet_bind_bucket_destroy(struct kmem_cache *cachep,  			      struct inet_bind_bucket *tb); @@ -225,6 +237,7 @@ void inet_hashinfo2_init(struct inet_hashinfo *h, const char *name,  			 unsigned long numentries, int scale,  			 unsigned long low_limit,  			 unsigned long high_limit); +int inet_hashinfo2_init_mod(struct inet_hashinfo *h);  bool inet_ehash_insert(struct sock *sk, struct sock *osk);  bool inet_ehash_nolisten(struct sock *sk, struct sock *osk); @@ -282,9 +295,8 @@ static inline struct sock *inet_lookup_listener(struct net *net,  #define INET_MATCH(__sk, __net, __cookie, __saddr, __daddr, __ports, __dif, __sdif) \  	(((__sk)->sk_portpair == (__ports))			&&	\  	 ((__sk)->sk_addrpair == (__cookie))			&&	\ -	 (!(__sk)->sk_bound_dev_if	||				\ -	   ((__sk)->sk_bound_dev_if == (__dif))			||	\ -	   ((__sk)->sk_bound_dev_if == (__sdif)))		&&	\ +	 (((__sk)->sk_bound_dev_if == (__dif))			||	\ +	  ((__sk)->sk_bound_dev_if == (__sdif)))		&&	\  	 net_eq(sock_net(__sk), (__net)))  #else /* 32-bit arch */  #define INET_ADDR_COOKIE(__name, __saddr, __daddr) \ @@ -294,9 +306,8 @@ static inline struct sock *inet_lookup_listener(struct net *net,  	(((__sk)->sk_portpair == (__ports))		&&		\  	 ((__sk)->sk_daddr	== (__saddr))		&&		\  	 ((__sk)->sk_rcv_saddr	== (__daddr))		&&		\ -	 (!(__sk)->sk_bound_dev_if	||				\ -	   ((__sk)->sk_bound_dev_if == (__dif))		||		\ -	   ((__sk)->sk_bound_dev_if == (__sdif)))	&&		\ +	 (((__sk)->sk_bound_dev_if == (__dif))		||		\ +	  ((__sk)->sk_bound_dev_if == (__sdif)))	&&		\  	 net_eq(sock_net(__sk), (__net)))  #endif /* 64-bit arch */  |