tun: windows: add dummy overlapped events back
These seem basically wrong to me, but we get crashes without them.
This commit is contained in:
parent
ca59b60aa7
commit
49ea0c9b1a
@ -46,6 +46,8 @@ type NativeTun struct {
|
|||||||
close bool
|
close bool
|
||||||
rdBuff *exchgBufRead
|
rdBuff *exchgBufRead
|
||||||
wrBuff *exchgBufWrite
|
wrBuff *exchgBufWrite
|
||||||
|
rdEvent windows.Handle
|
||||||
|
wrEvent windows.Handle
|
||||||
events chan TUNEvent
|
events chan TUNEvent
|
||||||
errors chan error
|
errors chan error
|
||||||
forcedMtu int
|
forcedMtu int
|
||||||
@ -96,12 +98,26 @@ func CreateTUN(ifname string) (TUNDevice, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
rde, err := windows.CreateEvent(nil, 1 /*TRUE*/, 0 /*FALSE*/, nil)
|
||||||
|
if err != nil {
|
||||||
|
wt.DeleteInterface(0)
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
wre, err := windows.CreateEvent(nil, 1 /*TRUE*/, 0 /*FALSE*/, nil)
|
||||||
|
if err != nil {
|
||||||
|
windows.CloseHandle(rde)
|
||||||
|
wt.DeleteInterface(0)
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
return &NativeTun{
|
return &NativeTun{
|
||||||
wt: wt,
|
wt: wt,
|
||||||
tunName: tunNameUTF16,
|
tunName: tunNameUTF16,
|
||||||
tunFile: windows.InvalidHandle,
|
tunFile: windows.InvalidHandle,
|
||||||
rdBuff: &exchgBufRead{},
|
rdBuff: &exchgBufRead{},
|
||||||
wrBuff: &exchgBufWrite{},
|
wrBuff: &exchgBufWrite{},
|
||||||
|
rdEvent: rde,
|
||||||
|
wrEvent: wre,
|
||||||
events: make(chan TUNEvent, 10),
|
events: make(chan TUNEvent, 10),
|
||||||
errors: make(chan error, 1),
|
errors: make(chan error, 1),
|
||||||
forcedMtu: 1500,
|
forcedMtu: 1500,
|
||||||
@ -194,6 +210,9 @@ func (tun *NativeTun) Close() error {
|
|||||||
err1 = err2
|
err1 = err2
|
||||||
}
|
}
|
||||||
|
|
||||||
|
windows.CloseHandle(tun.rdEvent)
|
||||||
|
windows.CloseHandle(tun.wrEvent)
|
||||||
|
|
||||||
return err1
|
return err1
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -240,7 +259,7 @@ func (tun *NativeTun) Read(buff []byte, offset int) (int, error) {
|
|||||||
|
|
||||||
// Fill queue.
|
// Fill queue.
|
||||||
var n uint32
|
var n uint32
|
||||||
overlapped := &windows.Overlapped{}
|
overlapped := &windows.Overlapped{HEvent: tun.rdEvent}
|
||||||
err = windows.ReadFile(file, tun.rdBuff.data[:], &n, overlapped)
|
err = windows.ReadFile(file, tun.rdBuff.data[:], &n, overlapped)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if en, ok := err.(syscall.Errno); ok && en == windows.ERROR_IO_PENDING {
|
if en, ok := err.(syscall.Errno); ok && en == windows.ERROR_IO_PENDING {
|
||||||
@ -271,7 +290,7 @@ func (tun *NativeTun) flush() error {
|
|||||||
|
|
||||||
// Flush write buffer.
|
// Flush write buffer.
|
||||||
var n uint32
|
var n uint32
|
||||||
overlapped := &windows.Overlapped{}
|
overlapped := &windows.Overlapped{HEvent: tun.wrEvent}
|
||||||
err = windows.WriteFile(file, tun.wrBuff.data[:tun.wrBuff.offset], &n, overlapped)
|
err = windows.WriteFile(file, tun.wrBuff.data[:tun.wrBuff.offset], &n, overlapped)
|
||||||
tun.wrBuff.packetNum = 0
|
tun.wrBuff.packetNum = 0
|
||||||
tun.wrBuff.offset = 0
|
tun.wrBuff.offset = 0
|
||||||
|
Loading…
Reference in New Issue
Block a user