mirror of
https://github.com/soypat/lneto.git
synced 2026-08-15 12:23:44 +00:00
remove NodeARP in favor of arp.Handler; fix bug in IP stack node handling; use registerNode where applicable
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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++
|
||||
}
|
||||
|
||||
@@ -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
@@ -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 {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user