diff --git a/syscalls_darwin.go b/syscalls_darwin.go index df2b285..6a473f8 100644 --- a/syscalls_darwin.go +++ b/syscalls_darwin.go @@ -151,6 +151,11 @@ func (t *tunReadCloser) Read(to []byte) (int, error) { } func (t *tunReadCloser) Write(from []byte) (int, error) { + + if len(from) == 0 { + return 0, syscall.EIO + } + t.wMu.Lock() defer t.wMu.Unlock() @@ -159,7 +164,16 @@ func (t *tunReadCloser) Write(from []byte) (int, error) { } t.wBuf = t.wBuf[:len(from)+4] - t.wBuf[3] = 2 // Family: IP (2) + // Determine the IP Family for the NULL L2 Header + ipVer := from[0] >> 4 + if ipVer == 4 { + t.wBuf[3] = syscall.AF_INET + } else if ipVer == 6 { + t.wBuf[3] = syscall.AF_INET6 + } else { + return 0, errors.New("Unable to determine IP version from packet.") + } + copy(t.wBuf[4:], from) n, err := t.f.Write(t.wBuf)