Files
lneto/examples/stack/main.go
T
2025-01-16 21:25:37 -03:00

78 lines
1.5 KiB
Go

package main
import (
"errors"
"io"
"github.com/soypat/lneto"
)
func main() {
}
type LinkStack struct {
mac [6]byte
mtu uint16
}
func (ls *LinkStack) RecvEth(ethFrame []byte) (err error) {
eframe, err := lneto.NewEthFrame(ethFrame)
if err != nil {
return err
}
if !eframe.IsBroadcast() && ls.mac != *eframe.DestinationHardwareAddr() {
return errors.New("packet MAC mismatch")
}
// Convert to dynamic handling.
etype := eframe.EtherTypeOrSize()
if etype != lneto.EtherTypeARP && etype != lneto.EtherTypeIPv4 && etype != lneto.EtherTypeIPv6 {
return nil
}
return nil
}
func (ls *LinkStack) HandleEth(dst []byte) (n int, err error) {
if len(dst) < int(ls.mtu) {
return 0, io.ErrShortBuffer
}
n, addr, etype, err := ls.handleUpper(dst[14:])
if err != nil || n == 0 {
return 0, err
}
eframe, _ := lneto.NewEthFrame(dst[:14])
*eframe.DestinationHardwareAddr() = addr
*eframe.SourceHardwareAddr() = ls.mac
eframe.SetEtherType(etype)
return 14 + n, nil
}
func (ls *LinkStack) handleUpper(dst []byte) (n int, dstAddr [6]byte, etype lneto.EtherType, err error) {
return
}
type IPv4Stack struct {
ip [4]byte
mtu uint16
validator lneto.Validator
}
func (is *IPv4Stack) Recv(ipframe []byte) error {
iframe, err := lneto.NewIPv4Frame(ipframe)
if err != nil {
return err
}
if *iframe.DestinationAddr() != is.ip {
return errors.New("packet not for us")
}
iframe.Validate(&is.validator)
err = is.validator.Err()
if err != nil {
return err
}
return nil
}