StackPorts: set MAC destination when node has MAC

This commit is contained in:
Patricio Whittingslow
2025-12-19 01:04:18 -03:00
parent 1554b89a08
commit 5e631a1b3d
5 changed files with 47 additions and 15 deletions
+11 -2
View File
@@ -174,7 +174,7 @@ func (h *handlers) demuxByPort(buf []byte, offset int, port uint16) (*node, erro
func (h *handlers) encapsulateAny(buf []byte, offsetIP, offsetThisFrame int) (_ *node, n int, err error) {
for i := range h.nodes {
node := &h.nodes[i]
if node.IsInvalid() {
if node.IsInvalid() || (len(node.remoteAddr) > 0 && isAllZeros(node.remoteAddr)) {
continue
}
n, err = node.encapsulate(buf, offsetIP, offsetThisFrame)
@@ -191,6 +191,15 @@ func (h *handlers) encapsulateAny(buf []byte, offsetIP, offsetThisFrame int) (_
return nil, 0, err // Return last written error.
}
func isAllZeros(b []byte) bool {
for i := range b {
if b[i] != 0 {
return false
}
}
return true
}
var (
errZeroMaxNodesArg = errors.New("zero max nodes arg")
errZeroPort = errors.New("port must be greater than zero")
@@ -224,7 +233,7 @@ func nodeFromStackNode(s StackNode, port uint16, protocol uint64, remoteAddr []b
encapsulate: s.Encapsulate,
proto: uint16(protocol),
port: port,
remoteAddr: append([]byte{}, remoteAddr...),
remoteAddr: remoteAddr, // SHARED MEMORY- used to signal.
}
}
+14 -3
View File
@@ -2,11 +2,13 @@ package internet
import (
"encoding/binary"
"errors"
"io"
"math"
"strconv"
"github.com/soypat/lneto"
"github.com/soypat/lneto/ethernet"
)
type StackPorts struct {
@@ -50,7 +52,12 @@ func (ps *StackPorts) Encapsulate(carrierData []byte, offsetToIP, offsetToFrame
if int(ps.dstPortOff)+offsetToFrame+2 > len(carrierData) {
return 0, io.ErrShortBuffer
}
_, n, err = ps.handlers.encapsulateAny(carrierData, offsetToIP, offsetToFrame)
var node *node
node, n, err = ps.handlers.encapsulateAny(carrierData, offsetToIP, offsetToFrame)
if n > 0 && len(node.remoteAddr) == 6 && offsetToIP >= 14 {
efrm, _ := ethernet.NewFrame(carrierData[offsetToIP-14:])
*efrm.DestinationHardwareAddr() = [6]byte(node.remoteAddr)
}
return n, err
}
@@ -63,13 +70,17 @@ func (ps *StackPorts) Demux(b []byte, offset int) (err error) {
return err
}
func (ps *StackPorts) Register(h StackNode) error {
// Register registers a port StackNode on StackPorts.
// If dstMAC is set to non-nil, length six buffer then
func (ps *StackPorts) Register(h StackNode, dstMAC []byte) error {
port := h.LocalPort()
proto := h.Protocol()
if port <= 0 {
return errZeroPort
} else if proto != uint64(ps.protocol) {
return errInvalidProto
} else if dstMAC != nil && len(dstMAC) != 6 {
return errors.New("invalid MAC")
}
return ps.handlers.registerByPortProto(nodeFromStackNode(h, port, proto, nil))
return ps.handlers.registerByPortProto(nodeFromStackNode(h, port, proto, dstMAC))
}