feat: add IFF_MULTI_QUEUE

This commit is contained in:
lynx
2024-09-11 12:35:24 +08:00
parent 7ca697a864
commit 7897c6d534
3 changed files with 28 additions and 27 deletions

View File

@@ -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

View File

@@ -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
}

4
go.mod
View File

@@ -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