Cygwin: tcp: Support TCP_USER_TIMEOUT
Use TCP_MAXRTMS on newer systems, TCP_MAXRT on older systems. Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
This commit is contained in:
		
							parent
							
								
									8ccffddc91
								
							
						
					
					
						commit
						ffb07b41bc
					
				|  | @ -1576,6 +1576,9 @@ fhandler_socket_wsock::writev (const struct iovec *const iov, const int iovcnt, | |||
|   return send_internal (&wsamsg, 0); | ||||
| } | ||||
| 
 | ||||
| #define TCP_MAXRT	      5	/* Older systems don't support TCP_MAXRTMS | ||||
| 				   TCP_MAXRT takes secs, not msecs. */ | ||||
| 
 | ||||
| #define MAX_TCP_KEEPIDLE  32767 | ||||
| #define MAX_TCP_KEEPCNT     255 | ||||
| #define MAX_TCP_KEEPINTVL 32767 | ||||
|  | @ -1639,6 +1642,7 @@ fhandler_socket_inet::setsockopt (int level, int optname, const void *optval, | |||
| { | ||||
|   bool ignore = false; | ||||
|   int ret = -1; | ||||
|   unsigned int timeout; | ||||
| 
 | ||||
|   /* Preprocessing setsockopt.  Set ignore to true if setsockopt call should
 | ||||
|      get skipped entirely. */ | ||||
|  | @ -1763,6 +1767,22 @@ fhandler_socket_inet::setsockopt (int level, int optname, const void *optval, | |||
| 	  ignore = true; | ||||
| 	  break; | ||||
| 
 | ||||
| 	case TCP_MAXRT: | ||||
| 	  /* Don't let this option slip through from user space. */ | ||||
| 	  set_errno (EOPNOTSUPP); | ||||
| 	  return -1; | ||||
| 
 | ||||
| 	case TCP_USER_TIMEOUT: | ||||
| 	  if (!wincap.has_tcp_maxrtms ()) | ||||
| 	    { | ||||
| 	      /* convert msecs to secs.  Values < 1000 ms are converted to
 | ||||
| 		 0 secs, just as in WinSock. */ | ||||
| 	      timeout = *(unsigned int *) optval / MSPERSEC; | ||||
| 	      optname = TCP_MAXRT; | ||||
| 	      optval = (const void *) &timeout; | ||||
| 	    } | ||||
| 	  break; | ||||
| 
 | ||||
| 	case TCP_FASTOPEN: | ||||
| 	  /* Fake FastOpen on older systems. */ | ||||
| 	  if (!wincap.has_tcp_fastopen ()) | ||||
|  | @ -1963,6 +1983,17 @@ fhandler_socket_inet::getsockopt (int level, int optname, const void *optval, | |||
| 
 | ||||
|       switch (optname) | ||||
| 	{ | ||||
| 	case TCP_MAXRT: | ||||
| 	  /* Don't let this option slip through from user space. */ | ||||
| 	  set_errno (EOPNOTSUPP); | ||||
| 	  return -1; | ||||
| 
 | ||||
| 	case TCP_USER_TIMEOUT: | ||||
| 	  /* Older systems don't support TCP_MAXRTMS, just call TCP_MAXRT. */ | ||||
| 	  if (!wincap.has_tcp_maxrtms ()) | ||||
| 	    optname = TCP_MAXRT; | ||||
| 	  break; | ||||
| 
 | ||||
| 	case TCP_FASTOPEN: | ||||
| 	  /* Fake FastOpen on older systems */ | ||||
| 	  if (!wincap.has_tcp_fastopen ()) | ||||
|  | @ -2052,6 +2083,11 @@ fhandler_socket_inet::getsockopt (int level, int optname, const void *optval, | |||
| 	  onebyte = true; | ||||
| 	  break; | ||||
| 
 | ||||
| 	case TCP_MAXRT: /* After above conversion from TCP_USER_TIMEOUT */ | ||||
| 	  /* convert secs to msecs */ | ||||
| 	  *(unsigned int *) optval *= MSPERSEC; | ||||
| 	  break; | ||||
| 
 | ||||
| 	case TCP_FASTOPEN: | ||||
| 	  onebyte = true; | ||||
| 	  break; | ||||
|  |  | |||
|  | @ -126,6 +126,8 @@ struct tcphdr { | |||
| #define TCP_NODELAY      0x01   /* don't delay send to coalesce packets */ | ||||
| #define TCP_KEEPIDLE     0x03   /* start keepalives after this period */ | ||||
| #define TCP_MAXSEG       0x04   /* get maximum segment size (r/o on windows) */ | ||||
| #define TCP_USER_TIMEOUT 0x0e   /* how long for loss retry before timeout, | ||||
| 				   like WinSock TCP_MAXRTMS/TCP_MAXRT */ | ||||
| #define TCP_FASTOPEN     0x0f   /* enable FastOpen on listeners */ | ||||
| #define TCP_KEEPCNT      0x10   /* number of keepalives before death */ | ||||
| #define TCP_KEEPINTVL    0x11   /* interval between keepalives */ | ||||
|  |  | |||
|  | @ -48,6 +48,7 @@ wincaps wincap_vista __attribute__((section (".cygwin_dll_common"), shared)) = { | |||
|     has_extended_mem_api:false, | ||||
|     has_tcp_fastopen:false, | ||||
|     has_linux_tcp_keepalive_sockopts:false, | ||||
|     has_tcp_maxrtms:false, | ||||
|   }, | ||||
| }; | ||||
| 
 | ||||
|  | @ -81,6 +82,7 @@ wincaps wincap_7 __attribute__((section (".cygwin_dll_common"), shared)) = { | |||
|     has_extended_mem_api:false, | ||||
|     has_tcp_fastopen:false, | ||||
|     has_linux_tcp_keepalive_sockopts:false, | ||||
|     has_tcp_maxrtms:false, | ||||
|   }, | ||||
| }; | ||||
| 
 | ||||
|  | @ -114,6 +116,7 @@ wincaps wincap_8 __attribute__((section (".cygwin_dll_common"), shared)) = { | |||
|     has_extended_mem_api:false, | ||||
|     has_tcp_fastopen:false, | ||||
|     has_linux_tcp_keepalive_sockopts:false, | ||||
|     has_tcp_maxrtms:false, | ||||
|   }, | ||||
| }; | ||||
| 
 | ||||
|  | @ -147,6 +150,7 @@ wincaps wincap_8_1 __attribute__((section (".cygwin_dll_common"), shared)) = { | |||
|     has_extended_mem_api:false, | ||||
|     has_tcp_fastopen:false, | ||||
|     has_linux_tcp_keepalive_sockopts:false, | ||||
|     has_tcp_maxrtms:false, | ||||
|   }, | ||||
| }; | ||||
| 
 | ||||
|  | @ -180,6 +184,7 @@ wincaps  wincap_10_1507 __attribute__((section (".cygwin_dll_common"), shared)) | |||
|     has_extended_mem_api:false, | ||||
|     has_tcp_fastopen:false, | ||||
|     has_linux_tcp_keepalive_sockopts:false, | ||||
|     has_tcp_maxrtms:false, | ||||
|   }, | ||||
| }; | ||||
| 
 | ||||
|  | @ -213,6 +218,7 @@ wincaps  wincap_10_1607 __attribute__((section (".cygwin_dll_common"), shared)) | |||
|     has_extended_mem_api:false, | ||||
|     has_tcp_fastopen:true, | ||||
|     has_linux_tcp_keepalive_sockopts:false, | ||||
|     has_tcp_maxrtms:true, | ||||
|   }, | ||||
| }; | ||||
| 
 | ||||
