remove NodeARP in favor of arp.Handler; fix bug in IP stack node handling; use registerNode where applicable

This commit is contained in:
soypat
2025-07-14 19:48:29 -03:00
parent 1549e563e9
commit 61c66a2e58
9 changed files with 29 additions and 32 deletions
+2 -2
View File
@@ -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
}
+1 -1
View File
@@ -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) {
+1 -1
View File
@@ -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
}
+5 -5
View File
@@ -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++
}
+1 -2
View File
@@ -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) {
+9 -15
View File
@@ -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 {
+3
View File
@@ -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) {
+2 -2
View File
@@ -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
}
+5 -4
View File
@@ -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)
}