mirror of
https://github.com/soypat/lneto.git
synced 2026-09-10 08:39:30 +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")
|
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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user