| 
									
										
										
										
											2005-12-13 23:15:24 -08:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * NET		Generic infrastructure for INET6 connection oriented protocols. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Authors:	Many people, see the TCPv6 sources | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * 		From code originally in TCPv6 | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  *		This program is free software; you can redistribute it and/or | 
					
						
							|  |  |  |  *		modify it under the terms of the GNU General Public License | 
					
						
							|  |  |  |  *		as published by the Free Software Foundation; either version | 
					
						
							|  |  |  |  *		2 of the License, or (at your option) any later version. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | #ifndef _INET6_CONNECTION_SOCK_H
 | 
					
						
							|  |  |  | #define _INET6_CONNECTION_SOCK_H
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <linux/types.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-12-13 23:22:54 -08:00
										 |  |  | struct in6_addr; | 
					
						
							|  |  |  | struct inet_bind_bucket; | 
					
						
							| 
									
										
										
										
											2005-12-13 23:15:24 -08:00
										 |  |  | struct request_sock; | 
					
						
							| 
									
										
										
										
											2005-12-13 23:22:54 -08:00
										 |  |  | struct sk_buff; | 
					
						
							|  |  |  | struct sock; | 
					
						
							|  |  |  | struct sockaddr; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | extern int inet6_csk_bind_conflict(const struct sock *sk, | 
					
						
							| 
									
										
											  
											
												tcp: bind() use stronger condition for bind_conflict
We must try harder to get unique (addr, port) pairs when
doing port autoselection for sockets with SO_REUSEADDR
option set.
We achieve this by adding a relaxation parameter to
inet_csk_bind_conflict. When 'relax' parameter is off
we return a conflict whenever the current searched
pair (addr, port) is not unique.
This tries to address the problems reported in patch:
	8d238b25b1ec22a73b1c2206f111df2faaff8285
	Revert "tcp: bind() fix when many ports are bound"
Tests where ran for creating and binding(0) many sockets
on 100 IPs. The results are, on average:
	* 60000 sockets, 600 ports / IP:
		* 0.210 s, 620 (IP, port) duplicates without patch
		* 0.219 s, no duplicates with patch
	* 100000 sockets, 1000 ports / IP:
		* 0.371 s, 1720 duplicates without patch
		* 0.373 s, no duplicates with patch
	* 200000 sockets, 2000 ports / IP:
		* 0.766 s, 6900 duplicates without patch
		* 0.768 s, no duplicates with patch
	* 500000 sockets, 5000 ports / IP:
		* 2.227 s, 41500 duplicates without patch
		* 2.284 s, no duplicates with patch
Signed-off-by: Alex Copot <alex.mihai.c@gmail.com>
Signed-off-by: Daniel Baluta <dbaluta@ixiacom.com>
Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
											
										 
											2012-04-12 22:21:45 +00:00
										 |  |  | 				   const struct inet_bind_bucket *tb, bool relax); | 
					
						
							| 
									
										
										
										
											2005-12-13 23:15:24 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-12-02 10:59:22 -08:00
										 |  |  | extern struct dst_entry* inet6_csk_route_req(struct sock *sk, | 
					
						
							| 
									
										
										
										
											2012-06-28 12:34:19 +00:00
										 |  |  | 					     struct flowi6 *fl6, | 
					
						
							| 
									
										
										
										
											2010-12-02 10:59:22 -08:00
										 |  |  | 					     const struct request_sock *req); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-12-13 23:15:24 -08:00
										 |  |  | extern struct request_sock *inet6_csk_search_req(const struct sock *sk, | 
					
						
							|  |  |  | 						 struct request_sock ***prevp, | 
					
						
							| 
									
										
										
										
											2006-11-08 00:25:41 -08:00
										 |  |  | 						 const __be16 rport, | 
					
						
							| 
									
										
										
										
											2005-12-13 23:15:24 -08:00
										 |  |  | 						 const struct in6_addr *raddr, | 
					
						
							|  |  |  | 						 const struct in6_addr *laddr, | 
					
						
							|  |  |  | 						 const int iif); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | extern void inet6_csk_reqsk_queue_hash_add(struct sock *sk, | 
					
						
							|  |  |  | 					   struct request_sock *req, | 
					
						
							|  |  |  | 					   const unsigned long timeout); | 
					
						
							| 
									
										
										
										
											2005-12-13 23:22:54 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | extern void inet6_csk_addr2sockaddr(struct sock *sk, struct sockaddr *uaddr); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-06 22:23:20 -07:00
										 |  |  | extern int inet6_csk_xmit(struct sk_buff *skb, struct flowi *fl); | 
					
						
							| 
									
										
										
										
											2012-07-16 03:44:56 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | extern struct dst_entry *inet6_csk_update_pmtu(struct sock *sk, u32 mtu); | 
					
						
							| 
									
										
										
										
											2005-12-13 23:15:24 -08:00
										 |  |  | #endif /* _INET6_CONNECTION_SOCK_H */
 |