|  | @ -246,6 +252,7 @@ wincaps wincap_10_1703 __attribute__((section (".cygwin_dll_common"), shared)) = | |||
|     has_extended_mem_api:false, | ||||
|     has_tcp_fastopen:true, | ||||
|     has_linux_tcp_keepalive_sockopts:false, | ||||
|     has_tcp_maxrtms:true, | ||||
|   }, | ||||
| }; | ||||
| 
 | ||||
|  | @ -279,6 +286,7 @@ wincaps wincap_10_1709 __attribute__((section (".cygwin_dll_common"), shared)) = | |||
|     has_extended_mem_api:false, | ||||
|     has_tcp_fastopen:true, | ||||
|     has_linux_tcp_keepalive_sockopts:true, | ||||
|     has_tcp_maxrtms:true, | ||||
|   }, | ||||
| }; | ||||
| 
 | ||||
|  | @ -312,6 +320,7 @@ wincaps wincap_10_1803 __attribute__((section (".cygwin_dll_common"), shared)) = | |||
|     has_extended_mem_api:true, | ||||
|     has_tcp_fastopen:true, | ||||
|     has_linux_tcp_keepalive_sockopts:true, | ||||
|     has_tcp_maxrtms:true, | ||||
|   }, | ||||
| }; | ||||
| 
 | ||||
|  | @ -345,6 +354,7 @@ wincaps wincap_10_1809 __attribute__((section (".cygwin_dll_common"), shared)) = | |||
|     has_extended_mem_api:true, | ||||
|     has_tcp_fastopen:true, | ||||
|     has_linux_tcp_keepalive_sockopts:true, | ||||
|     has_tcp_maxrtms:true, | ||||
|   }, | ||||
| }; | ||||
| 
 | ||||
|  | @ -378,6 +388,7 @@ wincaps wincap_10_1903 __attribute__((section (".cygwin_dll_common"), shared)) = | |||
|     has_extended_mem_api:true, | ||||
|     has_tcp_fastopen:true, | ||||
|     has_linux_tcp_keepalive_sockopts:true, | ||||
|     has_tcp_maxrtms:true, | ||||
|   }, | ||||
| }; | ||||
| 
 | ||||
|  |  | |||
|  | @ -42,6 +42,7 @@ struct wincaps | |||
|     unsigned has_extended_mem_api		: 1; | ||||
|     unsigned has_tcp_fastopen			: 1; | ||||
|     unsigned has_linux_tcp_keepalive_sockopts	: 1; | ||||
|     unsigned has_tcp_maxrtms			: 1; | ||||
|   }; | ||||
| }; | ||||
| 
 | ||||
|  | @ -107,6 +108,7 @@ public: | |||
|   bool	IMPLEMENT (has_extended_mem_api) | ||||
|   bool	IMPLEMENT (has_tcp_fastopen) | ||||
|   bool	IMPLEMENT (has_linux_tcp_keepalive_sockopts) | ||||
|   bool	IMPLEMENT (has_tcp_maxrtms) | ||||
| 
 | ||||
|   void disable_case_sensitive_dirs () | ||||
|   { | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue