Compare commits

..

1 Commits

Author SHA1 Message Date
JackDoan 2944be4bb0 return err 2026-01-29 11:29:07 -06:00
5 changed files with 44 additions and 55 deletions
+7
View File
@@ -3,6 +3,9 @@ package main
import (
"flag"
"fmt"
"log"
"net/http"
_ "net/http/pprof"
"os"
"runtime/debug"
"strings"
@@ -71,6 +74,10 @@ func main() {
os.Exit(1)
}
go func() {
log.Println(http.ListenAndServe("0.0.0.0:6060", nil))
}()
if !*configTest {
wait, err := ctrl.Start()
if err != nil {
+5 -7
View File
@@ -507,14 +507,12 @@ func (f *Interface) Close() error {
}
// Release the tun readers
for i, r := range f.readers {
if i == 0 {
continue // f.readers[0] is f.inside, which we want to save for last, since it closes other stuff too
}
if err := r.Close(); err != nil {
f.l.WithError(err).Error("Error while closing tun reader")
for i, u := range f.readers {
err := u.Close()
if err != nil {
f.l.WithError(err).WithField("i", i).Error("Error while closing tun device")
}
}
return f.inside.Close()
return nil
}
+26 -29
View File
@@ -72,11 +72,6 @@ type ifreqQLEN struct {
}
func newTunFromFd(c *config.C, l *logrus.Logger, deviceFd int, vpnNetworks []netip.Prefix) (*tun, error) {
err := unix.SetNonblock(deviceFd, true)
if err != nil {
return nil, err
}
file := os.NewFile(uintptr(deviceFd), "/dev/net/tun")
t, err := newTunGeneric(c, l, file, vpnNetworks)
@@ -127,11 +122,6 @@ func newTun(c *config.C, l *logrus.Logger, vpnNetworks []netip.Prefix, multiqueu
}
name := strings.Trim(string(req.Name[:]), "\x00")
err = unix.SetNonblock(fd, true)
if err != nil {
return nil, err
}
file := os.NewFile(uintptr(fd), "/dev/net/tun")
t, err := newTunGeneric(c, l, file, vpnNetworks)
if err != nil {
@@ -155,12 +145,7 @@ func newTunGeneric(c *config.C, l *logrus.Logger, file *os.File, vpnNetworks []n
l: l,
}
err := unix.SetNonblock(t.fd, true)
if err != nil {
return nil, err
}
err = t.reload(c, true)
err := t.reload(c, true)
if err != nil {
return nil, err
}
@@ -266,11 +251,6 @@ func (t *tun) NewMultiQueueReader() (io.ReadWriteCloser, error) {
return nil, err
}
err = unix.SetNonblock(fd, true)
if err != nil {
return nil, err
}
file := os.NewFile(uintptr(fd), "/dev/net/tun")
return file, nil
@@ -281,6 +261,29 @@ func (t *tun) RoutesFor(ip netip.Addr) routing.Gateways {
return r
}
func (t *tun) Write(b []byte) (int, error) {
var nn int
maximum := len(b)
for {
n, err := unix.Write(t.fd, b[nn:maximum])
if n > 0 {
nn += n
}
if nn == len(b) {
return nn, err
}
if err != nil {
return nn, err
}
if n == 0 {
return nn, io.ErrUnexpectedEOF
}
}
}
func (t *tun) deviceBytes() (o [16]byte) {
for i, c := range t.Device {
o[i] = byte(c)
@@ -709,17 +712,11 @@ func (t *tun) Close() error {
}
if t.ReadWriteCloser != nil {
err := t.ReadWriteCloser.Close()
if err != nil {
t.l.WithField("error", err).Error("Failed to close read/write connection")
}
_ = t.ReadWriteCloser.Close()
}
if t.ioctlFd > 0 {
err := os.NewFile(t.ioctlFd, "ioctlFd").Close()
if err != nil {
t.l.WithField("error", err).Error("Failed to close ioctl fd")
}
_ = os.NewFile(t.ioctlFd, "ioctlFd").Close()
t.ioctlFd = 0
}
+3
View File
@@ -13,6 +13,7 @@ import (
"fmt"
"net"
"net/netip"
"time"
"github.com/sirupsen/logrus"
"github.com/slackhq/nebula/config"
@@ -74,6 +75,8 @@ type rawMessage struct {
func (u *GenericConn) ListenOut(r EncReader) error {
buffer := make([]byte, MTU)
var lastRecvErr time.Time
for {
// Just read one packet at a time
n, rua, err := u.ReadFromUDPAddrPort(buffer)
+3 -19
View File
@@ -9,7 +9,6 @@ import (
"net"
"net/netip"
"syscall"
"time"
"unsafe"
"github.com/rcrowley/go-metrics"
@@ -18,8 +17,6 @@ import (
"golang.org/x/sys/unix"
)
var readTimeout = unix.NsecToTimeval(int64(3 * time.Second))
type StdConn struct {
sysFd int
isV4 bool
@@ -50,11 +47,6 @@ func NewListener(l *logrus.Logger, ip netip.Addr, port int, multi bool, batch in
}
}
// Set a read timeout
if err = unix.SetsockoptTimeval(fd, unix.SOL_SOCKET, unix.SO_RCVTIMEO, &readTimeout); err != nil {
return nil, fmt.Errorf("unable to set SO_RCVTIMEO: %s", err)
}
var sa unix.Sockaddr
if ip.Is4() {
sa4 := &unix.SockaddrInet4{Port: port}
@@ -162,9 +154,6 @@ func (u *StdConn) ReadSingle(msgs []rawMessage) (int, error) {
)
if err != 0 {
if err == unix.EAGAIN || err == unix.EINTR || err == unix.EWOULDBLOCK {
continue
}
return 0, &net.OpError{Op: "recvmsg", Err: err}
}
@@ -184,14 +173,8 @@ func (u *StdConn) ReadMulti(msgs []rawMessage) (int, error) {
0,
0,
)
if err == unix.EAGAIN || err == unix.EINTR || err == unix.EWOULDBLOCK {
if int64(n) > 0 {
//ran out of time, but have some messages to return
return int(n), nil
} else {
continue
}
} else if err != 0 {
if err != 0 {
return 0, &net.OpError{Op: "recvmmsg", Err: err}
}
@@ -318,6 +301,7 @@ func (u *StdConn) getMemInfo(meminfo *[unix.SK_MEMINFO_VARS]uint32) error {
}
func (u *StdConn) Close() error {
_ = syscall.Shutdown(u.sysFd, syscall.SHUT_RDWR)
return syscall.Close(u.sysFd)
}