more effort into understanding why TAP interface is so slow on my linux machine to no avail

This commit is contained in:
soypat
2025-06-05 00:47:07 -03:00
parent bc14ed395d
commit 6ba727a0ef
12 changed files with 256 additions and 26 deletions
+39 -5
View File
@@ -19,6 +19,7 @@ import (
"github.com/soypat/lneto/internal"
"github.com/soypat/lneto/internal/ltesto"
"github.com/soypat/lneto/internet"
"github.com/soypat/lneto/internet/pcap"
"github.com/soypat/lneto/ipv4"
"github.com/soypat/lneto/tcp"
)
@@ -65,14 +66,22 @@ func main() {
hdr.Reset(make([]byte, 0, 1024))
const standbyDuration = 5 * time.Second
lastHit := time.Now().Add(-standbyDuration)
var cap pcap.PacketBreakdown
for {
nread, err := tap.Read(buf[:])
if err != nil {
slogger.error("tap-err", slog.String("err", err.Error()))
log.Fatal(err)
} else if nread > 0 {
// debugEthPacket(nil, "IN ", buf[:nread])
// fmt.Println("INHEX ", debugHex(buf[:nread]))
frames, err := cap.CaptureEthernet(nil, buf[:nread], 0)
if err == nil {
flags := getTCPFlags(frames, buf[:nread])
if flags == 0 {
fmt.Println("IN", time.Now().Format("15:04:05.000"), frames)
} else {
fmt.Println("IN", time.Now().Format("15:04:05.000"), frames, flags.String())
}
}
err = lStack.RecvEth(buf[:nread])
if err != nil {
slogger.error("recv", slog.String("err", err.Error()), slog.Int("plen", nread))
@@ -80,11 +89,18 @@ func main() {
}
doHTTP(handler, &hdr)
nw, err := lStack.HandleEth(buf[:])
debugEthPacket(nil, "OUT", buf[:nw])
if err != nil {
slogger.error("handle", slog.String("err", err.Error()))
} else if nw > 0 {
// fmt.Println("OUTHEX ", debugHex(buf[:nread]))
frames, err := cap.CaptureEthernet(nil, buf[:nread], 0)
if err == nil {
flags := getTCPFlags(frames, buf[:nread])
if flags == 0 {
fmt.Println("OU", time.Now().Format("15:04:05.000"), frames)
} else {
fmt.Println("OU", time.Now().Format("15:04:05.000"), frames, flags.String())
}
}
_, err = tap.Write(buf[:nw])
if err != nil {
log.Fatal(err)
@@ -92,7 +108,7 @@ func main() {
}
hit := nread > 0 || nw > 0
if hit {
slogger.info("exchange", slog.Int("read", nread), slog.Int("nwrite", nw))
// slogger.info("exchange", slog.Int("read", nread), slog.Int("nwrite", nw))
lastHit = time.Now()
} else {
if time.Since(lastHit) > standbyDuration {
@@ -379,3 +395,21 @@ func debugHex(b []byte) string {
}
const tblhex = "0123456789abcdef"
func getTCPFlags(frames []pcap.Frame, pkt []byte) (flags tcp.Flags) {
for i := range frames {
if frames[i].Protocol != lneto.IPProtoTCP {
continue
}
iflags, err := frames[i].FieldByClass(pcap.FieldClassFlags)
if err != nil {
return 0
}
v, err := frames[i].FieldAsUint(iflags, pkt)
if err != nil {
return 0
}
return tcp.Flags(v)
}
return 0
}
+34 -1
View File
@@ -11,8 +11,10 @@ import (
"runtime"
"time"
"github.com/soypat/lneto"
"github.com/soypat/lneto/internal/ltesto"
"github.com/soypat/lneto/internet/pcap"
"github.com/soypat/lneto/tcp"
)
func main() {
@@ -45,7 +47,14 @@ func run() error {
captime := time.Now()
frames, err := cap.CaptureEthernet(nil, pkt, 0)
if err == nil {
fmt.Println(channel, captime.Format("15:04:05.000"), frames)
flags, src, dst := getTCPData(frames, pkt)
if flags != 0 {
fmt.Println(channel, captime.Format("15:04:05.000"), frames, flags.String(), src, "->", dst)
} else {
fmt.Println(channel, captime.Format("15:04:05.000"), frames)
}
} else {
fmt.Println(channel, captime.Format("15:04:05.000"), "ERR", frames, err.Error())
}
})
hwaddr, err := sv.HardwareAddress6()
@@ -74,3 +83,27 @@ func run() error {
}
}
}
func getTCPData(frames []pcap.Frame, pkt []byte) (flags tcp.Flags, src, dst uint16) {
for i := range frames {
if frames[i].Protocol != lneto.IPProtoTCP {
continue
}
return tcp.Flags(getFrameClassUint(frames[i], pkt, pcap.FieldClassFlags)),
uint16(getFrameClassUint(frames[i], pkt, pcap.FieldClassSrc)),
uint16(getFrameClassUint(frames[i], pkt, pcap.FieldClassDst))
}
return 0, 0, 0
}
func getFrameClassUint(frame pcap.Frame, pkt []byte, class pcap.FieldClass) uint64 {
iflags, err := frame.FieldByClass(class)
if err != nil {
return 0
}
v, err := frame.FieldAsUint(iflags, pkt)
if err != nil {
return 0
}
return v
}
+4 -4
View File
@@ -7,6 +7,7 @@ import (
"os"
"os/signal"
"syscall"
"time"
"github.com/soypat/lneto/http/httpraw"
)
@@ -33,7 +34,7 @@ func run() error {
return err
}
fmt.Println("dialing...")
fmt.Println(time.Now().Format("15:04:05.000"), "dialing...")
conn, err := net.DialTCP("tcp4", &net.TCPAddr{IP: []byte{192, 168, 10, 1}, Port: port}, &net.TCPAddr{IP: []byte{192, 168, 10, 2}, Port: 80})
if err != nil {
return err
@@ -47,9 +48,8 @@ func run() error {
conn.Close()
os.Exit(0)
}()
fmt.Println("reading...")
fmt.Println(time.Now().Format("15:04:05.000"), "writing...")
conn.Write(req)
hdr.Reset(nil)
var needMore bool = true
for needMore {
@@ -63,6 +63,6 @@ func run() error {
if err != nil {
return err
}
fmt.Println("got HTTP:\n", hdr.String())
fmt.Println(time.Now().Format("15:04:05.000"), "got HTTP:\n", hdr.String())
return nil
}