mirror of
git://sourceware.org/git/newlib-cygwin.git
synced 2025-01-30 02:50:25 +08:00
* net.cc (cygwin_setsockopt): Ignore errors when setting IP_TOS on
Windows 2000 and above. Clarify the comment about IP_TOS and move to the place where the magic happens. (get_ifconf): Remove unused code. * wincap.h (wincaps::has_disabled_user_tos_setting): New element. * wincap.cc: Implement above element throughout.
This commit is contained in:
parent
b22830942a
commit
494139ffe3
@ -1,3 +1,12 @@
|
||||
2006-01-13 Corinna Vinschen <corinna@vinschen.de>
|
||||
|
||||
* net.cc (cygwin_setsockopt): Ignore errors when setting IP_TOS on
|
||||
Windows 2000 and above. Clarify the comment about IP_TOS and move
|
||||
to the place where the magic happens.
|
||||
(get_ifconf): Remove unused code.
|
||||
* wincap.h (wincaps::has_disabled_user_tos_setting): New element.
|
||||
* wincap.cc: Implement above element throughout.
|
||||
|
||||
2006-01-12 Christopher Faylor <cgf@timesys.com>
|
||||
|
||||
* fhandler_console.cc (set_console_state_for_spawn): Fix to recognize
|
||||
|
@ -1,7 +1,7 @@
|
||||
/* net.cc: network-related routines.
|
||||
|
||||
Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
|
||||
2005 Red Hat, Inc.
|
||||
2005, 2006 Red Hat, Inc.
|
||||
|
||||
This file is part of Cygwin.
|
||||
|
||||
@ -682,21 +682,7 @@ cygwin_setsockopt (int fd, int level, int optname, const void *optval,
|
||||
/* Old applications still use the old Winsock1 IPPROTO_IP values. */
|
||||
if (level == IPPROTO_IP && CYGWIN_VERSION_CHECK_FOR_USING_WINSOCK1_VALUES)
|
||||
optname = convert_ws1_ip_optname (optname);
|
||||
/* FOR THE RECORDS:
|
||||
|
||||
Setting IP_TOS is disabled by default since W2K, the official
|
||||
reason being that IP_TOS setting would interfere with Windows
|
||||
QOS settings. As result, setsockopt returns with WinSock error
|
||||
10022, WSAEINVAL, when running under W2K or later, instead of
|
||||
handling this gracefully.
|
||||
|
||||
The workaround is described in KB article 248611. Add a new
|
||||
registry DWORD value HKLM/System/CurrentControlSet/Services/...
|
||||
... Tcpip/Parameters/DisableUserTOSSetting, set to 0, and reboot.
|
||||
|
||||
FIXME: Maybe we should simply fake that IP_TOS could be set
|
||||
successfully, if DisableUserTOSSetting is not set to 0 on W2K
|
||||
and above? */
|
||||
res = setsockopt (fh->get_socket (), level, optname,
|
||||
(const char *) optval, optlen);
|
||||
|
||||
@ -704,7 +690,38 @@ cygwin_setsockopt (int fd, int level, int optname, const void *optval,
|
||||
syscall_printf ("setsockopt optval=%x", *(long *) optval);
|
||||
|
||||
if (res)
|
||||
set_winsock_errno ();
|
||||
{
|
||||
/* KB 248611:
|
||||
|
||||
Windows 2000 and above don't support setting the IP_TOS field
|
||||
with setsockopt. Additionally, TOS was always (also under 9x
|
||||
and NT) only implemented for UDP and ICMP, never for TCP.
|
||||
|
||||
The difference is that beginning with Windows 2000 the
|
||||
setsockopt call returns WinSock error 10022, WSAEINVAL when
|
||||
trying to set the IP_TOS field, instead of just ignoring the
|
||||
call. This is *not* explained in KB 248611, but only in KB
|
||||
258978.
|
||||
|
||||
Either case, the official workaround is to add a new registry
|
||||
DWORD value HKLM/System/CurrentControlSet/Services/Tcpip/...
|
||||
... Parameters/DisableUserTOSSetting, set to 0, and reboot.
|
||||
|
||||
Sidenote: The reasoning for dropping ToS in Win2K is that ToS
|
||||
per RFC 1349 is incompatible with DiffServ per RFC 2474/2475.
|
||||
|
||||
We just ignore the return value of setting IP_TOS under Windows
|
||||
2000 and above entirely. */
|
||||
if (level == IPPROTO_IP && optname == IP_TOS
|
||||
&& WSAGetLastError () == WSAEINVAL
|
||||
&& wincap.has_disabled_user_tos_setting ())
|
||||
{
|
||||
debug_printf ("Faked IP_TOS success");
|
||||
res = 0;
|
||||
}
|
||||
else
|
||||
set_winsock_errno ();
|
||||
}
|
||||
}
|
||||
|
||||
syscall_printf ("%d = setsockopt (%d, %d, %x, %p, %d)",
|
||||
@ -1750,11 +1767,6 @@ get_ifconf (struct ifconf *ifc, int what)
|
||||
return -1;
|
||||
}
|
||||
|
||||
OSVERSIONINFO os_version_info;
|
||||
|
||||
memset (&os_version_info, 0, sizeof os_version_info);
|
||||
os_version_info.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
|
||||
GetVersionEx (&os_version_info);
|
||||
if (wincap.has_ip_helper_lib ())
|
||||
get_2k_ifconf (ifc, what);
|
||||
else if (wincap.is_winnt ())
|
||||
|
@ -62,7 +62,8 @@ static NO_COPY wincaps wincap_unknown = {
|
||||
detect_win16_exe:true,
|
||||
has_null_console_handler_routine:false,
|
||||
has_disk_ex_ioctls:false,
|
||||
has_working_virtual_lock:false
|
||||
has_working_virtual_lock:false,
|
||||
has_disabled_user_tos_setting:false
|
||||
};
|
||||
|
||||
static NO_COPY wincaps wincap_95 = {
|
||||
@ -116,7 +117,8 @@ static NO_COPY wincaps wincap_95 = {
|
||||
detect_win16_exe:true,
|
||||
has_null_console_handler_routine:false,
|
||||
has_disk_ex_ioctls:false,
|
||||
has_working_virtual_lock:false
|
||||
has_working_virtual_lock:false,
|
||||
has_disabled_user_tos_setting:false
|
||||
};
|
||||
|
||||
static NO_COPY wincaps wincap_95osr2 = {
|
||||
@ -170,7 +172,8 @@ static NO_COPY wincaps wincap_95osr2 = {
|
||||
detect_win16_exe:true,
|
||||
has_null_console_handler_routine:false,
|
||||
has_disk_ex_ioctls:false,
|
||||
has_working_virtual_lock:false
|
||||
has_working_virtual_lock:false,
|
||||
has_disabled_user_tos_setting:false
|
||||
};
|
||||
|
||||
static NO_COPY wincaps wincap_98 = {
|
||||
@ -224,7 +227,8 @@ static NO_COPY wincaps wincap_98 = {
|
||||
detect_win16_exe:true,
|
||||
has_null_console_handler_routine:false,
|
||||
has_disk_ex_ioctls:false,
|
||||
has_working_virtual_lock:false
|
||||
has_working_virtual_lock:false,
|
||||
has_disabled_user_tos_setting:false
|
||||
};
|
||||
|
||||
static NO_COPY wincaps wincap_98se = {
|
||||
@ -278,7 +282,8 @@ static NO_COPY wincaps wincap_98se = {
|
||||
detect_win16_exe:true,
|
||||
has_null_console_handler_routine:false,
|
||||
has_disk_ex_ioctls:false,
|
||||
has_working_virtual_lock:false
|
||||
has_working_virtual_lock:false,
|
||||
has_disabled_user_tos_setting:false
|
||||
};
|
||||
|
||||
static NO_COPY wincaps wincap_me = {
|
||||
@ -332,7 +337,8 @@ static NO_COPY wincaps wincap_me = {
|
||||
detect_win16_exe:true,
|
||||
has_null_console_handler_routine:false,
|
||||
has_disk_ex_ioctls:false,
|
||||
has_working_virtual_lock:false
|
||||
has_working_virtual_lock:false,
|
||||
has_disabled_user_tos_setting:false
|
||||
};
|
||||
|
||||
static NO_COPY wincaps wincap_nt3 = {
|
||||
@ -386,7 +392,8 @@ static NO_COPY wincaps wincap_nt3 = {
|
||||
detect_win16_exe:false,
|
||||
has_null_console_handler_routine:true,
|
||||
has_disk_ex_ioctls:false,
|
||||
has_working_virtual_lock:true
|
||||
has_working_virtual_lock:true,
|
||||
has_disabled_user_tos_setting:false
|
||||
};
|
||||
|
||||
static NO_COPY wincaps wincap_nt4 = {
|
||||
@ -440,7 +447,8 @@ static NO_COPY wincaps wincap_nt4 = {
|
||||
detect_win16_exe:false,
|
||||
has_null_console_handler_routine:true,
|
||||
has_disk_ex_ioctls:false,
|
||||
has_working_virtual_lock:true
|
||||
has_working_virtual_lock:true,
|
||||
has_disabled_user_tos_setting:false
|
||||
};
|
||||
|
||||
static NO_COPY wincaps wincap_nt4sp4 = {
|
||||
@ -494,7 +502,8 @@ static NO_COPY wincaps wincap_nt4sp4 = {
|
||||
detect_win16_exe:false,
|
||||
has_null_console_handler_routine:true,
|
||||
has_disk_ex_ioctls:false,
|
||||
has_working_virtual_lock:true
|
||||
has_working_virtual_lock:true,
|
||||
has_disabled_user_tos_setting:false
|
||||
};
|
||||
|
||||
static NO_COPY wincaps wincap_2000 = {
|
||||
@ -548,7 +557,8 @@ static NO_COPY wincaps wincap_2000 = {
|
||||
detect_win16_exe:false,
|
||||
has_null_console_handler_routine:true,
|
||||
has_disk_ex_ioctls:false,
|
||||
has_working_virtual_lock:true
|
||||
has_working_virtual_lock:true,
|
||||
has_disabled_user_tos_setting:true
|
||||
};
|
||||
|
||||
static NO_COPY wincaps wincap_xp = {
|
||||
@ -602,7 +612,8 @@ static NO_COPY wincaps wincap_xp = {
|
||||
detect_win16_exe:false,
|
||||
has_null_console_handler_routine:true,
|
||||
has_disk_ex_ioctls:true,
|
||||
has_working_virtual_lock:true
|
||||
has_working_virtual_lock:true,
|
||||
has_disabled_user_tos_setting:true
|
||||
};
|
||||
|
||||
static NO_COPY wincaps wincap_2003 = {
|
||||
@ -656,7 +667,8 @@ static NO_COPY wincaps wincap_2003 = {
|
||||
detect_win16_exe:false,
|
||||
has_null_console_handler_routine:true,
|
||||
has_disk_ex_ioctls:true,
|
||||
has_working_virtual_lock:true
|
||||
has_working_virtual_lock:true,
|
||||
has_disabled_user_tos_setting:true
|
||||
};
|
||||
|
||||
static NO_COPY wincaps wincap_vista = {
|
||||
@ -710,7 +722,8 @@ static NO_COPY wincaps wincap_vista = {
|
||||
detect_win16_exe:false,
|
||||
has_null_console_handler_routine:true,
|
||||
has_disk_ex_ioctls:true,
|
||||
has_working_virtual_lock:true
|
||||
has_working_virtual_lock:true,
|
||||
has_disabled_user_tos_setting:true
|
||||
};
|
||||
|
||||
wincapc wincap __attribute__((section (".cygwin_dll_common"), shared));
|
||||
|
@ -64,6 +64,7 @@ struct wincaps
|
||||
unsigned has_null_console_handler_routine : 1;
|
||||
unsigned has_disk_ex_ioctls : 1;
|
||||
unsigned has_working_virtual_lock : 1;
|
||||
unsigned has_disabled_user_tos_setting : 1;
|
||||
};
|
||||
|
||||
class wincapc
|
||||
@ -134,6 +135,7 @@ public:
|
||||
bool IMPLEMENT (has_null_console_handler_routine)
|
||||
bool IMPLEMENT (has_disk_ex_ioctls)
|
||||
bool IMPLEMENT (has_working_virtual_lock)
|
||||
bool IMPLEMENT (has_disabled_user_tos_setting)
|
||||
|
||||
#undef IMPLEMENT
|
||||
};
|
||||
|
Loading…
x
Reference in New Issue
Block a user