mirror of
https://github.com/soypat/lneto.git
synced 2026-09-13 18:19:34 +00:00
fix basicstack example
This commit is contained in:
+16
-14
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user