Files
lneto/internet/stack-ip.go
T
Pat Whittingslow bdbd38ab44 ipv6: StackIP and StackAsync.Addr refactor (#105)
* apply StackIP changes and internet package test passing

* fix tests and examples

* remove old Reset method on StackIP

* use encapsulate for ipv6

* add TCP over IPv6 tests
2026-05-09 16:11:31 -03:00

69 lines
1.6 KiB
Go

package internet
import (
"log/slog"
"github.com/soypat/lneto"
"github.com/soypat/lneto/ethernet"
)
var _ lneto.StackNode = (*StackIP)(nil)
type StackIP struct {
connID uint64
stackip4
stackip6
}
func (stackip *StackIP) Reset(vld *lneto.Validator, maxNodes4, maxNodes6 int) error {
if maxNodes4 <= 0 && maxNodes6 <= 0 || vld == nil {
return lneto.ErrInvalidConfig
}
stackip.connID++
stackip.reset4(vld, maxNodes4)
stackip.reset6(vld, maxNodes6)
return nil
}
func (stackip *StackIP) ConnectionID() *uint64 {
return &stackip.connID
}
func (stackip *StackIP) Protocol() uint64 {
return uint64(ethernet.TypeIPv4) // Only support ipv4 for now.
}
func (stackip *StackIP) LocalPort() uint16 { return 0 }
func (stackip *StackIP) SetLogger(logger *slog.Logger) {
stackip.stackip4.handlers.log = logger
stackip.stackip6.handlers.log = logger
}
func (stackip *StackIP) Demux(carrierData []byte, offset int) error {
debugLog("ip:demux")
if len(carrierData) < 1 {
return lneto.ErrTruncatedFrame
}
version := carrierData[offset] >> 4
switch version {
case 4:
return stackip.stackip4.demux4(carrierData, offset)
case 6:
return stackip.stackip6.demux6(carrierData, offset)
default:
return lneto.ErrUnsupported
}
}
func (stackip *StackIP) Encapsulate(carrierData []byte, offsetToIP, offsetToFrame int) (n int, err error) {
if offsetToFrame != offsetToIP {
return 0, lneto.ErrBug
}
n, err = stackip.stackip4.encapsulate4(carrierData, offsetToIP)
if len(stackip.stackip6.handlers.nodes) > 0 && n == 0 {
n, err = stackip.stackip6.encapsulate6(carrierData, offsetToIP)
}
return n, err
}