From ba9124b079721cb2d46a3b9266d324034dfb2551 Mon Sep 17 00:00:00 2001 From: soypat Date: Sat, 5 Apr 2025 10:43:01 -0300 Subject: [PATCH] fix basicstack example --- examples/stackbasic/main.go | 30 ++++++++++++++++-------------- internal/ltesto/httptap.go | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 14 deletions(-) diff --git a/examples/stackbasic/main.go b/examples/stackbasic/main.go index 7b79f4d..433326e 100644 --- a/examples/stackbasic/main.go +++ b/examples/stackbasic/main.go @@ -36,17 +36,17 @@ func main() { log.Fatal("interface does not contain stack address") } addrPort := netip.AddrPortFrom(ip, stackPort) - slogger := logger{slog.Default()} + lg := slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{ + Level: slog.LevelDebug, + })) + + slogger := logger{lg} + lStack, handler, err := NewEthernetTCPStack(stackHWAddr, addrPort, slogger) if err != nil { log.Fatal(err) } - logger := slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{ - Level: slog.LevelDebug, - })) - handler.SetLoggers(logger, logger) - err = handler.OpenListen(addrPort.Port(), iss) if err != nil { log.Fatal(err) @@ -108,7 +108,7 @@ func NewEthernetTCPStack(mac [6]byte, ip netip.AddrPort, slogger logger) (*LinkS handle: func(b []byte, i int) (int, error) { return ipStack.Handle(b[i:]) }, - proto: uint32(lneto.IPProtoIPv4), + proto: ethernet.TypeIPv4, lport: 0, }) var conn internet.TCPConn @@ -136,8 +136,8 @@ func NewEthernetTCPStack(mac [6]byte, ip netip.AddrPort, slogger logger) (*LinkS arphandler, err := arp.NewHandler(arp.HandlerConfig{ HardwareAddr: mac[:], ProtocolAddr: ip.Addr().AsSlice(), - MaxQueries: 1, - MaxPending: 1, + MaxQueries: 4, + MaxPending: 4, HardwareType: 1, ProtocolType: proto, }) @@ -147,8 +147,11 @@ func NewEthernetTCPStack(mac [6]byte, ip netip.AddrPort, slogger logger) (*LinkS arpStack := ARPStack{ handler: *arphandler, } - - err = lStack.Register(ipStack, mac) + err = lStack.Register(handler{ + recv: arpStack.Recv, + handle: arpStack.Handle, + proto: ethernet.TypeARP, + }) if err != nil { return nil, nil, err } @@ -159,7 +162,7 @@ type handler struct { raddr []byte recv func([]byte, int) error handle func([]byte, int) (int, error) - proto uint32 + proto ethernet.Type lport uint16 } @@ -182,7 +185,6 @@ func (ls *LinkStack) Register(h handler) error { } func (ls *LinkStack) RecvEth(ethFrame []byte) (err error) { - efrm, err := ethernet.NewFrame(ethFrame) if err != nil { return err @@ -200,7 +202,7 @@ func (ls *LinkStack) RecvEth(ethFrame []byte) (err error) { for i := range ls.handlers { h := &ls.handlers[i] - if h.proto == uint32(etype) { + if h.proto == etype { return h.recv(efrm.Payload(), 0) } } diff --git a/internal/ltesto/httptap.go b/internal/ltesto/httptap.go index 90d627e..cbcfcee 100644 --- a/internal/ltesto/httptap.go +++ b/internal/ltesto/httptap.go @@ -5,10 +5,12 @@ import ( "encoding/json" "errors" "fmt" + "log" "log/slog" "net/http" "net/netip" "net/url" + "time" "github.com/soypat/lneto/internal" ) @@ -29,6 +31,7 @@ type HTTPTapClient struct { c http.Client recvurl string sendurl string + buf []byte } func (h *HTTPTapClient) ReadDiscard() { @@ -70,6 +73,35 @@ func (h *HTTPTapClient) Write(b []byte) (int, error) { func (h *HTTPTapClient) Close() error { return nil } +func (h *HTTPTapClient) HandleTap(buf []byte) (HandleTapResult, error) { + nread, err := tap.Read(buf[:]) + if err != nil { + slogger.error("tap-err", slog.String("err", err.Error())) + log.Fatal(err) + } else if nread > 0 { + err = lStack.RecvEth(buf[:nread]) + if err != nil { + slogger.error("recv", slog.String("err", err.Error()), slog.Int("plen", nread)) + } else { + slogger.info("recv", slog.Int("plen", nread)) + } + } + nw, err := lStack.HandleEth(buf[:]) + if err != nil { + slogger.error("handle", slog.String("err", err.Error())) + } else if nw > 0 { + _, 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) + } +} + type HTTPTapServer struct { router *http.ServeMux stack stack