mirror of
https://github.com/soypat/lneto.git
synced 2026-09-10 08:39:30 +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 {
|
type Stack struct {
|
||||||
link internet.StackEthernet
|
link internet.StackEthernet
|
||||||
ip internet.StackIP
|
ip internet.StackIP
|
||||||
arp internet.NodeARP
|
arp arp.Handler
|
||||||
udps internet.StackPorts
|
udps internet.StackPorts
|
||||||
dhcp dhcpv4.Client
|
dhcp dhcpv4.Client
|
||||||
dns dns.Client
|
dns dns.Client
|
||||||
@@ -427,7 +427,7 @@ func (s *Stack) ResultResolveHardwareAddress6(ip netip.Addr) (hw [6]byte, err er
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return hw, err
|
return hw, err
|
||||||
} else if len(hwslice) != 6 {
|
} else if len(hwslice) != 6 {
|
||||||
panic("unreachable slice hw leng")
|
panic("unreachable slice hw length")
|
||||||
}
|
}
|
||||||
return [6]byte(hwslice), nil
|
return [6]byte(hwslice), nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -181,7 +181,7 @@ type Stack struct {
|
|||||||
ethernet internet.StackEthernet
|
ethernet internet.StackEthernet
|
||||||
ip internet.StackIP
|
ip internet.StackIP
|
||||||
tcpports internet.StackPorts
|
tcpports internet.StackPorts
|
||||||
arp internet.NodeARP
|
arp arp.Handler
|
||||||
}
|
}
|
||||||
|
|
||||||
func (stack *Stack) Reset(ourMAC, gwMAC [6]byte, ip netip.Addr, mtu int) (err error) {
|
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 {
|
if err != nil {
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
err = ipStack.RegisterTCPConn(&conn)
|
err = ipStack.Register(&conn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -75,12 +75,12 @@ func handleNodeError(nodesPtr *[]node, nodeIdx int, err error) (discarded bool)
|
|||||||
return discarded
|
return discarded
|
||||||
}
|
}
|
||||||
|
|
||||||
func checkNode(node *node) (discard bool) {
|
func (node *node) IsInvalid() bool {
|
||||||
return node.demux == nil || node.connID != nil && node.currConnID != *node.connID
|
return node.demux == nil || node.encapsulate == nil || (node.connID != nil && node.currConnID != *node.connID)
|
||||||
}
|
}
|
||||||
|
|
||||||
func checkNodeErr(node *node, err error) (discard bool) {
|
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 {
|
func nodeFromStackNode(s StackNode, port uint16, protocol uint64) node {
|
||||||
@@ -116,7 +116,7 @@ func getEncapsulateNode(nodes *[]node, carrierData []byte, frameOffset int) (nod
|
|||||||
destroyed := false
|
destroyed := false
|
||||||
for i := range *nodes {
|
for i := range *nodes {
|
||||||
node := &(*nodes)[i]
|
node := &(*nodes)[i]
|
||||||
if checkNode(node) {
|
if node.IsInvalid() {
|
||||||
destroyed = true
|
destroyed = true
|
||||||
node.destroy()
|
node.destroy()
|
||||||
continue
|
continue
|
||||||
@@ -153,7 +153,7 @@ func getNodeByProto(nodes []node, protocol uint16) int {
|
|||||||
func nodesCompact(nodes []node) []node {
|
func nodesCompact(nodes []node) []node {
|
||||||
nilOff := 0
|
nilOff := 0
|
||||||
for i := 0; i < len(nodes); i++ {
|
for i := 0; i < len(nodes); i++ {
|
||||||
if !checkNode(&nodes[i]) {
|
if !nodes[i].IsInvalid() {
|
||||||
nodes[nilOff] = nodes[i]
|
nodes[nilOff] = nodes[i]
|
||||||
nilOff++
|
nilOff++
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -69,12 +69,11 @@ func (ls *StackEthernet) Register(h StackNode) error {
|
|||||||
return errProtoRegistered
|
return errProtoRegistered
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ls.handlers = append(ls.handlers, node{
|
return registerNode(&ls.handlers, node{
|
||||||
demux: h.Demux,
|
demux: h.Demux,
|
||||||
encapsulate: h.Encapsulate,
|
encapsulate: h.Encapsulate,
|
||||||
proto: eproto,
|
proto: eproto,
|
||||||
})
|
})
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ls *StackEthernet) Demux(carrierData []byte, frameOffset int) (err error) {
|
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 {
|
if proto > 255 {
|
||||||
return errInvalidProto
|
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,
|
demux: h.Demux,
|
||||||
encapsulate: h.Encapsulate,
|
encapsulate: h.Encapsulate,
|
||||||
proto: uint16(proto),
|
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 {
|
type logger struct {
|
||||||
|
|||||||
@@ -50,6 +50,9 @@ func (ps *StackPorts) Encapsulate(b []byte, offset int) (n int, err error) {
|
|||||||
}
|
}
|
||||||
var i int
|
var i int
|
||||||
for i = 0; i < len(ps.handlers); i++ {
|
for i = 0; i < len(ps.handlers); i++ {
|
||||||
|
if ps.handlers[i].IsInvalid() {
|
||||||
|
continue
|
||||||
|
}
|
||||||
n, err = ps.handlers[i].encapsulate(b, offset)
|
n, err = ps.handlers[i].encapsulate(b, offset)
|
||||||
if err != nil || n > 0 {
|
if err != nil || n > 0 {
|
||||||
if ps.handleResult(i, n, err) {
|
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) ConnectionID() *uint64 { return sudp.h.connID }
|
||||||
|
|
||||||
func (sudp *StackUDPPort) Demux(carrierData []byte, frameOffset int) error {
|
func (sudp *StackUDPPort) Demux(carrierData []byte, frameOffset int) error {
|
||||||
if checkNode(&sudp.h) {
|
if sudp.h.IsInvalid() {
|
||||||
sudp.h.destroy()
|
sudp.h.destroy()
|
||||||
return net.ErrClosed
|
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) {
|
func (sudp *StackUDPPort) Encapsulate(carrierData []byte, frameOffset int) (int, error) {
|
||||||
if checkNode(&sudp.h) {
|
if sudp.h.IsInvalid() {
|
||||||
sudp.h.destroy()
|
sudp.h.destroy()
|
||||||
return 0, net.ErrClosed
|
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) {
|
func setupClientServer(t *testing.T, rng *rand.Rand, client, server *StackIP, connClient, connServer *tcp.Conn) {
|
||||||
|
const maxNodes = 1
|
||||||
bufsize := 2048
|
bufsize := 2048
|
||||||
// Ensure buffer sizes are OK with reused buffers.
|
// Ensure buffer sizes are OK with reused buffers.
|
||||||
svip := netip.AddrPortFrom(netip.AddrFrom4([4]byte{192, 168, 1, 0}), 80)
|
svip := netip.AddrPortFrom(netip.AddrFrom4([4]byte{192, 168, 1, 0}), 80)
|
||||||
clip := netip.AddrPortFrom(netip.AddrFrom4([4]byte{192, 168, 1, 1}), 1337)
|
clip := netip.AddrPortFrom(netip.AddrFrom4([4]byte{192, 168, 1, 1}), 1337)
|
||||||
server.SetAddr(svip.Addr())
|
server.Reset(svip.Addr(), maxNodes)
|
||||||
client.SetAddr(clip.Addr())
|
client.Reset(clip.Addr(), maxNodes)
|
||||||
|
|
||||||
err := connServer.Configure(&tcp.ConnConfig{
|
err := connServer.Configure(&tcp.ConnConfig{
|
||||||
RxBuf: make([]byte, bufsize),
|
RxBuf: make([]byte, bufsize),
|
||||||
@@ -121,11 +122,11 @@ func setupClientServer(t *testing.T, rng *rand.Rand, client, server *StackIP, co
|
|||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
err = server.RegisterTCPConn(connServer)
|
err = server.Register(connServer)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
err = client.RegisterTCPConn(connClient)
|
err = client.Register(connClient)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user