Handle TAP-Win32 immediate reads correctly.
The handling of TAP-Win32 virtual network device reads that complete immediately (ReadFile() returns TRUE) is incorrect - instead of starting a new read, tinc will continue listening for the overlapped read completion event which will never fire. As a result, tinc stops receiving packets on the interface.
This commit is contained in:
parent
1d10afd3d3
commit
5ae1ec8d80
1 changed files with 13 additions and 4 deletions
|
@ -49,11 +49,20 @@ static void device_issue_read() {
|
|||
device_read_overlapped.Offset = 0;
|
||||
device_read_overlapped.OffsetHigh = 0;
|
||||
|
||||
int status = ReadFile(device_handle, (void *)device_read_packet.data, MTU, NULL, &device_read_overlapped);
|
||||
int status;
|
||||
for (;;) {
|
||||
DWORD len;
|
||||
status = ReadFile(device_handle, (void *)device_read_packet.data, MTU, &len, &device_read_overlapped);
|
||||
if (!status) {
|
||||
if (GetLastError() != ERROR_IO_PENDING)
|
||||
logger(DEBUG_ALWAYS, LOG_ERR, "Error while reading from %s %s: %s", device_info,
|
||||
device, strerror(errno));
|
||||
break;
|
||||
}
|
||||
|
||||
if(!status && GetLastError() != ERROR_IO_PENDING) {
|
||||
logger(DEBUG_ALWAYS, LOG_ERR, "Error while reading from %s %s: %s", device_info,
|
||||
device, strerror(errno));
|
||||
device_read_packet.len = len;
|
||||
device_read_packet.priority = 0;
|
||||
route(myself, &device_read_packet);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue