mirror of
https://github.com/slackhq/nebula.git
synced 2026-05-16 04:47:38 +02:00
Experimenting
This commit is contained in:
@@ -158,74 +158,43 @@ func (t *tun) blockOnWrite() error {
|
||||
}
|
||||
|
||||
func (t *tun) Read(to []byte) (int, error) {
|
||||
// first 4 bytes is protocol family, in network byte order
|
||||
var head [4]byte
|
||||
iovecs := [2]syscall.Iovec{
|
||||
{&head[0], 4},
|
||||
{&to[0], uint64(len(to))},
|
||||
}
|
||||
for {
|
||||
n, _, errno := syscall.Syscall(syscall.SYS_READV, uintptr(t.fd), uintptr(unsafe.Pointer(&iovecs[0])), 2)
|
||||
if errno == 0 {
|
||||
bytesRead := int(n)
|
||||
if bytesRead < 4 {
|
||||
return 0, nil
|
||||
}
|
||||
return bytesRead - 4, nil
|
||||
n, err := unix.Read(t.fd, to)
|
||||
if err == nil {
|
||||
return n, nil
|
||||
}
|
||||
switch errno {
|
||||
switch err {
|
||||
case unix.EAGAIN:
|
||||
if err := t.blockOnRead(); err != nil {
|
||||
return 0, err
|
||||
if berr := t.blockOnRead(); berr != nil {
|
||||
return 0, berr
|
||||
}
|
||||
case unix.EINTR:
|
||||
// retry
|
||||
case unix.EBADF:
|
||||
return 0, os.ErrClosed
|
||||
default:
|
||||
return 0, errno
|
||||
return 0, err
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Write is only valid for single threaded use
|
||||
func (t *tun) Write(from []byte) (int, error) {
|
||||
if len(from) <= 1 {
|
||||
return 0, syscall.EIO
|
||||
}
|
||||
|
||||
ipVer := from[0] >> 4
|
||||
var head [4]byte
|
||||
// first 4 bytes is protocol family, in network byte order
|
||||
switch ipVer {
|
||||
case 4:
|
||||
head[3] = syscall.AF_INET
|
||||
case 6:
|
||||
head[3] = syscall.AF_INET6
|
||||
default:
|
||||
return 0, fmt.Errorf("unable to determine IP version from packet")
|
||||
}
|
||||
|
||||
iovecs := [2]syscall.Iovec{
|
||||
{&head[0], 4},
|
||||
{&from[0], uint64(len(from))},
|
||||
}
|
||||
for {
|
||||
n, _, errno := syscall.Syscall(syscall.SYS_WRITEV, uintptr(t.fd), uintptr(unsafe.Pointer(&iovecs[0])), 2)
|
||||
if errno == 0 {
|
||||
return int(n) - 4, nil
|
||||
n, err := unix.Write(t.fd, from)
|
||||
if err == nil {
|
||||
return n, nil
|
||||
}
|
||||
switch errno {
|
||||
switch err {
|
||||
case unix.EAGAIN:
|
||||
if err := t.blockOnWrite(); err != nil {
|
||||
return 0, err
|
||||
if berr := t.blockOnWrite(); berr != nil {
|
||||
return 0, berr
|
||||
}
|
||||
case unix.EINTR:
|
||||
// retry
|
||||
case unix.EBADF:
|
||||
return 0, os.ErrClosed
|
||||
default:
|
||||
return 0, errno
|
||||
return 0, err
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -732,3 +701,7 @@ func getLinkAddr(name string) (*netroute.LinkAddr, error) {
|
||||
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
// TunPrefixLen reports the 4-byte BSD AF_INET / AF_INET6 protocol-family
|
||||
// marker the kernel prepends on read and expects on write.
|
||||
func (t *tun) TunPrefixLen() int { return 4 }
|
||||
|
||||
Reference in New Issue
Block a user