begin working on making response quicker (why is tap interface so slow?)

This commit is contained in:
soypat
2025-06-01 01:29:07 -03:00
parent 1acc5f70cd
commit a29bad9ac9
8 changed files with 52 additions and 19 deletions
+16 -6
View File
@@ -9,6 +9,7 @@ import (
"net"
"net/netip"
"os"
"runtime"
"time"
"github.com/soypat/lneto"
@@ -62,13 +63,15 @@ func main() {
buf := make([]byte, mtu)
var hdr httpraw.Header
hdr.Reset(make([]byte, 0, 1024))
const standbyDuration = 5 * time.Second
lastHit := time.Now().Add(-standbyDuration)
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])
// debugEthPacket(nil, "IN ", buf[:nread])
// fmt.Println("INHEX ", debugHex(buf[:nread]))
err = lStack.RecvEth(buf[:nread])
if err != nil {
@@ -85,13 +88,18 @@ func main() {
_, err = tap.Write(buf[:nw])
if err != nil {
log.Fatal(err)
} else {
slogger.info("write", slog.Int("plen", nw))
}
}
if nread == 0 && nw == 0 {
time.Sleep(5 * time.Millisecond)
hit := nread > 0 || nw > 0
if hit {
slogger.info("exchange", slog.Int("read", nread), slog.Int("nwrite", nw))
lastHit = time.Now()
} else {
if time.Since(lastHit) > standbyDuration {
time.Sleep(5 * time.Millisecond)
} else {
runtime.Gosched()
}
}
}
}
@@ -119,10 +127,12 @@ func doHTTP(conn *internet.TCPConn, hdr *httpraw.Header) error {
fmt.Println("sending response...")
hdr.Reset(nil)
hdr.SetStatus("200", "OK")
data := `{"ok":true}`
response, err := hdr.AppendResponse(nil)
if err != nil {
return err
}
response = append(response, data...)
_, err = conn.Write(response)
if err != nil {
return err
+7 -6
View File
@@ -8,6 +8,7 @@ import (
"net"
"net/http"
"net/netip"
"runtime"
"time"
"github.com/soypat/lneto/internal/ltesto"
@@ -44,7 +45,8 @@ func run() error {
}
fmt.Println("listening on http://127.0.0.1:7070/recv and http://127.0.0.1:7070/send on hwaddr:", net.HardwareAddr(hwaddr[:]).String())
go http.ListenAndServe(":7070", sv)
misses := 0
const standbyDuration = 5 * time.Second
lastHit := time.Now().Add(-standbyDuration)
for {
result, err := sv.HandleTap()
if err != nil {
@@ -53,14 +55,13 @@ func run() error {
if result.Failed {
return errors.New("tap failed, exit program")
} else if result.ReceivedSize == 0 && result.SentSize == 0 {
misses++
if misses > 1000 {
time.Sleep(200 * time.Millisecond) // No data exchanged, sleep a bit to not hog CPU.
if time.Since(lastHit) > standbyDuration {
time.Sleep(5 * time.Millisecond) // Enter standby.
} else {
time.Sleep(50 * time.Millisecond) // No data exchanged, sleep a bit to not hog CPU.
runtime.Gosched()
}
} else {
misses = 0
lastHit = time.Now()
}
}
}
+5 -1
View File
@@ -1,6 +1,7 @@
package main
import (
"flag"
"fmt"
"net"
"os"
@@ -19,6 +20,9 @@ func main() {
}
func run() error {
var port int
flag.IntVar(&port, "lport", 13337, "Local port over which to hit server")
flag.Parse()
// Prepare GET request.
var hdr httpraw.Header
hdr.SetMethod("GET")
@@ -30,7 +34,7 @@ func run() error {
}
fmt.Println("dialing...")
conn, err := net.DialTCP("tcp4", &net.TCPAddr{IP: []byte{192, 168, 10, 1}, Port: 1337}, &net.TCPAddr{IP: []byte{192, 168, 10, 2}, Port: 80})
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
}