func (t *Interface) Write(ch chan []byte) (err error) { tx := syscall.Overlapped{} var hevent windows.Handle hevent, err = windows.CreateEvent(nil, 0, 0, nil) if err != nil { return } tx.HEvent = syscall.Handle(hevent) for { select { case data := <-ch: var l uint32 syscall.WriteFile(t.file, data, &l, &tx) syscall.WaitForSingleObject(tx.HEvent, syscall.INFINITE) tx.Offset += uint32(len(data)) } } }
func (t *tun) Read(ch chan []byte) (err error) { overlappedRx := syscall.Overlapped{} var hevent windows.Handle hevent, err = windows.CreateEvent(nil, 0, 0, nil) if err != nil { return } overlappedRx.HEvent = syscall.Handle(hevent) buf := make([]byte, t.mtu) var l uint32 for { if err := syscall.ReadFile(t.fd, buf, &l, &overlappedRx); err != nil { } if _, err := syscall.WaitForSingleObject(overlappedRx.HEvent, syscall.INFINITE); err != nil { fmt.Println(err) } overlappedRx.Offset += l totalLen := 0 switch buf[0] & 0xf0 { case 0x40: totalLen = 256*int(buf[2]) + int(buf[3]) case 0x60: continue totalLen = 256*int(buf[4]) + int(buf[5]) + IPv6_HEADER_LENGTH } fmt.Println("read data", buf[:totalLen]) send := make([]byte, totalLen) copy(send, buf) ch <- send } }
func (t *Interface) Read(ch chan []byte) (err error) { rx := syscall.Overlapped{} var hevent windows.Handle hevent, err = windows.CreateEvent(nil, 0, 0, nil) if err != nil { return } rx.HEvent = syscall.Handle(hevent) buf := make([]byte, 1500) var l uint32 for { if err := syscall.ReadFile(t.file, buf, &l, &rx); err != nil { } if _, err := syscall.WaitForSingleObject(rx.HEvent, syscall.INFINITE); err != nil { Log(Error, "Failed to read from TUN/TAP: %v", err) } rx.Offset += l ch <- buf } }