From 7897c6d534bec5b7105a4b9c50f36768ef25af69 Mon Sep 17 00:00:00 2001 From: lynx Date: Wed, 11 Sep 2024 12:35:24 +0800 Subject: [PATCH] feat: add IFF_MULTI_QUEUE --- core/device/tun_linux.go | 8 +++++--- core/engine/routine.go | 43 ++++++++++++++++++++-------------------- go.mod | 4 ++-- 3 files changed, 28 insertions(+), 27 deletions(-) diff --git a/core/device/tun_linux.go b/core/device/tun_linux.go index 7434afa..94c9635 100644 --- a/core/device/tun_linux.go +++ b/core/device/tun_linux.go @@ -193,9 +193,11 @@ func CreateTUN(name string, mtu int) (Device, error) { return nil, err } - // unix.IFF_TUN: TUN device - // unix.IFF_NO_PI: no need to provide package information - ifreq.SetUint16(unix.IFF_TUN | unix.IFF_NO_PI) + // unix.IFF_TUN: TUN device (no Ethernet headers) + // unix.IFF_NO_PI: Do not provide packet information + // unix.IFF_MULTI_QUEUE: Create a queue of multiqueue device + ifreq.SetUint16(unix.IFF_TUN | unix.IFF_NO_PI | unix.IFF_MULTI_QUEUE) + //ifreq.SetUint16(unix.IFF_TUN | unix.IFF_NO_PI) err = unix.IoctlIfreq(tfd, unix.TUNSETIFF, ifreq) if err != nil { return nil, err diff --git a/core/engine/routine.go b/core/engine/routine.go index 1e76dec..d518a82 100644 --- a/core/engine/routine.go +++ b/core/engine/routine.go @@ -1,8 +1,6 @@ package engine import ( - "net/netip" - "github.com/wlynxg/NetHive/core/protocol" ) @@ -25,11 +23,12 @@ func (e *Engine) RoutineTUNReader() { ip, err := protocol.ParseIP(buff[:n]) if err != nil { e.log.Warnf("[RoutineTUNReader] drop packet, because %s", err) + e.log.Warnf("invalid packet: %v", buff[:n]) continue } if (ip.Dst().IsLinkLocalMulticast() || ip.Dst().IsMulticast()) && !e.cfg.EnableBroadcast { - e.log.Debugf("discard broadcast packets: %s -> %s", ip.Src(), ip.Dst()) + e.log.Infof("discard broadcast packets: %s -> %s", ip.Src(), ip.Dst()) continue } @@ -77,25 +76,25 @@ func (e *Engine) RoutineRouteTableWriter() { for payload = range e.devReader { if (payload.Dst.IsLinkLocalMulticast() || payload.Dst.IsMulticast()) && e.cfg.EnableBroadcast { - e.routeTable.m.Range(func(key string, value netip.Prefix) bool { - conn, ok := e.routeTable.id.Load(key) - if !ok { - conn := make(PacketChan, ChanSize) - e.routeTable.id.Store(key, conn) - e.routeTable.addr.Store(value.Addr(), conn) - go func() { - defer e.routeTable.id.Delete(key) - defer e.routeTable.addr.Delete(value.Addr()) - e.addConn(conn, key) - }() - } - select { - case conn <- payload: - default: - e.log.Warnf("[RoutineRouteTableWriter] drop packet: %s, because the sending queue is already full", payload.Dst) - } - return true - }) + //e.routeTable.m.Range(func(key string, value netip.Prefix) bool { + // conn, ok := e.routeTable.id.Load(key) + // if !ok { + // conn := make(PacketChan, ChanSize) + // e.routeTable.id.Store(key, conn) + // e.routeTable.addr.Store(value.Addr(), conn) + // go func() { + // defer e.routeTable.id.Delete(key) + // defer e.routeTable.addr.Delete(value.Addr()) + // e.addConn(conn, key) + // }() + // } + // select { + // case conn <- payload: + // default: + // e.log.Warnf("[RoutineRouteTableWriter] drop packet: %s, because the sending queue is already full", payload.Dst) + // } + // return true + //}) continue } diff --git a/go.mod b/go.mod index f1d94d2..f2c8fdb 100644 --- a/go.mod +++ b/go.mod @@ -6,9 +6,11 @@ toolchain go1.22.4 require ( github.com/gogf/gf/v2 v2.7.0 + github.com/libp2p/go-buffer-pool v0.1.0 github.com/libp2p/go-cidranger v1.1.0 github.com/libp2p/go-libp2p v0.36.3 github.com/libp2p/go-libp2p-kad-dht v0.25.2 + github.com/libp2p/go-msgio v0.3.0 github.com/mr-tron/base58 v1.2.0 github.com/pkg/errors v0.9.1 go.uber.org/zap v1.27.0 @@ -56,13 +58,11 @@ require ( github.com/klauspost/compress v1.17.9 // indirect github.com/klauspost/cpuid/v2 v2.2.8 // indirect github.com/koron/go-ssdp v0.0.4 // indirect - github.com/libp2p/go-buffer-pool v0.1.0 // indirect github.com/libp2p/go-flow-metrics v0.1.0 // indirect github.com/libp2p/go-libp2p-asn-util v0.4.1 // indirect github.com/libp2p/go-libp2p-kbucket v0.6.3 // indirect github.com/libp2p/go-libp2p-record v0.2.0 // indirect github.com/libp2p/go-libp2p-routing-helpers v0.7.2 // indirect - github.com/libp2p/go-msgio v0.3.0 // indirect github.com/libp2p/go-nat v0.2.0 // indirect github.com/libp2p/go-netroute v0.2.1 // indirect github.com/libp2p/go-reuseport v0.4.0 // indirect