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") log.Fatal("interface does not contain stack address")
} }
addrPort := netip.AddrPortFrom(ip, stackPort) 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) lStack, handler, err := NewEthernetTCPStack(stackHWAddr, addrPort, slogger)
if err != nil { if err != nil {
log.Fatal(err) 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) err = handler.OpenListen(addrPort.Port(), iss)
if err != nil { if err != nil {
log.Fatal(err) 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) { handle: func(b []byte, i int) (int, error) {
return ipStack.Handle(b[i:]) return ipStack.Handle(b[i:])
}, },
proto: uint32(lneto.IPProtoIPv4), proto: ethernet.TypeIPv4,
lport: 0, lport: 0,
}) })
var conn internet.TCPConn 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{ arphandler, err := arp.NewHandler(arp.HandlerConfig{
HardwareAddr: mac[:], HardwareAddr: mac[:],
ProtocolAddr: ip.Addr().AsSlice(), ProtocolAddr: ip.Addr().AsSlice(),
MaxQueries: 1, MaxQueries: 4,
MaxPending: 1, MaxPending: 4,
HardwareType: 1, HardwareType: 1,
ProtocolType: proto, ProtocolType: proto,
}) })
@@ -147,8 +147,11 @@ func NewEthernetTCPStack(mac [6]byte, ip netip.AddrPort, slogger logger) (*LinkS
arpStack := ARPStack{ arpStack := ARPStack{
handler: *arphandler, handler: *arphandler,
} }
err = lStack.Register(handler{
err = lStack.Register(ipStack, mac) recv: arpStack.Recv,
handle: arpStack.Handle,
proto: ethernet.TypeARP,
})
if err != nil { if err != nil {
return nil, nil, err return nil, nil, err
} }
@@ -159,7 +162,7 @@ type handler struct {
raddr []byte raddr []byte
recv func([]byte, int) error recv func([]byte, int) error
handle func([]byte, int) (int, error) handle func([]byte, int) (int, error)
proto uint32 proto ethernet.Type
lport uint16 lport uint16
} }
@@ -182,7 +185,6 @@ func (ls *LinkStack) Register(h handler) error {
} }
func (ls *LinkStack) RecvEth(ethFrame []byte) (err error) { func (ls *LinkStack) RecvEth(ethFrame []byte) (err error) {
efrm, err := ethernet.NewFrame(ethFrame) efrm, err := ethernet.NewFrame(ethFrame)
if err != nil { if err != nil {
return err return err
@@ -200,7 +202,7 @@ func (ls *LinkStack) RecvEth(ethFrame []byte) (err error) {
for i := range ls.handlers { for i := range ls.handlers {
h := &ls.handlers[i] h := &ls.handlers[i]
if h.proto == uint32(etype) { if h.proto == etype {
return h.recv(efrm.Payload(), 0) return h.recv(efrm.Payload(), 0)
} }
} }
+32
View File
@@ -5,10 +5,12 @@ import (
"encoding/json" "encoding/json"
"errors" "errors"
"fmt" "fmt"
"log"
"log/slog" "log/slog"
"net/http" "net/http"
"net/netip" "net/netip"
"net/url" "net/url"
"time"
"github.com/soypat/lneto/internal" "github.com/soypat/lneto/internal"
) )
@@ -29,6 +31,7 @@ type HTTPTapClient struct {
c http.Client c http.Client
recvurl string recvurl string
sendurl string sendurl string
buf []byte
} }
func (h *HTTPTapClient) ReadDiscard() { 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) 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 { type HTTPTapServer struct {
router *http.ServeMux router *http.ServeMux
stack stack stack stack