From 61c66a2e580b7dfb36b07b3442885320bad94033 Mon Sep 17 00:00:00 2001 From: soypat Date: Mon, 14 Jul 2025 19:48:29 -0300 Subject: [PATCH] remove NodeARP in favor of arp.Handler; fix bug in IP stack node handling; use registerNode where applicable --- examples/bridge/main.go | 4 ++-- examples/stack/main.go | 2 +- examples/stackbasic/main.go | 2 +- internet/definitions.go | 10 +++++----- internet/stack-ethernet.go | 3 +-- internet/stack-ip.go | 24 +++++++++--------------- internet/stack-ports.go | 3 +++ internet/stack-udpport.go | 4 ++-- internet/stackbasic_test.go | 9 +++++---- 9 files changed, 29 insertions(+), 32 deletions(-) diff --git a/examples/bridge/main.go b/examples/bridge/main.go index daae2c7..63e31bf 100644 --- a/examples/bridge/main.go +++ b/examples/bridge/main.go @@ -224,7 +224,7 @@ func run() (err error) { type Stack struct { link internet.StackEthernet ip internet.StackIP - arp internet.NodeARP + arp arp.Handler udps internet.StackPorts dhcp dhcpv4.Client dns dns.Client @@ -427,7 +427,7 @@ func (s *Stack) ResultResolveHardwareAddress6(ip netip.Addr) (hw [6]byte, err er if err != nil { return hw, err } else if len(hwslice) != 6 { - panic("unreachable slice hw leng") + panic("unreachable slice hw length") } return [6]byte(hwslice), nil } diff --git a/examples/stack/main.go b/examples/stack/main.go index 1b50a61..a23ae27 100644 --- a/examples/stack/main.go +++ b/examples/stack/main.go @@ -181,7 +181,7 @@ type Stack struct { ethernet internet.StackEthernet ip internet.StackIP tcpports internet.StackPorts - arp internet.NodeARP + arp arp.Handler } func (stack *Stack) Reset(ourMAC, gwMAC [6]byte, ip netip.Addr, mtu int) (err error) { diff --git a/examples/stackbasic/main.go b/examples/stackbasic/main.go index 9ddd2b0..98088cb 100644 --- a/examples/stackbasic/main.go +++ b/examples/stackbasic/main.go @@ -195,7 +195,7 @@ func NewEthernetTCPStack(ourMAC, gwMAC [6]byte, ip netip.AddrPort, mtu uint16, s if err != nil { return nil, nil, err } - err = ipStack.RegisterTCPConn(&conn) + err = ipStack.Register(&conn) if err != nil { return nil, nil, err } diff --git a/internet/definitions.go b/internet/definitions.go index ce9d4e6..99aebc1 100644 --- a/internet/definitions.go +++ b/internet/definitions.go @@ -75,12 +75,12 @@ func handleNodeError(nodesPtr *[]node, nodeIdx int, err error) (discarded bool) return discarded } -func checkNode(node *node) (discard bool) { - return node.demux == nil || node.connID != nil && node.currConnID != *node.connID +func (node *node) IsInvalid() bool { + return node.demux == nil || node.encapsulate == nil || (node.connID != nil && node.currConnID != *node.connID) } func checkNodeErr(node *node, err error) (discard bool) { - return checkNode(node) || (err != nil && err == net.ErrClosed) + return node.IsInvalid() || (err != nil && err == net.ErrClosed) } func nodeFromStackNode(s StackNode, port uint16, protocol uint64) node { @@ -116,7 +116,7 @@ func getEncapsulateNode(nodes *[]node, carrierData []byte, frameOffset int) (nod destroyed := false for i := range *nodes { node := &(*nodes)[i] - if checkNode(node) { + if node.IsInvalid() { destroyed = true node.destroy() continue @@ -153,7 +153,7 @@ func getNodeByProto(nodes []node, protocol uint16) int { func nodesCompact(nodes []node) []node { nilOff := 0 for i := 0; i < len(nodes); i++ { - if !checkNode(&nodes[i]) { + if !nodes[i].IsInvalid() { nodes[nilOff] = nodes[i] nilOff++ } diff --git a/internet/stack-ethernet.go b/internet/stack-ethernet.go index a3b9ef4..dd77a1c 100644 --- a/internet/stack-ethernet.go +++ b/internet/stack-ethernet.go @@ -69,12 +69,11 @@ func (ls *StackEthernet) Register(h StackNode) error { return errProtoRegistered } } - ls.handlers = append(ls.handlers, node{ + return registerNode(&ls.handlers, node{ demux: h.Demux, encapsulate: h.Encapsulate, proto: eproto, }) - return nil } func (ls *StackEthernet) Demux(carrierData []byte, frameOffset int) (err error) { diff --git a/internet/stack-ip.go b/internet/stack-ip.go index 609e879..8ef4c29 100644 --- a/internet/stack-ip.go +++ b/internet/stack-ip.go @@ -200,25 +200,19 @@ func (sb *StackIP) Register(h StackNode) error { if proto > 255 { return errInvalidProto } - sb.handlers = append(sb.handlers, node{ + connID := h.ConnectionID() + var currConnID uint64 + if connID != nil { + currConnID = *connID + } + return registerNode(&sb.handlers, node{ demux: h.Demux, encapsulate: h.Encapsulate, proto: uint16(proto), + port: h.LocalPort(), + currConnID: currConnID, + connID: connID, }) - return nil -} - -func (sb *StackIP) RegisterTCPConn(conn *tcp.Conn) error { - if conn.LocalPort() == 0 { - return errZeroPort - } - sb.handlers = append(sb.handlers, node{ - demux: conn.Demux, - encapsulate: conn.Encapsulate, - proto: uint16(lneto.IPProtoTCP), - port: conn.LocalPort(), - }) - return nil } type logger struct { diff --git a/internet/stack-ports.go b/internet/stack-ports.go index b9e8bfa..29e3a98 100644 --- a/internet/stack-ports.go +++ b/internet/stack-ports.go @@ -50,6 +50,9 @@ func (ps *StackPorts) Encapsulate(b []byte, offset int) (n int, err error) { } var i int for i = 0; i < len(ps.handlers); i++ { + if ps.handlers[i].IsInvalid() { + continue + } n, err = ps.handlers[i].encapsulate(b, offset) if err != nil || n > 0 { if ps.handleResult(i, n, err) { diff --git a/internet/stack-udpport.go b/internet/stack-udpport.go index 7b8f20b..aaa4ae8 100644 --- a/internet/stack-udpport.go +++ b/internet/stack-udpport.go @@ -29,7 +29,7 @@ func (sudp *StackUDPPort) LocalPort() uint16 { return sudp.h.port } func (sudp *StackUDPPort) ConnectionID() *uint64 { return sudp.h.connID } func (sudp *StackUDPPort) Demux(carrierData []byte, frameOffset int) error { - if checkNode(&sudp.h) { + if sudp.h.IsInvalid() { sudp.h.destroy() return net.ErrClosed } @@ -62,7 +62,7 @@ func (sudp *StackUDPPort) Demux(carrierData []byte, frameOffset int) error { } func (sudp *StackUDPPort) Encapsulate(carrierData []byte, frameOffset int) (int, error) { - if checkNode(&sudp.h) { + if sudp.h.IsInvalid() { sudp.h.destroy() return 0, net.ErrClosed } diff --git a/internet/stackbasic_test.go b/internet/stackbasic_test.go index 19c6060..bb7f4e2 100644 --- a/internet/stackbasic_test.go +++ b/internet/stackbasic_test.go @@ -86,12 +86,13 @@ func setupClientServerEstablished(t *testing.T, rng *rand.Rand, client, server * } func setupClientServer(t *testing.T, rng *rand.Rand, client, server *StackIP, connClient, connServer *tcp.Conn) { + const maxNodes = 1 bufsize := 2048 // Ensure buffer sizes are OK with reused buffers. svip := netip.AddrPortFrom(netip.AddrFrom4([4]byte{192, 168, 1, 0}), 80) clip := netip.AddrPortFrom(netip.AddrFrom4([4]byte{192, 168, 1, 1}), 1337) - server.SetAddr(svip.Addr()) - client.SetAddr(clip.Addr()) + server.Reset(svip.Addr(), maxNodes) + client.Reset(clip.Addr(), maxNodes) err := connServer.Configure(&tcp.ConnConfig{ RxBuf: make([]byte, bufsize), @@ -121,11 +122,11 @@ func setupClientServer(t *testing.T, rng *rand.Rand, client, server *StackIP, co t.Fatal(err) } - err = server.RegisterTCPConn(connServer) + err = server.Register(connServer) if err != nil { t.Fatal(err) } - err = client.RegisterTCPConn(connClient) + err = client.Register(connClient) if err != nil { t.Fatal(err) }