fix basicstack example

This commit is contained in:
soypat
2025-04-05 10:43:01 -03:00
parent 39d5e4290e
commit ba9124b079
2 changed files with 48 additions and 14 deletions
+16 -14
View File
@@ -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)
}
}
+32
View File
@@ -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