feat: broadcast packet processing

This commit is contained in:
lynx
2024-04-29 19:28:47 +08:00
parent db3871ea2a
commit 1d1a10ff74
2 changed files with 35 additions and 3 deletions

View File

@@ -14,9 +14,10 @@ type Config struct {
path string
// tun
TUNName string
MTU int
LocalAddr netip.Prefix
TUNName string
MTU int
LocalAddr netip.Prefix
EnableBroadcast bool
// libp2p
PrivateKey *PrivateKey

View File

@@ -2,6 +2,7 @@ package engine
import (
"fmt"
"net/netip"
"github.com/wlynxg/NetHive/core/protocol"
)
@@ -24,6 +25,12 @@ func (e *Engine) RoutineTUNReader() {
e.log.Warnf("[RoutineTUNReader] drop packet, because %s", err)
continue
}
if (ip.Dst().IsLinkLocalMulticast() || ip.Dst().IsMulticast()) && !e.cfg.EnableBroadcast {
e.log.Debugf("discard broadcast packets: %s -> %s", ip.Src(), ip.Dst())
continue
}
payload := Payload{
Src: ip.Src(),
Dst: ip.Dst(),
@@ -63,6 +70,30 @@ func (e *Engine) RoutineRouteTableWriter() {
for payload = range e.devReader {
var conn PacketChan
if (payload.Dst.IsLinkLocalMulticast() || payload.Dst.IsMulticast()) && e.cfg.EnableBroadcast {
e.routeTable.m.Range(func(key string, value netip.Prefix) bool {
if c, ok := e.routeTable.id.Load(key); ok {
conn = c
} else {
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
}
e.log.Debugf("%s -> %s", payload.Src, payload.Dst)
c, ok := e.routeTable.addr.Load(payload.Dst)
if ok {