From 196d1dd58df6d239c4138123485b8ba9ee02f8eb Mon Sep 17 00:00:00 2001 From: Scott Feldman Date: Fri, 9 Jun 2023 15:08:57 -0700 Subject: [PATCH] add tcpip stack framework Add basis for TCP/IP stack. The stack implements Netdever interface for the top-end, and calls into a Netlinker interface on the bottom-end. Each TCP/IP stack instance represents a L3/L4 endpoint with an IP address. The Netlinker is bound when creating the stack. E.g.: spi, cs, wlreg, irq := cyw43439.PicoWSpi(0) cyw43 := cyw43439.NewDevice(spi, cs, wlreg, irq, irq) stack := tcpip.NewStack(cyw43) netdev.UseNetdev(stack) Here, the cyw43439 driver is the Netlinker for the stack. The new stack is a Netdever, so we tell the "net" package to use the stack as the netdev. The stack manages L3/L4 socket connections, ultimately calling into the Netlinker to send/recv L2 Ethernet pkts. --- tcpip/netdev.go | 52 +++++++++++++++++++++++++++++++++++++++++++++++++ tcpip/stack.go | 20 +++++++++++++++++++ 2 files changed, 72 insertions(+) create mode 100644 tcpip/netdev.go create mode 100644 tcpip/stack.go diff --git a/tcpip/netdev.go b/tcpip/netdev.go new file mode 100644 index 0000000..92efead --- /dev/null +++ b/tcpip/netdev.go @@ -0,0 +1,52 @@ +package tcpip + +import ( + "net" + "time" + + "tinygo.org/x/drivers/netdev" +) + +func (s *Stack) GetHostByName(name string) (net.IP, error) { + return net.IP{}, netdev.ErrNotSupported +} + +func (s *Stack) GetIPAddr() (net.IP, error) { + return net.IP{}, netdev.ErrNotSupported +} + +func (s *Stack) Socket(domain int, stype int, protocol int) (int, error) { + return -1, netdev.ErrNotSupported +} + +func (s *Stack) Bind(sockfd int, ip net.IP, port int) error { + return netdev.ErrNotSupported +} + +func (s *Stack) Connect(sockfd int, host string, ip net.IP, port int) error { + return netdev.ErrNotSupported +} + +func (s *Stack) Listen(sockfd int, backlog int) error { + return netdev.ErrNotSupported +} + +func (s *Stack) Accept(sockfd int, ip net.IP, port int) (int, error) { + return -1, netdev.ErrNotSupported +} + +func (s *Stack) Send(sockfd int, buf []byte, flags int, deadline time.Time) (int, error) { + return 0, netdev.ErrNotSupported +} + +func (s *Stack) Recv(sockfd int, buf []byte, flags int, deadline time.Time) (int, error) { + return 0, netdev.ErrNotSupported +} + +func (s *Stack) Close(sockfd int) error { + return netdev.ErrNotSupported +} + +func (s *Stack) SetSockOpt(sockfd int, level int, opt int, value interface{}) error { + return netdev.ErrNotSupported +} diff --git a/tcpip/stack.go b/tcpip/stack.go new file mode 100644 index 0000000..bcabd6c --- /dev/null +++ b/tcpip/stack.go @@ -0,0 +1,20 @@ +package tcpip + +import ( + "tinygo.org/x/drivers/netlink" +) + +type Stack struct { + link netlink.Netlinker +} + +func NewStack(link netlink.Netlinker) *Stack { + s := Stack{link: link} + s.link.RecvEthFunc(s.recvEth) + return &s +} + +func (s *Stack) recvEth(pkt []byte) error { + println("recvEth", len(pkt)) + return nil +}