mirror of
https://github.com/yggdrasil-network/yggdrasil-go.git
synced 2025-04-28 14:15:06 +03:00
47 lines
1.1 KiB
Go
47 lines
1.1 KiB
Go
package tun
|
|
|
|
const TUN_OFFSET_BYTES = 4
|
|
|
|
func (tun *TunAdapter) read() {
|
|
var buf [TUN_OFFSET_BYTES + 65535]byte
|
|
for {
|
|
n, err := tun.iface.Read(buf[:], TUN_OFFSET_BYTES)
|
|
if n <= TUN_OFFSET_BYTES || err != nil {
|
|
tun.log.Errorln("Error reading TUN:", err)
|
|
ferr := tun.iface.Flush()
|
|
if ferr != nil {
|
|
tun.log.Errorln("Unable to flush packets:", ferr)
|
|
}
|
|
return
|
|
}
|
|
begin := TUN_OFFSET_BYTES
|
|
end := begin + n
|
|
bs := buf[begin:end]
|
|
if _, err := tun.rwc.Write(bs); err != nil {
|
|
tun.log.Debugln("Unable to send packet:", err)
|
|
}
|
|
}
|
|
}
|
|
|
|
func (tun *TunAdapter) write() {
|
|
var buf [TUN_OFFSET_BYTES + 65535]byte
|
|
for {
|
|
bs := buf[TUN_OFFSET_BYTES:]
|
|
n, err := tun.rwc.Read(bs)
|
|
if err != nil {
|
|
tun.log.Errorln("Exiting TUN writer due to core read error:", err)
|
|
return
|
|
}
|
|
if !tun.isEnabled {
|
|
continue // Nothing to do, the tun isn't enabled
|
|
}
|
|
bs = buf[:TUN_OFFSET_BYTES+n]
|
|
if _, err = tun.iface.Write(bs, TUN_OFFSET_BYTES); err != nil {
|
|
tun.Act(nil, func() {
|
|
if !tun.isOpen {
|
|
tun.log.Errorln("TUN iface write error:", err)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
}
|