mirror of
https://github.com/soypat/lneto.git
synced 2026-07-26 10:38:47 +00:00
bdbd38ab44
* 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
69 lines
1.6 KiB
Go
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
|
|
}
|